 		pullOffPattern = /p/
 		slideUpPattern = /\//
 		slideDownPattern = /\\/
+		chordPattern = /\(([0-9]:[0-9])+\)/
 		lines = input.split("\n")
 		for line in lines
 			parts = line.split(" ")

				if fret?
					dest[stringNum][i] = fret

	cloneTabMap: (tabMap) ->
		result = {}
		for stringNum, stringNotes of tabMap

			for part, i in parts
				jsonPart = {}
				if part.match(notePattern) 
					# note
					jsonPart = this.parseNotes(part, i)
					lastString = parseInt(_.keys(jsonPart), 10)
				else if part.match(restPattern)
					# rest
				else if part.match(hammerPattern)
					# hammer-on
					if !lastString
						throw "invalid hammer-on"
					jsonPart[lastString] = []
					jsonPart[lastString][i] = "h"
				else if part.match(pullOffPattern)
					# pull-off
					if !lastString
						throw "invalid pull-off"
					jsonPart[lastString] = []
					jsonPart[lastString][i] = "p"
				else if part.match(slideUpPattern)
					# slide-up
					if !lastString
						throw "invalid slide-up"
					jsonPart[lastString] = []
					jsonPart[lastString][i] = "/"
				else if part.match(slideDownPattern)
					# slide-down
					if !lastString
						throw "invalid slide-down"
					jsonPart[lastString] = []
					jsonPart[lastString][i] = "\\"
				else if part.match(chordPattern)
					# chord
					jsonPart = this.parseChord(part, i)
				else
					throw "unknown pattern: " + part
				this.mergeMaps(json, jsonPart)
