 		customVars[variableName]
 
 	parseMultiplier: (input) ->
-		# TODOs: 
-		# - separate riff from multiplier
-		# - parse riff
+		result = {}
+
+		# parse either a riff or a chord. TODO: make this work without code duplication
+		if input.search(chordPattern) is 0
+			part = input.match(chordPattern)[0]
+			tabToMultiply = this.parseChord(part)
+		else if input.search(riffPattern) is 0
+			part = input.match(riffPattern)[0]
+			tabToMultiply = this.parseRiff(part)
+		else
+			throw "cannot set invalid multiplied part: " + part
+
+		part = input.substr(part.length, input.length-part.length)# get rest of line
+		# advance past ignored characters
+		while part.search(ignorePattern) is 0
+			part = part.substr(1, part.length-1)
+
 		# - parse multiplier
+		multiplier = part.match(multiplierPattern)[0]
+		times = multiplier.substr(1, multiplier.length-1)# advance past "x" character
+		times = parseInt(times, 10)
+
 		# - make riff happen x times
-		# - return tab map
-		{}
+		i = 1
+		while i <= times
+			result = this.addTabMaps(result, tabToMultiply)
+			i++
+
+		# return tab map
+		result
 
 	# makes each string's notes array the same length
 	normalizeTabMap: (tabMap = {}) ->

				i += part.length
				tabMapPart[lastString] = []
				tabMapPart[lastString][i] = parseInt(part, 10)
			else if part.search(multiplierPattern) is 0
				# multiplier
				part = part.match(multiplierPattern)
				i += part.length
				tabMapPart = this.parseMultiplier(part)
			else if part.search(riffPattern) is 0

		max
	
	addTabMaps: (a, b) ->
		result = this.cloneTabMap(a)
		aLen = this.longestString(a)
		for strNum, strNotesArr of b
			for fret, i in strNotesArr
				result[strNum] ?= []
				result[strNum][aLen + i] = fret
		result

