@vue-skuilder/courseware 0.1.33 → 0.1.35
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/CourseWare-BTFRjgBR.js +305 -0
- package/dist/CourseWare-BTFRjgBR.js.map +1 -0
- package/dist/CourseWare-DSeyTAtH.cjs +2 -0
- package/dist/CourseWare-DSeyTAtH.cjs.map +1 -0
- package/dist/assets/CourseWare.css +1 -0
- package/dist/assets/chess.css +1 -0
- package/dist/assets/index.css +1 -1
- package/dist/assets/math.css +1 -0
- package/dist/assets/piano.css +1 -0
- package/dist/assets/sightsing.css +1 -0
- package/dist/assets/typing.css +1 -0
- package/dist/backend.cjs.js +1 -1
- package/dist/backend.cjs.js.map +1 -1
- package/dist/backend.mjs +4 -3
- package/dist/backend.mjs.map +1 -1
- package/dist/chess/components/ChessBoard.vue.d.ts.map +1 -1
- package/dist/chess/composables/useChessgroundBounds.d.ts +24 -0
- package/dist/chess/composables/useChessgroundBounds.d.ts.map +1 -0
- package/dist/chess/questions/puzzle/puzzle.vue.d.ts.map +1 -1
- package/dist/chess-BbHATAzk.js +2949 -0
- package/dist/chess-BbHATAzk.js.map +1 -0
- package/dist/chess-BsgVZARV.cjs +7 -0
- package/dist/chess-BsgVZARV.cjs.map +1 -0
- package/dist/chess-C_2RQEuq.cjs +1 -0
- package/dist/chess-X1bmWmh3.js +3 -0
- package/dist/french-Bxet7hJm.cjs +2 -0
- package/dist/french-Bxet7hJm.cjs.map +1 -0
- package/dist/french-Dk7YG8Td.js +140 -0
- package/dist/french-Dk7YG8Td.js.map +1 -0
- package/dist/french-evUMlbbq.js +3 -0
- package/dist/french-x9P8RRn8.cjs +1 -0
- package/dist/index.cjs.js +2 -170
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +23 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +172 -62021
- package/dist/index.mjs.map +1 -1
- package/dist/math-B1oDAkOy.cjs +34 -0
- package/dist/math-B1oDAkOy.cjs.map +1 -0
- package/dist/math-B4HbgYf6.js +13391 -0
- package/dist/math-B4HbgYf6.js.map +1 -0
- package/dist/math-BWlIa6-l.cjs +1 -0
- package/dist/math-DYni7rRl.js +3 -0
- package/dist/piano-BN5Btq91.js +3 -0
- package/dist/piano-Btvkzjfz.cjs +1 -0
- package/dist/piano-CefQUc72.cjs +2 -0
- package/dist/piano-CefQUc72.cjs.map +1 -0
- package/dist/piano-DF1g6yaX.js +3603 -0
- package/dist/piano-DF1g6yaX.js.map +1 -0
- package/dist/pitch-C-lh9ezH.cjs +2 -0
- package/dist/pitch-C-lh9ezH.cjs.map +1 -0
- package/dist/pitch-CgGJFkZ1.js +106 -0
- package/dist/pitch-CgGJFkZ1.js.map +1 -0
- package/dist/pitch-Dn0iNqiS.js +3 -0
- package/dist/pitch-DsopN5IR.cjs +1 -0
- package/dist/{shapes-nszfsx3o.js → shapes-BQUVJdp5.js} +3 -21
- package/dist/shapes-BQUVJdp5.js.map +1 -0
- package/dist/shapes-C_-mvrCc.cjs +2 -0
- package/dist/shapes-C_-mvrCc.cjs.map +1 -0
- package/dist/shapes-DRq8J94A.cjs +2 -0
- package/dist/shapes-DRq8J94A.cjs.map +1 -0
- package/dist/shapes-ICeg46lr.js +25 -0
- package/dist/shapes-ICeg46lr.js.map +1 -0
- package/dist/sightsing-BFQ7HRig.js +41061 -0
- package/dist/sightsing-BFQ7HRig.js.map +1 -0
- package/dist/sightsing-CJX3k0Fd.js +3 -0
- package/dist/sightsing-Cr_SJ5Vc.cjs +133 -0
- package/dist/sightsing-Cr_SJ5Vc.cjs.map +1 -0
- package/dist/sightsing-CtagQ0FJ.cjs +1 -0
- package/dist/typing-BevtfWlp.js +184 -0
- package/dist/typing-BevtfWlp.js.map +1 -0
- package/dist/typing-CBPjtwrg.cjs +1 -0
- package/dist/typing-CK-glKhm.cjs +2 -0
- package/dist/typing-CK-glKhm.cjs.map +1 -0
- package/dist/typing-k-ojjO7G.js +3 -0
- package/dist/word-work-BOnRlZgd.js +108 -0
- package/dist/word-work-BOnRlZgd.js.map +1 -0
- package/dist/word-work-C5MTSapy.cjs +1 -0
- package/dist/word-work-Dd6tIKrt.js +3 -0
- package/dist/word-work-fNbCLNuN.cjs +2 -0
- package/dist/word-work-fNbCLNuN.cjs.map +1 -0
- package/package.json +6 -5
- package/dist/shapes-DJ-ujuDr.cjs +0 -2
- package/dist/shapes-DJ-ujuDr.cjs.map +0 -1
- package/dist/shapes-nszfsx3o.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sightsing-Cr_SJ5Vc.cjs","names":[],"sources":["../../../node_modules/abcjs/version.js","../../../node_modules/abcjs/src/api/abc_timing_callbacks.js","../../../node_modules/abcjs/src/api/abc_animation.js","../../../node_modules/abcjs/src/parse/abc_common.js","../../../node_modules/abcjs/src/parse/abc_parse_directive.js","../../../node_modules/abcjs/src/parse/all-notes.js","../../../node_modules/abcjs/src/parse/transpose-chord.js","../../../node_modules/abcjs/src/const/relative-major.js","../../../node_modules/abcjs/src/const/key-accidentals.js","../../../node_modules/abcjs/src/parse/abc_transpose.js","../../../node_modules/abcjs/src/parse/abc_parse_key_voice.js","../../../node_modules/abcjs/src/parse/abc_parse_header.js","../../../node_modules/abcjs/src/parse/abc_parse_settings.js","../../../node_modules/abcjs/src/parse/abc_parse_music.js","../../../node_modules/abcjs/src/parse/abc_tokenizer.js","../../../node_modules/abcjs/src/parse/wrap_lines.js","../../../node_modules/abcjs/src/write/helpers/spacing.js","../../../node_modules/abcjs/src/synth/abc_midi_sequencer.js","../../../node_modules/abcjs/src/synth/chord-track.js","../../../node_modules/abcjs/src/synth/pitches-to-perc.js","../../../node_modules/abcjs/src/synth/abc_midi_flattener.js","../../../node_modules/abcjs/src/data/deline-tune.js","../../../node_modules/abcjs/src/data/abc_tune.js","../../../node_modules/abcjs/src/parse/tune-builder.js","../../../node_modules/abcjs/src/parse/abc_parse.js","../../../node_modules/abcjs/src/parse/abc_parse_book.js","../../../node_modules/abcjs/src/tablatures/instruments/string-tablature.js","../../../node_modules/abcjs/src/write/creation/elements/voice-element.js","../../../node_modules/abcjs/src/write/helpers/set-class.js","../../../node_modules/abcjs/src/write/interactive/highlight.js","../../../node_modules/abcjs/src/write/interactive/unhighlight.js","../../../node_modules/abcjs/src/write/creation/elements/absolute-element.js","../../../node_modules/abcjs/src/write/creation/elements/relative-element.js","../../../node_modules/abcjs/src/tablatures/render/tab-absolute-elements.js","../../../node_modules/abcjs/src/tablatures/render/tab-renderer.js","../../../node_modules/abcjs/src/synth/note-to-midi.js","../../../node_modules/abcjs/src/tablatures/instruments/tab-note.js","../../../node_modules/abcjs/src/tablatures/instruments/tab-notes.js","../../../node_modules/abcjs/src/tablatures/instruments/string-patterns.js","../../../node_modules/abcjs/src/tablatures/instruments/tab-string.js","../../../node_modules/abcjs/src/tablatures/abc_tablatures.js","../../../node_modules/abcjs/src/api/abc_tunebook.js","../../../node_modules/abcjs/src/str/output.js","../../../node_modules/abcjs/src/write/creation/elements/beam-element.js","../../../node_modules/abcjs/src/write/creation/elements/brace-element.js","../../../node_modules/abcjs/src/write/creation/glyphs.js","../../../node_modules/abcjs/src/write/creation/create-clef.js","../../../node_modules/abcjs/src/write/creation/create-key-signature.js","../../../node_modules/abcjs/src/write/creation/create-note-head.js","../../../node_modules/abcjs/src/write/creation/create-time-signature.js","../../../node_modules/abcjs/src/write/creation/elements/dynamic-decoration.js","../../../node_modules/abcjs/src/write/creation/elements/crescendo-element.js","../../../node_modules/abcjs/src/write/creation/elements/glissando-element.js","../../../node_modules/abcjs/src/write/creation/elements/tie-element.js","../../../node_modules/abcjs/src/write/creation/decoration.js","../../../node_modules/abcjs/src/write/creation/elements/ending-element.js","../../../node_modules/abcjs/src/write/creation/calc-height.js","../../../node_modules/abcjs/src/write/creation/elements/staff-group-element.js","../../../node_modules/abcjs/src/write/creation/elements/tempo-element.js","../../../node_modules/abcjs/src/write/creation/elements/triplet-element.js","../../../node_modules/abcjs/src/write/creation/translate-chord.js","../../../node_modules/abcjs/src/write/creation/add-chord.js","../../../node_modules/abcjs/src/write/creation/abstract-engraver.js","../../../node_modules/abcjs/src/write/svg.js","../../../node_modules/abcjs/src/write/renderer.js","../../../node_modules/abcjs/src/write/creation/elements/free-text.js","../../../node_modules/abcjs/src/write/creation/elements/separator.js","../../../node_modules/abcjs/src/write/creation/elements/subtitle.js","../../../node_modules/abcjs/src/write/creation/add-text-if.js","../../../node_modules/abcjs/src/write/creation/elements/rich-text.js","../../../node_modules/abcjs/src/write/creation/elements/top-text.js","../../../node_modules/abcjs/src/write/creation/elements/bottom-text.js","../../../node_modules/abcjs/src/write/interactive/create-analysis.js","../../../node_modules/abcjs/src/write/interactive/selection.js","../../../node_modules/abcjs/src/write/layout/get-bar-y-at.js","../../../node_modules/abcjs/src/write/layout/beam.js","../../../node_modules/abcjs/src/write/layout/triplet.js","../../../node_modules/abcjs/src/write/layout/voice.js","../../../node_modules/abcjs/src/write/layout/set-upper-and-lower-elements.js","../../../node_modules/abcjs/src/write/layout/voice-elements.js","../../../node_modules/abcjs/src/write/layout/staff-group.js","../../../node_modules/abcjs/src/write/layout/get-left-edge-of-staff.js","../../../node_modules/abcjs/src/write/layout/layout-in-grid.js","../../../node_modules/abcjs/src/write/layout/layout.js","../../../node_modules/abcjs/src/write/helpers/classes.js","../../../node_modules/abcjs/src/write/helpers/get-font-and-attr.js","../../../node_modules/abcjs/src/write/helpers/get-text-size.js","../../../node_modules/abcjs/src/write/draw/sprintf.js","../../../node_modules/abcjs/src/write/draw/round-number.js","../../../node_modules/abcjs/src/write/draw/text.js","../../../node_modules/abcjs/src/write/draw/brace.js","../../../node_modules/abcjs/src/write/draw/print-path.js","../../../node_modules/abcjs/src/write/draw/glissando.js","../../../node_modules/abcjs/src/write/draw/crescendo.js","../../../node_modules/abcjs/src/write/draw/group-elements.js","../../../node_modules/abcjs/src/write/draw/print-symbol.js","../../../node_modules/abcjs/src/write/draw/dynamics.js","../../../node_modules/abcjs/src/write/draw/triplet.js","../../../node_modules/abcjs/src/write/draw/ending.js","../../../node_modules/abcjs/src/write/draw/tie.js","../../../node_modules/abcjs/src/write/draw/beam.js","../../../node_modules/abcjs/src/write/draw/print-stem.js","../../../node_modules/abcjs/src/write/draw/print-line.js","../../../node_modules/abcjs/src/write/draw/staff-line.js","../../../node_modules/abcjs/src/write/draw/relative.js","../../../node_modules/abcjs/src/write/draw/tempo.js","../../../node_modules/abcjs/src/write/draw/absolute.js","../../../node_modules/abcjs/src/write/draw/voice.js","../../../node_modules/abcjs/src/write/draw/staff.js","../../../node_modules/abcjs/src/write/draw/debug-box.js","../../../node_modules/abcjs/src/write/draw/separator.js","../../../node_modules/abcjs/src/write/draw/non-music.js","../../../node_modules/abcjs/src/write/draw/staff-group.js","../../../node_modules/abcjs/src/write/draw/set-paper-size.js","../../../node_modules/abcjs/src/write/draw/selectables.js","../../../node_modules/abcjs/src/write/draw/draw.js","../../../node_modules/abcjs/src/write/interactive/find-selectable-element.js","../../../node_modules/abcjs/src/write/engraver-controller.js","../../../node_modules/abcjs/src/api/abc_tunebook_svg.js","../../../node_modules/abcjs/src/api/tune-metrics.js","../../../node_modules/abcjs/src/synth/sounds-cache.js","../../../node_modules/abcjs/src/synth/load-note.js","../../../node_modules/abcjs/src/synth/instrument-index-to-name.js","../../../node_modules/abcjs/src/synth/create-note-map.js","../../../node_modules/abcjs/src/synth/register-audio-context.js","../../../node_modules/abcjs/src/synth/active-audio-context.js","../../../node_modules/abcjs/src/synth/supports-audio.js","../../../node_modules/abcjs/src/synth/pitch-to-note-name.js","../../../node_modules/abcjs/src/synth/download-buffer.js","../../../node_modules/abcjs/src/synth/cents-to-factor.js","../../../node_modules/abcjs/src/synth/place-note.js","../../../node_modules/abcjs/src/synth/create-synth.js","../../../node_modules/abcjs/src/synth/synth-sequence.js","../../../node_modules/abcjs/src/synth/images/loop.svg.js","../../../node_modules/abcjs/src/synth/images/play.svg.js","../../../node_modules/abcjs/src/synth/images/pause.svg.js","../../../node_modules/abcjs/src/synth/images/loading.svg.js","../../../node_modules/abcjs/src/synth/images/reset.svg.js","../../../node_modules/abcjs/src/synth/create-synth-control.js","../../../node_modules/abcjs/src/synth/play-event.js","../../../node_modules/abcjs/src/synth/synth-controller.js","../../../node_modules/abcjs/src/synth/abc_midi_renderer.js","../../../node_modules/abcjs/src/midi/abc_midi_create.js","../../../node_modules/abcjs/src/synth/get-midi-file.js","../../../node_modules/abcjs/src/edit/abc_editarea.js","../../../node_modules/abcjs/src/edit/abc_editor.js","../../../node_modules/abcjs/index.js","../src/components/MusicScoreRender.vue","../src/components/MusicScoreRender.vue","../src/sightsing/questions/IdentifyKey/IdentifyKey.vue","../src/sightsing/questions/IdentifyKey/IdentifyKey.vue","../src/sightsing/questions/IdentifyKey/index.ts","../src/sightsing/index.ts"],"sourcesContent":["var version = '6.4.4';\n\nmodule.exports = version;\n","var TimingCallbacks = function(target, params) {\n\tvar self = this;\n\tif (!params) params = {};\n\tself.qpm = params.qpm ? parseInt(params.qpm, 10) : null;\n\tif (!self.qpm) {\n\t\tvar tempo = target.metaText ? target.metaText.tempo : null;\n\t\tself.qpm = target.getBpm(tempo);\n\t}\n\tself.extraMeasuresAtBeginning = params.extraMeasuresAtBeginning ? parseInt(params.extraMeasuresAtBeginning, 10) : 0;\n\tself.beatCallback = params.beatCallback; // This is called for each beat.\n\tself.eventCallback = params.eventCallback; // This is called for each note or rest encountered.\n\tself.lineEndCallback = params.lineEndCallback; // This is called when the end of a line is approaching.\n\tself.lineEndAnticipation = params.lineEndAnticipation ? parseInt(params.lineEndAnticipation, 10) : 0; // How many milliseconds before the end should the call happen.\n\tself.beatSubdivisions = params.beatSubdivisions ? parseInt(params.beatSubdivisions, 10) : 1; // how many callbacks per beat is desired.\n\tself.joggerTimer = null;\n\n\tself.replaceTarget = function(newTarget) {\n\t\tself.noteTimings = newTarget.setTiming(self.qpm, self.extraMeasuresAtBeginning);\n\t\tif (newTarget.noteTimings.length === 0)\n\t\t\tself.noteTimings = newTarget.setTiming(0,0);\n\t\tif (self.lineEndCallback) {\n\t\t\tself.lineEndTimings = getLineEndTimings(newTarget.noteTimings, self.lineEndAnticipation);\n\t\t}\n\t\tself.startTime = null;\n\t\tself.currentBeat = 0;\n\t\tself.currentEvent = 0;\n\t\tself.currentLine = 0;\n\t\tself.currentTime = 0;\n\t\tself.isPaused = false;\n\t\tself.isRunning = false;\n\t\tself.pausedPercent = null;\n\t\tself.justUnpaused = false;\n\t\tself.newSeekPercent = 0;\n\t\tself.lastTimestamp = 0;\n\n\t\tif (self.noteTimings.length === 0)\n\t\t\treturn;\n\t\t// noteTimings contains an array of events sorted by time. Events that happen at the same time are in the same element of the array.\n\t\tself.millisecondsPerBeat = 1000 / (self.qpm / 60) / self.beatSubdivisions;\n\t\tself.lastMoment = self.noteTimings[self.noteTimings.length-1].milliseconds;\n\t\tself.totalBeats = Math.round(self.lastMoment / self.millisecondsPerBeat);\n\t};\n\n\tself.replaceTarget(target);\n\n\tself.doTiming = function (timestamp) {\n\t\t// This is called 60 times a second, that is, every 16 msecs.\n\t\t//console.log(\"doTiming\", timestamp, timestamp-self.lastTimestamp);\n\t\tif (self.lastTimestamp === timestamp)\n\t\t\treturn; // If there are multiple seeks or other calls, then we can easily get multiple callbacks for the same instant.\n\t\tself.lastTimestamp = timestamp;\n\t\tif (!self.startTime) {\n\t\t\tself.startTime = timestamp;\n\t\t}\n\n\t\tif (!self.isPaused && self.isRunning) {\n\t\t\tself.currentTime = timestamp - self.startTime;\n\t\t\tself.currentTime += 16; // Add a little slop because this function isn't called exactly.\n\t\t\twhile (self.noteTimings.length > self.currentEvent && self.noteTimings[self.currentEvent].milliseconds < self.currentTime) {\n\t\t\t\tif (self.eventCallback && self.noteTimings[self.currentEvent].type === 'event') {\n\t\t\t\t\tvar thisStartTime = self.startTime; // the event callback can call seek and change the position from beneath us.\n\t\t\t\t\tself.eventCallback(self.noteTimings[self.currentEvent]);\n\t\t\t\t\tif (thisStartTime !== self.startTime) {\n\t\t\t\t\t\tself.currentTime = timestamp - self.startTime;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tself.currentEvent++;\n\t\t\t}\n\t\t\tif (self.lineEndCallback && self.lineEndTimings.length > self.currentLine && self.lineEndTimings[self.currentLine].milliseconds < self.currentTime && self.currentEvent < self.noteTimings.length) {\n\t\t\t\tvar leftEvent = self.noteTimings[self.currentEvent].milliseconds === self.currentTime ? self.noteTimings[self.currentEvent] : self.noteTimings[self.currentEvent-1]\n\t\t\t\tself.lineEndCallback(self.lineEndTimings[self.currentLine], leftEvent, { line: self.currentLine, endTimings: self.lineEndTimings, currentTime: self.currentTime });\n\t\t\t\tself.currentLine++;\n\t\t\t}\n\t\t\tif (self.currentTime < self.lastMoment) {\n\t\t\t\trequestAnimationFrame(self.doTiming);\n\t\t\t\tif (self.currentBeat * self.millisecondsPerBeat < self.currentTime) {\n\t\t\t\t\tvar ret = self.doBeatCallback(timestamp);\n\t\t\t\t\tif (ret !== null)\n\t\t\t\t\t\tself.currentTime = ret;\n\t\t\t\t}\n\t\t\t} else if (self.currentBeat <= self.totalBeats) {\n\t\t\t\t// Because of timing issues (for instance, if the browser tab isn't active), the beat callbacks might not have happened when they are supposed to. To keep the client programs from having to deal with that, this will keep calling the loop until all of them have been sent.\n\t\t\t\tif (self.beatCallback) {\n\t\t\t\t\tvar ret2 = self.doBeatCallback(timestamp);\n\t\t\t\t\tif (ret2 !== null)\n\t\t\t\t\t\tself.currentTime = ret2;\n\t\t\t\t\trequestAnimationFrame(self.doTiming);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (self.currentTime >= self.lastMoment) {\n\t\t\t\tif (self.eventCallback) {\n\t\t\t\t\t// At the end, the event callback can return \"continue\" to keep from stopping.\n\t\t\t\t\t// The event callback can either be a promise or not.\n\t\t\t\t\tvar promise = self.eventCallback(null);\n\t\t\t\t\tself.shouldStop(promise).then(function(shouldStop) {\n\t\t\t\t\t\tif (shouldStop)\n\t\t\t\t\t\t\tself.stop();\n\t\t\t\t\t})\n\t\t\t\t} else\n\t\t\t\t\tself.stop();\n\t\t\t}\n\t\t}\n\t};\n\n\tself.shouldStop = function(promise) {\n\t\t// The return of the last event callback can be \"continue\" or a promise that returns \"continue\".\n\t\t// If it is then don't call stop. Any other value calls stop.\n\t\treturn new Promise(function (resolve) {\n\t\t\tif (!promise)\n\t\t\t\treturn resolve(true);\n\t\t\tif (promise === \"continue\")\n\t\t\t\treturn resolve(false);\n\t\t\tif (promise.then) {\n\t\t\t\tpromise.then(function (result) {\n\t\t\t\t\tresolve(result !== \"continue\");\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t};\n\n\tself.doBeatCallback = function(timestamp) {\n\t\tif (self.beatCallback) {\n\t\t\tvar next = self.currentEvent;\n\t\t\twhile (next < self.noteTimings.length && self.noteTimings[next].left === null)\n\t\t\t\tnext++;\n\t\t\tvar endMs;\n\t\t\tvar ev;\n\t\t\tif (next < self.noteTimings.length) {\n\t\t\t\tendMs = self.noteTimings[next].milliseconds;\n\t\t\t\tnext = Math.max(0, self.currentEvent - 1);\n\t\t\t\twhile (next >= 0 && self.noteTimings[next].left === null)\n\t\t\t\t\tnext--;\n\n\t\t\t\tev = self.noteTimings[next];\n\t\t\t}\n\n\t\t\tvar position = {};\n\t\t\tvar debugInfo = {};\n\t\t\tif (ev) {\n\t\t\t\tposition.top = ev.top;\n\t\t\t\tposition.height = ev.height;\n\n\t\t\t\t// timestamp = the time passed in from the animation timer\n\t\t\t\t// self.startTime = the time that the tune was started (if there was seeking or pausing, it is adjusted to keep the math the same)\n\t\t\t\t// ev = the event that is either happening now or has most recently passed.\n\t\t\t\t// ev.milliseconds = the time that the current event starts (relative to self.startTime)\n\t\t\t\t// endMs = the time that the next event starts\n\t\t\t\t// ev.endX = the x coordinate that the next event happens (or the end of the line or repeat measure)\n\t\t\t\t// ev.left = the x coordinate of the current event\n\t\t\t\t//\n\t\t\t\t// The output is the X coordinate of the current cursor location. It is calculated with the ratio of the length of the event and the width of it.\n\t\t\t\tvar offMs = Math.max(0, timestamp-self.startTime-ev.milliseconds); // Offset in time from the last beat\n\t\t\t\tvar gapMs = endMs - ev.milliseconds; // Length of this event in time\n\t\t\t\tvar gapPx = ev.endX - ev.left; // The length in pixels\n\t\t\t\tvar offPx = gapMs ? offMs * gapPx / gapMs : 0;\n\t\t\t\tposition.left = ev.left + offPx;\n\t\t\t\t// See if this is before the first event - that is the case where there are \"prep beats\"\n\t\t\t\tif (self.currentEvent === 0 && ev.milliseconds > timestamp-self.startTime)\n\t\t\t\t\tposition.left = undefined\n\t\t\t\t\n\t\t\t\tdebugInfo = {\n\t\t\t\t\ttimestamp: timestamp,\n\t\t\t\t\tstartTime: self.startTime,\n\t\t\t\t\tev: ev,\n\t\t\t\t\tendMs: endMs,\n\t\t\t\t\toffMs: offMs,\n\t\t\t\t\toffPx: offPx,\n\t\t\t\t\tgapMs: gapMs,\n\t\t\t\t\tgapPx: gapPx\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tdebugInfo = {\n\t\t\t\t\ttimestamp: timestamp,\n\t\t\t\t\tstartTime: self.startTime,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tvar thisStartTime = self.startTime; // the beat callback can call seek and change the position from beneath us.\n\t\t\tself.beatCallback(\n\t\t\t\tself.currentBeat / self.beatSubdivisions,\n\t\t\t\tself.totalBeats / self.beatSubdivisions,\n\t\t\t\tself.lastMoment,\n\t\t\t\tposition,\n\t\t\t\tdebugInfo);\n\t\t\tif (thisStartTime !== self.startTime) {\n\t\t\t\treturn timestamp - self.startTime;\n\t\t\t} else\n\t\t\t\tself.currentBeat++;\n\t\t}\n\t\treturn null;\n\t};\n\n\t// In general music doesn't need a timer at 60 fps because notes don't happen that fast.\n\t// For instance, at 120 beats per minute, a sixteenth note takes 125ms. So just as a\n\t// compromise value between performance and jank this is set about half that.\n\tvar JOGGING_INTERVAL = 60;\n\n\tself.animationJogger = function() {\n\t\t// There are some cases where the animation timer doesn't work: for instance when\n\t\t// this isn't running in a visible tab and sometimes on mobile devices. We compensate\n\t\t// by having a backup timer using setTimeout. This won't be accurate so the performance\n\t\t// will be jerky, but without it the requestAnimationFrame might be skipped and so\n\t\t// not called again.\n\t\tif (self.isRunning) {\n\t\t\tself.doTiming(performance.now());\n\t\t\tself.joggerTimer = setTimeout(self.animationJogger, JOGGING_INTERVAL);\n\t\t}\n\t};\n\n\tself.start = function(offsetPercent, units) {\n\t\tself.isRunning = true;\n\t\tif (self.isPaused) {\n\t\t\tself.isPaused = false;\n\t\t\tif (offsetPercent === undefined)\n\t\t\t\tself.justUnpaused = true;\n\t\t}\n\t\tif (offsetPercent) {\n\t\t\tself.setProgress(offsetPercent, units);\n\t\t} else if (offsetPercent === 0) {\n\t\t\tself.reset();\n\t\t} else if (self.pausedPercent !== null) {\n\t\t\tvar now = performance.now();\n\t\t\tself.currentTime = self.lastMoment * self.pausedPercent;\n\t\t\tself.startTime = now - self.currentTime;\n\t\t\tself.pausedPercent = null;\n\t\t\tself.reportNext = true;\n\t\t}\n\t\trequestAnimationFrame(self.doTiming);\n\t\tself.joggerTimer = setTimeout(self.animationJogger, JOGGING_INTERVAL);\n\t};\n\tself.pause = function() {\n\t\tself.isPaused = true;\n\t\tvar now = performance.now();\n\t\tself.pausedPercent = (now - self.startTime) / self.lastMoment;\n\t\tself.isRunning = false;\n\t\tif (self.joggerTimer) {\n\t\t\tclearTimeout(self.joggerTimer);\n\t\t\tself.joggerTimer = null;\n\t\t}\n\t};\n\tself.currentMillisecond = function() {\n\t\treturn self.currentTime;\n\t};\n\tself.reset = function() {\n\t\tself.currentBeat = 0;\n\t\tself.currentEvent = 0;\n\t\tself.currentLine = 0;\n\t\tself.startTime = null;\n\t\tself.pausedPercent = null;\n\t};\n\tself.stop = function() {\n\t\tself.pause();\n\t\tself.reset();\n\t};\n\tself.setProgress = function(position, units) {\n\t\t// the effect of this function is to move startTime so that the callbacks happen correctly for the new seek.\n\t\tvar percent;\n\t\tswitch (units) {\n\t\t\tcase \"seconds\":\n\t\t\t\tself.currentTime = position * 1000;\n\t\t\t\tif (self.currentTime < 0) self.currentTime = 0;\n\t\t\t\tif (self.currentTime > self.lastMoment) self.currentTime = self.lastMoment;\n\t\t\t\tpercent = self.currentTime / self.lastMoment;\n\t\t\t\tbreak;\n\t\t\tcase \"beats\":\n\t\t\t\tself.currentTime = position * self.millisecondsPerBeat * self.beatSubdivisions;\n\t\t\t\tif (self.currentTime < 0) self.currentTime = 0;\n\t\t\t\tif (self.currentTime > self.lastMoment) self.currentTime = self.lastMoment;\n\t\t\t\tpercent = self.currentTime / self.lastMoment;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\t// this is \"percent\" or any illegal value\n\t\t\t\t// this is passed a value between 0 and 1.\n\t\t\t\tpercent = position;\n\t\t\t\tif (percent < 0) percent = 0;\n\t\t\t\tif (percent > 1) percent = 1;\n\t\t\t\tself.currentTime = self.lastMoment * percent;\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif (!self.isRunning)\n\t\t\tself.pausedPercent = percent;\n\n\t\tvar now = performance.now();\n\t\tself.startTime = now - self.currentTime;\n\n\t\tvar oldEvent = self.currentEvent;\n\t\tself.currentEvent = 0;\n\t\twhile (self.noteTimings.length > self.currentEvent && self.noteTimings[self.currentEvent].milliseconds < self.currentTime) {\n\t\t\tself.currentEvent++;\n\t\t}\n\n\t\tif (self.lineEndCallback) {\n\t\t\tself.currentLine = 0;\n\t\t\twhile (self.lineEndTimings.length > self.currentLine && self.lineEndTimings[self.currentLine].milliseconds + self.lineEndAnticipation < self.currentTime) {\n\t\t\t\tself.currentLine++;\n\t\t\t}\n\t\t}\n\n\t\tvar oldBeat = self.currentBeat;\n\t\tself.currentBeat = Math.floor(self.currentTime / self.millisecondsPerBeat);\n\t\tif (self.beatCallback && oldBeat !== self.currentBeat) // If the movement caused the beat to change, then immediately report it to the client.\n\t\t\tself.doBeatCallback(self.startTime+self.currentTime);\n\n\t\tif (self.eventCallback && self.currentEvent >= 0 && self.noteTimings[self.currentEvent].type === 'event')\n\t\t\tself.eventCallback(self.noteTimings[self.currentEvent]);\n\t\tif (self.lineEndCallback)\n\t\t\tself.lineEndCallback(self.lineEndTimings[self.currentLine], self.noteTimings[self.currentEvent], { line: self.currentLine, endTimings: self.lineEndTimings });\n\n\t\tself.joggerTimer = setTimeout(self.animationJogger, JOGGING_INTERVAL);\n\t};\n};\n\nfunction getLineEndTimings(timings, anticipation) {\n\t// Returns an array of milliseconds to call the lineEndCallback.\n\t// This figures out the timing of the beginning of each line and subtracts the anticipation from it.\n\tvar callbackTimes = [];\n\tvar lastTop = null;\n\tfor (var i = 0; i < timings.length; i++) {\n\t\tvar timing = timings[i];\n\t\tif (timing.type !== 'end' && timing.top !== lastTop) {\n\t\t\tcallbackTimes.push({ measureNumber: timing.measureNumber, milliseconds: timing.milliseconds-anticipation, top: timing.top, bottom: timing.top+timing.height });\n\t\t\tlastTop = timing.top;\n\t\t}\n\t}\n\treturn callbackTimes;\n}\n\nmodule.exports = TimingCallbacks;\n\n","// abc_animation.js: handles animating the music in real time.\n\nvar TimingCallbacks = require('./abc_timing_callbacks');\n\nvar animation = {};\n\n(function() {\n\t\"use strict\";\n\n\tvar timer;\n\tvar cursor;\n\tanimation.startAnimation = function(paper, tune, options) {\n\t\t//options.bpm\n\t\t//options.showCursor\n\t\t//options.hideCurrentMeasure\n\t\t//options.hideFinishedMeasures\n\t\tif (timer) {\n\t\t\ttimer.stop();\n\t\t\ttimer = undefined;\n\t\t}\n\n\t\tif (options.showCursor) {\n\t\t\tcursor = paper.querySelector('.abcjs-cursor');\n\t\t\tif (!cursor) {\n\t\t\t\tcursor = document.createElement('DIV');\n\t\t\t\tcursor.className = 'abcjs-cursor cursor';\n\t\t\t\tcursor.style.position = 'absolute';\n\n\t\t\t\tpaper.appendChild(cursor);\n\t\t\t\tpaper.style.position = 'relative';\n\t\t\t}\n\t\t}\n\n\t\tfunction hideMeasures(elements) {\n\t\t\tfor (var i = 0; i < elements.length; i++) {\n\t\t\t\tvar element = elements[i];\n\t\t\t\tif (!element.classList.contains('abcjs-bar'))\n\t\t\t\t\telement.style.display = \"none\";\n\t\t\t}\n\t\t}\n\n\t\tvar lastMeasure;\n\t\tfunction disappearMeasuresAfter(selector) {\n\t\t\tif (lastMeasure) {\n\t\t\t\tvar elements = paper.querySelectorAll(lastMeasure);\n\t\t\t\thideMeasures(elements);\n\t\t\t}\n\t\t\tlastMeasure = selector;\n\t\t}\n\n\t\tfunction disappearMeasuresBefore(selector) {\n\t\t\tvar elements = paper.querySelectorAll(selector);\n\t\t\thideMeasures(elements);\n\t\t}\n\n\t\tfunction measureCallback(selector) {\n\t\t\tif (options.hideCurrentMeasure) {\n\t\t\t\tdisappearMeasuresBefore(selector);\n\t\t\t} else if (options.hideFinishedMeasures) {\n\t\t\t\tdisappearMeasuresAfter(selector);\n\t\t\t}\n\t\t}\n\n\t\tfunction getLineAndMeasure(element) {\n\t\t\treturn '.abcjs-l' + element.line + '.abcjs-m' + element.measureNumber;\n\t\t}\n\n\t\tfunction setCursor(range) {\n\t\t\tif (range) {\n\t\t\t\tif (range.measureStart) {\n\t\t\t\t\tvar selector = getLineAndMeasure(range);\n\t\t\t\t\tif (selector)\n\t\t\t\t\t\tmeasureCallback(selector);\n\t\t\t\t}\n\t\t\t\tif (cursor) {\n\t\t\t\t\tcursor.style.left = range.left + \"px\";\n\t\t\t\t\tcursor.style.top = range.top + \"px\";\n\t\t\t\t\tcursor.style.width = range.width + \"px\";\n\t\t\t\t\tcursor.style.height = range.height + \"px\";\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\ttimer.stop();\n\t\t\t\ttimer = undefined;\n\t\t\t}\n\t\t}\n\n\t\ttimer = new TimingCallbacks(tune, {\n\t\t\tqpm: options.bpm,\n\t\t\teventCallback: setCursor\n\t\t});\n\t\ttimer.start();\n\t};\n\n\tanimation.pauseAnimation = function(pause) {\n\t\tif (timer) {\n\t\t\tif (pause)\n\t\t\t\ttimer.pause();\n\t\t\telse\n\t\t\t\ttimer.start();\n\t\t}\n\t};\n\n\tanimation.stopAnimation = function() {\n\t\tif (timer) {\n\t\t\ttimer.stop();\n\t\t\ttimer = undefined;\n\t\t}\n\t};\n\n})();\n\nmodule.exports = animation;\n","// abc_common.js: Some common utility functions.\n\nvar parseCommon = {};\n\nparseCommon.cloneArray = function(source) {\n\tvar destination = [];\n\tfor (var i = 0; i < source.length; i++) {\n\t\tdestination.push(Object.assign({},source[i]));\n\t}\n\treturn destination;\n};\n\nparseCommon.cloneHashOfHash = function(source) {\n\tvar destination = {};\n\tfor (var property in source)\n\t\tif (source.hasOwnProperty(property))\n\t\t\tdestination[property] = Object.assign({},source[property]);\n\treturn destination;\n};\n\nparseCommon.cloneHashOfArrayOfHash = function(source) {\n\tvar destination = {};\n\tfor (var property in source)\n\t\tif (source.hasOwnProperty(property))\n\t\t\tdestination[property] = parseCommon.cloneArray(source[property]);\n\treturn destination;\n};\n\nparseCommon.strip = function(str) {\n\treturn str.replace(/^\\s+/, '').replace(/\\s+$/, '');\n};\n\nparseCommon.startsWith = function(str, pattern) {\n\treturn str.indexOf(pattern) === 0;\n};\n\nparseCommon.endsWith = function(str, pattern) {\n\tvar d = str.length - pattern.length;\n\treturn d >= 0 && str.lastIndexOf(pattern) === d;\n};\n\nparseCommon.last = function(arr) {\n\tif (arr.length === 0)\n\t\treturn null;\n\treturn arr[arr.length-1];\n};\n\n\nmodule.exports = parseCommon;\n","var parseCommon = require('./abc_common');\n\nvar parseDirective = {};\n\n(function() {\n\t\"use strict\";\n\tvar tokenizer;\n\tvar warn;\n\tvar multilineVars;\n\tvar tune;\n\tvar tuneBuilder;\n\tparseDirective.initialize = function(tokenizer_, warn_, multilineVars_, tune_, tuneBuilder_) {\n\t\ttokenizer = tokenizer_;\n\t\twarn = warn_;\n\t\tmultilineVars = multilineVars_;\n\t\ttune = tune_;\n\t\ttuneBuilder = tuneBuilder_;\n\t\tinitializeFonts();\n\t};\n\n\tfunction initializeFonts() {\n\t\tmultilineVars.annotationfont = { face: \"Helvetica\", size: 12, weight: \"normal\", style: \"normal\", decoration: \"none\" };\n\t\tmultilineVars.gchordfont = { face: \"Helvetica\", size: 12, weight: \"normal\", style: \"normal\", decoration: \"none\" };\n\t\tmultilineVars.historyfont = { face: \"\\\"Times New Roman\\\"\", size: 16, weight: \"normal\", style: \"normal\", decoration: \"none\" };\n\t\tmultilineVars.infofont = { face: \"\\\"Times New Roman\\\"\", size: 14, weight: \"normal\", style: \"italic\", decoration: \"none\" };\n\t\tmultilineVars.measurefont = { face: \"\\\"Times New Roman\\\"\", size: 14, weight: \"normal\", style: \"italic\", decoration: \"none\" };\n\t\tmultilineVars.partsfont = { face: \"\\\"Times New Roman\\\"\", size: 15, weight: \"normal\", style: \"normal\", decoration: \"none\" };\n\t\tmultilineVars.repeatfont = { face: \"\\\"Times New Roman\\\"\", size: 13, weight: \"normal\", style: \"normal\", decoration: \"none\" };\n\t\tmultilineVars.textfont = { face: \"\\\"Times New Roman\\\"\", size: 16, weight: \"normal\", style: \"normal\", decoration: \"none\" };\n\t\tmultilineVars.tripletfont = {face: \"Times\", size: 11, weight: \"normal\", style: \"italic\", decoration: \"none\"};\n\t\tmultilineVars.vocalfont = { face: \"\\\"Times New Roman\\\"\", size: 13, weight: \"bold\", style: \"normal\", decoration: \"none\" };\n\t\tmultilineVars.wordsfont = { face: \"\\\"Times New Roman\\\"\", size: 16, weight: \"normal\", style: \"normal\", decoration: \"none\" };\n\n\t\t// These fonts are global for the entire tune.\n\t\ttune.formatting.composerfont = { face: \"\\\"Times New Roman\\\"\", size: 14, weight: \"normal\", style: \"italic\", decoration: \"none\" };\n\t\ttune.formatting.subtitlefont = { face: \"\\\"Times New Roman\\\"\", size: 16, weight: \"normal\", style: \"normal\", decoration: \"none\" };\n\t\ttune.formatting.tempofont = { face: \"\\\"Times New Roman\\\"\", size: 15, weight: \"bold\", style: \"normal\", decoration: \"none\" };\n\t\ttune.formatting.titlefont = { face: \"\\\"Times New Roman\\\"\", size: 20, weight: \"normal\", style: \"normal\", decoration: \"none\" };\n\t\ttune.formatting.footerfont = { face: \"\\\"Times New Roman\\\"\", size: 12, weight: \"normal\", style: \"normal\", decoration: \"none\" };\n\t\ttune.formatting.headerfont = { face: \"\\\"Times New Roman\\\"\", size: 12, weight: \"normal\", style: \"normal\", decoration: \"none\" };\n\t\ttune.formatting.voicefont = { face: \"\\\"Times New Roman\\\"\", size: 13, weight: \"bold\", style: \"normal\", decoration: \"none\" };\n\t\ttune.formatting.tablabelfont = { face: \"\\\"Trebuchet MS\\\"\", size: 16, weight: \"normal\", style: \"normal\", decoration: \"none\" };\n\t\ttune.formatting.tabnumberfont = { face: \"\\\"Arial\\\"\", size: 11, weight: \"normal\", style: \"normal\", decoration: \"none\" };\n\t\ttune.formatting.tabgracefont = { face: \"\\\"Arial\\\"\", size: 8, weight: \"normal\", style: \"normal\", decoration: \"none\" };\n\n\t\t// these are the default fonts for these element types. In the printer, these fonts might change as the tune progresses.\n\t\ttune.formatting.annotationfont = multilineVars.annotationfont;\n\t\ttune.formatting.gchordfont = multilineVars.gchordfont;\n\t\ttune.formatting.historyfont = multilineVars.historyfont;\n\t\ttune.formatting.infofont = multilineVars.infofont;\n\t\ttune.formatting.measurefont = multilineVars.measurefont;\n\t\ttune.formatting.partsfont = multilineVars.partsfont;\n\t\ttune.formatting.repeatfont = multilineVars.repeatfont;\n\t\ttune.formatting.textfont = multilineVars.textfont;\n\t\ttune.formatting.tripletfont = multilineVars.tripletfont;\n\t\ttune.formatting.vocalfont = multilineVars.vocalfont;\n\t\ttune.formatting.wordsfont = multilineVars.wordsfont;\n\t}\n\n\tvar fontTypeCanHaveBox = { gchordfont: true, measurefont: true, partsfont: true, annotationfont: true, composerfont: true, historyfont: true, infofont: true, subtitlefont: true, textfont: true, titlefont: true, voicefont: true };\n\n\tvar fontTranslation = function(fontFace) {\n\t\t// This translates Postscript fonts for a web alternative.\n\t\t// Note that the postscript fonts contain italic and bold info in them, so what is returned is a hash.\n\n\t\tswitch (fontFace) {\n\t\t\tcase \"Arial-Italic\":\n\t\t\t\treturn { face: \"Arial\", weight: \"normal\", style: \"italic\", decoration: \"none\" };\n\t\t\tcase \"Arial-Bold\":\n\t\t\t\treturn { face: \"Arial\", weight: \"bold\", style: \"normal\", decoration: \"none\" };\n\t\t\tcase \"Bookman-Demi\":\n\t\t\t\treturn { face: \"Bookman,serif\", weight: \"bold\", style: \"normal\", decoration: \"none\" };\n\t\t\tcase \"Bookman-DemiItalic\":\n\t\t\t\treturn { face: \"Bookman,serif\", weight: \"bold\", style: \"italic\", decoration: \"none\" };\n\t\t\tcase \"Bookman-Light\":\n\t\t\t\treturn { face: \"Bookman,serif\", weight: \"normal\", style: \"normal\", decoration: \"none\" };\n\t\t\tcase \"Bookman-LightItalic\":\n\t\t\t\treturn { face: \"Bookman,serif\", weight: \"normal\", style: \"italic\", decoration: \"none\" };\n\t\t\tcase \"Courier\":\n\t\t\t\treturn { face: \"\\\"Courier New\\\"\", weight: \"normal\", style: \"normal\", decoration: \"none\" };\n\t\t\tcase \"Courier-Oblique\":\n\t\t\t\treturn { face: \"\\\"Courier New\\\"\", weight: \"normal\", style: \"italic\", decoration: \"none\" };\n\t\t\tcase \"Courier-Bold\":\n\t\t\t\treturn { face: \"\\\"Courier New\\\"\", weight: \"bold\", style: \"normal\", decoration: \"none\" };\n\t\t\tcase \"Courier-BoldOblique\":\n\t\t\t\treturn { face: \"\\\"Courier New\\\"\", weight: \"bold\", style: \"italic\", decoration: \"none\" };\n\t\t\tcase \"AvantGarde-Book\":\n\t\t\t\treturn { face: \"AvantGarde,Arial\", weight: \"normal\", style: \"normal\", decoration: \"none\" };\n\t\t\tcase \"AvantGarde-BookOblique\":\n\t\t\t\treturn { face: \"AvantGarde,Arial\", weight: \"normal\", style: \"italic\", decoration: \"none\" };\n\t\t\tcase \"AvantGarde-Demi\":\n\t\t\tcase \"Avant-Garde-Demi\":\n\t\t\t\treturn { face: \"AvantGarde,Arial\", weight: \"bold\", style: \"normal\", decoration: \"none\" };\n\t\t\tcase \"AvantGarde-DemiOblique\":\n\t\t\t\treturn { face: \"AvantGarde,Arial\", weight: \"bold\", style: \"italic\", decoration: \"none\" };\n\t\t\tcase \"Helvetica-Oblique\":\n\t\t\t\treturn { face: \"Helvetica\", weight: \"normal\", style: \"italic\", decoration: \"none\" };\n\t\t\tcase \"Helvetica-Bold\":\n\t\t\t\treturn { face: \"Helvetica\", weight: \"bold\", style: \"normal\", decoration: \"none\" };\n\t\t\tcase \"Helvetica-BoldOblique\":\n\t\t\t\treturn { face: \"Helvetica\", weight: \"bold\", style: \"italic\", decoration: \"none\" };\n\t\t\tcase \"Helvetica-Narrow\":\n\t\t\t\treturn { face: \"\\\"Helvetica Narrow\\\",Helvetica\", weight: \"normal\", style: \"normal\", decoration: \"none\" };\n\t\t\tcase \"Helvetica-Narrow-Oblique\":\n\t\t\t\treturn { face: \"\\\"Helvetica Narrow\\\",Helvetica\", weight: \"normal\", style: \"italic\", decoration: \"none\" };\n\t\t\tcase \"Helvetica-Narrow-Bold\":\n\t\t\t\treturn { face: \"\\\"Helvetica Narrow\\\",Helvetica\", weight: \"bold\", style: \"normal\", decoration: \"none\" };\n\t\t\tcase \"Helvetica-Narrow-BoldOblique\":\n\t\t\t\treturn { face: \"\\\"Helvetica Narrow\\\",Helvetica\", weight: \"bold\", style: \"italic\", decoration: \"none\" };\n\t\t\tcase \"Palatino-Roman\":\n\t\t\t\treturn { face: \"Palatino\", weight: \"normal\", style: \"normal\", decoration: \"none\" };\n\t\t\tcase \"Palatino-Italic\":\n\t\t\t\treturn { face: \"Palatino\", weight: \"normal\", style: \"italic\", decoration: \"none\" };\n\t\t\tcase \"Palatino-Bold\":\n\t\t\t\treturn { face: \"Palatino\", weight: \"bold\", style: \"normal\", decoration: \"none\" };\n\t\t\tcase \"Palatino-BoldItalic\":\n\t\t\t\treturn { face: \"Palatino\", weight: \"bold\", style: \"italic\", decoration: \"none\" };\n\t\t\tcase \"NewCenturySchlbk-Roman\":\n\t\t\t\treturn { face: \"\\\"New Century\\\",serif\", weight: \"normal\", style: \"normal\", decoration: \"none\" };\n\t\t\tcase \"NewCenturySchlbk-Italic\":\n\t\t\t\treturn { face: \"\\\"New Century\\\",serif\", weight: \"normal\", style: \"italic\", decoration: \"none\" };\n\t\t\tcase \"NewCenturySchlbk-Bold\":\n\t\t\t\treturn { face: \"\\\"New Century\\\",serif\", weight: \"bold\", style: \"normal\", decoration: \"none\" };\n\t\t\tcase \"NewCenturySchlbk-BoldItalic\":\n\t\t\t\treturn { face: \"\\\"New Century\\\",serif\", weight: \"bold\", style: \"italic\", decoration: \"none\" };\n\t\t\tcase \"Times\":\n\t\t\tcase \"Times-Roman\":\n\t\t\tcase \"Times-Narrow\":\n\t\t\tcase \"Times-Courier\":\n\t\t\tcase \"Times-New-Roman\":\n\t\t\t\treturn { face: \"\\\"Times New Roman\\\"\", weight: \"normal\", style: \"normal\", decoration: \"none\" };\n\t\t\tcase \"Times-Italic\":\n\t\t\tcase \"Times-Italics\":\n\t\t\t\treturn { face: \"\\\"Times New Roman\\\"\", weight: \"normal\", style: \"italic\", decoration: \"none\" };\n\t\t\tcase \"Times-Bold\":\n\t\t\t\treturn { face: \"\\\"Times New Roman\\\"\", weight: \"bold\", style: \"normal\", decoration: \"none\" };\n\t\t\tcase \"Times-BoldItalic\":\n\t\t\t\treturn { face: \"\\\"Times New Roman\\\"\", weight: \"bold\", style: \"italic\", decoration: \"none\" };\n\t\t\tcase \"ZapfChancery-MediumItalic\":\n\t\t\t\treturn { face: \"\\\"Zapf Chancery\\\",cursive,serif\", weight: \"normal\", style: \"normal\", decoration: \"none\" };\n\t\t\tdefault:\n\t\t\t\treturn null;\n\t\t}\n\t};\n\n\tvar getFontParameter = function(tokens, currentSetting, str, position, cmd) {\n\t\t// Every font parameter has the following format:\n\t\t// <face> <utf8> <size> <modifiers> <box>\n\t\t// Where:\n\t\t// face: either a standard web font name, or a postscript font, enumerated in fontTranslation. This could also be an * or be missing if the face shouldn't change.\n\t\t// utf8: This is optional, and specifies utf8. That's all that is supported so the field is just silently ignored.\n\t\t// size: The size, in pixels. This may be omitted if the size is not changing.\n\t\t// modifiers: zero or more of \"bold\", \"italic\", \"underline\"\n\t\t// box: Only applies to the measure numbers, gchords, and the parts. If present, then a box is drawn around the characters.\n\t\t// If face is present, then all the modifiers are cleared. If face is absent, then the modifiers are illegal.\n\t\t// The face can be a single word, a set of words separated by hyphens, or a quoted string.\n\t\t//\n\t\t// So, in practicality, there are three types of font definitions: a number only, an asterisk and a number only, or the full definition (with an optional size).\n\t\tfunction processNumberOnly() {\n\t\t\tvar size = parseInt(tokens[0].token);\n\t\t\ttokens.shift();\n\t\t\tif (!currentSetting) {\n\t\t\t\twarn(\"Can't set just the size of the font since there is no default value.\", str, position);\n\t\t\t\treturn { face: \"\\\"Times New Roman\\\"\", weight: \"normal\", style: \"normal\", decoration: \"none\", size: size};\n\t\t\t}\n\t\t\tif (tokens.length === 0) {\n\t\t\t\treturn { face: currentSetting.face, weight: currentSetting.weight, style: currentSetting.style, decoration: currentSetting.decoration, size: size};\n\t\t\t}\n\t\t\tif (tokens.length === 1 && tokens[0].token === \"box\" && fontTypeCanHaveBox[cmd])\n\t\t\t\treturn { face: currentSetting.face, weight: currentSetting.weight, style: currentSetting.style, decoration: currentSetting.decoration, size: size, box: true};\n\t\t\twarn(\"Extra parameters in font definition.\", str, position);\n\t\t\treturn { face: currentSetting.face, weight: currentSetting.weight, style: currentSetting.style, decoration: currentSetting.decoration, size: size};\n\t\t}\n\n\t\t// format 1: asterisk and number only\n\t\tif (tokens[0].token === '*') {\n\t\t\ttokens.shift();\n\t\t\tif (tokens[0].type === 'number')\n\t\t\t\treturn processNumberOnly();\n\t\t\telse {\n\t\t\t\twarn(\"Expected font size number after *.\", str, position);\n\t\t\t}\n\t\t}\n\n\t\t// format 2: number only\n\t\tif (tokens[0].type === 'number') {\n\t\t\treturn processNumberOnly();\n\t\t}\n\n\t\t// format 3: whole definition\n\t\tvar face = [];\n\t\tvar size;\n\t\tvar weight = \"normal\";\n\t\tvar style = \"normal\";\n\t\tvar decoration = \"none\";\n\t\tvar box = false;\n\t\tvar state = 'face';\n\t\tvar hyphenLast = false;\n\t\twhile (tokens.length) {\n\t\t\tvar currToken = tokens.shift();\n\t\t\tvar word = currToken.token.toLowerCase();\n\t\t\tswitch (state) {\n\t\t\t\tcase 'face':\n\t\t\t\t\tif (hyphenLast || (word !== 'utf' && currToken.type !== 'number' && word !== \"bold\" && word !== \"italic\" && word !== \"underline\" && word !== \"box\")) {\n\t\t\t\t\t\tif (face.length > 0 && currToken.token === '-') {\n\t\t\t\t\t\t\thyphenLast = true;\n\t\t\t\t\t\t\tface[face.length-1] = face[face.length-1] + currToken.token;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tif (hyphenLast) {\n\t\t\t\t\t\t\t\thyphenLast = false;\n\t\t\t\t\t\t\t\tface[face.length-1] = face[face.length-1] + currToken.token;\n\t\t\t\t\t\t\t} else\n\t\t\t\t\t\t\t\tface.push(currToken.token);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (currToken.type === 'number') {\n\t\t\t\t\t\t\tif (size) {\n\t\t\t\t\t\t\t\twarn(\"Font size specified twice in font definition.\", str, position);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tsize = currToken.token;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tstate = 'modifier';\n\t\t\t\t\t\t} else if (word === \"bold\")\n\t\t\t\t\t\t\tweight = \"bold\";\n\t\t\t\t\t\telse if (word === \"italic\")\n\t\t\t\t\t\t\tstyle = \"italic\";\n\t\t\t\t\t\telse if (word === \"underline\")\n\t\t\t\t\t\t\tdecoration = \"underline\";\n\t\t\t\t\t\telse if (word === \"box\") {\n\t\t\t\t\t\t\tif (fontTypeCanHaveBox[cmd])\n\t\t\t\t\t\t\t\tbox = true;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\twarn(\"This font style doesn't support \\\"box\\\"\", str, position);\n\t\t\t\t\t\t\tstate = \"finished\";\n\t\t\t\t\t\t} else if (word === \"utf\") {\n\t\t\t\t\t\t\tcurrToken = tokens.shift(); // this gets rid of the \"8\" after \"utf\"\n\t\t\t\t\t\t\tstate = \"size\";\n\t\t\t\t\t\t} else\n\t\t\t\t\t\t\twarn(\"Unknown parameter \" + currToken.token + \" in font definition.\", str, position);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"size\":\n\t\t\t\t\tif (currToken.type === 'number') {\n\t\t\t\t\t\tif (size) {\n\t\t\t\t\t\t\twarn(\"Font size specified twice in font definition.\", str, position);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsize = currToken.token;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\twarn(\"Expected font size in font definition.\", str, position);\n\t\t\t\t\t}\n\t\t\t\t\tstate = 'modifier';\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"modifier\":\n\t\t\t\t\tif (word === \"bold\")\n\t\t\t\t\t\tweight = \"bold\";\n\t\t\t\t\telse if (word === \"italic\")\n\t\t\t\t\t\tstyle = \"italic\";\n\t\t\t\t\telse if (word === \"underline\")\n\t\t\t\t\t\tdecoration = \"underline\";\n\t\t\t\t\telse if (word === \"box\") {\n\t\t\t\t\t\tif (fontTypeCanHaveBox[cmd])\n\t\t\t\t\t\t\tbox = true;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\twarn(\"This font style doesn't support \\\"box\\\"\", str, position);\n\t\t\t\t\t\tstate = \"finished\";\n\t\t\t\t\t} else\n\t\t\t\t\t\twarn(\"Unknown parameter \" + currToken.token + \" in font definition.\", str, position);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"finished\":\n\t\t\t\t\twarn(\"Extra characters found after \\\"box\\\" in font definition.\", str, position);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (size === undefined) {\n\t\t\tif (!currentSetting) {\n\t\t\t\twarn(\"Must specify the size of the font since there is no default value.\", str, position);\n\t\t\t\tsize = 12;\n\t\t\t} else\n\t\t\t\tsize = currentSetting.size;\n\t\t} else\n\t\t\tsize = parseFloat(size);\n\n\t\tface = face.join(' ');\n\t\tif (face === '') {\n\t\t\tif (!currentSetting) {\n\t\t\t\twarn(\"Must specify the name of the font since there is no default value.\", str, position);\n\t\t\t\tface = \"sans-serif\";\n\t\t\t} else\n\t\t\t\tface = currentSetting.face;\n\t\t}\n\t\tvar psFont = fontTranslation(face);\n\t\tvar font = {};\n\t\tif (psFont) {\n\t\t\tfont.face = psFont.face;\n\t\t\tfont.weight = psFont.weight;\n\t\t\tfont.style = psFont.style;\n\t\t\tfont.decoration = psFont.decoration;\n\t\t\tfont.size = size;\n\t\t\tif (box)\n\t\t\t\tfont.box = true;\n\t\t\treturn font;\n\t\t}\n\t\tfont.face = face;\n\t\tfont.weight = weight;\n\t\tfont.style = style;\n\t\tfont.decoration = decoration;\n\t\tfont.size = size;\n\t\tif (box)\n\t\t\tfont.box = true;\n\t\treturn font;\n\t};\n\n\tvar getChangingFont = function(cmd, tokens, str) {\n\t\tif (tokens.length === 0)\n\t\t\treturn \"Directive \\\"\" + cmd + \"\\\" requires a font as a parameter.\";\n\t\tmultilineVars[cmd] = getFontParameter(tokens, multilineVars[cmd], str, 0, cmd);\n\t\tif (multilineVars.is_in_header) // If the font appears in the header, then it becomes the default font.\n\t\t\ttune.formatting[cmd] = multilineVars[cmd];\n\t\treturn null;\n\t};\n\tvar getGlobalFont = function(cmd, tokens, str) {\n\t\tif (tokens.length === 0)\n\t\t\treturn \"Directive \\\"\" + cmd + \"\\\" requires a font as a parameter.\";\n\t\ttune.formatting[cmd] = getFontParameter(tokens, tune.formatting[cmd], str, 0, cmd);\n\t\treturn null;\n\t};\n\n\tvar setScale = function(cmd, tokens) {\n\t\tvar scratch = \"\";\n\t\ttokens.forEach(function(tok) {\n\t\t\tscratch += tok.token;\n\t\t});\n\t\tvar num = parseFloat(scratch);\n\t\tif (isNaN(num) || num === 0)\n\t\t\treturn \"Directive \\\"\" + cmd + \"\\\" requires a number as a parameter.\";\n\t\ttune.formatting.scale = num;\n\n\t};\n\t// starts at 35\n\tvar drumNames = [\n\t\t\"acoustic-bass-drum\",\n\t\t\"bass-drum-1\",\n\t\t\"side-stick\",\n\t\t\"acoustic-snare\",\n\t\t\"hand-clap\",\n\t\t\"electric-snare\",\n\t\t\"low-floor-tom\",\n\t\t\"closed-hi-hat\",\n\t\t\"high-floor-tom\",\n\t\t\"pedal-hi-hat\",\n\t\t\"low-tom\",\n\t\t\"open-hi-hat\",\n\t\t\"low-mid-tom\",\n\t\t\"hi-mid-tom\",\n\t\t\"crash-cymbal-1\",\n\t\t\"high-tom\",\n\t\t\"ride-cymbal-1\",\n\t\t\"chinese-cymbal\",\n\t\t\"ride-bell\",\n\t\t\"tambourine\",\n\t\t\"splash-cymbal\",\n\t\t\"cowbell\",\n\t\t\"crash-cymbal-2\",\n\t\t\"vibraslap\",\n\t\t\"ride-cymbal-2\",\n\t\t\"hi-bongo\",\n\t\t\"low-bongo\",\n\t\t\"mute-hi-conga\",\n\t\t\"open-hi-conga\",\n\t\t\"low-conga\",\n\t\t\"high-timbale\",\n\t\t\"low-timbale\",\n\t\t\"high-agogo\",\n\t\t\"low-agogo\",\n\t\t\"cabasa\",\n\t\t\"maracas\",\n\t\t\"short-whistle\",\n\t\t\"long-whistle\",\n\t\t\"short-guiro\",\n\t\t\"long-guiro\",\n\t\t\"claves\",\n\t\t\"hi-wood-block\",\n\t\t\"low-wood-block\",\n\t\t\"mute-cuica\",\n\t\t\"open-cuica\",\n\t\t\"mute-triangle\",\n\t\t\"open-triangle\",\n\t];\n\n\tvar interpretPercMap = function(restOfString) {\n\t\tvar tokens = restOfString.split(/\\s+/); // Allow multiple spaces.\n\t\tif (tokens.length !== 2 && tokens.length !== 3)\n\t\t\treturn { error: 'Expected parameters \"abc-note\", \"drum-sound\", and optionally \"note-head\"'};\n\t\tvar key = tokens[0];\n\t\t// The percussion sound can either be a MIDI number or a drum name. If it is not a number then check for a name.\n\t\tvar pitch = parseInt(tokens[1], 10);\n\t\tif ((isNaN(pitch) || pitch < 35 || pitch > 81) && tokens[1]) {\n\t\t\tpitch = drumNames.indexOf(tokens[1].toLowerCase()) + 35;\n\t\t}\n\t\tif ((isNaN(pitch) || pitch < 35 || pitch > 81))\n\t\t\treturn { error: 'Expected drum name, received \"' + tokens[1] + '\"' };\n\t\tvar value = { sound: pitch };\n\t\tif (tokens.length === 3)\n\t\t\tvalue.noteHead = tokens[2];\n\t\treturn { key: key, value: value };\n\t};\n\n\tvar getRequiredMeasurement = function(cmd, tokens) {\n\t\tvar points = tokenizer.getMeasurement(tokens);\n\t\tif (points.used === 0 || tokens.length !== 0)\n\t\t\treturn { error: \"Directive \\\"\" + cmd + \"\\\" requires a measurement as a parameter.\"};\n\t\treturn points.value;\n\t};\n\tvar oneParameterMeasurement = function(cmd, tokens) {\n\t\tvar points = tokenizer.getMeasurement(tokens);\n\t\tif (points.used === 0 || tokens.length !== 0)\n\t\t\treturn \"Directive \\\"\" + cmd + \"\\\" requires a measurement as a parameter.\";\n\t\ttune.formatting[cmd] = points.value;\n\t\treturn null;\n\t};\n\n\tvar addMultilineVar = function(key, cmd, tokens, min, max) {\n\t\tif (tokens.length !== 1 || tokens[0].type !== 'number')\n\t\t\treturn \"Directive \\\"\" + cmd + \"\\\" requires a number as a parameter.\";\n\t\tvar i = tokens[0].intt;\n\t\tif (min !== undefined && i < min)\n\t\t\treturn \"Directive \\\"\" + cmd + \"\\\" requires a number greater than or equal to \" + min + \" as a parameter.\";\n\t\tif (max !== undefined && i > max)\n\t\t\treturn \"Directive \\\"\" + cmd + \"\\\" requires a number less than or equal to \" + max + \" as a parameter.\";\n\t\tmultilineVars[key] = i;\n\t\treturn null;\n\t};\n\n\tvar addMultilineVarBool = function(key, cmd, tokens) {\n\t\tif (tokens.length === 1 && (tokens[0].token === 'true' || tokens[0].token === 'false')) {\n\t\t\tmultilineVars[key] = tokens[0].token === 'true';\n\t\t\treturn null;\n\t\t}\n\t\tvar str = addMultilineVar(key, cmd, tokens, 0, 1);\n\t\tif (str !== null) return str;\n\t\tmultilineVars[key] = (multilineVars[key] === 1);\n\t\treturn null;\n\t};\n\n\tvar addMultilineVarOneParamChoice = function(key, cmd, tokens, choices) {\n\t\tif (tokens.length !== 1)\n\t\t\treturn \"Directive \\\"\" + cmd + \"\\\" requires one of [ \" + choices.join(\", \") + \" ] as a parameter.\";\n\t\tvar choice = tokens[0].token;\n\t\tvar found = false;\n\t\tfor (var i = 0; !found && i < choices.length; i++) {\n\t\t\tif (choices[i] === choice)\n\t\t\t\tfound = true;\n\t\t}\n\t\tif (!found)\n\t\t\treturn \"Directive \\\"\" + cmd + \"\\\" requires one of [ \" + choices.join(\", \") + \" ] as a parameter.\";\n\t\tmultilineVars[key] = choice;\n\t\treturn null;\n\t};\n\n\tvar midiCmdParam0 = [\n\t\t\"nobarlines\",\n\t\t\"barlines\",\n\t\t\"beataccents\",\n\t\t\"nobeataccents\",\n\t\t\"droneon\",\n\t\t\"droneoff\",\n\t\t\"drumon\",\n\t\t\"drumoff\",\n\t\t\"fermatafixed\",\n\t\t\"fermataproportional\",\n\t\t\"gchordon\",\n\t\t\"gchordoff\",\n\t\t\"controlcombo\",\n\t\t\"temperamentnormal\",\n\t\t\"noportamento\"\n\t];\n\tvar midiCmdParam1String = [\n\t\t\"gchord\",\n\t\t\"ptstress\",\n\t\t\"beatstring\"\n\t];\n\tvar midiCmdParam1Integer = [\n\t\t\"bassvol\",\n\t\t\"chordvol\",\n\t\t\"c\",\n\t\t\"channel\",\n\t\t\"beatmod\",\n\t\t\"deltaloudness\",\n\t\t\"drumbars\",\n\t\t\"gracedivider\",\n\t\t\"makechordchannels\",\n\t\t\"randomchordattack\",\n\t\t\"chordattack\",\n\t\t\"stressmodel\",\n\t\t\"transpose\",\n\t\t\"rtranspose\",\n\t\t\"vol\",\n\t\t\"volinc\",\n\t\t\"gchordbars\"\t\n\t];\n\tvar midiCmdParam1Integer1OptionalInteger = [\n\t\t\"program\"\n\t];\n\tvar midiCmdParam2Integer = [\n\t\t\"ratio\",\n\t\t\"snt\",\n\t\t\"bendvelocity\",\n\t\t\"pitchbend\",\n\t\t\"control\",\n\t\t\"temperamentlinear\"\n\t];\n\tvar midiCmdParam4Integer = [\n\t\t\"beat\"\n\t];\n\tvar midiCmdParam5Integer = [\n\t\t\"drone\"\n\t];\n\tvar midiCmdParam1String1Integer = [\n\t\t\"portamento\"\n\t];\n\tvar midiCmdParamFraction = [\n\t\t\"expand\",\n\t\t\"grace\",\n\t\t\"trim\"\n\t];\n\tvar midiCmdParam1StringVariableIntegers = [\n\t\t\"drum\",\n\t\t\"chordname\"\n\t];\n \tvar midiCmdParam1Integer1OptionalString = [\n \t\t\"bassprog\", \"chordprog\"\n \t];\n\n\n\tvar parseMidiCommand = function(midi, tune, restOfString) {\n\t\tvar midi_cmd = midi.shift().token;\n\t\tvar midi_params = [];\n\t\tif (midiCmdParam0.indexOf(midi_cmd) >= 0) {\n\t\t\t// NO PARAMETERS\n\t\t\tif (midi.length !== 0)\n\t\t\t\twarn(\"Unexpected parameter in MIDI \" + midi_cmd, restOfString, 0);\n\t\t} else if (midiCmdParam1String.indexOf(midi_cmd) >= 0) {\n\t\t\t// ONE STRING PARAMETER\n\t\t\tif (midi.length !== 1)\n\t\t\t\twarn(\"Expected one parameter in MIDI \" + midi_cmd, restOfString, 0);\n\t\t\telse\n\t\t\t\tmidi_params.push(midi[0].token);\n\t\t} else if (midiCmdParam1Integer.indexOf(midi_cmd) >= 0) {\n\t\t\t// ONE INT PARAMETER\n\t\t\tif (midi.length !== 1)\n\t\t\t\twarn(\"Expected one parameter in MIDI \" + midi_cmd, restOfString, 0);\n\t\t\telse if (midi[0].type !== \"number\")\n\t\t\t\twarn(\"Expected one integer parameter in MIDI \" + midi_cmd, restOfString, 0);\n\t\t\telse\n\t\t\t\tmidi_params.push(midi[0].intt);\n\t\t} else if (midiCmdParam1Integer1OptionalInteger.indexOf(midi_cmd) >= 0) {\n\t\t\t// ONE INT PARAMETER, ONE OPTIONAL PARAMETER\n\t\t\tif (midi.length !== 1 && midi.length !== 2)\n\t\t\t\twarn(\"Expected one or two parameters in MIDI \" + midi_cmd, restOfString, 0);\n\t\t\telse if (midi[0].type !== \"number\")\n\t\t\t\twarn(\"Expected integer parameter in MIDI \" + midi_cmd, restOfString, 0);\n\t\t\telse if (midi.length === 2 && midi[1].type !== \"number\")\n\t\t\t\twarn(\"Expected integer parameter in MIDI \" + midi_cmd, restOfString, 0);\n\t\t\telse {\n\t\t\t\tmidi_params.push(midi[0].intt);\n\t\t\t\tif (midi.length === 2)\n\t\t\t\t\tmidi_params.push(midi[1].intt);\n\t\t\t}\n\t\t} else if (midiCmdParam2Integer.indexOf(midi_cmd) >= 0) {\n\t\t\t// TWO INT PARAMETERS\n\t\t\tif (midi.length !== 2)\n\t\t\t\twarn(\"Expected two parameters in MIDI \" + midi_cmd, restOfString, 0);\n\t\t\telse if (midi[0].type !== \"number\" || midi[1].type !== \"number\")\n\t\t\t\twarn(\"Expected two integer parameters in MIDI \" + midi_cmd, restOfString, 0);\n\t\t\telse {\n\t\t\t\tmidi_params.push(midi[0].intt);\n\t\t\t\tmidi_params.push(midi[1].intt);\n\t\t\t}\n\t\t} else if (midiCmdParam1String1Integer.indexOf(midi_cmd) >= 0) {\n\t\t\t// ONE STRING PARAMETER, ONE INT PARAMETER\n\t\t\tif (midi.length !== 2)\n\t\t\t\twarn(\"Expected two parameters in MIDI \" + midi_cmd, restOfString, 0);\n\t\t\telse if (midi[0].type !== \"alpha\" || midi[1].type !== \"number\")\n\t\t\t\twarn(\"Expected one string and one integer parameters in MIDI \" + midi_cmd, restOfString, 0);\n\t\t\telse {\n\t\t\t\tmidi_params.push(midi[0].token);\n\t\t\t\tmidi_params.push(midi[1].intt);\n\t\t\t}\n\t\t} else if (midi_cmd === 'drummap') {\n\t\t\t// BUILD AN OBJECT OF ABC NOTE => MIDI NOTE\n\t\t\tif (midi.length === 2 && midi[0].type === 'alpha' && midi[1].type === 'number') {\n\t\t\t\tif (!tune.formatting) tune.formatting = {};\n\t\t\t\tif (!tune.formatting.midi) tune.formatting.midi = {};\n\t\t\t\tif (!tune.formatting.midi.drummap) tune.formatting.midi.drummap = {};\n\t\t\t\ttune.formatting.midi.drummap[midi[0].token] = midi[1].intt;\n\t\t\t\tmidi_params = tune.formatting.midi.drummap;\n\t\t\t} else if (midi.length === 3 && midi[0].type === 'punct' && midi[1].type === 'alpha' && midi[2].type === 'number') {\n\t\t\t\tif (!tune.formatting) tune.formatting = {};\n\t\t\t\tif (!tune.formatting.midi) tune.formatting.midi = {};\n\t\t\t\tif (!tune.formatting.midi.drummap) tune.formatting.midi.drummap = {};\n\t\t\t\ttune.formatting.midi.drummap[midi[0].token+midi[1].token] = midi[2].intt;\n\t\t\t\tmidi_params = tune.formatting.midi.drummap;\n\t\t\t} else {\n\t\t\t\twarn(\"Expected one note name and one integer parameter in MIDI \" + midi_cmd, restOfString, 0);\n\t\t\t}\n\t\t} else if (midiCmdParamFraction.indexOf(midi_cmd) >= 0) {\n\t\t\t// ONE FRACTION PARAMETER\n\t\t\tif (midi.length !== 3)\n\t\t\t\twarn(\"Expected fraction parameter in MIDI \" + midi_cmd, restOfString, 0);\n\t\t\telse if (midi[0].type !== \"number\" || midi[1].token !== \"/\" || midi[2].type !== \"number\")\n\t\t\t\twarn(\"Expected fraction parameter in MIDI \" + midi_cmd, restOfString, 0);\n\t\t\telse {\n\t\t\t\tmidi_params.push(midi[0].intt);\n\t\t\t\tmidi_params.push(midi[2].intt);\n\t\t\t}\n\t\t} else if (midiCmdParam4Integer.indexOf(midi_cmd) >= 0) {\n\t\t\t// FOUR INT PARAMETERS\n\t\t\tif (midi.length !== 4)\n\t\t\t\twarn(\"Expected four parameters in MIDI \" + midi_cmd, restOfString, 0);\n\t\t\telse if (midi[0].type !== \"number\" || midi[1].type !== \"number\" || midi[2].type !== \"number\" || midi[3].type !== \"number\")\n\t\t\t\twarn(\"Expected four integer parameters in MIDI \" + midi_cmd, restOfString, 0);\n\t\t\telse {\n\t\t\t\tmidi_params.push(midi[0].intt);\n\t\t\t\tmidi_params.push(midi[1].intt);\n\t\t\t\tmidi_params.push(midi[2].intt);\n\t\t\t\tmidi_params.push(midi[3].intt);\n\t\t\t}\n\t\t} else if (midiCmdParam5Integer.indexOf(midi_cmd) >= 0) {\n\t\t\t// FIVE INT PARAMETERS\n\t\t\tif (midi.length !== 5)\n\t\t\t\twarn(\"Expected five parameters in MIDI \" + midi_cmd, restOfString, 0);\n\t\t\telse if (midi[0].type !== \"number\" || midi[1].type !== \"number\" || midi[2].type !== \"number\" || midi[3].type !== \"number\" || midi[4].type !== \"number\")\n\t\t\t\twarn(\"Expected five integer parameters in MIDI \" + midi_cmd, restOfString, 0);\n\t\t\telse {\n\t\t\t\tmidi_params.push(midi[0].intt);\n\t\t\t\tmidi_params.push(midi[1].intt);\n\t\t\t\tmidi_params.push(midi[2].intt);\n\t\t\t\tmidi_params.push(midi[3].intt);\n\t\t\t\tmidi_params.push(midi[4].intt);\n\t\t\t}\n\t\t} else if (midiCmdParam1Integer1OptionalInteger.indexOf(midi_cmd) >= 0) {\n\t\t\t// ONE INT PARAMETER, ONE OPTIONAL OCTAVE PARAMETER\n\t\t\tif (midi.length !== 1 || midi.length !== 4)\n\t\t\t\twarn(\"Expected one or two parameters in MIDI \" + midi_cmd, restOfString, 0);\n\t\t\telse if (midi[0].type !== \"number\")\n\t\t\t\twarn(\"Expected integer parameter in MIDI \" + midi_cmd, restOfString, 0);\n\t\t\telse if (midi.length === 4) {\n\t\t\t\tif (midi[1].token !== \"octave\")\n\t\t\t\t\twarn(\"Expected octave parameter in MIDI \" + midi_cmd, restOfString, 0);\n\t\t\t\tif (midi[2].token !== \"=\")\n\t\t\t\t\twarn(\"Expected octave parameter in MIDI \" + midi_cmd, restOfString, 0);\n\t\t\t\tif (midi[3].type !== \"number\")\n\t\t\t\t\twarn(\"Expected integer parameter for octave in MIDI \" + midi_cmd, restOfString, 0);\n\t\t\t} else {\n\t\t\t\tmidi_params.push(midi[0].intt);\n\t\t\t\tif (midi.length === 4)\n\t\t\t\t\tmidi_params.push(midi[3].intt);\n\t\t\t}\n\t\t} else if (midiCmdParam1StringVariableIntegers.indexOf(midi_cmd) >= 0) {\n\t\t\t// ONE STRING, VARIABLE INT PARAMETERS\n\t\t\tif (midi.length < 2)\n\t\t\t\twarn(\"Expected string parameter and at least one integer parameter in MIDI \" + midi_cmd, restOfString, 0);\n\t\t\telse if (midi[0].type !== \"alpha\")\n\t\t\t\twarn(\"Expected string parameter and at least one integer parameter in MIDI \" + midi_cmd, restOfString, 0);\n\t\t\telse {\n\t\t\t\tvar p = midi.shift();\n\t\t\t\tmidi_params.push(p.token);\n\t\t\t\twhile (midi.length > 0) {\n\t\t\t\t\tp = midi.shift();\n\t\t\t\t\tif (p.type !== \"number\")\n\t\t\t\t\t\twarn(\"Expected integer parameter in MIDI \" + midi_cmd, restOfString, 0);\n\t\t\t\t\tmidi_params.push(p.intt);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t else if (midiCmdParam1Integer1OptionalString.indexOf(midi_cmd) >= 0){\n\n\t // ONE INT PARAMETER, ONE OPTIONAL string\n\t \tif (midi.length !== 1 && midi.length !== 2) \n\t\t\t\twarn(\"Expected one or two parameters in MIDI \" + midi_cmd, restOfString, 0);\n\t\t\telse if (midi[0].type !== \"number\") \n\t\t\t\twarn(\"Expected integer parameter in MIDI \" + midi_cmd, restOfString, 0);\n\t\t\telse if (midi.length === 2 && midi[1].type !== \"alpha\") \n\t\t\t\twarn(\"Expected alpha parameter in MIDI \" + midi_cmd, restOfString, 0);\n\t\t\telse {\n\t \tmidi_params.push(midi[0].intt);\n\n\t // Currently only bassprog and chordprog with optional octave shifts use this path\n\t if (midi.length === 2){\n\t var cmd = midi[1].token;\n\t if (cmd.indexOf(\"octave=\") != -1){\n\t cmd = cmd.replace(\"octave=\",\"\");\n\t cmd = parseInt(cmd);\n\t if (!isNaN(cmd)){\n\t // Limit range from -1 to 3 octaves\n\t if (cmd < -1){\n\t\t\t\t\twarn(\"Expected octave= in MIDI \" + midi_cmd + ' to be >= -1 (recv:'+cmd+')');\n\t cmd = -1;\n\t }\n\t if (cmd > 3){\n\t\t\t\t\twarn(\"Expected octave= in MIDI \" + midi_cmd + ' to be <= 3 (recv:'+cmd+')');\n\t cmd = 3;\n\t }\n\t midi_params.push(cmd);\n\t } else\n\t warn(\"Expected octave value in MIDI\" + midi_cmd);\n\t }\n\t else{\n\t warn(\"Expected octave= in MIDI\" + midi_cmd);\n\t }\n\t }\n\t }\n\t }\n\n\t\tif (tuneBuilder.hasBeginMusic())\n\t\t\ttuneBuilder.appendElement('midi', -1, -1, { cmd: midi_cmd, params: midi_params });\n\t\telse {\n\t\t\tif (tune.formatting['midi'] === undefined)\n\t\t\t\ttune.formatting['midi'] = {};\n\t\t\ttune.formatting['midi'][midi_cmd] = midi_params;\n\t\t}\n\t};\n\n\tparseDirective.parseFontChangeLine = function(textstr) {\n\t\t// We don't want to match two dollar signs, so change those temporarily\n\t\ttextstr = textstr.replace(/\\$\\$/g,\"\\x03\")\n\t\tvar textParts = textstr.split('$');\n\t\tif (textParts.length > 1 && multilineVars.setfont) {\n\t\t\tvar textarr = [ ];\n\t\t\tif (textParts[0] !== '') // did the original string start with `$`?\n\t\t\t\ttextarr.push({ text: textParts[0] })\n\t\t\tfor (var i = 1; i < textParts.length; i++) {\n\t\t\t\tif (textParts[i][0] === '0')\n\t\t\t\t\ttextarr.push({ text: textParts[i].substring(1).replace(/\\x03/g,\"$$\") });\n\t\t\t\telse {\n\t\t\t\t\tvar whichFont = parseInt(textParts[i][0],10)\n\t\t\t\t\tif (multilineVars.setfont[whichFont])\n\t\t\t\t\t\ttextarr.push({font: multilineVars.setfont[whichFont], text: textParts[i].substring(1).replace(/\\x03/g,\"$$\") });\n\t\t\t\t\telse\n\t\t\t\t\t\ttextarr[textarr.length-1].text += '$' + textParts[i].replace(/\\x03/g,\"$$\");\n\t\t\t\t}\t\t\t\t\n\t\t\t}\n\t\t\treturn textarr;\n\t\t}\n\t\treturn textstr.replace(/\\x03/g,\"$$\");\n\t};\n\n\tvar positionChoices = [ 'auto', 'above', 'below', 'hidden' ];\n\tparseDirective.addDirective = function(str) {\n\t\tvar tokens = tokenizer.tokenize(str, 0, str.length);\t// 3 or more % in a row, or just spaces after %% is just a comment\n\t\tif (tokens.length === 0 || tokens[0].type !== 'alpha') return null;\n\t\tvar restOfString = str.substring(str.indexOf(tokens[0].token)+tokens[0].token.length);\n\t\trestOfString = tokenizer.stripComment(restOfString);\n\t\tvar cmd = tokens.shift().token.toLowerCase();\n\t\tvar scratch = \"\";\n\t\tvar line;\n\t\tswitch (cmd)\n\t\t{\n\t\t\t// The following directives were added to abc_parser_lint, but haven't been implemented here.\n\t\t\t// Most of them are direct translations from the directives that will be parsed in. See abcm2ps's format.txt for info on each of these.\n\t\t\t//\t\t\t\t\talignbars: { type: \"number\", optional: true },\n\t\t\t//\t\t\t\t\taligncomposer: { type: \"string\", Enum: [ 'left', 'center','right' ], optional: true },\n\t\t\t//\t\t\t\t\tbstemdown: { type: \"boolean\", optional: true },\n\t\t\t//\t\t\t\t\tcontinueall: { type: \"boolean\", optional: true },\n\t\t\t//\t\t\t\t\tdynalign: { type: \"boolean\", optional: true },\n\t\t\t//\t\t\t\t\texprabove: { type: \"boolean\", optional: true },\n\t\t\t//\t\t\t\t\texprbelow: { type: \"boolean\", optional: true },\n\t\t\t//\t\t\t\t\tgchordbox: { type: \"boolean\", optional: true },\n\t\t\t//\t\t\t\t\tgracespacebefore: { type: \"number\", optional: true },\n\t\t\t//\t\t\t\t\tgracespaceinside: { type: \"number\", optional: true },\n\t\t\t//\t\t\t\t\tgracespaceafter: { type: \"number\", optional: true },\n\t\t\t//\t\t\t\t\tinfospace: { type: \"number\", optional: true },\n\t\t\t//\t\t\t\t\tlineskipfac: { type: \"number\", optional: true },\n\t\t\t//\t\t\t\t\tmaxshrink: { type: \"number\", optional: true },\n\t\t\t//\t\t\t\t\tmaxstaffsep: { type: \"number\", optional: true },\n\t\t\t//\t\t\t\t\tmaxsysstaffsep: { type: \"number\", optional: true },\n\t\t\t//\t\t\t\t\tnotespacingfactor: { type: \"number\", optional: true },\n\t\t\t//\t\t\t\t\tparskipfac: { type: \"number\", optional: true },\n\t\t\t//\t\t\t\t\tslurheight: { type: \"number\", optional: true },\n\t\t\t//\t\t\t\t\tsplittune: { type: \"boolean\", optional: true },\n\t\t\t//\t\t\t\t\tsquarebreve: { type: \"boolean\", optional: true },\n\t\t\t//\t\t\t\t\tstemheight: { type: \"number\", optional: true },\n\t\t\t//\t\t\t\t\tstraightflags: { type: \"boolean\", optional: true },\n\t\t\t//\t\t\t\t\tstretchstaff: { type: \"boolean\", optional: true },\n\t\t\t//\t\t\t\t\ttitleformat: { type: \"string\", optional: true },\n\t\t\tcase \"bagpipes\":tune.formatting.bagpipes = true;break;\n\t\t\tcase \"flatbeams\":tune.formatting.flatbeams = true;break;\n\t\t\tcase \"jazzchords\":tune.formatting.jazzchords = true;break;\n\t\t\tcase \"accentAbove\":tune.formatting.accentAbove = true;break;\n\t\t\tcase \"germanAlphabet\":tune.formatting.germanAlphabet = true;break;\n\t\t\tcase \"landscape\":multilineVars.landscape = true;break;\n\t\t\tcase \"papersize\":multilineVars.papersize = restOfString;break;\n\t\t\tcase \"graceslurs\":\n\t\t\t\tif (tokens.length !== 1)\n\t\t\t\t\treturn \"Directive graceslurs requires one parameter: 0 or 1\";\n\t\t\t\tif (tokens[0].token === '0' || tokens[0].token === 'false')\n\t\t\t\t\ttune.formatting.graceSlurs = false;\n\t\t\t\telse if (tokens[0].token === '1' || tokens[0].token === 'true')\n\t\t\t\t\ttune.formatting.graceSlurs = true;\n\t\t\t\telse\n\t\t\t\t\treturn \"Directive graceslurs requires one parameter: 0 or 1 (received \" + tokens[0].token + ')';\n\t\t\t\tbreak;\n\t\t\tcase \"lineThickness\":\n\t\t\t\tvar lt = parseStretchLast(tokens);\n\t\t\t\tif (lt.value !== undefined)\n\t\t\t\t\ttune.formatting.lineThickness = lt.value;\n\t\t\t\tif (lt.error)\n\t\t\t\t\treturn lt.error;\n\t\t\t\tbreak;\n\t\t\tcase \"stretchlast\":\n\t\t\t\tvar sl = parseStretchLast(tokens);\n\t\t\t\tif (sl.value !== undefined)\n\t\t\t\t\ttune.formatting.stretchlast = sl.value;\n\t\t\t\tif (sl.error)\n\t\t\t\t\treturn sl.error;\n\t\t\t\tbreak;\n\t\t\tcase \"titlecaps\":multilineVars.titlecaps = true;break;\n\t\t\tcase \"titleleft\":tune.formatting.titleleft = true;break;\n\t\t\tcase \"measurebox\":tune.formatting.measurebox = true;break;\n\n\t\t\tcase \"vocal\": return addMultilineVarOneParamChoice(\"vocalPosition\", cmd, tokens, positionChoices);\n\t\t\tcase \"dynamic\": return addMultilineVarOneParamChoice(\"dynamicPosition\", cmd, tokens, positionChoices);\n\t\t\tcase \"gchord\": return addMultilineVarOneParamChoice(\"chordPosition\", cmd, tokens, positionChoices);\n\t\t\tcase \"ornament\": return addMultilineVarOneParamChoice(\"ornamentPosition\", cmd, tokens, positionChoices);\n\t\t\tcase \"volume\": return addMultilineVarOneParamChoice(\"volumePosition\", cmd, tokens, positionChoices);\n\n\t\t\tcase \"botmargin\":\n\t\t\tcase \"botspace\":\n\t\t\tcase \"composerspace\":\n\t\t\tcase \"indent\":\n\t\t\tcase \"leftmargin\":\n\t\t\tcase \"linesep\":\n\t\t\tcase \"musicspace\":\n\t\t\tcase \"partsspace\":\n\t\t\tcase \"pageheight\":\n\t\t\tcase \"pagewidth\":\n\t\t\tcase \"rightmargin\":\n\t\t\tcase \"stafftopmargin\":\n\t\t\tcase \"staffsep\":\n\t\t\tcase \"staffwidth\":\n\t\t\tcase \"subtitlespace\":\n\t\t\tcase \"sysstaffsep\":\n\t\t\tcase \"systemsep\":\n\t\t\tcase \"textspace\":\n\t\t\tcase \"titlespace\":\n\t\t\tcase \"topmargin\":\n\t\t\tcase \"topspace\":\n\t\t\tcase \"vocalspace\":\n\t\t\tcase \"wordsspace\":\n\t\t\t\treturn oneParameterMeasurement(cmd, tokens);\n\t\t\tcase \"voicescale\":\n\t\t\t\tif (tokens.length !== 1 || tokens[0].type !== 'number')\n\t\t\t\t\treturn \"voicescale requires one float as a parameter\";\n\t\t\t\tvar voiceScale = tokens.shift();\n\t\t\t\tif (multilineVars.currentVoice) {\n\t\t\t\t\tmultilineVars.currentVoice.scale = voiceScale.floatt;\n\t\t\t\t\ttuneBuilder.changeVoiceScale(multilineVars.currentVoice.scale);\n\t\t\t\t}\n\t\t\t\treturn null;\n\t\t\tcase \"voicecolor\":\n\t\t\t\tif (tokens.length !== 1) // this could either be of type alpha or quote, but it's ok if it is a number\n\t\t\t\t\treturn \"voicecolor requires one string as a parameter\";\n\t\t\t\tvar voiceColor = tokens.shift();\n\t\t\t\tif (multilineVars.currentVoice) {\n\t\t\t\t\tmultilineVars.currentVoice.color = voiceColor.token;\n\t\t\t\t\ttuneBuilder.changeVoiceColor(multilineVars.currentVoice.color);\n\t\t\t\t}\n\t\t\t\treturn null;\n\t\t\tcase \"vskip\":\n\t\t\t\tvar vskip = Math.round(getRequiredMeasurement(cmd, tokens));\n\t\t\t\tif (vskip.error)\n\t\t\t\t\treturn vskip.error;\n\t\t\t\ttuneBuilder.addSpacing(vskip);\n\t\t\t\treturn null;\n\t\t\tcase \"scale\":\n\t\t\t\tsetScale(cmd, tokens);\n\t\t\t\tbreak;\n\t\t\tcase \"sep\":\n\t\t\t\tif (tokens.length === 0)\n\t\t\t\t\ttuneBuilder.addSeparator(14,14,85, { startChar: multilineVars.iChar, endChar: multilineVars.iChar+5}); // If no parameters are given, then there is a default size.\n\t\t\t\telse {\n\t\t\t\t\tvar points = tokenizer.getMeasurement(tokens);\n\t\t\t\t\tif (points.used === 0)\n\t\t\t\t\t\treturn \"Directive \\\"\" + cmd + \"\\\" requires 3 numbers: space above, space below, length of line\";\n\t\t\t\t\tvar spaceAbove = points.value;\n\n\t\t\t\t\tpoints = tokenizer.getMeasurement(tokens);\n\t\t\t\t\tif (points.used === 0)\n\t\t\t\t\t\treturn \"Directive \\\"\" + cmd + \"\\\" requires 3 numbers: space above, space below, length of line\";\n\t\t\t\t\tvar spaceBelow = points.value;\n\n\t\t\t\t\tpoints = tokenizer.getMeasurement(tokens);\n\t\t\t\t\tif (points.used === 0 || tokens.length !== 0)\n\t\t\t\t\t\treturn \"Directive \\\"\" + cmd + \"\\\" requires 3 numbers: space above, space below, length of line\";\n\t\t\t\t\tvar lenLine = points.value;\n\t\t\t\t\ttuneBuilder.addSeparator(spaceAbove, spaceBelow, lenLine, { startChar: multilineVars.iChar, endChar: multilineVars.iChar+restOfString.length});\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"barsperstaff\":\n\t\t\t\tscratch = addMultilineVar('barsperstaff', cmd, tokens);\n\t\t\t\tif (scratch !== null) return scratch;\n\t\t\t\tbreak;\n\t\t\tcase \"staffnonote\":\n\t\t\t\t// The sense of the boolean is opposite here. \"0\" means true.\n\t\t\t\tif (tokens.length !== 1)\n\t\t\t\t\treturn \"Directive staffnonote requires one parameter: 0 or 1\";\n\t\t\t\tif (tokens[0].token === '0')\n\t\t\t\t\tmultilineVars.staffnonote = true;\n\t\t\t\telse if (tokens[0].token === '1')\n\t\t\t\t\tmultilineVars.staffnonote = false;\n\t\t\t\telse\n\t\t\t\t\treturn \"Directive staffnonote requires one parameter: 0 or 1 (received \" + tokens[0].token + ')';\n\t\t\t\tbreak;\n\t\t\tcase \"printtempo\":\n\t\t\t\tscratch = addMultilineVarBool('printTempo', cmd, tokens);\n\t\t\t\tif (scratch !== null) return scratch;\n\t\t\t\tbreak;\n\t\t\tcase \"partsbox\":\n\t\t\t\tscratch = addMultilineVarBool('partsBox', cmd, tokens);\n\t\t\t\tif (scratch !== null) return scratch;\n\t\t\t\tmultilineVars.partsfont.box = multilineVars.partsBox;\n\t\t\t\tbreak;\n\t\t\tcase \"freegchord\":\n\t\t\t\tscratch = addMultilineVarBool('freegchord', cmd, tokens);\n\t\t\t\tif (scratch !== null) return scratch;\n\t\t\t\tbreak;\n\t\t\tcase \"measurenb\":\n\t\t\tcase \"barnumbers\":\n\t\t\t\tscratch = addMultilineVar('barNumbers', cmd, tokens);\n\t\t\t\tif (scratch !== null) return scratch;\n\t\t\t\tbreak;\n\t\t\tcase \"setbarnb\":\n\t\t\t\tif (tokens.length !== 1 || tokens[0].type !== 'number') {\n\t\t\t\t\treturn 'Directive setbarnb requires a number as a parameter.';\n\t\t\t\t}\n\t\t\t\tmultilineVars.currBarNumber = tuneBuilder.setBarNumberImmediate(tokens[0].intt);\n\t\t\t\tbreak;\n\t\t\tcase \"begintext\":\n\t\t\t\tvar textBlock = '';\n\t\t\t\tline = tokenizer.nextLine();\n\t\t\t\twhile(line && line.indexOf('%%endtext') !== 0) {\n\t\t\t\t\tif (parseCommon.startsWith(line, \"%%\"))\n\t\t\t\t\t\ttextBlock += line.substring(2) + \"\\n\";\n\t\t\t\t\telse\n\t\t\t\t\t\ttextBlock += line + \"\\n\";\n\t\t\t\t\tline = tokenizer.nextLine();\n\t\t\t\t}\n\t\t\t\ttuneBuilder.addText(textBlock, { startChar: multilineVars.iChar, endChar: multilineVars.iChar+textBlock.length+7});\n\t\t\t\tbreak;\n\t\t\tcase \"continueall\":\n\t\t\t\tmultilineVars.continueall = true;\n\t\t\t\tbreak;\n\t\t\tcase \"beginps\":\n\t\t\t\tline = tokenizer.nextLine();\n\t\t\t\twhile(line && line.indexOf('%%endps') !== 0) {\n\t\t\t\t\ttokenizer.nextLine();\n\t\t\t\t}\n\t\t\t\twarn(\"Postscript ignored\", str, 0);\n\t\t\t\tbreak;\n\t\t\tcase \"deco\":\n\t\t\t\tif (restOfString.length > 0)\n\t\t\t\t\tmultilineVars.ignoredDecorations.push(restOfString.substring(0, restOfString.indexOf(' ')));\n\t\t\t\twarn(\"Decoration redefinition ignored\", str, 0);\n\t\t\t\tbreak;\n\t\t\tcase \"text\":\n\t\t\t\tvar textstr = tokenizer.translateString(restOfString);\n\t\t\t\ttuneBuilder.addText(parseDirective.parseFontChangeLine(textstr), { startChar: multilineVars.iChar, endChar: multilineVars.iChar+restOfString.length+7});\n\t\t\t\tbreak;\n\t\t\tcase \"center\":\n\t\t\t\tvar centerstr = tokenizer.translateString(restOfString);\n\t\t\t\ttuneBuilder.addCentered(parseDirective.parseFontChangeLine(centerstr));\n\t\t\t\tbreak;\n\t\t\tcase \"font\":\n\t\t\t\t// don't need to do anything for this; it is a useless directive\n\t\t\t\tbreak;\n\t\t\tcase \"setfont\":\n\t\t\t\tvar sfTokens = tokenizer.tokenize(restOfString, 0, restOfString.length);\n//\t\t\t\tvar sfDone = false;\n\t\t\t\tif (sfTokens.length >= 4) {\n\t\t\t\t\tif (sfTokens[0].token === '-' && sfTokens[1].type === 'number') {\n\t\t\t\t\t\tvar sfNum = parseInt(sfTokens[1].token);\n\t\t\t\t\t\tif (sfNum >= 1 && sfNum <= 9) {\n\t\t\t\t\t\t\tif (!multilineVars.setfont)\n\t\t\t\t\t\t\t\tmultilineVars.setfont = [];\n\t\t\t\t\t\t\tsfTokens.shift();\n\t\t\t\t\t\t\tsfTokens.shift();\n\t\t\t\t\t\t\tmultilineVars.setfont[sfNum] = getFontParameter(sfTokens, multilineVars.setfont[sfNum], str, 0, 'setfont');\n//\t\t\t\t\t\t\tvar sfSize = sfTokens.pop();\n//\t\t\t\t\t\t\tif (sfSize.type === 'number') {\n//\t\t\t\t\t\t\t\tsfSize = parseInt(sfSize.token);\n//\t\t\t\t\t\t\t\tvar sfFontName = '';\n//\t\t\t\t\t\t\t\tfor (var sfi = 2; sfi < sfTokens.length; sfi++)\n//\t\t\t\t\t\t\t\t\tsfFontName += sfTokens[sfi].token;\n//\t\t\t\t\t\t\t\tmultilineVars.setfont[sfNum] = { face: sfFontName, size: sfSize };\n//\t\t\t\t\t\t\t\tsfDone = true;\n//\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n//\t\t\t\tif (!sfDone)\n//\t\t\t\t\treturn \"Bad parameters: \" + cmd;\n\t\t\t\tbreak;\n\t\t\tcase \"gchordfont\":\n\t\t\tcase \"partsfont\":\n\t\t\tcase \"tripletfont\":\n\t\t\tcase \"vocalfont\":\n\t\t\tcase \"textfont\":\n\t\t\tcase \"annotationfont\":\n\t\t\tcase \"historyfont\":\n\t\t\tcase \"infofont\":\n\t\t\tcase \"measurefont\":\n\t\t\tcase \"repeatfont\":\n\t\t\tcase \"wordsfont\":\n\t\t\t\treturn getChangingFont(cmd, tokens, str);\n\t\t\tcase \"composerfont\":\n\t\t\tcase \"subtitlefont\":\n\t\t\tcase \"tempofont\":\n\t\t\tcase \"titlefont\":\n\t\t\tcase \"voicefont\":\n\t\t\tcase \"footerfont\":\n\t\t\tcase \"headerfont\":\n\t\t\t\treturn getGlobalFont(cmd, tokens, str);\n\t\t\tcase \"barlabelfont\":\n\t\t\tcase \"barnumberfont\":\n\t\t\tcase \"barnumfont\":\n\t\t\t\treturn getChangingFont(\"measurefont\", tokens, str);\n\t\t\tcase \"staves\":\n\t\t\tcase \"score\":\n\t\t\t\tmultilineVars.score_is_present = true;\n\t\t\t\tvar addVoice = function(id, newStaff, bracket, brace, continueBar) {\n\t\t\t\t\tif (newStaff || multilineVars.staves.length === 0) {\n\t\t\t\t\t\tmultilineVars.staves.push({index: multilineVars.staves.length, numVoices: 0});\n\t\t\t\t\t}\n\t\t\t\t\tvar staff = parseCommon.last(multilineVars.staves);\n\t\t\t\t\tif (bracket !== undefined && staff.bracket === undefined) staff.bracket = bracket;\n\t\t\t\t\tif (brace !== undefined && staff.brace === undefined) staff.brace = brace;\n\t\t\t\t\tif (continueBar) staff.connectBarLines = 'end';\n\t\t\t\t\tif (multilineVars.voices[id] === undefined) {\n\t\t\t\t\t\tmultilineVars.voices[id] = {staffNum: staff.index, index: staff.numVoices};\n\t\t\t\t\t\tstaff.numVoices++;\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tvar openParen = false;\n\t\t\t\tvar openBracket = false;\n\t\t\t\tvar openBrace = false;\n\t\t\t\tvar justOpenParen = false;\n\t\t\t\tvar justOpenBracket = false;\n\t\t\t\tvar justOpenBrace = false;\n\t\t\t\tvar continueBar = false;\n\t\t\t\tvar lastVoice;\n\t\t\t\tvar addContinueBar = function() {\n\t\t\t\t\tcontinueBar = true;\n\t\t\t\t\tif (lastVoice) {\n\t\t\t\t\t\tvar ty = 'start';\n\t\t\t\t\t\tif (lastVoice.staffNum > 0) {\n\t\t\t\t\t\t\tif (multilineVars.staves[lastVoice.staffNum-1].connectBarLines === 'start' ||\n\t\t\t\t\t\t\t\tmultilineVars.staves[lastVoice.staffNum-1].connectBarLines === 'continue')\n\t\t\t\t\t\t\t\tty = 'continue';\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmultilineVars.staves[lastVoice.staffNum].connectBarLines = ty;\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\twhile (tokens.length) {\n\t\t\t\t\tvar t = tokens.shift();\n\t\t\t\t\tswitch (t.token) {\n\t\t\t\t\t\tcase '(':\n\t\t\t\t\t\t\tif (openParen) warn(\"Can't nest parenthesis in %%score\", str, t.start);\n\t\t\t\t\t\t\telse {openParen = true;justOpenParen = true;}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase ')':\n\t\t\t\t\t\t\tif (!openParen || justOpenParen) warn(\"Unexpected close parenthesis in %%score\", str, t.start);\n\t\t\t\t\t\t\telse openParen = false;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase '[':\n\t\t\t\t\t\t\tif (openBracket) warn(\"Can't nest brackets in %%score\", str, t.start);\n\t\t\t\t\t\t\telse {openBracket = true;justOpenBracket = true;}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase ']':\n\t\t\t\t\t\t\tif (!openBracket || justOpenBracket) warn(\"Unexpected close bracket in %%score\", str, t.start);\n\t\t\t\t\t\t\telse {openBracket = false;multilineVars.staves[lastVoice.staffNum].bracket = 'end';}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase '{':\n\t\t\t\t\t\t\tif (openBrace ) warn(\"Can't nest braces in %%score\", str, t.start);\n\t\t\t\t\t\t\telse {openBrace = true;justOpenBrace = true;}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase '}':\n\t\t\t\t\t\t\tif (!openBrace || justOpenBrace) warn(\"Unexpected close brace in %%score\", str, t.start);\n\t\t\t\t\t\t\telse {openBrace = false;multilineVars.staves[lastVoice.staffNum].brace = 'end';}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase '|':\n\t\t\t\t\t\t\taddContinueBar();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tvar vc = \"\";\n\t\t\t\t\t\t\twhile (t.type === 'alpha' || t.type === 'number') {\n\t\t\t\t\t\t\t\tvc += t.token;\n\t\t\t\t\t\t\t\tif (t.continueId)\n\t\t\t\t\t\t\t\t\tt = tokens.shift();\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tvar newStaff = !openParen || justOpenParen;\n\t\t\t\t\t\t\tvar bracket = justOpenBracket ? 'start' : openBracket ? 'continue' : undefined;\n\t\t\t\t\t\t\tvar brace = justOpenBrace ? 'start' : openBrace ? 'continue' : undefined;\n\t\t\t\t\t\t\taddVoice(vc, newStaff, bracket, brace, continueBar);\n\t\t\t\t\t\t\tjustOpenParen = false;\n\t\t\t\t\t\t\tjustOpenBracket = false;\n\t\t\t\t\t\t\tjustOpenBrace = false;\n\t\t\t\t\t\t\tcontinueBar = false;\n\t\t\t\t\t\t\tlastVoice = multilineVars.voices[vc];\n\t\t\t\t\t\t\tif (cmd === 'staves')\n\t\t\t\t\t\t\t\taddContinueBar();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase \"newpage\":\n\t\t\t\tvar pgNum = tokenizer.getInt(restOfString);\n\t\t\t\ttuneBuilder.addNewPage(pgNum.digits === 0 ? -1 : pgNum.value);\n\t\t\t\tbreak;\n\n\t\t\tcase \"abc\":\n\t\t\t\tvar arr = restOfString.split(' ');\n\t\t\t\tswitch (arr[0]) {\n\t\t\t\t\tcase \"-copyright\":\n\t\t\t\t\tcase \"-creator\":\n\t\t\t\t\tcase \"-edited-by\":\n\t\t\t\t\tcase \"-version\":\n\t\t\t\t\tcase \"-charset\":\n\t\t\t\t\t\tvar subCmd = arr.shift();\n\t\t\t\t\t\ttuneBuilder.addMetaText(cmd+subCmd, arr.join(' '), { startChar: multilineVars.iChar, endChar: multilineVars.iChar+restOfString.length+5});\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn \"Unknown directive: \" + cmd+arr[0];\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"header\":\n\t\t\tcase \"footer\":\n\t\t\t\tvar footerStr = tokenizer.getMeat(restOfString, 0, restOfString.length);\n\t\t\t\tfooterStr = restOfString.substring(footerStr.start, footerStr.end);\n\t\t\t\tif (footerStr[0] === '\"' && footerStr[footerStr.length-1] === '\"' )\n\t\t\t\t\tfooterStr = footerStr.substring(1, footerStr.length-1);\n\t\t\t\tvar footerArr = footerStr.split('\\t');\n\t\t\t\tvar footer = {};\n\t\t\t\tif (footerArr.length === 1)\n\t\t\t\t\tfooter = { left: \"\", center: footerArr[0], right: \"\" };\n\t\t\t\telse if (footerArr.length === 2)\n\t\t\t\t\tfooter = { left: footerArr[0], center: footerArr[1], right: \"\" };\n\t\t\t\telse\n\t\t\t\t\tfooter = { left: footerArr[0], center: footerArr[1], right: footerArr[2] };\n\t\t\t\tif (footerArr.length > 3)\n\t\t\t\t\twarn(\"Too many tabs in \" + cmd + \": \" + footerArr.length + \" found.\", restOfString, 0);\n\n\t\t\t\ttuneBuilder.addMetaTextObj(cmd, footer, { startChar: multilineVars.iChar, endChar: multilineVars.iChar+str.length});\n\t\t\t\tbreak;\n\n\t\t\tcase \"midi\":\n\t\t\t\tvar midi = tokenizer.tokenize(restOfString, 0, restOfString.length, true);\n\t\t\t\tif (midi.length > 0 && midi[0].token === '=')\n\t\t\t\t\tmidi.shift();\n\t\t\t\tif (midi.length === 0)\n\t\t\t\t\twarn(\"Expected midi command\", restOfString, 0);\n\t\t\t\telse\n\t\t\t\t\tparseMidiCommand(midi, tune, restOfString);\n\t\t\t\tbreak;\n\t\t\tcase \"percmap\":\n\t\t\t\tvar percmap = interpretPercMap(restOfString);\n\t\t\t\tif (percmap.error)\n\t\t\t\t\twarn(percmap.error, str, 8);\n\t\t\t\telse {\n\t\t\t\t\tif (!tune.formatting.percmap)\n\t\t\t\t\t\ttune.formatting.percmap = {};\n\t\t\t\t\ttune.formatting.percmap[percmap.key] = percmap.value;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase \"map\":\n\t\t\tcase \"playtempo\":\n\t\t\tcase \"auquality\":\n\t\t\tcase \"continuous\":\n\t\t\tcase \"nobarcheck\":\n\t\t\t\t// TODO-PER: Actually handle the parameters of these\n\t\t\t\ttune.formatting[cmd] = restOfString;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\treturn \"Unknown directive: \" + cmd;\n\t\t}\n\t\treturn null;\n\t};\n\tparseDirective.globalFormatting = function(formatHash) {\n\t\tfor (var cmd in formatHash) {\n\t\t\tif (formatHash.hasOwnProperty(cmd)) {\n\t\t\t\tvar value = ''+formatHash[cmd];\n\t\t\t\tvar tokens = tokenizer.tokenize(value, 0, value.length);\n\t\t\t\tvar scratch;\n\t\t\t\tswitch (cmd) {\n\t\t\t\t\tcase \"titlefont\":\n\t\t\t\t\tcase \"gchordfont\":\n\t\t\t\t\tcase \"composerfont\":\n\t\t\t\t\tcase \"footerfont\":\n\t\t\t\t\tcase \"headerfont\":\n\t\t\t\t\tcase \"historyfont\":\n\t\t\t\t\tcase \"infofont\":\n\t\t\t\t\tcase \"measurefont\":\n\t\t\t\t\tcase \"partsfont\":\n\t\t\t\t\tcase \"repeatfont\":\n\t\t\t\t\tcase \"subtitlefont\":\n\t\t\t\t\tcase \"tempofont\":\n\t\t\t\t\tcase \"textfont\":\n\t\t\t\t\tcase \"voicefont\":\n\t\t\t\t\tcase \"tripletfont\":\n\t\t\t\t\tcase \"vocalfont\":\n\t\t\t\t\tcase \"wordsfont\":\n\t\t\t\t\tcase \"annotationfont\":\n\t\t\t\t\tcase \"tablabelfont\":\n\t\t\t\t\tcase \"tabnumberfont\":\n\t\t\t\t\tcase \"tabgracefont\":\n\t\t\t\t\t\tgetChangingFont(cmd, tokens, value);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"scale\":\n\t\t\t\t\t\tsetScale(cmd, tokens);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"partsbox\":\n\t\t\t\t\t\tscratch = addMultilineVarBool('partsBox', cmd, tokens);\n\t\t\t\t\t\tif (scratch !== null) warn(scratch);\n\t\t\t\t\t\tmultilineVars.partsfont.box = multilineVars.partsBox;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"freegchord\":\n\t\t\t\t\t\tscratch = addMultilineVarBool('freegchord', cmd, tokens);\n\t\t\t\t\t\tif (scratch !== null) warn(scratch);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"fontboxpadding\":\n\t\t\t\t\t\tif (tokens.length !== 1 || tokens[0].type !== 'number')\n\t\t\t\t\t\t\twarn(\"Directive \\\"\" + cmd + \"\\\" requires a number as a parameter.\");\n\t\t\t\t\t\ttune.formatting.fontboxpadding = tokens[0].floatt;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"stafftopmargin\":\n\t\t\t\t\t\tif (tokens.length !== 1 || tokens[0].type !== 'number')\n\t\t\t\t\t\t\twarn(\"Directive \\\"\" + cmd + \"\\\" requires a number as a parameter.\");\n\t\t\t\t\t\ttune.formatting.stafftopmargin = tokens[0].floatt;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"stretchlast\":\n\t\t\t\t\t\tvar sl = parseStretchLast(tokens);\n\t\t\t\t\t\tif (sl.value !== undefined)\n\t\t\t\t\t\t\ttune.formatting.stretchlast = sl.value;\n\t\t\t\t\t\tif (sl.error)\n\t\t\t\t\t\t\treturn sl.error;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\twarn(\"Formatting directive unrecognized: \", cmd, 0);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\tfunction parseStretchLast(tokens) {\n\t\tif (tokens.length === 0)\n\t\t\treturn { value: 1 }; // if there is no value then the presence of this is the same as \"true\"\n\t\telse if (tokens.length === 1) {\n\t\t\tif (tokens[0].type === \"number\") {\n\t\t\t\tif (tokens[0].floatt >= 0 || tokens[0].floatt <= 1)\n\t\t\t\t\treturn {value: tokens[0].floatt};\n\t\t\t} else if (tokens[0].token === 'false') {\n\t\t\t\treturn { value: 0 };\n\t\t\t} else if (tokens[0].token === 'true') {\n\t\t\t\treturn {value: 1};\n\t\t\t}\n\t\t}\n\t\treturn { error: \"Directive stretchlast requires zero or one parameter: false, true, or number between 0 and 1 (received \" + tokens[0].token + ')' };\n\t}\n})();\n\nmodule.exports = parseDirective;\n","var allNotes = {};\n\nconst allPitches = [\n\t'C,,,', 'D,,,', 'E,,,', 'F,,,', 'G,,,', 'A,,,', 'B,,,',\n\t'C,,', 'D,,', 'E,,', 'F,,', 'G,,', 'A,,', 'B,,',\n\t'C,', 'D,', 'E,', 'F,', 'G,', 'A,', 'B,',\n\t'C', 'D', 'E', 'F', 'G', 'A', 'B',\n\t'c', 'd', 'e', 'f', 'g', 'a', 'b',\n\t\"c'\", \"d'\", \"e'\", \"f'\", \"g'\", \"a'\", \"b'\",\n\t\"c''\", \"d''\", \"e''\", \"f''\", \"g''\", \"a''\", \"b''\",\n\t\"c'''\", \"d'''\", \"e'''\", \"f'''\", \"g'''\", \"a'''\", \"b'''\",\n];\n\nallNotes.pitchIndex = function(noteName) {\n\treturn allPitches.indexOf(noteName)\n}\n\nallNotes.noteName = function(pitchIndex) {\n\treturn allPitches[pitchIndex]\n}\n\nmodule.exports = allNotes;\n","var sharpChords = ['C', 'C♯', 'D', \"D♯\", 'E', 'F', \"F♯\", 'G', 'G♯', 'A', 'A♯', 'B'];\nvar flatChords = ['C', 'D♭', 'D', 'E♭', 'E', 'F', 'G♭', 'G', 'A♭', 'A', 'B♭', 'B'];\nvar sharpChordsFree = ['C', 'C#', 'D', \"D#\", 'E', 'F', \"F#\", 'G', 'G#', 'A', 'A#', 'B'];\nvar flatChordsFree = ['C', 'Db', 'D', 'Eb', 'E', 'F', 'Gb', 'G', 'Ab', 'A', 'Bb', 'B'];\n\nfunction transposeChordName(chord, steps, preferFlats, freeGCchord) {\n\tif (!steps || (steps % 12 === 0)) // The chords are the same if it is an exact octave change.\n\t\treturn chord;\n\n\t// There are two things in the chord that might need to be transposed:\n\t// The chord will start with a letter from A-G, and might have one accidental after it.\n\t// That accidental might be an actual sharp or flat char, or it might be a pound sign or lower case \"b\".\n\t// Then there is a bunch of stuff that isn't transposed and should just be copied. That is stuff like \"7\" and more complicated chords.\n\t// But there is one other exception: right after a slash there will be a bass note and possibly an accidental. That should also be transposed.\n\n\twhile (steps < 0) steps += 12;\n\tif (steps > 11) steps = steps % 12;\n\n\t// (chord name w/accidental) (a bunch of stuff) (/) (bass note) (anything else)\n\tvar match = chord.match(/^([A-G][b#♭♯]?)([^\\/]+)?\\/?([A-G][b#♭♯]?)?(.+)?/)\n\tif (!match)\n\t\treturn chord; // We don't recognize the format of the chord, so skip it.\n\tvar name = match[1]\n\tvar extra1 = match[2]\n\tvar bass = match[3]\n\tvar extra2 = match[4]\n\tvar index = sharpChords.indexOf(name)\n\tif (index < 0)\n\t\tindex = flatChords.indexOf(name)\n\tif (index < 0)\n\t\tindex = sharpChordsFree.indexOf(name)\n\tif (index < 0)\n\t\tindex = flatChordsFree.indexOf(name)\n\tif (index < 0)\n\t\treturn chord; // This should never happen, but if we can't find the chord just bail.\t\n\n\tindex += steps\n\tindex = index % 12\n\n\tif (preferFlats) {\n\t\tif (freeGCchord) chord = flatChordsFree[index]\n\t\telse chord = flatChords[index]\n\t} else {\n\t\tif (freeGCchord) chord = sharpChordsFree[index]\n\t\telse chord = sharpChords[index]\n\t}\n\n\tif (extra1)\n\t\tchord += extra1\n\n\tif (bass) {\n\t\tvar index = sharpChords.indexOf(bass)\n\t\tif (index < 0)\n\t\t\tindex = flatChords.indexOf(bass)\n\t\tif (index < 0)\n\t\t\tindex = sharpChordsFree.indexOf(bass)\n\t\tif (index < 0)\n\t\t\tindex = flatChordsFree.indexOf(bass)\n\t\tchord += '/'\n\t\tif (index >= 0) {\n\t\t\tindex += steps\n\t\t\tindex = index % 12\n\t\t\tif (preferFlats) {\n\t\t\t\tif (freeGCchord) chord += flatChordsFree[index]\n\t\t\t\telse chord += flatChords[index]\n\t\t\t} else {\n\t\t\t\tif (freeGCchord) chord += sharpChordsFree[index]\n\t\t\t\telse chord += sharpChords[index]\n\t\t\t}\n\t\t} else\n\t\t\tchord += bass; // Don't know what to do so do nothing\n\t}\n\n\tif (extra2)\n\t\tchord += extra2\n\n\treturn chord;\n}\n\nmodule.exports = transposeChordName","// All these keys have the same number of accidentals\nvar keys = {\n\t'C': { modes: ['CMaj', 'Amin', 'Am', 'GMix', 'DDor', 'EPhr', 'FLyd', 'BLoc'], stepsFromC: 0 },\n\t'Db': { modes: ['DbMaj', 'Bbmin', 'Bbm', 'AbMix', 'EbDor', 'FPhr', 'GbLyd', 'CLoc'], stepsFromC: 1 },\n\t'D': { modes: ['DMaj', 'Bmin', 'Bm', 'AMix', 'EDor', 'F#Phr', 'GLyd', 'C#Loc'], stepsFromC: 2 },\n\t'Eb': { modes: ['EbMaj', 'Cmin', 'Cm', 'BbMix', 'FDor', 'GPhr', 'AbLyd', 'DLoc'], stepsFromC: 3 },\n\t'E': { modes: ['EMaj', 'C#min', 'C#m', 'BMix', 'F#Dor', 'G#Phr', 'ALyd', 'D#Loc'], stepsFromC: 4 },\n\t'F': { modes: ['FMaj', 'Dmin', 'Dm', 'CMix', 'GDor', 'APhr', 'BbLyd', 'ELoc'], stepsFromC: 5 },\n\t'Gb': { modes: ['GbMaj', 'Ebmin', 'Ebm', 'DbMix', 'AbDor', 'BbPhr', 'CbLyd', 'FLoc'], stepsFromC: 6 },\n\t'G': { modes: ['GMaj', 'Emin', 'Em', 'DMix', 'ADor', 'BPhr', 'CLyd', 'F#Loc'], stepsFromC: 7 },\n\t'Ab': { modes: ['AbMaj', 'Fmin', 'Fm', 'EbMix', 'BbDor', 'CPhr', 'DbLyd', 'GLoc'], stepsFromC: 8 },\n\t'A': { modes: ['AMaj', 'F#min', 'F#m', 'EMix', 'BDor', 'C#Phr', 'DLyd', 'G#Loc'], stepsFromC: 9 },\n\t'Bb': { modes: ['BbMaj', 'Gmin', 'Gm', 'FMix', 'CDor', 'DPhr', 'EbLyd', 'ALoc'], stepsFromC: 10 },\n\t'B': { modes: ['BMaj', 'G#min', 'G#m', 'F#Mix', 'C#Dor', 'D#Phr', 'ELyd', 'A#Loc'], stepsFromC: 11 },\n\t// Enharmonic keys\n\t'C#': { modes: ['C#Maj', 'A#min', 'A#m', 'G#Mix', 'D#Dor', 'E#Phr', 'F#Lyd', 'B#Loc'], stepsFromC: 1 },\n\t'F#': { modes: ['F#Maj', 'D#min', 'D#m', 'C#Mix', 'G#Dor', 'A#Phr', 'BLyd', 'E#Loc'], stepsFromC: 6 },\n\t'Cb': { modes: ['CbMaj', 'Abmin', 'Abm', 'GbMix', 'DbDor', 'EbPhr', 'FbLyd', 'BbLoc'], stepsFromC: 11 },\n}\n\nvar keyReverse = null\n\nfunction createKeyReverse() {\n\tkeyReverse = {}\n\tvar allKeys = Object.keys(keys)\n\tfor (var i = 0 ; i < allKeys.length; i++) {\n\t\tvar keyObj = keys[allKeys[i]]\n\t\tkeyReverse[allKeys[i].toLowerCase()] = allKeys[i];\n\t\tfor (var j = 0; j < keyObj.modes.length; j++) {\n\t\t\tvar mode = keyObj.modes[j].toLowerCase()\n\t\t\tkeyReverse[mode] = allKeys[i];\n\t\t}\n\t}\n}\n\nfunction relativeMajor(key) {\n\t// Translate a key to its relative major. If it doesn't exist, do the best we can\n\t// by just returning the original key.\n\t// There are alternate spellings of these - so the search needs to be case insensitive.\n\t// To make this efficient, the first time this is called the \"keys\" object is reversed so this search is fast in the future\n\tif (!keyReverse) {\n\t\tcreateKeyReverse()\n\t}\n\t// get the key portion itself - there might be other stuff, like extra sharps and flats, or the mode written out.\n\tvar mode = key.toLowerCase().match(/([a-g][b#]?)(maj|min|mix|dor|phr|lyd|loc|m)?/)\n\tif (!mode || !mode[2])\n\t\treturn key;\n\tmode = mode[1] + mode[2]\n\tvar maj = keyReverse[mode]\n\tif (maj)\n\t\treturn maj;\n\treturn key;\n}\n\nfunction relativeMode(majorKey, mode) {\n\t// The reverse of the relativeMajor. Translate it back to the original mode.\n\t// If it isn't a recognized mode or it is already major, then just return the major key.\n\tvar group = keys[majorKey]\n\tif (!group)\n\t\treturn majorKey;\n\tif (mode === '')\n\t\treturn majorKey;\n\tvar match = mode.toLowerCase().match(/^(maj|min|mix|dor|phr|lyd|loc|m)/)\t\n\tif (!match)\n\t\treturn majorKey\n\tvar regMode = match[1]\t\n\tfor (var i = 0; i < group.modes.length; i++) {\n\t\tvar thisMode = group.modes[i]\n\t\tvar ind = thisMode.toLowerCase().indexOf(regMode)\n\t\tif (ind !== -1 && ind === thisMode.length - regMode.length)\n\t\t\treturn thisMode.substring(0, thisMode.length - regMode.length)\n\t}\n\treturn majorKey;\n}\n\nfunction transposeKey(key, steps) {\n\t// This takes a major key and adds the desired steps.\n\t// It assigns each key a number that is the number of steps from C so that there can just be arithmetic.\n\tvar match = keys[key]\n\tif (!match)\n\t\treturn key;\n\twhile (steps < 0) steps += 12;\n\tvar fromC = (match.stepsFromC + steps) % 12;\n\tfor (var i = 0; i < Object.keys(keys).length; i++) {\n\t\tvar k = Object.keys(keys)[i]\n\t\tif (keys[k].stepsFromC === fromC)\n\t\t\treturn k;\n\t}\n\treturn key;\n}\n\nmodule.exports = {relativeMajor: relativeMajor, relativeMode: relativeMode, transposeKey: transposeKey};\n","var { relativeMajor } = require(\"./relative-major\");\n\nvar key1sharp = { acc: 'sharp', note: 'f' };\nvar key2sharp = { acc: 'sharp', note: 'c' };\nvar key3sharp = { acc: 'sharp', note: 'g' };\nvar key4sharp = { acc: 'sharp', note: 'd' };\nvar key5sharp = { acc: 'sharp', note: 'A' };\nvar key6sharp = { acc: 'sharp', note: 'e' };\nvar key7sharp = { acc: 'sharp', note: 'B' };\nvar key1flat = { acc: 'flat', note: 'B' };\nvar key2flat = { acc: 'flat', note: 'e' };\nvar key3flat = { acc: 'flat', note: 'A' };\nvar key4flat = { acc: 'flat', note: 'd' };\nvar key5flat = { acc: 'flat', note: 'G' };\nvar key6flat = { acc: 'flat', note: 'c' };\nvar key7flat = { acc: 'flat', note: 'F' };\n\nvar keys = {\n\t'C#': [key1sharp, key2sharp, key3sharp, key4sharp, key5sharp, key6sharp, key7sharp],\n\t'F#': [key1sharp, key2sharp, key3sharp, key4sharp, key5sharp, key6sharp],\n\t'B': [key1sharp, key2sharp, key3sharp, key4sharp, key5sharp],\n\t'E': [key1sharp, key2sharp, key3sharp, key4sharp],\n\t'A': [key1sharp, key2sharp, key3sharp],\n\t'D': [key1sharp, key2sharp],\n\t'G': [key1sharp],\n\t'C': [],\n\t'F': [key1flat],\n\t'Bb': [key1flat, key2flat],\n\t'Eb': [key1flat, key2flat, key3flat],\n\t'Cm': [key1flat, key2flat, key3flat],\n\t'Ab': [key1flat, key2flat, key3flat, key4flat],\n\t'Db': [key1flat, key2flat, key3flat, key4flat, key5flat],\n\t'Gb': [key1flat, key2flat, key3flat, key4flat, key5flat, key6flat],\n\t'Cb': [key1flat, key2flat, key3flat, key4flat, key5flat, key6flat, key7flat],\n\n\t// The following are not in the 2.0 spec, but seem normal enough.\n\t// TODO-PER: These SOUND the same as what's written, but they aren't right\n\t'A#': [key1flat, key2flat],\n\t'B#': [],\n\t'D#': [key1flat, key2flat, key3flat],\n\t'E#': [key1flat],\n\t'G#': [key1flat, key2flat, key3flat, key4flat],\n\t'none': [],\n};\n\nfunction keyAccidentals(key) {\n\tvar newKey = keys[relativeMajor(key)]\n\tif (!newKey) // If we don't recognize the key then there is no change\n\t\treturn null\n\treturn JSON.parse(JSON.stringify(newKey))\n};\n\nmodule.exports = keyAccidentals;\n","// abc_transpose.js: Handles the automatic transposition of key signatures, chord symbols, and notes.\n\nvar allNotes = require(\"./all-notes\");\nvar transposeChordName = require(\"../parse/transpose-chord\")\nvar keyAccidentals = require('../const/key-accidentals');\nvar transpose = {};\n\nvar keyIndex = {\n\t'C': 0,\n\t'C#': 1,\n\t'Db': 1,\n\t'D': 2,\n\t'D#': 3,\n\t'Eb': 3,\n\t'E': 4,\n\t'F': 5,\n\t'F#': 6,\n\t'Gb': 6,\n\t'G': 7,\n\t'G#': 8,\n\t'Ab': 8,\n\t'A': 9,\n\t'A#': 10,\n\t'Bb': 10,\n\t'B': 11\n};\nvar newKey = ['C', 'Db', 'D', 'Eb', 'E', 'F', 'F#', 'G', 'Ab', 'A', 'Bb', 'B'];\nvar newKeyMinor = ['C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#', 'A', 'Bb', 'B'];\n\ntranspose.keySignature = function(multilineVars, keyName, root, acc, localTranspose) {\n\tif (multilineVars.clef.type === \"perc\" || multilineVars.clef.type === \"none\")\n\t\treturn { accidentals: keyAccidentals(keyName), root: root, acc: acc };\n\tif (!localTranspose) localTranspose = 0;\n\tmultilineVars.localTransposeVerticalMovement = 0;\n\tmultilineVars.localTransposePreferFlats = false;\n\tvar k = keyAccidentals(keyName);\n\tif (!k) return multilineVars.key; // If the key isn't in the list, it is non-standard. We won't attempt to transpose it.\n\tmultilineVars.localTranspose = (multilineVars.globalTranspose ? multilineVars.globalTranspose : 0) + localTranspose;\n\n\tif (!multilineVars.localTranspose)\n\t\treturn { accidentals: k, root: root, acc: acc };\n\tmultilineVars.globalTransposeOrigKeySig = k;\n\tif (multilineVars.localTranspose % 12 === 0) {\n\t\tmultilineVars.localTransposeVerticalMovement = (multilineVars.localTranspose / 12) * 7;\n\t\treturn { accidentals: k, root: root, acc: acc };\n\t}\n\n\tvar baseKey = keyName[0];\n\tif (keyName[1] === 'b' || keyName[1] === '#') {\n\t\tbaseKey += keyName[1];\n\t\tkeyName = keyName.substr(2);\n\t} else\n\t\tkeyName = keyName.substr(1);\n\tvar thisKeyIndex = keyIndex[baseKey]\n\tvar recognized = thisKeyIndex !== undefined\n\tif (!recognized) {\n\t\t// Either the key sig is \"none\" or we don't recognize it. Either way we don't change it, and we assume key of C for the purposes of this calculation.\n\t\tthisKeyIndex = 0\n\t\tbaseKey = \"C\"\n\t\tkeyName = \"\"\n\t}\n\tvar index = thisKeyIndex + multilineVars.localTranspose;\n\twhile (index < 0) index += 12;\n\tif (index > 11) index = index % 12;\n\tvar newKeyName = (keyName[0] === 'm' ? newKeyMinor[index] : newKey[index]);\n\tvar transposedKey = newKeyName + keyName;\n\tvar newKeySig = keyAccidentals(transposedKey);\n\tif (newKeySig.length > 0 && newKeySig[0].acc === 'flat')\n\t\tmultilineVars.localTransposePreferFlats = true;\n\tvar distance = transposedKey.charCodeAt(0) - baseKey.charCodeAt(0);\n\tif (multilineVars.localTranspose > 0) {\n\t\tif (distance < 0)\n\t\t\tdistance += 7;\n\t\telse if (distance === 0) {\n\t\t\t// There's a funny thing that happens when the key changes only an accidental's distance, for instance, from Ab to A.\n\t\t\t// If the distance is positive (we are raising pitch), and the change is higher (that is, Ab -> A), then raise an octave.\n\t\t\t// This test is easier because we know the keys are not equal (or we wouldn't get this far), so if the base key is a flat key, then\n\t\t\t// the transposed key must be higher. Likewise, if the transposed key is sharp, then the base key must be lower. And one\n\t\t\t// of those two things must be true because they are not both natural.\n\t\t\tif (baseKey[1] === '#' || transposedKey[1] === 'b')\n\t\t\t\tdistance += 7;\n\t\t}\n\t} else if (multilineVars.localTranspose < 0) {\n\t\tif (distance > 0)\n\t\t\tdistance -= 7;\n\t\telse if (distance === 0) {\n\t\t\t// There's a funny thing that happens when the key changes only an accidental's distance, for instance, from Ab to A.\n\t\t\t// If the distance is negative (we are dropping pitch), and the change is lower (that is, A -> Ab), then drop an octave.\n\t\t\tif (baseKey[1] === 'b' || transposedKey[1] === '#')\n\t\t\t\tdistance -= 7;\n\t\t}\n\t}\n\n\tif (multilineVars.localTranspose > 0)\n\t\tmultilineVars.localTransposeVerticalMovement = distance + Math.floor(multilineVars.localTranspose / 12) * 7;\n\telse\n\t\tmultilineVars.localTransposeVerticalMovement = distance + Math.ceil(multilineVars.localTranspose / 12) * 7;\n\tif (recognized)\n\t\treturn { accidentals: newKeySig, root: newKeyName[0], acc: newKeyName.length > 1 ? newKeyName[1] : \"\" };\n\telse\n\t\treturn { accidentals: [], root: root, acc: acc };\n};\n\ntranspose.chordName = function(multilineVars, chord) {\n\treturn transposeChordName(chord, multilineVars.localTranspose, multilineVars.localTransposePreferFlats, multilineVars.freegchord)\n};\n\nvar pitchToLetter = [ 'c', 'd', 'e', 'f', 'g', 'a', 'b' ];\nfunction accidentalChange(origPitch, newPitch, accidental, origKeySig, newKeySig) {\n\tvar origPitchLetter = pitchToLetter[(origPitch + 49) % 7]; // Make sure it is a positive pitch before normalizing.\n\tvar origAccidental = 0;\n\tfor (var i = 0; i < origKeySig.length; i++) {\n\t\tif (origKeySig[i].note.toLowerCase() === origPitchLetter)\n\t\t\torigAccidental = accidentals[origKeySig[i].acc];\n\t}\n\n\tvar currentAccidental = accidentals[accidental];\n\tvar delta = currentAccidental - origAccidental;\n\n\tvar newPitchLetter = pitchToLetter[(newPitch + 49) % 7]; // Make sure it is a positive pitch before normalizing.\n\tvar newAccidental = 0;\n\tfor (var j = 0; j < newKeySig.accidentals.length; j++) {\n\t\tif (newKeySig.accidentals[j].note.toLowerCase() === newPitchLetter)\n\t\t\tnewAccidental = accidentals[newKeySig.accidentals[j].acc];\n\t}\n\tvar calcAccidental = delta + newAccidental;\n\tif (calcAccidental < -2) {\n\t\tnewPitch--;\n\t\tcalcAccidental += (newPitchLetter === 'c' || newPitchLetter === 'f') ? 1 : 2;\n\t}\n\tif (calcAccidental > 2) {\n\t\tnewPitch++;\n\t\tcalcAccidental -= (newPitchLetter === 'b' || newPitchLetter === 'e') ? 1 : 2;\n\t}\n\treturn [newPitch, calcAccidental];\n}\n\nvar accidentals = {\n\tdblflat: -2,\n\tflat: -1,\n\tnatural: 0,\n\tsharp: 1,\n\tdblsharp: 2\n};\nvar accidentals2 = {\n\t\"-2\": \"dblflat\",\n\t\"-1\": \"flat\",\n\t\"0\": \"natural\",\n\t\"1\": \"sharp\",\n\t\"2\": \"dblsharp\"\n};\nvar accidentals3 = {\n\t\"-2\": \"__\",\n\t\"-1\": \"_\",\n\t\"0\": \"=\",\n\t\"1\": \"^\",\n\t\"2\": \"^^\"\n};\n//var count = 0\ntranspose.note = function(multilineVars, el) {\n\t// the \"el\" that is passed in has el.name, el.accidental, and el.pitch. \"pitch\" is the vertical position (0=middle C)\n\t// localTranspose is the number of half steps\n\t// localTransposeVerticalMovement is the vertical distance to move.\n\t//console.log(count++,multilineVars.localTranspose, el)\n\tif (!multilineVars.localTranspose || multilineVars.clef.type === \"perc\")\n\t\treturn;\n\tvar origPitch = el.pitch;\n\tif (multilineVars.localTransposeVerticalMovement) {\n\t\tel.pitch = el.pitch + multilineVars.localTransposeVerticalMovement;\n\t\tif (el.name) {\n\t\t\tvar actual = el.accidental ? el.name.substring(1) : el.name\n\t\t\tvar acc = el.accidental ? el.name[0] : ''\n\t\t\tvar p = allNotes.pitchIndex(actual)\n\t\t\tel.name = acc + allNotes.noteName(p+multilineVars.localTransposeVerticalMovement)\n\t\t}\n\t}\n\n\tif (el.accidental) {\n\t\tvar ret = accidentalChange(origPitch, el.pitch, el.accidental, multilineVars.globalTransposeOrigKeySig, multilineVars.targetKey);\n\t\tel.pitch = ret[0];\n\t\tel.accidental = accidentals2[ret[1]];\n\t\tif (el.name) {\n\t\t\tel.name = accidentals3[ret[1]] + el.name.replace(/[_^=]/g,'');\n\t\t}\n\t}\n\n};\n\nmodule.exports = transpose;\n","var parseDirective = require('./abc_parse_directive');\nvar transpose = require('./abc_transpose');\n\nvar parseKeyVoice = {};\n\n(function() {\n\tvar tokenizer;\n\tvar warn;\n\tvar multilineVars;\n\tvar tune;\n\tvar tuneBuilder;\n\tparseKeyVoice.initialize = function(tokenizer_, warn_, multilineVars_, tune_, tuneBuilder_) {\n\t\ttokenizer = tokenizer_;\n\t\twarn = warn_;\n\t\tmultilineVars = multilineVars_;\n\t\ttune = tune_;\n\t\ttuneBuilder = tuneBuilder_;\n\t};\n\n\tparseKeyVoice.standardKey = function(keyName, root, acc, localTranspose) {\n\t\treturn transpose.keySignature(multilineVars, keyName, root, acc, localTranspose);\n\t};\n\n\tvar clefLines = {\n\t\t'treble': { clef: 'treble', pitch: 4, mid: 0 },\n\t\t'treble+8': { clef: 'treble+8', pitch: 4, mid: 0 },\n\t\t'treble-8': { clef: 'treble-8', pitch: 4, mid: 0 },\n\t\t'treble^8': { clef: 'treble+8', pitch: 4, mid: 0 },\n\t\t'treble_8': { clef: 'treble-8', pitch: 4, mid: 0 },\n\t\t'treble1': { clef: 'treble', pitch: 2, mid: 2 },\n\t\t'treble2': { clef: 'treble', pitch: 4, mid: 0 },\n\t\t'treble3': { clef: 'treble', pitch: 6, mid: -2 },\n\t\t'treble4': { clef: 'treble', pitch: 8, mid: -4 },\n\t\t'treble5': { clef: 'treble', pitch: 10, mid: -6 },\n\t\t'perc': { clef: 'perc', pitch: 6, mid: 0 },\n\t\t'none': { clef: 'none', mid: 0 },\n\t\t'bass': { clef: 'bass', pitch: 8, mid: -12 },\n\t\t'bass+8': { clef: 'bass+8', pitch: 8, mid: -12 },\n\t\t'bass-8': { clef: 'bass-8', pitch: 8, mid: -12 },\n\t\t'bass^8': { clef: 'bass+8', pitch: 8, mid: -12 },\n\t\t'bass_8': { clef: 'bass-8', pitch: 8, mid: -12 },\n\t\t'bass+16': { clef: 'bass', pitch: 8, mid: -12 },\n\t\t'bass-16': { clef: 'bass', pitch: 8, mid: -12 },\n\t\t'bass^16': { clef: 'bass', pitch: 8, mid: -12 },\n\t\t'bass_16': { clef: 'bass', pitch: 8, mid: -12 },\n\t\t'bass1': { clef: 'bass', pitch: 2, mid: -6 },\n\t\t'bass2': { clef: 'bass', pitch: 4, mid: -8 },\n\t\t'bass3': { clef: 'bass', pitch: 6, mid: -10 },\n\t\t'bass4': { clef: 'bass', pitch: 8, mid: -12 },\n\t\t'bass5': { clef: 'bass', pitch: 10, mid: -14 },\n\t\t'tenor': { clef: 'alto', pitch: 8, mid: -8 },\n\t\t'tenor1': { clef: 'alto', pitch: 2, mid: -2 },\n\t\t'tenor2': { clef: 'alto', pitch: 4, mid: -4 },\n\t\t'tenor3': { clef: 'alto', pitch: 6, mid: -6 },\n\t\t'tenor4': { clef: 'alto', pitch: 8, mid: -8 },\n\t\t'tenor5': { clef: 'alto', pitch: 10, mid: -10 },\n\t\t'alto': { clef: 'alto', pitch: 6, mid: -6 },\n\t\t'alto1': { clef: 'alto', pitch: 2, mid: -2 },\n\t\t'alto2': { clef: 'alto', pitch: 4, mid: -4 },\n\t\t'alto3': { clef: 'alto', pitch: 6, mid: -6 },\n\t\t'alto4': { clef: 'alto', pitch: 8, mid: -8 },\n\t\t'alto5': { clef: 'alto', pitch: 10, mid: -10 },\n\t\t'alto+8': { clef: 'alto+8', pitch: 6, mid: -6 },\n\t\t'alto-8': { clef: 'alto-8', pitch: 6, mid: -6 },\n\t\t'alto^8': { clef: 'alto+8', pitch: 6, mid: -6 },\n\t\t'alto_8': { clef: 'alto-8', pitch: 6, mid: -6 }\n\t};\n\n\tvar calcMiddle = function(clef, oct) {\n\t\tvar value = clefLines[clef];\n\t\tvar mid = value ? value.mid : 0;\n\t\treturn mid+oct;\n\t};\n\n\tparseKeyVoice.fixClef = function(clef) {\n\t\tvar value = clefLines[clef.type];\n\t\tif (value) {\n\t\t\tclef.clefPos = value.pitch;\n\t\t\tclef.type = value.clef;\n\t\t}\n\t};\n\n\tparseKeyVoice.deepCopyKey = function(key) {\n\t\tvar ret = { accidentals: [], root: key.root, acc: key.acc, mode: key.mode };\n\t\tkey.accidentals.forEach(function(k) {\n\t\tret.accidentals.push(Object.assign({},k));\n\t\t});\n\t\treturn ret;\n\t};\n\n\tvar pitches = {A: 5, B: 6, C: 0, D: 1, E: 2, F: 3, G: 4, a: 12, b: 13, c: 7, d: 8, e: 9, f: 10, g: 11};\n\n\tparseKeyVoice.addPosToKey = function(clef, key) {\n\t\t// Shift the key signature from the treble positions to whatever position is needed for the clef.\n\t\t// This may put the key signature unnaturally high or low, so if it does, then shift it.\n\t\tvar mid = clef.verticalPos;\n\t\tkey.accidentals.forEach(function(acc) {\n\t\t\tvar pitch = pitches[acc.note];\n\t\t\tpitch = pitch - mid;\n\t\t\tacc.verticalPos = pitch;\n\t\t});\n\t\tif (key.impliedNaturals)\n\t\t\tkey.impliedNaturals.forEach(function(acc) {\n\t\t\t\tvar pitch = pitches[acc.note];\n\t\t\t\tpitch = pitch - mid;\n\t\t\t\tacc.verticalPos = pitch;\n\t\t\t});\n\n\t\tif (mid < -10) {\n\t\t\tkey.accidentals.forEach(function(acc) {\n\t\t\t\tacc.verticalPos -= 7;\n\t\t\t\tif (acc.verticalPos >= 11 || (acc.verticalPos === 10 && acc.acc === 'flat'))\n\t\t\t\t\tacc.verticalPos -= 7;\n\t\t\t\tif (acc.note === 'A' && acc.acc === 'sharp' )\n\t\t\t\t\tacc.verticalPos -=7;\n\t\t\t\tif ((acc.note === 'G' || acc.note === 'F') && acc.acc === 'flat' )\n\t\t\t\t\tacc.verticalPos -=7;\n\t\t\t});\n\t\t\tif (key.impliedNaturals)\n\t\t\t\tkey.impliedNaturals.forEach(function(acc) {\n\t\t\t\t\tacc.verticalPos -= 7;\n\t\t\t\t\tif (acc.verticalPos >= 11 || (acc.verticalPos === 10 && acc.acc === 'flat'))\n\t\t\t\t\t\tacc.verticalPos -= 7;\n\t\t\t\t\tif (acc.note === 'A' && acc.acc === 'sharp' )\n\t\t\t\t\t\tacc.verticalPos -=7;\n\t\t\t\t\tif ((acc.note === 'G' || acc.note === 'F') && acc.acc === 'flat' )\n\t\t\t\t\t\tacc.verticalPos -=7;\n\t\t\t\t});\n\t\t} else if (mid < -4) {\n\t\t\tkey.accidentals.forEach(function(acc) {\n\t\t\t\tacc.verticalPos -= 7;\n\t\t\t\tif (mid === -8 && (acc.note === 'f' || acc.note === 'g') && acc.acc === 'sharp' )\n\t\t\t\t\tacc.verticalPos -=7;\n\t\t\t});\n\t\t\tif (key.impliedNaturals)\n\t\t\t\tkey.impliedNaturals.forEach(function(acc) {\n\t\t\t\t\tacc.verticalPos -= 7;\n\t\t\t\t\tif (mid === -8 && (acc.note === 'f' || acc.note === 'g') && acc.acc === 'sharp' )\n\t\t\t\t\t\tacc.verticalPos -=7;\n\t\t\t\t});\n\t\t} else if (mid >= 7) {\n\t\t\tkey.accidentals.forEach(function(acc) {\n\t\t\t\tacc.verticalPos += 7;\n\t\t\t});\n\t\t\tif (key.impliedNaturals)\n\t\t\t\tkey.impliedNaturals.forEach(function(acc) {\n\t\t\t\t\tacc.verticalPos += 7;\n\t\t\t\t});\n\t\t}\n\t};\n\n\tparseKeyVoice.fixKey = function(clef, key) {\n\t\tvar fixedKey = Object.assign({},key);\n\t\tparseKeyVoice.addPosToKey(clef, fixedKey);\n\t\treturn fixedKey;\n\t};\n\n\tvar parseMiddle = function(str) {\n\t\tvar i = 0;\n\t\tvar p = str[i++];\n\t\tif (p === '^' || p === '_')\n\t\t\tp = str[i++];\n\t var mid = pitches[p];\n\t\tif (mid === undefined)\n\t\t\tmid = 6; // If a legal middle note wasn't received, just ignore it.\n\t\tfor ( ; i < str.length; i++) {\n\t\t\tif (str[i] === ',') mid -= 7;\n\t\t\telse if (str[i] === \"'\") mid += 7;\n\t\t\telse break;\n\t\t}\n\t\treturn { mid: mid - 6, str: str.substring(i) };\t// We get the note in the middle of the staff. We want the note that appears as the first ledger line below the staff.\n\t};\n\n\tvar normalizeAccidentals = function(accs) {\n\t\tfor (var i = 0; i < accs.length; i++) {\n\t\t\tif (accs[i].note === 'b')\n\t\t\t\taccs[i].note = 'B';\n\t\t\telse if (accs[i].note === 'a')\n\t\t\t\taccs[i].note = 'A';\n\t\t\telse if (accs[i].note === 'F')\n\t\t\t\taccs[i].note = 'f';\n\t\t\telse if (accs[i].note === 'E')\n\t\t\t\taccs[i].note = 'e';\n\t\t\telse if (accs[i].note === 'D')\n\t\t\t\taccs[i].note = 'd';\n\t\t\telse if (accs[i].note === 'C')\n\t\t\t\taccs[i].note = 'c';\n\t\t\telse if (accs[i].note === 'G' && accs[i].acc === 'sharp')\n\t\t\t\taccs[i].note = 'g';\n\t\t\telse if (accs[i].note === 'g' && accs[i].acc === 'flat')\n\t\t\t\taccs[i].note = 'G';\n\t\t}\n\t};\n\n\tparseKeyVoice.parseKey = function(str, isInline)\t// (and clef)\n\t{\n\t\t// returns:\n\t\t//\t\t{ foundClef: true, foundKey: true }\n\t\t// Side effects:\n\t\t//\t\tcalls warn() when there is a syntax error\n\t\t//\t\tsets these members of multilineVars:\n\t\t//\t\t\tclef\n\t\t//\t\t\tkey\n\t\t//\t\t\tstyle\n\t\t//\n\t\t// The format is:\n\t\t// K: [⟨key⟩] [⟨modifiers⟩*]\n\t\t// modifiers are any of the following in any order:\n\t\t// [⟨clef⟩] [middle=⟨pitch⟩] [transpose=[-]⟨number⟩] [stafflines=⟨number⟩] [staffscale=⟨number⟩][style=⟨style⟩]\n\t\t// key is none|HP|Hp|⟨specified_key⟩\n\t\t// clef is [clef=] [⟨clef type⟩] [⟨line number⟩] [+8|-8]\n\t\t// specified_key is ⟨pitch⟩[#|b][mode(first three chars are significant)][accidentals*]\n\t\tif (str.length === 0) {\n\t\t\t// an empty K: field is the same as K:none\n\t\t\tstr = 'none';\n\t\t}\n\t\tvar tokens = tokenizer.tokenize(str, 0, str.length);\n\t\tvar ret = {};\n\n\t\t// Be sure that a key was passed in\n\t\tif (tokens.length === 0) {\n\t\t\twarn(\"Must pass in key signature.\", str, 0);\n\t\t\treturn ret;\n\t\t}\n\n\t\t// first the key\n\t\tswitch (tokens[0].token) {\n\t\t\tcase 'HP':\n\t\t\t\tparseDirective.addDirective(\"bagpipes\");\n\t\t\t\tmultilineVars.key = { root: \"HP\", accidentals: [], acc: \"\", mode: \"\" };\n\t\t\t\tret.foundKey = true;\n\t\t\t\ttokens.shift();\n\t\t\t\tbreak;\n\t\t\tcase 'Hp':\n\t\t\t\tparseDirective.addDirective(\"bagpipes\");\n\t\t\t\tmultilineVars.key = { root: \"Hp\", accidentals: [{acc: 'natural', note: 'g'}, {acc: 'sharp', note: 'f'}, {acc: 'sharp', note: 'c'}], acc: \"\", mode: \"\" };\n\t\t\t\tret.foundKey = true;\n\t\t\t\ttokens.shift();\n\t\t\t\tbreak;\n\t\t\tcase 'none':\n\t\t\t\t// we got the none key - that's the same as C to us\n\t\t\t\tmultilineVars.key = { root: \"none\", accidentals: [], acc: \"\", mode: \"\" };\n\t\t\t\tret.foundKey = true;\n\t\t\t\ttokens.shift();\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tvar retPitch = tokenizer.getKeyPitch(tokens[0].token);\n\t\t\t\tif (retPitch.len > 0) {\n\t\t\t\t\tret.foundKey = true;\n\t\t\t\t\tvar acc = \"\";\n\t\t\t\t\tvar mode = \"\";\n\t\t\t\t\t// The accidental and mode might be attached to the pitch, so we might want to just remove the first character.\n\t\t\t\t\tif (tokens[0].token.length > 1)\n\t\t\t\t\t\ttokens[0].token = tokens[0].token.substring(1);\n\t\t\t\t\telse\n\t\t\t\t\t\ttokens.shift();\n\t\t\t\t\tvar key = retPitch.token;\n\t\t\t\t\t// We got a pitch to start with, so we might also have an accidental and a mode\n\t\t\t\t\tif (tokens.length > 0) {\n\t\t\t\t\t\tvar retAcc = tokenizer.getSharpFlat(tokens[0].token);\n\t\t\t\t\t\tif (retAcc.len > 0) {\n\t\t\t\t\t\t\tif (tokens[0].token.length > 1)\n\t\t\t\t\t\t\t\ttokens[0].token = tokens[0].token.substring(1);\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\ttokens.shift();\n\t\t\t\t\t\t\tkey += retAcc.token;\n\t\t\t\t\t\t\tacc = retAcc.token;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (tokens.length > 0) {\n\t\t\t\t\t\t\tvar retMode = tokenizer.getMode(tokens[0].token);\n\t\t\t\t\t\t\tif (retMode.len > 0) {\n\t\t\t\t\t\t\t\ttokens.shift();\n\t\t\t\t\t\t\t\tkey += retMode.token;\n\t\t\t\t\t\t\t\tmode = retMode.token;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Be sure that the key specified is in the list: not all keys are physically possible, like Cbmin.\n\t\t\t\t\t\tif (parseKeyVoice.standardKey(key, retPitch.token, acc, 0) === undefined) {\n\t\t\t\t\t\t\twarn(\"Unsupported key signature: \" + key, str, 0);\n\t\t\t\t\t\t\treturn ret;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// We need to do a deep copy because we are going to modify it\n\t\t\t\t\tvar oldKey = parseKeyVoice.deepCopyKey(multilineVars.key);\n\t\t\t\t\t//TODO-PER: HACK! To get the local transpose to work, the transposition is done for each line. This caused the global transposition variable to be factored in twice, so, instead of rewriting that right now, I'm just subtracting one of them here.\n\t\t\t\t\tvar keyCompensate = !isInline && multilineVars.globalTranspose ? -multilineVars.globalTranspose : 0;\n\t\t\t\t\t//console.log(\"parse\", JSON.stringify(multilineVars), isInline)\n\t\t\t\t\tvar savedOrigKey;\n\t\t\t\t\tif (isInline)\n\t\t\t\t\t\tsavedOrigKey = multilineVars.globalTransposeOrigKeySig\n\t\t\t\t\tmultilineVars.key = parseKeyVoice.deepCopyKey(parseKeyVoice.standardKey(key, retPitch.token, acc, keyCompensate));\n\t\t\t\t\tif (isInline)\n\t\t\t\t\t\tmultilineVars.globalTransposeOrigKeySig = savedOrigKey\n\t\t\t\t\tmultilineVars.key.mode = mode;\n\t\t\t\t\tif (oldKey) {\n\t\t\t\t\t\t// Add natural in all places that the old key had an accidental.\n\t\t\t\t\t\tvar kk;\n\t\t\t\t\t\tfor (var k = 0; k < multilineVars.key.accidentals.length; k++) {\n\t\t\t\t\t\t\tfor (kk = 0; kk < oldKey.accidentals.length; kk++) {\n\t\t\t\t\t\t\t\tif (oldKey.accidentals[kk].note && multilineVars.key.accidentals[k].note.toLowerCase() === oldKey.accidentals[kk].note.toLowerCase())\n\t\t\t\t\t\t\t\t\toldKey.accidentals[kk].note = null;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfor (kk = 0; kk < oldKey.accidentals.length; kk++) {\n\t\t\t\t\t\t\tif (oldKey.accidentals[kk].note) {\n\t\t\t\t\t\t\t\tif (!multilineVars.key.impliedNaturals)\n\t\t\t\t\t\t\t\t\tmultilineVars.key.impliedNaturals = [];\n\t\t\t\t\t\t\t\tmultilineVars.key.impliedNaturals.push({ acc: 'natural', note: oldKey.accidentals[kk].note });\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\n\t\t// There are two special cases of deprecated syntax. Ignore them if they occur\n\t\tif (tokens.length === 0) return ret;\n\t\tif (tokens[0].token === 'exp') tokens.shift();\n\t\tif (tokens.length === 0) return ret;\n\t\tif (tokens[0].token === 'oct') tokens.shift();\n\n\t\t// now see if there are extra accidentals\n\t\tif (tokens.length === 0) return ret;\n\t\tvar accs = tokenizer.getKeyAccidentals2(tokens);\n\t\tif (accs.warn)\n\t\t\twarn(accs.warn, str, 0);\n\t\t// If we have extra accidentals, first replace ones that are of the same pitch before adding them to the end.\n\t\tif (accs.accs) {\n\t\t\tif (!ret.foundKey) {\t\t// if there are only extra accidentals, make sure this is set.\n\t\t\t\tret.foundKey = true;\n\t\t\t\tmultilineVars.key = { root: \"none\", acc: \"\", mode: \"\", accidentals: [] };\n\t\t\t}\n\t\t\tnormalizeAccidentals(accs.accs);\n\t\t\tfor (var i = 0; i < accs.accs.length; i++) {\n\t\t\t\tvar found = false;\n\t\t\t\tfor (var j = 0; j < multilineVars.key.accidentals.length && !found; j++) {\n\t\t\t\t\tif (multilineVars.key.accidentals[j].note === accs.accs[i].note) {\n\t\t\t\t\t\tfound = true;\n\t\t\t\t\t\tif (multilineVars.key.accidentals[j].acc !== accs.accs[i].acc) {\n\t\t\t\t\t\t\t// If the accidental is different, then replace it. If it is the same, then the declaration was redundant, so just ignore it.\n\t\t\t\t\t\t\tmultilineVars.key.accidentals[j].acc = accs.accs[i].acc;\n\t\t\t\t\t\t\tif (!multilineVars.key.explicitAccidentals)\n\t\t\t\t\t\t\t\tmultilineVars.key.explicitAccidentals = [];\n\t\t\t\t\t\t\tmultilineVars.key.explicitAccidentals.push(accs.accs[i]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (!found) {\n\t\t\t\t\tif (!multilineVars.key.explicitAccidentals)\n\t\t\t\t\t\tmultilineVars.key.explicitAccidentals = [];\n\t\t\t\t\tmultilineVars.key.explicitAccidentals.push(accs.accs[i]);\n\t\t\t\t\tmultilineVars.key.accidentals.push(accs.accs[i]);\n\t\t\t\t\tif (multilineVars.key.impliedNaturals) {\n\t\t\t\t\t\tfor (var kkk = 0; kkk < multilineVars.key.impliedNaturals.length; kkk++) {\n\t\t\t\t\t\t\tif (multilineVars.key.impliedNaturals[kkk].note === accs.accs[i].note)\n\t\t\t\t\t\t\t\tmultilineVars.key.impliedNaturals.splice(kkk, 1);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Now see if any optional parameters are present. They have the form \"key=value\", except that \"clef=\" is optional\n\t\tvar token;\n\t\twhile (tokens.length > 0) {\n\t\t\tswitch (tokens[0].token) {\n\t\t\t\tcase \"m\":\n\t\t\t\tcase \"middle\":\n\t\t\t\t\ttokens.shift();\n\t\t\t\t\tif (tokens.length === 0) { warn(\"Expected = after middle\", str, 0); return ret; }\n\t\t\t\t\ttoken = tokens.shift();\n\t\t\t\t\tif (token.token !== \"=\") { warn(\"Expected = after middle\", str, token.start); break; }\n\t\t\t\t\tif (tokens.length === 0) { warn(\"Expected parameter after middle=\", str, 0); return ret; }\n\t\t\t\t\tvar pitch = tokenizer.getPitchFromTokens(tokens);\n\t\t\t\t\tif (pitch.warn)\n\t\t\t\t\t\twarn(pitch.warn, str, 0);\n\t\t\t\t\tif (pitch.position)\n\t\t\t\t\t\tmultilineVars.clef.verticalPos = pitch.position - 6;\t// we get the position from the middle line, but want to offset it to the first ledger line.\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"transpose\":\n\t\t\t\t\ttokens.shift();\n\t\t\t\t\tif (tokens.length === 0) { warn(\"Expected = after transpose\", str, 0); return ret; }\n\t\t\t\t\ttoken = tokens.shift();\n\t\t\t\t\tif (token.token !== \"=\") { warn(\"Expected = after transpose\", str, token.start); break; }\n\t\t\t\t\tif (tokens.length === 0) { warn(\"Expected parameter after transpose=\", str, 0); return ret; }\n\t\t\t\t\tif (tokens[0].type !== 'number') { warn(\"Expected number after transpose\", str, tokens[0].start); break; }\n\t\t\t\t\tmultilineVars.clef.transpose = tokens[0].intt;\n\t\t\t\t\ttokens.shift();\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"stafflines\":\n\t\t\t\t\ttokens.shift();\n\t\t\t\t\tif (tokens.length === 0) { warn(\"Expected = after stafflines\", str, 0); return ret; }\n\t\t\t\t\ttoken = tokens.shift();\n\t\t\t\t\tif (token.token !== \"=\") { warn(\"Expected = after stafflines\", str, token.start); break; }\n\t\t\t\t\tif (tokens.length === 0) { warn(\"Expected parameter after stafflines=\", str, 0); return ret; }\n\t\t\t\t\tif (tokens[0].type !== 'number') { warn(\"Expected number after stafflines\", str, tokens[0].start); break; }\n\t\t\t\t\tmultilineVars.clef.stafflines = tokens[0].intt;\n\t\t\t\t\ttokens.shift();\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"staffscale\":\n\t\t\t\t\ttokens.shift();\n\t\t\t\t\tif (tokens.length === 0) { warn(\"Expected = after staffscale\", str, 0); return ret; }\n\t\t\t\t\ttoken = tokens.shift();\n\t\t\t\t\tif (token.token !== \"=\") { warn(\"Expected = after staffscale\", str, token.start); break; }\n\t\t\t\t\tif (tokens.length === 0) { warn(\"Expected parameter after staffscale=\", str, 0); return ret; }\n\t\t\t\t\tif (tokens[0].type !== 'number') { warn(\"Expected number after staffscale\", str, tokens[0].start); break; }\n\t\t\t\t\tmultilineVars.clef.staffscale = tokens[0].floatt;\n\t\t\t\t\ttokens.shift();\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"octave\":\n\t\t\t\t\ttokens.shift();\n\t\t\t\t\tif (tokens.length === 0) { warn(\"Expected = after octave\", str, 0); return ret; }\n\t\t\t\t\ttoken = tokens.shift();\n\t\t\t\t\tif (token.token !== \"=\") { warn(\"Expected = after octave\", str, token.start); break; }\n\t\t\t\t\tif (tokens.length === 0) { warn(\"Expected parameter after octave=\", str, 0); return ret; }\n\t\t\t\t\tif (tokens[0].type !== 'number') { warn(\"Expected number after octave\", str, tokens[0].start); break; }\n\t\t\t\t\tmultilineVars.octave = tokens[0].intt;\n\t\t\t\t\ttokens.shift();\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"style\":\n\t\t\t\t\ttokens.shift();\n\t\t\t\t\tif (tokens.length === 0) { warn(\"Expected = after style\", str, 0); return ret; }\n\t\t\t\t\ttoken = tokens.shift();\n\t\t\t\t\tif (token.token !== \"=\") { warn(\"Expected = after style\", str, token.start); break; }\n\t\t\t\t\tif (tokens.length === 0) { warn(\"Expected parameter after style=\", str, 0); return ret; }\n\t\t\t\t\tswitch (tokens[0].token) {\n\t\t\t\t\t\tcase \"normal\":\n\t\t\t\t\t\tcase \"harmonic\":\n\t\t\t\t\t\tcase \"rhythm\":\n\t\t\t\t\t\tcase \"x\":\n\t\t\t\t\t\tcase \"triangle\":\n\t\t\t\t\t\t\tmultilineVars.style = tokens[0].token;\n\t\t\t\t\t\t\ttokens.shift();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\twarn(\"error parsing style element: \" + tokens[0].token, str, tokens[0].start);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"clef\":\n\t\t\t\t\ttokens.shift();\n\t\t\t\t\tif (tokens.length === 0) { warn(\"Expected = after clef\", str, 0); return ret; }\n\t\t\t\t\ttoken = tokens.shift();\n\t\t\t\t\tif (token.token !== \"=\") { warn(\"Expected = after clef\", str, token.start); break; }\n\t\t\t\t\tif (tokens.length === 0) { warn(\"Expected parameter after clef=\", str, 0); return ret; }\n\t\t\t\t\t//break; yes, we want to fall through. That allows \"clef=\" to be optional.\n\t\t\t\tcase \"treble\":\n\t\t\t\tcase \"bass\":\n\t\t\t\tcase \"alto\":\n\t\t\t\tcase \"tenor\":\n\t\t\t\tcase \"perc\":\n\t\t\t\tcase \"none\":\n\t\t\t\t\t// clef is [clef=] [⟨clef type⟩] [⟨line number⟩] [+8|-8]\n\t\t\t\t\tvar clef = tokens.shift();\n\t\t\t\t\tswitch (clef.token) {\n\t\t\t\t\t\tcase 'treble':\n\t\t\t\t\t\tcase 'tenor':\n\t\t\t\t\t\tcase 'alto':\n\t\t\t\t\t\tcase 'bass':\n\t\t\t\t\t\tcase 'perc':\n\t\t\t\t\t\tcase 'none':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'C': clef.token = 'alto'; break;\n\t\t\t\t\t\tcase 'F': clef.token = 'bass'; break;\n\t\t\t\t\t\tcase 'G': clef.token = 'treble'; break;\n\t\t\t\t\t\tcase 'c': clef.token = 'alto'; break;\n\t\t\t\t\t\tcase 'f': clef.token = 'bass'; break;\n\t\t\t\t\t\tcase 'g': clef.token = 'treble'; break;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\twarn(\"Expected clef name. Found \" + clef.token, str, clef.start);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tif (tokens.length > 0 && tokens[0].type === 'number') {\n\t\t\t\t\t\tclef.token += tokens[0].token;\n\t\t\t\t\t\ttokens.shift();\n\t\t\t\t\t}\n\t\t\t\t\tif (tokens.length > 1 && (tokens[0].token === '-' || tokens[0].token === '+' || tokens[0].token === '^' || tokens[0].token === '_') && tokens[1].token === '8') {\n\t\t\t\t\t\tclef.token += tokens[0].token + tokens[1].token;\n\t\t\t\t\t\ttokens.shift();\n\t\t\t\t\t\ttokens.shift();\n\t\t\t\t\t}\n\t\t\t\t\tmultilineVars.clef = {type: clef.token, verticalPos: calcMiddle(clef.token, 0)};\n\t\t\t\t\tif (multilineVars.currentVoice && multilineVars.currentVoice.transpose !== undefined)\n\t\t\t\t\t\tmultilineVars.clef.transpose = multilineVars.currentVoice.transpose;\n\t\t\t\t\tret.foundClef = true;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\twarn(\"Unknown parameter: \" + tokens[0].token, str, tokens[0].start);\n\t\t\t\t\ttokens.shift();\n\t\t\t}\n\t\t}\n\t\treturn ret;\n\t};\n\n\tvar setCurrentVoice = function(id) {\n\t\tvar currentVoice = multilineVars.voices[id]\n\t\tif (multilineVars.currentVoice) {\n\t\t\tif (multilineVars.currentVoice.index === currentVoice.index && multilineVars.currentVoice.staffNum === currentVoice.staffNum)\n\t\t\t\treturn // there was no change so don't reset it.\n\t\t}\n\t\tmultilineVars.currentVoice = currentVoice;\n\t\treturn tuneBuilder.setCurrentVoice(currentVoice.staffNum, currentVoice.index, id);\n\t};\n\n\tparseKeyVoice.parseVoice = function(line, i, e) {\n\t\t//First truncate the string to the first non-space character after V: through either the\n\t\t//end of the line or a % character. Then remove trailing spaces, too.\n\t\tvar ret = tokenizer.getMeat(line, i, e);\n\t\tvar start = ret.start;\n\t\tvar end = ret.end;\n\t\t//The first thing on the line is the ID. It can be any non-space string and terminates at the\n\t\t//first space.\n\t\tvar id = tokenizer.getToken(line, start, end);\n\t\tif (id.length === 0) {\n\t\t\twarn(\"Expected a voice id\", line, start);\n\t\t\treturn;\n\t\t}\n\t\tvar isNew = false;\n\t\tif (multilineVars.voices[id] === undefined) {\n\t\t\tmultilineVars.voices[id] = {};\n\t\t\tisNew = true;\n\t\t\tif (multilineVars.score_is_present)\n\t\t\t\twarn(\"Can't have an unknown V: id when the %score directive is present\", line, start);\n\t\t}\n\t\tstart += id.length;\n\t\tstart += tokenizer.eatWhiteSpace(line, start);\n\n\t\tvar staffInfo = {startStaff: isNew};\n\t\tvar addNextTokenToStaffInfo = function(name) {\n\t\t\tvar attr = tokenizer.getVoiceToken(line, start, end);\n\t\t\tif (attr.warn !== undefined)\n\t\t\t\twarn(\"Expected value for \" + name + \" in voice: \" + attr.warn, line, start);\n\t\t\telse if (attr.err !== undefined)\n\t\t\t\twarn(\"Expected value for \" + name + \" in voice: \" + attr.err, line, start);\n\t\t\telse if (attr.token.length === 0 && line[start] !== '\"')\n\t\t\t\twarn(\"Expected value for \" + name + \" in voice\", line, start);\n\t\t\telse\n\t\t\t\tstaffInfo[name] = attr.token;\n\t\t\tstart += attr.len;\n\t\t};\n\t\tvar addNextTokenToVoiceInfo = function(id, name, type) {\n\t\t\tvar attr = tokenizer.getVoiceToken(line, start, end);\n\t\t\tif (attr.warn !== undefined)\n\t\t\t\twarn(\"Expected value for \" + name + \" in voice: \" + attr.warn, line, start);\n\t\t\telse if (attr.err !== undefined)\n\t\t\t\twarn(\"Expected value for \" + name + \" in voice: \" + attr.err, line, start);\n\t\t\telse if (attr.token.length === 0 && line[start] !== '\"')\n\t\t\t\twarn(\"Expected value for \" + name + \" in voice\", line, start);\n\t\t\telse {\n\t\t\t\tif (type === 'number')\n\t\t\t\t\tattr.token = parseFloat(attr.token);\n\t\t\t\tmultilineVars.voices[id][name] = attr.token;\n\t\t\t}\n\t\t\tstart += attr.len;\n\t\t};\n\t\tvar getNextToken = function(name, type) {\n\t\t\tvar attr = tokenizer.getVoiceToken(line, start, end);\n\t\t\tif (attr.warn !== undefined)\n\t\t\t\twarn(\"Expected value for \" + name + \" in voice: \" + attr.warn, line, start);\n\t\t\telse if (attr.err !== undefined)\n\t\t\t\twarn(\"Expected value for \" + name + \" in voice: \" + attr.err, line, start);\n\t\t\telse if (attr.token.length === 0 && line[start] !== '\"')\n\t\t\t\twarn(\"Expected value for \" + name + \" in voice\", line, start);\n\t\t\telse {\n\t\t\t\tif (type === 'number')\n\t\t\t\t\tattr.token = parseFloat(attr.token);\n\t\t\t\treturn attr.token;\n\t\t\t}\n\t\t\tstart += attr.len;\n\t\t};\n\t\tvar addNextNoteTokenToVoiceInfo = function(id, name) {\n\t\t\tvar noteToTransposition = {\n\t\t\t\t\"_B\": 2,\n\t\t\t\t\"_E\": 9,\n\t\t\t\t\"_b\": -10,\n\t\t\t\t\"_e\": -3\n\t\t\t};\n\t\t\tvar attr = tokenizer.getVoiceToken(line, start, end);\n\t\t\tif (attr.warn !== undefined)\n\t\t\t\twarn(\"Expected one of (_B, _E, _b, _e) for \" + name + \" in voice: \" + attr.warn, line, start);\n\t\t\telse if (attr.token.length === 0 && line[start] !== '\"')\n\t\t\t\twarn(\"Expected one of (_B, _E, _b, _e) for \" + name + \" in voice\", line, start);\n\t\t\telse {\n\t\t\t\tvar t = noteToTransposition[attr.token];\n\t\t\t\tif (!t)\n\t\t\t\t\twarn(\"Expected one of (_B, _E, _b, _e) for \" + name + \" in voice\", line, start);\n\t\t\t\telse\n\t\t\t\t\tmultilineVars.voices[id][name] = t;\n\t\t\t}\n\t\t\tstart += attr.len;\n\t\t};\n\n\t\t//Then the following items can occur in any order:\n\t\twhile (start < end) {\n\t\t\tvar token = tokenizer.getVoiceToken(line, start, end);\n\t\t\tstart += token.len;\n\n\t\t\tif (token.warn) {\n\t\t\t\twarn(\"Error parsing voice: \" + token.warn, line, start);\n\t\t\t} else {\n\t\t\t\tvar attr = null;\n\t\t\t\tswitch (token.token) {\n\t\t\t\t\tcase 'clef':\n\t\t\t\t\tcase 'cl':\n\t\t\t\t\t\taddNextTokenToStaffInfo('clef');\n\t\t\t\t\t\t// TODO-PER: check for a legal clef; do octavizing\n\t\t\t\t\t\tvar oct = 0;\n\t//\t\t\t\t\t\t\tfor (var ii = 0; ii < staffInfo.clef.length; ii++) {\n\t//\t\t\t\t\t\t\t\tif (staffInfo.clef[ii] === ',') oct -= 7;\n\t//\t\t\t\t\t\t\t\telse if (staffInfo.clef[ii] === \"'\") oct += 7;\n\t//\t\t\t\t\t\t\t}\n\t\t\t\t\t\tif (staffInfo.clef !== undefined) {\n\t\t\t\t\t\t staffInfo.clef = staffInfo.clef.replace(/[',]/g, \"\"); //'//comment for emacs formatting of regexp\n\t\t\t\t\t\t\tif (staffInfo.clef.indexOf('+16') !== -1) {\n\t\t\t\t\t\t\t\toct += 14;\n\t\t\t\t\t\t\t\tstaffInfo.clef = staffInfo.clef.replace('+16', '');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tstaffInfo.verticalPos = calcMiddle(staffInfo.clef, oct);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'treble':\n\t\t\t\t\tcase 'bass':\n\t\t\t\t\tcase 'tenor':\n\t\t\t\t\tcase 'alto':\n\t\t\t\t\tcase 'perc':\n\t\t\t\t\tcase 'none':\n\t\t\t\t\tcase 'treble\\'':\n\t\t\t\t\tcase 'bass\\'':\n\t\t\t\t\tcase 'tenor\\'':\n\t\t\t\t\tcase 'alto\\'':\n\t\t\t\t\tcase 'none\\'':\n\t\t\t\t\tcase 'treble\\'\\'':\n\t\t\t\t\tcase 'bass\\'\\'':\n\t\t\t\t\tcase 'tenor\\'\\'':\n\t\t\t\t\tcase 'alto\\'\\'':\n\t\t\t\t\tcase 'none\\'\\'':\n\t\t\t\t\tcase 'treble,':\n\t\t\t\t\tcase 'bass,':\n\t\t\t\t\tcase 'tenor,':\n\t\t\t\t\tcase 'alto,':\n\t\t\t\t\tcase 'none,':\n\t\t\t\t\tcase 'treble,,':\n\t\t\t\t\tcase 'bass,,':\n\t\t\t\t\tcase 'tenor,,':\n\t\t\t\t\tcase 'alto,,':\n\t\t\t\t\tcase 'none,,':\n\t\t\t\t\t\t// TODO-PER: handle the octave indicators on the clef by changing the middle property\n\t\t\t\t\t\tvar oct2 = 0;\n\t//\t\t\t\t\t\t\tfor (var iii = 0; iii < token.token.length; iii++) {\n\t//\t\t\t\t\t\t\t\tif (token.token[iii] === ',') oct2 -= 7;\n\t//\t\t\t\t\t\t\t\telse if (token.token[iii] === \"'\") oct2 += 7;\n\t//\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t staffInfo.clef = token.token.replace(/[',]/g, \"\"); //'//comment for emacs formatting of regexp\n\t\t\t\t\t\tstaffInfo.verticalPos = calcMiddle(staffInfo.clef, oct2);\n\t\t\t\t\t\tmultilineVars.voices[id].clef = token.token;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'staves':\n\t\t\t\t\tcase 'stave':\n\t\t\t\t\tcase 'stv':\n\t\t\t\t\t\taddNextTokenToStaffInfo('staves');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'brace':\n\t\t\t\t\tcase 'brc':\n\t\t\t\t\t\taddNextTokenToStaffInfo('brace');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'bracket':\n\t\t\t\t\tcase 'brk':\n\t\t\t\t\t\taddNextTokenToStaffInfo('bracket');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'name':\n\t\t\t\t\tcase 'nm':\n\t\t\t\t\t\taddNextTokenToStaffInfo('name');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'subname':\n\t\t\t\t\tcase 'sname':\n\t\t\t\t\tcase 'snm':\n\t\t\t\t\t\taddNextTokenToStaffInfo('subname');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'merge':\n\t\t\t\t\t\tstaffInfo.startStaff = false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'stem':\n\t\t\t\t\tcase 'stems':\n\t\t\t\t\t\tattr = tokenizer.getVoiceToken(line, start, end);\n\t\t\t\t\t\tif (attr.warn !== undefined)\n\t\t\t\t\t\t\twarn(\"Expected value for stems in voice: \" + attr.warn, line, start);\n\t\t\t\t\t\telse if (attr.err !== undefined)\n\t\t\t\t\t\t\twarn(\"Expected value for stems in voice: \" + attr.err, line, start);\n\t\t\t\t\t\telse if (attr.token === 'up' || attr.token === 'down')\n\t\t\t\t\t\t\tmultilineVars.voices[id].stem = attr.token;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\twarn(\"Expected up or down for voice stem\", line, start);\n\t\t\t\t\t\tstart += attr.len;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'up':\n\t\t\t\t\tcase 'down':\n\t\t\t\t\t\tmultilineVars.voices[id].stem = token.token;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'middle':\n\t\t\t\t\tcase 'm':\n\t\t\t\t\t\taddNextTokenToStaffInfo('verticalPos');\n\t\t\t\t\t\tstaffInfo.verticalPos = parseMiddle(staffInfo.verticalPos).mid;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'gchords':\n\t\t\t\t\tcase 'gch':\n\t\t\t\t\t\tmultilineVars.voices[id].suppressChords = true;\n\t\t\t\t\t\t// gchords can stand on its own, or it could be gchords=0.\n\t\t\t\t\t\tattr = tokenizer.getVoiceToken(line, start, end);\n\t\t\t\t\t\tif (attr.token === \"0\")\n\t\t\t\t\t\t\tstart = start + attr.len;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'space':\n\t\t\t\t\tcase 'spc':\n\t\t\t\t\t\taddNextTokenToStaffInfo('spacing');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'scale':\n\t\t\t\t\t\taddNextTokenToVoiceInfo(id, 'scale', 'number');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'score':\n\t\t\t\t\t\taddNextNoteTokenToVoiceInfo(id, 'scoreTranspose');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'transpose':\n\t\t\t\t\t\taddNextTokenToVoiceInfo(id, 'transpose', 'number');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'stafflines':\n\t\t\t\t\t\taddNextTokenToVoiceInfo(id, 'stafflines', 'number');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'staffscale':\n\t\t\t\t\t\t// TODO-PER: This is passed to the engraver, but the engraver ignores it.\n\t\t\t\t\t\taddNextTokenToVoiceInfo(id, 'staffscale', 'number');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'octave':\n\t\t\t\t\t\taddNextTokenToVoiceInfo(id, 'octave', 'number');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'volume':\n\t\t\t\t\t\t// TODO-PER: This is accepted, but not implemented, yet.\n\t\t\t\t\t\taddNextTokenToVoiceInfo(id, 'volume', 'number');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'cue':\n\t\t\t\t\t\t// TODO-PER: This is accepted, but not implemented, yet.\n\t\t\t\t\t\tvar cue = getNextToken('cue', 'string');\n\t\t\t\t\t\tif (cue === 'on')\n\t\t\t\t\t\t\tmultilineVars.voices[id].scale = 0.6;\n\t\t\t\t\t\telse multilineVars.voices[id].scale = 1;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"style\":\n\t\t\t\t\t\tattr = tokenizer.getVoiceToken(line, start, end);\n\t\t\t\t\t\tif (attr.warn !== undefined)\n\t\t\t\t\t\t\twarn(\"Expected value for style in voice: \" + attr.warn, line, start);\n\t\t\t\t\t\telse if (attr.err !== undefined)\n\t\t\t\t\t\t\twarn(\"Expected value for style in voice: \" + attr.err, line, start);\n\t\t\t\t\t\telse if (attr.token === 'normal' || attr.token === 'harmonic' || attr.token === 'rhythm' || attr.token === 'x' || attr.token === 'triangle')\n\t\t\t\t\t\t\tmultilineVars.voices[id].style = attr.token;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\twarn(\"Expected one of [normal, harmonic, rhythm, x, triangle] for voice style\", line, start);\n\t\t\t\t\t\tstart += attr.len;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t// default:\n\t\t\t\t\t// Use this to find V: usages that aren't handled.\n\t\t\t\t\t// \tconsole.log(\"parse voice\", token, tune.metaText.title);\n\t\t\t\t}\n\t\t\t}\n\t\t\tstart += tokenizer.eatWhiteSpace(line, start);\n\t\t}\n\n\t\t// now we've filled up staffInfo, figure out what to do with this voice\n\t\t// TODO-PER: It is unclear from the standard and the examples what to do with brace, bracket, and staves, so they are ignored for now.\n\t\tif (staffInfo.startStaff || multilineVars.staves.length === 0) {\n\t\t\tmultilineVars.staves.push({index: multilineVars.staves.length, meter: multilineVars.origMeter});\n\t\t\tif (!multilineVars.score_is_present)\n\t\t\t\tmultilineVars.staves[multilineVars.staves.length-1].numVoices = 0;\n\t\t}\n\t\tif (multilineVars.voices[id].staffNum === undefined) {\n\t\t\t// store where to write this for quick access later.\n\t\t\tmultilineVars.voices[id].staffNum = multilineVars.staves.length-1;\n\t\t\tvar vi = 0;\n\t\t\tfor(var v in multilineVars.voices) {\n\t\t\t\tif(multilineVars.voices.hasOwnProperty(v)) {\n\t\t\t\t\tif (multilineVars.voices[v].staffNum === multilineVars.voices[id].staffNum)\n\t\t\t\t\t\tvi++;\n\t\t\t\t}\n\t\t\t}\n\t\t\tmultilineVars.voices[id].index = vi-1;\n\t\t}\n\t\tvar s = multilineVars.staves[multilineVars.voices[id].staffNum];\n\t\tif (!multilineVars.score_is_present)\n\t\t\ts.numVoices++;\n\t\tif (staffInfo.clef) s.clef = {type: staffInfo.clef, verticalPos: staffInfo.verticalPos};\n\t\tif (staffInfo.spacing) s.spacing_below_offset = staffInfo.spacing;\n\t\tif (staffInfo.verticalPos) s.verticalPos = staffInfo.verticalPos;\n\n\t\tif (staffInfo.name) {if (s.name) s.name.push(staffInfo.name); else s.name = [ staffInfo.name ];}\n\t\tif (staffInfo.subname) {if (s.subname) s.subname.push(staffInfo.subname); else s.subname = [ staffInfo.subname ];}\n\n\t\treturn setCurrentVoice(id);\n\t};\n\n})();\n\nmodule.exports = parseKeyVoice;\n","// abc_parse_header.js: parses a the header fields from a string representing ABC Music Notation into a usable internal structure.\n\nvar parseCommon = require('./abc_common');\nvar parseDirective = require('./abc_parse_directive');\nvar parseKeyVoice = require('./abc_parse_key_voice');\n\nvar ParseHeader = function(tokenizer, warn, multilineVars, tune, tuneBuilder) {\n\tthis.reset = function(tokenizer, warn, multilineVars, tune) {\n\t\tparseKeyVoice.initialize(tokenizer, warn, multilineVars, tune, tuneBuilder);\n\t\tparseDirective.initialize(tokenizer, warn, multilineVars, tune, tuneBuilder);\n\t};\n\tthis.reset(tokenizer, warn, multilineVars, tune);\n\n\tthis.setTitle = function(title, origSize) {\n\t\tif (multilineVars.hasMainTitle)\n\t\t\ttuneBuilder.addSubtitle(title, { startChar: multilineVars.iChar, endChar: multilineVars.iChar+origSize+2});\t// display secondary title\n\t\telse\n\t\t{\n\t\t\ttuneBuilder.addMetaText(\"title\", title, { startChar: multilineVars.iChar, endChar: multilineVars.iChar+origSize+2});\n\t\t\tmultilineVars.hasMainTitle = true;\n\t\t}\n\t};\n\n\tthis.setMeter = function(line) {\n\t\tline = tokenizer.stripComment(line);\n\t\tif (line === 'C') {\n\t\t\tif (multilineVars.havent_set_length === true) {\n\t\t\t\tmultilineVars.default_length = 0.125;\n\t\t\t\tmultilineVars.havent_set_length = false;\n\t\t\t}\n\t\t\treturn {type: 'common_time'};\n\t\t} else if (line === 'C|') {\n\t\t\tif (multilineVars.havent_set_length === true) {\n\t\t\t\tmultilineVars.default_length = 0.125;\n\t\t\t\tmultilineVars.havent_set_length = false;\n\t\t\t}\n\t\t\treturn {type: 'cut_time'};\n\t\t} else if (line === 'o') {\n\t\t\tif (multilineVars.havent_set_length === true) {\n\t\t\t\tmultilineVars.default_length = 0.125;\n\t\t\t\tmultilineVars.havent_set_length = false;\n\t\t\t}\n\t\t\treturn {type: 'tempus_perfectum'};\n\t\t} else if (line === 'c') {\n\t\t\tif (multilineVars.havent_set_length === true) {\n\t\t\t\tmultilineVars.default_length = 0.125;\n\t\t\t\tmultilineVars.havent_set_length = false;\n\t\t\t}\n\t\t\treturn {type: 'tempus_imperfectum'};\n\t\t} else if (line === 'o.') {\n\t\t\tif (multilineVars.havent_set_length === true) {\n\t\t\t\tmultilineVars.default_length = 0.125;\n\t\t\t\tmultilineVars.havent_set_length = false;\n\t\t\t}\n\t\t\treturn {type: 'tempus_perfectum_prolatio'};\n\t\t} else if (line === 'c.') {\n\t\t\tif (multilineVars.havent_set_length === true) {\n\t\t\t\tmultilineVars.default_length = 0.125;\n\t\t\t\tmultilineVars.havent_set_length = false;\n\t\t\t}\n\t\t\treturn {type: 'tempus_imperfectum_prolatio'};\n\t\t} else if (line.length === 0 || line.toLowerCase() === 'none') {\n\t\t\tif (multilineVars.havent_set_length === true) {\n\t\t\t\tmultilineVars.default_length = 0.125;\n\t\t\t\tmultilineVars.havent_set_length = false;\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvar tokens = tokenizer.tokenize(line, 0, line.length);\n\t\t\t// the form is [open_paren] decimal [ plus|dot decimal ]... [close_paren] slash decimal [plus same_as_before]\n\t\t\ttry {\n\t\t\t\tvar parseNum = function() {\n\t\t\t\t\t// handles this much: [open_paren] decimal [ plus|dot decimal ]... [close_paren]\n\t\t\t\t\tvar ret = {value: 0, num: \"\"};\n\n\t\t\t\t\tvar tok = tokens.shift();\n\t\t\t\t\tif (tok.token === '(')\n\t\t\t\t\t\ttok = tokens.shift();\n\t\t\t\t\twhile (1) {\n\t\t\t\t\t\tif (tok.type !== 'number') throw \"Expected top number of meter\";\n\t\t\t\t\t\tret.value += parseInt(tok.token);\n\t\t\t\t\t\tret.num += tok.token;\n\t\t\t\t\t\tif (tokens.length === 0 || tokens[0].token === '/') return ret;\n\t\t\t\t\t\ttok = tokens.shift();\n\t\t\t\t\t\tif (tok.token === ')') {\n\t\t\t\t\t\t\tif (tokens.length === 0 || tokens[0].token === '/') return ret;\n\t\t\t\t\t\t\tthrow \"Unexpected paren in meter\";\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (tok.token !== '.' && tok.token !== '+') throw \"Expected top number of meter\";\n\t\t\t\t\t\tret.num += tok.token;\n\t\t\t\t\t\tif (tokens.length === 0) throw \"Expected top number of meter\";\n\t\t\t\t\t\ttok = tokens.shift();\n\t\t\t\t\t}\n\t\t\t\t\treturn ret;\t// just to suppress warning\n\t\t\t\t};\n\n\t\t\t\tvar parseFraction = function() {\n\t\t\t\t\t// handles this much: parseNum slash decimal\n\t\t\t\t\tvar ret = parseNum();\n\t\t\t\t\tif (tokens.length === 0) return ret;\n\t\t\t\t\tvar tok = tokens.shift();\n\t\t\t\t\tif (tok.token !== '/') throw \"Expected slash in meter\";\n\t\t\t\t\ttok = tokens.shift();\n\t\t\t\t\tif (tok.type !== 'number') throw \"Expected bottom number of meter\";\n\t\t\t\t\tret.den = tok.token;\n\t\t\t\t\tret.value = ret.value / parseInt(ret.den);\n\t\t\t\t\treturn ret;\n\t\t\t\t};\n\n\t\t\t\tif (tokens.length === 0) throw \"Expected meter definition in M: line\";\n\t\t\t\tvar meter = {type: 'specified', value: [ ]};\n\t\t\t\tvar totalLength = 0;\n\t\t\t\twhile (1) {\n\t\t\t\t\tvar ret = parseFraction();\n\t\t\t\t\ttotalLength += ret.value;\n\t\t\t\t\tvar mv = { num: ret.num };\n\t\t\t\t\tif (ret.den !== undefined)\n\t\t\t\t\t\tmv.den = ret.den;\n\t\t\t\t\tmeter.value.push(mv);\n\t\t\t\t\tif (tokens.length === 0) break;\n\t\t\t\t\t//var tok = tokens.shift();\n\t\t\t\t\t//if (tok.token !== '+') throw \"Extra characters in M: line\";\n\t\t\t\t}\n\n\t\t\t\tif (multilineVars.havent_set_length === true) {\n\t\t\t\t\tmultilineVars.default_length = totalLength < 0.75 ? 0.0625 : 0.125;\n\t\t\t\t\tmultilineVars.havent_set_length = false;\n\t\t\t\t}\n\t\t\t\treturn meter;\n\t\t\t} catch (e) {\n\t\t\t\twarn(e, line, 0);\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t};\n\n\tthis.calcTempo = function(relTempo) {\n\t\tvar dur = 1/4;\n\t\tif (multilineVars.meter && multilineVars.meter.type === 'specified') {\n\t\t\tdur = 1 / parseInt(multilineVars.meter.value[0].den);\n\t\t} else if (multilineVars.origMeter && multilineVars.origMeter.type === 'specified') {\n\t\t\tdur = 1 / parseInt(multilineVars.origMeter.value[0].den);\n\t\t}\n\t\t//var dur = multilineVars.default_length ? multilineVars.default_length : 1;\n\t\tfor (var i = 0; i < relTempo.duration; i++)\n\t\t\trelTempo.duration[i] = dur * relTempo.duration[i];\n\t\treturn relTempo;\n\t};\n\n\tthis.resolveTempo = function() {\n\t\tif (multilineVars.tempo) {\t// If there's a tempo waiting to be resolved\n\t\t\tthis.calcTempo(multilineVars.tempo);\n\t\t\ttune.metaText.tempo = multilineVars.tempo;\n\t\t\tdelete multilineVars.tempo;\n\t\t}\n\t};\n\n\tthis.addUserDefinition = function(line, start, end) {\n\t\tvar equals = line.indexOf('=', start);\n\t\tif (equals === -1) {\n\t\t\twarn(\"Need an = in a macro definition\", line, start);\n\t\t\treturn;\n\t\t}\n\n\t\tvar before = parseCommon.strip(line.substring(start, equals));\n\t\tvar after = parseCommon.strip(line.substring(equals+1));\n\n\t\tif (before.length !== 1) {\n\t\t\twarn(\"Macro definitions can only be one character\", line, start);\n\t\t\treturn;\n\t\t}\n\t\tvar legalChars = \"HIJKLMNOPQRSTUVWXYhijklmnopqrstuvw~\";\n\t\tif (legalChars.indexOf(before) === -1) {\n\t\t\twarn(\"Macro definitions must be H-Y, h-w, or tilde\", line, start);\n\t\t\treturn;\n\t\t}\n\t\tif (after.length === 0) {\n\t\t\twarn(\"Missing macro definition\", line, start);\n\t\t\treturn;\n\t\t}\n\t\tif (multilineVars.macros === undefined)\n\t\t\tmultilineVars.macros = {};\n\t\tmultilineVars.macros[before] = after;\n\t};\n\n\tthis.setDefaultLength = function(line, start, end) {\n\t\tvar len = line.substring(start, end).replace(/ /g, \"\");\n\t\tvar len_arr = len.split('/');\n\t\tif (len_arr.length === 2) {\n\t\t\tvar n = parseInt(len_arr[0]);\n\t\t\tvar d = parseInt(len_arr[1]);\n\t\t\tif (d > 0) {\n\t\t\t\tmultilineVars.default_length = n / d;\t// a whole note is 1\n\t\t\t\tmultilineVars.havent_set_length = false;\n\t\t\t}\n\t\t} else if (len_arr.length === 1 && len_arr[0] === '1') {\n\t\t\tmultilineVars.default_length = 1;\n\t\t\tmultilineVars.havent_set_length = false;\n\t\t}\n\t};\n\n\n\tvar tempoString = {\n\n\t\tlarghissimo: 20,\n\t\tadagissimo: 24,\n\t\tsostenuto: 28,\n\t\tgrave: 32,\n\t\tlargo: 40,\n\t\tlento: 50,\n\t\tlarghetto: 60,\n\t\tadagio: 68,\n\t\tadagietto: 74,\n\t\tandante: 80,\n\t\tandantino: 88,\n\t\t\"marcia moderato\": 84,\n\t\t\"andante moderato\": 100,\n\t\tmoderato: 112,\n\t\tallegretto: 116,\n\t\t\"allegro moderato\": 120,\n\t\tallegro: 126,\n\t\tanimato: 132,\n\t\tagitato: 140,\n\t\tveloce: 148,\n\t\t\"mosso vivo\": 156,\n\t\tvivace: 164,\n\t\tvivacissimo: 172,\n\t\tallegrissimo: 176,\n\t\tpresto: 184,\n\t\tprestissimo: 210,\n\t};\n\n\tthis.setTempo = function(line, start, end, iChar) {\n\t\t//Q - tempo; can be used to specify the notes per minute, e.g. If\n\t\t//the meter denominator is a 4 note then Q:120 or Q:C=120\n\t\t//is 120 quarter notes per minute. Similarly Q:C3=40 would be 40\n\t\t//dotted half notes per minute. An absolute tempo may also be\n\t\t//set, e.g. Q:1/8=120 is 120 eighth notes per minute,\n\t\t//irrespective of the meter's denominator.\n\t\t//\n\t\t// This is either a number, \"C=number\", \"Cnumber=number\", or fraction [fraction...]=number\n\t\t// It depends on the M: field, which may either not be present, or may appear after this.\n\t\t// If M: is not present, an eighth note is used.\n\t\t// That means that this field can't be calculated until the end, if it is the first three types, since we don't know if we'll see an M: field.\n\t\t// So, if it is the fourth type, set it here, otherwise, save the info in the multilineVars.\n\t\t// The temporary variables we keep are the duration and the bpm. In the first two forms, the duration is 1.\n\t\t// In addition, a quoted string may both precede and follow. If a quoted string is present, then the duration part is optional.\n\t\ttry {\n\t\t\tvar tokens = tokenizer.tokenize(line, start, end);\n\n\t\t\tif (tokens.length === 0) throw \"Missing parameter in Q: field\";\n\n\t\t\tvar tempo = { startChar: iChar+start-2, endChar: iChar+end };\n\t\t\tvar delaySet = true;\n\t\t\tvar token = tokens.shift();\n\t\t\tif (token.type === 'quote') {\n\t\t\t\ttempo.preString = token.token;\n\t\t\t\ttoken = tokens.shift();\n\t\t\t\tif (tokens.length === 0) {\t// It's ok to just get a string for the tempo\n\t\t\t\t\t// If the string is a well-known tempo, put in the bpm\n\t\t\t\t\tif (tempoString[tempo.preString.toLowerCase()]) {\n\t\t\t\t\t\ttempo.bpm = tempoString[tempo.preString.toLowerCase()];\n\t\t\t\t\t\ttempo.suppressBpm = true;\n\t\t\t\t\t}\n\t\t\t\t\treturn {type: 'immediate', tempo: tempo};\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (token.type === 'alpha' && token.token === 'C')\t { // either type 2 or type 3\n\t\t\t\tif (tokens.length === 0) throw \"Missing tempo after C in Q: field\";\n\t\t\t\ttoken = tokens.shift();\n\t\t\t\tif (token.type === 'punct' && token.token === '=') {\n\t\t\t\t\t// This is a type 2 format. The duration is an implied 1\n\t\t\t\t\tif (tokens.length === 0) throw \"Missing tempo after = in Q: field\";\n\t\t\t\t\ttoken = tokens.shift();\n\t\t\t\t\tif (token.type !== 'number') throw \"Expected number after = in Q: field\";\n\t\t\t\t\ttempo.duration = [1];\n\t\t\t\t\ttempo.bpm = parseInt(token.token);\n\t\t\t\t} else if (token.type === 'number') {\n\t\t\t\t\t// This is a type 3 format.\n\t\t\t\t\ttempo.duration = [parseInt(token.token)];\n\t\t\t\t\tif (tokens.length === 0) throw \"Missing = after duration in Q: field\";\n\t\t\t\t\ttoken = tokens.shift();\n\t\t\t\t\tif (token.type !== 'punct' || token.token !== '=') throw \"Expected = after duration in Q: field\";\n\t\t\t\t\tif (tokens.length === 0) throw \"Missing tempo after = in Q: field\";\n\t\t\t\t\ttoken = tokens.shift();\n\t\t\t\t\tif (token.type !== 'number') throw \"Expected number after = in Q: field\";\n\t\t\t\t\ttempo.bpm = parseInt(token.token);\n\t\t\t\t} else throw \"Expected number or equal after C in Q: field\";\n\n\t\t\t} else if (token.type === 'number') {\t// either type 1 or type 4\n\t\t\t\tvar num = parseInt(token.token);\n\t\t\t\tif (tokens.length === 0 || tokens[0].type === 'quote') {\n\t\t\t\t\t// This is type 1\n\t\t\t\t\ttempo.duration = [1];\n\t\t\t\t\ttempo.bpm = num;\n\t\t\t\t} else {\t// This is type 4\n\t\t\t\t\tdelaySet = false;\n\t\t\t\t\ttoken = tokens.shift();\n\t\t\t\t\tif (token.type !== 'punct' && token.token !== '/') throw \"Expected fraction in Q: field\";\n\t\t\t\t\ttoken = tokens.shift();\n\t\t\t\t\tif (token.type !== 'number') throw \"Expected fraction in Q: field\";\n\t\t\t\t\tvar den = parseInt(token.token);\n\t\t\t\t\ttempo.duration = [num/den];\n\t\t\t\t\t// We got the first fraction, keep getting more as long as we find them.\n\t\t\t\t\twhile (tokens.length > 0 && tokens[0].token !== '=' && tokens[0].type !== 'quote') {\n\t\t\t\t\t\ttoken = tokens.shift();\n\t\t\t\t\t\tif (token.type !== 'number') throw \"Expected fraction in Q: field\";\n\t\t\t\t\t\tnum = parseInt(token.token);\n\t\t\t\t\t\ttoken = tokens.shift();\n\t\t\t\t\t\tif (token.type !== 'punct' && token.token !== '/') throw \"Expected fraction in Q: field\";\n\t\t\t\t\t\ttoken = tokens.shift();\n\t\t\t\t\t\tif (token.type !== 'number') throw \"Expected fraction in Q: field\";\n\t\t\t\t\t\tden = parseInt(token.token);\n\t\t\t\t\t\ttempo.duration.push(num/den);\n\t\t\t\t\t}\n\t\t\t\t\ttoken = tokens.shift();\n\t\t\t\t\tif (token.type !== 'punct' && token.token !== '=') throw \"Expected = in Q: field\";\n\t\t\t\t\ttoken = tokens.shift();\n\t\t\t\t\tif (token.type !== 'number') throw \"Expected tempo in Q: field\";\n\t\t\t\t\ttempo.bpm = parseInt(token.token);\n\t\t\t\t}\n\t\t\t} else throw \"Unknown value in Q: field\";\n\t\t\tif (tokens.length !== 0) {\n\t\t\t\ttoken = tokens.shift();\n\t\t\t\tif (token.type === 'quote') {\n\t\t\t\t\ttempo.postString = token.token;\n\t\t\t\t\ttoken = tokens.shift();\n\t\t\t\t}\n\t\t\t\tif (tokens.length !== 0) throw \"Unexpected string at end of Q: field\";\n\t\t\t}\n\t\t\tif (multilineVars.printTempo === false)\n\t\t\t\ttempo.suppress = true;\n\t\t\treturn {type: delaySet?'delaySet':'immediate', tempo: tempo};\n\t\t} catch (msg) {\n\t\t\twarn(msg, line, start);\n\t\t\treturn {type: 'none'};\n\t\t}\n\t};\n\n\tthis.letter_to_inline_header = function(line, i, startLine)\n\t{\n\t\tvar needsNewLine = false\n\t\tvar ws = tokenizer.eatWhiteSpace(line, i);\n\t\ti +=ws;\n\t\tif (line.length >= i+5 && line[i] === '[' && line[i+2] === ':') {\n\t\t\tvar e = line.indexOf(']', i);\n\t\t\tvar startChar = multilineVars.iChar + i;\n\t\t\tvar endChar = multilineVars.iChar + e + 1;\n\t\t\tswitch(line.substring(i, i+3))\n\t\t\t{\n\t\t\t\tcase \"[I:\":\n\t\t\t\t\tvar err = parseDirective.addDirective(line.substring(i+3, e));\n\t\t\t\t\tif (err) warn(err, line, i);\n\t\t\t\t\treturn [ e-i+1+ws ];\n\t\t\t\tcase \"[M:\":\n\t\t\t\t\tvar meter = this.setMeter(line.substring(i+3, e));\n\t\t\t\t\tif (tuneBuilder.hasBeginMusic() && meter)\n\t\t\t\t\t\ttuneBuilder.appendStartingElement('meter', startChar, endChar, meter);\n\t\t\t\t\telse\n\t\t\t\t\t\tmultilineVars.meter = meter;\n\t\t\t\t\treturn [ e-i+1+ws ];\n\t\t\t\tcase \"[K:\":\n\t\t\t\t\tvar result = parseKeyVoice.parseKey(line.substring(i+3, e), true);\n\t\t\t\t\tif (result.foundClef && tuneBuilder.hasBeginMusic())\n\t\t\t\t\t\ttuneBuilder.appendStartingElement('clef', startChar, endChar, multilineVars.clef);\n\t\t\t\t\tif (result.foundKey && tuneBuilder.hasBeginMusic())\n\t\t\t\t\t\ttuneBuilder.appendStartingElement('key', startChar, endChar, parseKeyVoice.fixKey(multilineVars.clef, multilineVars.key));\n\t\t\t\t\treturn [ e-i+1+ws ];\n\t\t\t\tcase \"[P:\":\n\t\t\t\t\tvar part = parseDirective.parseFontChangeLine(line.substring(i+3, e))\n\t\t\t\t\tif (startLine || tune.lines.length <= tune.lineNum)\n\t\t\t\t\t\tmultilineVars.partForNextLine = { title: part, startChar: startChar, endChar: endChar };\n\t\t\t\t\telse\n\t\t\t\t\t\ttuneBuilder.appendElement('part', startChar, endChar, {title: part});\n\t\t\t\t\treturn [ e-i+1+ws ];\n\t\t\t\tcase \"[L:\":\n\t\t\t\t\tthis.setDefaultLength(line, i+3, e);\n\t\t\t\t\treturn [ e-i+1+ws ];\n\t\t\t\tcase \"[Q:\":\n\t\t\t\t\tif (e > 0) {\n\t\t\t\t\t\tvar tempo = this.setTempo(line, i+3, e, multilineVars.iChar);\n\t\t\t\t\t\tif (tempo.type === 'delaySet') {\n\t\t\t\t\t\t\tif (tuneBuilder.hasBeginMusic())\n\t\t\t\t\t\t\t\ttuneBuilder.appendElement('tempo', startChar, endChar, this.calcTempo(tempo.tempo));\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tmultilineVars.tempoForNextLine = ['tempo', startChar, endChar, this.calcTempo(tempo.tempo)]\n\t\t\t\t\t\t} else if (tempo.type === 'immediate') {\n\t\t\t\t\t\t\tif (!startLine && tuneBuilder.hasBeginMusic())\n\t\t\t\t\t\t\t\ttuneBuilder.appendElement('tempo', startChar, endChar, tempo.tempo);\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tmultilineVars.tempoForNextLine = ['tempo', startChar, endChar, tempo.tempo]\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn [ e-i+1+ws, line[i+1], line.substring(i+3, e)];\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"[V:\":\n\t\t\t\t\tif (e > 0) {\n\t\t\t\t\t\tneedsNewLine = parseKeyVoice.parseVoice(line, i+3, e);\n\t\t\t\t\t\t//startNewLine();\n\t\t\t\t\t\treturn [ e-i+1+ws, line[i+1], line.substring(i+3, e), needsNewLine];\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"[r:\":\n\t\t\t\t\treturn [ e-i+1+ws ];\n\n\t\t\t\tdefault:\n\t\t\t\t\t// TODO: complain about unhandled header\n\t\t\t}\n\t\t}\n\t\treturn [ 0 ];\n\t};\n\n\tthis.letter_to_body_header = function(line, i)\n\t{\n\t\tvar needsNewLine = false\n\t\tif (line.length >= i+3) {\n\t\t\tswitch(line.substring(i, i+2))\n\t\t\t{\n\t\t\t\tcase \"I:\":\n\t\t\t\t\tvar err = parseDirective.addDirective(line.substring(i+2));\n\t\t\t\t\tif (err) warn(err, line, i);\n\t\t\t\t\treturn [ line.length ];\n\t\t\t\tcase \"M:\":\n\t\t\t\t\tvar meter = this.setMeter(line.substring(i+2));\n\t\t\t\t\tif (tuneBuilder.hasBeginMusic() && meter)\n\t\t\t\t\t\ttuneBuilder.appendStartingElement('meter', multilineVars.iChar + i, multilineVars.iChar + line.length, meter);\n\t\t\t\t\treturn [ line.length ];\n\t\t\t\tcase \"K:\":\n\t\t\t\t\tvar result = parseKeyVoice.parseKey(line.substring(i+2), tuneBuilder.hasBeginMusic());\n\t\t\t\t\tif (result.foundClef && tuneBuilder.hasBeginMusic())\n\t\t\t\t\t\ttuneBuilder.appendStartingElement('clef', multilineVars.iChar + i, multilineVars.iChar + line.length, multilineVars.clef);\n\t\t\t\t\tif (result.foundKey && tuneBuilder.hasBeginMusic())\n\t\t\t\t\t\ttuneBuilder.appendStartingElement('key', multilineVars.iChar + i, multilineVars.iChar + line.length, parseKeyVoice.fixKey(multilineVars.clef, multilineVars.key));\n\t\t\t\t\treturn [ line.length ];\n\t\t\t\tcase \"P:\":\n\t\t\t\t\tif (tuneBuilder.hasBeginMusic())\n\t\t\t\t\t\ttuneBuilder.appendElement('part', multilineVars.iChar + i, multilineVars.iChar + line.length, {title: line.substring(i+2)});\n\t\t\t\t\treturn [ line.length ];\n\t\t\t\tcase \"L:\":\n\t\t\t\t\tthis.setDefaultLength(line, i+2, line.length);\n\t\t\t\t\treturn [ line.length ];\n\t\t\t\tcase \"Q:\":\n\t\t\t\t\tvar e = line.indexOf('\\x12', i+2);\n\t\t\t\t\tif (e === -1) e = line.length;\n\t\t\t\t\tvar tempo = this.setTempo(line, i+2, e, multilineVars.iChar);\n\t\t\t\t\tif (tempo.type === 'delaySet') tuneBuilder.appendElement('tempo', multilineVars.iChar + i, multilineVars.iChar + line.length, this.calcTempo(tempo.tempo));\n\t\t\t\t\telse if (tempo.type === 'immediate') tuneBuilder.appendElement('tempo', multilineVars.iChar + i, multilineVars.iChar + line.length, tempo.tempo);\n\t\t\t\treturn [ e, line[i], parseCommon.strip(line.substring(i+2))];\n\t\t\t\tcase \"V:\":\n\t\t\t\t\tneedsNewLine = parseKeyVoice.parseVoice(line, i+2, line.length);\n//\t\t\t\t\t\tstartNewLine();\n\t\t\t\t\treturn [ line.length, line[i], parseCommon.strip(line.substring(i+2)), needsNewLine];\n\t\t\t\tdefault:\n\t\t\t\t\t// TODO: complain about unhandled header\n\t\t\t}\n\t\t}\n\t\treturn [ 0 ];\n\t};\n\n\tvar metaTextHeaders = {\n\t\tA: 'author',\n\t\tB: 'book',\n\t\tC: 'composer',\n\t\tD: 'discography',\n\t\tF: 'url',\n\t\tG: 'group',\n\t\tI: 'instruction',\n\t\tN: 'notes',\n\t\tO: 'origin',\n\t\tR: 'rhythm',\n\t\tS: 'source',\n\t\tW: 'unalignedWords',\n\t\tZ: 'transcription'\n\t};\n\n\tthis.parseHeader = function(line) {\n\t\tvar field = metaTextHeaders[line[0]];\n\t\tvar origSize = line.length-2\n\t\tvar restOfLine = tokenizer.translateString(tokenizer.stripComment(line.substring(2)))\n\t\tif (field === 'unalignedWords' || field === 'notes') {\n\t\t\t// These fields can be multi-line\n\t\t\ttuneBuilder.addMetaTextArray(field, parseDirective.parseFontChangeLine(restOfLine), { startChar: multilineVars.iChar, endChar: multilineVars.iChar+line.length});\n\t\t} else if (field !== undefined) {\n\t\t\t// these fields are single line\n\t\t\ttuneBuilder.addMetaText(field, parseDirective.parseFontChangeLine(restOfLine), { startChar: multilineVars.iChar, endChar: multilineVars.iChar+line.length});\n\t\t} else {\n\t\t\tvar startChar = multilineVars.iChar;\n\t\t\tvar endChar = startChar + line.length;\n\t\t\tswitch(line[0])\n\t\t\t{\n\t\t\t\tcase 'H':\n\t\t\t\t\t// History is a little different because once it starts it continues until another header field is encountered\n\t\t\t\t\ttuneBuilder.addMetaTextArray(\"history\", parseDirective.parseFontChangeLine(restOfLine), { startChar: multilineVars.iChar, endChar: multilineVars.iChar+line.length});\n\t\t\t\t\tline = tokenizer.peekLine()\n\t\t\t\t\twhile (line && line[1] !== ':') {\n\t\t\t\t\t\ttokenizer.nextLine()\n\t\t\t\t\t\ttuneBuilder.addMetaTextArray(\"history\", parseDirective.parseFontChangeLine(tokenizer.translateString(tokenizer.stripComment(line))), { startChar: multilineVars.iChar, endChar: multilineVars.iChar+line.length});\n\t\t\t\t\t\tline = tokenizer.peekLine()\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'K':\n\t\t\t\t\t// since the key is the last thing that can happen in the header, we can resolve the tempo now\n\t\t\t\t\tthis.resolveTempo();\n\t\t\t\t\tvar result = parseKeyVoice.parseKey(line.substring(2), false);\n\t\t\t\t\tif (!multilineVars.is_in_header && tuneBuilder.hasBeginMusic()) {\n\t\t\t\t\t\tif (result.foundClef)\n\t\t\t\t\t\t\ttuneBuilder.appendStartingElement('clef', startChar, endChar, multilineVars.clef);\n\t\t\t\t\t\tif (result.foundKey)\n\t\t\t\t\t\t\ttuneBuilder.appendStartingElement('key', startChar, endChar, parseKeyVoice.fixKey(multilineVars.clef, multilineVars.key));\n\t\t\t\t\t}\n\t\t\t\t\tmultilineVars.is_in_header = false;\t// The first key signifies the end of the header.\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'L':\n\t\t\t\t\tthis.setDefaultLength(line, 2, line.length);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'M':\n\t\t\t\t\tmultilineVars.origMeter = multilineVars.meter = this.setMeter(line.substring(2));\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'P':\n\t\t\t\t\t// TODO-PER: There is more to do with parts, but the writer doesn't care.\n\t\t\t\t\tif (multilineVars.is_in_header)\n\t\t\t\t\t\ttuneBuilder.addMetaText(\"partOrder\", parseDirective.parseFontChangeLine(restOfLine), { startChar: multilineVars.iChar, endChar: multilineVars.iChar+line.length});\n\t\t\t\t\telse\n\t\t\t\t\t\tmultilineVars.partForNextLine = { title: restOfLine, startChar: startChar, endChar: endChar};\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'Q':\n\t\t\t\t\tvar tempo = this.setTempo(line, 2, line.length, multilineVars.iChar);\n\t\t\t\t\tif (tempo.type === 'delaySet') multilineVars.tempo = tempo.tempo;\n\t\t\t\t\telse if (tempo.type === 'immediate') {\n\t\t\t\t\t\tif (!tune.metaText.tempo)\n\t\t\t\t\t\t\ttune.metaText.tempo = tempo.tempo;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tmultilineVars.tempoForNextLine = ['tempo', startChar, endChar, tempo.tempo]\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'T':\n\t\t\t\t\tif (multilineVars.titlecaps)\n\t\t\t\t\t\trestOfLine = restOfLine.toUpperCase();\t\t\n\t\t\t\t\tthis.setTitle(parseDirective.parseFontChangeLine(tokenizer.theReverser(restOfLine)), origSize);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'U':\n\t\t\t\t\tthis.addUserDefinition(line, 2, line.length);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'V':\n\t\t\t\t\tparseKeyVoice.parseVoice(line, 2, line.length);\n\t\t\t\t\tif (!multilineVars.is_in_header)\n\t\t\t\t\t\treturn {newline: true};\n\t\t\t\t\tbreak;\n\t\t\t\tcase 's':\n\t\t\t\t\treturn {symbols: true};\n\t\t\t\tcase 'w':\n\t\t\t\t\treturn {words: true};\n\t\t\t\tcase 'X':\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'E':\n\t\t\t\tcase 'm':\n\t\t\t\t\twarn(\"Ignored header\", line, 0);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\treturn {regular: true};\n\t\t\t}\n\t\t}\n\t\treturn {};\n\t};\n};\n\nmodule.exports = ParseHeader;\n","module.exports.legalAccents = [\n 'trill',\n 'lowermordent',\n 'uppermordent',\n 'mordent',\n 'pralltriller',\n 'accent',\n 'fermata',\n 'invertedfermata',\n 'tenuto',\n '0',\n '1',\n '2',\n '3',\n '4',\n '5',\n '+',\n 'wedge',\n 'open',\n 'thumb',\n 'snap',\n 'turn',\n 'roll',\n 'breath',\n 'shortphrase',\n 'mediumphrase',\n 'longphrase',\n 'segno',\n 'coda',\n 'D.S.',\n 'D.C.',\n 'fine',\n 'beambr1',\n 'beambr2',\n 'slide',\n 'marcato',\n 'upbow',\n 'downbow',\n '/',\n '//',\n '///',\n '////',\n 'trem1',\n 'trem2',\n 'trem3',\n 'trem4',\n 'turnx',\n 'invertedturn',\n 'invertedturnx',\n 'trill(',\n 'trill)',\n 'arpeggio',\n 'xstem',\n 'mark',\n 'umarcato',\n 'style=normal',\n 'style=harmonic',\n 'style=rhythm',\n 'style=x',\n 'style=triangle',\n 'D.C.alcoda',\n 'D.C.alfine',\n 'D.S.alcoda',\n 'D.S.alfine',\n 'editorial',\n 'courtesy'\n];\n\nmodule.exports.volumeDecorations = [\n 'p',\n 'pp',\n 'f',\n 'ff',\n 'mf',\n 'mp',\n 'ppp',\n 'pppp',\n 'fff',\n 'ffff',\n 'sfz'\n];\n\nmodule.exports.dynamicDecorations = [\n 'crescendo(',\n 'crescendo)',\n 'diminuendo(',\n 'diminuendo)',\n 'glissando(',\n 'glissando)',\n '~(',\n '~)'\n];\n\nmodule.exports.accentPseudonyms = [\n ['<', 'accent'],\n ['>', 'accent'],\n ['tr', 'trill'],\n ['plus', '+'],\n ['emphasis', 'accent'],\n ['^', 'umarcato'],\n ['marcato', 'umarcato']\n];\n\nmodule.exports.accentDynamicPseudonyms = [\n ['<(', 'crescendo('],\n ['<)', 'crescendo)'],\n ['>(', 'diminuendo('],\n ['>)', 'diminuendo)']\n];\n\nmodule.exports.nonDecorations = 'ABCDEFGabcdefgxyzZ[]|^_{'; // use this to prescreen so we don't have to look for a decoration at every note.\n\nmodule.exports.durations = [\n 0.5, 0.75, 0.875, 0.9375, 0.96875, 0.984375, 0.25, 0.375, 0.4375, 0.46875,\n 0.484375, 0.4921875, 0.125, 0.1875, 0.21875, 0.234375, 0.2421875, 0.24609375,\n 0.0625, 0.09375, 0.109375, 0.1171875, 0.12109375, 0.123046875, 0.03125,\n 0.046875, 0.0546875, 0.05859375, 0.060546875, 0.0615234375, 0.015625,\n 0.0234375, 0.02734375, 0.029296875, 0.0302734375, 0.03076171875\n];\n\nmodule.exports.pitches = {\n A: 5,\n B: 6,\n C: 0,\n D: 1,\n E: 2,\n F: 3,\n G: 4,\n a: 12,\n b: 13,\n c: 7,\n d: 8,\n e: 9,\n f: 10,\n g: 11\n};\n\nmodule.exports.rests = {\n x: 'invisible',\n X: 'invisible-multimeasure',\n y: 'spacer',\n z: 'rest',\n Z: 'multimeasure'\n};\n\nmodule.exports.accMap = {\n dblflat: '__',\n flat: '_',\n natural: '=',\n sharp: '^',\n dblsharp: '^^',\n quarterflat: '_/',\n quartersharp: '^/'\n};\n\nmodule.exports.tripletQ = {\n 2: 3,\n 3: 2,\n 4: 3,\n 5: 2, // TODO-PER: not handling 6/8 rhythm yet\n 6: 2,\n 7: 2, // TODO-PER: not handling 6/8 rhythm yet\n 8: 3,\n 9: 2 // TODO-PER: not handling 6/8 rhythm yet\n};\n","var parseKeyVoice = require('./abc_parse_key_voice');\nvar transpose = require('./abc_transpose');\n\nvar tokenizer;\nvar warn;\nvar multilineVars;\nvar tune;\nvar tuneBuilder;\nvar header;\n\nvar {\n legalAccents,\n volumeDecorations,\n dynamicDecorations,\n accentPseudonyms,\n accentDynamicPseudonyms,\n nonDecorations,\n durations,\n pitches,\n rests,\n accMap,\n tripletQ\n} = require('./abc_parse_settings')\n\nvar MusicParser = function(_tokenizer, _warn, _multilineVars, _tune, _tuneBuilder, _header) {\n\ttokenizer = _tokenizer;\n\twarn = _warn;\n\tmultilineVars = _multilineVars;\n\ttune = _tune;\n\ttuneBuilder = _tuneBuilder;\n\theader = _header;\n\tthis.lineContinuation = false;\n}\n\n//\n// Parse line of music\n//\n// This is a stream of <(bar-marking|header|note-group)...> in any order, with optional spaces between each element\n// core-note is <open-slur, accidental, pitch:required, octave, duration, close-slur&|tie> with no spaces within that\n// chord is <open-bracket:required, core-note:required... close-bracket:required duration> with no spaces within that\n// grace-notes is <open-brace:required, (open-slur|core-note:required|close-slur)..., close-brace:required> spaces are allowed\n// note-group is <grace-notes, chord symbols&|decorations..., grace-notes, slur&|triplet, chord|core-note, end-slur|tie> spaces are allowed between items\n// bar-marking is <ampersand> or <chord symbols&|decorations..., bar:required> spaces allowed\n// header is <open-bracket:required, K|M|L|V:required, colon:required, field:required, close-bracket:required> spaces can occur between the colon, in the field, and before the close bracket\n// header can also be the only thing on a line. This is true even if it is a continuation line. In this case the brackets are not required.\n// a space is a back-tick, a space, or a tab. If it is a back-tick, then there is no end-beam.\n\n// Line preprocessing: anything after a % is ignored (the double %% should have been taken care of before this)\n// Then, all leading and trailing spaces are ignored.\n// If there was a line continuation, the \\n was replaced by a \\r and the \\ was replaced by a space. This allows the construct\n// of having a header mid-line conceptually, but actually be at the start of the line. This is equivolent to putting the header in [ ].\n\n// TODO-PER: How to handle ! for line break?\n// TODO-PER: dots before bar, dots before slur\n// TODO-PER: U: redefinable symbols.\n\n// Ambiguous symbols:\n// \"[\" can be the start of a chord, the start of a header element or part of a bar line.\n// --- if it is immediately followed by \"|\", it is a bar line\n// --- if it is immediately followed by K: L: M: V: it is a header (note: there are other headers mentioned in the standard, but I'm not sure how they would be used.)\n// --- otherwise it is the beginning of a chord\n// \"(\" can be the start of a slur or a triplet\n// --- if it is followed by a number from 2-9, then it is a triplet\n// --- otherwise it is a slur\n// \"]\"\n// --- if there is a chord open, then this is the close\n// --- if it is after a [|, then it is an invisible bar line\n// --- otherwise, it is par of a bar\n// \".\" can be a bar modifier or a slur modifier, or a decoration\n// --- if it comes immediately before a bar, it is a bar modifier\n// --- if it comes immediately before a slur, it is a slur modifier\n// --- otherwise it is a decoration for the next note.\n// number:\n// --- if it is after a bar, with no space, it is an ending marker\n// --- if it is after a ( with no space, it is a triplet count\n// --- if it is after a pitch or octave or slash, then it is a duration\n\n// Unambiguous symbols (except inside quoted strings):\n// vertical-bar, colon: part of a bar\n// ABCDEFGabcdefg: pitch\n// xyzZ: rest\n// comma, prime: octave\n// close-paren: end-slur\n// hyphen: tie\n// tilde, v, u, bang, plus, THLMPSO: decoration\n// carat, underscore, equal: accidental\n// ampersand: time reset\n// open-curly, close-curly: grace notes\n// double-quote: chord symbol\n// less-than, greater-than, slash: duration\n// back-tick, space, tab: space\n\nvar isInTie = function(multilineVars, overlayLevel, el) {\n\tif (multilineVars.inTie[overlayLevel] === undefined)\n\t\treturn false;\n\t// If this is single voice music then the voice index isn't set, so we use the first voice.\n\tvar voiceIndex = multilineVars.currentVoice ? multilineVars.currentVoice.staffNum * 100 + multilineVars.currentVoice.index : 0;\n\tif (multilineVars.inTie[overlayLevel][voiceIndex]) {\n\t\tif (el.pitches !== undefined || el.rest.type !== 'spacer')\n\t\t\treturn true;\n\t}\n\treturn false;\n};\n\nvar el = { };\nMusicParser.prototype.parseMusic = function(line) {\n\theader.resolveTempo();\n\t//multilineVars.havent_set_length = false;\t// To late to set this now.\n\tmultilineVars.is_in_header = false;\t// We should have gotten a key header by now, but just in case, this is definitely out of the header.\n\tvar i = 0;\n\tvar startOfLine = multilineVars.iChar;\n\t// see if there is nothing but a comment on this line. If so, just ignore it. A full line comment is optional white space followed by %\n\twhile (tokenizer.isWhiteSpace(line[i]) && i < line.length)\n\t\ti++;\n\tif (i === line.length || line[i] === '%')\n\t\treturn;\n\n\t// Start with the standard staff, clef and key symbols on each line\n\tvar delayStartNewLine = multilineVars.start_new_line;\n\tif (multilineVars.continueall === undefined)\n\t\tmultilineVars.start_new_line = true;\n\telse\n\t\tmultilineVars.start_new_line = false;\n\tvar tripletNotesLeft = 0;\n\n\t// See if the line starts with a header field\n\tvar retHeader = header.letter_to_body_header(line, i);\n\tif (retHeader[0] > 0) {\n\t\ti += retHeader[0];\n\t\t// fixes bug on this: c[V:2]d\n\t\tif (retHeader[1] === 'V')\n\t\t\tthis.startNewLine();\n\t\t\t// delayStartNewLine = true;\n\t\t// TODO-PER: Handle inline headers\n\t}\n\n\tvar overlayLevel = 0;\n\twhile (i < line.length)\n\t{\n\t\tvar startI = i;\n\t\tif (line[i] === '%')\n\t\t\tbreak;\n\n\t\tvar retInlineHeader = header.letter_to_inline_header(line, i, delayStartNewLine);\n\t\tif (retInlineHeader[0] > 0) {\n\t\t\ti += retInlineHeader[0];\n\t\t\t//console.log(\"inline header\", retInlineHeader)\n\t\t\tif (retInlineHeader[1] === 'V')\n\t\t\t\tdelayStartNewLine = true; // fixes bug on this: c[V:2]d\n\t\t\t// TODO-PER: Handle inline headers\n\t\t\t//multilineVars.start_new_line = false;\n\t\t} else {\n\t\t\t// Wait until here to actually start the line because we know we're past the inline statements.\n\t\t\tif (!tuneBuilder.hasBeginMusic() || (delayStartNewLine && !this.lineContinuation)) {\n\t\t\t\tthis.startNewLine();\n\t\t\t\tdelayStartNewLine = false;\n\t\t\t}\n\n\t\t\t// We need to decide if the following characters are a bar-marking or a note-group.\n\t\t\t// Unfortunately, that is ambiguous. Both can contain chord symbols and decorations.\n\t\t\t// If there is a grace note either before or after the chord symbols and decorations, then it is definitely a note-group.\n\t\t\t// If there is a bar marker, it is definitely a bar-marking.\n\t\t\t// If there is either a core-note or chord, it is definitely a note-group.\n\t\t\t// So, loop while we find grace-notes, chords-symbols, or decorations. [It is an error to have more than one grace-note group in a row; the others can be multiple]\n\t\t\t// Then, if there is a grace-note, we know where to go.\n\t\t\t// Else see if we have a chord, core-note, slur, triplet, or bar.\n\n\t\t\tvar ret;\n\t\t\twhile (1) {\n\t\t\t\tret = tokenizer.eatWhiteSpace(line, i);\n\t\t\t\tif (ret > 0) {\n\t\t\t\t\ti += ret;\n\t\t\t\t}\n\t\t\t\tif (i > 0 && line[i-1] === '\\x12') {\n\t\t\t\t\t// there is one case where a line continuation isn't the same as being on the same line, and that is if the next character after it is a header.\n\t\t\t\t\tret = header.letter_to_body_header(line, i);\n\t\t\t\t\tif (ret[0] > 0) {\n\t\t\t\t\t\tif (ret[1] === 'V')\n\t\t\t\t\t\t\tthis.startNewLine(); // fixes bug on this: c\\\\nV:2]\\\\nd\n\t\t\t\t\t\t// TODO: insert header here\n\t\t\t\t\t\ti = ret[0];\n\t\t\t\t\t\tmultilineVars.start_new_line = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// gather all the grace notes, chord symbols and decorations\n\t\t\t\tret = letter_to_spacer(line, i);\n\t\t\t\tif (ret[0] > 0) {\n\t\t\t\t\ti += ret[0];\n\t\t\t\t}\n\n\t\t\t\tret = letter_to_chord(line, i);\n\t\t\t\tif (ret[0] > 0) {\n\t\t\t\t\t// There could be more than one chord here if they have different positions.\n\t\t\t\t\t// If two chords have the same position, then connect them with newline.\n\t\t\t\t\tif (!el.chord)\n\t\t\t\t\t\tel.chord = [];\n\t\t\t\t\tvar chordName = tokenizer.translateString(ret[1]);\n\t\t\t\t\tchordName = chordName.replace(/;/g, \"\\n\");\n\t\t\t\t\tvar addedChord = false;\n\t\t\t\t\tfor (var ci = 0; ci < el.chord.length; ci++) {\n\t\t\t\t\t\tif (el.chord[ci].position === ret[2]) {\n\t\t\t\t\t\t\taddedChord = true;\n\t\t\t\t\t\t\tel.chord[ci].name += \"\\n\" + chordName;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (addedChord === false) {\n\t\t\t\t\t\tif (ret[2] === null && ret[3])\n\t\t\t\t\t\t\tel.chord.push({name: chordName, rel_position: ret[3]});\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tel.chord.push({name: chordName, position: ret[2]});\n\t\t\t\t\t}\n\n\t\t\t\t\ti += ret[0];\n\t\t\t\t\tvar ii = tokenizer.skipWhiteSpace(line.substring(i));\n\t\t\t\t\tif (ii > 0)\n\t\t\t\t\t\tel.force_end_beam_last = true;\n\t\t\t\t\ti += ii;\n\t\t\t\t} else {\n\t\t\t\t\tif (nonDecorations.indexOf(line[i]) === -1)\n\t\t\t\t\t\tret = letter_to_accent(line, i);\n\t\t\t\t\telse ret = [ 0 ];\n\t\t\t\t\tif (ret[0] > 0) {\n\t\t\t\t\t\tif (ret[1] === null) {\n\t\t\t\t\t\t\tif (i + 1 < line.length)\n\t\t\t\t\t\t\t\tthis.startNewLine();\t// There was a ! in the middle of the line. Start a new line if there is anything after it.\n\t\t\t\t\t\t} else if (ret[1].length > 0) {\n\t\t\t\t\t\t\tif (ret[1].indexOf(\"style=\") === 0) {\n\t\t\t\t\t\t\t\tel.style = ret[1].substr(6);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tif (el.decoration === undefined)\n\t\t\t\t\t\t\t\t\tel.decoration = [];\n\t\t\t\t\t\t\t\tif (ret[1] === 'beambr1')\n\t\t\t\t\t\t\t\t\tel.beambr = 1;\n\t\t\t\t\t\t\t\telse if (ret[1] === \"beambr2\")\n\t\t\t\t\t\t\t\t\tel.beambr = 2;\n\t\t\t\t\t\t\t\telse el.decoration.push(ret[1]);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\ti += ret[0];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tret = letter_to_grace(line, i);\n\t\t\t\t\t\t// TODO-PER: Be sure there aren't already grace notes defined. That is an error.\n\t\t\t\t\t\tif (ret[0] > 0) {\n\t\t\t\t\t\t\tel.gracenotes = ret[1];\n\t\t\t\t\t\t\ti += ret[0];\n\t\t\t\t\t\t} else\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tret = letter_to_bar(line, i);\n\t\t\tif (ret[0] > 0) {\n\t\t\t\t// This is definitely a bar\n\t\t\t\toverlayLevel = 0;\n\t\t\t\tif (el.gracenotes !== undefined) {\n\t\t\t\t\t// Attach the grace note to an invisible note\n\t\t\t\t\tel.rest = { type: 'spacer' };\n\t\t\t\t\tel.duration = 0.125; // TODO-PER: I don't think the duration of this matters much, but figure out if it does.\n\t\t\t\t\tmultilineVars.addFormattingOptions(el, tune.formatting, 'note');\n\t\t\t\t\ttuneBuilder.appendElement('note', startOfLine+i, startOfLine+i+ret[0], el);\n\t\t\t\t\tmultilineVars.measureNotEmpty = true;\n\t\t\t\t\tel = {};\n\t\t\t\t}\n\t\t\t\tvar bar = {type: ret[1]};\n\t\t\t\tif (bar.type.length === 0)\n\t\t\t\t\twarn(\"Unknown bar type\", line, i);\n\t\t\t\telse {\n\t\t\t\t\tif (multilineVars.inEnding && bar.type !== 'bar_thin') {\n\t\t\t\t\t\tbar.endEnding = true;\n\t\t\t\t\t\tmultilineVars.inEnding = false;\n\t\t\t\t\t}\n\t\t\t\t\tif (ret[2]) {\n\t\t\t\t\t\tbar.startEnding = ret[2];\n\t\t\t\t\t\tif (multilineVars.inEnding)\n\t\t\t\t\t\t\tbar.endEnding = true;\n\t\t\t\t\t\tmultilineVars.inEnding = true;\n\t\t\t\t\t\tif (ret[1] === \"bar_right_repeat\") {\n\t\t\t\t\t\t\t// restore the tie and slur state from the start repeat\n\t\t\t\t\t\t\tmultilineVars.restoreStartEndingHoldOvers();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// save inTie, inTieChord\n\t\t\t\t\t\t\tmultilineVars.duplicateStartEndingHoldOvers();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (el.decoration !== undefined)\n\t\t\t\t\t\tbar.decoration = el.decoration;\n\t\t\t\t\tif (el.chord !== undefined)\n\t\t\t\t\t\tbar.chord = el.chord;\n\t\t\t\t\tif (bar.startEnding && multilineVars.barFirstEndingNum === undefined)\n\t\t\t\t\t\tmultilineVars.barFirstEndingNum = multilineVars.currBarNumber;\n\t\t\t\t\telse if (bar.startEnding && bar.endEnding && multilineVars.barFirstEndingNum)\n\t\t\t\t\t\tmultilineVars.currBarNumber = multilineVars.barFirstEndingNum;\n\t\t\t\t\telse if (bar.endEnding)\n\t\t\t\t\t\tmultilineVars.barFirstEndingNum = undefined;\n\t\t\t\t\tif (bar.type !== 'bar_invisible' && multilineVars.measureNotEmpty) {\n\t\t\t\t\t\tif (isFirstVoice()) {\n\t\t\t\t\t\t\tmultilineVars.currBarNumber++;\n\t\t\t\t\t\t\tif (multilineVars.barNumbers && multilineVars.currBarNumber % multilineVars.barNumbers === 0)\n\t\t\t\t\t\t\t\tbar.barNumber = multilineVars.currBarNumber;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tmultilineVars.addFormattingOptions(el, tune.formatting, 'bar');\n\t\t\t\t\ttuneBuilder.appendElement('bar', startOfLine+startI, startOfLine+i+ret[0], bar);\n\t\t\t\t\tmultilineVars.measureNotEmpty = false;\n\t\t\t\t\tel = {};\n\t\t\t\t}\n\t\t\t\ti += ret[0];\n\t\t\t} else if (line[i] === '&') {\t// backtrack to beginning of measure\n\t\t\t\tret = letter_to_overlay(line, i);\n\t\t\t\tif (ret[0] > 0) {\n\t\t\t\t\ttuneBuilder.appendElement('overlay', startOfLine, startOfLine+1, {});\n\t\t\t\t\ti += 1;\n\t\t\t\t\toverlayLevel++;\n\t\t\t\t}\n\n\t\t\t} else {\n\t\t\t\t// This is definitely a note group\n\t\t\t\t//\n\t\t\t\t// Look for as many open slurs and triplets as there are. (Note: only the first triplet is valid.)\n\t\t\t\tret = letter_to_open_slurs_and_triplets(line, i);\n\t\t\t\tif (ret.consumed > 0) {\n\t\t\t\t\tif (ret.startSlur !== undefined)\n\t\t\t\t\t\tel.startSlur = ret.startSlur;\n\t\t\t\t\tif (ret.dottedSlur)\n\t\t\t\t\t\tel.dottedSlur = true;\n\t\t\t\t\tif (ret.triplet !== undefined) {\n\t\t\t\t\t\tif (tripletNotesLeft > 0)\n\t\t\t\t\t\t\twarn(\"Can't nest triplets\", line, i);\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tel.startTriplet = ret.triplet;\n\t\t\t\t\t\t\tel.tripletMultiplier = ret.tripletQ / ret.triplet;\n\t\t\t\t\t\t\tel.tripletR = ret.num_notes;\n\t\t\t\t\t\t\ttripletNotesLeft = ret.num_notes === undefined ? ret.triplet : ret.num_notes;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\ti += ret.consumed;\n\t\t\t\t}\n\n\t\t\t\t// handle chords.\n\t\t\t\tif (line[i] === '[') {\n\t\t\t\t\tvar chordStartChar = i;\n\t\t\t\t\ti++;\n\t\t\t\t\tvar chordDuration = null;\n\t\t\t\t\tvar rememberEndBeam = false;\n\n\t\t\t\t\tvar done = false;\n\t\t\t\t\twhile (!done) {\n\t\t\t\t\t\tvar accent = letter_to_accent(line, i);\n\t\t\t\t\t\tif (accent[0] > 0) {\n\t\t\t\t\t\t\ti += accent[0];\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar chordNote = getCoreNote(line, i, {}, false);\n\t\t\t\t\t\tif (chordNote !== null && chordNote.pitch !== undefined) {\n\t\t\t\t\t\t\tif (accent[0] > 0) { // If we found a decoration above, it modifies the entire chord. \"style\" is handled below.\n\t\t\t\t\t\t\t\tif (accent[1].indexOf(\"style=\") !== 0) {\n\t\t\t\t\t\t\t\t\tif (el.decoration === undefined)\n\t\t\t\t\t\t\t\t\t\tel.decoration = [];\n\t\t\t\t\t\t\t\t\tel.decoration.push(accent[1]);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (chordNote.end_beam) {\n\t\t\t\t\t\t\t\tel.end_beam = true;\n\t\t\t\t\t\t\t\tdelete chordNote.end_beam;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (el.pitches === undefined) {\n\t\t\t\t\t\t\t\tel.duration = chordNote.duration;\n\t\t\t\t\t\t\t\tel.pitches = [ chordNote ];\n\t\t\t\t\t\t\t} else\t// Just ignore the note lengths of all but the first note. The standard isn't clear here, but this seems less confusing.\n\t\t\t\t\t\t\t\tel.pitches.push(chordNote);\n\t\t\t\t\t\t\tdelete chordNote.duration;\n\t\t\t\t\t\t\tif (accent[0] > 0) { // If we found a style above, it modifies the individual pitch, not the entire chord.\n\t\t\t\t\t\t\t\tif (accent[1].indexOf(\"style=\") === 0) {\n\t\t\t\t\t\t\t\t\tel.pitches[el.pitches.length-1].style = accent[1].substr(6);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (multilineVars.inTieChord[el.pitches.length]) {\n\t\t\t\t\t\t\t\tchordNote.endTie = true;\n\t\t\t\t\t\t\t\tmultilineVars.inTieChord[el.pitches.length] = undefined;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (chordNote.startTie)\n\t\t\t\t\t\t\t\tmultilineVars.inTieChord[el.pitches.length] = true;\n\n\t\t\t\t\t\t\ti = chordNote.endChar;\n\t\t\t\t\t\t\tdelete chordNote.endChar;\n\t\t\t\t\t\t} else if (line[i] === ' ') {\n\t\t\t\t\t\t\t// Spaces are not allowed in chords, but we can recover from it by ignoring it.\n\t\t\t\t\t\t\twarn(\"Spaces are not allowed in chords\", line, i);\n\t\t\t\t\t\t\ti++;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif (i < line.length && line[i] === ']') {\n\t\t\t\t\t\t\t\t// consume the close bracket\n\t\t\t\t\t\t\t\ti++;\n\n\t\t\t\t\t\t\t\tif (multilineVars.next_note_duration !== 0) {\n\t\t\t\t\t\t\t\t\tel.duration = el.duration * multilineVars.next_note_duration;\n\t\t\t\t\t\t\t\t\tmultilineVars.next_note_duration = 0;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif (isInTie(multilineVars, overlayLevel, el)) {\n\t\t\t\t\t\t\t\t\tel.pitches.forEach(function(pitch) { pitch.endTie = true; });\n\t\t\t\t\t\t\t\t\tsetIsInTie(multilineVars, overlayLevel, false);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif (tripletNotesLeft > 0 && !(el.rest && el.rest.type === \"spacer\")) {\n\t\t\t\t\t\t\t\t\ttripletNotesLeft--;\n\t\t\t\t\t\t\t\t\tif (tripletNotesLeft === 0) {\n\t\t\t\t\t\t\t\t\t\tel.endTriplet = true;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tvar postChordDone = false;\n\t\t\t\t\t\t\t\twhile (i < line.length && !postChordDone) {\n\t\t\t\t\t\t\t\t\tswitch (line[i]) {\n\t\t\t\t\t\t\t\t\t\tcase ' ':\n\t\t\t\t\t\t\t\t\t\tcase '\\t':\n\t\t\t\t\t\t\t\t\t\t\taddEndBeam(el);\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\tcase ')':\n\t\t\t\t\t\t\t\t\t\t\tif (el.endSlur === undefined) el.endSlur = 1; else el.endSlur++;\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\tcase '-':\n\t\t\t\t\t\t\t\t\t\t\tel.pitches.forEach(function(pitch) { pitch.startTie = {}; });\n\t\t\t\t\t\t\t\t\t\t\tsetIsInTie(multilineVars, overlayLevel, true);\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\tcase '>':\n\t\t\t\t\t\t\t\t\t\tcase '<':\n\t\t\t\t\t\t\t\t\t\t\tvar br2 = getBrokenRhythm(line, i);\n\t\t\t\t\t\t\t\t\t\t\ti += br2[0] - 1;\t// index gets incremented below, so we'll let that happen\n\t\t\t\t\t\t\t\t\t\t\tmultilineVars.next_note_duration = br2[2];\n\t\t\t\t\t\t\t\t\t\t\tif (chordDuration)\n\t\t\t\t\t\t\t\t\t\t\t\tchordDuration = chordDuration * br2[1];\n\t\t\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t\t\t\tchordDuration = br2[1];\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\tcase '1':\n\t\t\t\t\t\t\t\t\t\tcase '2':\n\t\t\t\t\t\t\t\t\t\tcase '3':\n\t\t\t\t\t\t\t\t\t\tcase '4':\n\t\t\t\t\t\t\t\t\t\tcase '5':\n\t\t\t\t\t\t\t\t\t\tcase '6':\n\t\t\t\t\t\t\t\t\t\tcase '7':\n\t\t\t\t\t\t\t\t\t\tcase '8':\n\t\t\t\t\t\t\t\t\t\tcase '9':\n\t\t\t\t\t\t\t\t\t\tcase '/':\n\t\t\t\t\t\t\t\t\t\t\tvar fraction = tokenizer.getFraction(line, i);\n\t\t\t\t\t\t\t\t\t\t\tchordDuration = fraction.value;\n\t\t\t\t\t\t\t\t\t\t\ti = fraction.index;\n\t\t\t\t\t\t\t\t\t\t\tvar ch = line[i]\n\t\t\t\t\t\t\t\t\t\t\tif (ch === ' ')\n\t\t\t\t\t\t\t\t\t\t\t\trememberEndBeam = true;\n\t\t\t\t\t\t\t\t\t\t\tif (ch === '-' || ch === ')' || ch === ' ' || ch === '<' || ch === '>')\n\t\t\t\t\t\t\t\t\t\t\t\ti--; // Subtracting one because one is automatically added below\n\t\t\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t\t\t\tpostChordDone = true;\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\tcase '0':\n\t\t\t\t\t\t\t\t\t\t\tchordDuration = 0;\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\t\tpostChordDone = true;\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif (!postChordDone) {\n\t\t\t\t\t\t\t\t\t\ti++;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else\n\t\t\t\t\t\t\t\twarn(\"Expected ']' to end the chords\", line, i);\n\n\t\t\t\t\t\t\tif (el.pitches !== undefined) {\n\t\t\t\t\t\t\t\tif (chordDuration !== null) {\n\t\t\t\t\t\t\t\t\tel.duration = el.duration * chordDuration;\n\t\t\t\t\t\t\t\t\tif (rememberEndBeam)\n\t\t\t\t\t\t\t\t\t\taddEndBeam(el);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tmultilineVars.addFormattingOptions(el, tune.formatting, 'note');\n\t\t\t\t\t\t\t\ttuneBuilder.appendElement('note', startOfLine+startI, startOfLine+i, el);\n\t\t\t\t\t\t\t\tmultilineVars.measureNotEmpty = true;\n\t\t\t\t\t\t\t\tel = {};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tdone = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\t\t\t\t\t// Single pitch\n\t\t\t\t\tvar el2 = {};\n\t\t\t\t\tvar core = getCoreNote(line, i, el2, true);\n\t\t\t\t\tif (el2.endTie !== undefined) setIsInTie(multilineVars, overlayLevel, true);\n\t\t\t\t\tif (core !== null) {\n\t\t\t\t\t\tif (core.pitch !== undefined) {\n\t\t\t\t\t\t\tel.pitches = [ { } ];\n\t\t\t\t\t\t\t// TODO-PER: straighten this out so there is not so much copying: getCoreNote shouldn't change e'\n\t\t\t\t\t\t\tif (core.accidental !== undefined) el.pitches[0].accidental = core.accidental;\n\t\t\t\t\t\t\tel.pitches[0].pitch = core.pitch;\n\t\t\t\t\t\t\tel.pitches[0].name = core.name;\n\t\t\t\t\t\t\tif (core.midipitch || core.midipitch === 0)\n\t\t\t\t\t\t\t\tel.pitches[0].midipitch = core.midipitch;\n\t\t\t\t\t\t\tif (core.endSlur !== undefined) el.pitches[0].endSlur = core.endSlur;\n\t\t\t\t\t\t\tif (core.endTie !== undefined) el.pitches[0].endTie = core.endTie;\n\t\t\t\t\t\t\tif (core.startSlur !== undefined) el.pitches[0].startSlur = core.startSlur;\n\t\t\t\t\t\t\tif (el.startSlur !== undefined) el.pitches[0].startSlur = el.startSlur;\n\t\t\t\t\t\t\tif (el.dottedSlur !== undefined) el.pitches[0].dottedSlur = true;\n\t\t\t\t\t\t\tif (core.startTie !== undefined) el.pitches[0].startTie = core.startTie;\n\t\t\t\t\t\t\tif (el.startTie !== undefined) el.pitches[0].startTie = el.startTie;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tel.rest = core.rest;\n\t\t\t\t\t\t\tif (core.rest.type === 'multimeasure' && isFirstVoice())\n\t\t\t\t\t\t\t\tmultilineVars.currBarNumber += core.rest.text - 1 // The minus one is because the measure with the rest is already counted once normally.\n\t\t\t\t\t\t\tif (core.endSlur !== undefined) el.endSlur = core.endSlur;\n\t\t\t\t\t\t\tif (core.endTie !== undefined) el.rest.endTie = core.endTie;\n\t\t\t\t\t\t\tif (core.startSlur !== undefined) el.startSlur = core.startSlur;\n\t\t\t\t\t\t\tif (core.startTie !== undefined) el.rest.startTie = core.startTie;\n\t\t\t\t\t\t\tif (el.startTie !== undefined) el.rest.startTie = el.startTie;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (core.chord !== undefined) el.chord = core.chord;\n\t\t\t\t\t\tif (core.duration !== undefined) el.duration = core.duration;\n\t\t\t\t\t\tif (core.decoration !== undefined) el.decoration = core.decoration;\n\t\t\t\t\t\tif (core.graceNotes !== undefined) el.graceNotes = core.graceNotes;\n\t\t\t\t\t\tdelete el.startSlur;\n\t\t\t\t\t\tdelete el.dottedSlur;\n\t\t\t\t\t\tif (isInTie(multilineVars, overlayLevel, el)) {\n\t\t\t\t\t\t\tif (el.pitches !== undefined) {\n\t\t\t\t\t\t\t\tel.pitches[0].endTie = true;\n\t\t\t\t\t\t\t} else if (el.rest.type !== 'spacer') {\n\t\t\t\t\t\t\t\tel.rest.endTie = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tsetIsInTie(multilineVars, overlayLevel, false);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (core.startTie || el.startTie)\n\t\t\t\t\t\t\tsetIsInTie(multilineVars, overlayLevel, true);\n\t\t\t\t\t\ti = core.endChar;\n\n\t\t\t\t\t\tif (tripletNotesLeft > 0 && !(core.rest && core.rest.type === \"spacer\")) {\n\t\t\t\t\t\t\ttripletNotesLeft--;\n\t\t\t\t\t\t\tif (tripletNotesLeft === 0) {\n\t\t\t\t\t\t\t\tel.endTriplet = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (core.end_beam)\n\t\t\t\t\t\t\taddEndBeam(el);\n\n\t\t\t\t\t\t// If there is a whole rest, then it should be the duration of the measure, not it's own duration. We need to special case it.\n\t\t\t\t\t\t// If the time signature length is greater than 4/4, though, then a whole rest has no special treatment.\n\t\t\t\t\t\tif (el.rest && el.rest.type === 'rest' && el.duration === 1 && durationOfMeasure(multilineVars) <= 1) {\n\t\t\t\t\t\t\tel.rest.type = 'whole';\n\n\t\t\t\t\t\t\tel.duration = durationOfMeasure(multilineVars);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Create a warning if this is not a displayable duration.\n\t\t\t\t\t\t// The first item on a line is a regular note value, each item after that represents a dot placed after the previous note.\n\t\t\t\t\t\t// Only durations less than a whole note are tested because whole note durations have some tricky rules.\n\n\t\t\t\t\t\tif (el.duration < 1 && durations.indexOf(el.duration) === -1 && el.duration !== 0) {\n\t\t\t\t\t\t\tif (!el.rest || el.rest.type !== 'spacer')\n\t\t\t\t\t\t\t\twarn(\"Duration not representable: \" + line.substring(startI, i), line, i);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmultilineVars.addFormattingOptions(el, tune.formatting, 'note');\n\t\t\t\t\t\tvar succeeded = tuneBuilder.appendElement('note', startOfLine+startI, startOfLine+i, el);\n\t\t\t\t\t\tif (!succeeded) {\n\t\t\t\t\t\t\tthis.startNewLine()\n\t\t\t\t\t\t\ttuneBuilder.appendElement('note', startOfLine+startI, startOfLine+i, el);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmultilineVars.measureNotEmpty = true;\n\t\t\t\t\t\tel = {};\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (i === startI) {\t// don't know what this is, so ignore it.\n\t\t\t\t\tif (line[i] !== ' ' && line[i] !== '`')\n\t\t\t\t\t\twarn(\"Unknown character ignored\", line, i);\n\t\t\t\t\ti++;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tthis.lineContinuation = line.indexOf('\\x12') >= 0 || (retHeader[0] > 0)\n\tif (!this.lineContinuation) { el = { } }\n};\n\nvar setIsInTie =function(multilineVars, overlayLevel, value) {\n\t// If this is single voice music then the voice index isn't set, so we use the first voice.\n\tvar voiceIndex = multilineVars.currentVoice ? multilineVars.currentVoice.staffNum * 100 + multilineVars.currentVoice.index : 0;\n\tif (multilineVars.inTie[overlayLevel] === undefined)\n\t\tmultilineVars.inTie[overlayLevel] = [];\n\tmultilineVars.inTie[overlayLevel][voiceIndex] = value;\n};\n\nvar letter_to_chord = function(line, i) {\n\tif (line[i] === '\"')\n\t{\n\t\tvar chord = tokenizer.getBrackettedSubstring(line, i, 5);\n\t\tif (!chord[2])\n\t\t\twarn(\"Missing the closing quote while parsing the chord symbol\", line , i);\n\t\t// If it starts with ^, then the chord appears above.\n\t\t// If it starts with _ then the chord appears below.\n\t\t// (note that the 2.0 draft standard defines them as not chords, but annotations and also defines @.)\n\t\tif (chord[0] > 0 && chord[1].length > 0 && chord[1][0] === '^') {\n\t\t\tchord[1] = chord[1].substring(1);\n\t\t\tchord[2] = 'above';\n\t\t} else if (chord[0] > 0 && chord[1].length > 0 && chord[1][0] === '_') {\n\t\t\tchord[1] = chord[1].substring(1);\n\t\t\tchord[2] = 'below';\n\t\t} else if (chord[0] > 0 && chord[1].length > 0 && chord[1][0] === '<') {\n\t\t\tchord[1] = chord[1].substring(1);\n\t\t\tchord[2] = 'left';\n\t\t} else if (chord[0] > 0 && chord[1].length > 0 && chord[1][0] === '>') {\n\t\t\tchord[1] = chord[1].substring(1);\n\t\t\tchord[2] = 'right';\n\t\t} else if (chord[0] > 0 && chord[1].length > 0 && chord[1][0] === '@') {\n\t\t // @-15,5.7\t\t\n\t\t chord[1] = chord[1].substring(1);\n\t\t var x = tokenizer.getFloat(chord[1]);\n\t\t if (x.digits === 0){\n\t\t\twarn(\"Missing first position in absolutely positioned annotation.\", line, i);\n\t\t\tchord[1] = chord[1].replace(\"@\",\"\");\n\t\t\tchord[2] = 'above';\n\t\t\treturn chord;\n\t\t }\n\t\t chord[1] = chord[1].substring(x.digits);\n\t\t if (chord[1][0] !== ','){\n\t\t\twarn(\"Missing comma absolutely positioned annotation.\", line, i);\n\t\t\tchord[1] = chord[1].replace(\"@\",\"\");\n\t\t\tchord[2] = 'above';\n\t\t\treturn chord;\n\t\t }\n\t\t chord[1] = chord[1].substring(1);\n\t\t var y = tokenizer.getFloat(chord[1]);\n\t\t if (y.digits === 0){\n\t\t\twarn(\"Missing second position in absolutely positioned annotation.\", line, i);\n\t\t\tchord[1] = chord[1].replace(\"@\",\"\");\n\t\t\tchord[2] = 'above';\n\t\t\treturn chord;\n\t\t }\n\t\t chord[1] = chord[1].substring(y.digits);\n\t\t var ws = tokenizer.skipWhiteSpace(chord[1]);\n\t\t chord[1] = chord[1].substring(ws);\n\t\t chord[2] = null;\n\t\t chord[3] = {\n\t\t\tx: x.value,\n\t\t\ty: y.value\n\t\t };\t\n\t\t} else {\n\t\t\tif (multilineVars.freegchord !== true) {\n\t\t\t\tchord[1] = chord[1].replace(/([ABCDEFG0-9])b/g, \"$1♭\");\n\t\t\t\tchord[1] = chord[1].replace(/([ABCDEFG0-9])#/g, \"$1♯\");\n\t\t\t\tchord[1] = chord[1].replace(/^([ABCDEFG])([♯♭]?)o([^A-Za-z])/g, \"$1$2°$3\");\n\t\t\t\tchord[1] = chord[1].replace(/^([ABCDEFG])([♯♭]?)o$/g, \"$1$2°\");\n\t\t\t\tchord[1] = chord[1].replace(/^([ABCDEFG])([♯♭]?)0([^A-Za-z])/g, \"$1$2ø$3\");\n\t\t\t\tchord[1] = chord[1].replace(/^([ABCDEFG])([♯♭]?)\\^([^A-Za-z])/g, \"$1$2∆$3\");\n\t\t\t}\n\t\t\tchord[2] = 'default';\n\t\t\tchord[1] = transpose.chordName(multilineVars, chord[1]);\n\t\t}\n\t\treturn chord;\n\t}\n\treturn [0, \"\"];\n};\n\nvar letter_to_grace = function(line, i) {\n\t// Grace notes are an array of: startslur, note, endslur, space; where note is accidental, pitch, duration\n\tif (line[i] === '{') {\n\t\t// fetch the gracenotes string and consume that into the array\n\t\tvar gra = tokenizer.getBrackettedSubstring(line, i, 1, '}');\n\t\tif (!gra[2])\n\t\t\twarn(\"Missing the closing '}' while parsing grace note\", line, i);\n\t\t// If there is a slur after the grace construction, then move it to the last note inside the grace construction\n\t\tif (line[i+gra[0]] === ')') {\n\t\t\tgra[0]++;\n\t\t\tgra[1] += ')';\n\t\t}\n\n\t\tvar gracenotes = [];\n\t\tvar ii = 0;\n\t\tvar inTie = false;\n\t\twhile (ii < gra[1].length) {\n\t\t\tvar acciaccatura = false;\n\t\t\tif (gra[1][ii] === '/') {\n\t\t\t\tacciaccatura = true;\n\t\t\t\tii++;\n\t\t\t}\n\t\t\tvar note = getCoreNote(gra[1], ii, {}, false);\n\t\t\tif (note !== null) {\n\t\t\t\t// The grace note durations should not be affected by the default length: they should be based on 1/16, so if that isn't the default, then multiply here.\n\t\t\t\tnote.duration = note.duration / (multilineVars.default_length * 8);\n\t\t\t\tif (acciaccatura)\n\t\t\t\t\tnote.acciaccatura = true;\n\t\t\t\tif (note.rest) {\n\t\t\t\t\t// don't allow rests inside gracenotes\n\t\t\t\t\twarn(\"Rests not allowed as grace notes '\" + gra[1][ii] + \"' while parsing grace note\", line, i);\n\t\t\t\t} else\n\t\t\t\t\tgracenotes.push(note);\n\n\t\t\t\tif (inTie) {\n\t\t\t\t\tnote.endTie = true;\n\t\t\t\t\tinTie = false;\n\t\t\t\t}\n\t\t\t\tif (note.startTie)\n\t\t\t\t\tinTie = true;\n\n\t\t\t\tii = note.endChar;\n\t\t\t\tdelete note.endChar;\n\n\t\t\t\tif (note.end_beam) {\n\t\t\t\t\tnote.endBeam = true;\n\t\t\t\t\tdelete note.end_beam;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// We shouldn't get anything but notes or a space here, so report an error\n\t\t\t\tif (gra[1][ii] === ' ') {\n\t\t\t\t\tif (gracenotes.length > 0)\n\t\t\t\t\t\tgracenotes[gracenotes.length-1].endBeam = true;\n\t\t\t\t} else\n\t\t\t\t\twarn(\"Unknown character '\" + gra[1][ii] + \"' while parsing grace note\", line, i);\n\t\t\t\tii++;\n\t\t\t}\n\t\t}\n\t\tif (gracenotes.length)\n\t\t\treturn [gra[0], gracenotes];\n\t}\n\treturn [ 0 ];\n};\n\nfunction letter_to_overlay(line, i) {\n\tif (line[i] === '&') {\n\t\tvar start = i;\n\t\twhile (line[i] && line[i] !== ':' && line[i] !== '|')\n\t\t\ti++;\n\t\treturn [ i-start, line.substring(start+1, i) ];\n\t}\n\treturn [ 0 ];\n}\n\nfunction durationOfMeasure(multilineVars) {\n\t// TODO-PER: This could be more complicated if one of the unusual measures is used.\n\tvar meter = multilineVars.origMeter;\n\tif (!meter || meter.type !== 'specified')\n\t\treturn 1;\n\tif (!meter.value || meter.value.length === 0)\n\t\treturn 1;\n\treturn parseInt(meter.value[0].num, 10) / parseInt(meter.value[0].den, 10);\n}\n\n\n\n\nvar letter_to_accent = function(line, i) {\n\tvar macro = multilineVars.macros[line[i]];\n\n\tif (macro !== undefined) {\n\t\tif (macro[0] === '!' || macro[0] === '+')\n\t\t\tmacro = macro.substring(1);\n\t\tif (macro[macro.length-1] === '!' || macro[macro.length-1] === '+')\n\t\t\tmacro = macro.substring(0, macro.length-1);\n\t\tif (legalAccents.includes(macro))\n\t\t\treturn [ 1, macro ];\n\t\telse if (volumeDecorations.includes(macro)) {\n\t\t\tif (multilineVars.volumePosition === 'hidden')\n\t\t\t\tmacro = \"\";\n\t\t\treturn [1, macro];\n\t\t} else if (dynamicDecorations.includes(macro)) {\n\t\t\tif (multilineVars.dynamicPosition === 'hidden')\n\t\t\t\tmacro = \"\";\n\t\t\treturn [1, macro];\n\t\t} else {\n\t\t\tif (!multilineVars.ignoredDecorations.includes(macro))\n\t\t\t\twarn(\"Unknown macro: \" + macro, line, i);\n\t\t\treturn [1, '' ];\n\t\t}\n\t}\n\tswitch (line[i])\n\t{\n\t\tcase '.':\n\t\t\tif (line[i+1] === '(' || line[i+1] === '-') // a dot then open paren is a dotted slur; likewise dot dash is dotted tie.\n\t\t\t\tbreak;\n\t\t\treturn [1, 'staccato'];\n\t\tcase 'u':return [1, 'upbow'];\n\t\tcase 'v':return [1, 'downbow'];\n\t\tcase '~':return [1, 'irishroll'];\n\t\tcase '!':\n\t\tcase '+':\n\t\t\tvar ret = tokenizer.getBrackettedSubstring(line, i, 5);\n\t\t\t// Be sure that the accent is recognizable.\n\t\t\tif (ret[1].length > 1 && (ret[1][0] === '^' || ret[1][0] ==='_'))\n\t\t\t\tret[1] = ret[1].substring(1);\t// TODO-PER: The test files have indicators forcing the ornament to the top or bottom, but that isn't in the standard. We'll just ignore them.\n\t\t\tif (legalAccents.includes(ret[1]))\n\t\t\t\treturn ret;\n\t\t\tif (volumeDecorations.includes(ret[1])) {\n\t\t\t\tif (multilineVars.volumePosition === 'hidden' )\n\t\t\t\t\tret[1] = '';\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t\tif (dynamicDecorations.includes(ret[1])) {\n\t\t\t\tif (multilineVars.dynamicPosition === 'hidden' )\n\t\t\t\t\tret[1] = '';\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\tvar ind = accentPseudonyms.findIndex(function (acc) { return ret[1] === acc[0]})\n\t\t\tif (ind >= 0) {\n\t\t\t\tret[1] = accentPseudonyms[ind][1];\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\tind = accentDynamicPseudonyms.findIndex(function (acc) { return ret[1] === acc[0]})\n\t\t\tif (ind >= 0) {\n\t\t\t\tret[1] = accentDynamicPseudonyms[ind][1];\n\t\t\t\tif (multilineVars.dynamicPosition === 'hidden' )\n\t\t\t\t\tret[1] = '';\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// We didn't find the accent in the list, so consume the space, but don't return an accent.\n\t\t\t// Although it is possible that ! was used as a line break, so accept that.\n\t\t\tif (line[i] === '!' && (ret[0] === 1 || line[i+ret[0]-1] !== '!'))\n\t\t\t\treturn [1, null ];\n\t\t\twarn(\"Unknown decoration: \" + ret[1], line, i);\n\t\t\tret[1] = \"\";\n\t\t\treturn ret;\n\t\tcase 'H':return [1, 'fermata'];\n\t\tcase 'J':return [1, 'slide'];\n\t\tcase 'L':return [1, 'accent'];\n\t\tcase 'M':return [1, 'mordent'];\n\t\tcase 'O':return[1, 'coda'];\n\t\tcase 'P':return[1, 'pralltriller'];\n\t\tcase 'R':return [1, 'roll'];\n\t\tcase 'S':return [1, 'segno'];\n\t\tcase 'T':return [1, 'trill'];\n\t}\n\treturn [0, 0];\n};\n\nvar letter_to_spacer = function(line, i) {\n\tvar start = i;\n\twhile (tokenizer.isWhiteSpace(line[i]))\n\t\ti++;\n\treturn [ i-start ];\n};\n\n// returns the class of the bar line\n// the number of the repeat\n// and the number of characters used up\n// if 0 is returned, then the next element was not a bar line\nvar letter_to_bar = function(line, curr_pos) {\n\tvar ret = tokenizer.getBarLine(line, curr_pos);\n\tif (ret.len === 0)\n\t\treturn [0,\"\"];\n\tif (ret.warn) {\n\t\twarn(ret.warn, line, curr_pos);\n\t\treturn [ret.len,\"\"];\n\t}\n\n\t// Now see if this is a repeated ending\n\t// A repeated ending is all of the characters 1,2,3,4,5,6,7,8,9,0,-, and comma\n\t// It can also optionally start with '[', which is ignored.\n\t// Also, it can have white space before the '['.\n\tfor (var ws = 0; ws < line.length; ws++)\n\t\tif (line[curr_pos + ret.len + ws] !== ' ')\n\t\t\tbreak;\n\tvar orig_bar_len = ret.len;\n\tif (line[curr_pos+ret.len+ws] === '[') {\n\t\tret.len += ws + 1;\n\t}\n\n\t// It can also be a quoted string. It is unclear whether that construct requires '[', but it seems like it would. otherwise it would be confused with a regular chord.\n\tif (line[curr_pos+ret.len] === '\"' && line[curr_pos+ret.len-1] === '[') {\n\t\tvar ending = tokenizer.getBrackettedSubstring(line, curr_pos+ret.len, 5);\n\t\treturn [ret.len+ending[0], ret.token, ending[1]];\n\t}\n\tvar retRep = tokenizer.getTokenOf(line.substring(curr_pos+ret.len), \"1234567890-,\");\n\tif (retRep.len === 0 || retRep.token[0] === '-')\n\t\treturn [orig_bar_len, ret.token];\n\n\treturn [ret.len+retRep.len, ret.token, retRep.token];\n};\n\nvar letter_to_open_slurs_and_triplets = function(line, i) {\n\t// consume spaces, and look for all the open parens. If there is a number after the open paren,\n\t// that is a triplet. Otherwise that is a slur. Collect all the slurs and the first triplet.\n\tvar ret = {};\n\tvar start = i;\n\tif (line[i] === '.' && line[i+1] === '(') {\n\t\tret.dottedSlur = true;\n\t\ti++;\n\t}\n\twhile (line[i] === '(' || tokenizer.isWhiteSpace(line[i])) {\n\t\tif (line[i] === '(') {\n\t\t\tif (i+1 < line.length && (line[i+1] >= '2' && line[i+1] <= '9')) {\n\t\t\t\tif (ret.triplet !== undefined)\n\t\t\t\t\twarn(\"Can't nest triplets\", line, i);\n\t\t\t\telse {\n\t\t\t\t\tret.triplet = line[i+1] - '0';\n\t\t\t\t\tret.tripletQ = tripletQ[ret.triplet];\n\t\t\t\t\tret.num_notes = ret.triplet;\n\t\t\t\t\tif (i+2 < line.length && line[i+2] === ':') {\n\t\t\t\t\t\t// We are expecting \"(p:q:r\" or \"(p:q\" or \"(p::r\"\n\t\t\t\t\t\t// That is: \"put p notes into the time of q for the next r notes\"\n\t\t\t\t\t\t// if r is missing, then it is equal to p.\n\t\t\t\t\t\t// if q is missing, it is determined from this table:\n\t\t\t\t\t\t// (2 notes in the time of 3\n\t\t\t\t\t\t// (3 notes in the time of 2\n\t\t\t\t\t\t// (4 notes in the time of 3\n\t\t\t\t\t\t// (5 notes in the time of n | if time sig is (6/8, 9/8, 12/8), n=3, else n=2\n\t\t\t\t\t\t// (6 notes in the time of 2\n\t\t\t\t\t\t// (7 notes in the time of n\n\t\t\t\t\t\t// (8 notes in the time of 3\n\t\t\t\t\t\t// (9 notes in the time of n\n\t\t\t\t\t\tif (i+3 < line.length && line[i+3] === ':') {\n\t\t\t\t\t\t\t// The second number, 'q', is not present.\n\t\t\t\t\t\t\tif (i+4 < line.length && (line[i+4] >= '1' && line[i+4] <= '9')) {\n\t\t\t\t\t\t\t\tret.num_notes = line[i+4] - '0';\n\t\t\t\t\t\t\t\ti += 3;\n\t\t\t\t\t\t\t} else\n\t\t\t\t\t\t\t\twarn(\"expected number after the two colons after the triplet to mark the duration\", line, i);\n\t\t\t\t\t\t} else if (i+3 < line.length && (line[i+3] >= '1' && line[i+3] <= '9')) {\n\t\t\t\t\t\t\tret.tripletQ = line[i+3] - '0';\n\t\t\t\t\t\t\tif (i+4 < line.length && line[i+4] === ':') {\n\t\t\t\t\t\t\t\tif (i+5 < line.length && (line[i+5] >= '1' && line[i+5] <= '9')) {\n\t\t\t\t\t\t\t\t\tret.num_notes = line[i+5] - '0';\n\t\t\t\t\t\t\t\t\ti += 4;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\ti += 2;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else\n\t\t\t\t\t\t\twarn(\"expected number after the triplet to mark the duration\", line, i);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\ti++;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (ret.startSlur === undefined)\n\t\t\t\t\tret.startSlur = 1;\n\t\t\t\telse\n\t\t\t\t\tret.startSlur++;\n\t\t\t}\n\t\t}\n\t\ti++;\n\t}\n\tret.consumed = i-start;\n\treturn ret;\n};\n\nMusicParser.prototype.startNewLine = function() {\n\tvar params = { startChar: -1, endChar: -1};\n\tif (multilineVars.partForNextLine.title)\n\t\tparams.part = multilineVars.partForNextLine;\n\tparams.clef = multilineVars.currentVoice && multilineVars.staves[multilineVars.currentVoice.staffNum].clef !== undefined ? Object.assign({},multilineVars.staves[multilineVars.currentVoice.staffNum].clef) : Object.assign({},multilineVars.clef);\n\tvar scoreTranspose = multilineVars.currentVoice ? multilineVars.currentVoice.scoreTranspose : 0;\n\tparams.key = parseKeyVoice.standardKey(multilineVars.key.root+multilineVars.key.acc+multilineVars.key.mode, multilineVars.key.root, multilineVars.key.acc, scoreTranspose);\n\tparams.key.mode = multilineVars.key.mode;\n\tif (multilineVars.key.impliedNaturals)\n\t\tparams.key.impliedNaturals = multilineVars.key.impliedNaturals;\n\tif (multilineVars.key.explicitAccidentals) {\n\t\tfor (var i = 0; i < multilineVars.key.explicitAccidentals.length; i++) {\n\t\t\tvar found = false;\n\t\t\tfor (var j = 0; j < params.key.accidentals.length; j++) {\n\t\t\t\tif (params.key.accidentals[j].note === multilineVars.key.explicitAccidentals[i].note) {\n\t\t\t\t\t// If the note is already in the list, override it with the new value\n\t\t\t\t\tparams.key.accidentals[j].acc = multilineVars.key.explicitAccidentals[i].acc;\n\t\t\t\t\tfound = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!found)\n\t\t\t\tparams.key.accidentals.push(multilineVars.key.explicitAccidentals[i]);\n\t\t}\n\t}\n\tmultilineVars.targetKey = params.key;\n\tif (params.key.explicitAccidentals)\n\t\tdelete params.key.explicitAccidentals;\n\tparseKeyVoice.addPosToKey(params.clef, params.key);\n\tif (multilineVars.meter !== null) {\n\t\tif (multilineVars.currentVoice) {\n\t\t\tmultilineVars.staves.forEach(function(st) {\n\t\t\t\tst.meter = multilineVars.meter;\n\t\t\t});\n\t\t\tparams.meter = multilineVars.staves[multilineVars.currentVoice.staffNum].meter;\n\t\t\tmultilineVars.staves[multilineVars.currentVoice.staffNum].meter = null;\n\t\t} else\n\t\t\tparams.meter = multilineVars.meter;\n\t\tmultilineVars.meter = null;\n\t} else if (multilineVars.currentVoice && multilineVars.staves[multilineVars.currentVoice.staffNum].meter) {\n\t\t// Make sure that each voice gets the meter marking.\n\t\tparams.meter = multilineVars.staves[multilineVars.currentVoice.staffNum].meter;\n\t\tmultilineVars.staves[multilineVars.currentVoice.staffNum].meter = null;\n\t}\n\tif (multilineVars.currentVoice && multilineVars.currentVoice.name)\n\t\tparams.name = multilineVars.currentVoice.name;\n\tif (multilineVars.vocalfont)\n\t\tparams.vocalfont = multilineVars.vocalfont;\n\tif (multilineVars.tripletfont)\n\t\tparams.tripletfont = multilineVars.tripletfont;\n\tif (multilineVars.gchordfont)\n\t\tparams.gchordfont = multilineVars.gchordfont;\n\tif (multilineVars.style)\n\t\tparams.style = multilineVars.style;\n\tif (multilineVars.currentVoice) {\n\t\tvar staff = multilineVars.staves[multilineVars.currentVoice.staffNum];\n\t\tif (staff.brace) params.brace = staff.brace;\n\t\tif (staff.bracket) params.bracket = staff.bracket;\n\t\tif (staff.connectBarLines) params.connectBarLines = staff.connectBarLines;\n\t\tif (staff.name) params.name = staff.name[multilineVars.currentVoice.index];\n\t\tif (staff.subname) params.subname = staff.subname[multilineVars.currentVoice.index];\n\t\tif (multilineVars.currentVoice.stem)\n\t\t\tparams.stem = multilineVars.currentVoice.stem;\n\t\tif (multilineVars.currentVoice.stafflines)\n\t\t\tparams.stafflines = multilineVars.currentVoice.stafflines;\n\t\tif (multilineVars.currentVoice.staffscale)\n\t\t\tparams.staffscale = multilineVars.currentVoice.staffscale;\n\t\tif (multilineVars.currentVoice.scale)\n\t\t\tparams.scale = multilineVars.currentVoice.scale;\n\t\tif (multilineVars.currentVoice.color)\n\t\t\tparams.color = multilineVars.currentVoice.color;\n\t\tif (multilineVars.currentVoice.style)\n\t\t\tparams.style = multilineVars.currentVoice.style;\n\t\tif (multilineVars.currentVoice.transpose)\n\t\t\tparams.clef.transpose = multilineVars.currentVoice.transpose;\n\t\tparams.currentVoice = multilineVars.currentVoice\n\t\tvar voices = Object.keys(multilineVars.voices)\n\t\tfor (var mv = 0; mv < voices.length; mv++) {\n\t\t\tif (params.currentVoice.staffNum === multilineVars.voices[voices[mv]].staffNum && params.currentVoice.index === multilineVars.voices[voices[mv]].index)\n\t\t\t\tparams.currentVoiceName = voices[mv]\n\t\t}\n\t}\n\tif (multilineVars.barNumbers === 0 && isFirstVoice() && multilineVars.currBarNumber !== 1)\n\t\tparams.barNumber = multilineVars.currBarNumber;\n\ttuneBuilder.startNewLine(params);\n\tif (multilineVars.key.impliedNaturals)\n\t\tdelete multilineVars.key.impliedNaturals;\n\n\tmultilineVars.partForNextLine = {};\n\tif (multilineVars.tempoForNextLine.length === 4)\n\t\ttuneBuilder.appendElement(multilineVars.tempoForNextLine[0],multilineVars.tempoForNextLine[1],multilineVars.tempoForNextLine[2],multilineVars.tempoForNextLine[3]);\n\tmultilineVars.tempoForNextLine = [];\n}\n\n// TODO-PER: make this a method in el.\nvar addEndBeam = function(el) {\n\tif (el.duration !== undefined && el.duration < 0.25)\n\t\tel.end_beam = true;\n\treturn el;\n};\n\nvar getCoreNote = function(line, index, el, canHaveBrokenRhythm) {\n\t//var el = { startChar: index };\n\tvar isComplete = function(state) {\n\t\treturn (state === 'octave' || state === 'duration' || state === 'Zduration' || state === 'broken_rhythm' || state === 'end_slur');\n\t};\n\tvar dottedTie;\n\tif (line[index] === '.' && line[index+1] === '-') {\n\t\tdottedTie = true;\n\t\tindex++;\n\t}\n\tvar state = 'startSlur';\n\tvar durationSetByPreviousNote = false;\n\twhile (1) {\n\t\tswitch(line[index]) {\n\t\t\tcase '(':\n\t\t\t\tif (state === 'startSlur') {\n\t\t\t\t\tif (el.startSlur === undefined) el.startSlur = 1; else el.startSlur++;\n\t\t\t\t} else if (isComplete(state)) {el.endChar = index;return el;}\n\t\t\t\telse return null;\n\t\t\t\tbreak;\n\t\t\tcase ')':\n\t\t\t\tif (isComplete(state)) {\n\t\t\t\t\tif (el.endSlur === undefined) el.endSlur = 1; else el.endSlur++;\n\t\t\t\t} else return null;\n\t\t\t\tbreak;\n\t\t\tcase '^':\n\t\t\t\tif (state === 'startSlur') {el.accidental = 'sharp';state = 'sharp2';}\n\t\t\t\telse if (state === 'sharp2') {el.accidental = 'dblsharp';state = 'pitch';}\n\t\t\t\telse if (isComplete(state)) {el.endChar = index;return el;}\n\t\t\t\telse return null;\n\t\t\t\tbreak;\n\t\t\tcase '_':\n\t\t\t\tif (state === 'startSlur') {el.accidental = 'flat';state = 'flat2';}\n\t\t\t\telse if (state === 'flat2') {el.accidental = 'dblflat';state = 'pitch';}\n\t\t\t\telse if (isComplete(state)) {el.endChar = index;return el;}\n\t\t\t\telse return null;\n\t\t\t\tbreak;\n\t\t\tcase '=':\n\t\t\t\tif (state === 'startSlur') {el.accidental = 'natural';state = 'pitch';}\n\t\t\t\telse if (isComplete(state)) {el.endChar = index;return el;}\n\t\t\t\telse return null;\n\t\t\t\tbreak;\n\t\t\tcase 'A':\n\t\t\tcase 'B':\n\t\t\tcase 'C':\n\t\t\tcase 'D':\n\t\t\tcase 'E':\n\t\t\tcase 'F':\n\t\t\tcase 'G':\n\t\t\tcase 'a':\n\t\t\tcase 'b':\n\t\t\tcase 'c':\n\t\t\tcase 'd':\n\t\t\tcase 'e':\n\t\t\tcase 'f':\n\t\t\tcase 'g':\n\t\t\t\tif (state === 'startSlur' || state === 'sharp2' || state === 'flat2' || state === 'pitch') {\n\t\t\t\t\tel.pitch = pitches[line[index]];\n\t\t\t\t\tel.pitch += 7 * (multilineVars.currentVoice && multilineVars.currentVoice.octave !== undefined ? multilineVars.currentVoice.octave : multilineVars.octave);\n\t\t\t\t\tel.name = line[index];\n\t\t\t\t\tif (el.accidental)\n\t\t\t\t\t\tel.name = accMap[el.accidental] + el.name;\n\t\t\t\t\ttranspose.note(multilineVars, el);\n\t\t\t\t\tstate = 'octave';\n\t\t\t\t\t// At this point we have a valid note. The rest is optional. Set the duration in case we don't get one below\n\t\t\t\t\tif (canHaveBrokenRhythm && multilineVars.next_note_duration !== 0) {\n\t\t\t\t\t\tel.duration = multilineVars.default_length * multilineVars.next_note_duration;\n\t\t\t\t\t\tmultilineVars.next_note_duration = 0;\n\t\t\t\t\t\tdurationSetByPreviousNote = true;\n\t\t\t\t\t} else\n\t\t\t\t\t\tel.duration = multilineVars.default_length;\n\t\t\t\t\t// If the clef is percussion, there is probably some translation of the pitch to a particular drum kit item.\n\t\t\t\t\tif ((multilineVars.clef && multilineVars.clef.type === \"perc\") ||\n\t\t\t\t\t\t(multilineVars.currentVoice && multilineVars.currentVoice.clef === \"perc\")) {\n\t\t\t\t\t\tvar key = line[index];\n\t\t\t\t\t\tif (el.accidental) {\n\t\t\t\t\t\t\tkey = accMap[el.accidental] + key;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (tune.formatting && tune.formatting.midi && tune.formatting.midi.drummap)\n\t\t\t\t\t\tel.midipitch = tune.formatting.midi.drummap[key];\n\t\t\t\t\t}\n\t\t\t\t} else if (isComplete(state)) {el.endChar = index;return el;}\n\t\t\t\telse return null;\n\t\t\t\tbreak;\n\t\t\tcase ',':\n\t\t\t\tif (state === 'octave') {el.pitch -= 7; el.name += ','; }\n\t\t\t\telse if (isComplete(state)) {el.endChar = index;return el;}\n\t\t\t\telse return null;\n\t\t\t\tbreak;\n\t\t\tcase '\\'':\n\t\t\t\tif (state === 'octave') {el.pitch += 7; el.name += \"'\"; }\n\t\t\t\telse if (isComplete(state)) {el.endChar = index;return el;}\n\t\t\t\telse return null;\n\t\t\t\tbreak;\n\t\t\tcase 'x':\n\t\t\tcase 'X':\n\t\t\tcase 'y':\n\t\t\tcase 'z':\n\t\t\tcase 'Z':\n\t\t\t\tif (state === 'startSlur') {\n\t\t\t\t\tel.rest = { type: rests[line[index]] };\n\t\t\t\t\t// There shouldn't be some of the properties that notes have. If some sneak in due to bad syntax in the abc file,\n\t\t\t\t\t// just nix them here.\n\t\t\t\t\tdelete el.accidental;\n\t\t\t\t\tdelete el.startSlur;\n\t\t\t\t\tdelete el.startTie;\n\t\t\t\t\tdelete el.endSlur;\n\t\t\t\t\tdelete el.endTie;\n\t\t\t\t\tdelete el.end_beam;\n\t\t\t\t\tdelete el.grace_notes;\n\t\t\t\t\t// At this point we have a valid note. The rest is optional. Set the duration in case we don't get one below\n\t\t\t\t\tif (el.rest.type.indexOf('multimeasure') >= 0) {\n\t\t\t\t\t\tel.duration = tune.getBarLength();\n\t\t\t\t\t\tel.rest.text = 1;\n\t\t\t\t\t\tstate = 'Zduration';\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (canHaveBrokenRhythm && multilineVars.next_note_duration !== 0) {\n\t\t\t\t\t\t\tel.duration = multilineVars.default_length * multilineVars.next_note_duration;\n\t\t\t\t\t\t\tmultilineVars.next_note_duration = 0;\n\t\t\t\t\t\t\tdurationSetByPreviousNote = true;\n\t\t\t\t\t\t} else\n\t\t\t\t\t\t\tel.duration = multilineVars.default_length;\n\t\t\t\t\t\tstate = 'duration';\n\t\t\t\t\t}\n\t\t\t\t} else if (isComplete(state)) {el.endChar = index;return el;}\n\t\t\t\telse return null;\n\t\t\t\tbreak;\n\t\t\tcase '1':\n\t\t\tcase '2':\n\t\t\tcase '3':\n\t\t\tcase '4':\n\t\t\tcase '5':\n\t\t\tcase '6':\n\t\t\tcase '7':\n\t\t\tcase '8':\n\t\t\tcase '9':\n\t\t\tcase '0':\n\t\t\tcase '/':\n\t\t\t\tif (state === 'octave' || state === 'duration') {\n\t\t\t\t\tvar fraction = tokenizer.getFraction(line, index);\n\t\t\t\t\t//if (!durationSetByPreviousNote)\n\t\t\t\t\tel.duration = el.duration * fraction.value;\n\t\t\t\t\t// TODO-PER: We can test the returned duration here and give a warning if it isn't the one expected.\n\t\t\t\t\tel.endChar = fraction.index;\n\t\t\t\t\twhile (fraction.index < line.length && (tokenizer.isWhiteSpace(line[fraction.index]) || line[fraction.index] === '-')) {\n\t\t\t\t\t\tif (line[fraction.index] === '-')\n\t\t\t\t\t\t\tel.startTie = {};\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tel = addEndBeam(el);\n\t\t\t\t\t\tfraction.index++;\n\t\t\t\t\t}\n\t\t\t\t\tindex = fraction.index-1;\n\t\t\t\t\tstate = 'broken_rhythm';\n\t\t\t\t} else if (state === 'sharp2') {\n\t\t\t\t\tel.accidental = 'quartersharp';state = 'pitch';\n\t\t\t\t} else if (state === 'flat2') {\n\t\t\t\t\tel.accidental = 'quarterflat';state = 'pitch';\n\t\t\t\t} else if (state === 'Zduration') {\n\t\t\t\t\tvar num = tokenizer.getNumber(line, index);\n\t\t\t\t\tel.duration = num.num * tune.getBarLength();\n\t\t\t\t\tel.rest.text = num.num;\n\t\t\t\t\tel.endChar = num.index;\n\t\t\t\t\treturn el;\n\t\t\t\t} else return null;\n\t\t\t\tbreak;\n\t\t\tcase '-':\n\t\t\t\tif (state === 'startSlur') {\n\t\t\t\t\t// This is the first character, so it must have been meant for the previous note. Correct that here.\n\t\t\t\t\ttuneBuilder.addTieToLastNote(dottedTie);\n\t\t\t\t\tel.endTie = true;\n\t\t\t\t} else if (state === 'octave' || state === 'duration' || state === 'end_slur') {\n\t\t\t\t\tel.startTie = {};\n\t\t\t\t\tif (!durationSetByPreviousNote && canHaveBrokenRhythm)\n\t\t\t\t\t\tstate = 'broken_rhythm';\n\t\t\t\t\telse {\n\t\t\t\t\t\t// Peek ahead to the next character. If it is a space, then we have an end beam.\n\t\t\t\t\t\tif (tokenizer.isWhiteSpace(line[index + 1]))\n\t\t\t\t\t\t\taddEndBeam(el);\n\t\t\t\t\t\tel.endChar = index+1;\n\t\t\t\t\t\treturn el;\n\t\t\t\t\t}\n\t\t\t\t} else if (state === 'broken_rhythm') {el.endChar = index;return el;}\n\t\t\t\telse return null;\n\t\t\t\tbreak;\n\t\t\tcase ' ':\n\t\t\tcase '\\t':\n\t\t\t\tif (isComplete(state)) {\n\t\t\t\t\tel.end_beam = true;\n\t\t\t\t\t// look ahead to see if there is a tie\n\t\t\t\t\tdottedTie = false;\n\t\t\t\t\tdo {\n\t\t\t\t\t\tif (line[index] === '.' && line[index+1] === '-') {\n\t\t\t\t\t\t\tdottedTie = true;\n\t\t\t\t\t\t\tindex++;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (line[index] === '-') {\n\t\t\t\t\t\t\tel.startTie = {};\n\t\t\t\t\t\t\tif (dottedTie)\n\t\t\t\t\t\t\t\tel.startTie.style = \"dotted\";\n\t\t\t\t\t\t}\n\t\t\t\t\t\tindex++;\n\t\t\t\t\t} while (index < line.length &&\n\t\t\t\t\t\t(tokenizer.isWhiteSpace(line[index]) || line[index] === '-') ||\n\t\t\t\t\t\t(line[index] === '.' && line[index+1] === '-'));\n\t\t\t\t\tel.endChar = index;\n\t\t\t\t\tif (!durationSetByPreviousNote && canHaveBrokenRhythm && (line[index] === '<' || line[index] === '>')) {\t// TODO-PER: Don't need the test for < and >, but that makes the endChar work out for the regression test.\n\t\t\t\t\t\tindex--;\n\t\t\t\t\t\tstate = 'broken_rhythm';\n\t\t\t\t\t} else\n\t\t\t\t\t\treturn el;\n\t\t\t\t}\n\t\t\t\telse return null;\n\t\t\t\tbreak;\n\t\t\tcase '>':\n\t\t\tcase '<':\n\t\t\t\tif (isComplete(state)) {\n\t\t\t\t\tif (canHaveBrokenRhythm) {\n\t\t\t\t\t\tvar br2 = getBrokenRhythm(line, index);\n\t\t\t\t\t\tindex += br2[0] - 1;\t// index gets incremented below, so we'll let that happen\n\t\t\t\t\t\tmultilineVars.next_note_duration = br2[2];\n\t\t\t\t\t\tel.duration = br2[1]*el.duration;\n\t\t\t\t\t\tstate = 'end_slur';\n\t\t\t\t\t} else {\n\t\t\t\t\t\tel.endChar = index;\n\t\t\t\t\t\treturn el;\n\t\t\t\t\t}\n\t\t\t\t} else\n\t\t\t\t\treturn null;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tif (isComplete(state)) {\n\t\t\t\t\tel.endChar = index;\n\t\t\t\t\treturn el;\n\t\t\t\t}\n\t\t\t\treturn null;\n\t\t}\n\t\tindex++;\n\t\tif (index === line.length) {\n\t\t\tif (isComplete(state)) {el.endChar = index;return el;}\n\t\t\telse return null;\n\t\t}\n\t}\n\treturn null;\n};\n\nvar getBrokenRhythm = function(line, index) {\n\tswitch (line[index]) {\n\t\tcase '>':\n\t\t\tif (index < line.length - 2 && line[index + 1] === '>' && line[index + 2] === '>')\t// triple >>>\n\t\t\t\treturn [3, 1.875, 0.125];\n\t\t\telse if (index < line.length - 1 && line[index + 1] === '>')\t// double >>\n\t\t\t\treturn [2, 1.75, 0.25];\n\t\t\telse\n\t\t\t\treturn [1, 1.5, 0.5];\n\t\tcase '<':\n\t\t\tif (index < line.length - 2 && line[index + 1] === '<' && line[index + 2] === '<')\t// triple <<<\n\t\t\t\treturn [3, 0.125, 1.875];\n\t\t\telse if (index < line.length - 1 && line[index + 1] === '<')\t// double <<\n\t\t\t\treturn [2, 0.25, 1.75];\n\t\t\telse\n\t\t\t\treturn [1, 0.5, 1.5];\n\t}\n\treturn null;\n};\n\nfunction isFirstVoice() {\n\treturn multilineVars.currentVoice === undefined || (multilineVars.currentVoice.staffNum === 0 && multilineVars.currentVoice.index === 0);\n}\n\nmodule.exports = MusicParser;\n","// abc_tokenizer.js: tokenizes an ABC Music Notation string to support abc_parse.\n\nvar parseCommon = require('./abc_common');\n\n// this is a series of functions that get a particular element out of the passed stream.\n// the return is the number of characters consumed, so 0 means that the element wasn't found.\n// also returned is the element found. This may be a different length because spaces may be consumed that aren't part of the string.\n// The return structure for most calls is { len: num_chars_consumed, token: str }\nvar Tokenizer = function(lines, multilineVars) {\n\tthis.lineIndex = 0\n\tthis.lines = lines\n\tthis.multilineVars = multilineVars;\n\n\tthis.skipWhiteSpace = function(str) {\n\t\tfor (var i = 0; i < str.length; i++) {\n\t\t if (!this.isWhiteSpace(str[i]))\n\t\t\t\treturn i;\n\t\t}\n\t\treturn str.length;\t// It must have been all white space\n\t};\n\tvar finished = function(str, i) {\n\t\treturn i >= str.length;\n\t};\n\tthis.eatWhiteSpace = function(line, index) {\n\t\tfor (var i = index; i < line.length; i++) {\n\t\t if (!this.isWhiteSpace(line[i]))\n\t\t\t\treturn i-index;\n\t\t}\n\t\treturn i-index;\n\t};\n\n\t// This just gets the basic pitch letter, ignoring leading spaces, and normalizing it to a capital\n\tthis.getKeyPitch = function(str) {\n\t\tvar i = this.skipWhiteSpace(str);\n\t\tif (finished(str, i))\n\t\t\treturn {len: 0};\n\t\tswitch (str[i]) {\n\t\t\tcase 'A':return {len: i+1, token: 'A'};\n\t\t\tcase 'B':return {len: i+1, token: 'B'};\n\t\t\tcase 'C':return {len: i+1, token: 'C'};\n\t\t\tcase 'D':return {len: i+1, token: 'D'};\n\t\t\tcase 'E':return {len: i+1, token: 'E'};\n\t\t\tcase 'F':return {len: i+1, token: 'F'};\n\t\t\tcase 'G':return {len: i+1, token: 'G'};\n//\t\t\tcase 'a':return {len: i+1, token: 'A'};\n//\t\t\tcase 'b':return {len: i+1, token: 'B'};\n//\t\t\tcase 'c':return {len: i+1, token: 'C'};\n//\t\t\tcase 'd':return {len: i+1, token: 'D'};\n//\t\t\tcase 'e':return {len: i+1, token: 'E'};\n//\t\t\tcase 'f':return {len: i+1, token: 'F'};\n//\t\t\tcase 'g':return {len: i+1, token: 'G'};\n\t\t}\n\t\treturn {len: 0};\n\t};\n\n\t// This just gets the basic accidental, ignoring leading spaces, and only the ones that appear in a key\n\tthis.getSharpFlat = function(str) {\n\t\tif (str === 'bass')\n\t\t\treturn {len: 0};\n\t\tswitch (str[0]) {\n\t\t\tcase '#':return {len: 1, token: '#'};\n\t\t\tcase 'b':return {len: 1, token: 'b'};\n\t\t}\n\t\treturn {len: 0};\n\t};\n\n\tthis.getMode = function(str) {\n\t\tvar skipAlpha = function(str, start) {\n\t\t\t// This returns the index of the next non-alphabetic char, or the entire length of the string if not found.\n\t\t while (start < str.length && ((str[start] >= 'a' && str[start] <= 'z') || (str[start] >= 'A' && str[start] <= 'Z')))\n\t\t\t\tstart++;\n\t\t\treturn start;\n\t\t};\n\n\t\tvar i = this.skipWhiteSpace(str);\n\t\tif (finished(str, i))\n\t\t\treturn {len: 0};\n\t\tvar firstThree = str.substring(i,i+3).toLowerCase();\n\t\tif (firstThree.length > 1 && firstThree[1] === ' ' || firstThree[1] === '^' || firstThree[1] === '_' || firstThree[1] === '=') firstThree = firstThree[0];\t// This will handle the case of 'm'\n\t\tswitch (firstThree) {\n\t\t\tcase 'mix':return {len: skipAlpha(str, i), token: 'Mix'};\n\t\t\tcase 'dor':return {len: skipAlpha(str, i), token: 'Dor'};\n\t\t\tcase 'phr':return {len: skipAlpha(str, i), token: 'Phr'};\n\t\t\tcase 'lyd':return {len: skipAlpha(str, i), token: 'Lyd'};\n\t\t\tcase 'loc':return {len: skipAlpha(str, i), token: 'Loc'};\n\t\t\tcase 'aeo':return {len: skipAlpha(str, i), token: 'm'};\n\t\t\tcase 'maj':return {len: skipAlpha(str, i), token: ''};\n\t\t\tcase 'ion':return {len: skipAlpha(str, i), token: ''};\n\t\t\tcase 'min':return {len: skipAlpha(str, i), token: 'm'};\n\t\t\tcase 'm':return {len: skipAlpha(str, i), token: 'm'};\n\t\t}\n\t\treturn {len: 0};\n\t};\n\n\tthis.getClef = function(str, bExplicitOnly) {\n\t\tvar strOrig = str;\n\t\tvar i = this.skipWhiteSpace(str);\n\t\tif (finished(str, i))\n\t\t\treturn {len: 0};\n\t\t// The word 'clef' is optional, but if it appears, a clef MUST appear\n\t\tvar needsClef = false;\n\t\tvar strClef = str.substring(i);\n\t\tif (parseCommon.startsWith(strClef, 'clef=')) {\n\t\t\tneedsClef = true;\n\t\t\tstrClef = strClef.substring(5);\n\t\t\ti += 5;\n\t\t}\n\t\tif (strClef.length === 0 && needsClef)\n\t\t\treturn {len: i+5, warn: \"No clef specified: \" + strOrig};\n\n\t\tvar j = this.skipWhiteSpace(strClef);\n\t\tif (finished(strClef, j))\n\t\t\treturn {len: 0};\n\t\tif (j > 0) {\n\t\t\ti += j;\n\t\t\tstrClef = strClef.substring(j);\n\t\t}\n\t\tvar name = null;\n\t\tif (parseCommon.startsWith(strClef, 'treble'))\n\t\t\tname = 'treble';\n\t\telse if (parseCommon.startsWith(strClef, 'bass3'))\n\t\t\tname = 'bass3';\n\t\telse if (parseCommon.startsWith(strClef, 'bass'))\n\t\t\tname = 'bass';\n\t\telse if (parseCommon.startsWith(strClef, 'tenor'))\n\t\t\tname = 'tenor';\n\t\telse if (parseCommon.startsWith(strClef, 'alto2'))\n\t\t\tname = 'alto2';\n\t\telse if (parseCommon.startsWith(strClef, 'alto1'))\n\t\t\tname = 'alto1';\n\t\telse if (parseCommon.startsWith(strClef, 'alto'))\n\t\t\tname = 'alto';\n\t\telse if (!bExplicitOnly && (needsClef && parseCommon.startsWith(strClef, 'none')))\n\t\t\tname = 'none';\n\t\telse if (parseCommon.startsWith(strClef, 'perc'))\n\t\t\tname = 'perc';\n\t\telse if (!bExplicitOnly && (needsClef && parseCommon.startsWith(strClef, 'C')))\n\t\t\tname = 'tenor';\n\t\telse if (!bExplicitOnly && (needsClef && parseCommon.startsWith(strClef, 'F')))\n\t\t\tname = 'bass';\n\t\telse if (!bExplicitOnly && (needsClef && parseCommon.startsWith(strClef, 'G')))\n\t\t\tname = 'treble';\n\t\telse\n\t\t\treturn {len: i+5, warn: \"Unknown clef specified: \" + strOrig};\n\n\t\tstrClef = strClef.substring(name.length);\n\t\tj = this.isMatch(strClef, '+8');\n\t\tif (j > 0)\n\t\t\tname += \"+8\";\n\t\telse {\n\t\t\tj = this.isMatch(strClef, '-8');\n\t\t\tif (j > 0)\n\t\t\t\tname += \"-8\";\n\t\t}\n\t\treturn {len: i+name.length, token: name, explicit: needsClef};\n\t};\n\n\t// This returns one of the legal bar lines\n\t// This is called alot and there is no obvious tokenable items, so this is broken apart.\n\tthis.getBarLine = function(line, i) {\n\t\tswitch (line[i]) {\n\t\t\tcase ']':\n\t\t\t\t++i;\n\t\t\t\tswitch (line[i]) {\n\t\t\t\t\tcase '|': return {len: 2, token: \"bar_thick_thin\"};\n\t\t\t\t\tcase '[':\n\t\t\t\t\t\t++i;\n\t\t\t\t\t\tif ((line[i] >= '1' && line[i] <= '9') || line[i] === '\"')\n\t\t\t\t\t\t\treturn {len: 2, token: \"bar_invisible\"};\n\t\t\t\t\t\treturn {len: 1, warn: \"Unknown bar symbol\"};\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn {len: 1, token: \"bar_invisible\"};\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase ':':\n\t\t\t\t++i;\n\t\t\t\tswitch (line[i]) {\n\t\t\t\t\tcase ':': return {len: 2, token: \"bar_dbl_repeat\"};\n\t\t\t\t\tcase '|':\t// :|\n\t\t\t\t\t\t++i;\n\t\t\t\t\t\tswitch (line[i]) {\n\t\t\t\t\t\t\tcase ']':\t// :|]\n\t\t\t\t\t\t\t\t++i;\n\t\t\t\t\t\t\t\tswitch (line[i]) {\n\t\t\t\t\t\t\t\t\tcase '|':\t// :|]|\n\t\t\t\t\t\t\t\t\t\t++i;\n\t\t\t\t\t\t\t\t\t\tif (line[i] === ':') return {len: 5, token: \"bar_dbl_repeat\"};\n\t\t\t\t\t\t\t\t\t\treturn {len: 3, token: \"bar_right_repeat\"};\n\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\treturn {len: 3, token: \"bar_right_repeat\"};\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase '|':\t// :||\n\t\t\t\t\t\t\t\t++i;\n\t\t\t\t\t\t\t\tif (line[i] === ':') return {len: 4, token: \"bar_dbl_repeat\"};\n\t\t\t\t\t\t\t\treturn {len: 3, token: \"bar_right_repeat\"};\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\treturn {len: 2, token: \"bar_right_repeat\"};\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn {len: 1, warn: \"Unknown bar symbol\"};\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase '[':\t// [\n\t\t\t\t++i;\n\t\t\t\tif (line[i] === '|') {\t// [|\n\t\t\t\t\t++i;\n\t\t\t\t\tswitch (line[i]) {\n\t\t\t\t\t\tcase ':': return {len: 3, token: \"bar_left_repeat\"};\n\t\t\t\t\t\tcase ']': return {len: 3, token: \"bar_invisible\"};\n\t\t\t\t\t\tdefault: return {len: 2, token: \"bar_thick_thin\"};\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif ((line[i] >= '1' && line[i] <= '9') || line[i] === '\"')\n\t\t\t\t\t\treturn {len: 1, token: \"bar_invisible\"};\n\t\t\t\t\treturn {len: 0};\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase '|':\t// |\n\t\t\t\t++i;\n\t\t\t\tswitch (line[i]) {\n\t\t\t\t\tcase ']': return {len: 2, token: \"bar_thin_thick\"};\n\t\t\t\t\tcase '|': // ||\n\t\t\t\t\t\t++i;\n\t\t\t\t\t\tif (line[i] === ':') return {len: 3, token: \"bar_left_repeat\"};\n\t\t\t\t\t\treturn {len: 2, token: \"bar_thin_thin\"};\n\t\t\t\t\tcase ':':\t// |:\n\t\t\t\t\t\tvar colons = 0;\n\t\t\t\t\t\twhile (line[i+colons] === ':') colons++;\n\t\t\t\t\t\treturn { len: 1+colons, token: \"bar_left_repeat\"};\n\t\t\t\t\tdefault: return {len: 1, token: \"bar_thin\"};\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t\treturn {len: 0};\n\t};\n\n\t// this returns all the characters in the string that match one of the characters in the legalChars string\n\tthis.getTokenOf = function(str, legalChars) {\n\t\tfor (var i = 0; i < str.length; i++) {\n\t\t\tif (legalChars.indexOf(str[i]) < 0)\n\t\t\t\treturn {len: i, token: str.substring(0, i)};\n\t\t}\n\t\treturn {len: i, token: str};\n\t};\n\n\tthis.getToken = function(str, start, end) {\n\t\t// This returns the next set of chars that doesn't contain spaces\n\t\tvar i = start;\n\t\twhile (i < end && !this.isWhiteSpace(str[i]))\n\t\t\ti++;\n\t\treturn str.substring(start, i);\n\t};\n\n\t// This just sees if the next token is the word passed in, with possible leading spaces\n\tthis.isMatch = function(str, match) {\n\t\tvar i = this.skipWhiteSpace(str);\n\t\tif (finished(str, i))\n\t\t\treturn 0;\n\t\tif (parseCommon.startsWith(str.substring(i), match))\n\t\t\treturn i+match.length;\n\t\treturn 0;\n\t};\n\n\tthis.getPitchFromTokens = function(tokens) {\n\t\tvar ret = { };\n\t\tvar pitches = {A: 5, B: 6, C: 0, D: 1, E: 2, F: 3, G: 4, a: 12, b: 13, c: 7, d: 8, e: 9, f: 10, g: 11};\n\t\tret.position = pitches[tokens[0].token];\n\t\tif (ret.position === undefined)\n\t\t\treturn { warn: \"Pitch expected. Found: \" + tokens[0].token };\n\t\ttokens.shift();\n\t\twhile (tokens.length) {\n\t\t\tswitch (tokens[0].token) {\n\t\t\t\tcase ',': ret.position -= 7; tokens.shift(); break;\n\t\t\t\tcase '\\'': ret.position += 7; tokens.shift(); break;\n\t\t\t\tdefault: return ret;\n\t\t\t}\n\t\t}\n\t\treturn ret;\n\t};\n\n\tthis.getKeyAccidentals2 = function(tokens) {\n\t\tvar accs;\n\t\t// find and strip off all accidentals in the token list\n\t\twhile (tokens.length > 0) {\n\t\t\tvar acc;\n\t\t\tif (tokens[0].token === '^') {\n\t\t\t\tacc = 'sharp';\n\t\t\t\ttokens.shift();\n\t\t\t\tif (tokens.length === 0) return {accs: accs, warn: 'Expected note name after ' + acc};\n\t\t\t\tswitch (tokens[0].token) {\n\t\t\t\t\tcase '^': acc = 'dblsharp'; tokens.shift(); break;\n\t\t\t\t\tcase '/': acc = 'quartersharp'; tokens.shift(); break;\n\t\t\t\t}\n\t\t\t} else if (tokens[0].token === '=') {\n\t\t\t\tacc = 'natural';\n\t\t\t\ttokens.shift();\n\t\t\t} else if (tokens[0].token === '_') {\n\t\t\t\tacc = 'flat';\n\t\t\t\ttokens.shift();\n\t\t\t\tif (tokens.length === 0) return {accs: accs, warn: 'Expected note name after ' + acc};\n\t\t\t\tswitch (tokens[0].token) {\n\t\t\t\t\tcase '_': acc = 'dblflat'; tokens.shift(); break;\n\t\t\t\t\tcase '/': acc = 'quarterflat'; tokens.shift(); break;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Not an accidental, we'll assume that a later parse will recognize it.\n\t\t\t\treturn { accs: accs };\n\t\t\t}\n\t\t\tif (tokens.length === 0) return {accs: accs, warn: 'Expected note name after ' + acc};\n\t\t\tswitch (tokens[0].token[0])\n\t\t\t{\n\t\t\t\tcase 'a':\n\t\t\t\tcase 'b':\n\t\t\t\tcase 'c':\n\t\t\t\tcase 'd':\n\t\t\t\tcase 'e':\n\t\t\t\tcase 'f':\n\t\t\t\tcase 'g':\n\t\t\t\tcase 'A':\n\t\t\t\tcase 'B':\n\t\t\t\tcase 'C':\n\t\t\t\tcase 'D':\n\t\t\t\tcase 'E':\n\t\t\t\tcase 'F':\n\t\t\t\tcase 'G':\n\t\t\t\t\tif (accs === undefined)\n\t\t\t\t\t\taccs = [];\n\t\t\t\t\taccs.push({ acc: acc, note: tokens[0].token[0] });\n\t\t\t\t\tif (tokens[0].token.length === 1)\n\t\t\t\t\t\ttokens.shift();\n\t\t\t\t\telse\n\t\t\t\t\t\ttokens[0].token = tokens[0].token.substring(1);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\treturn {accs: accs, warn: 'Expected note name after ' + acc + ' Found: ' + tokens[0].token };\n\t\t\t}\n\t\t}\n\t\treturn { accs: accs };\n\t};\n\n\t// This gets an accidental marking for the key signature. It has the accidental then the pitch letter.\n\tthis.getKeyAccidental = function(str) {\n\t\tvar accTranslation = {\n\t\t\t'^': 'sharp',\n\t\t\t'^^': 'dblsharp',\n\t\t\t'=': 'natural',\n\t\t\t'_': 'flat',\n\t\t\t'__': 'dblflat',\n\t\t\t'_/': 'quarterflat',\n\t\t\t'^/': 'quartersharp'\n\t\t};\n\t\tvar i = this.skipWhiteSpace(str);\n\t\tif (finished(str, i))\n\t\t\treturn {len: 0};\n\t\tvar acc = null;\n\t\tswitch (str[i])\n\t\t{\n\t\t\tcase '^':\n\t\t\tcase '_':\n\t\t\tcase '=':\n\t\t\t\tacc = str[i];\n\t\t\t\tbreak;\n\t\t\tdefault:return {len: 0};\n\t\t}\n\t\ti++;\n\t\tif (finished(str, i))\n\t\t\treturn {len: 1, warn: 'Expected note name after accidental'};\n\t\tswitch (str[i])\n\t\t{\n\t\t\tcase 'a':\n\t\t\tcase 'b':\n\t\t\tcase 'c':\n\t\t\tcase 'd':\n\t\t\tcase 'e':\n\t\t\tcase 'f':\n\t\t\tcase 'g':\n\t\t\tcase 'A':\n\t\t\tcase 'B':\n\t\t\tcase 'C':\n\t\t\tcase 'D':\n\t\t\tcase 'E':\n\t\t\tcase 'F':\n\t\t\tcase 'G':\n\t\t\t\treturn {len: i+1, token: {acc: accTranslation[acc], note: str[i]}};\n\t\t\tcase '^':\n\t\t\tcase '_':\n\t\t\tcase '/':\n\t\t\t\tacc += str[i];\n\t\t\t\ti++;\n\t\t\t\tif (finished(str, i))\n\t\t\t\t\treturn {len: 2, warn: 'Expected note name after accidental'};\n\t\t\t\tswitch (str[i])\n\t\t\t\t{\n\t\t\t\t\tcase 'a':\n\t\t\t\t\tcase 'b':\n\t\t\t\t\tcase 'c':\n\t\t\t\t\tcase 'd':\n\t\t\t\t\tcase 'e':\n\t\t\t\t\tcase 'f':\n\t\t\t\t\tcase 'g':\n\t\t\t\t\tcase 'A':\n\t\t\t\t\tcase 'B':\n\t\t\t\t\tcase 'C':\n\t\t\t\t\tcase 'D':\n\t\t\t\t\tcase 'E':\n\t\t\t\t\tcase 'F':\n\t\t\t\t\tcase 'G':\n\t\t\t\t\t\treturn {len: i+1, token: {acc: accTranslation[acc], note: str[i]}};\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn {len: 2, warn: 'Expected note name after accidental'};\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\treturn {len: 1, warn: 'Expected note name after accidental'};\n\t\t}\n\t};\n\n\tthis.isWhiteSpace = function(ch) {\n\t\treturn ch === ' ' || ch === '\\t' || ch === '\\x12';\n\t};\n\n\tthis.getMeat = function(line, start, end) {\n\t\t// This removes any comments starting with '%' and trims the ends of the string so that there are no leading or trailing spaces.\n\t\t// it returns just the start and end characters that contain the meat.\n\t\tvar comment = line.indexOf('%', start);\n\t\tif (comment >= 0 && comment < end)\n\t\t\tend = comment;\n\t\twhile (start < end && (line[start] === ' ' || line[start] === '\\t' || line[start] === '\\x12'))\n\t\t\tstart++;\n\t\twhile (start < end && (line[end-1] === ' ' || line[end-1] === '\\t' || line[end-1] === '\\x12'))\n\t\t\tend--;\n\t\treturn {start: start, end: end};\n\t};\n\n\tvar isLetter = function(ch) {\n\t\treturn (ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z');\n\t};\n\n\tvar isNumber = function(ch) {\n\t\treturn (ch >= '0' && ch <= '9');\n\t};\n\n\tthis.tokenize = function(line, start, end, alphaUntilWhiteSpace) {\n\t\t// this returns all the tokens inside the passed string. A token is a punctuation mark, a string of digits, a string of letters.\n\t\t// Quoted strings are one token.\n\t\t// If there is a minus sign next to a number, then it is included in the number.\n\t\t// If there is a period immediately after a number, with a number immediately following, then a float is returned.\n\t\t// The type of token is returned: quote, alpha, number, punct\n\t\t// If alphaUntilWhiteSpace is true, then the behavior of the alpha token changes.\n\n\t\tvar ret = this.getMeat(line, start, end);\n\t\tstart = ret.start;\n\t\tend = ret.end;\n\t\tvar tokens = [];\n\t\tvar i;\n\t\twhile (start < end) {\n\t\t\tif (line[start] === '\"') {\n\t\t\t\ti = start+1;\n\t\t\t\twhile (i < end && line[i] !== '\"') i++;\n\t\t\t\ttokens.push({ type: 'quote', token: line.substring(start+1, i), start: start+1, end: i});\n\t\t\t\ti++;\n\t\t\t} else if (isLetter(line[start])) {\n\t\t\t\ti = start+1;\n\t\t\t\tif (alphaUntilWhiteSpace)\n\t\t\t\t\twhile (i < end && !this.isWhiteSpace(line[i])) i++;\n\t\t\t\telse\n\t\t\t\t\twhile (i < end && isLetter(line[i])) i++;\n\t\t\t\ttokens.push({ type: 'alpha', token: line.substring(start, i), continueId: isNumber(line[i]), start: start, end: i});\n\t\t\t\tstart = i + 1;\n\t\t\t} else if (line[start] === '.' && isNumber(line[i+1])) {\n\t\t\t\ti = start+1;\n\t\t\t\tvar int2 = null;\n\t\t\t\tvar float2 = null;\n\t\t\t\twhile (i < end && isNumber(line[i])) i++;\n\n\t\t\t\tfloat2 = parseFloat(line.substring(start, i));\n\t\t\t\ttokens.push({ type: 'number', token: line.substring(start, i), intt: int2, floatt: float2, continueId: isLetter(line[i]), start: start, end: i});\n\t\t\t\tstart = i + 1;\n\t\t\t} else if (isNumber(line[start]) || (line[start] === '-' && isNumber(line[i+1]))) {\n\t\t\t\ti = start+1;\n\t\t\t\tvar intt = null;\n\t\t\t\tvar floatt = null;\n\t\t\t\twhile (i < end && isNumber(line[i])) i++;\n\t\t\t\tif (line[i] === '.' && isNumber(line[i+1])) {\n\t\t\t\t\ti++;\n\t\t\t\t\twhile (i < end && isNumber(line[i])) i++;\n\t\t\t\t} else\n\t\t\t\t\tintt = parseInt(line.substring(start, i));\n\n\t\t\t\tfloatt = parseFloat(line.substring(start, i));\n\t\t\t\ttokens.push({ type: 'number', token: line.substring(start, i), intt: intt, floatt: floatt, continueId: isLetter(line[i]), start: start, end: i});\n\t\t\t\tstart = i + 1;\n\t\t\t} else if (line[start] === ' ' || line[start] === '\\t') {\n\t\t\t\ti = start+1;\n\t\t\t} else {\n\t\t\t\ttokens.push({ type: 'punct', token: line[start], start: start, end: start+1});\n\t\t\t\ti = start+1;\n\t\t\t}\n\t\t\tstart = i;\n\t\t}\n\t\treturn tokens;\n\t};\n\n\tthis.getVoiceToken = function(line, start, end) {\n\t\t// This finds the next token. A token is delimited by a space or an equal sign. If it starts with a quote, then the portion between the quotes is returned.\n\t\tvar i = start;\n\t\twhile (i < end && this.isWhiteSpace(line[i]) || line[i] === '=')\n\t\t\ti++;\n\n\t\tif (line[i] === '\"') {\n\t\t\tvar close = line.indexOf('\"', i+1);\n\t\t\tif (close === -1 || close >= end)\n\t\t\t\treturn {len: 1, err: \"Missing close quote\"};\n\t\t\treturn {len: close-start+1, token: this.translateString(line.substring(i+1, close))};\n\t\t} else {\n\t\t\tvar ii = i;\n\t\t\twhile (ii < end && !this.isWhiteSpace(line[ii]) && line[ii] !== '=')\n\t\t\t\tii++;\n\t\t\treturn {len: ii-start+1, token: line.substring(i, ii)};\n\t\t}\n\t};\n\n\tvar charMap = {\n\t\t\"`a\": 'à', \"'a\": \"á\", \"^a\": \"â\", \"~a\": \"ã\", \"\\\"a\": \"ä\", \"oa\": \"å\", \"aa\": \"å\", \"=a\": \"ā\", \"ua\": \"ă\", \";a\": \"ą\",\n\t\t\"`e\": 'è', \"'e\": \"é\", \"^e\": \"ê\", \"\\\"e\": \"ë\", \"=e\": \"ē\", \"ue\": \"ĕ\", \";e\": \"ę\", \".e\": \"ė\",\n\t\t\"`i\": 'ì', \"'i\": \"í\", \"^i\": \"î\", \"\\\"i\": \"ï\", \"=i\": \"ī\", \"ui\": \"ĭ\", \";i\": \"į\",\n\t\t\"`o\": 'ò', \"'o\": \"ó\", \"^o\": \"ô\", \"~o\": \"õ\", \"\\\"o\": \"ö\", \"=o\": \"ō\", \"uo\": \"ŏ\", \"/o\": \"ø\",\n\t\t\"`u\": 'ù', \"'u\": \"ú\", \"^u\": \"û\", \"~u\": \"ũ\", \"\\\"u\": \"ü\", \"ou\": \"ů\", \"=u\": \"ū\", \"uu\": \"ŭ\", \";u\": \"ų\",\n\t\t\"`A\": 'À', \"'A\": \"Á\", \"^A\": \"Â\", \"~A\": \"Ã\", \"\\\"A\": \"Ä\", \"oA\": \"Å\", \"AA\": \"Å\", \"=A\": \"Ā\", \"uA\": \"Ă\", \";A\": \"Ą\",\n\t\t\"`E\": 'È', \"'E\": \"É\", \"^E\": \"Ê\", \"\\\"E\": \"Ë\", \"=E\": \"Ē\", \"uE\": \"Ĕ\", \";E\": \"Ę\", \".E\": \"Ė\",\n\t\t\"`I\": 'Ì', \"'I\": \"Í\", \"^I\": \"Î\", \"~I\": \"Ĩ\", \"\\\"I\": \"Ï\", \"=I\": \"Ī\", \"uI\": \"Ĭ\", \";I\": \"Į\", \".I\": \"İ\",\n\t\t\"`O\": 'Ò', \"'O\": \"Ó\", \"^O\": \"Ô\", \"~O\": \"Õ\", \"\\\"O\": \"Ö\", \"=O\": \"Ō\", \"uO\": \"Ŏ\", \"/O\": \"Ø\",\n\t\t\"`U\": 'Ù', \"'U\": \"Ú\", \"^U\": \"Û\", \"~U\": \"Ũ\", \"\\\"U\": \"Ü\", \"oU\": \"Ů\", \"=U\": \"Ū\", \"uU\": \"Ŭ\", \";U\": \"Ų\",\n\t\t\"ae\": \"æ\", \"AE\": \"Æ\", \"oe\": \"œ\", \"OE\": \"Œ\", \"ss\": \"ß\",\n\t\t\"'c\": \"ć\", \"^c\": \"ĉ\", \"uc\": \"č\", \"cc\": \"ç\", \".c\": \"ċ\", \"cC\": \"Ç\", \"'C\": \"Ć\", \"^C\": \"Ĉ\", \"uC\": \"Č\", \".C\": \"Ċ\",\n\t\t\"~N\": \"Ñ\", \"~n\": \"ñ\",\n\t\t\"=s\": \"š\", \"vs\": \"š\",\n\t\t\"DH\": \"Ð\", \"dh\": \"ð\",\n\t\t\"HO\": \"Ő\", \"Ho\": \"ő\", \"HU\": \"Ű\", \"Hu\": \"ű\",\n\t\t\"'Y\": \"Ý\", \"'y\": \"ý\", \"^Y\": \"Ŷ\", \"^y\": \"ŷ\", \"\\\"Y\": \"Ÿ\", \"\\\"y\": \"ÿ\",\n\t\t\"vS\": \"Š\", \"vZ\": \"Ž\", \"vz\": 'ž'\n\n// More chars: IJ ij Ď ď Đ đ Ĝ ĝ Ğ ğ Ġ ġ Ģ ģ Ĥ ĥ Ħ ħ Ĵ ĵ Ķ ķ ĸ Ĺ ĺ Ļ ļ Ľ ľ Ŀ ŀ Ł ł Ń ń Ņ ņ Ň ň ʼn Ŋ ŋ Ŕ ŕ Ŗ ŗ Ř ř Ś ś Ŝ ŝ Ş ş Š Ţ ţ Ť ť Ŧ ŧ Ŵ ŵ Ź ź Ż ż Ž\n\t};\n\tvar charMap1 = {\n\t\t\"#\": \"♯\",\n\t\t\"b\": \"♭\",\n\t\t\"=\": \"♮\"\n\t};\n\tvar charMap2 = {\n\t\t\"201\": \"♯\",\n\t\t\"202\": \"♭\",\n\t\t\"203\": \"♮\",\n\t\t\"241\": \"¡\",\n\t\t\"242\": \"¢\", \"252\": \"a\", \"262\": \"2\", \"272\": \"o\", \"302\": \"Â\", \"312\": \"Ê\", \"322\": \"Ò\", \"332\": \"Ú\", \"342\": \"â\", \"352\": \"ê\", \"362\": \"ò\", \"372\": \"ú\",\n\t\t\"243\": \"£\", \"253\": \"«\", \"263\": \"3\", \"273\": \"»\", \"303\": \"Ã\", \"313\": \"Ë\", \"323\": \"Ó\", \"333\": \"Û\", \"343\": \"ã\", \"353\": \"ë\", \"363\": \"ó\", \"373\": \"û\",\n\t\t\"244\": \"¤\", \"254\": \"¬\", \"264\": \" ́\", \"274\": \"1⁄4\", \"304\": \"Ä\", \"314\": \"Ì\", \"324\": \"Ô\", \"334\": \"Ü\", \"344\": \"ä\", \"354\": \"ì\", \"364\": \"ô\", \"374\": \"ü\",\n\t\t\"245\": \"¥\", \"255\": \"-\", \"265\": \"μ\", \"275\": \"1⁄2\", \"305\": \"Å\", \"315\": \"Í\", \"325\": \"Õ\", \"335\": \"Ý\", \"345\": \"å\", \"355\": \"í\", \"365\": \"õ\", \"375\": \"ý\",\n\t\t\"246\": \"¦\", \"256\": \"®\", \"266\": \"¶\", \"276\": \"3⁄4\", \"306\": \"Æ\", \"316\": \"Î\", \"326\": \"Ö\", \"336\": \"Þ\", \"346\": \"æ\", \"356\": \"î\", \"366\": \"ö\", \"376\": \"þ\",\n\t\t\"247\": \"§\", \"257\": \" ̄\", \"267\": \"·\", \"277\": \"¿\", \"307\": \"Ç\", \"317\": \"Ï\", \"327\": \"×\", \"337\": \"ß\", \"347\": \"ç\", \"357\": \"ï\", \"367\": \"÷\", \"377\": \"ÿ\",\n\t\t\"250\": \" ̈\", \"260\": \"°\", \"270\": \" ̧\", \"300\": \"À\", \"310\": \"È\", \"320\": \"Ð\", \"330\": \"Ø\", \"340\": \"à\", \"350\": \"è\", \"360\": \"ð\", \"370\": \"ø\",\n\t\t\"251\": \"©\", \"261\": \"±\", \"271\": \"1\", \"301\": \"Á\", \"311\": \"É\", \"321\": \"Ñ\", \"331\": \"Ù\", \"341\": \"á\", \"351\": \"é\", \"361\": \"ñ\", \"371\": \"ù\" };\n\tthis.translateString = function(str) {\n\t\tvar arr = str.split('\\\\');\n\t\tif (arr.length === 1) return str;\n\t\tvar out = null;\n\t\tarr.forEach(function(s) {\n\t\t\tif (out === null)\n\t\t\t\tout = s;\n\t\t\telse {\n\t\t\t\tvar c = charMap[s.substring(0, 2)];\n\t\t\t\tif (c !== undefined)\n\t\t\t\t\tout += c + s.substring(2);\n\t\t\t\telse {\n\t\t\t\t\tc = charMap2[s.substring(0, 3)];\n\t\t\t\t\tif (c !== undefined)\n\t\t\t\t\t\tout += c + s.substring(3);\n\t\t\t\t\telse {\n\t\t\t\t\t\tc = charMap1[s.substring(0, 1)];\n\t\t\t\t\t\tif (c !== undefined)\n\t\t\t\t\t\t\tout += c + s.substring(1);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tout += \"\\\\\" + s;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\treturn out;\n\t};\n\tthis.getNumber = function(line, index) {\n\t\tvar num = 0;\n\t\twhile (index < line.length) {\n\t\t\tswitch (line[index]) {\n\t\t\t\tcase '0':num = num*10;index++;break;\n\t\t\t\tcase '1':num = num*10+1;index++;break;\n\t\t\t\tcase '2':num = num*10+2;index++;break;\n\t\t\t\tcase '3':num = num*10+3;index++;break;\n\t\t\t\tcase '4':num = num*10+4;index++;break;\n\t\t\t\tcase '5':num = num*10+5;index++;break;\n\t\t\t\tcase '6':num = num*10+6;index++;break;\n\t\t\t\tcase '7':num = num*10+7;index++;break;\n\t\t\t\tcase '8':num = num*10+8;index++;break;\n\t\t\t\tcase '9':num = num*10+9;index++;break;\n\t\t\t\tdefault:\n\t\t\t\t\treturn {num: num, index: index};\n\t\t\t}\n\t\t}\n\t\treturn {num: num, index: index};\n\t};\n\n\tthis.getFraction = function(line, index) {\n\t\tvar num = 1;\n\t\tvar den = 1;\n\t\tif (line[index] !== '/') {\n\t\t\tvar ret = this.getNumber(line, index);\n\t\t\tnum = ret.num;\n\t\t\tindex = ret.index;\n\t\t}\n\t\tif (line[index] === '/') {\n\t\t\tindex++;\n\t\t\tif (line[index] === '/') {\n\t\t\t\tvar div = 0.5;\n\t\t\t\twhile (line[index++] === '/')\n\t\t\t\t\tdiv = div /2;\n\t\t\t\treturn {value: num * div, index: index-1};\n\t\t\t} else {\n\t\t\t\tvar iSave = index;\n\t\t\t\tvar ret2 = this.getNumber(line, index);\n\t\t\t\tif (ret2.num === 0 && iSave === index)\t// If we didn't use any characters, it is an implied 2\n\t\t\t\t\tret2.num = 2;\n\t\t\t\tif (ret2.num !== 0)\n\t\t\t\t\tden = ret2.num;\n\t\t\t\tindex = ret2.index;\n\t\t\t}\n\t\t}\n\n\t\treturn {value: num/den, index: index};\n\t};\n\n//\n// MAE 10 Jan 2023 - For better handling of tunes that have tune numbers in front of them.\n//\n// Previous version would take:\n// 21. Woman of the House, The\n// and return:\n// The 21. Woman of the House\n// \n// This fix results in:\n// 21. The Woman of the House\n//\n// Also added additional checks and handlers for lower case \", the\" and \", a\" since I found several tune collections with those tune name constructs\n//\n// Find an optional title number at the start of a tune title\nfunction getTitleNumber(str){\n\n const regex = /^(\\d+)\\./;\n\n // Use the exec method to search for the pattern in the string\n const match = regex.exec(str);\n\n // Check if a match is found\n if (match) {\n\n\t// The matched number is captured in the first group (index 1)\n\tconst foundNumber = match[1];\n\treturn foundNumber;\n\n } else {\n\n\t// Return null if no match is found\n\treturn null;\n\t\n }\n\n}\n\nvar thePatterns = [\n\t{ match: /,\\s*[Tt]he$/, replace: \"The \" },\n\t{ match: /,\\s*[Aa]$/, replace: \"A \" },\n\t{ match: /,\\s*[Aa]n$/, replace: \"An \" },\n]\n\nthis.theReverser = function (str) {\n\n for (var i = 0; i < thePatterns.length; i++) {\n\t\tvar thisPattern = thePatterns[i]\n\t\tvar match = str.match(thisPattern.match)\n\t\tif (match) {\n\t\t\tvar theTitleNumber = getTitleNumber(str);\n\t\t\tif (theTitleNumber){\n\t\t\n\t\t\t //console.log(\"theReverser The titlenumber:\"+theTitleNumber); \n\t\t\n\t\t\t str = str.replace(theTitleNumber+\".\",\"\");\n\t\t\t str = str.trim();\n\t\t\t}\n\t\t\tvar len = match[0].length\n\t\t\tvar result = thisPattern.replace + str.substring(0, str.length - len);\n\t\t\n\t\t\tif (theTitleNumber){\n\t\t\t result = theTitleNumber+\". \"+result;\n\t\t\t}\n\t\t\t\n\t\t\treturn result;\n\n\t\t}\n\t}\n\n return str;\n\n };\n\n\tthis.stripComment = function(str) {\n\t\tvar i = str.indexOf('%');\n\t\tif (i >= 0)\n\t\t\treturn parseCommon.strip(str.substring(0, i));\n\t\treturn parseCommon.strip(str);\n\t};\n\n\tthis.getInt = function(str) {\n\t\t// This parses the beginning of the string for a number and returns { value: num, digits: num }\n\t\t// If digits is 0, then the string didn't point to a number.\n\t\tvar x = parseInt(str);\n\t\tif (isNaN(x))\n\t\t\treturn {digits: 0};\n\t\tvar s = \"\" + x;\n\t\tvar i = str.indexOf(s);\t// This is to account for leading spaces\n\t\treturn {value: x, digits: i+s.length};\n\t};\n\n\tthis.getFloat = function(str) {\n\t\t// This parses the beginning of the string for a number and returns { value: num, digits: num }\n\t\t// If digits is 0, then the string didn't point to a number.\n\t\tvar x = parseFloat(str);\n\t\tif (isNaN(x))\n\t\t\treturn {digits: 0};\n\t\tvar s = \"\" + x;\n\t\tvar i = str.indexOf(s);\t// This is to account for leading spaces\n\t\treturn {value: x, digits: i+s.length};\n\t};\n\n\tthis.getMeasurement = function(tokens) {\n\t\tif (tokens.length === 0) return { used: 0 };\n\t\tvar used = 1;\n\t\tvar num = '';\n\t\tif (tokens[0].token === '-') {\n\t\t\ttokens.shift();\n\t\t\tnum = '-';\n\t\t\tused++;\n\t\t}\n\t\telse if (tokens[0].type !== 'number') return { used: 0 };\n\t\tnum += tokens.shift().token;\n\t\tif (tokens.length === 0) return { used: 1, value: parseInt(num) };\n\t\tvar x = tokens.shift();\n\t\tif (x.token === '.') {\n\t\t\tused++;\n\t\t\tif (tokens.length === 0) return { used: used, value: parseInt(num) };\n\t\t\tif (tokens[0].type === 'number') {\n\t\t\t\tx = tokens.shift();\n\t\t\t\tnum = num + '.' + x.token;\n\t\t\t\tused++;\n\t\t\t\tif (tokens.length === 0) return { used: used, value: parseFloat(num) };\n\t\t\t}\n\t\t\tx = tokens.shift();\n\t\t}\n\t\tswitch (x.token) {\n\t\t\tcase 'pt': return { used: used+1, value: parseFloat(num) };\n\t\t\tcase 'px': return { used: used+1, value: parseFloat(num) };\n\t\t\tcase 'cm': return { used: used+1, value: parseFloat(num)/2.54*72 };\n\t\t\tcase 'in': return { used: used+1, value: parseFloat(num)*72 };\n\t\t\tdefault: tokens.unshift(x); return { used: used, value: parseFloat(num) };\n\t\t}\n\t};\n\tvar substInChord = function(str) {\n\t\tstr = str.replace(/\\\\n/g, \"\\n\");\n\t\tstr = str.replace(/\\\\\"/g, '\"');\n\t\treturn str;\n\t};\n\tthis.getBrackettedSubstring = function(line, i, maxErrorChars, _matchChar)\n\t{\n\t\t// This extracts the sub string by looking at the first character and searching for that\n\t\t// character later in the line (or search for the optional _matchChar).\n\t\t// For instance, if the first character is a quote it will look for\n\t\t// the end quote. If the end of the line is reached, then only up to the default number\n\t\t// of characters are returned, so that a missing end quote won't eat up the entire line.\n\t\t// It returns the substring and the number of characters consumed.\n\t\t// The number of characters consumed is normally two more than the size of the substring,\n\t\t// but in the error case it might not be.\n\t\tvar matchChar = _matchChar || line[i];\n\t\tvar pos = i+1;\n\t\tvar esc = false;\n\t\twhile ((pos < line.length) && (esc || line[pos] !== matchChar)) {\n\t\t\tesc = line[pos] === '\\\\';\n\t\t\t++pos;\n\t\t}\n\t\tif (line[pos] === matchChar)\n\t\t\treturn [pos-i+1,substInChord(line.substring(i+1, pos)), true];\n\t\telse\t// we hit the end of line, so we'll just pick an arbitrary num of chars so the line doesn't disappear.\n\t\t{\n\t\t\tpos = i+maxErrorChars;\n\t\t\tif (pos > line.length-1)\n\t\t\t\tpos = line.length-1;\n\t\t\treturn [pos-i+1, substInChord(line.substring(i+1, pos)), false];\n\t\t}\n\t};\n};\n\nTokenizer.prototype.peekLine = function() {\n\treturn this.lines[this.lineIndex]\n}\n\nTokenizer.prototype.nextLine = function() {\n\tif (this.lineIndex > 0) {\n\t\tthis.multilineVars.iChar += this.lines[this.lineIndex-1].length + 1;\n\t}\n\tif (this.lineIndex < this.lines.length) {\n\t\tvar result = this.lines[this.lineIndex]\n\t\tthis.lineIndex++\n\t\treturn result\n\t}\n\treturn null\n}\n\nmodule.exports = Tokenizer;\n","// wrap_lines.js: does line wrap on an already parsed tune.\n\nfunction wrapLines(tune, lineBreaks, barNumbers) {\n\tif (!lineBreaks || tune.lines.length === 0)\n\t\treturn;\n\n\t// tune.lines contains nested arrays: there is an array of lines (that's the part this function rewrites),\n\t// there is an array of staffs per line (for instance, piano will have 2, orchestra will have many)\n\t// there is an array of voices per staff (for instance, 4-part harmony might have bass and tenor on a single staff)\n\tvar lines = tune.deline({lineBreaks: false});\n\tvar linesBreakElements = findLineBreaks(lines, lineBreaks);\n\t//console.log(JSON.stringify(linesBreakElements))\n\ttune.lines = addLineBreaks(lines, linesBreakElements, barNumbers);\n\ttune.lineBreaks = linesBreakElements;\n}\n\nfunction addLineBreaks(lines, linesBreakElements, barNumbers) {\n\t// linesBreakElements is an array of all of the elements that break for a new line\n\t// The objects in the array look like:\n\t// {\"ogLine\":0,\"line\":0,\"staff\":0,\"voice\":0,\"start\":0, \"end\":21}\n\t// ogLine is the original line that it came from,\n\t// line is the target line.\n\t// then copy all the elements from start to end for the staff and voice specified.\n\t// If the item doesn't contain \"staff\" then it is a non music line and should just be copied.\n\tvar outputLines = [];\n\tvar lastKeySig = []; // This is per staff - if the key changed then this will be populated.\n\tvar lastStem = [];\n\tvar currentBarNumber = 1;\n\tfor (var i = 0; i < linesBreakElements.length; i++) {\n\t\tvar action = linesBreakElements[i];\n\t\tif (lines[action.ogLine].staff) {\n\t\t\tvar inputStaff = lines[action.ogLine].staff[action.staff];\n\t\t\tif (!outputLines[action.line]) {\n\t\t\t\toutputLines[action.line] = {staff: []}\n\t\t\t}\n\t\t\tif (!outputLines[action.line].staff[action.staff]) {\n\t\t\t\toutputLines[action.line].staff[action.staff] = {voices: []};\n\t\t\t\tif (barNumbers !== undefined && action.staff === 0 && action.line > 0) {\n\t\t\t\t\toutputLines[action.line].staff[action.staff].barNumber = currentBarNumber;\n\t\t\t\t}\n\t\t\t\tvar keys = Object.keys(inputStaff)\n\t\t\t\tfor (var k = 0; k < keys.length; k++) {\n\t\t\t\t\tvar skip = keys[k] === \"voices\";\n\t\t\t\t\tif (keys[k] === \"meter\" && action.line !== 0)\n\t\t\t\t\t\tskip = true;\n\t\t\t\t\tif (!skip)\n\t\t\t\t\t\toutputLines[action.line].staff[action.staff][keys[k]] = inputStaff[keys[k]];\n\t\t\t\t}\n\t\t\t\tif (lastKeySig[action.staff])\n\t\t\t\t\toutputLines[action.line].staff[action.staff].key = lastKeySig[action.staff];\n\n\t\t\t}\n\t\t\tif (!outputLines[action.line].staff[action.staff].voices[action.voice]) {\n\t\t\t\toutputLines[action.line].staff[action.staff].voices[action.voice] = [];\n\t\t\t}\n\t\t\toutputLines[action.line].staff[action.staff].voices[action.voice] =\n\t\t\t\tlines[action.ogLine].staff[action.staff].voices[action.voice].slice(action.start, action.end+1);\n\t\t\tif (lastStem[action.staff*10+action.voice])\n\t\t\t\toutputLines[action.line].staff[action.staff].voices[action.voice].unshift({el_type: \"stem\", direction: lastStem[action.staff*10+action.voice].direction})\n\t\t\tvar currVoice = outputLines[action.line].staff[action.staff].voices[action.voice];\n\t\t\tfor (var kk = currVoice.length-1; kk >= 0; kk--) {\n\t\t\t\tif (currVoice[kk].el_type === \"key\") {\n\t\t\t\t\tlastKeySig[action.staff] = {\n\t\t\t\t\t\troot: currVoice[kk].root,\n\t\t\t\t\t\tacc: currVoice[kk].acc,\n\t\t\t\t\t\tmode: currVoice[kk].mode,\n\t\t\t\t\t\taccidentals: currVoice[kk].accidentals.filter(function (acc) { return acc.acc !== 'natural' })\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (kk = currVoice.length-1; kk >= 0; kk--) {\n\t\t\t\tif (currVoice[kk].el_type === \"stem\") {\n\t\t\t\t\tlastStem[action.staff*10+action.voice] = {\n\t\t\t\t\t\tdirection: currVoice[kk].direction,\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (barNumbers !== undefined && action.staff === 0 && action.voice === 0) {\n\t\t\t\tfor (kk = 0; kk < currVoice.length; kk++) {\n\t\t\t\t\tif (currVoice[kk].el_type === 'bar') {\n\t\t\t\t\t\tcurrentBarNumber++\n\t\t\t\t\t\tif (kk === currVoice.length-1)\n\t\t\t\t\t\t\tdelete currVoice[kk].barNumber\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tcurrVoice[kk].barNumber = currentBarNumber\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\toutputLines[action.line] = lines[action.ogLine];\n\t\t}\n\t}\n\t// There could be some missing info - if the tune passed in was incomplete or had different lengths for different voices or was missing a voice altogether - just fill in the gaps.\n\tfor (var ii = 0; ii < outputLines.length; ii++) {\n\t\tif (outputLines[ii].staff) {\n\t\t\toutputLines[ii].staff = outputLines[ii].staff.filter(function (el) {\n\t\t\t\treturn el != null;\n\t\t\t});\n\t\t}\n\t}\n\treturn outputLines;\n}\n\n\nfunction findLineBreaks(lines, lineBreakArray) {\n\t// lineBreakArray is an array of all of the sections of the tune - often there will just be one\n\t// section unless there is a subtitle or other non-music lines. Each of the elements of\n\t// Each element of lineBreakArray is an array of the zero-based last measure of the line.\n\tvar lineBreakIndexes = [];\n\tvar lbai = 0;\n\tvar lineCounter = 0;\n\tvar outputLine = 0;\n\tfor (var i = 0; i < lines.length; i++) {\n\t\tvar line = lines[i];\n\t\tif (line.staff) {\n\t\t\tvar lineStart = lineCounter;\n\t\t\tvar lineBreaks = lineBreakArray[lbai];\n\t\t\tlbai++;\n\t\t\tfor (var j = 0; j < line.staff.length; j++) {\n\t\t\t\tvar staff = line.staff[j];\n\t\t\t\tfor (var k = 0; k < staff.voices.length; k++) {\n\t\t\t\t\toutputLine = lineStart;\n\t\t\t\t\tvar measureNumber = 0;\n\t\t\t\t\tvar lbi = 0;\n\t\t\t\t\tvar voice = staff.voices[k];\n\t\t\t\t\tvar start = 0;\n\t\t\t\t\tfor (var e = 0; e < voice.length; e++) {\n\t\t\t\t\t\tvar el = voice[e];\n\n\t\t\t\t\t\tif (el.el_type === 'bar') {\n\t\t\t\t\t\t\tif (lineBreaks[lbi] === measureNumber) {\n\t\t\t\t\t\t\t\tlineBreakIndexes.push({ ogLine: i, line: outputLine, staff: j, voice: k, start: start, end: e})\n\t\t\t\t\t\t\t\tstart = e + 1;\n\t\t\t\t\t\t\t\toutputLine++;\n\t\t\t\t\t\t\t\tlineCounter = Math.max(lineCounter, outputLine)\n\t\t\t\t\t\t\t\tlbi++;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tmeasureNumber++;\n\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tlineBreakIndexes.push({ ogLine: i, line: outputLine, staff: j, voice: k, start: start, end: voice.length})\n\t\t\t\t\toutputLine++;\n\t\t\t\t\tlineCounter = Math.max(lineCounter, outputLine)\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tlineBreakIndexes.push({ ogLine: i, line: outputLine })\n\t\t\toutputLine++;\n\t\t\tlineCounter = Math.max(lineCounter, outputLine)\n\t\t}\n\t}\n\treturn lineBreakIndexes;\n}\n\n\nfunction freeFormLineBreaks(widths, lineBreakPoint) {\n\tvar lineBreaks = [];\n\tvar totals = [];\n\tvar totalThisLine = 0;\n\t// run through each measure and see if the accumulation is less than the ideal.\n\t// if it passes the ideal, then see whether the last or this one is closer to the ideal.\n\tfor (var i = 0; i < widths.length; i++) {\n\t\tvar width = widths[i];\n\t\tvar attemptedWidth = totalThisLine + width;\n\t\tif (attemptedWidth < lineBreakPoint)\n\t\t\ttotalThisLine = attemptedWidth;\n\t\telse {\n\t\t\t// This just passed the ideal, so see whether the previous or the current number of measures is closer.\n\t\t\tvar oldDistance = lineBreakPoint - totalThisLine;\n\t\t\tvar newDistance = attemptedWidth - lineBreakPoint;\n\t\t\tif (oldDistance < newDistance && totalThisLine > 0) {\n\t\t\t\tlineBreaks.push(i - 1);\n\t\t\t\ttotals.push(Math.round(totalThisLine - width));\n\t\t\t\ttotalThisLine = width;\n\t\t\t} else {\n\t\t\t\tif (i < widths.length-1) {\n\t\t\t\t\tlineBreaks.push(i);\n\t\t\t\t\ttotals.push(Math.round(totalThisLine));\n\t\t\t\t\ttotalThisLine = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\ttotals.push(Math.round(totalThisLine));\n\treturn { lineBreaks: lineBreaks, totals: totals };\n}\n\nfunction clone(arr) {\n\tvar newArr = [];\n\tfor (var i = 0; i < arr.length; i++)\n\t\tnewArr.push(arr[i]);\n\treturn newArr;\n}\n\nfunction oneTry(measureWidths, idealWidths, accumulator, lineAccumulator, lineWidths, lastVariance, highestVariance, currLine, lineBreaks, startIndex, otherTries) {\n\tfor (var i = startIndex; i < measureWidths.length; i++) {\n\t\tvar measureWidth = measureWidths[i];\n\t\taccumulator += measureWidth;\n\t\tlineAccumulator += measureWidth;\n\t\tvar thisVariance = Math.abs(accumulator - idealWidths[currLine]);\n\t\tvar varianceIsClose = Math.abs(thisVariance - lastVariance) < idealWidths[0] / 10; // see if the difference is less than 10%, if so, run the test both ways.\n\t\tif (varianceIsClose) {\n\t\t\tif (thisVariance < lastVariance) {\n\t\t\t\t// Also attempt one less measure on the current line - sometimes that works out better.\n\t\t\t\tvar newWidths = clone(lineWidths);\n\t\t\t\tvar newBreaks = clone(lineBreaks);\n\t\t\t\tnewBreaks.push(i-1);\n\t\t\t\tnewWidths.push(lineAccumulator - measureWidth);\n\t\t\t\totherTries.push({\n\t\t\t\t\taccumulator: accumulator,\n\t\t\t\t\tlineAccumulator: measureWidth,\n\t\t\t\t\tlineWidths: newWidths,\n\t\t\t\t\tlastVariance: Math.abs(accumulator - idealWidths[currLine+1]),\n\t\t\t\t\thighestVariance: Math.max(highestVariance, lastVariance),\n\t\t\t\t\tcurrLine: currLine+1,\n\t\t\t\t\tlineBreaks: newBreaks,\n\t\t\t\t\tstartIndex: i+1});\n\t\t\t} else if (thisVariance > lastVariance && i < measureWidths.length-1) {\n\t\t\t\t// Also attempt one extra measure on this line.\n\t\t\t\tnewWidths = clone(lineWidths);\n\t\t\t\tnewBreaks = clone(lineBreaks);\n\t\t\t\t// newBreaks[newBreaks.length-1] = i;\n\t\t\t\t// newWidths[newWidths.length-1] = lineAccumulator;\n\t\t\t\totherTries.push({\n\t\t\t\t\taccumulator: accumulator,\n\t\t\t\t\tlineAccumulator: lineAccumulator,\n\t\t\t\t\tlineWidths: newWidths,\n\t\t\t\t\tlastVariance: thisVariance,\n\t\t\t\t\thighestVariance: Math.max(highestVariance, thisVariance),\n\t\t\t\t\tcurrLine: currLine,\n\t\t\t\t\tlineBreaks: newBreaks,\n\t\t\t\t\tstartIndex: i+1});\n\t\t\t}\n\t\t}\n\t\tif (thisVariance > lastVariance) {\n\t\t\tlineBreaks.push(i - 1);\n\t\t\tcurrLine++;\n\t\t\thighestVariance = Math.max(highestVariance, lastVariance);\n\t\t\tlastVariance = Math.abs(accumulator - idealWidths[currLine]);\n\t\t\tlineWidths.push(lineAccumulator - measureWidth);\n\t\t\tlineAccumulator = measureWidth;\n\t\t} else {\n\t\t\tlastVariance = thisVariance;\n\t\t}\n\t}\n\tlineWidths.push(lineAccumulator);\n}\n\nfunction optimizeLineWidths(widths, lineBreakPoint, lineBreaks, explanation) {\n\t//\tfigure out how many lines\n\tvar numLines = Math.ceil(widths.total / lineBreakPoint); // + 1 TODO-PER: this used to be plus one - not sure why\n\n\t//\tget the ideal width for a line (cumulative width / num lines) - approx the same as lineBreakPoint except for rounding\n\tvar idealWidth = Math.floor(widths.total / numLines);\n\n\t//\tget each ideal line width (1*ideal, 2*ideal, 3*ideal, etc)\n\tvar idealWidths = [];\n\tfor (var i = 0; i < numLines; i++)\n\t\tidealWidths.push(idealWidth*(i+1));\n\n\t//\tfrom first measure, step through accum. Widths until the abs of the ideal is greater than the last one.\n\t// This can sometimes look funny in edge cases, so when the length is within 10%, try one more or one less to see which is better.\n\t// This is better than trying all the possibilities because that would get to be a huge number for even a medium size piece.\n\t// This method seems to never generate more than about 16 tries and it is usually 4 or less.\n\tvar otherTries = [];\n\totherTries.push({\n\t\taccumulator: 0,\n\t\tlineAccumulator: 0,\n\t\tlineWidths: [],\n\t\tlastVariance: 999999,\n\t\thighestVariance: 0,\n\t\tcurrLine: 0,\n\t\tlineBreaks: [], // These are the zero-based last measure on each line\n\t\tstartIndex: 0});\n\tvar index = 0;\n\twhile (index < otherTries.length) {\n\t\toneTry(widths.measureWidths,\n\t\t\tidealWidths,\n\t\t\totherTries[index].accumulator,\n\t\t\totherTries[index].lineAccumulator,\n\t\t\totherTries[index].lineWidths,\n\t\t\totherTries[index].lastVariance,\n\t\t\totherTries[index].highestVariance,\n\t\t\totherTries[index].currLine,\n\t\t\totherTries[index].lineBreaks,\n\t\t\totherTries[index].startIndex,\n\t\t\totherTries);\n\t\tindex++;\n\t}\n\tfor (i = 0; i < otherTries.length; i++) {\n\t\tvar otherTry = otherTries[i];\n\t\totherTry.variances = [];\n\t\totherTry.aveVariance = 0;\n\t\tfor (var j = 0; j < otherTry.lineWidths.length; j++) {\n\t\t\tvar lineWidth = otherTry.lineWidths[j];\n\t\t\totherTry.variances.push(lineWidth - idealWidths[0]);\n\t\t\totherTry.aveVariance += Math.abs(lineWidth - idealWidths[0]);\n\t\t}\n\t\totherTry.aveVariance = otherTry.aveVariance / otherTry.lineWidths.length;\n\t\texplanation.attempts.push({ type: \"optimizeLineWidths\", lineBreaks: otherTry.lineBreaks, variances: otherTry.variances, aveVariance: otherTry.aveVariance, widths: widths.measureWidths });\n\t}\n\tvar smallest = 9999999;\n\tvar smallestIndex = -1;\n\tfor (i = 0; i < otherTries.length; i++) {\n\t\totherTry = otherTries[i];\n\t\tif (otherTry.aveVariance < smallest) {\n\t\t\tsmallest = otherTry.aveVariance;\n\t\t\tsmallestIndex = i;\n\t\t}\n\t}\n\treturn { failed: false, lineBreaks: otherTries[smallestIndex].lineBreaks, variance: otherTries[smallestIndex].highestVariance };\n}\n\nfunction fixedMeasureLineBreaks(widths, lineBreakPoint, preferredMeasuresPerLine) {\n\tvar lineBreaks = [];\n\tvar totals = [];\n\tvar thisWidth = 0;\n\tvar failed = false;\n\tfor (var i = 0; i < widths.length; i++) {\n\t\tthisWidth += widths[i];\n\t\tif (thisWidth > lineBreakPoint) {\n\t\t\tfailed = true;\n\t\t}\n\t\tif (i % preferredMeasuresPerLine === (preferredMeasuresPerLine-1)) {\n\t\t\tif (i !== widths.length-1) // Don't bother putting a line break for the last line - it's already a break.\n\t\t\t\tlineBreaks.push(i);\n\t\t\ttotals.push(Math.round(thisWidth));\n\t\t\tthisWidth = 0;\n\t\t}\n\t}\n\treturn { failed: failed, totals: totals, lineBreaks: lineBreaks };\n}\n\nfunction getRevisedTuneParams(lineBreaks, staffWidth, params) {\n\n\tvar revisedParams = {\n\t\tlineBreaks: lineBreaks,\n\t\tstaffwidth: staffWidth\n\t};\n\tfor (var key in params) {\n\t\tif (params.hasOwnProperty(key) && key !== 'wrap' && key !== 'staffwidth') {\n\t\t\trevisedParams[key] = params[key];\n\t\t}\n\t}\n\n\treturn { revisedParams: revisedParams };\n}\n\nfunction calcLineWraps(tune, widths, params) {\n\t// For calculating how much can go on the line, it depends on the width of the line. It is a convenience to just divide it here\n\t// by the minimum spacing instead of multiplying the min spacing later.\n\t// The scaling works differently: this is done by changing the scaling of the outer SVG, so the scaling needs to be compensated\n\t// for here, because the actual width will be different from the calculated numbers.\n\n\t// If the desired width is less than the margin, just punt and return the original tune\n\t//console.log(widths)\n\tif (widths.length === 0 || params.staffwidth < widths[0].left) {\n\t\treturn {\n\t\t\treParse: false,\n\t\t\texplanation: \"Staff width is narrower than the margin\",\n\t\t\trevisedParams: params\n\t\t};\n\t}\n\tvar scale = params.scale ? Math.max(params.scale, 0.1) : 1;\n\tvar minSpacing = params.wrap.minSpacing ? Math.max(parseFloat(params.wrap.minSpacing), 1) : 1;\n\tvar minSpacingLimit = params.wrap.minSpacingLimit ? Math.max(parseFloat(params.wrap.minSpacingLimit), 1) : minSpacing - 0.1;\n\tvar maxSpacing = params.wrap.maxSpacing ? Math.max(parseFloat(params.wrap.maxSpacing), 1) : undefined;\n\tif (params.wrap.lastLineLimit && !maxSpacing)\n\t\tmaxSpacing = Math.max(parseFloat(params.wrap.lastLineLimit), 1);\n\t// var targetHeight = params.wrap.targetHeight ? Math.max(parseInt(params.wrap.targetHeight, 10), 100) : undefined;\n\tvar preferredMeasuresPerLine = params.wrap.preferredMeasuresPerLine ? Math.max(parseInt(params.wrap.preferredMeasuresPerLine, 10), 0) : undefined;\n\n\tvar accumulatedLineBreaks = [];\n\tvar explanations = [];\n\tfor (var s = 0; s < widths.length; s++) {\n\t\tvar section = widths[s];\n\t\tvar usableWidth = params.staffwidth - section.left;\n\t\tvar lineBreakPoint = usableWidth / minSpacing / scale;\n\t\tvar minLineSize = usableWidth / maxSpacing / scale;\n\t\tvar allowableVariance = usableWidth / minSpacingLimit / scale;\n\t\tvar explanation = {\n\t\t\twidths: section,\n\t\t\tlineBreakPoint: lineBreakPoint,\n\t\t\tminLineSize: minLineSize,\n\t\t\tattempts: [],\n\t\t\tstaffWidth: params.staffwidth,\n\t\t\tminWidth: Math.round(allowableVariance)\n\t\t};\n\n\t\t// If there is a preferred number of measures per line, test that first. If none of the lines is too long, then we're finished.\n\t\tvar lineBreaks = null;\n\t\tif (preferredMeasuresPerLine) {\n\t\t\tvar f = fixedMeasureLineBreaks(section.measureWidths, lineBreakPoint, preferredMeasuresPerLine);\n\t\t\texplanation.attempts.push({\n\t\t\t\ttype: \"Fixed Measures Per Line\",\n\t\t\t\tpreferredMeasuresPerLine: preferredMeasuresPerLine,\n\t\t\t\tlineBreaks: f.lineBreaks,\n\t\t\t\tfailed: f.failed,\n\t\t\t\ttotals: f.totals\n\t\t\t});\n\t\t\tif (!f.failed)\n\t\t\t\tlineBreaks = f.lineBreaks;\n\t\t}\n\n\t\t// If we don't have lineBreaks yet, use the free form method of line breaks.\n\t\t// This will be called either if Preferred Measures is not used, or if the music is just weird - like a single measure is way too crowded.\n\t\tif (!lineBreaks) {\n\t\t\tvar ff = freeFormLineBreaks(section.measureWidths, lineBreakPoint);\n\t\t\texplanation.attempts.push({type: \"Free Form\", lineBreaks: ff.lineBreaks, totals: ff.totals});\n\t\t\tlineBreaks = ff.lineBreaks;\n\n\t\t\t// We now have an acceptable number of lines, but the measures may not be optimally distributed. See if there is a better distribution.\n\t\t\tif (lineBreaks.length > 0 && section.measureWidths.length < 25) {\n\t\t\t\t// Only do this if everything doesn't fit on one line.\n\t\t\t\t// This is an intensive operation and it is optional so just do it for shorter music.\n\t\t\t\tff = optimizeLineWidths(section, lineBreakPoint, lineBreaks, explanation);\n\t\t\t\texplanation.attempts.push({\n\t\t\t\t\ttype: \"Optimize\",\n\t\t\t\t\tfailed: ff.failed,\n\t\t\t\t\treason: ff.reason,\n\t\t\t\t\tlineBreaks: ff.lineBreaks,\n\t\t\t\t\ttotals: ff.totals\n\t\t\t\t});\n\t\t\t\tif (!ff.failed)\n\t\t\t\t\tlineBreaks = ff.lineBreaks;\n\t\t\t}\n\t\t}\n\t\taccumulatedLineBreaks.push(lineBreaks);\n\t\texplanations.push(explanation);\n\t}\n\t// If the vertical space exceeds targetHeight, remove a line and try again. If that is too crowded, then don't use it.\n\tvar staffWidth = params.staffwidth;\n\tvar ret = getRevisedTuneParams(accumulatedLineBreaks, staffWidth, params);\n\tret.explanation = explanations;\n\tret.reParse = true;\n\treturn ret;\n}\n\nmodule.exports = { wrapLines: wrapLines, calcLineWraps: calcLineWraps };\n","var spacing = {};\n\nspacing.FONTEM = 360;\nspacing.FONTSIZE = 30;\nspacing.STEP = spacing.FONTSIZE * 93 / 720;\nspacing.SPACE = 10;\nspacing.TOPNOTE = 15;\nspacing.STAVEHEIGHT = 100;\nspacing.INDENT = 50;\n\nmodule.exports = spacing;\n","// abc_midi_sequencer.js: Turn parsed abc into a linear series of events.\n\nvar sequence;\nvar parseCommon = require(\"../parse/abc_common\");\n\n(function() {\n\t\"use strict\";\n\n\tvar measureLength = 1; // This should be set by the meter, but just in case that is missing, we'll take a guess.\n\t// The abc is provided to us line by line. It might have repeats in it. We want to re arrange the elements to\n\t// be an array of voices with all the repeats embedded, and no lines. Then it is trivial to go through the events\n\t// one at a time and turn it into midi.\n\n\tvar PERCUSSION_PROGRAM = 128;\n\n\tsequence = function(abctune, options) {\n\t\t// Global options\n\t\toptions = options || {};\n\t\tvar qpm;\n\t\tvar program = options.program || 0;\t// The program if there isn't a program specified.\n\t\tvar transpose = options.midiTranspose || 0;\n\t\t// If the tune has a visual transpose then that needs to be subtracted out because we are getting the visual object.\n\t\tif (abctune.visualTranspose)\n\t\t\ttranspose -= abctune.visualTranspose;\n\t\tvar channel = options.channel || 0;\n\t\tvar channelExplicitlySet = false;\n\t\tvar drumPattern = options.drum || \"\";\n\t\tvar drumBars = options.drumBars || 1;\n\t\tvar drumIntro = options.drumIntro || 0;\n\t\tvar drumOn = drumPattern !== \"\";\n\t\tvar drumOffAfterIntro = !!options.drumOff\n\t\tvar style = []; // The note head style for each voice.\n\t\tvar rhythmHeadThisBar = false; // Rhythm notation was detected.\n\t\tvar crescendoSize = 50; // how much to increase or decrease volume when crescendo/diminuendo is encountered.\n\n\t\t// All of the above overrides need to be integers\n\t\tprogram = parseInt(program, 10);\n\t\ttranspose = parseInt(transpose, 10);\n\t\tchannel = parseInt(channel, 10);\n\t\tif (channel === 10)\n\t\t\tprogram = PERCUSSION_PROGRAM;\n\t\tdrumPattern = drumPattern.split(\" \");\n\t\tdrumBars = parseInt(drumBars, 10);\n\t\tdrumIntro = parseInt(drumIntro, 10);\n\n\t\tvar bagpipes = abctune.formatting.bagpipes; // If it is bagpipes, then the gracenotes are played on top of the main note.\n\t\tif (bagpipes)\n\t\t\tprogram = 71;\n\n\t\t// %%MIDI fermatafixed\n\t\t// %%MIDI fermataproportional\n\t\t// %%MIDI deltaloudness n\n\t\t// %%MIDI gracedivider b\n\t\t// %%MIDI ratio n m\n\t\t// %%MIDI beat a b c n\n\t\t// %%MIDI grace a/b\n\t\t// %%MIDI trim x/y\n\n\t\t// %MIDI gchordon\n\t\t// %MIDI gchordoff\n\t\t// %%MIDI bassprog 45\n\t\t// %%MIDI chordprog 24\n\t\t// %%MIDI chordname name n1 n2 n3 n4 n5 n6\n\n\t\t//%%MIDI beat ⟨int1⟩ ⟨int2⟩ ⟨int3⟩ ⟨int4⟩: controls the volumes of the notes in a measure. The first note in a bar has volume ⟨int1⟩; other ‘strong’ notes have volume ⟨int2⟩ and all the rest have volume ⟨int3⟩. These values must be in the range 0–127. The parameter ⟨int4⟩ determines which notes are ‘strong’. If the time signature is x/y, then each note is given a position number k = 0, 1, 2. . . x-1 within each bar. If k is a multiple of ⟨int4⟩, then the note is ‘strong’.\n\n\t\tvar startingMidi = [];\n\t\tif (abctune.formatting.midi) {\n\t\t\t//console.log(\"MIDI Formatting:\", abctune.formatting.midi);\n\t\t\tvar globals = abctune.formatting.midi;\n\t\t\tif (globals.program && globals.program.length > 0) {\n\t\t\t\tprogram = globals.program[0];\n\t\t\t\tif (globals.program.length > 1) {\n\t\t\t\t\tprogram = globals.program[1];\n\t\t\t\t\tchannel = globals.program[0];\n\t\t\t\t}\n\t\t\t\tchannelExplicitlySet = true;\n\t\t\t}\n\t\t\tif (globals.transpose)\n\t\t\t\ttranspose = globals.transpose[0];\n\t\t\tif (globals.channel) {\n\t\t\t\tchannel = globals.channel[0];\n\t\t\t\tchannelExplicitlySet = true;\n\t\t\t}\n\t\t\tif (globals.drum)\n\t\t\t\tdrumPattern = globals.drum;\n\t\t\tif (globals.drumbars)\n\t\t\t\tdrumBars = globals.drumbars[0];\n\t\t\tif (globals.drumon)\n\t\t\t\tdrumOn = true;\n\t\t\tif (channel === 10)\n\t\t\t\tprogram = PERCUSSION_PROGRAM;\n\t\t\tif (globals.beat)\n\t\t\t\tstartingMidi.push({ el_type: 'beat', beats: globals.beat })\n\t\t\tif (globals.nobeataccents)\n\t\t\t\tstartingMidi.push({ el_type: 'beataccents', value: false });\n\n\t\t}\n\n\t\t// Specified options in abc string.\n\n\t\t// If the tempo was passed in, use that.\n\t\t// If the tempo is specified, use that.\n\t\t// If there is a default, use that.\n\t\t// Otherwise, use the default.\n\t\tif (options.qpm)\n\t\t\tqpm = parseInt(options.qpm, 10);\n\t\telse if (abctune.metaText.tempo)\n\t\t\tqpm = interpretTempo(abctune.metaText.tempo, abctune.getBeatLength());\n\t\telse if (options.defaultQpm)\n\t\t\tqpm = options.defaultQpm;\n\t\telse\n\t\t\tqpm = 180; \t// The tempo if there isn't a tempo specified.\n\n\t\tvar startVoice = [];\n\t\tif (bagpipes)\n\t\t\tstartVoice.push({ el_type: 'bagpipes' });\n\t\tstartVoice.push({ el_type: 'instrument', program: program });\n\t\tif (channel)\n\t\t\tstartVoice.push({ el_type: 'channel', channel: channel });\n\t\tif (transpose)\n\t\t\tstartVoice.push({ el_type: 'transpose', transpose: transpose });\n\t\tstartVoice.push({ el_type: 'tempo', qpm: qpm });\n\t\tfor (var ss = 0; ss < startingMidi.length;ss++)\n\t\t\tstartVoice.push(startingMidi[ss]);\n\n\t\t// the relevant part of the input structure is:\n\t\t// abctune\n\t\t//\t\tarray lines\n\t\t//\t\t\tarray staff\n\t\t//\t\t\t\tobject key\n\t\t//\t\t\t\tobject meter\n\t\t//\t\t\t\tarray voices\n\t\t//\t\t\t\t\tarray abcelem\n\n\t\t// visit each voice completely in turn\n\t\tvar voices = [];\n\t\tvar inCrescendo = [];\n\t\tvar inDiminuendo = [];\n\t\tvar durationCounter = [0];\n\t\tvar tempoChanges = {};\n\t\ttempoChanges[\"0\"] = { el_type: 'tempo', qpm: qpm, timing: 0 };\n\t\tvar currentVolume;\n\t\tvar startRepeatPlaceholder = []; // There is a place holder for each voice.\n\t\tvar skipEndingPlaceholder = []; // This is the place where the first ending starts.\n\t\tvar startingDrumSet = false;\n\t\tvar lines = abctune.lines; //abctune.deline(); TODO-PER: can switch to this, then simplify the loops below.\n\t\tfor (var i = 0; i < lines.length; i++) {\n\t\t\t// For each group of staff lines in the tune.\n\t\t\tvar line = lines[i];\n\t\t\tif (line.staff) {\n\t\t\t\tvar staves = line.staff;\n\t\t\t\tvar voiceNumber = 0;\n\t\t\t\tfor (var j = 0; j < staves.length; j++) {\n\t\t\t\t\tvar staff = staves[j];\n\t\t\t\t\tif (staff.clef && staff.clef.type === \"TAB\")\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t// For each staff line\n\t\t\t\t\tfor (var k = 0; k < staff.voices.length; k++) {\n\t\t\t\t\t\t// For each voice in a staff line\n\t\t\t\t\t\tvar voice = staff.voices[k];\n\t\t\t\t\t\tif (!voices[voiceNumber]) {\n\t\t\t\t\t\t\tvoices[voiceNumber] = [].concat(JSON.parse(JSON.stringify(startVoice)));\n\t\t\t\t\t\t\tvar voiceName = getTrackTitle(line.staff, voiceNumber);\n\t\t\t\t\t\t\tif (voiceName)\n\t\t\t\t\t\t\t\tvoices[voiceNumber].unshift({el_type: \"name\", trackName: voiceName});\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Negate any transposition for the percussion staff.\n\t\t\t\t\t\tif (transpose && staff.clef.type === \"perc\")\n\t\t\t\t\t\t\tvoices[voiceNumber].push({ el_type: 'transpose', transpose: 0 });\n\n\t\t\t\t\t\tif (staff.clef && staff.clef.type === 'perc' && !channelExplicitlySet) {\n\t\t\t\t\t\t\tfor (var cl = 0; cl < voices[voiceNumber].length; cl++) {\n\t\t\t\t\t\t\t\tif (voices[voiceNumber][cl].el_type === 'instrument')\n\t\t\t\t\t\t\t\t\tvoices[voiceNumber][cl].program = PERCUSSION_PROGRAM;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (staff.key) {\n\t\t\t\t\t\t\taddKey(voices[voiceNumber], staff.key);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (staff.meter) {\n\t\t\t\t\t\t\taddMeter(voices[voiceNumber], staff.meter);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!startingDrumSet && drumOn) { // drum information is only needed once, so use the first line and track 0.\n\t\t\t\t\t\t\tvoices[voiceNumber].push({el_type: 'drum', params: {pattern: drumPattern, bars: drumBars, on: drumOn, intro: drumIntro}});\n\t\t\t\t\t\t\tstartingDrumSet = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (staff.clef && staff.clef.type !== \"perc\" && staff.clef.transpose) {\n\t\t\t\t\t\t\tstaff.clef.el_type = 'clef';\n\t\t\t\t\t\t\tvoices[voiceNumber].push({ el_type: 'transpose', transpose: staff.clef.transpose });\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (staff.clef && staff.clef.type) {\n\t\t\t\t\t\t\tif (staff.clef.type.indexOf(\"-8\") >= 0)\n\t\t\t\t\t\t\t\tvoices[voiceNumber].push({ el_type: 'transpose', transpose: -12 });\n\t\t\t\t\t\t\telse if (staff.clef.type.indexOf(\"+8\") >= 0)\n\t\t\t\t\t\t\t\tvoices[voiceNumber].push({ el_type: 'transpose', transpose: 12 });\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (abctune.formatting.midi && abctune.formatting.midi.drumoff) {\n\t\t\t\t\t\t\t// If there is a drum off command right at the beginning it is put in the metaText instead of the stream,\n\t\t\t\t\t\t\t// so we will just insert it here.\n\t\t\t\t\t\t\tvoices[voiceNumber].push({ el_type: 'bar' });\n\t\t\t\t\t\t\tvoices[voiceNumber].push({el_type: 'drum', params: {pattern: \"\", on: false }});\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvar noteEventsInBar = 0;\n\t\t\t\t\t\tvar tripletMultiplier = 0;\n\t\t\t\t\t\tvar tripletDurationTotal = 0; // try to mitigate the js rounding problems.\n\t\t\t\t\t\tvar tripletDurationCount = 0;\n\t\t\t\t\t\tcurrentVolume = [105, 95, 85, 1];\n\n\t\t\t\t\t\tfor (var v = 0; v < voice.length; v++) {\n\t\t\t\t\t\t\t// For each element in a voice\n\t\t\t\t\t\t\tvar elem = voice[v];\n\t\t\t\t\t\t\tswitch (elem.el_type) {\n\t\t\t\t\t\t\t\tcase \"note\":\n\t\t\t\t\t\t\t\t\tif (inCrescendo[k]) {\n\t\t\t\t\t\t\t\t\t\tcurrentVolume[0] += inCrescendo[k];\n\t\t\t\t\t\t\t\t\t\tcurrentVolume[1] += inCrescendo[k];\n\t\t\t\t\t\t\t\t\t\tcurrentVolume[2] += inCrescendo[k];\n\t\t\t\t\t\t\t\t\t\tvoices[voiceNumber].push({ el_type: 'beat', beats: currentVolume.slice(0) });\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tif (inDiminuendo[k]) {\n\t\t\t\t\t\t\t\t\t\tcurrentVolume[0] += inDiminuendo[k];\n\t\t\t\t\t\t\t\t\t\tcurrentVolume[1] += inDiminuendo[k];\n\t\t\t\t\t\t\t\t\t\tcurrentVolume[2] += inDiminuendo[k];\n\t\t\t\t\t\t\t\t\t\tvoices[voiceNumber].push({ el_type: 'beat', beats: currentVolume.slice(0) });\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tsetDynamics(elem);\n\n\t\t\t\t\t\t\t\t\t// regular items are just pushed.\n\t\t\t\t\t\t\t\t\tif (!elem.rest || elem.rest.type !== 'spacer') {\n\t\t\t\t\t\t\t\t\t\tvar noteElem = { elem: elem, el_type: \"note\", timing: durationCounter[voiceNumber] }; // Make a copy so that modifications aren't kept except for adding the midiPitches\n\t\t\t\t\t\t\t\t\t\tif (elem.style)\n\t\t\t\t\t\t\t\t\t\t\tnoteElem.style = elem.style;\n\t\t\t\t\t\t\t\t\t\telse if (style[voiceNumber])\n\t\t\t\t\t\t\t\t\t\t\tnoteElem.style = style[voiceNumber];\n\t\t\t\t\t\t\t\t\t\tnoteElem.duration = (elem.duration === 0) ? 0.25 : elem.duration;\n\t\t\t\t\t\t\t\t\t\tif (elem.startTriplet) {\n\t\t\t\t\t\t\t\t\t\t\ttripletMultiplier = elem.tripletMultiplier;\n\t\t\t\t\t\t\t\t\t\t\ttripletDurationTotal = elem.startTriplet * tripletMultiplier * elem.duration;\n\t\t\t\t\t\t\t\t\t\t\tif (elem.startTriplet !== elem.tripletR) { // most commonly (3:2:2\n\t\t\t\t\t\t\t\t\t\t\t\tif (v + elem.tripletR <= voice.length) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tvar durationTotal = 0;\n\t\t\t\t\t\t\t\t\t\t\t\t\tfor (var w = v; w < v + elem.tripletR; w++) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdurationTotal += voice[w].duration;\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\ttripletDurationTotal = tripletMultiplier * durationTotal;\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tnoteElem.duration = noteElem.duration * tripletMultiplier;\n\t\t\t\t\t\t\t\t\t\t\tnoteElem.duration = Math.round(noteElem.duration*1000000)/1000000;\n\t\t\t\t\t\t\t\t\t\t\ttripletDurationCount = noteElem.duration;\n\t\t\t\t\t\t\t\t\t\t} else if (tripletMultiplier) {\n\t\t\t\t\t\t\t\t\t\t\tif (elem.endTriplet) {\n\t\t\t\t\t\t\t\t\t\t\t\ttripletMultiplier = 0;\n\t\t\t\t\t\t\t\t\t\t\t\tnoteElem.duration = Math.round((tripletDurationTotal - tripletDurationCount)*1000000)/1000000;\n\t\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t\tnoteElem.duration = noteElem.duration * tripletMultiplier;\n\t\t\t\t\t\t\t\t\t\t\t\tnoteElem.duration = Math.round(noteElem.duration*1000000)/1000000;\n\t\t\t\t\t\t\t\t\t\t\t\ttripletDurationCount += noteElem.duration;\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tif (elem.rest) noteElem.rest = elem.rest;\n\t\t\t\t\t\t\t\t\t\tif (elem.decoration) noteElem.decoration = elem.decoration.slice(0);\n\t\t\t\t\t\t\t\t\t\tif (elem.pitches) noteElem.pitches = parseCommon.cloneArray(elem.pitches);\n\t\t\t\t\t\t\t\t\t\tif (elem.gracenotes) noteElem.gracenotes = parseCommon.cloneArray(elem.gracenotes);\n\t\t\t\t\t\t\t\t\t\tif (elem.chord) noteElem.chord = parseCommon.cloneArray(elem.chord);\n\n\t\t\t\t\t\t\t\t\t\tvoices[voiceNumber].push(noteElem);\n\t\t\t\t\t\t\t\t\t\tif (elem.style === \"rhythm\") {\n\t\t\t\t\t\t\t\t\t\t\trhythmHeadThisBar = true;\n\t\t\t\t\t\t\t\t\t\t\tchordVoiceOffThisBar(voices)\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tnoteEventsInBar++;\n\t\t\t\t\t\t\t\t\t\tdurationCounter[voiceNumber] += noteElem.duration;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase \"key\":\n\t\t\t\t\t\t\t\tcase \"keySignature\":\n\t\t\t\t\t\t\t\t\taddKey(voices[voiceNumber], elem);\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase \"meter\":\n\t\t\t\t\t\t\t\t\taddMeter(voices[voiceNumber], elem);\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase \"clef\": // need to keep this to catch the \"transpose\" element.\n\t\t\t\t\t\t\t\t\tif (elem.transpose)\n\t\t\t\t\t\t\t\t\t\tvoices[voiceNumber].push({ el_type: 'transpose', transpose: elem.transpose });\n\t\t\t\t\t\t\t\t\tif (elem.type) {\n\t\t\t\t\t\t\t\t\t\tif (elem.type.indexOf(\"-8\") >= 0)\n\t\t\t\t\t\t\t\t\t\t\tvoices[voiceNumber].push({ el_type: 'transpose', transpose: -12 });\n\t\t\t\t\t\t\t\t\t\telse if (elem.type.indexOf(\"+8\") >= 0)\n\t\t\t\t\t\t\t\t\t\t\tvoices[voiceNumber].push({ el_type: 'transpose', transpose: 12 });\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase \"tempo\":\n\t\t\t\t\t\t\t\t\tqpm = interpretTempo(elem, abctune.getBeatLength());\n\t\t\t\t\t\t\t\t\tvoices[voiceNumber].push({ el_type: 'tempo', qpm: qpm, timing: durationCounter[voiceNumber] });\n\t\t\t\t\t\t\t\t\ttempoChanges[''+durationCounter[voiceNumber]] = { el_type: 'tempo', qpm: qpm, timing: durationCounter[voiceNumber] };\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase \"bar\":\n\t\t\t\t\t\t\t\t\tif (noteEventsInBar > 0) // don't add two bars in a row.\n\t\t\t\t\t\t\t\t\t\tvoices[voiceNumber].push({ el_type: 'bar' }); // We need the bar marking to reset the accidentals.\n\t\t\t\t\t\t\t\t\tsetDynamics(elem);\n\t\t\t\t\t\t\t\t\tnoteEventsInBar = 0;\n\t\t\t\t\t\t\t\t\t// figure out repeats and endings --\n\t\t\t\t\t\t\t\t\t// The important part is where there is a start repeat, and end repeat, or a first ending.\n\t\t\t\t\t\t\t\t\tvar endRepeat = (elem.type === \"bar_right_repeat\" || elem.type === \"bar_dbl_repeat\");\n\t\t\t\t\t\t\t\t\tvar startEnding = (elem.startEnding === '1');\n\t\t\t\t\t\t\t\t\tvar startRepeat = (elem.type === \"bar_left_repeat\" || elem.type === \"bar_dbl_repeat\" || elem.type === \"bar_right_repeat\");\n\t\t\t\t\t\t\t\t\tif (endRepeat) {\n\t\t\t\t\t\t\t\t\t\tvar s = startRepeatPlaceholder[voiceNumber];\n\t\t\t\t\t\t\t\t\t\tif (!s) s = 0; // If there wasn't a left repeat, then we repeat from the beginning.\n\t\t\t\t\t\t\t\t\t\tvar e = skipEndingPlaceholder[voiceNumber];\n\t\t\t\t\t\t\t\t\t\tif (!e) e = voices[voiceNumber].length; // If there wasn't a first ending marker, then we copy everything.\n\t\t\t\t\t\t\t\t\t\t// duplicate each of the elements - this has to be a deep copy.\n\t\t\t\t\t\t\t\t\t\tfor (var z = s; z < e; z++) {\n\t\t\t\t\t\t\t\t\t\t\tvar item = Object.assign({},voices[voiceNumber][z]);\n\t\t\t\t\t\t\t\t\t\t\tif (item.pitches)\n\t\t\t\t\t\t\t\t\t\t\t\titem.pitches = parseCommon.cloneArray(item.pitches);\n\t\t\t\t\t\t\t\t\t\t\tvoices[voiceNumber].push(item);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t// reset these in case there is a second repeat later on.\n\t\t\t\t\t\t\t\t\t\tskipEndingPlaceholder[voiceNumber] = undefined;\n\t\t\t\t\t\t\t\t\t\tstartRepeatPlaceholder[voiceNumber] = undefined;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif (startEnding)\n\t\t\t\t\t\t\t\t\t\tskipEndingPlaceholder[voiceNumber] = voices[voiceNumber].length;\n\t\t\t\t\t\t\t\t\tif (startRepeat)\n\t\t\t\t\t\t\t\t\t\tstartRepeatPlaceholder[voiceNumber] = voices[voiceNumber].length;\n\t\t\t\t\t\t\t\t\trhythmHeadThisBar = false;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase 'style':\n\t\t\t\t\t\t\t\t\tstyle[voiceNumber] = elem.head;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase 'timeSignature':\n\t\t\t\t\t\t\t\t\tvoices[voiceNumber].push(interpretMeter(elem));\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase 'part':\n\t\t\t\t\t\t\t\t\t// TODO-PER: If there is a part section in the header, then this should probably affect the repeats.\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase 'stem':\n\t\t\t\t\t\t\t\tcase 'scale':\n\t\t\t\t\t\t\t\tcase 'break':\n\t\t\t\t\t\t\t\tcase 'font':\n\t\t\t\t\t\t\t\t\t// These elements don't affect sound\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase 'midi':\n\t\t\t\t\t\t\t\t\t//console.log(\"MIDI inline\", elem); // TODO-PER: for debugging. Remove this.\n\t\t\t\t\t\t\t\t\tvar drumChange = false;\n\t\t\t\t\t\t\t\t\tswitch (elem.cmd) {\n\t\t\t\t\t\t\t\t\t\tcase \"drumon\": drumOn = true; drumChange = true; break;\n\t\t\t\t\t\t\t\t\t\tcase \"drumoff\": drumOn = false; drumChange = true; break;\n\t\t\t\t\t\t\t\t\t\tcase \"drum\": drumPattern = elem.params; drumChange = true; break;\n\t\t\t\t\t\t\t\t\t\tcase \"drumbars\": drumBars = elem.params[0]; drumChange = true; break;\n\t\t\t\t\t\t\t\t\t\tcase \"drummap\":\n\t\t\t\t\t\t\t\t\t\t\t// This is handled before getting here so it can be ignored.\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\tcase \"channel\":\n\t\t\t\t\t\t\t\t\t\t\t// There's not much needed for the channel except to look out for the percussion channel\n\t\t\t\t\t\t\t\t\t\t\tif (elem.params[0] === 10)\n\t\t\t\t\t\t\t\t\t\t\t\tvoices[voiceNumber].push({ el_type: 'instrument', program: PERCUSSION_PROGRAM });\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\tcase \"program\":\n\t\t\t\t\t\t\t\t\t\t\taddIfDifferent(voices[voiceNumber], { el_type: 'instrument', program: elem.params[0] });\n\t\t\t\t\t\t\t\t\t\t\tchannelExplicitlySet = true;\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\tcase \"transpose\":\n\t\t\t\t\t\t\t\t\t\t\tvoices[voiceNumber].push({ el_type: 'transpose', transpose: elem.params[0] });\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\tcase \"gchordoff\":\n\t\t\t\t\t\t\t\t\t\t\tvoices[voiceNumber].push({ el_type: 'gchordOn', tacet: true });\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\tcase \"gchordon\":\n\t\t\t\t\t\t\t\t\t\t\tvoices[voiceNumber].push({ el_type: 'gchordOn', tacet: false });\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\tcase \"beat\":\n\t\t\t\t\t\t\t\t\t\t\tvoices[voiceNumber].push({ el_type: 'beat', beats: elem.params });\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\tcase \"nobeataccents\":\n\t\t\t\t\t\t\t\t\t\t\tvoices[voiceNumber].push({ el_type: 'beataccents', value: false });\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\tcase \"beataccents\":\n\t\t\t\t\t\t\t\t\t\t\tvoices[voiceNumber].push({ el_type: 'beataccents', value: true });\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\tcase \"vol\":\n\t\t\t\t\t\t\t\t\t\tcase \"volinc\":\n\t\t\t\t\t\t\t\t\t\t\tvoices[voiceNumber].push({ el_type: elem.cmd, volume: elem.params[0] });\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\tcase \"swing\":\n\t\t\t\t\t\t\t\t\t\tcase \"gchord\":\n\t\t\t\t\t\t\t\t\t\tcase \"bassvol\":\n\t\t\t\t\t\t\t\t\t\tcase \"chordvol\":\n\t\t\t\t\t\t\t\t\t\t\tvoices[voiceNumber].push({ el_type: elem.cmd, param: elem.params[0] });\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\tcase \"bassprog\": // MAE 22 May 2024\n\t\t\t\t\t\t\t\t\t\tcase \"chordprog\": // MAE 22 May 2024\n\t\t\t\t\t voices[voiceNumber].push({\n\t\t\t\t\t el_type: elem.cmd,\n\t\t\t\t\t value: elem.params[0],\n\t\t\t\t\t octaveShift: elem.params[1]\n\t\t\t\t\t });\n\t\t\t\t\t break;\n\n\t\t\t\t\t // MAE 23 Jun 2024\n\t\t\t\t\t case \"gchordbars\":\n\t\t\t\t\t voices[voiceNumber].push({\n\t\t\t\t\t el_type: elem.cmd,\n\t\t\t\t\t param: elem.params[0]\n\t\t\t\t\t });\n\t\t\t\t\t break;\n\t\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\t\tconsole.log(\"MIDI seq: midi cmd not handled: \", elem.cmd, elem);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif (drumChange) {\n\t\t\t\t\t\t\t\t\t\tvoices[0].push({el_type: 'drum', params: { pattern: drumPattern, bars: drumBars, intro: drumIntro, on: drumOn}});\n\t\t\t\t\t\t\t\t\t\tstartingDrumSet = true;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\tconsole.log(\"MIDI: element type \" + elem.el_type + \" not handled.\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvoiceNumber++;\n\t\t\t\t\t\tif (!durationCounter[voiceNumber])\n\t\t\t\t\t\t\tdurationCounter[voiceNumber] = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tfunction setDynamics(elem) {\n\t\t\t\t\tvar volumes = {\n\t\t\t\t\t\t'pppp': [15, 10, 5, 1],\n\t\t\t\t\t\t'ppp': [30, 20, 10, 1],\n\t\t\t\t\t\t'pp': [45, 35, 20, 1],\n\t\t\t\t\t\t'p': [60, 50, 35, 1],\n\t\t\t\t\t\t'mp': [75, 65, 50, 1],\n\t\t\t\t\t\t'mf': [90, 80, 65, 1],\n\t\t\t\t\t\t'f': [105, 95, 80, 1],\n\t\t\t\t\t\t'ff': [120, 110, 95, 1],\n\t\t\t\t\t\t'fff': [127, 125, 110, 1],\n\t\t\t\t\t\t'ffff': [127, 125, 110, 1]\n\t\t\t\t\t};\n\n\t\t\t\t\tvar dynamicType;\n\t\t\t\t\tif (elem.decoration) {\n\t\t\t\t\t\tif (elem.decoration.indexOf('pppp') >= 0)\n\t\t\t\t\t\t\tdynamicType = 'pppp';\n\t\t\t\t\t\telse if (elem.decoration.indexOf('ppp') >= 0)\n\t\t\t\t\t\t\tdynamicType = 'ppp';\n\t\t\t\t\t\telse if (elem.decoration.indexOf('pp') >= 0)\n\t\t\t\t\t\t\tdynamicType = 'pp';\n\t\t\t\t\t\telse if (elem.decoration.indexOf('p') >= 0)\n\t\t\t\t\t\t\tdynamicType = 'p';\n\t\t\t\t\t\telse if (elem.decoration.indexOf('mp') >= 0)\n\t\t\t\t\t\t\tdynamicType = 'mp';\n\t\t\t\t\t\telse if (elem.decoration.indexOf('mf') >= 0)\n\t\t\t\t\t\t\tdynamicType = 'mf';\n\t\t\t\t\t\telse if (elem.decoration.indexOf('f') >= 0)\n\t\t\t\t\t\t\tdynamicType = 'f';\n\t\t\t\t\t\telse if (elem.decoration.indexOf('ff') >= 0)\n\t\t\t\t\t\t\tdynamicType = 'ff';\n\t\t\t\t\t\telse if (elem.decoration.indexOf('fff') >= 0)\n\t\t\t\t\t\t\tdynamicType = 'fff';\n\t\t\t\t\t\telse if (elem.decoration.indexOf('ffff') >= 0)\n\t\t\t\t\t\t\tdynamicType = 'ffff';\n\n\t\t\t\t\t\tif (dynamicType) {\n\t\t\t\t\t\t\tcurrentVolume = volumes[dynamicType].slice(0);\n\t\t\t\t\t\t\tvoices[voiceNumber].push({ el_type: 'beat', beats: currentVolume.slice(0) });\n\t\t\t\t\t\t\tinCrescendo[k] = false;\n\t\t\t\t\t\t\tinDiminuendo[k] = false;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (elem.decoration.indexOf(\"crescendo(\") >= 0) {\n\t\t\t\t\t\t\tvar n = numNotesToDecoration(voice, v, \"crescendo)\");\n\t\t\t\t\t\t\tvar top = Math.min(127, currentVolume[0] + crescendoSize);\n\t\t\t\t\t\t\tvar endDec = endingVolume(voice, v+n+1, Object.keys(volumes));\n\t\t\t\t\t\t\tif (endDec)\n\t\t\t\t\t\t\t\ttop = volumes[endDec][0];\n\t\t\t\t\t\t\tif (n > 0)\n\t\t\t\t\t\t\t\tinCrescendo[k] = Math.floor((top - currentVolume[0]) / n);\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tinCrescendo[k] = false;\n\t\t\t\t\t\t\tinDiminuendo[k] = false;\n\t\t\t\t\t\t} else if (elem.decoration.indexOf(\"crescendo)\") >= 0) {\n\t\t\t\t\t\t\tinCrescendo[k] = false;\n\t\t\t\t\t\t} else if (elem.decoration.indexOf(\"diminuendo(\") >= 0) {\n\t\t\t\t\t\t\tvar n2 = numNotesToDecoration(voice, v, \"diminuendo)\");\n\t\t\t\t\t\t\tvar bottom = Math.max(15, currentVolume[0] - crescendoSize);\n\t\t\t\t\t\t\tvar endDec2 = endingVolume(voice, v+n2+1, Object.keys(volumes));\n\t\t\t\t\t\t\tif (endDec2)\n\t\t\t\t\t\t\t\tbottom = volumes[endDec2][0];\n\t\t\t\t\t\t\tinCrescendo[k] = false;\n\t\t\t\t\t\t\tif (n2 > 0)\n\t\t\t\t\t\t\t\tinDiminuendo[k] = Math.floor((bottom - currentVolume[0]) / n2);\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tinDiminuendo[k] = false;\n\t\t\t\t\t\t} else if (elem.decoration.indexOf(\"diminuendo)\") >= 0) {\n\t\t\t\t\t\t\tinDiminuendo[k] = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// If there are tempo changes, make sure they are in all the voices. This must be done post process because all the elements in all the voices need to be created first.\n\t\tinsertTempoChanges(voices, tempoChanges);\n\n\t\tif (drumIntro) {\n\t\t\tvar pickups = abctune.getPickupLength();\n\t\t\t// add some measures of rests to the start of each track.\n\t\t\tfor (var vv = 0; vv < voices.length; vv++) {\n\t\t\t\tvar insertPoint = 0;\n\t\t\t\twhile (voices[vv][insertPoint].el_type !== \"note\" && voices[vv].length > insertPoint)\n\t\t\t\t\tinsertPoint++;\n\t\t\t\tif (voices[vv].length > insertPoint) {\n\t\t\t\t\tfor (var w = 0; w < drumIntro; w++) {\n\t\t\t\t\t\t// If it is the last measure of intro, subtract the pickups.\n\t\t\t\t\t\tif (pickups === 0 || w < drumIntro-1) {\n\t\t\t\t\t\t\tvoices[vv].splice(insertPoint, 0, \n\t\t\t\t\t\t\t\t{el_type: \"note\", rest: {type: \"rest\"}, duration: measureLength},\n\t\t\t\t\t\t\t\t{ el_type: \"bar\" }\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tinsertPoint += 2\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tvoices[vv].splice(insertPoint++, 0, {el_type: \"note\", rest: {type: \"rest\"}, duration: measureLength-pickups});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (drumOffAfterIntro) {\n\t\t\t\t\t\tdrumOn = false\n\t\t\t\t\t\tvoices[vv].splice(insertPoint++, 0, {el_type: 'drum', params: { pattern: drumPattern, bars: drumBars, intro: drumIntro, on: drumOn}});\n\t\t\t\t\t\tdrumOffAfterIntro = false\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (voices.length > 0 && voices[0].length > 0) {\n\t\t\tvoices[0][0].pickupLength = abctune.getPickupLength();\n\t\t}\n\t\treturn voices;\n\t};\n\n\tfunction numNotesToDecoration(voice, start, decoration) {\n\t\tvar counter = 0;\n\t\tfor (var i = start+1; i < voice.length; i++) {\n\t\t\tif (voice[i].el_type === \"note\")\n\t\t\t\tcounter++;\n\t\t\tif (voice[i].decoration && voice[i].decoration.indexOf(decoration) >= 0)\n\t\t\t\treturn counter;\n\t\t}\n\t\treturn counter;\n\t}\n\tfunction endingVolume(voice, start, volumeDecorations) {\n\t\tvar end = Math.min(voice.length, start + 3); // If we have a volume within a couple notes of the end then assume that is the destination.\n\t\tfor (var i = start; i < end; i++) {\n\t\t\tif (voice[i].el_type === \"note\") {\n\t\t\t\tif (voice[i].decoration) {\n\t\t\t\t\tfor (var j = 0; j < voice[i].decoration.length; j++) {\n\t\t\t\t\t\tif (volumeDecorations.indexOf(voice[i].decoration[j]) >= 0)\n\t\t\t\t\t\t\treturn voice[i].decoration[j];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\tfunction insertTempoChanges(voices, tempoChanges) {\n\t\tif (!tempoChanges || tempoChanges.length === 0)\n\t\t\treturn;\n\t\tvar changePositions = Object.keys(tempoChanges);\n\t\tfor (var i = 0; i < voices.length; i++) {\n\t\t\tvar voice = voices[i];\n\t\t\tvar lastTempo = tempoChanges['0'] ? tempoChanges['0'].qpm : 0; // Don't insert redundant changes. This happens normally when repeating from the beginning, but could happen anywhere that there is a tempo marking that is the same as the last one.\n\t\t\tfor (var j = 0; j < voice.length; j++) {\n\t\t\t\tvar el = voice[j];\n\t\t\t\tif (el.el_type === \"tempo\")\n\t\t\t\t\tlastTempo = el.qpm;\n\t\t\t\tif (changePositions.indexOf(''+el.timing) >= 0 && lastTempo !== tempoChanges[''+el.timing].qpm) {\n\t\t\t\t\tlastTempo = tempoChanges[''+el.timing].qpm;\n\t\t\t\t\tif (el.el_type === \"tempo\") {\n\t\t\t\t\t\tel.qpm = tempoChanges[''+el.timing].qpm;\n\t\t\t\t\t\tj++; // when there is a tempo element the next element has the same timing and we don't want it to match the second time.\n\t\t\t\t\t} else {\n\t\t\t\t\t\t//console.log(\"tempo position\", i, j, el);\n\t\t\t\t\t\tvoices[i].splice(j, 0, {el_type: \"tempo\", qpm: tempoChanges[''+el.timing].qpm, timing: el.timing});\n\t\t\t\t\t\tj +=2; // skip the element we just inserted.\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction chordVoiceOffThisBar(voices) {\n\t\tfor (var i = 0; i < voices.length; i++) {\n\t\t\tvar voice = voices[i];\n\t\t\tvar j = voice.length-1;\n\t\t\twhile (j >= 0 && voice[j].el_type !== 'bar') {\n\t\t\t\tvoice[j].noChordVoice = true;\n\t\t\t\tj--;\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction getTrackTitle(staff, voiceNumber) {\n\t\tif (!staff || staff.length <= voiceNumber || !staff[voiceNumber].title)\n\t\t\treturn undefined;\n\t\treturn staff[voiceNumber].title.join(\" \");\n\t}\n\n\tfunction interpretTempo(element, beatLength) {\n\t\tvar duration = 1/4;\n\t\tif (element.duration) {\n\t\t\tduration = element.duration[0];\n\t\t}\n\t\tvar bpm = 60;\n\t\tif (element.bpm) {\n\t\t\tbpm = element.bpm;\n\t\t}\n\t\t// The tempo is defined with a beat length of \"duration\". If that isn't the natural beat length then there is a translation.\n\t\treturn duration * bpm / beatLength;\n\t}\n\n\tfunction interpretMeter(element) {\n\t\tvar meter;\n\t\tswitch (element.type) {\n\t\t\tcase \"common_time\":\n\t\t\t\tmeter = { el_type: 'meter', num: 4, den: 4 };\n\t\t\t\tbreak;\n\t\t\tcase \"cut_time\":\n\t\t\t\tmeter = { el_type: 'meter', num: 2, den: 2 };\n\t\t\t\tbreak;\n\t\t\tcase \"specified\":\n\t\t\t\t// TODO-PER: only taking the first meter, so the complex meters are not handled.\n\t\t\t\tmeter = { el_type: 'meter', num: element.value[0].num, den: element.value[0].den };\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\t// This should never happen.\n\t\t\t\tmeter = { el_type: 'meter' };\n\t\t}\n\t\tmeasureLength = meter.num/meter.den;\n\t\treturn meter;\n\t}\n\n\tfunction removeNaturals(accidentals) {\n\t\tvar acc = [];\n\t\tfor (var i = 0; i < accidentals.length; i++) {\n\t\t\tif (accidentals[i].acc !== \"natural\")\n\t\t\t\tacc.push(accidentals[i])\n\t\t}\n\t\treturn acc;\n\t}\n\tfunction addKey(arr, key) {\n\t\tvar newKey;\n\t\tif (key.root === 'HP')\n\t\t\tnewKey = {el_type: 'key', accidentals: [{acc: 'natural', note: 'g'}, {acc: 'sharp', note: 'f'}, {acc: 'sharp', note: 'c'}]};\n\t\telse\n\t\t\tnewKey = {el_type: 'key', accidentals: removeNaturals(key.accidentals) };\n\t\taddIfDifferent(arr, newKey);\n\t}\n\tfunction addMeter(arr, meter) {\n\t\tvar newMeter = interpretMeter(meter);\n\t\taddIfDifferent(arr, newMeter);\n\t}\n\tfunction addIfDifferent(arr, item) {\n\t\tfor (var i = arr.length-1; i >= 0; i--) {\n\t\t\tif (arr[i].el_type === item.el_type) {\n\t\t\t\tif (JSON.stringify(arr[i]) !== JSON.stringify(item))\n\t\t\t\t\tarr.push(item);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tarr.push(item);\n\t}\n\n})();\n\nmodule.exports = sequence;\n","//\n// The algorithm for chords is:\n// - The chords are done in a separate track.\n// - If there are notes before the first chord, then put that much silence to start the track.\n// - The pattern of chord expression depends on the meter, and how many chords are in a measure.\n// - There is a possibility that a measure will have an incorrect number of beats, if that is the case, then\n// start the pattern anew on the next measure number.\n// - If a chord root is not A-G, then ignore it as if the chord wasn't there at all.\n// - If a chord modification isn't in our supported list, change it to a major triad.\n//\n// - There is a standard pattern of boom-chick for each time sig, or it can be overridden.\n// - For any unrecognized meter, play the full chord on each beat.\n//\n//\t- If there is a chord specified that is not on a beat, move it earlier to the previous beat, unless there is already a chord on that beat.\n//\t- Otherwise, move it later, unless there is already a chord on that beat.\n// \t- Otherwise, ignore it. (TODO-PER: expand this as more support is added.)\n//\n// If there is any note in the melody that has a rhythm head, then assume the melody controls the rhythm, so there is no chord added for that entire measure.\n\nvar ChordTrack = function ChordTrack(numVoices, chordsOff, midiOptions, meter) {\n\tthis.chordTrack = [];\n\tthis.chordTrackFinished = false;\n\tthis.chordChannel = numVoices; // first free channel for chords\n\tthis.currentChords = [];\n\tthis.lastChord;\n\tthis.chordLastBar;\n\tthis.chordsOff = !!chordsOff\n\tthis.gChordTacet = this.chordsOff;\n\tthis.hasRhythmHead = false;\n\tthis.transpose = 0;\n\tthis.lastBarTime = 0;\n\tthis.meter = meter;\n\tthis.tempoChangeFactor = 1;\n\n\t// MAE 17 Jun 2024 - To allow for bass and chord instrument octave shifts\n\tthis.bassInstrument = midiOptions.bassprog && midiOptions.bassprog.length >= 1 ? midiOptions.bassprog[0] : 0;\n\tthis.chordInstrument = midiOptions.chordprog && midiOptions.chordprog.length >= 1 ? midiOptions.chordprog[0] : 0;\n\n\t// MAE For octave shifted bass and chords\n\tthis.bassOctaveShift = midiOptions.bassprog && midiOptions.bassprog.length === 2 ? midiOptions.bassprog[1] : 0;\n\tthis.chordOctaveShift = midiOptions.chordprog && midiOptions.chordprog.length === 2 ? midiOptions.chordprog[1] : 0;\n\n\tthis.boomVolume = midiOptions.bassvol && midiOptions.bassvol.length === 1 ? midiOptions.bassvol[0] : 64;\n\tthis.chickVolume = midiOptions.chordvol && midiOptions.chordvol.length === 1 ? midiOptions.chordvol[0] : 48;\n\n\t// This allows for an initial %%MIDI gchord with no string\n\tif (midiOptions.gchord && (midiOptions.gchord.length > 0)) {\n\t\tthis.overridePattern = parseGChord(midiOptions.gchord[0])\n\t}\n\telse {\n\t\tthis.overridePattern = undefined;\n\t}\n};\n\nChordTrack.prototype.setMeter = function (meter) {\n\tthis.meter = meter\n};\n\nChordTrack.prototype.setTempoChangeFactor = function (tempoChangeFactor) {\n\tthis.tempoChangeFactor = tempoChangeFactor\n};\n\nChordTrack.prototype.setLastBarTime = function (lastBarTime) {\n\tthis.lastBarTime = lastBarTime\n};\n\nChordTrack.prototype.setTranspose = function (transpose) {\n\tthis.transpose = transpose\n};\n\nChordTrack.prototype.setRhythmHead = function (isRhythmHead, elem) {\n\tthis.hasRhythmHead = isRhythmHead\n\tvar ePitches = [];\n\tif (isRhythmHead) {\n\t\tif (this.lastChord && this.lastChord.chick) {\n\t\t\tfor (var i2 = 0; i2 < this.lastChord.chick.length; i2++) {\n\t\t\t\tvar note2 = Object.assign({},elem.pitches[0]);\n\t\t\t\tnote2.actualPitch = this.lastChord.chick[i2];\n\t\t\t\tePitches.push(note2);\n\t\t\t}\n\t\t}\n\t}\n\treturn ePitches\n};\n\nChordTrack.prototype.barEnd = function (element) {\n\tif (this.chordTrack.length > 0 && !this.chordTrackFinished) {\n\t\tthis.resolveChords(this.lastBarTime, timeToRealTime(element.time));\n\t\tthis.currentChords = [];\n\t}\n\tthis.chordLastBar = this.lastChord;\n};\n\nChordTrack.prototype.gChordOn = function (element) {\n\tif (!this.chordsOff)\n\t\tthis.gChordTacet = element.tacet;\n};\n\nChordTrack.prototype.paramChange = function (element) {\n\tswitch (element.el_type) {\n\t\tcase \"gchord\":\n\t\t\t// Skips gchord elements that don't have pattern strings\n\t\t\tif (element.param && element.param.length > 0) {\n\t\t\t\tthis.overridePattern = parseGChord(element.param);\n\n\t\t\t\t// Generate a default duration scale based on the pattern\n\t\t\t\t//this.gchordduration = generateDefaultDurationScale(element.param);\n\t\t\t} else\n\t\t\t\tthis.overridePattern = undefined;\n\t\t\tbreak;\n\t\tcase \"bassprog\":\n\t\t\tthis.bassInstrument = element.value;\n\t\t\tif ((element.octaveShift != undefined) && (element.octaveShift != null)) {\n\t\t\t\tthis.bassOctaveShift = element.octaveShift;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.bassOctaveShift = 0;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase \"chordprog\":\n\t\t\tthis.chordInstrument = element.value;\n\t\t\tif ((element.octaveShift != undefined) && (element.octaveShift != null)) {\n\t\t\t\tthis.chordOctaveShift = element.octaveShift;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.chordOctaveShift = 0;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase \"bassvol\":\n\t\t\tthis.boomVolume = element.param;\n\t\t\tbreak;\n\t\tcase \"chordvol\":\n\t\t\tthis.chickVolume = element.param;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tconsole.log(\"unhandled midi param\", element)\t\n\t}\n};\n\nChordTrack.prototype.finish = function () {\n\tif (!this.chordTrackEmpty()) // Don't do chords on more than one track, so turn off chord detection after we create it.\n\t\tthis.chordTrackFinished = true;\n};\n\nChordTrack.prototype.addTrack = function (tracks) {\n\tif (!this.chordTrackEmpty())\n\t\ttracks.push(this.chordTrack);\n};\n\nChordTrack.prototype.findChord = function (elem) {\n\tif (this.gChordTacet)\n\t\treturn 'break';\n\n\t// TODO-PER: Just using the first chord if there are more than one.\n\tif (this.chordTrackFinished || !elem.chord || elem.chord.length === 0)\n\t\treturn null;\n\n\t// Return the first annotation that is a regular chord: that is, it is in the default place or is a recognized \"tacet\" phrase.\n\tfor (var i = 0; i < elem.chord.length; i++) {\n\t\tvar ch = elem.chord[i];\n\t\tif (ch.position === 'default')\n\t\t\treturn ch.name;\n\t\tif (this.breakSynonyms.indexOf(ch.name.toLowerCase()) >= 0)\n\t\t\treturn 'break';\n\t}\n\treturn null;\n}\n\nChordTrack.prototype.interpretChord = function (name) {\n\t// chords have the format:\n\t// [root][acc][modifier][/][bass][acc]\n\t// (The chord might be surrounded by parens. Just ignore them.)\n\t// root must be present and must be from A-G.\n\t// acc is optional and can be # or b\n\t// The modifier can be a wide variety of things, like \"maj7\". As they are discovered, more are supported here.\n\t// If there is a slash, then there is a bass note, which can be from A-G, with an optional acc.\n\t// If the root is unrecognized, then \"undefined\" is returned and there is no chord.\n\t// If the modifier is unrecognized, a major triad is returned.\n\t// If the bass notes is unrecognized, it is ignored.\n\tif (name.length === 0)\n\t\treturn undefined;\n\tif (name === 'break')\n\t\treturn { chick: [] };\n\tvar root = name.substring(0, 1);\n\tif (root === '(') {\n\t\tname = name.substring(1, name.length - 2);\n\t\tif (name.length === 0)\n\t\t\treturn undefined;\n\t\troot = name.substring(0, 1);\n\t}\n\tvar bass = this.basses[root];\n\tif (!bass)\t// If the bass note isn't listed, then this was an unknown root. Only A-G are accepted.\n\t\treturn undefined;\n\t// Don't transpose the chords more than an octave.\n\tvar chordTranspose = this.transpose;\n\twhile (chordTranspose < -8)\n\t\tchordTranspose += 12;\n\twhile (chordTranspose > 8)\n\t\tchordTranspose -= 12;\n\tbass += chordTranspose;\n\t\n \t// MAE 31 Aug 2024 - For visual transpose backup range issue\n \t// If transposed below A or above G, bring it back in the normal backup range\n \tif (bass < 33){\n \t\tbass += 12;\n \t}\n \telse if (bass > 44){\n\t \t bass -= 12;\n \t}\n\n\t// MAE 17 Jun 2024 - Supporting octave shifted bass and chords\n\tvar unshiftedBass = bass;\n\n\tbass += this.bassOctaveShift * 12;\n\n\tvar bass2 = bass - 5;\t// The alternating bass is a 4th below\n\tvar chick;\n\tif (name.length === 1)\n\t\tchick = this.chordNotes(bass, '');\n\tvar remaining = name.substring(1);\n\tvar acc = remaining.substring(0, 1);\n\tif (acc === 'b' || acc === '♭') {\n\t\tunshiftedBass--;\n\t\tbass--;\n\t\tbass2--;\n\t\tremaining = remaining.substring(1);\n\t} else if (acc === '#' || acc === '♯') {\n\t\tunshiftedBass++;\n\t\tbass++;\n\t\tbass2++;\n\t\tremaining = remaining.substring(1);\n\t}\n\tvar arr = remaining.split('/');\n\tchick = this.chordNotes(unshiftedBass, arr[0]);\n\t// If the 5th is altered then the bass is altered. Normally the bass is 7 from the root, so adjust if it isn't.\n\tif (chick.length >= 3) {\n\t\tvar fifth = chick[2] - chick[0];\n\t\tbass2 = bass2 + fifth - 7;\n\t}\n\n\tif (arr.length === 2) {\n\t\tvar explicitBass = this.basses[arr[1].substring(0, 1)];\n\t\tif (explicitBass) {\n\t\t\tvar bassAcc = arr[1].substring(1);\n\t\t\tvar bassShift = { '#': 1, '♯': 1, 'b': -1, '♭': -1 }[bassAcc] || 0;\n\t\t\tbass = this.basses[arr[1].substring(0, 1)] + bassShift + chordTranspose;\n\n\t\t\t// MAE 22 May 2024 - Supporting octave shifted bass and chords\n\t\t\tbass += this.bassOctaveShift * 12;\n\n\t\t\tbass2 = bass;\n\t\t}\n\t}\n\treturn { boom: bass, boom2: bass2, chick: chick };\n}\n\nChordTrack.prototype.chordNotes = function (bass, modifier) {\n\tvar intervals = this.chordIntervals[modifier];\n\tif (!intervals) {\n\t\tif (modifier.slice(0, 2).toLowerCase() === 'ma' || modifier[0] === 'M')\n\t\t\tintervals = this.chordIntervals.M;\n\t\telse if (modifier[0] === 'm' || modifier[0] === '-')\n\t\t\tintervals = this.chordIntervals.m;\n\t\telse\n\t\t\tintervals = this.chordIntervals.M;\n\t}\n\tbass += 12;\t// the chord is an octave above the bass note.\n\n\t// MAE 22 May 2024 - For chick octave shift\n\tbass += (this.chordOctaveShift * 12);\n\n\tvar notes = [];\n\tfor (var i = 0; i < intervals.length; i++) {\n\t\tnotes.push(bass + intervals[i]);\n\t}\n\treturn notes;\n}\n\nChordTrack.prototype.writeNote = function (note, beatLength, volume, beat, noteLength, instrument) {\n\t// undefined means there is a stop time.\n\tif (note !== undefined)\n\t\tthis.chordTrack.push({ cmd: 'note', pitch: note, volume: volume, start: this.lastBarTime + beat * durationRounded(beatLength, this.tempoChangeFactor), duration: durationRounded(noteLength, this.tempoChangeFactor), gap: 0, instrument: instrument });\n}\n\nChordTrack.prototype.chordTrackEmpty = function () {\n\tvar isEmpty = true;\n\tfor (var i = 0; i < this.chordTrack.length && isEmpty; i++) {\n\t\tif (this.chordTrack[i].cmd === 'note')\n\t\t\tisEmpty = false\n\t}\n\treturn isEmpty;\n}\n\nChordTrack.prototype.resolveChords = function (startTime, endTime) {\n\t// If there is a rhythm head anywhere in the measure then don't add a separate rhythm track\n\tif (this.hasRhythmHead)\n\t\treturn\n\n\tvar num = this.meter.num;\n\tvar den = this.meter.den;\n\tvar beatLength = 1 / den;\n\tvar noteLength = beatLength / 2;\n\tvar thisMeasureLength = parseInt(num, 10) / parseInt(den, 10);\n\tvar portionOfAMeasure = thisMeasureLength - (endTime - startTime) / this.tempoChangeFactor;\n\tif (Math.abs(portionOfAMeasure) < 0.00001)\n\t\tportionOfAMeasure = 0;\n\n\t // there wasn't a new chord this measure, so use the last chord declared.\n\t // also the case where there is a chord declared in the measure, but not on its first beat.\n\tif (this.currentChords.length === 0 || this.currentChords[0].beat !== 0) {\n\t\tthis.currentChords.unshift({ beat: 0, chord: this.chordLastBar });\n\t}\n\n\t//console.log(this.currentChords)\n\tvar currentChordsExpanded = expandCurrentChords(this.currentChords, 8*num/den, beatLength)\n\t//console.log(currentChordsExpanded)\n\tvar thisPattern = this.overridePattern ? this.overridePattern : this.rhythmPatterns[num + '/' + den]\n\tif (portionOfAMeasure) {\n\t\tthisPattern = [];\n\t\tvar beatsPresent = ((endTime - startTime) / this.tempoChangeFactor) * 8;\n\t\tfor (var p = 0; p < beatsPresent/2; p += 2) {\n\t\t\tthisPattern.push(\"chick\");\n\t\t\tthisPattern.push(\"\");\n\t\t}\n\t}\n\tif (!thisPattern) {\n\t\tthisPattern = []\n\t\tfor (var p = 0; p < (8*num/den)/2; p++) {\n\t\t\tthisPattern.push('chick')\n\t\t\tthisPattern.push(\"\");\n\t\t}\n\t}\n\tvar firstBoom = true\n\t// If the pattern is overridden, it might be longer than the length of a measure. If so, then ignore the rest of it\n\tvar minLength = Math.min(thisPattern.length, currentChordsExpanded.length)\n\tfor (var p = 0; p < minLength; p++) {\n\t\tif (p > 0 && currentChordsExpanded[p-1] && currentChordsExpanded[p] && currentChordsExpanded[p-1].boom !== currentChordsExpanded[p].boom)\n\t\t\tfirstBoom = true\n\t\tvar type = thisPattern[p]\n\t\tvar isBoom = type.indexOf('boom') >= 0\n\t\t// If we changed chords at a time when we're not expecting a bass note, then add an extra bass note in if the first thing in the pattern is a bass note.\n\t\tvar newBass = !isBoom &&\n\t\t\tp !== 0 &&\n\t\t\tthisPattern[0].indexOf('boom') >= 0 &&\n\t\t\t(!currentChordsExpanded[p-1] || currentChordsExpanded[p-1].boom !== currentChordsExpanded[p].boom)\n\t\tvar pitches = resolvePitch(currentChordsExpanded[p], type, firstBoom, newBass)\n\t\tif (isBoom)\n\t\t\tfirstBoom = false\n\t\tfor (var oo = 0; oo < pitches.length; oo++) {\n\t\t\tthis.writeNote(pitches[oo], \n\t\t\t\t0.125,\n\t\t\t\tisBoom || newBass ? this.boomVolume : this.chickVolume,\n\t\t\t\tp,\n\t\t\t\tnoteLength,\n\t\t\t\tisBoom || newBass ? this.bassInstrument : this.chordInstrument\n\t\t\t)\n\t\t\tif (newBass)\n\t\t\t\tnewBass = false\n\t\t\telse\n\t\t\t\tisBoom = false // only the first note in a chord is a bass note. This handles the case where bass and chord are played at the same time.\n\t\t}\n\t}\n\treturn\n}\n\nChordTrack.prototype.processChord = function (elem) {\n\tif (this.chordTrackFinished)\n\t\treturn\n\tvar chord = this.findChord(elem);\n\tif (chord) {\n\t\tvar c = this.interpretChord(chord);\n\t\t// If this isn't a recognized chord, just completely ignore it.\n\t\tif (c) {\n\t\t\t// If we ever have a chord in this voice, then we add the chord track.\n\t\t\t// However, if there are chords on more than one voice, then just use the first voice.\n\t\t\tif (this.chordTrack.length === 0) {\n\t\t\t\tthis.chordTrack.push({ cmd: 'program', channel: this.chordChannel, instrument: this.chordInstrument });\n\t\t\t}\n\n\t\t\tthis.lastChord = c;\n\t\t\tvar barBeat = calcBeat(this.lastBarTime, timeToRealTime(elem.time));\n\t\t\tthis.currentChords.push({ chord: this.lastChord, beat: barBeat, start: timeToRealTime(elem.time) });\n\t\t}\n\t}\n}\n\nfunction resolvePitch(currentChord, type, firstBoom, newBass) {\n\tvar ret = []\n\tif (!currentChord)\n\t\treturn ret\n\tif (type.indexOf('boom') >= 0)\n\t\tret.push(firstBoom ? currentChord.boom : currentChord.boom2)\n\telse if (newBass)\n\t\tret.push(currentChord.boom)\n\tvar numChordNotes = currentChord.chick.length\n\tif (type.indexOf('chick') >= 0) {\n\t\tfor (var i = 0; i < numChordNotes; i++)\n\t\t\tret.push(currentChord.chick[i])\n\t}\n\tswitch (type) {\n\t\tcase 'DO': ret.push(currentChord.chick[0]); break;\n\t\tcase 'MI': ret.push(currentChord.chick[1]); break;\n\t\tcase 'SOL': ret.push(extractNote(currentChord,2)); break;\n\t\tcase 'TI': ret.push(extractNote(currentChord,3)); break;\n\t\tcase 'TOP': ret.push(extractNote(currentChord,4)); break;\n\t\tcase 'do': ret.push(currentChord.chick[0]+12); break;\n\t\tcase 'mi': ret.push(currentChord.chick[1]+12); break;\n\t\tcase 'sol': ret.push(extractNote(currentChord,2)+12); break;\n\t\tcase 'ti': ret.push(extractNote(currentChord,3)+12); break;\n\t\tcase 'top': ret.push(extractNote(currentChord,4)+12); break;\n\t}\n\treturn ret\n}\n\nfunction extractNote(chord, index) {\n\t// This creates an arpeggio note no matter how many notes are in the chord - if it runs out of notes it continues in the next octave\n\tvar octave = Math.floor(index / chord.chick.length)\n\tvar note = chord.chick[index % chord.chick.length]\n\t//console.log(chord.chick, {index, octave, note}, index % chord.chick.length)\n\treturn note + octave * 12\n}\n\nfunction parseGChord(gchord) {\n\t// TODO-PER: The spec is more complicated than this but for now this will not try to do anything with error cases like the wrong number of beats.\n\tvar pattern = []\n\tfor (var i = 0; i < gchord.length; i++) {\n\t\tvar ch = gchord[i]\n\t\tswitch(ch) {\n\t\t\tcase 'z' : pattern.push(''); break;\n\t\t\tcase '2' : pattern.push(''); break; // TODO-PER: This should extend the last note, but that's a small effect\n\t\t\tcase 'c' : pattern.push('chick'); break;\n\t\t\tcase 'b' : pattern.push('boom&chick'); break;\n\t\t\tcase 'f' : pattern.push('boom'); break;\n\t\t\tcase 'G' : pattern.push('DO'); break;\n\t\t\tcase 'H' : pattern.push('MI'); break;\n\t\t\tcase 'I' : pattern.push('SOL'); break;\n\t\t\tcase 'J' : pattern.push('TI'); break;\n\t\t\tcase 'K' : pattern.push('TOP'); break;\n\t\t\tcase 'g' : pattern.push('do'); break;\n\t\t\tcase 'h' : pattern.push('mi'); break;\n\t\t\tcase 'i' : pattern.push('sol'); break;\n\t\t\tcase 'j' : pattern.push('ti'); break;\n\t\t\tcase 'k' : pattern.push('top'); break;\n\t\t}\n\t}\n\treturn pattern\n}\n\n// This returns an array that has a chord for each 1/8th note position in the current measure\nfunction expandCurrentChords(currentChords, num8thNotes, beatLength) {\n\tbeatLength = beatLength * 8 // this is expressed as a fraction, so that 0.25 is a quarter notes. We want it to be the number of 8th notes\n\tvar chords = []\n\tif (currentChords.length === 0)\n\t\treturn chords\n\n\tvar currentChord = currentChords[0].chord\n\tfor (var i = 1; i < currentChords.length; i++) {\n\t\tvar current = currentChords[i]\n\t\twhile (chords.length < current.beat) {\n\t\t\tchords.push(currentChord)\n\t\t}\n\t\tcurrentChord = current.chord\n\t}\n\twhile (chords.length < num8thNotes)\n\t\tchords.push(currentChord)\n\treturn chords\n}\n\nfunction calcBeat(measureStart, currTime) {\n\tvar distanceFromStart = currTime - measureStart;\n\treturn distanceFromStart * 8;\n}\n\nChordTrack.prototype.breakSynonyms = ['break', '(break)', 'no chord', 'n.c.', 'tacet'];\n\nChordTrack.prototype.basses = {\n\t'A': 33, 'B': 35, 'C': 36, 'D': 38, 'E': 40, 'F': 41, 'G': 43\n};\n\nChordTrack.prototype.chordIntervals = {\n\t// diminished (all flat 5 chords)\n\t'dim': [0, 3, 6],\n\t'°': [0, 3, 6],\n\t'˚': [0, 3, 6],\n\n\t'dim7': [0, 3, 6, 9],\n\t'°7': [0, 3, 6, 9],\n\t'˚7': [0, 3, 6, 9],\n\n\t'ø7': [0, 3, 6, 10],\n\t'm7(b5)': [0, 3, 6, 10],\n\t'm7b5': [0, 3, 6, 10],\n\t'm7♭5': [0, 3, 6, 10],\n\t'-7(b5)': [0, 3, 6, 10],\n\t'-7b5': [0, 3, 6, 10],\n\n\t'7b5': [0, 4, 6, 10],\n\t'7(b5)': [0, 4, 6, 10],\n\t'7♭5': [0, 4, 6, 10],\n\n\t'7(b9,b5)': [0, 4, 6, 10, 13],\n\t'7b9,b5': [0, 4, 6, 10, 13],\n\t'7(#9,b5)': [0, 4, 6, 10, 15],\n\t'7#9b5': [0, 4, 6, 10, 15],\n\t'maj7(b5)': [0, 4, 6, 11],\n\t'maj7b5': [0, 4, 6, 11],\n\t'13(b5)': [0, 4, 6, 10, 14, 21],\n\t'13b5': [0, 4, 6, 10, 14, 21],\n\n\t// minor (all normal 5, minor 3 chords)\n\t'm': [0, 3, 7],\n\t'-': [0, 3, 7],\n\t'm6': [0, 3, 7, 9],\n\t'-6': [0, 3, 7, 9],\n\t'm7': [0, 3, 7, 10],\n\t'-7': [0, 3, 7, 10],\n\n\t'-(b6)': [0, 3, 7, 8],\n\t'-b6': [0, 3, 7, 8],\n\t'-6/9': [0, 3, 7, 9, 14],\n\t'-7(b9)': [0, 3, 7, 10, 13],\n\t'-7b9': [0, 3, 7, 10, 13],\n\t'-maj7': [0, 3, 7, 11],\n\t'-9+7': [0, 3, 7, 11, 13],\n\t'-11': [0, 3, 7, 11, 14, 17],\n\t'm11': [0, 3, 7, 11, 14, 17],\n\t'-maj9': [0, 3, 7, 11, 14],\n\t'-∆9': [0, 3, 7, 11, 14],\n\t'mM9': [0, 3, 7, 11, 14],\n\n\t// major (all normal 5, major 3 chords)\n\t'M': [0, 4, 7],\n\t'6': [0, 4, 7, 9],\n\t'6/9': [0, 4, 7, 9, 14],\n\t'6add9': [0, 4, 7, 9, 14],\n\t'69': [0, 4, 7, 9, 14],\n\n\t'7': [0, 4, 7, 10],\n\t'9': [0, 4, 7, 10, 14],\n\t'11': [0, 7, 10, 14, 17],\n\t'13': [0, 4, 7, 10, 14, 21],\n\t'7b9': [0, 4, 7, 10, 13],\n\t'7♭9': [0, 4, 7, 10, 13],\n\t'7(b9)': [0, 4, 7, 10, 13],\n\t'7(#9)': [0, 4, 7, 10, 15],\n\t'7#9': [0, 4, 7, 10, 15],\n\t'(13)': [0, 4, 7, 10, 14, 21],\n\t'7(9,13)': [0, 4, 7, 10, 14, 21],\n\t'7(#9,b13)': [0, 4, 7, 10, 15, 20],\n\t'7(#11)': [0, 4, 7, 10, 14, 18],\n\t'7#11': [0, 4, 7, 10, 14, 18],\n\t'7(b13)': [0, 4, 7, 10, 20],\n\t'7b13': [0, 4, 7, 10, 20],\n\t'9(#11)': [0, 4, 7, 10, 14, 18],\n\t'9#11': [0, 4, 7, 10, 14, 18],\n\t'13(#11)': [0, 4, 7, 10, 18, 21],\n\t'13#11': [0, 4, 7, 10, 18, 21],\n\n\t'maj7': [0, 4, 7, 11],\n\t'∆7': [0, 4, 7, 11],\n\t'Δ7': [0, 4, 7, 11],\n\t'maj9': [0, 4, 7, 11, 14],\n\t'maj7(9)': [0, 4, 7, 11, 14],\n\t'maj7(11)': [0, 4, 7, 11, 17],\n\t'maj7(#11)': [0, 4, 7, 11, 18],\n\t'maj7(13)': [0, 4, 7, 14, 21],\n\t'maj7(9,13)': [0, 4, 7, 11, 14, 21],\n\n\t'7sus4': [0, 5, 7, 10],\n\t'm7sus4': [0, 3, 7, 10, 17],\n\t'sus4': [0, 5, 7],\n\t'sus2': [0, 2, 7],\n\t'7sus2': [0, 2, 7, 10],\n\t'9sus4': [0, 5, 7, 10, 14],\n\t'13sus4': [0, 5, 7, 10, 14, 21],\n\n\t// augmented (all sharp 5 chords)\n\t'aug7': [0, 4, 8, 10],\n\t'+7': [0, 4, 8, 10],\n\t'+': [0, 4, 8],\n\t'7#5': [0, 4, 8, 10],\n\t'7♯5': [0, 4, 8, 10],\n\t'7+5': [0, 4, 8, 10],\n\t'9#5': [0, 4, 8, 10, 14],\n\t'9♯5': [0, 4, 8, 10, 14],\n\t'9+5': [0, 4, 8, 10, 14],\n\t'-7(#5)': [0, 3, 8, 10],\n\t'-7#5': [0, 3, 8, 10],\n\t'7(#5)': [0, 4, 8, 10],\n\t'7(b9,#5)': [0, 4, 8, 10, 13],\n\t'7b9#5': [0, 4, 8, 10, 13],\n\t'maj7(#5)': [0, 4, 8, 11],\n\t'maj7#5': [0, 4, 8, 11],\n\t'maj7(#5,#11)': [0, 4, 8, 11, 18],\n\t'maj7#5#11': [0, 4, 8, 11, 18],\n\t'9(#5)': [0, 4, 8, 10, 14],\n\t'13(#5)': [0, 4, 8, 10, 14, 21],\n\t'13#5': [0, 4, 8, 10, 14, 21],\n\t// MAE Power chords added 10 April 2024\n\t'5': [0, 7],\n\t'5(8)': [0, 7, 12],\n\t'5add8': [0, 7, 12]\n\n};\n\nChordTrack.prototype.rhythmPatterns = {\n\t\"2/2\": ['boom', '', '', '', 'chick', '', '', ''],\n\t\"3/2\": ['boom', '', '', '', 'chick', '', '', '', 'chick', '', '', ''],\n\t\"4/2\": ['boom', '', '', '', 'chick', '', '', '', 'boom', '', '', '', 'chick', '', '', ''],\n\n\t\"2/4\": ['boom', '', 'chick', ''],\n\t\"3/4\": ['boom', '', 'chick', '', 'chick', ''],\n\t\"4/4\": ['boom', '', 'chick', '', 'boom', '', 'chick', ''],\n\t\"5/4\": ['boom', '', 'chick', '', 'chick', '', 'boom', '', 'chick', ''],\n\t\"6/4\": ['boom', '', 'chick', '', 'boom', '', 'chick', '', 'boom', '', 'chick', ''],\n\n\t\"3/8\": ['boom', '', 'chick'],\n\t\"5/8\": ['boom', 'chick', 'chick', 'boom', 'chick'],\n\t\"6/8\": ['boom', '', 'chick', 'boom', '', 'chick'],\n\t\"7/8\": ['boom', 'chick', 'chick', 'boom', 'chick', 'boom', 'chick'],\n\t\"9/8\": ['boom', '', 'chick', 'boom', '', 'chick', 'boom', '', 'chick'],\n\t\"10/8\": ['boom', 'chick', 'chick', 'boom', 'chick', 'chick', 'boom', 'chick', 'boom', 'chick'],\n\t\"11/8\": ['boom', 'chick', 'chick', 'boom', 'chick', 'chick', 'boom', 'chick', 'boom', 'chick', 'chick'],\n\t\"12/8\": ['boom', '', 'chick', 'boom', '', 'chick', 'boom', '', 'chick', 'boom', '', 'chick'],\n};\n\n// TODO-PER: these are repeated in flattener. Can it be shared?\n\nfunction timeToRealTime(time) {\n\treturn time / 1000000;\n}\n\nfunction durationRounded(duration, tempoChangeFactor) {\n\treturn Math.round(duration * tempoChangeFactor * 1000000) / 1000000;\n}\n\nmodule.exports = ChordTrack;\n","var pitchMap = {\n\tf0: \"_C\",\n\tn0: \"=C\",\n\ts0: \"^C\",\n\tx0: \"C\",\n\tf1: \"_D\",\n\tn1: \"=D\",\n\ts1: \"^D\",\n\tx1: \"D\",\n\tf2: \"_E\",\n\tn2: \"=E\",\n\ts2: \"^E\",\n\tx2: \"E\",\n\tf3: \"_F\",\n\tn3: \"=F\",\n\ts3: \"^F\",\n\tx3: \"F\",\n\tf4: \"_G\",\n\tn4: \"=G\",\n\ts4: \"^G\",\n\tx4: \"G\",\n\tf5: \"_A\",\n\tn5: \"=A\",\n\ts5: \"^A\",\n\tx5: \"A\",\n\tf6: \"_B\",\n\tn6: \"=B\",\n\ts6: \"^B\",\n\tx6: \"B\",\n\tf7: \"_c\",\n\tn7: \"=c\",\n\ts7: \"^c\",\n\tx7: \"c\",\n\tf8: \"_d\",\n\tn8: \"=d\",\n\ts8: \"^d\",\n\tx8: \"d\",\n\tf9: \"_e\",\n\tn9: \"=e\",\n\ts9: \"^e\",\n\tx9: \"e\",\n\tf10: \"_f\",\n\tn10: \"=f\",\n\ts10: \"^f\",\n\tx10: \"f\",\n\tf11: \"_g\",\n\tn11: \"=g\",\n\ts11: \"^g\",\n\tx11: \"g\",\n\tf12: \"_a\",\n\tn12: \"=a\",\n\ts12: \"^a\",\n\tx12: \"a\",\n\tf13: \"_b\",\n\tn13: \"=b\",\n\ts13: \"^b\",\n\tx13: \"b\",\n\tf14: \"_c'\",\n\tn14: \"=c'\",\n\ts14: \"^c'\",\n\tx14: \"c'\",\n\tf15: \"_d'\",\n\tn15: \"=d'\",\n\ts15: \"^d'\",\n\tx15: \"d'\",\n\tf16: \"_e'\",\n\tn16: \"=e'\",\n\ts16: \"^e'\",\n\tx16: \"e'\",\n}\n\nfunction pitchesToPerc(pitchObj) {\n\tvar pitch = (pitchObj.accidental ? pitchObj.accidental[0] : 'x') + pitchObj.verticalPos;\n\treturn pitchMap[pitch];\n}\nmodule.exports = pitchesToPerc;\n","// abc_midi_flattener.js: Turn a linear series of events into a series of MIDI commands.\n\n// We input a set of voices, but the notes are still complex. This pass changes the logical definitions\n// of the grace notes, decorations, ties, triplets, rests, transpositions, keys, and accidentals into actual note durations.\n// It also extracts guitar chords to a separate voice and resolves their rhythm.\n\nvar flatten;\nvar ChordTrack = require(\"./chord-track\");\nvar pitchesToPerc = require('./pitches-to-perc');\n\n(function() {\n\t\"use strict\";\n\n\tvar barAccidentals;\n\tvar accidentals;\n\tvar transpose;\n\tvar bagpipes;\n\tvar tracks;\n\tvar startingTempo;\n\tvar startingMeter;\n\tvar tempoChangeFactor = 1;\n\tvar instrument;\n\tvar currentInstrument;\n\t// var channel;\n\tvar currentTrack;\n\tvar lastNoteDurationPosition;\n\tvar currentTrackName;\n\tvar lastEventTime;\n\tvar chordTrack;\n\n\tvar meter = { num: 4, den: 4 };\n\tvar drumInstrument = 128;\n\tvar lastBarTime;\n\tvar doBeatAccents = true;\n\tvar stressBeat1 = 105;\n\tvar stressBeatDown = 95;\n\tvar stressBeatUp = 85;\n\tvar beatFraction = 0.25;\n\tvar nextVolume;\n\tvar nextVolumeDelta;\n\tvar slurCount = 0;\n\n\tvar drumTrack;\n\tvar drumTrackFinished;\n\tvar drumDefinition = {};\n\tvar drumBars;\n\n\tvar pickupLength = 0;\n\tvar percmap;\n\n\t// The gaps per beat. The first two are in seconds, the third is in fraction of a duration.\n\tvar normalBreakBetweenNotes = 0; //0.000520833333325*1.5; // for articulation (matches muse score value)\n\tvar slurredBreakBetweenNotes = -0.001; // make the slurred notes actually overlap\n\tvar staccatoBreakBetweenNotes = 0.4; // some people say staccato is half duration, some say 3/4 so this splits it\n\n\tflatten = function(voices, options, percmap_, midiOptions) {\n\t\tif (!options) options = {};\n\t\tif (!midiOptions) midiOptions = {};\n\t\tbarAccidentals = [];\n\t\taccidentals = [0,0,0,0,0,0,0];\n\t\tbagpipes = false;\n\t\ttracks = [];\n\t\tstartingTempo = options.qpm;\n\t\tstartingMeter = undefined;\n\t\ttempoChangeFactor = 1;\n\t\tinstrument = undefined;\n\t\tcurrentInstrument = undefined;\n\t\t// channel = undefined;\n\t\tcurrentTrack = undefined;\n\t\tcurrentTrackName = undefined;\n\t\tlastEventTime = 0;\n\t\tpercmap = percmap_;\n\n\t\tmeter = { num: 4, den: 4 };\n\n\t\tdoBeatAccents = true;\n\t\tstressBeat1 = 105;\n\t\tstressBeatDown = 95;\n\t\tstressBeatUp = 85;\n\t\tbeatFraction = 0.25;\n\t\tnextVolume = undefined;\n\t\tnextVolumeDelta = undefined;\n\t\tslurCount = 0;\n\n\t\t// For the drum/metronome track.\n\t\tdrumTrack = [];\n\t\tdrumTrackFinished = false;\n\t\tdrumDefinition = {};\n\t\tdrumBars = 1;\n\n\t\tif (voices.length > 0 && voices[0].length > 0)\n\t\t\tpickupLength = voices[0][0].pickupLength;\n\n\t\t// For resolving chords.\n\t\tif (options.bassprog !== undefined && !midiOptions.bassprog)\n\t\t\tmidiOptions.bassprog = [options.bassprog]\n\t\tif (options.bassvol !== undefined && !midiOptions.bassvol)\n\t\t\tmidiOptions.bassvol = [options.bassvol]\n\t\tif (options.chordprog !== undefined && !midiOptions.chordprog)\n\t\t\tmidiOptions.chordprog = [options.chordprog]\n\t\tif (options.chordvol !== undefined && !midiOptions.chordvol)\n\t\t\tmidiOptions.chordvol = [options.chordvol]\n\t\tif (options.gchord !== undefined && !midiOptions.gchord)\n\t\t\tmidiOptions.gchord = [options.gchord]\n\t\tchordTrack = new ChordTrack(voices.length, options.chordsOff, midiOptions, meter)\n\n\t\t// First adjust the input to resolve ties, set the starting time for each note, etc. That will make the rest of the logic easier\n\t\tpreProcess(voices, options);\n\n\t\tfor (var i = 0; i < voices.length; i++) {\n\t\t\ttranspose = 0;\n\t\t\tchordTrack.setTranspose(transpose)\n\t\t\tlastNoteDurationPosition = -1;\n\t\t\tvar voice = voices[i];\n\t\t\tcurrentTrack = [{ cmd: 'program', channel: i, instrument: instrument }];\n\t\t\tcurrentTrackName = undefined;\n\t\t\tlastBarTime = 0;\n\t\t\tchordTrack.setLastBarTime(0)\n\t\t\tvar voiceOff = false;\n\t\t\tif (options.voicesOff === true)\n\t\t\t\tvoiceOff = true;\n\t\t\telse if (options.voicesOff && options.voicesOff.length && options.voicesOff.indexOf(i) >= 0)\n\t\t\t\tvoiceOff = true;\n\t\t\tfor (var j = 0; j < voice.length; j++) {\n\t\t\t\tvar element = voice[j];\n\t\t\t\tswitch (element.el_type) {\n\t\t\t\t\tcase \"name\":\n\t\t\t\t\t\tcurrentTrackName = {cmd: 'text', type: \"name\", text: element.trackName };\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"note\":\n\t\t\t\t\t\twriteNote(element, voiceOff);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"key\":\n\t\t\t\t\t\taccidentals = setKeySignature(element);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"meter\":\n\t\t\t\t\t\tif (!startingMeter)\n\t\t\t\t\t\t\tstartingMeter = element;\n\t\t\t\t\t\tmeter = element;\n\t\t\t\t\t\tchordTrack.setMeter(meter)\n\t\t\t\t\t\tbeatFraction = getBeatFraction(meter);\n\t\t\t\t\t\talignDrumToMeter();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"tempo\":\n\t\t\t\t\t\tif (!startingTempo)\n\t\t\t\t\t\t\tstartingTempo = element.qpm;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\ttempoChangeFactor = element.qpm ? startingTempo / element.qpm : 1;\n\t\t\t\t\t\tchordTrack.setTempoChangeFactor(tempoChangeFactor)\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"transpose\":\n\t\t\t\t\t\ttranspose = element.transpose;\n\t\t\t\t\t\tchordTrack.setTranspose(transpose)\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"bar\":\n\t\t\t\t\t\tchordTrack.barEnd(element)\n\n\t\t\t\t\t\tbarAccidentals = [];\n\t\t\t\t\t\tif (i === 0) // Only write the drum part on the first voice so that it is not duplicated.\n\t\t\t\t\t\t\twriteDrum(voices.length+1);\n\t\t\t\t\t\t\tchordTrack.setRhythmHead(false) // decide whether there are rhythm heads each measure.\n\t\t\t\t\t\tlastBarTime = timeToRealTime(element.time);\n\t\t\t\t\t\tchordTrack.setLastBarTime(lastBarTime)\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"bagpipes\":\n\t\t\t\t\t\tbagpipes = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"instrument\":\n\t\t\t\t\t\tif (instrument === undefined)\n\t\t\t\t\t\t\tinstrument = element.program;\n\t\t\t\t\t\tcurrentInstrument = element.program;\n\t\t\t\t\t\tif (currentTrack.length > 0 && currentTrack[currentTrack.length-1].cmd === 'program')\n\t\t\t\t\t\t\tcurrentTrack[currentTrack.length-1].instrument = element.program;\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tvar ii;\n\t\t\t\t\t\t\tfor (ii = currentTrack.length-1; ii >= 0 && currentTrack[ii].cmd !== 'program'; ii--)\n\t\t\t\t\t\t\t\t;\n\t\t\t\t\t\t\tif (ii < 0 || currentTrack[ii].instrument !== element.program)\n\t\t\t\t\t\t\t\tcurrentTrack.push({cmd: 'program', channel: 0, instrument: element.program});\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"channel\":\n\t\t\t\t\t\tsetChannel(element.channel);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"drum\":\n\t\t\t\t\t\tdrumDefinition = normalizeDrumDefinition(element.params);\n\t\t\t\t\t\talignDrumToMeter();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"gchordOn\":\n\t\t\t\t\t\tchordTrack.gChordOn(element)\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"beat\":\n\t\t\t\t\t\tstressBeat1 = element.beats[0];\n\t\t\t\t\t\tstressBeatDown = element.beats[1];\n\t\t\t\t\t\tstressBeatUp = element.beats[2];\n\t\t\t\t\t\t// TODO-PER: also use the last parameter - which changes which beats are strong.\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"vol\":\n\t\t\t\t\t\tnextVolume = element.volume;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"volinc\":\n\t\t\t\t\t\tnextVolumeDelta = element.volume;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"beataccents\":\n\t\t\t\t\t\tdoBeatAccents = element.value;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"gchord\":\n\t\t\t\t\tcase \"bassprog\":\n\t\t\t\t\tcase \"chordprog\":\n\t\t\t\t\tcase \"bassvol\":\n\t\t\t\t\tcase \"chordvol\":\n\t\t\t\t\tcase \"gchordbars\":\n\t\t\t\t\t\tchordTrack.paramChange(element)\n\t\t\t\t\t\tbreak\n\t\t\t\t\tdefault:\n\t\t\t\t\t\t// This should never happen\n\t\t\t\t\t\tconsole.log(\"MIDI creation. Unknown el_type: \" + element.el_type + \"\\n\");// jshint ignore:line\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (currentTrack[0].instrument === undefined)\n\t\t\t\tcurrentTrack[0].instrument = instrument ? instrument : 0;\n\t\t\tif (currentTrackName)\n\t\t\t\tcurrentTrack.unshift(currentTrackName);\n\t\t\ttracks.push(currentTrack);\n\t\t\tchordTrack.finish()\n\t\t\tif (drumTrack.length > 0) // Don't do drums on more than one track, so turn off drum after we create it.\n\t\t\t\tdrumTrackFinished = true;\n\t\t}\n\t\t// See if any notes are octaves played at the same time. If so, raise the pitch of the higher one.\n\t\tif (options.detuneOctave)\n\t\t\tfindOctaves(tracks, parseInt(options.detuneOctave, 10));\n\n\t\tchordTrack.addTrack(tracks)\n\t\tif (drumTrack.length > 0)\n\t\t\ttracks.push(drumTrack);\n\n\t\treturn { tempo: startingTempo, instrument: instrument, tracks: tracks, totalDuration: lastEventTime };\n\t};\n\n\tfunction setChannel(channel) {\n\t\tfor (var i = currentTrack.length-1; i>=0; i--) {\n\t\t\tif (currentTrack[i].cmd === \"program\") {\n\t\t\t\tcurrentTrack[i].channel = channel;\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction timeToRealTime(time) {\n\t\treturn time/1000000;\n\t}\n\n\tfunction durationRounded(duration) {\n\t\treturn Math.round(duration*tempoChangeFactor*1000000)/1000000;\n\t}\n\n\tfunction preProcess(voices, options) {\n\t\tfor (var i = 0; i < voices.length; i++) {\n\t\t\tvar voice = voices[i];\n\t\t\tvar ties = {};\n\t\t\tvar startingTempo = options.qpm;\n\t\t\tvar timeCounter = 0;\n\t\t\tvar tempoMultiplier = 1;\n\t\t\tfor (var j = 0; j < voice.length; j++) {\n\t\t\t\tvar element = voice[j];\n\n\t\t\t\tif (element.el_type === 'tempo') {\n\t\t\t\t\tif (!startingTempo)\n\t\t\t\t\t\tstartingTempo = element.qpm;\n\t\t\t\t\telse\n\t\t\t\t\t\ttempoMultiplier = element.qpm ? startingTempo / element.qpm : 1;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// For convenience, put the current time in each event so that it doesn't have to be calculated in the complicated stuff that follows.\n\t\t\t\telement.time = timeCounter;\n\t\t\t\tvar thisDuration = element.duration ? element.duration : 0;\n\t\t\t\ttimeCounter += Math.round(thisDuration*tempoMultiplier*1000000); // To compensate for JS rounding problems, do all intermediate calcs on integers.\n\n\t\t\t\t// If there are pitches then put the duration in the pitch object and if there are ties then change the duration of the first note in the tie.\n\t\t\t\tif (element.pitches) {\n\t\t\t\t\tfor (var k = 0; k < element.pitches.length; k++) {\n\t\t\t\t\t\tvar pitch = element.pitches[k];\n\t\t\t\t\t\tif (pitch) {\n\t\t\t\t\t\t\tpitch.duration = element.duration;\n\t\t\t\t\t\t\tif (pitch.startTie) {\n\t\t\t\t\t\t\t\t//console.log(element)\n\t\t\t\t\t\t\t\tif (ties[pitch.pitch] === undefined) // We might have three notes tied together - if so just add this duration.\n\t\t\t\t\t\t\t\t\tties[pitch.pitch] = {el: j, pitch: k};\n\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\tvoice[ties[pitch.pitch].el].pitches[ties[pitch.pitch].pitch].duration += pitch.duration;\n\t\t\t\t\t\t\t\t\telement.pitches[k] = null;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t//console.log(\">>> START\", JSON.stringify(ties));\n\t\t\t\t\t\t\t} else if (pitch.endTie) {\n\t\t\t\t\t\t\t\t//console.log(element)\n\t\t\t\t\t\t\t\tvar tie = ties[pitch.pitch];\n\t\t\t\t\t\t\t\t//console.log(\">>> END\", pitch.pitch, tie, JSON.stringify(ties));\n\t\t\t\t\t\t\t\tif (tie) {\n\t\t\t\t\t\t\t\t\tvar dur = pitch.duration;\n\t\t\t\t\t\t\t\t\tdelete voice[tie.el].pitches[tie.pitch].startTie;\n\t\t\t\t\t\t\t\t\tvoice[tie.el].pitches[tie.pitch].duration += dur;\n\t\t\t\t\t\t\t\t\telement.pitches[k] = null;\n\t\t\t\t\t\t\t\t\tdelete ties[pitch.pitch];\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tdelete pitch.endTie;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdelete element.duration;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (var key in ties) {\n\t\t\t\tif (ties.hasOwnProperty(key)) {\n\t\t\t\t\tvar item = ties[key];\n\t\t\t\t\tdelete voice[item.el].pitches[item.pitch].startTie;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// voices[0].forEach(v => delete v.elem)\n\t\t\t// voices[1].forEach(v => delete v.elem)\n\t\t\t// console.log(JSON.stringify(voices))\n\t\t}\n\t}\n\n\tfunction getBeatFraction(meter) {\n\t\tswitch (parseInt(meter.den,10)) {\n\t\t\tcase 2: return 0.5;\n\t\t\tcase 4: return 0.25;\n\t\t\tcase 8:\n\t\t\t\tif (meter.num % 3 === 0)\n\t\t\t\t\treturn 0.375;\n\t\t\t\telse\n\t\t\t\t\treturn 0.125;\n\t\t\tcase 16: return 0.125;\n\t\t}\n\t\treturn 0.25;\n\t}\n\n\tfunction calcBeat(measureStart, beatLength, currTime) {\n\t\tvar distanceFromStart = currTime - measureStart;\n\t\treturn distanceFromStart / beatLength;\n\t}\n\n\tfunction processVolume(beat, voiceOff) {\n\t\tif (voiceOff)\n\t\t\treturn 0;\n\n\t\tvar volume;\n \t// MAE 21 Jun 2024 - This previously wasn't allowing zero volume to be applied\n\t\tif (nextVolume != undefined) {\n\t\t\tvolume = nextVolume;\n\t\t\tnextVolume = undefined;\n\t\t} else if (!doBeatAccents) {\n\t\t\tvolume = stressBeatDown;\n\t\t} else if (pickupLength > beat) {\n\t\t\tvolume = stressBeatUp;\n\t\t} else {\n\t\t\t//var barLength = meter.num / meter.den;\n\t\t\tvar barBeat = calcBeat(lastBarTime, getBeatFraction(meter), beat);\n\t\t\tif (barBeat === 0)\n\t\t\t\tvolume = stressBeat1;\n\t\t\telse if (parseInt(barBeat,10) === barBeat)\n\t\t\t\tvolume = stressBeatDown;\n\t\t\telse\n\t\t\t\tvolume = stressBeatUp;\n\t\t}\n\t\tif (nextVolumeDelta) {\n\t\t\tvolume += nextVolumeDelta;\n\t\t\tnextVolumeDelta = undefined;\n\t\t}\n\t\tif (volume < 0)\n\t\t\tvolume = 0;\n\t\tif (volume > 127)\n\t\t\tvolume = 127;\n\t\treturn voiceOff ? 0 : volume;\n\t}\n\n\n\tfunction findNoteModifications(elem, velocity) {\n\t\tvar ret = { };\n\t\tif (elem.decoration) {\n\t\t\tfor (var d = 0; d < elem.decoration.length; d++) {\n\t\t\t\tif (elem.decoration[d] === 'staccato')\n\t\t\t\t\tret.thisBreakBetweenNotes = 'staccato';\n\t\t\t\telse if (elem.decoration[d] === 'tenuto')\n\t\t\t\t\tret.thisBreakBetweenNotes = 'tenuto';\n\t\t\t\telse if (elem.decoration[d] === 'accent')\n\t\t\t\t\tret.velocity = Math.min(127, velocity * 1.5);\n\t\t\t\telse if (elem.decoration[d] === 'trill')\n\t\t\t\t\tret.noteModification = \"trill\";\n\t\t\t\telse if (elem.decoration[d] === 'lowermordent')\n\t\t\t\t\tret.noteModification = \"lowermordent\";\n\t\t\t\telse if (elem.decoration[d] === 'uppermordent')\n\t\t\t\t\tret.noteModification = \"mordent\";\n\t\t\t\telse if (elem.decoration[d] === 'mordent')\n\t\t\t\t\tret.noteModification = \"mordent\";\n\t\t\t\telse if (elem.decoration[d] === 'turn')\n\t\t\t\t\tret.noteModification = \"turn\";\n\t\t\t\telse if (elem.decoration[d] === 'roll')\n\t\t\t\t\tret.noteModification = \"roll\";\n\t\t\t}\n\t\t}\n\t\treturn ret;\n\t}\n\n\tfunction doModifiedNotes(noteModification, p) {\n\t\tvar noteTime;\n\t\tvar numNotes;\n\t\tvar start = p.start;\n\t\tvar pp;\n\t\tvar runningDuration = p.duration;\n\t\tvar shortestNote = durationRounded(1.0 / 32);\n\n\t\tswitch (noteModification) {\n\t\t\tcase \"trill\":\n\t\t\t\tvar note = 2;\n\t\t\t\twhile (runningDuration > 0) {\n\t\t\t\t\tcurrentTrack.push({ cmd: 'note', pitch: p.pitch+note, volume: p.volume, start: start, duration: shortestNote, gap: 0, instrument: currentInstrument, style: 'decoration' });\n\t\t\t\t\tnote = (note === 2) ? 0 : 2;\n\t\t\t\t\trunningDuration -= shortestNote;\n\t\t\t\t\tstart += shortestNote;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"mordent\":\n\t\t\t\tcurrentTrack.push({ cmd: 'note', pitch: p.pitch, volume: p.volume, start: start, duration: shortestNote, gap: 0, instrument: currentInstrument, style: 'decoration' });\n\t\t\t\trunningDuration -= shortestNote;\n\t\t\t\tstart += shortestNote;\n\t\t\t\tcurrentTrack.push({ cmd: 'note', pitch: p.pitch+2, volume: p.volume, start: start, duration: shortestNote, gap: 0, instrument: currentInstrument, style: 'decoration' });\n\t\t\t\trunningDuration -= shortestNote;\n\t\t\t\tstart += shortestNote;\n\t\t\t\tcurrentTrack.push({ cmd: 'note', pitch: p.pitch, volume: p.volume, start: start, duration: runningDuration, gap: 0, instrument: currentInstrument });\n\t\t\t\tbreak;\n\t\t\tcase \"lowermordent\":\n\t\t\t\tcurrentTrack.push({ cmd: 'note', pitch: p.pitch, volume: p.volume, start: start, duration: shortestNote, gap: 0, instrument: currentInstrument, style: 'decoration' });\n\t\t\t\trunningDuration -= shortestNote;\n\t\t\t\tstart += shortestNote;\n\t\t\t\tcurrentTrack.push({ cmd: 'note', pitch: p.pitch-2, volume: p.volume, start: start, duration: shortestNote, gap: 0, instrument: currentInstrument, style: 'decoration' });\n\t\t\t\trunningDuration -= shortestNote;\n\t\t\t\tstart += shortestNote;\n\t\t\t\tcurrentTrack.push({ cmd: 'note', pitch: p.pitch, volume: p.volume, start: start, duration: runningDuration, gap: 0, instrument: currentInstrument });\n\t\t\t\tbreak;\n\t\t\tcase \"turn\":\n\t\t\t\tshortestNote = p.duration / 4;\n\t\t\t\tcurrentTrack.push({ cmd: 'note', pitch: p.pitch+2, volume: p.volume, start: start, duration: shortestNote, gap: 0, instrument: currentInstrument, style: 'decoration' });\n\t\t\t\tcurrentTrack.push({ cmd: 'note', pitch: p.pitch, volume: p.volume, start: start+shortestNote, duration: shortestNote, gap: 0, instrument: currentInstrument, style: 'decoration' });\n\t\t\t\tcurrentTrack.push({ cmd: 'note', pitch: p.pitch-1, volume: p.volume, start: start+shortestNote*2, duration: shortestNote, gap: 0, instrument: currentInstrument, style: 'decoration' });\n\t\t\t\tcurrentTrack.push({ cmd: 'note', pitch: p.pitch, volume: p.volume, start: start+shortestNote*3, duration: shortestNote, gap: 0, instrument: currentInstrument, style: 'decoration' });\n\t\t\t\tbreak;\n\t\t\tcase \"roll\":\n\t\t\t\twhile (runningDuration > 0) {\n\t\t\t\t\tcurrentTrack.push({ cmd: 'note', pitch: p.pitch, volume: p.volume, start: start, duration: shortestNote, gap: 0, instrument: currentInstrument, style: 'decoration' });\n\t\t\t\t\trunningDuration -= shortestNote*2;\n\t\t\t\t\tstart += shortestNote*2;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tfunction writeNote(elem, voiceOff) {\n\t\t//\n\t\t// Create a series of note events to append to the current track.\n\t\t// The output event is one of: { pitchStart: pitch_in_abc_units, volume: from_1_to_64 }\n\t\t// { pitchStop: pitch_in_abc_units }\n\t\t// { moveTime: duration_in_abc_units }\n\t\t// If there are guitar chords, then they are put in a separate track, but they have the same format.\n\t\t//\n\n\t\t//var trackStartingIndex = currentTrack.length;\n\n\t\tvar velocity = processVolume(timeToRealTime(elem.time), voiceOff);\n\t\tchordTrack.processChord(elem)\n\n\t\t// if there are grace notes, then also play them.\n\t\t// I'm not sure there is an exact rule for the length of the notes. My rule, unless I find\n\t\t// a better one is: the grace notes cannot take more than 1/2 of the main note's value.\n\t\t// A grace note (of 1/8 note duration) takes 1/8 of the main note's value.\n\t\tvar graces;\n\t\tif (elem.gracenotes && elem.pitches && elem.pitches.length > 0 && elem.pitches[0]) {\n\t\t\tgraces = processGraceNotes(elem.gracenotes, elem.pitches[0].duration);\n\t\t\tif (elem.elem)\n\t\t\t\telem.elem.midiGraceNotePitches = writeGraceNotes(graces, timeToRealTime(elem.time), velocity*2/3, currentInstrument); // make the graces a little quieter.\n\t\t}\n\n\t\t// The beat fraction is the note that gets a beat (.25 is a quarter note)\n\t\t// The tempo is in minutes and we want to get to milliseconds.\n\t\t// If the element is inside a repeat, there may be more than one value. If there is one value,\n\t\t// then just store that as a number. If there are more than one value, then change that to\n\t\t// an array and return all of them.\n\t\tif (elem.elem) {\n\t\t\tvar rt = timeToRealTime(elem.time);\n\t\t\tvar ms = rt / beatFraction / startingTempo * 60 * 1000;\n\t\t\tif (elem.elem.currentTrackMilliseconds === undefined) {\n\t\t\t\telem.elem.currentTrackMilliseconds = ms;\n\t\t\t\telem.elem.currentTrackWholeNotes = rt;\n\t\t\t} else {\n\t\t\t\tif (elem.elem.currentTrackMilliseconds.length === undefined) {\n\t\t\t\t\tif (elem.elem.currentTrackMilliseconds !== ms) {\n\t\t\t\t\t\telem.elem.currentTrackMilliseconds = [elem.elem.currentTrackMilliseconds, ms];\n\t\t\t\t\t\telem.elem.currentTrackWholeNotes = [elem.elem.currentTrackWholeNotes, rt];\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// There can be duplicates if there are multiple voices\n\t\t\t\t\tvar found = false;\n\t\t\t\t\tfor (var j = 0; j < elem.elem.currentTrackMilliseconds.length; j++) {\n\t\t\t\t\t\tif (elem.elem.currentTrackMilliseconds[j] === ms)\n\t\t\t\t\t\t\tfound = true;\n\t\t\t\t\t}\n\t\t\t\t\tif (!found) {\n\t\t\t\t\t\telem.elem.currentTrackMilliseconds.push(ms);\n\t\t\t\t\t\telem.elem.currentTrackWholeNotes.push(rt);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t//var tieAdjustment = 0;\n\t\tif (elem.pitches) {\n\t\t\tvar thisBreakBetweenNotes = '';\n\t\t\tvar ret = findNoteModifications(elem, velocity);\n\t\t\tif (ret.thisBreakBetweenNotes)\n\t\t\t\tthisBreakBetweenNotes = ret.thisBreakBetweenNotes;\n\t\t\tif (ret.velocity)\n\t\t\t\tvelocity = ret.velocity;\n\n\t\t\t// TODO-PER: Can also make a different sound on style=x and style=harmonic\n\t\t\tvar ePitches = elem.pitches;\n\t\t\tif (elem.style === \"rhythm\") {\n\t\t\t\tePitches = chordTrack.setRhythmHead(true, elem)\n\t\t\t}\n\n\t\t\tif (elem.elem)\n\t\t\t\telem.elem.midiPitches = [];\n\t\t\tfor (var i=0; i<ePitches.length; i++) {\n\t\t\t\tvar note = ePitches[i];\n\t\t\t\tif (!note)\n\t\t\t\t\tcontinue;\n\t\t\t\tif (note.startSlur)\n\t\t\t\t\tslurCount += note.startSlur.length;\n\t\t\t\tif (note.endSlur)\n\t\t\t\t\tslurCount -= note.endSlur.length;\n\t\t\t\tvar actualPitch = note.actualPitch ? note.actualPitch : adjustPitch(note);\n\t\t\t\tif (currentInstrument === drumInstrument && percmap) {\n\t\t\t\t\tvar name = pitchesToPerc(note)\n\t\t\t\t\tif (name && percmap[name])\n\t\t\t\t\t\tactualPitch = percmap[name].sound;\n\t\t\t\t}\n\t\t\t\tvar p = { cmd: 'note', pitch: actualPitch, volume: velocity, start: timeToRealTime(elem.time), duration: durationRounded(note.duration), instrument: currentInstrument, startChar: elem.elem.startChar, endChar: elem.elem.endChar};\n\t\t\t\tp = adjustForMicroTone(p);\n\t\t\t\tif (elem.gracenotes) {\n\t\t\t\t\tp.duration = p.duration / 2;\n\t\t\t\t\tp.start = p.start + p.duration;\n\t\t\t\t}\n\t\t\t\tif (elem.elem)\n\t\t\t\t\telem.elem.midiPitches.push(p);\n\t\t\t\tif (ret.noteModification) {\n\t\t\t\t\tdoModifiedNotes(ret.noteModification, p);\n\t\t\t\t} else {\n\t\t\t\t\tif (slurCount > 0)\n\t\t\t\t\t\tp.endType = 'tenuto';\n\t\t\t\t\telse if (thisBreakBetweenNotes)\n\t\t\t\t\t\tp.endType = thisBreakBetweenNotes;\n\n\t\t\t\t\tswitch (p.endType) {\n\t\t\t\t\t\tcase \"tenuto\":\n\t\t\t\t\t\t\tp.gap = slurredBreakBetweenNotes;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"staccato\":\n\t\t\t\t\t\t\tvar d = p.duration * staccatoBreakBetweenNotes;\n\t\t\t\t\t\t\tp.gap = startingTempo / 60 * d;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tp.gap = normalBreakBetweenNotes;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcurrentTrack.push(p);\n\t\t\t\t}\n\t\t\t}\n\t\t\tlastNoteDurationPosition = currentTrack.length-1;\n\n\t\t}\n\t\tvar realDur = getRealDuration(elem);\n\t\tlastEventTime = Math.max(lastEventTime, timeToRealTime(elem.time)+durationRounded(realDur));\n\t}\n\tfunction getRealDuration(elem) {\n\t\tif (elem.pitches && elem.pitches.length > 0 && elem.pitches[0])\n\t\t\treturn elem.pitches[0].duration;\n\t\tif (elem.elem)\n\t\t\treturn elem.elem.duration;\n\t\treturn elem.duration;\n\t}\n\n\tvar scale = [0,2,4,5,7,9,11];\n\tfunction adjustPitch(note) {\n\t\tif (note.midipitch !== undefined)\n\t\t\treturn note.midipitch; // The pitch might already be known, for instance if there is a drummap.\n\t\tvar pitch = note.pitch;\n\t\tif (note.accidental) {\n\t\t\tswitch(note.accidental) { // change that pitch (not other octaves) for the rest of the bar\n\t\t\t\tcase \"sharp\":\n\t\t\t\t\tbarAccidentals[pitch]=1; break;\n\t\t\t\tcase \"flat\":\n\t\t\t\t\tbarAccidentals[pitch]=-1; break;\n\t\t\t\tcase \"natural\":\n\t\t\t\t\tbarAccidentals[pitch]=0; break;\n\t\t\t\tcase \"dblsharp\":\n\t\t\t\t\tbarAccidentals[pitch]=2; break;\n\t\t\t\tcase \"dblflat\":\n\t\t\t\t\tbarAccidentals[pitch]=-2; break;\n\t\t\t\tcase \"quartersharp\":\n\t\t\t\t\tbarAccidentals[pitch]=0.25; break;\n\t\t\t\tcase \"quarterflat\":\n\t\t\t\t\tbarAccidentals[pitch]=-0.25; break;\n\t\t\t}\n\t\t}\n\n\t\tvar actualPitch = extractOctave(pitch) *12 + scale[extractNote(pitch)] + 60;\n\n\t\tif ( barAccidentals[pitch]!==undefined) {\n\t\t\t// An accidental is always taken at face value and supersedes the key signature.\n\t\t\tactualPitch += barAccidentals[pitch];\n\t\t} else { // use normal accidentals\n\t\t\tactualPitch += accidentals[extractNote(pitch)];\n\t\t}\n\t\tactualPitch += transpose;\n\t\treturn actualPitch;\n\t}\n\n\tfunction setKeySignature(elem) {\n\t\tvar accidentals = [0,0,0,0,0,0,0];\n\t\tif (!elem.accidentals) return accidentals;\n\t\tfor (var i = 0; i < elem.accidentals.length; i++) {\n\t\t\tvar acc = elem.accidentals[i];\n\t\t\tvar d;\n\t\t\tswitch (acc.acc) {\n\t\t\t\tcase \"flat\": d = -1; break;\n\t\t\t\tcase \"quarterflat\": d = -0.25; break;\n\t\t\t\tcase \"sharp\": d = 1; break;\n\t\t\t\tcase \"quartersharp\": d = 0.25; break;\n\t\t\t\tdefault: d = 0; break;\n\t\t\t}\n\n\t\t\tvar lowercase = acc.note.toLowerCase();\n\t\t\tvar note = extractNote(lowercase.charCodeAt(0)-'c'.charCodeAt(0));\n\t\t\taccidentals[note]+=d;\n\t\t}\n\t\treturn accidentals;\n\t}\n\n\tfunction processGraceNotes(graces, companionDuration) {\n\t\t// Grace notes take up half of the note value. So if there are many of them they are all real short.\n\t\tvar graceDuration = 0;\n\t\tvar ret = [];\n\t\tvar grace;\n\t\tfor (var g = 0; g < graces.length; g++) {\n\t\t\tgrace = graces[g];\n\t\t\tgraceDuration += grace.duration;\n\t\t}\n\t\tvar multiplier = companionDuration/2 / graceDuration;\n\n\t\tfor (g = 0; g < graces.length; g++) {\n\t\t\tgrace = graces[g];\n\t\t\tvar actualPitch = adjustPitch(grace);\n\t\t\tif (currentInstrument === drumInstrument && percmap) {\n\t\t\t\tvar name = pitchesToPerc(grace)\n\t\t\t\tif (name && percmap[name])\n\t\t\t\t\tactualPitch = percmap[name].sound;\n\t\t\t}\n\t\t\tvar pitch = { pitch: actualPitch, duration: grace.duration*multiplier };\n\t\t\tpitch = adjustForMicroTone(pitch);\n\t\t\tret.push(pitch);\n\t\t}\n\t\treturn ret;\n\t}\n\n\tfunction writeGraceNotes(graces, start, velocity, currentInstrument) {\n\t\tvar midiGrace = [];\n\t\tvelocity = Math.round(velocity)\n\t\tfor (var g = 0; g < graces.length; g++) {\n\t\t\tvar gp = graces[g];\n\t\t\tcurrentTrack.push({cmd: 'note', pitch: gp.pitch, volume: velocity, start: start, duration: gp.duration, gap: 0, instrument:currentInstrument, style: 'grace'});\n\t\t\tmidiGrace.push({\n\t\t\t\tpitch: gp.pitch,\n\t\t\t\tdurationInMeasures: gp.duration,\n\t\t\t\tvolume: velocity,\n\t\t\t\tinstrument: currentInstrument\n\t\t\t});\n\t\t\tstart += gp.duration;\n\t\t}\n\t\treturn midiGrace;\n\t}\n\n\tvar quarterToneFactor = 0.02930223664349;\n\tfunction adjustForMicroTone(description) {\n\t\t// if the pitch is not a whole number then make it a whole number and add a tuning factor\n\t\tvar pitch = ''+description.pitch;\n\t\tif (pitch.indexOf(\".75\") >= 0) {\n\t\t\tdescription.pitch = Math.round(description.pitch);\n\t\t\tdescription.cents = -50;\n\t\t} else if (pitch.indexOf(\".25\") >= 0) {\n\t\t\tdescription.pitch = Math.round(description.pitch);\n\t\t\tdescription.cents = 50;\n\t\t}\n\n\t\treturn description;\n\t}\n\n\tfunction extractOctave(pitch) {\n\t\treturn Math.floor(pitch/7);\n\t}\n\n\tfunction extractNote(pitch) {\n\t\tpitch = pitch%7;\n\t\tif (pitch<0) pitch+=7;\n\t\treturn pitch;\n\t}\n\n\n\tfunction normalizeDrumDefinition(params) {\n\t\t// Be very strict with the drum definition. If anything is not perfect,\n\t\t// just turn the drums off.\n\t\t// Perhaps all of this logic belongs in the parser instead.\n\t\tif (params.pattern.length === 0 || params.on === false)\n\t\t\treturn { on: false };\n\n\t\tvar str = params.pattern[0];\n\t\tvar events = [];\n\t\tvar event = \"\";\n\t\tvar totalPlay = 0;\n\t\tfor (var i = 0; i < str.length; i++) {\n\t\t\tif (str[i] === 'd')\n\t\t\t\ttotalPlay++;\n\t\t\tif (str[i] === 'd' || str[i] === 'z') {\n\t\t\t\tif (event.length !== 0) {\n\t\t\t\t\tevents.push(event);\n\t\t\t\t\tevent = str[i];\n\t\t\t\t} else\n\t\t\t\t\tevent = event + str[i];\n\t\t\t} else {\n\t\t\t\tif (event.length === 0) {\n\t\t\t\t\t// there was an error: the string should have started with d or z\n\t\t\t\t\treturn {on: false};\n\t\t\t\t}\n\t\t\t\tevent = event + str[i];\n\t\t\t}\n\t\t}\n\n\t\tif (event.length !== 0)\n\t\t\tevents.push(event);\n\n\t\t// Now the events array should have one item per event.\n\t\t// There should be two more params for each event: the volume and the pitch.\n\t\tif (params.pattern.length !== totalPlay*2 + 1)\n\t\t\treturn { on: false };\n\n\t\tvar ret = { on: true, bars: params.bars, pattern: []};\n\t\tvar beatLength = getBeatFraction(meter);\n\t\tvar playCount = 0;\n\t\tfor (var j = 0; j < events.length; j++) {\n\t\t\tevent = events[j];\n\t\t\tvar len = 1;\n\t\t\tvar div = false;\n\t\t\tvar num = 0;\n\t\t\tfor (var k = 1; k < event.length; k++) {\n\t\t\t\tswitch(event[k]) {\n\t\t\t\t\tcase \"/\":\n\t\t\t\t\t\tif (num !== 0)\n\t\t\t\t\t\t\tlen *= num;\n\t\t\t\t\t\tnum = 0;\n\t\t\t\t\t\tdiv = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"1\":\n\t\t\t\t\tcase \"2\":\n\t\t\t\t\tcase \"3\":\n\t\t\t\t\tcase \"4\":\n\t\t\t\t\tcase \"5\":\n\t\t\t\t\tcase \"6\":\n\t\t\t\t\tcase \"7\":\n\t\t\t\t\tcase \"8\":\n\t\t\t\t\tcase \"9\":\n\t\t\t\t\t\tnum = num*10 +event[k];\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn { on: false };\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (div) {\n\t\t\t\tif (num === 0) num = 2; // a slash by itself is interpreted as \"/2\"\n\t\t\t\tlen /= num;\n\t\t\t} else if (num)\n\t\t\t\tlen *= num;\n\t\t\tif (event[0] === 'd') {\n\t\t\t\tret.pattern.push({ len: len * beatLength, pitch: params.pattern[1 + playCount], velocity: params.pattern[1 + playCount + totalPlay]});\n\t\t\t\tplayCount++;\n\t\t\t} else\n\t\t\t\tret.pattern.push({ len: len * beatLength, pitch: null});\n\t\t}\n\t\tdrumBars = params.bars ? params.bars : 1;\n\t\treturn ret;\n\t}\n\n\tfunction alignDrumToMeter() {\n\t\tif (!drumDefinition ||!drumDefinition.pattern) {\n\t\t\treturn;\n\t\t}\n\t\tvar ret = drumDefinition;\n\t\t// Now normalize the pattern to cover the correct number of measures. The note lengths passed are relative to each other and need to be scaled to fit a measure.\n\t\tvar totalTime = 0;\n\t\tvar measuresPerBeat = meter.num/meter.den;\n\t\tfor (var ii = 0; ii < ret.pattern.length; ii++)\n\t\t\ttotalTime += ret.pattern[ii].len;\n\t\tvar factor = totalTime / drumBars / measuresPerBeat;\n\t\tfor (ii = 0; ii < ret.pattern.length; ii++)\n\t\t\tret.pattern[ii].len = ret.pattern[ii].len / factor;\n\t\tdrumDefinition = ret;\n\t}\n\n\tfunction writeDrum(channel) {\n\t\tif (drumTrack.length === 0 && !drumDefinition.on)\n\t\t\treturn;\n\n\t\tvar measureLen = meter.num/meter.den;\n\t\tif (drumTrack.length === 0) {\n\t\t\tif (lastEventTime < measureLen)\n\t\t\t\treturn; // This is true if there are pickup notes. The drum doesn't start until the first full measure.\n\t\t\tdrumTrack.push({cmd: 'program', channel: channel, instrument: drumInstrument});\n\t\t}\n\n\t\tif (!drumDefinition.on) {\n\t\t\t// this is the case where there has been a drum track, but it was specifically turned off.\n\t\t\treturn;\n\t\t}\n\t\tvar start = lastBarTime;\n\t\tfor (var i = 0; i < drumDefinition.pattern.length; i++) {\n\t\t\tvar len = durationRounded(drumDefinition.pattern[i].len);\n\t\t\tif (drumDefinition.pattern[i].pitch) {\n\t\t\t\tdrumTrack.push({\n\t\t\t\t\tcmd: 'note',\n\t\t\t\t\tpitch: drumDefinition.pattern[i].pitch,\n\t\t\t\t\tvolume: drumDefinition.pattern[i].velocity,\n\t\t\t\t\tstart: start,\n\t\t\t\t\tduration: len,\n\t\t\t\t\tgap: 0,\n\t\t\t\t\tinstrument: drumInstrument});\n\t\t\t}\n\t\t\tstart += len;\n\t\t}\n\t}\n\n\tfunction findOctaves(tracks, detuneCents) {\n\t\tvar timing = {};\n\t\tfor (var i = 0; i < tracks.length; i++) {\n\t\t\tfor (var j = 0; j < tracks[i].length; j++) {\n\t\t\t\tvar note = tracks[i][j];\n\t\t\t\tif (note.cmd === \"note\") {\n\t\t\t\t\tif (timing[note.start] === undefined)\n\t\t\t\t\t\ttiming[note.start] = [];\n\t\t\t\t\ttiming[note.start].push({track: i, event: j, pitch: note.pitch});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tvar keys = Object.keys(timing);\n\t\tfor (i = 0; i < keys.length; i++) {\n\t\t\tvar arr = timing[keys[i]];\n\t\t\tif (arr.length > 1) {\n\t\t\t\tarr = arr.sort(function(a,b) {\n\t\t\t\t\treturn a.pitch - b.pitch;\n\t\t\t\t});\n\t\t\t\tvar topEvent = arr[arr.length-1];\n\t\t\t\tvar topNote = topEvent.pitch % 12;\n\t\t\t\tvar found = false;\n\t\t\t\tfor (j = 0; !found && j < arr.length-1; j++) {\n\t\t\t\t\tif (arr[j].pitch % 12 === topNote)\n\t\t\t\t\t\tfound = true;\n\t\t\t\t}\n\t\t\t\tif (found) {\n\t\t\t\t\tvar event = tracks[topEvent.track][topEvent.event];\n\t\t\t\t\tif (!event.cents)\n\t\t\t\t\t\tevent.cents = 0;\n\t\t\t\t\tevent.cents += detuneCents;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n})();\n\nmodule.exports = flatten;\n","function delineTune(inputLines, options) {\n\tif (!options) options = {};\n\tvar lineBreaks = !!options.lineBreaks;\n\tvar outputLines = [];\n\tvar inMusicLine = false;\n\tvar currentMeter = [];\n\tvar currentKey = [];\n\tvar currentClef = [];\n\tvar currentVocalFont = [];\n\tvar currentGChordFont = [];\n\tvar currentTripletFont = [];\n\tvar currentAnnotationFont = [];\n\tfor (var i = 0; i < inputLines.length; i++) {\n\t\tvar inputLine = inputLines[i];\n\t\tif (inputLine.staff) {\n\t\t\tif (inMusicLine && !inputLine.vskip) {\n\t\t\t\tvar outputLine = outputLines[outputLines.length-1];\n\t\t\t\t//findMismatchKeys(inputLine, outputLine, [\"staff\", \"staffGroup\"], \"line\", i)\n\t\t\t\tfor (var s = 0; s < outputLine.staff.length; s++) {\n\t\t\t\t\tvar inputStaff = inputLine.staff[s];\n\t\t\t\t\tvar outputStaff = outputLine.staff[s];\n\t\t\t\t\tif (inputStaff) {\n\t\t\t\t\t\tif (!objEqual(inputStaff.meter, currentMeter[s])) {\n\t\t\t\t\t\t\t// The meter changed for this line, otherwise it wouldn't have been set\n\t\t\t\t\t\t\taddMeterToVoices(inputStaff.meter, inputStaff.voices)\n\t\t\t\t\t\t\tcurrentMeter[s] = inputStaff.meter;\n\t\t\t\t\t\t\tdelete inputStaff.meter;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!objEqual(inputStaff.key, currentKey[s])) {\n\t\t\t\t\t\t\taddKeyToVoices(inputStaff.key, inputStaff.voices);\n\t\t\t\t\t\t\tcurrentKey[s] = inputStaff.key;\n\t\t\t\t\t\t\tdelete inputStaff.key;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (inputStaff.title)\n\t\t\t\t\t\t\toutputStaff.abbrevTitle = inputStaff.title;\n\t\t\t\t\t\tif (!objEqual(inputStaff.clef, currentClef[s])) {\n\t\t\t\t\t\t\taddClefToVoices(inputStaff.clef, inputStaff.voices);\n\t\t\t\t\t\t\tcurrentClef[s] = inputStaff.clef;\n\t\t\t\t\t\t\tdelete inputStaff.clef;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!objEqual(inputStaff.vocalfont, currentVocalFont[s])) {\n\t\t\t\t\t\t\taddFontToVoices(inputStaff.vocalfont, inputStaff.voices, 'vocalfont')\n\t\t\t\t\t\t\tcurrentVocalFont[s] = inputStaff.vocalfont;\n\t\t\t\t\t\t\tdelete inputStaff.vocalfont;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!objEqual(inputStaff.gchordfont, currentGChordFont[s])) {\n\t\t\t\t\t\t\taddFontToVoices(inputStaff.gchordfont, inputStaff.voices, 'gchordfont')\n\t\t\t\t\t\t\tcurrentGChordFont[s] = inputStaff.gchordfont;\n\t\t\t\t\t\t\tdelete inputStaff.gchordfont;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!objEqual(inputStaff.tripletfont, currentTripletFont[s])) {\n\t\t\t\t\t\t\taddFontToVoices(inputStaff.tripletfont, inputStaff.voices, 'tripletfont')\n\t\t\t\t\t\t\tcurrentTripletFont[s] = inputStaff.tripletfont;\n\t\t\t\t\t\t\tdelete inputStaff.tripletfont;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!objEqual(inputStaff.annotationfont, currentAnnotationFont[s])) {\n\t\t\t\t\t\t\taddFontToVoices(inputStaff.annotationfont, inputStaff.voices, 'annotationfont')\n\t\t\t\t\t\t\tcurrentAnnotationFont[s] = inputStaff.annotationfont;\n\t\t\t\t\t\t\tdelete inputStaff.annotationfont;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t//findMismatchKeys(inputStaff, outputStaff, [\"voices\", \"title\", \"abbrevTitle\", \"barNumber\", \"meter\", \"key\", \"clef\", \"vocalfont\", \"gchordfont\", \"tripletfont\", \"annotationfont\"], \"staff\", i + ' ' + s)\n\t\t\t\t\tif (inputStaff) {\n\t\t\t\t\t\tfor (var v = 0; v < outputStaff.voices.length; v++) {\n\t\t\t\t\t\t\tvar outputVoice = outputStaff.voices[v];\n\t\t\t\t\t\t\tvar inputVoice = inputStaff.voices[v];\n\t\t\t\t\t\t\tif (lineBreaks)\n\t\t\t\t\t\t\t\toutputVoice.push({el_type: \"break\"});\n\t\t\t\t\t\t\tif (inputVoice)\n\t\t\t\t\t\t\t\toutputStaff.voices[v] = outputVoice.concat(inputVoice)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor (var ii = 0; ii < inputLine.staff.length; ii++) {\n\t\t\t\t\tcurrentKey[ii] = inputLine.staff[ii].key;\n\t\t\t\t\tcurrentMeter[ii] = inputLine.staff[ii].meter;\n\t\t\t\t\tcurrentClef[ii] = inputLine.staff[ii].clef;\n\t\t\t\t}\n\t\t\t\t// copy this because we are going to change it and we don't want to change the original.\n\t\t\t\toutputLines.push(cloneLine(inputLine));\n\t\t\t}\n\t\t\tinMusicLine = true;\n\t\t} else {\n\t\t\tinMusicLine = false;\n\t\t\toutputLines.push(inputLine);\n\t\t}\n\t}\n\treturn outputLines;\n}\n// function findMismatchKeys(input, output, ignore, context, context2) {\n// \tif (!input) {\n// \t\treturn;\n// \t}\n// \tvar outputKeys = Object.keys(output);\n// \tvar inputKeys = Object.keys(input);\n// \tfor (var ii = 0; ii < ignore.length; ii++) {\n// \t\tif (outputKeys.indexOf(ignore[ii]) >= 0) {\n// \t\t\toutputKeys.splice(outputKeys.indexOf(ignore[ii]), 1);\n// \t\t}\n// \t\tif (inputKeys.indexOf(ignore[ii]) >= 0) {\n// \t\t\tinputKeys.splice(inputKeys.indexOf(ignore[ii]), 1);\n// \t\t}\n// \t}\n// \tif (inputKeys.join(\",\") !== outputKeys.join(\",\")) {\n// \t\tconsole.log(\"keys mismatch \"+context + ' ' + context2, input, output);\n// \t}\n// \tfor (var k = 0; k < inputKeys.length; k++) {\n// \t\tvar key = inputKeys[k];\n// \t\tif (ignore.indexOf(key) < 0) {\n// \t\t\tvar inputValue = JSON.stringify(input[key], replacer);\n// \t\t\tvar outputValue = JSON.stringify(output[key], replacer);\n// \t\t\tif (inputValue !== outputValue)\n// \t\t\t\tconsole.log(\"value mismatch \"+context + ' ' + context2 + ' ' + key, inputValue, outputValue)\n// \t\t}\n// \t}\n// }\nfunction replacer(key, value) {\n\t// Filtering out properties\n\tif (key === 'abselem') {\n\t\treturn 'abselem';\n\t}\n\treturn value;\n}\n\nfunction addMeterToVoices(meter, voices) {\n\tmeter.el_type = \"meter\";\n\tmeter.startChar = -1;\n\tmeter.endChar = -1;\n\tfor (var i = 0; i < voices.length; i++) {\n\t\tvoices[i].unshift(meter);\n\t}\n}\n\nfunction addKeyToVoices(key, voices) {\n\tkey.el_type = \"key\";\n\tkey.startChar = -1;\n\tkey.endChar = -1;\n\tfor (var i = 0; i < voices.length; i++) {\n\t\tvoices[i].unshift(key);\n\t}\n}\n\nfunction addClefToVoices(clef, voices) {\n\tclef.el_type = \"clef\";\n\tclef.startChar = -1;\n\tclef.endChar = -1;\n\tfor (var i = 0; i < voices.length; i++) {\n\t\tvoices[i].unshift(clef);\n\t}\n}\n\nfunction addFontToVoices(font, voices, type) {\n\tfont.el_type = \"font\";\n\tfont.type = type;\n\tfont.startChar = -1;\n\tfont.endChar = -1;\n\tfor (var i = 0; i < voices.length; i++) {\n\t\tvoices[i].unshift(font);\n\t}\n}\n\nfunction objEqual(input, output) {\n\tif (!input)\n\t\treturn true; // the default is whatever the old output is.\n\tvar inputValue = JSON.stringify(input, replacer);\n\tvar outputValue = JSON.stringify(output, replacer);\n\treturn inputValue === outputValue;\n}\n\nfunction cloneLine(line) {\n\tvar output = {};\n\tvar keys = Object.keys(line);\n\tfor (var i = 0; i < keys.length; i++) {\n\t\tif (keys[i] !== \"staff\")\n\t\t\toutput[keys[i]] = line[keys[i]];\n\t\telse {\n\t\t\toutput.staff = [];\n\t\t\tfor (var j = 0; j < line.staff.length; j++) {\n\t\t\t\tvar staff = {};\n\t\t\t\tvar keys2 = Object.keys(line.staff[j]);\n\t\t\t\tfor (var k = 0; k < keys2.length; k++) {\n\t\t\t\t\tif (keys2[k] !== \"voices\")\n\t\t\t\t\t\tstaff[keys2[k]] = line.staff[j][keys2[k]];\n\t\t\t\t\telse {\n\t\t\t\t\t\tstaff.voices = [];\n\t\t\t\t\t\tfor (var v = 0; v < line.staff[j].voices.length; v++) {\n\t\t\t\t\t\t\tstaff.voices.push([].concat(line.staff[j].voices[v]));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\toutput.staff.push(staff)\n\t\t\t}\n\t\t}\n\t}\n\treturn output;\n}\n\nmodule.exports = delineTune;\n","// abc_tune.js: a computer usable internal structure representing one tune.\n\nvar parseCommon = require('../parse/abc_common');\nvar spacing = require('../write/helpers/spacing');\nvar sequence = require('../synth/abc_midi_sequencer');\nvar flatten = require('../synth/abc_midi_flattener');\nvar delineTune = require(\"./deline-tune\");\n\n/**\n * This is the data for a single ABC tune. It is created and populated by the window.ABCJS.parse.Parse class.\n * Also known as the ABCJS Abstract Syntax Tree\n * @alternateClassName ABCJS.Tune\n */\nvar Tune = function() {\n\tthis.reset = function () {\n\t\tthis.version = \"1.1.0\";\n\t\tthis.media = \"screen\";\n\t\tthis.metaText = {};\n\t\tthis.metaTextInfo = {};\n\t\tthis.formatting = {};\n\t\tthis.lines = [];\n\t\tthis.staffNum = 0;\n\t\tthis.voiceNum = 0;\n\t\tthis.lineNum = 0;\n\t\tthis.runningFonts = {};\n\t\tdelete this.visualTranspose;\n\t};\n\tthis.reset();\n\n\tfunction copy(dest, src, prop, attrs) {\n\t\tfor (var i = 0; i < attrs.length; i++)\n\t\t\tdest[prop][attrs[i]] = src[prop][attrs[i]];\n\t}\n\n\tthis.copyTopInfo = function(src) {\n\t\tvar attrs = ['tempo', 'title', 'header', 'rhythm', 'origin', 'composer', 'author', 'partOrder'];\n\t\tcopy(this, src, \"metaText\", attrs);\n\t\tcopy(this, src, \"metaTextInfo\", attrs);\n\t};\n\n\tthis.copyBottomInfo = function(src) {\n\t\tvar attrs = ['unalignedWords',\n\t\t\t'book',\n\t\t\t'source',\n\t\t\t'discography',\n\t\t\t'notes',\n\t\t\t'transcription',\n\t\t\t'history',\n\t\t\t'abc-copyright',\n\t\t\t'abc-creator',\n\t\t\t'abc-edited-by',\n\t\t\t'footer']\n\t\tcopy(this, src, \"metaText\", attrs);\n\t\tcopy(this, src, \"metaTextInfo\", attrs);\n\t};\n\n\t// The structure consists of a hash with the following two items:\n\t// metaText: a hash of {key, value}, where key is one of: title, author, rhythm, source, transcription, unalignedWords, etc...\n\t// tempo: { noteLength: number (e.g. .125), bpm: number }\n\t// lines: an array of elements, or one of the following:\n\t//\n\t// STAFF: array of elements\n\t// SUBTITLE: string\n\t//\n\t// TODO: actually, the start and end char should modify each part of the note type\n\t// The elements all have a type field and a start and end char\n\t// field. The rest of the fields depend on the type and are listed below:\n\t// REST: duration=1,2,4,8; chord: string\n\t// NOTE: accidental=none,dbl_flat,flat,natural,sharp,dbl_sharp\n\t//\t\tpitch: \"C\" is 0. The numbers refer to the pitch letter.\n\t//\t\tduration: .5 (sixteenth), .75 (dotted sixteenth), 1 (eighth), 1.5 (dotted eighth)\n\t//\t\t\t2 (quarter), 3 (dotted quarter), 4 (half), 6 (dotted half) 8 (whole)\n\t//\t\tchord: { name:chord, position: one of 'default', 'above', 'below' }\n\t//\t\tend_beam = true or undefined if this is the last note in a beam.\n\t//\t\tlyric: array of { syllable: xxx, divider: one of \" -_\" }\n\t//\t\tstartTie = true|undefined\n\t//\t\tendTie = true|undefined\n\t//\t\tstartTriplet = num <- that is the number to print\n\t//\t\tendTriplet = true|undefined (the last note of the triplet)\n\t// TODO: actually, decoration should be an array.\n\t//\t\tdecoration: upbow, downbow, accent\n\t// BAR: type=bar_thin, bar_thin_thick, bar_thin_thin, bar_thick_thin, bar_right_repeat, bar_left_repeat, bar_double_repeat\n\t//\tnumber: 1 or 2: if it is the start of a first or second ending\n\t// CLEF: type=treble,bass\n\t// KEY-SIG:\n\t//\t\taccidentals[]: { acc:sharp|dblsharp|natural|flat|dblflat, note:a|b|c|d|e|f|g }\n\t// METER: type: common_time,cut_time,specified\n\t//\t\tif specified, { num: 99, den: 99 }\n\n\tthis.getBeatLength = function() {\n\t\t// This returns a fraction: for instance 1/4 for a quarter\n\t\t// There are two types of meters: compound and regular. Compound meter has 3 beats counted as one.\n\t\tvar meter = this.getMeterFraction();\n\t\tvar multiplier = 1;\n\t\tif (meter.num === 6 || meter.num === 9 || meter.num === 12)\n\t\t\tmultiplier = 3;\n\t\telse if (meter.num === 3 && meter.den === 8)\n\t\t\tmultiplier = 3;\n\n\t\treturn multiplier / meter.den;\n\t};\n\n\tfunction computePickupLength(lines, barLength) {\n\t\tvar pickupLength = 0;\n\t\tfor (var i = 0; i < lines.length; i++) {\n\t\t\tif (lines[i].staff) {\n\t\t\t\tfor (var j = 0; j < lines[i].staff.length; j++) {\n\t\t\t\t\tfor (var v = 0; v < lines[i].staff[j].voices.length; v++) {\n\t\t\t\t\t\tvar voice = lines[i].staff[j].voices[v];\n\t\t\t\t\t\tvar tripletMultiplier = 1;\n\t\t\t\t\t\tfor (var el = 0; el < voice.length; el++) {\n\t\t\t\t\t\t\tvar isSpacer = voice[el].rest && voice[el].rest.type === \"spacer\";\n\t\t\t\t\t\t\tif (voice[el].startTriplet)\n\t\t\t\t\t\t\t\ttripletMultiplier = voice[el].tripletMultiplier;\n\t\t\t\t\t\t\tif (voice[el].duration && !isSpacer && voice[el].el_type !== \"tempo\")\n\t\t\t\t\t\t\t\tpickupLength += voice[el].duration * tripletMultiplier;\n\t\t\t\t\t\t\tif (voice[el].endTriplet)\n\t\t\t\t\t\t\t\ttripletMultiplier = 1;\n\t\t\t\t\t\t\tif (pickupLength >= barLength)\n\t\t\t\t\t\t\t\tpickupLength -= barLength;\n\t\t\t\t\t\t\tif (voice[el].el_type === 'bar')\n\t\t\t\t\t\t\t\treturn pickupLength;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn pickupLength;\n\t}\n\tthis.getPickupLength = function() {\n\t\tvar barLength = this.getBarLength();\n\t\tvar pickupLength = computePickupLength(this.lines, barLength);\n\n\t\t// If computed pickup length is very close to 0 or the bar length, we assume\n\t\t// that we actually have a full bar and hence no pickup.\n\t\treturn (pickupLength < 1e-8 || barLength-pickupLength < 1e-8) ? 0 : pickupLength;\n\t};\n\n\tthis.getBarLength = function() {\n\t\tvar meter = this.getMeterFraction();\n\t\treturn meter.num / meter.den;\n\t};\n\n\tthis.getTotalTime = function() {\n\t\treturn this.totalTime;\n\t};\n\n\tthis.getTotalBeats = function() {\n\t\treturn this.totalBeats;\n\t};\n\n\tthis.millisecondsPerMeasure = function(bpmOverride) {\n\t\tvar bpm;\n\t\tif (bpmOverride) {\n\t\t\tbpm = bpmOverride;\n\t\t} else {\n\t\t\tvar tempo = this.metaText ? this.metaText.tempo : null;\n\t\t\tbpm = this.getBpm(tempo);\n\t\t}\n\t\tif (bpm <= 0)\n\t\t\tbpm = 1; // I don't think this can happen, but we don't want a possibility of dividing by zero.\n\n\t\tvar beatsPerMeasure = this.getBeatsPerMeasure();\n\n\t\tvar minutesPerMeasure = beatsPerMeasure / bpm;\n\t\treturn minutesPerMeasure * 60000;\n\t};\n\n\tthis.getBeatsPerMeasure = function() {\n\t\tvar beatLen = this.getBeatLength();\n\t\tvar barLen = this.getBarLength();\n\t\treturn barLen / beatLen;\n\t};\n\n\tthis.getMeter = function() {\n\t\tfor (var i = 0; i < this.lines.length; i++) {\n\t\t\tvar line = this.lines[i];\n\t\t\tif (line.staff) {\n\t\t\t\tfor (var j = 0; j < line.staff.length; j++) {\n\t\t\t\t\tvar meter = line.staff[j].meter;\n\t\t\t\t\tif (meter) {\n\t\t\t\t\t\treturn meter;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn { type: \"common_time\" };\n\t};\n\n\tthis.getMeterFraction = function() {\n\t\tvar meter = this.getMeter();\n\t\tvar num = 4;\n\t\tvar den = 4;\n\t\tif (meter) {\n\t\t\tif (meter.type === 'specified') {\n\t\t\t\tnum = parseInt(meter.value[0].num, 10);\n\t\t\t\tden = parseInt(meter.value[0].den,10);\n\t\t\t} else if (meter.type === 'cut_time') {\n\t\t\t\tnum = 2;\n\t\t\t\tden = 2;\n\t\t\t} else if (meter.type === 'common_time') {\n\t\t\t\tnum = 4;\n\t\t\t\tden = 4;\n\t\t\t}\n\t\t}\n\t\tthis.meter = { num: num, den: den };\n\t\treturn this.meter; // TODO-PER: is this saved value used anywhere? A get function shouldn't change state.\n\t};\n\n\tthis.getKeySignature = function() {\n\t\tfor (var i = 0; i < this.lines.length; i++) {\n\t\t\tvar line = this.lines[i];\n\t\t\tif (line.staff) {\n\t\t\t\tfor (var j = 0; j < line.staff.length; j++) {\n\t\t\t\t\tif (line.staff[j].key)\n\t\t\t\t\t\treturn line.staff[j].key;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn { };\n\t};\n\n\tthis.getElementFromChar = function(char) {\n\t\tfor (var i = 0; i < this.lines.length; i++) {\n\t\t\tvar line = this.lines[i];\n\t\t\tif (line.staff) {\n\t\t\t\tfor (var j = 0; j < line.staff.length; j++) {\n\t\t\t\t\tvar staff = line.staff[j];\n\t\t\t\t\tfor (var k = 0; k < staff.voices.length; k++) {\n\t\t\t\t\t\tvar voice = staff.voices[k];\n\t\t\t\t\t\tfor (var ii = 0; ii < voice.length; ii++) {\n\t\t\t\t\t\t\tvar elem = voice[ii];\n\t\t\t\t\t\t\tif (elem.startChar && elem.endChar &&\n\t\t\t\t\t\t\t\telem.startChar <= char && elem.endChar > char)\n\t\t\t\t\t\t\t\treturn elem;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t};\n\n\tfunction addVerticalInfo(timingEvents) {\n\t\t// Add vertical info to the bar events: put the next event's top, and the event after the next measure's top.\n\t\tvar lastBarTop;\n\t\tvar lastBarBottom;\n\t\tvar lastEventTop;\n\t\tvar lastEventBottom;\n\t\tfor (var e = timingEvents.length - 1; e >= 0; e--) {\n\t\t\tvar ev = timingEvents[e];\n\t\t\tif (ev.type === 'bar') {\n\t\t\t\tev.top = lastEventTop;\n\t\t\t\tev.nextTop = lastBarTop;\n\t\t\t\tlastBarTop = lastEventTop;\n\n\t\t\t\tev.bottom = lastEventBottom;\n\t\t\t\tev.nextBottom = lastBarBottom;\n\t\t\t\tlastBarBottom = lastEventBottom;\n\t\t\t} else if (ev.type === 'event') {\n\t\t\t\tlastEventTop = ev.top;\n\t\t\t\tlastEventBottom = ev.top + ev.height;\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction makeSortedArray(hash) {\n\t\tvar arr = [];\n\t\tfor (var k in hash) {\n\t\t\tif (hash.hasOwnProperty(k))\n\t\t\t\tarr.push(hash[k]);\n\t\t}\n\t\tarr = arr.sort(function (a, b) {\n\t\t\tvar diff = a.milliseconds - b.milliseconds;\n\t\t\t// if the events have the same time, make sure a bar comes before a note\n\t\t\tif (diff !== 0) {\n\t\t\t\treturn diff;\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn a.type === \"bar\" ? -1 : 1;\n\t\t\t}\n\t\t});\n\t\treturn arr;\n\t}\n\n\tthis.addElementToEvents = function(eventHash, element, voiceTimeMilliseconds, top, height, line, measureNumber, timeDivider, isTiedState, nextIsBar) {\n\t\tif (element.hint)\n\t\t\treturn { isTiedState: undefined, duration: 0 };\n\t\tvar realDuration = element.durationClass ? element.durationClass : element.duration;\n\t\tif (element.abcelem.rest && element.abcelem.rest.type === \"spacer\")\n\t\t\trealDuration = 0;\n\t\tif (realDuration > 0) {\n\t\t\tvar es = [];\n\t\t\t// If there is an invisible rest, then there are not elements, so don't push a null one.\n\t\t\tfor (var i = 0; i < element.elemset.length; i++) {\n\t\t\t\tif (element.elemset[i] !== null)\n\t\t\t\t\tes.push(element.elemset[i]);\n\t\t\t}\n\t\t\tvar isTiedToNext = element.startTie;\n\t\t\tif (isTiedState !== undefined) {\n\t\t\t\teventHash[\"event\" + isTiedState].elements.push(es); // Add the tied note to the first note that it is tied to\n\t\t\t\tif (nextIsBar) {\n\t\t\t\t\tif (!eventHash[\"event\" + voiceTimeMilliseconds]) {\n\t\t\t\t\t\teventHash[\"event\" + voiceTimeMilliseconds] = {\n\t\t\t\t\t\t\ttype: \"event\",\n\t\t\t\t\t\t\tmilliseconds: voiceTimeMilliseconds,\n\t\t\t\t\t\t\tline: line,\n\t\t\t\t\t\t\tmeasureNumber: measureNumber,\n\t\t\t\t\t\t\ttop: top,\n\t\t\t\t\t\t\theight: height,\n\t\t\t\t\t\t\tleft: null,\n\t\t\t\t\t\t\twidth: 0,\n\t\t\t\t\t\t\telements: [],\n\t\t\t\t\t\t\tstartChar: null,\n\t\t\t\t\t\t\tendChar: null,\n\t\t\t\t\t\t\tstartCharArray: [],\n\t\t\t\t\t\t\tendCharArray: []\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\teventHash[\"event\" + voiceTimeMilliseconds].measureStart = true;\n\t\t\t\t\tnextIsBar = false;\n\t\t\t\t}\n\t\t\t\tif (!isTiedToNext)\n\t\t\t\t\tisTiedState = undefined;\n\t\t\t} else {\n\t\t\t\t// the last note wasn't tied.\n\t\t\t\tif (!eventHash[\"event\" + voiceTimeMilliseconds]) {\n\t\t\t\t\teventHash[\"event\" + voiceTimeMilliseconds] = {\n\t\t\t\t\t\ttype: \"event\",\n\t\t\t\t\t\tmilliseconds: voiceTimeMilliseconds,\n\t\t\t\t\t\tline: line,\n\t\t\t\t\t\tmeasureNumber: measureNumber,\n\t\t\t\t\t\ttop: top,\n\t\t\t\t\t\theight: height,\n\t\t\t\t\t\tleft: element.x,\n\t\t\t\t\t\twidth: element.w,\n\t\t\t\t\t\telements: [es],\n\t\t\t\t\t\tstartChar: element.abcelem.startChar,\n\t\t\t\t\t\tendChar: element.abcelem.endChar,\n\t\t\t\t\t\tstartCharArray: [element.abcelem.startChar],\n\t\t\t\t\t\tendCharArray: [element.abcelem.endChar],\n\t\t\t\t\t\tmidiPitches: element.abcelem.midiPitches ? parseCommon.cloneArray(element.abcelem.midiPitches) : []\n\t\t\t\t\t};\n\t\t\t\t\tif (element.abcelem.midiGraceNotePitches)\n\t\t\t\t\t\teventHash[\"event\" + voiceTimeMilliseconds].midiGraceNotePitches = parseCommon.cloneArray(element.abcelem.midiGraceNotePitches);\n\t\t\t\t} else {\n\t\t\t\t\t// If there is more than one voice then two notes can fall at the same time. Usually they would be lined up in the same place, but if it is a whole rest, then it is placed funny. In any case, the left most element wins.\n\t\t\t\t\tif (eventHash[\"event\" + voiceTimeMilliseconds].left)\n\t\t\t\t\t\teventHash[\"event\" + voiceTimeMilliseconds].left = Math.min(eventHash[\"event\" + voiceTimeMilliseconds].left, element.x);\n\t\t\t\t\telse\n\t\t\t\t\t\teventHash[\"event\" + voiceTimeMilliseconds].left = element.x;\n\t\t\t\t\teventHash[\"event\" + voiceTimeMilliseconds].elements.push(es);\n\t\t\t\t\teventHash[\"event\" + voiceTimeMilliseconds].startCharArray.push(element.abcelem.startChar);\n\t\t\t\t\teventHash[\"event\" + voiceTimeMilliseconds].endCharArray.push(element.abcelem.endChar);\n\t\t\t\t\tif (eventHash[\"event\" + voiceTimeMilliseconds].startChar === null)\n\t\t\t\t\t\teventHash[\"event\" + voiceTimeMilliseconds].startChar =element.abcelem.startChar;\n\t\t\t\t\tif (eventHash[\"event\" + voiceTimeMilliseconds].endChar === null)\n\t\t\t\t\t\teventHash[\"event\" + voiceTimeMilliseconds].endChar =element.abcelem.endChar;\n\t\t\t\t\tif (element.abcelem.midiPitches && element.abcelem.midiPitches.length) {\n\t\t\t\t\t\tif (!eventHash[\"event\" + voiceTimeMilliseconds].midiPitches)\n\t\t\t\t\t\t\teventHash[\"event\" + voiceTimeMilliseconds].midiPitches = [];\n\t\t\t\t\t\tfor (var i = 0; i < element.abcelem.midiPitches.length; i++)\n\t\t\t\t\t\t\teventHash[\"event\" + voiceTimeMilliseconds].midiPitches.push(element.abcelem.midiPitches[i]);\n\t\t\t\t\t}\n\t\t\t\t\tif (element.abcelem.midiGraceNotePitches && element.abcelem.midiGraceNotePitches.length) {\n\t\t\t\t\t\tif (!eventHash[\"event\" + voiceTimeMilliseconds].midiGraceNotePitches)\n\t\t\t\t\t\t\teventHash[\"event\" + voiceTimeMilliseconds].midiGraceNotePitches = [];\n\t\t\t\t\t\tfor (var j = 0; j < element.abcelem.midiGraceNotePitches.length; j++)\n\t\t\t\t\t\t\teventHash[\"event\" + voiceTimeMilliseconds].midiGraceNotePitches.push(element.abcelem.midiGraceNotePitches[j]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (nextIsBar) {\n\t\t\t\t\teventHash[\"event\" + voiceTimeMilliseconds].measureStart = true;\n\t\t\t\t\tnextIsBar = false;\n\t\t\t\t}\n\t\t\t\t// TODO-PER: There doesn't seem to be a harm in letting ties be two different notes and it fixes a bug when a tie goes to a new line. If there aren't other problems with this change, then the variable can be removed completely. \n\t\t\t\t// if (isTiedToNext)\n\t\t\t\t// \tisTiedState = voiceTimeMilliseconds;\n\t\t\t}\n\t\t}\n\t\treturn { isTiedState: isTiedState, duration: realDuration / timeDivider, nextIsBar: nextIsBar || element.type === 'bar' };\n\t};\n\n\tthis.makeVoicesArray = function() {\n\t\t// First make a new array that is arranged by voice so that the repeats that span different lines are handled correctly.\n\t\tvar voicesArr = [];\n\t\tvar measureNumber = [];\n\t\tvar tempos = {};\n\t\tfor (var line = 0; line < this.engraver.staffgroups.length; line++) {\n\t\t\tvar group = this.engraver.staffgroups[line];\n\t\t\tif (group && group.staffs && group.staffs.length > 0) {\n\t\t\t\tvar firstStaff = group.staffs[0];\n\t\t\t\tvar middleC = firstStaff.absoluteY;\n\t\t\t\tvar top = middleC - firstStaff.top * spacing.STEP;\n\t\t\t\tvar lastStaff = group.staffs[group.staffs.length - 1];\n\t\t\t\tmiddleC = lastStaff.absoluteY;\n\t\t\t\tvar bottom = middleC - lastStaff.bottom * spacing.STEP;\n\t\t\t\tvar height = bottom - top;\n\n\t\t\t\tvar voices = group.voices;\n\t\t\t\tfor (var v = 0; v < voices.length; v++) {\n\t\t\t\t\tif (voices[v].staff && voices[v].staff.isTabStaff)\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\tvar noteFound = false;\n\t\t\t\t\tif (!voicesArr[v])\n\t\t\t\t\t\tvoicesArr[v] = [];\n\t\t\t\t\tif (measureNumber[v] === undefined)\n\t\t\t\t\t\tmeasureNumber[v] = 0;\n\t\t\t\t\tvar elements = voices[v].children;\n\t\t\t\t\tfor (var elem = 0; elem < elements.length; elem++) {\n\t\t\t\t\t\tif (elements[elem].type === \"tempo\")\n\t\t\t\t\t\t\ttempos[measureNumber[v]] = this.getBpm(elements[elem].abcelem);\n\t\t\t\t\t\tvoicesArr[v].push({top: top, height: height, line: group.line, measureNumber: measureNumber[v], elem: elements[elem]});\n\t\t\t\t\t\tif (elements[elem].type === 'bar' && noteFound) // Count the measures by counting the bar lines, but skip a bar line that appears at the left of the music, before any notes.\n\t\t\t\t\t\t\tmeasureNumber[v]++;\n\t\t\t\t\t\tif (elements[elem].type === 'note' || elements[elem].type === 'rest')\n\t\t\t\t\t\t\tnoteFound = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthis.tempoLocations = tempos; // This should be passed back, but the function is accessible publicly so that would break the interface.\n\t\treturn voicesArr;\n\t};\n\n\tthis.setupEvents = function(startingDelay, timeDivider, startingBpm, warp) {\n\t\tif (!warp) warp = 1;\n\t\tvar timingEvents = [];\n\n\t\tvar eventHash = {};\n\t\t// The time is the number of seconds from the beginning of the piece.\n\t\t// The units we are scanning are in notation units (i.e. 0.25 is a quarter note)\n\t\tvar time = startingDelay;\n\t\tvar isTiedState;\n\t\tvar nextIsBar = true;\n\t\tvar voices = this.makeVoicesArray();\n\t\tvar maxVoiceTimeMilliseconds = 0;\n\t\tfor (var v = 0; v < voices.length; v++) {\n\t\t\tvar voiceTime = time;\n\t\t\tvar voiceTimeMilliseconds = Math.round(voiceTime * 1000);\n\t\t\tvar startingRepeatElem = 0;\n\t\t\tvar endingRepeatElem = -1;\n\t\t\tvar elements = voices[v];\n\t\t\tvar bpm = startingBpm;\n\t\t\ttimeDivider = this.getBeatLength() * bpm / 60;\n\t\t\tvar tempoDone = -1;\n\t\t\tfor (var elem = 0; elem < elements.length; elem++) {\n\t\t\t\tvar thisMeasure = elements[elem].measureNumber;\n\t\t\t\tif (tempoDone !== thisMeasure && this.tempoLocations[thisMeasure]) {\n\t\t\t\t\tbpm = this.tempoLocations[thisMeasure];\n\t\t\t\t\ttimeDivider = warp * this.getBeatLength() * bpm / 60;\n\t\t\t\t\ttempoDone = thisMeasure;\n\t\t\t\t}\n\t\t\t\tvar element = elements[elem].elem;\n\t\t\t\tvar ret = this.addElementToEvents(eventHash, element, voiceTimeMilliseconds, elements[elem].top, elements[elem].height, elements[elem].line, elements[elem].measureNumber, timeDivider, isTiedState, nextIsBar);\n\t\t\t\tisTiedState = ret.isTiedState;\n\t\t\t\tnextIsBar = ret.nextIsBar;\n\t\t\t\tvoiceTime += ret.duration;\n\t\t\t\tvar lastHash;\n\t\t\t\tif (element.duration > 0 && eventHash[\"event\" + voiceTimeMilliseconds]) // This won't exist if this is the end of a tie.\n\t\t\t\t\tlastHash = \"event\" + voiceTimeMilliseconds;\n\t\t\t\tvoiceTimeMilliseconds = Math.round(voiceTime * 1000);\n\t\t\t\tif (element.type === 'bar') {\n\t\t\t\t\tvar barType = element.abcelem.type;\n\t\t\t\t\tvar endRepeat = (barType === \"bar_right_repeat\" || barType === \"bar_dbl_repeat\");\n\t\t\t\t\tvar startEnding = (element.abcelem.startEnding === '1');\n\t\t\t\t\tvar startRepeat = (barType === \"bar_left_repeat\" || barType === \"bar_dbl_repeat\" || barType === \"bar_right_repeat\");\n\t\t\t\t\tif (endRepeat) {\n\t\t\t\t\t\t// Force the end of the previous note to the position of the measure - the cursor won't go past the end repeat\n\t\t\t\t\t\tif (elem > 0) {\n\t\t\t\t\t\t\teventHash[lastHash].endX = element.x;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (endingRepeatElem === -1)\n\t\t\t\t\t\t\tendingRepeatElem = elem;\n\t\t\t\t\t\tvar lastVoiceTimeMilliseconds = 0;\n\t\t\t\t\t\ttempoDone = -1;\n\t\t\t\t\t\tfor (var el2 = startingRepeatElem; el2 < endingRepeatElem; el2++) {\n\t\t\t\t\t\t\tthisMeasure = elements[el2].measureNumber;\n\t\t\t\t\t\t\tif (tempoDone !== thisMeasure && this.tempoLocations[thisMeasure]) {\n\t\t\t\t\t\t\t\tbpm = this.tempoLocations[thisMeasure];\n\t\t\t\t\t\t\t\ttimeDivider = warp * this.getBeatLength() * bpm / 60;\n\t\t\t\t\t\t\t\ttempoDone = thisMeasure;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tvar element2 = elements[el2].elem;\n\t\t\t\t\t\t\tret = this.addElementToEvents(eventHash, element2, voiceTimeMilliseconds, elements[el2].top, elements[el2].height, elements[el2].line, elements[el2].measureNumber, timeDivider, isTiedState, nextIsBar);\n\t\t\t\t\t\t\tisTiedState = ret.isTiedState;\n\t\t\t\t\t\t\tnextIsBar = ret.nextIsBar;\n\t\t\t\t\t\t\tvoiceTime += ret.duration;\n\t\t\t\t\t\t\tlastVoiceTimeMilliseconds = voiceTimeMilliseconds;\n\t\t\t\t\t\t\tvoiceTimeMilliseconds = Math.round(voiceTime * 1000);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (eventHash[\"event\" + lastVoiceTimeMilliseconds]) // This won't exist if it is the beginning of the next line. That's ok because we will just count the end of the last line as the end.\n\t\t\t\t\t\t\teventHash[\"event\" + lastVoiceTimeMilliseconds].endX = elements[endingRepeatElem].elem.x;\n\t\t\t\t\t\tnextIsBar = true;\n\t\t\t\t\t\tendingRepeatElem = -1;\n\t\t\t\t\t}\n\t\t\t\t\tif (startEnding)\n\t\t\t\t\t\tendingRepeatElem = elem;\n\t\t\t\t\tif (startRepeat)\n\t\t\t\t\t\tstartingRepeatElem = elem;\n\t\t\t\t}\n\t\t\t}\n\t\t\tmaxVoiceTimeMilliseconds = Math.max(maxVoiceTimeMilliseconds, voiceTimeMilliseconds)\n\t\t}\n\t\t// now we have all the events, but if there are multiple voices then there may be events out of order or duplicated, so normalize it.\n\t\ttimingEvents = makeSortedArray(eventHash);\n\t\taddVerticalInfo(timingEvents);\n\t\taddEndPoints(this.lines, timingEvents)\n\t\ttimingEvents.push({ type: \"end\", milliseconds: maxVoiceTimeMilliseconds });\n\t\tthis.addUsefulCallbackInfo(timingEvents, bpm*warp);\n\t\treturn timingEvents;\n\t};\n\n\tthis.addUsefulCallbackInfo = function(timingEvents, bpm) {\n\t\tvar millisecondsPerMeasure = this.millisecondsPerMeasure(bpm);\n\t\tfor (var i = 0; i < timingEvents.length; i++) {\n\t\t\tvar ev = timingEvents[i];\n\t\t\tev.millisecondsPerMeasure = millisecondsPerMeasure;\n\t\t}\n\t};\n\n\tfunction skipTies(elements, index) {\n\t\twhile (index < elements.length && elements[index].left === null)\n\t\t\tindex++;\n\t\treturn elements[index];\n\t}\n\tfunction addEndPoints(lines, elements) {\n\t\tif (elements.length < 1)\n\t\t\treturn;\n\t\tfor (var i = 0; i < elements.length-1; i++) {\n\t\t\tvar el = elements[i];\n\t\t\tvar next = skipTies(elements, i+1);\n\t\t\tif (el.left !== null) {\n\t\t\t\t// If there is no left element that is because this is a tie so it should be skipped.\n\t\t\t\tvar endX = (next && el.top === next.top) ? next.left : lines[el.line].staffGroup.w;\n\t\t\t\t// If this is already set, it is because the notes aren't sequential here, like the next thing is a repeat bar line.\n\t\t\t\t// In that case, the right-most position is passed in. There could still be an intervening note in another voice, so always look for the closest position.\n\t\t\t\t// If there is a repeat that stays on the same line, the endX set above won't be right because the next note will be before. In that case, use the endX that was calculated.\n\t\t\t\tif (el.endX !== undefined) {\n\t\t\t\t\tif (endX > el.left)\n\t\t\t\t\t\tel.endX = Math.min(el.endX, endX);\n\t\t\t\t} else\n\t\t\t\t\tel.endX = endX;\n\t\t\t}\n\t\t}\n\t\tvar lastEl = elements[elements.length-1];\n\t\tlastEl.endX = lines[lastEl.line].staffGroup.w;\n\t}\n\n\tthis.getBpm = function(tempo) {\n\t\tvar bpm;\n\t\tif (!tempo)\n\t\t\ttempo = this.metaText ? this.metaText.tempo : null;\n\t\tif (tempo) {\n\t\t\tbpm = tempo.bpm;\n\t\t\tvar beatLength = this.getBeatLength();\n\t\t\tvar statedBeatLength = tempo.duration && tempo.duration.length > 0 ? tempo.duration[0] : beatLength;\n\t\t\tbpm = bpm * statedBeatLength / beatLength;\n\t\t}\n\t\tif (!bpm) {\n\t\t\tbpm = 180;\n\t\t\t// Compensate for compound meter, where the beat isn't a beat.\n\t\t\tvar meter = this.getMeterFraction();\n\t\t\tif (meter && meter.num !== 3 && (meter.num % 3 === 0)) {\n\t\t\t\tbpm = 120;\n\t\t\t}\n\t\t}\n\t\treturn bpm;\n\t};\n\n\tthis.setTiming = function (bpm, measuresOfDelay) {\n\t\tmeasuresOfDelay = measuresOfDelay || 0;\n\t\tif (!this.engraver || !this.engraver.staffgroups) {\n\t\t\tconsole.log(\"setTiming cannot be called before the tune is drawn.\");\n\t\t\tthis.noteTimings = [];\n\t\t\treturn this.noteTimings;\n\t\t}\n\n\t\tvar tempo = this.metaText ? this.metaText.tempo : null;\n\t\tvar naturalBpm = this.getBpm(tempo);\n\t\tvar warp = 1;\n\t\tif (bpm) {\n\t\t\tif (tempo)\n\t\t\t\twarp = bpm / naturalBpm;\n\t\t} else\n\t\t\tbpm = naturalBpm;\n\n\t\t// Calculate the basic midi data. We only care about the qpm variable here.\n\t\t//this.setUpAudio({qpm: bpm});\n\n\t\tvar beatLength = this.getBeatLength();\n\t\tvar beatsPerSecond = bpm / 60;\n\n\t\tvar measureLength = this.getBarLength();\n\n\t\tvar startingDelay = measureLength / beatLength * measuresOfDelay / beatsPerSecond;\n\t\tif (startingDelay)\n\t\t\tstartingDelay -= this.getPickupLength() / beatLength / beatsPerSecond;\n\t\tvar timeDivider = beatLength * beatsPerSecond;\n\n\t\tthis.noteTimings = this.setupEvents(startingDelay, timeDivider, bpm, warp);\n\t\tif (this.noteTimings.length > 0) {\n\t\t\tthis.totalTime = this.noteTimings[this.noteTimings.length - 1].milliseconds / 1000;\n\t\t\tthis.totalBeats = this.totalTime * beatsPerSecond;\n\t\t} else {\n\t\t\tthis.totalTime = undefined;\n\t\t\tthis.totalBeats = undefined;\n\t\t}\n\t\treturn this.noteTimings;\n\t};\n\n\tthis.setUpAudio = function(options) {\n\t\tif (!options) options = {};\n\t\tvar seq = sequence(this, options);\n\t\treturn flatten(seq, options, this.formatting.percmap, this.formatting.midi);\n\t};\n\tthis.deline = function(options) {\n\t\treturn delineTune(this.lines, options);\n\t}\n\tthis.findSelectableElement = function(target) {\n\t\tif (this.engraver && this.engraver.selectables)\n\t\t\treturn this.engraver.findSelectableElement(target)\n\t\treturn null\n\t}\n\tthis.getSelectableArray = function() {\n\t\tif (this.engraver && this.engraver.selectables)\n\t\t\treturn this.engraver.selectables\n\t\treturn []\n\t}\n};\n\nmodule.exports = Tune;\n","var parseKeyVoice = require('../parse/abc_parse_key_voice');\n//var parseCommon = require('../parse/abc_common');\n//var parseDirective = require('./abc_parse_directive');\n\nvar TuneBuilder = function (tune) {\n\tvar self = this;\n\tvar voiceDefs = {}\n\tvar currentVoiceName = ''\n\ttune.reset();\n\n\tthis.setVisualTranspose = function (visualTranspose) {\n\t\tif (visualTranspose)\n\t\t\ttune.visualTranspose = visualTranspose;\n\t};\n\n\tthis.cleanUp = function (barsperstaff, staffnonote, currSlur) {\n\t\tcloseLine(tune);\t// Close the last line.\n\t\tdelete tune.runningFonts;\n\n\t\tsimplifyMetaText(tune)\n\t\t//addRichTextToAnnotationsAndLyrics(tune)\n\n\t\t// If the tempo was created with a string like \"Allegro\", then the duration of a beat needs to be set at the last moment, when it is most likely known.\n\t\tif (tune.metaText.tempo && tune.metaText.tempo.bpm && !tune.metaText.tempo.duration)\n\t\t\ttune.metaText.tempo.duration = [tune.getBeatLength()];\n\n\t\t// Remove any blank lines\n\t\tvar anyDeleted = false;\n\t\tvar i, s, v;\n\t\tfor (i = 0; i < tune.lines.length; i++) {\n\t\t\tif (tune.lines[i].staff !== undefined) {\n\t\t\t\tvar hasAny = false;\n\t\t\t\tfor (s = 0; s < tune.lines[i].staff.length; s++) {\n\t\t\t\t\tif (tune.lines[i].staff[s] === undefined) {\n\t\t\t\t\t\tanyDeleted = true;\n\t\t\t\t\t\ttune.lines[i].staff[s] = null;\n\t\t\t\t\t\t//tune.lines[i].staff[s] = { voices: []};\t// TODO-PER: There was a part missing in the abc music. How should we recover?\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfor (v = 0; v < tune.lines[i].staff[s].voices.length; v++) {\n\t\t\t\t\t\t\tif (tune.lines[i].staff[s].voices[v] === undefined)\n\t\t\t\t\t\t\t\ttune.lines[i].staff[s].voices[v] = [];\t// TODO-PER: There was a part missing in the abc music. How should we recover?\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif (containsNotes(tune.lines[i].staff[s].voices[v])) hasAny = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (!hasAny) {\n\t\t\t\t\ttune.lines[i] = null;\n\t\t\t\t\tanyDeleted = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (anyDeleted) {\n\t\t\ttune.lines = tune.lines.filter(function (line) { return !!line });\n\t\t\ttune.lines.forEach(function (line) {\n\t\t\t\tif (line.staff)\n\t\t\t\t\tline.staff = line.staff.filter(function (line) { return !!line });\n\t\t\t});\n\t\t}\n\n\t\t// if we exceeded the number of bars allowed on a line, then force a new line\n\t\tif (barsperstaff) {\n\t\t\twhile (wrapMusicLines(tune.lines, barsperstaff)) {\n\t\t\t\t// This will keep wrapping until the end of the piece.\n\t\t\t}\n\t\t}\n\n\t\t// If we were passed staffnonote, then we want to get rid of all staffs that contain only rests.\n\t\tif (staffnonote) {\n\t\t\tanyDeleted = false;\n\t\t\tfor (i = 0; i < tune.lines.length; i++) {\n\t\t\t\tif (tune.lines[i].staff !== undefined) {\n\t\t\t\t\tfor (s = 0; s < tune.lines[i].staff.length; s++) {\n\t\t\t\t\t\tvar keepThis = false;\n\t\t\t\t\t\tfor (v = 0; v < tune.lines[i].staff[s].voices.length; v++) {\n\t\t\t\t\t\t\tif (containsNotesStrict(tune.lines[i].staff[s].voices[v])) {\n\t\t\t\t\t\t\t\tkeepThis = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!keepThis) {\n\t\t\t\t\t\t\tanyDeleted = true;\n\t\t\t\t\t\t\ttune.lines[i].staff[s] = null;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (anyDeleted) {\n\t\t\t\ttune.lines.forEach(function (line) {\n\t\t\t\t\tif (line.staff)\n\t\t\t\t\t\tline.staff = line.staff.filter(function (staff) { return !!staff });\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tfixTitles(tune.lines);\n\n\t\t// Remove the temporary working variables\n\t\tfor (i = 0; i < tune.lines.length; i++) {\n\t\t\tif (tune.lines[i].staff) {\n\t\t\t\tfor (s = 0; s < tune.lines[i].staff.length; s++)\n\t\t\t\t\tdelete tune.lines[i].staff[s].workingClef;\n\t\t\t}\n\t\t}\n\n\t\t// If there are overlays, create new voices for them.\n\t\twhile (resolveOverlays(tune)) {\n\t\t\t// keep resolving overlays as long as any are found.\n\t\t}\n\n\t\tfor (var i = 0; i < tune.lines.length; i++) {\n\t\t\tvar staff = tune.lines[i].staff;\n\t\t\tif (staff) {\n\t\t\t\tfor (tune.staffNum = 0; tune.staffNum < staff.length; tune.staffNum++) {\n\t\t\t\t\tif (staff[tune.staffNum].clef)\n\t\t\t\t\t\tparseKeyVoice.fixClef(staff[tune.staffNum].clef);\n\t\t\t\t\tfor (tune.voiceNum = 0; tune.voiceNum < staff[tune.staffNum].voices.length; tune.voiceNum++) {\n\t\t\t\t\t\tvar voice = staff[tune.staffNum].voices[tune.voiceNum];\n\t\t\t\t\t\tcleanUpSlursInLine(voice, tune.staffNum, tune.voiceNum, currSlur);\n\t\t\t\t\t\tfor (var j = 0; j < voice.length; j++) {\n\t\t\t\t\t\t\tif (voice[j].el_type === 'clef')\n\t\t\t\t\t\t\t\tparseKeyVoice.fixClef(voice[j]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (voice.length > 0 && voice[voice.length - 1].barNumber) {\n\t\t\t\t\t\t\t// Don't hang a bar number on the last bar line: it should go on the next line.\n\t\t\t\t\t\t\tvar nextLine = getNextMusicLine(tune.lines, i);\n\t\t\t\t\t\t\tif (nextLine)\n\t\t\t\t\t\t\t\tnextLine.staff[0].barNumber = voice[voice.length - 1].barNumber;\n\t\t\t\t\t\t\tdelete voice[voice.length - 1].barNumber;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Remove temporary variables that the outside doesn't need to know about\n\t\tdelete tune.staffNum;\n\t\tdelete tune.voiceNum;\n\t\tdelete tune.lineNum;\n\t\tdelete tune.potentialStartBeam;\n\t\tdelete tune.potentialEndBeam;\n\t\tdelete tune.vskipPending;\n\n\t\treturn currSlur;\n\t};\n\n\tthis.addTieToLastNote = function (dottedTie) {\n\t\t// TODO-PER: if this is a chord, which note?\n\t\tvar el = getLastNote(tune);\n\t\tif (el && el.pitches && el.pitches.length > 0) {\n\t\t\tel.pitches[0].startTie = {};\n\t\t\tif (dottedTie)\n\t\t\t\tel.pitches[0].startTie.style = 'dotted';\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t};\n\n\tthis.appendElement = function (type, startChar, endChar, hashParams) {\n\t\thashParams.el_type = type;\n\t\tif (startChar !== null)\n\t\t\thashParams.startChar = startChar;\n\t\tif (endChar !== null)\n\t\t\thashParams.endChar = endChar;\n\t\tif (type === 'note') { // && (hashParams.rest !== undefined || hashParams.end_beam === undefined)) {\n\t\t\t// Now, add the startBeam and endBeam where it is needed.\n\t\t\t// end_beam is already set on the places where there is a forced end_beam. We'll remove that here after using that info.\n\t\t\t// this.potentialStartBeam either points to null or the start beam.\n\t\t\t// this.potentialEndBeam either points to null or the start beam.\n\t\t\t// If we have a beam break (note is longer than a quarter, or an end_beam is on this element), then set the beam if we have one.\n\t\t\t// reset the variables for the next notes.\n\t\t\tvar dur = getDuration(hashParams);\n\t\t\tif (dur >= 0.25) {\t// The beam ends on the note before this.\n\t\t\t\tendBeamLast(tune);\n\t\t\t} else if (hashParams.force_end_beam_last && tune.potentialStartBeam !== undefined) {\n\t\t\t\tendBeamLast(tune);\n\t\t\t} else if (hashParams.end_beam && tune.potentialStartBeam !== undefined) {\t// the beam is forced to end on this note, probably because of a space in the ABC\n\t\t\t\tif (hashParams.rest === undefined)\n\t\t\t\t\tendBeamHere(hashParams, tune);\n\t\t\t\telse\n\t\t\t\t\tendBeamLast(tune);\n\t\t\t} else if (hashParams.rest === undefined) {\t// this a short note and we aren't about to end the beam\n\t\t\t\tif (tune.potentialStartBeam === undefined) {\t// We aren't collecting notes for a beam, so start here.\n\t\t\t\t\tif (!hashParams.end_beam) {\n\t\t\t\t\t\ttune.potentialStartBeam = hashParams;\n\t\t\t\t\t\tdelete tune.potentialEndBeam;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\ttune.potentialEndBeam = hashParams;\t// Continue the beaming, look for the end next note.\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// end_beam goes on rests and notes which precede rests _except_ when a rest (or set of adjacent rests) has normal notes on both sides (no spaces)\n\t\t\t//\t\t\tif (hashParams.rest !== undefined)\n\t\t\t//\t\t\t{\n\t\t\t//\t\t\t\thashParams.end_beam = true;\n\t\t\t//\t\t\t\tvar el2 = getLastNote(tune);\n\t\t\t//\t\t\t\tif (el2) el2.end_beam = true;\n\t\t\t//\t\t\t\t// TODO-PER: implement exception mentioned in the comment.\n\t\t\t//\t\t\t}\n\t\t} else {\t// It's not a note, so there definitely isn't beaming after it.\n\t\t\tendBeamLast(tune);\n\t\t}\n\t\tdelete hashParams.end_beam;\t// We don't want this temporary variable hanging around.\n\t\tdelete hashParams.force_end_beam_last;\t// We don't want this temporary variable hanging around.\n\t\tif (hashParams.rest && hashParams.rest.type === 'invisible') {\n\t\t\tdelete hashParams.decoration // the decorations on invisible rests should be invisible, too.\n\t\t}\n\t\tif (tune.lines.length <= tune.lineNum || tune.lines[tune.lineNum].staff.length <= tune.staffNum) {\n\t\t\t//console.log(\"pushNote IGNORED\", tune.lines[tune.lineNum])\n\t\t\t// TODO-PER: This prevents a crash, but it drops the element. Need to figure out how to start a new line, or delay adding this.\n\t\t\treturn false;\n\t\t}\n\n\t\tpushNote(self, tune, hashParams, voiceDefs, currentVoiceName);\n\t\treturn true\n\t};\n\n\tthis.appendStartingElement = function (type, startChar, endChar, hashParams2) {\n\t\t//console.log('appendStartingElement', hashParams2)\n\t\t// If we're in the middle of beaming, then end the beam.\n\t\tcloseLine(tune);\n\n\t\t// We only ever want implied naturals the first time.\n\t\tvar impliedNaturals;\n\t\tif (type === 'key') {\n\t\t\timpliedNaturals = hashParams2.impliedNaturals;\n\t\t\tdelete hashParams2.impliedNaturals;\n\t\t\tdelete hashParams2.explicitAccidentals;\n\t\t}\n\n\t\t// Clone the object because it will be sticking around for the next line and we don't want the extra fields in it.\n\t\tvar hashParams = Object.assign({}, hashParams2);\n\n\t\t// be sure that we are on a music type line before doing the following.\n\t\tif (!tune.lines[tune.lineNum]) return\n\t\tvar staff = tune.lines[tune.lineNum].staff\n\t\tif (!staff) return\n\n\t\t// If tune is the first item in tune staff, then we might have to initialize the staff, first.\n\t\tif (staff.length <= tune.staffNum) {\n\t\t\tstaff[tune.staffNum] = {};\n\t\t\tstaff[tune.staffNum].clef = Object.assign({}, staff[0].clef);\n\t\t\tstaff[tune.staffNum].key = Object.assign({}, staff[0].key);\n\t\t\tif (staff[0].meter)\n\t\t\t\tstaff[tune.staffNum].meter = Object.assign({}, staff[0].meter);\n\t\t\tstaff[tune.staffNum].workingClef = Object.assign({}, staff[0].workingClef);\n\t\t\tstaff[tune.staffNum].voices = [[]];\n\t\t}\n\t\t// If tune is a clef type, then we replace the working clef on the line. This is kept separate from\n\t\t// the clef in case there is an inline clef field. We need to know what the current position for\n\t\t// the note is.\n\t\tif (type === 'clef') {\n\t\t\tstaff[tune.staffNum].workingClef = hashParams;\n\t\t}\n\n\t\t// These elements should not be added twice, so if the element exists on tune line without a note or bar before it, just replace the staff version.\n\t\tvar voice = staff[tune.staffNum].voices[tune.voiceNum];\n\t\tfor (var i = 0; i < voice.length; i++) {\n\t\t\tif (voice[i].el_type === 'note' || voice[i].el_type === 'bar') {\n\t\t\t\thashParams.el_type = type;\n\t\t\t\thashParams.startChar = startChar;\n\t\t\t\thashParams.endChar = endChar;\n\t\t\t\tif (impliedNaturals)\n\t\t\t\t\thashParams.accidentals = impliedNaturals.concat(hashParams.accidentals);\n\t\t\t\tvoice.push(hashParams);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (voice[i].el_type === type) {\n\t\t\t\thashParams.el_type = type;\n\t\t\t\thashParams.startChar = startChar;\n\t\t\t\thashParams.endChar = endChar;\n\t\t\t\tif (impliedNaturals)\n\t\t\t\t\thashParams.accidentals = impliedNaturals.concat(hashParams.accidentals);\n\t\t\t\tvoice[i] = hashParams;\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t// We didn't see either that type or a note, so replace the element to the staff.\n\t\tstaff[tune.staffNum][type] = hashParams2;\n\t};\n\n\tthis.addSubtitle = function (str, info) {\n\t\tpushLine(tune, { subtitle: { text: str, startChar: info.startChar, endChar: info.endChar } });\n\t};\n\n\tthis.addSpacing = function (num) {\n\t\ttune.vskipPending = num;\n\t};\n\n\tthis.addNewPage = function (num) {\n\t\tpushLine(tune, { newpage: num });\n\t};\n\n\tthis.addSeparator = function (spaceAbove, spaceBelow, lineLength, info) {\n\t\tpushLine(tune, { separator: { spaceAbove: Math.round(spaceAbove), spaceBelow: Math.round(spaceBelow), lineLength: Math.round(lineLength), startChar: info.startChar, endChar: info.endChar } });\n\t};\n\n\tthis.addText = function (str, info) {\n\t\tpushLine(tune, { text: { text: str, startChar: info.startChar, endChar: info.endChar } });\n\t};\n\n\tthis.addCentered = function (str) {\n\t\tpushLine(tune, { text: [{ text: str, center: true }] });\n\t};\n\n\t//\tanyVoiceContainsNotes: function(line) {\n\t//\t\tfor (var i = 0; i < line.staff.voices.length; i++) {\n\t//\t\t\tif (containsNotes(line.staff.voices[i]))\n\t//\t\t\t\treturn true;\n\t//\t\t}\n\t//\t\treturn false;\n\t//\t},\n\tthis.changeVoiceScale = function (scale) {\n\t\tself.appendElement('scale', null, null, { size: scale });\n\t};\n\tthis.changeVoiceColor = function (color) {\n\t\tself.appendElement('color', null, null, { color: color });\n\t};\n\n\tthis.startNewLine = function (params) {\n\t\t//console.log(\"startNewLine\", tune.lineNum, params, voiceDefs)\n\t\t// If the pointed to line doesn't exist, just create that. If the line does exist, but doesn't have any music on it, just use it.\n\t\t// If it does exist and has music, then increment the line number. If the new element doesn't exist, create it.\n\t\tcloseLine(tune);\t// Close the previous line.\n\t\tif (params.currentVoiceName) {\n\t\t\tcurrentVoiceName = params.currentVoiceName\n\t\t\tvoiceDefs[params.currentVoiceName] = params\n\t\t}\n\n\t\tif (tune.lines[tune.lineNum] === undefined) createLine(self, tune, params);\n\t\telse if (tune.lines[tune.lineNum].staff === undefined) {\n\t\t\ttune.lineNum++;\n\t\t\tthis.startNewLine(params);\n\t\t} else if (tune.lines[tune.lineNum].staff[tune.staffNum] === undefined) createStaff(self, tune, params);\n\t\telse if (tune.lines[tune.lineNum].staff[tune.staffNum].voices[tune.voiceNum] === undefined) createVoice(self, tune, params);\n\t\telse if (!containsNotes(tune.lines[tune.lineNum].staff[tune.staffNum].voices[tune.voiceNum])) {\n\t\t\t// We don't need a new line but we might need to update parts of it.\n\t\t\tif (params.part)\n\t\t\t\tself.appendElement('part', params.part.startChar, params.part.endChar, { title: params.part.title });\n\t\t} else {\n\t\t\ttune.lineNum++;\n\t\t\tthis.startNewLine(params);\n\t\t}\n\t};\n\n\tthis.setRunningFont = function (type, font) {\n\t\t// This is called at tune start to set the current default fonts so we know whether to record a change.\n\t\ttune.runningFonts[type] = font;\n\t};\n\n\tthis.setBarNumberImmediate = function (barNumber) {\n\t\t// If tune is called right at the beginning of a line, then correct the measure number that is already written.\n\t\t// If tune is called at the beginning of a measure, then correct the measure number that was just created.\n\t\t// If tune is called in the middle of a measure, then subtract one from it, because it will be incremented before applied.\n\t\tvar currentVoice = this.getCurrentVoice();\n\t\tif (currentVoice && currentVoice.length > 0) {\n\t\t\tvar lastElement = currentVoice[currentVoice.length - 1];\n\t\t\tif (lastElement.el_type === 'bar') {\n\t\t\t\tif (lastElement.barNumber !== undefined) // the measure number might not be written for tune bar, don't override that.\n\t\t\t\t\tlastElement.barNumber = barNumber;\n\t\t\t} else\n\t\t\t\treturn barNumber - 1;\n\t\t}\n\t\treturn barNumber;\n\t};\n\n\tthis.hasBeginMusic = function () {\n\t\t// return true if there exists at least one line that contains \"staff\"\n\t\tfor (var i = 0; i < tune.lines.length; i++) {\n\t\t\tif (tune.lines[i].staff)\n\t\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t};\n\n\tthis.isFirstLine = function (index) {\n\t\tfor (var i = index - 1; i >= 0; i--) {\n\t\t\tif (tune.lines[i].staff !== undefined) return false;\n\t\t}\n\t\treturn true;\n\t};\n\n\tthis.getCurrentVoice = function () {\n\t\t//console.log(\"getCurrentVoice\", tune.lineNum)\n\t\tvar currLine = getPrevMusicLine(tune.lines, tune.lineNum)\n\t\tif (!currLine)\n\t\t\treturn null;\n\t\tvar currStaff = currLine.staff[tune.staffNum];\n\t\tif (!currStaff)\n\t\t\treturn null;\n\t\tif (currStaff.voices[tune.voiceNum] !== undefined)\n\t\t\treturn currStaff.voices[tune.voiceNum];\n\t\telse return null;\n\t};\n\n\tthis.setCurrentVoice = function (staffNum, voiceNum, name) {\n\t\t//console.log(\"setCurrentVoice\", tune.lineNum, staffNum, voiceNum, name, voiceDefs)\n\t\ttune.staffNum = staffNum;\n\t\ttune.voiceNum = voiceNum;\n\t\tcurrentVoiceName = name\n\t\tfor (var i = 0; i < tune.lines.length; i++) {\n\t\t\tif (tune.lines[i].staff) {\n\t\t\t\tif (tune.lines[i].staff[staffNum] === undefined || tune.lines[i].staff[staffNum].voices[voiceNum] === undefined ||\n\t\t\t\t\t!containsNotes(tune.lines[i].staff[staffNum].voices[voiceNum])) {\n\t\t\t\t\t//console.log(\"cv2\", i, tune.lines[i].staff[staffNum])\n\t\t\t\t\ttune.lineNum = i;\n\t\t\t\t\tif (!tune.lines[i].staff[staffNum] || !!tune.lines[i].staff[staffNum].voices[voiceNum]) return true\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t//console.log(\"cv3\", i, tune.lineNum, tune.lines[tune.lineNum])\n\t\ttune.lineNum = i;\n\t\treturn false\n\t};\n\n\tthis.addMetaText = function (key, value, info) {\n\t\tif (tune.metaText[key] === undefined) {\n\t\t\ttune.metaText[key] = value;\n\t\t\ttune.metaTextInfo[key] = info;\n\t\t} else {\n\t\t\tif (typeof tune.metaText[key] === 'string' && typeof value === 'string')\n\t\t\t\ttune.metaText[key] += \"\\n\" + value;\n\t\t\telse {\n\t\t\t\tif (tune.metaText[key] === 'string')\n\t\t\t\t\ttune.metaText[key] = [{ text: tune.metaText[key] }]\n\t\t\t\tif (typeof value === 'string')\n\t\t\t\t\tvalue = [{ text: value }]\n\t\t\t\ttune.metaText[key] = tune.metaText[key].concat(value)\n\t\t\t}\n\t\t\ttune.metaTextInfo[key].endChar = info.endChar;\n\t\t}\n\t};\n\n\tthis.addMetaTextArray = function (key, value, info) {\n\t\tif (tune.metaText[key] === undefined) {\n\t\t\ttune.metaText[key] = [value];\n\t\t\ttune.metaTextInfo[key] = info;\n\t\t} else {\n\t\t\ttune.metaText[key].push(value);\n\t\t\ttune.metaTextInfo[key].endChar = info.endChar;\n\t\t}\n\t};\n\tthis.addMetaTextObj = function (key, value, info) {\n\t\ttune.metaText[key] = value;\n\t\ttune.metaTextInfo[key] = info;\n\t};\n};\n\nfunction isArrayOfStrings(arr) {\n\tif (!arr) return false\n\tif (typeof arr === \"string\") return false\n\t//var str = ''\n\tfor (var i = 0; i < arr.length; i++) {\n\t\tif (typeof arr[i] !== 'string')\n\t\t\treturn false\n\t}\n\treturn true\n}\n\nfunction simplifyMetaText(tune) {\n\tif (isArrayOfStrings(tune.metaText.notes))\n\t\ttune.metaText.notes = tune.metaText.notes.join(\"\\n\")\n\tif (isArrayOfStrings(tune.metaText.history))\n\t\ttune.metaText.history = tune.metaText.history.join(\"\\n\")\n}\n\n// function addRichTextToAnnotationsAndLyrics(tune) {\n// \tvar lines = tune.lines\n// \tfor (var i = 0; i < lines.length; i++) {\n// \t\tif (lines[i].staff !== undefined) {\n// \t\t\tfor (var s = 0; s < lines[i].staff.length; s++) {\n// \t\t\t\tfor (var v = 0; v < lines[i].staff[s].voices.length; v++) {\n// \t\t\t\t\tvar voice = lines[i].staff[s].voices[v];\n// \t\t\t\t\tfor (var n = 0; n < voice.length; n++) {\n// \t\t\t\t\t\tvar element = voice[n]\n// \t\t\t\t\t\tif (element.chord) {\n// \t\t\t\t\t\t\tfor (var c = 0; c < element.chord.length; c++) {\n// \t\t\t\t\t\t\t\telement.chord[c].name = parseDirective.parseFontChangeLine(element.chord[c].name)\n// \t\t\t\t\t\t\t\tconsole.log(element.chord[c].name)\n// \t\t\t\t\t\t\t}\n// \t\t\t\t\t\t}\n// \t\t\t\t\t\tif (element.lyric) {\n// \t\t\t\t\t\t\tfor (var l = 0; l < element.lyric.length; l++) {\n// \t\t\t\t\t\t\t\telement.lyric[l].syllable = parseDirective.parseFontChangeLine(element.lyric[l].syllable)\n// \t\t\t\t\t\t\t\tconsole.log(element.lyric[l].syllable)\n// \t\t\t\t\t\t\t}\n// \t\t\t\t\t\t}\n// \t\t\t\t\t}\n// \t\t\t\t}\n// \t\t\t}\n// \t\t}\n// \t}\n\n// }\n\nfunction resolveOverlays(tune) {\n\tvar madeChanges = false;\n\tvar durationsPerLines = [];\n\tfor (var i = 0; i < tune.lines.length; i++) {\n\t\tvar line = tune.lines[i];\n\t\tif (line.staff) {\n\t\t\tfor (var j = 0; j < line.staff.length; j++) {\n\t\t\t\tvar staff = line.staff[j];\n\t\t\t\tvar overlayVoice = [];\n\t\t\t\tfor (var k = 0; k < staff.voices.length; k++) {\n\t\t\t\t\tvar voice = staff.voices[k];\n\t\t\t\t\toverlayVoice.push({ hasOverlay: false, voice: [], snip: [] });\n\t\t\t\t\tdurationsPerLines[i] = 0;\n\t\t\t\t\tvar durationThisBar = 0;\n\t\t\t\t\tvar inOverlay = false;\n\t\t\t\t\tvar overlayDuration = 0;\n\t\t\t\t\tvar snipStart = -1;\n\t\t\t\t\tfor (var kk = 0; kk < voice.length; kk++) {\n\t\t\t\t\t\tvar event = voice[kk];\n\t\t\t\t\t\tif (event.el_type === \"overlay\" && !inOverlay) {\n\t\t\t\t\t\t\tmadeChanges = true;\n\t\t\t\t\t\t\tinOverlay = true;\n\t\t\t\t\t\t\tsnipStart = kk;\n\t\t\t\t\t\t\toverlayVoice[k].hasOverlay = true;\n\t\t\t\t\t\t\tif (overlayDuration === 0)\n\t\t\t\t\t\t\t\toverlayDuration = durationsPerLines[i];\n\t\t\t\t\t\t\t// If this isn't the first line, we also need invisible rests on the previous lines.\n\t\t\t\t\t\t\t// So, if the next voice doesn't appear in a previous line, create it\n\t\t\t\t\t\t\tfor (var ii = 0; ii < i; ii++) {\n\t\t\t\t\t\t\t\tif (durationsPerLines[ii] && tune.lines[ii].staff && staff.voices.length >= tune.lines[ii].staff[0].voices.length) {\n\t\t\t\t\t\t\t\t\ttune.lines[ii].staff[0].voices.push([{\n\t\t\t\t\t\t\t\t\t\tel_type: \"note\",\n\t\t\t\t\t\t\t\t\t\tduration: durationsPerLines[ii],\n\t\t\t\t\t\t\t\t\t\trest: { type: \"invisible\" },\n\t\t\t\t\t\t\t\t\t\tstartChar: event.startChar,\n\t\t\t\t\t\t\t\t\t\tendChar: event.endChar\n\t\t\t\t\t\t\t\t\t}]);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (event.el_type === \"bar\") {\n\t\t\t\t\t\t\tif (inOverlay) {\n\t\t\t\t\t\t\t\t// delete the overlay events from this array without messing up this loop.\n\t\t\t\t\t\t\t\tinOverlay = false;\n\t\t\t\t\t\t\t\toverlayVoice[k].snip.push({ start: snipStart, len: kk - snipStart });\n\t\t\t\t\t\t\t\toverlayVoice[k].voice.push(event); // Also end the overlay with the barline.\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// This keeps the voices lined up: if the overlay isn't in the first measure then we need a bunch of invisible rests.\n\t\t\t\t\t\t\t\tif (durationThisBar > 0)\n\t\t\t\t\t\t\t\t\toverlayVoice[k].voice.push({ el_type: \"note\", duration: durationThisBar, rest: { type: \"invisible\" }, startChar: event.startChar, endChar: event.endChar });\n\t\t\t\t\t\t\t\toverlayVoice[k].voice.push(event);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tdurationThisBar = 0;\n\t\t\t\t\t\t} else if (event.el_type === \"note\") {\n\t\t\t\t\t\t\tif (inOverlay) {\n\t\t\t\t\t\t\t\toverlayVoice[k].voice.push(event);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tdurationThisBar += event.duration;\n\t\t\t\t\t\t\t\tdurationsPerLines[i] += event.duration;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (event.el_type === \"scale\" || event.el_type === \"stem\" || event.el_type === \"overlay\" || event.el_type === \"style\" || event.el_type === \"transpose\" || event.el_type === \"color\") {\n\t\t\t\t\t\t\t// These types of events are duplicated on the overlay layer.\n\t\t\t\t\t\t\toverlayVoice[k].voice.push(event);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (overlayVoice[k].hasOverlay && overlayVoice[k].snip.length === 0) {\n\t\t\t\t\t\t// there was no closing bar, so we didn't set the snip amount.\n\t\t\t\t\t\toverlayVoice[k].snip.push({ start: snipStart, len: voice.length - snipStart });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor (k = 0; k < overlayVoice.length; k++) {\n\t\t\t\t\tvar ov = overlayVoice[k];\n\t\t\t\t\tif (ov.hasOverlay) {\n\t\t\t\t\t\tov.voice.splice(0, 0, { el_type: \"stem\", direction: \"down\" })\n\t\t\t\t\t\tstaff.voices.push(ov.voice);\n\t\t\t\t\t\tfor (var kkk = ov.snip.length - 1; kkk >= 0; kkk--) {\n\t\t\t\t\t\t\tvar snip = ov.snip[kkk];\n\t\t\t\t\t\t\tstaff.voices[k].splice(snip.start, snip.len);\n\t\t\t\t\t\t\tstaff.voices[k].splice(snip.start + 1, 0, { el_type: \"stem\", direction: \"auto\" });\n\t\t\t\t\t\t\tvar indexOfLastBar = findLastBar(staff.voices[k], snip.start);\n\t\t\t\t\t\t\tstaff.voices[k].splice(indexOfLastBar, 0, { el_type: \"stem\", direction: \"up\" });\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// remove ending marks from the overlay voice so they are not repeated\n\t\t\t\t\t\tfor (kkk = 0; kkk < staff.voices[staff.voices.length - 1].length; kkk++) {\n\t\t\t\t\t\t\tstaff.voices[staff.voices.length - 1][kkk] = Object.assign({}, staff.voices[staff.voices.length - 1][kkk]);\n\t\t\t\t\t\t\tvar el = staff.voices[staff.voices.length - 1][kkk];\n\t\t\t\t\t\t\tif (el.el_type === 'bar' && el.startEnding) {\n\t\t\t\t\t\t\t\tdelete el.startEnding;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (el.el_type === 'bar' && el.endEnding)\n\t\t\t\t\t\t\t\tdelete el.endEnding;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn madeChanges;\n};\n\nfunction findLastBar(voice, start) {\n\tfor (var i = start - 1; i > 0 && voice[i].el_type !== \"bar\"; i--) {\n\n\t}\n\treturn i;\n}\n\nfunction fixTitles(lines) {\n\t// We might have name and subname defined. We now know what line everything is on, so we can determine which to use.\n\tvar firstMusicLine = true;\n\tfor (var i = 0; i < lines.length; i++) {\n\t\tvar line = lines[i];\n\t\tif (line.staff) {\n\t\t\tfor (var j = 0; j < line.staff.length; j++) {\n\t\t\t\tvar staff = line.staff[j];\n\t\t\t\tif (staff.title) {\n\t\t\t\t\tvar hasATitle = false;\n\t\t\t\t\tfor (var k = 0; k < staff.title.length; k++) {\n\t\t\t\t\t\tif (staff.title[k]) {\n\t\t\t\t\t\t\tstaff.title[k] = (firstMusicLine) ? staff.title[k].name : staff.title[k].subname;\n\t\t\t\t\t\t\tif (staff.title[k])\n\t\t\t\t\t\t\t\thasATitle = true;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tstaff.title[k] = '';\n\t\t\t\t\t\t} else\n\t\t\t\t\t\t\tstaff.title[k] = '';\n\t\t\t\t\t}\n\t\t\t\t\tif (!hasATitle)\n\t\t\t\t\t\tdelete staff.title;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfirstMusicLine = false;\n\t\t}\n\t}\n}\n\nfunction cleanUpSlursInLine(line, staffNum, voiceNum, currSlur) {\n\tif (!currSlur[staffNum])\n\t\tcurrSlur[staffNum] = [];\n\tif (!currSlur[staffNum][voiceNum])\n\t\tcurrSlur[staffNum][voiceNum] = [];\n\tvar x;\n\t//\t\t\tvar lyr = null;\t// TODO-PER: debugging.\n\n\tvar addEndSlur = function (obj, num, chordPos) {\n\t\tif (currSlur[staffNum][voiceNum][chordPos] === undefined) {\n\t\t\t// There isn't an exact match for note position, but we'll take any other open slur.\n\t\t\tfor (x = 0; x < currSlur[staffNum][voiceNum].length; x++) {\n\t\t\t\tif (currSlur[staffNum][voiceNum][x] !== undefined) {\n\t\t\t\t\tchordPos = x;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (currSlur[staffNum][voiceNum][chordPos] === undefined) {\n\t\t\t\tvar offNum = chordPos * 100 + 1;\n\t\t\t\tobj.endSlur.forEach(function (x) { if (offNum === x) --offNum; });\n\t\t\t\tcurrSlur[staffNum][voiceNum][chordPos] = [offNum];\n\t\t\t}\n\t\t}\n\t\tvar slurNum;\n\t\tfor (var i = 0; i < num; i++) {\n\t\t\tslurNum = currSlur[staffNum][voiceNum][chordPos].pop();\n\t\t\tobj.endSlur.push(slurNum);\n\t\t\t//\t\t\t\t\tlyr.syllable += '<' + slurNum;\t// TODO-PER: debugging\n\t\t}\n\t\tif (currSlur[staffNum][voiceNum][chordPos].length === 0)\n\t\t\tdelete currSlur[staffNum][voiceNum][chordPos];\n\t\treturn slurNum;\n\t};\n\n\tvar addStartSlur = function (obj, num, chordPos, usedNums) {\n\t\tobj.startSlur = [];\n\t\tif (currSlur[staffNum][voiceNum][chordPos] === undefined) {\n\t\t\tcurrSlur[staffNum][voiceNum][chordPos] = [];\n\t\t}\n\t\tvar nextNum = chordPos * 100 + 1;\n\t\tfor (var i = 0; i < num; i++) {\n\t\t\tif (usedNums) {\n\t\t\t\tusedNums.forEach(function (x) { if (nextNum === x) ++nextNum; });\n\t\t\t\tusedNums.forEach(function (x) { if (nextNum === x) ++nextNum; });\n\t\t\t\tusedNums.forEach(function (x) { if (nextNum === x) ++nextNum; });\n\t\t\t}\n\t\t\tcurrSlur[staffNum][voiceNum][chordPos].forEach(function (x) { if (nextNum === x) ++nextNum; });\n\t\t\tcurrSlur[staffNum][voiceNum][chordPos].forEach(function (x) { if (nextNum === x) ++nextNum; });\n\n\t\t\tcurrSlur[staffNum][voiceNum][chordPos].push(nextNum);\n\t\t\tobj.startSlur.push({ label: nextNum });\n\t\t\tif (obj.dottedSlur) {\n\t\t\t\tobj.startSlur[obj.startSlur.length - 1].style = 'dotted';\n\t\t\t\tdelete obj.dottedSlur;\n\t\t\t}\n\t\t\t//\t\t\t\t\tlyr.syllable += ' ' + nextNum + '>';\t// TODO-PER:debugging\n\t\t\tnextNum++;\n\t\t}\n\t};\n\n\tfor (var i = 0; i < line.length; i++) {\n\t\tvar el = line[i];\n\t\t//\t\t\t\tif (el.lyric === undefined)\t// TODO-PER: debugging\n\t\t//\t\t\t\t\tel.lyric = [{ divider: '-' }];\t// TODO-PER: debugging\n\t\t//\t\t\t\tlyr = el.lyric[0];\t// TODO-PER: debugging\n\t\t//\t\t\t\tlyr.syllable = '';\t// TODO-PER: debugging\n\t\tif (el.el_type === 'note') {\n\t\t\tif (el.gracenotes) {\n\t\t\t\tfor (var g = 0; g < el.gracenotes.length; g++) {\n\t\t\t\t\tif (el.gracenotes[g].endSlur) {\n\t\t\t\t\t\tvar gg = el.gracenotes[g].endSlur;\n\t\t\t\t\t\tel.gracenotes[g].endSlur = [];\n\t\t\t\t\t\tfor (var ggg = 0; ggg < gg; ggg++)\n\t\t\t\t\t\t\taddEndSlur(el.gracenotes[g], 1, 20);\n\t\t\t\t\t}\n\t\t\t\t\tif (el.gracenotes[g].startSlur) {\n\t\t\t\t\t\tx = el.gracenotes[g].startSlur;\n\t\t\t\t\t\taddStartSlur(el.gracenotes[g], x, 20);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (el.endSlur) {\n\t\t\t\tx = el.endSlur;\n\t\t\t\tel.endSlur = [];\n\t\t\t\taddEndSlur(el, x, 0);\n\t\t\t}\n\t\t\tif (el.startSlur) {\n\t\t\t\tx = el.startSlur;\n\t\t\t\taddStartSlur(el, x, 0);\n\t\t\t}\n\t\t\tif (el.pitches) {\n\t\t\t\tvar usedNums = [];\n\t\t\t\tfor (var p = 0; p < el.pitches.length; p++) {\n\t\t\t\t\tif (el.pitches[p].endSlur) {\n\t\t\t\t\t\tvar k = el.pitches[p].endSlur;\n\t\t\t\t\t\tel.pitches[p].endSlur = [];\n\t\t\t\t\t\tfor (var j = 0; j < k; j++) {\n\t\t\t\t\t\t\tvar slurNum = addEndSlur(el.pitches[p], 1, p + 1);\n\t\t\t\t\t\t\tusedNums.push(slurNum);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor (p = 0; p < el.pitches.length; p++) {\n\t\t\t\t\tif (el.pitches[p].startSlur) {\n\t\t\t\t\t\tx = el.pitches[p].startSlur;\n\t\t\t\t\t\taddStartSlur(el.pitches[p], x, p + 1, usedNums);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Correct for the weird gracenote case where ({g}a) should match.\n\t\t\t\t// The end slur was already assigned to the note, and needs to be moved to the first note of the graces.\n\t\t\t\tif (el.gracenotes && el.pitches[0].endSlur && el.pitches[0].endSlur[0] === 100 && el.pitches[0].startSlur) {\n\t\t\t\t\tif (el.gracenotes[0].endSlur)\n\t\t\t\t\t\tel.gracenotes[0].endSlur.push(el.pitches[0].startSlur[0].label);\n\t\t\t\t\telse\n\t\t\t\t\t\tel.gracenotes[0].endSlur = [el.pitches[0].startSlur[0].label];\n\t\t\t\t\tif (el.pitches[0].endSlur.length === 1)\n\t\t\t\t\t\tdelete el.pitches[0].endSlur;\n\t\t\t\t\telse if (el.pitches[0].endSlur[0] === 100)\n\t\t\t\t\t\tel.pitches[0].endSlur.shift();\n\t\t\t\t\telse if (el.pitches[0].endSlur[el.pitches[0].endSlur.length - 1] === 100)\n\t\t\t\t\t\tel.pitches[0].endSlur.pop();\n\t\t\t\t\tif (currSlur[staffNum][voiceNum][1].length === 1)\n\t\t\t\t\t\tdelete currSlur[staffNum][voiceNum][1];\n\t\t\t\t\telse\n\t\t\t\t\t\tcurrSlur[staffNum][voiceNum][1].pop();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction wrapMusicLines(lines, barsperstaff) {\n\tfor (i = 0; i < lines.length; i++) {\n\t\tif (lines[i].staff !== undefined) {\n\t\t\tfor (s = 0; s < lines[i].staff.length; s++) {\n\t\t\t\tvar permanentItems = [];\n\t\t\t\tfor (v = 0; v < lines[i].staff[s].voices.length; v++) {\n\t\t\t\t\tvar voice = lines[i].staff[s].voices[v];\n\t\t\t\t\tvar barNumThisLine = 0;\n\t\t\t\t\tfor (var n = 0; n < voice.length; n++) {\n\t\t\t\t\t\tif (voice[n].el_type === 'bar') {\n\t\t\t\t\t\t\tbarNumThisLine++;\n\t\t\t\t\t\t\tif (barNumThisLine >= barsperstaff) {\n\t\t\t\t\t\t\t\t// push everything else to the next line, if there is anything else,\n\t\t\t\t\t\t\t\t// and there is a next line. If there isn't a next line, create one.\n\t\t\t\t\t\t\t\tif (n < voice.length - 1) {\n\t\t\t\t\t\t\t\t\tvar nextLine = getNextMusicLine(lines, i);\n\t\t\t\t\t\t\t\t\tif (!nextLine) {\n\t\t\t\t\t\t\t\t\t\tvar cp = JSON.parse(JSON.stringify(lines[i]));\n\t\t\t\t\t\t\t\t\t\tlines.push(Object.assign({}, cp));\n\t\t\t\t\t\t\t\t\t\tnextLine = lines[lines.length - 1];\n\t\t\t\t\t\t\t\t\t\tfor (var ss = 0; ss < nextLine.staff.length; ss++) {\n\t\t\t\t\t\t\t\t\t\t\tfor (var vv = 0; vv < nextLine.staff[ss].voices.length; vv++)\n\t\t\t\t\t\t\t\t\t\t\t\tnextLine.staff[ss].voices[vv] = [];\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tvar startElement = n + 1;\n\t\t\t\t\t\t\t\t\tvar section = lines[i].staff[s].voices[v].slice(startElement);\n\t\t\t\t\t\t\t\t\tlines[i].staff[s].voices[v] = lines[i].staff[s].voices[v].slice(0, startElement);\n\t\t\t\t\t\t\t\t\tnextLine.staff[s].voices[v] = permanentItems.concat(section.concat(nextLine.staff[s].voices[v]));\n\t\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (!voice[n].duration) {\n\t\t\t\t\t\t\tpermanentItems.push(voice[n]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n}\n\nfunction getPrevMusicLine(lines, currentLine) {\n\t// If the current line doesn't have music, search backwards until one is found.\n\twhile (currentLine >= 0) {\n\t\tif (lines[currentLine].staff)\n\t\t\treturn lines[currentLine];\n\t\tcurrentLine--;\n\t}\n\treturn null;\n}\n\nfunction getNextMusicLine(lines, currentLine) {\n\tcurrentLine++;\n\twhile (lines.length > currentLine) {\n\t\tif (lines[currentLine].staff)\n\t\t\treturn lines[currentLine];\n\t\tcurrentLine++;\n\t}\n\treturn null;\n}\n\nfunction getLastNote(tune) {\n\tif (!tune.lines[tune.lineNum]) return null\n\tif (!tune.lines[tune.lineNum].staff) return null\n\tif (!tune.lines[tune.lineNum].staff[tune.staffNum]) return null\n\tvar voice = tune.lines[tune.lineNum].staff[tune.staffNum].voices[tune.voiceNum]\n\tif (!voice) return null\n\tfor (var i = voice.length - 1; i >= 0; i--) {\n\t\tvar el = voice[i];\n\t\tif (el.el_type === 'note') {\n\t\t\treturn el;\n\t\t}\n\t}\n\treturn null;\n};\n\nfunction getDuration(el) {\n\tif (el.duration) return el.duration;\n\treturn 0;\n};\n\nfunction closeLine(tune) {\n\tif (tune.potentialStartBeam && tune.potentialEndBeam) {\n\t\ttune.potentialStartBeam.startBeam = true;\n\t\ttune.potentialEndBeam.endBeam = true;\n\t}\n\tdelete tune.potentialStartBeam;\n\tdelete tune.potentialEndBeam;\n};\n\nfunction containsNotes(voice) {\n\tfor (var i = 0; i < voice.length; i++) {\n\t\tif (voice[i].el_type === 'note' || voice[i].el_type === 'bar')\n\t\t\treturn true;\n\t}\n\treturn false;\n};\n\nfunction containsNotesStrict(voice) {\n\tfor (var i = 0; i < voice.length; i++) {\n\t\tif (voice[i].el_type === 'note' && (voice[i].rest === undefined || voice[i].chord !== undefined))\n\t\t\treturn true;\n\t}\n\treturn false;\n};\n\nfunction pushLine(tune, hash) {\n\tif (tune.vskipPending) {\n\t\thash.vskip = tune.vskipPending;\n\t\tdelete tune.vskipPending;\n\t}\n\ttune.lines.push(hash);\n};\n\nfunction pushNote(self, tune, hp, voiceDefs, currentVoiceName) {\n\t//console.log(\"pushNote\", tune.lineNum, tune.staffNum, hp.pitches ? JSON.stringify(hp.pitches) : hp.pitches)\n\tvar currStaff = tune.lines[tune.lineNum].staff[tune.staffNum];\n\n\tif (hp.pitches !== undefined) {\n\t\tvar mid = currStaff.workingClef.verticalPos;\n\t\thp.pitches.forEach(function (p) { p.verticalPos = p.pitch - mid; });\n\t}\n\tif (hp.gracenotes !== undefined) {\n\t\tvar mid2 = currStaff.workingClef.verticalPos;\n\t\thp.gracenotes.forEach(function (p) { p.verticalPos = p.pitch - mid2; });\n\t}\n\tif (currStaff.voices.length <= tune.voiceNum) {\n\t\t//console.log(\"should create?\", currentVoiceName, voiceDefs)\n\t\tif (!voiceDefs[currentVoiceName])\n\t\t\tvoiceDefs[currentVoiceName] = {}\n\t\tcreateVoice(self, tune, voiceDefs[currentVoiceName])\n\t}\n\tcurrStaff.voices[tune.voiceNum].push(hp);\n}\n\nfunction endBeamHere(hashParams, tune) {\n\ttune.potentialStartBeam.startBeam = true;\n\thashParams.endBeam = true;\n\tdelete tune.potentialStartBeam;\n\tdelete tune.potentialEndBeam;\n}\nfunction endBeamLast(tune) {\n\tif (tune.potentialStartBeam !== undefined && tune.potentialEndBeam !== undefined) {\t// Do we have a set of notes to beam?\n\t\ttune.potentialStartBeam.startBeam = true;\n\t\ttune.potentialEndBeam.endBeam = true;\n\t}\n\tdelete tune.potentialStartBeam;\n\tdelete tune.potentialEndBeam;\n}\n\nfunction setLineFont(tune, type, font) {\n\t// If we haven't encountered the font type yet then we are using the default font so it doesn't\n\t// need to be noted. If we have encountered it, then only record it if it is different from the last time.\n\tif (tune.runningFonts[type]) {\n\t\tvar isDifferent = false;\n\t\tvar keys = Object.keys(font);\n\t\tfor (var i = 0; i < keys.length; i++) {\n\t\t\tif (tune.runningFonts[type][keys[i]] !== font[keys[i]])\n\t\t\t\tisDifferent = true;\n\t\t}\n\t\tif (isDifferent) {\n\t\t\ttune.lines[tune.lineNum].staff[tune.staffNum][type] = font;\n\t\t}\n\t}\n\ttune.runningFonts[type] = font;\n}\n\nfunction createVoice(self, tune, params) {\n\t//console.log(\"createVoice\", params)\n\tvar thisStaff = tune.lines[tune.lineNum].staff[tune.staffNum];\n\tthisStaff.voices[tune.voiceNum] = [];\n\tif (!thisStaff.title)\n\t\tthisStaff.title = [];\n\tthisStaff.title[tune.voiceNum] = { name: params.name, subname: params.subname };\n\tif (params.style)\n\t\tself.appendElement('style', null, null, { head: params.style });\n\tif (params.stem)\n\t\tself.appendElement('stem', null, null, { direction: params.stem });\n\telse if (tune.voiceNum > 0) {\n\t\tif (thisStaff.voices[0] !== undefined) {\n\t\t\tvar found = false;\n\t\t\tfor (var i = 0; i < thisStaff.voices[0].length; i++) {\n\t\t\t\tif (thisStaff.voices[0].el_type === 'stem')\n\t\t\t\t\tfound = true;\n\t\t\t}\n\t\t\tif (!found) {\n\t\t\t\tvar stem = { el_type: 'stem', direction: 'up' };\n\t\t\t\tthisStaff.voices[0].splice(0, 0, stem);\n\t\t\t}\n\t\t}\n\t\tself.appendElement('stem', null, null, { direction: 'down' });\n\t}\n\tif (params.scale)\n\t\tself.appendElement('scale', null, null, { size: params.scale });\n\tif (params.color)\n\t\tself.appendElement('color', null, null, { color: params.color });\n}\n\nfunction createStaff(self, tune, params) {\n\tif (params.key && params.key.impliedNaturals) {\n\t\tparams.key.accidentals = params.key.accidentals.concat(params.key.impliedNaturals);\n\t\tdelete params.key.impliedNaturals;\n\t}\n\n\ttune.lines[tune.lineNum].staff[tune.staffNum] = { voices: [], clef: params.clef, key: params.key, workingClef: params.clef };\n\tvar staff = tune.lines[tune.lineNum].staff[tune.staffNum]\n\tif (params.stafflines !== undefined) {\n\t\tstaff.clef.stafflines = params.stafflines;\n\t\tstaff.workingClef.stafflines = params.stafflines;\n\t}\n\tif (params.staffscale) {\n\t\tstaff.staffscale = params.staffscale;\n\t}\n\tif (params.annotationfont) setLineFont(tune, \"annotationfont\", params.annotationfont);\n\tif (params.gchordfont) setLineFont(tune, \"gchordfont\", params.gchordfont);\n\tif (params.tripletfont) setLineFont(tune, \"tripletfont\", params.tripletfont);\n\tif (params.vocalfont) setLineFont(tune, \"vocalfont\", params.vocalfont);\n\tif (params.bracket) staff.bracket = params.bracket;\n\tif (params.brace) staff.brace = params.brace;\n\tif (params.connectBarLines) staff.connectBarLines = params.connectBarLines;\n\tif (params.barNumber) staff.barNumber = params.barNumber;\n\tcreateVoice(self, tune, params);\n\t// Some stuff just happens for the first voice\n\tif (params.part)\n\t\tself.appendElement('part', params.part.startChar, params.part.endChar, { title: params.part.title });\n\tif (params.meter !== undefined) staff.meter = params.meter;\n\tif (tune.vskipPending) {\n\t\ttune.lines[tune.lineNum].vskip = tune.vskipPending;\n\t\tdelete tune.vskipPending;\n\t}\n}\n\nfunction createLine(self, tune, params) {\n\ttune.lines[tune.lineNum] = { staff: [] };\n\tcreateStaff(self, tune, params);\n}\n\nmodule.exports = TuneBuilder;\n","// abc_parse.js: parses a string representing ABC Music Notation into a usable internal structure.\n\nvar parseCommon = require('./abc_common');\nvar parseDirective = require('./abc_parse_directive');\nvar ParseHeader = require('./abc_parse_header');\nvar ParseMusic = require('./abc_parse_music');\nvar Tokenizer = require('./abc_tokenizer');\nvar wrap = require('./wrap_lines');\n\nvar Tune = require('../data/abc_tune');\nvar TuneBuilder = require('../parse/tune-builder');\n\nvar Parse = function() {\n\t\"use strict\";\n\tvar tune = new Tune();\n\tvar tuneBuilder = new TuneBuilder(tune);\n\tvar tokenizer;\n\tvar wordsContinuation = '';\n\tvar symbolContinuation = '';\n\n\tthis.getTune = function() {\n\t\tvar t = {\n\t\t\tformatting: tune.formatting,\n\t\t\tlines: tune.lines,\n\t\t\tmedia: tune.media,\n\t\t\tmetaText: tune.metaText,\n\t\t\tmetaTextInfo: tune.metaTextInfo,\n\t\t\tversion: tune.version,\n\n\t\t\taddElementToEvents: tune.addElementToEvents,\n\t\t\taddUsefulCallbackInfo: tune.addUsefulCallbackInfo,\n\t\t\tgetTotalTime: tune.getTotalTime,\n\t\t\tgetTotalBeats: tune.getTotalBeats,\n\t\t\tgetBarLength: tune.getBarLength,\n\t\t\tgetBeatLength: tune.getBeatLength,\n\t\t\tgetBeatsPerMeasure: tune.getBeatsPerMeasure,\n\t\t\tgetBpm: tune.getBpm,\n\t\t\tgetMeter: tune.getMeter,\n\t\t\tgetMeterFraction: tune.getMeterFraction,\n\t\t\tgetPickupLength: tune.getPickupLength,\n\t\t\tgetKeySignature: tune.getKeySignature,\n\t\t\tgetElementFromChar: tune.getElementFromChar,\n\t\t\tmakeVoicesArray: tune.makeVoicesArray,\n\t\t\tmillisecondsPerMeasure: tune.millisecondsPerMeasure,\n\t\t\tsetupEvents: tune.setupEvents,\n\t\t\tsetTiming: tune.setTiming,\n\t\t\tsetUpAudio: tune.setUpAudio,\n\t\t\tdeline: tune.deline,\n\t\t\tfindSelectableElement: tune.findSelectableElement,\n\t\t\tgetSelectableArray: tune.getSelectableArray,\n\t\t};\n\t\tif (tune.lineBreaks)\n\t\t\tt.lineBreaks = tune.lineBreaks;\n\t\tif (tune.visualTranspose)\n\t\t\tt.visualTranspose = tune.visualTranspose;\n\t\treturn t;\n\t};\n\n\tfunction addPositioning(el, type, value) {\n\t\tif (!el.positioning) el.positioning = {};\n\t\tel.positioning[type] = value;\n\t}\n\n\tfunction addFont(el, type, value) {\n\t\tif (!el.fonts) el.fonts = {};\n\t\tel.fonts[type] = value;\n\t}\n\n\tvar multilineVars = {\n\t\treset: function() {\n\t\t\tfor (var property in this) {\n\t\t\t\tif (this.hasOwnProperty(property) && typeof this[property] !== \"function\") {\n\t\t\t\t\tdelete this[property];\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.iChar = 0;\n\t\t\tthis.key = {accidentals: [], root: 'none', acc: '', mode: '' };\n\t\t\tthis.meter = null; // if no meter is specified, free meter is assumed\n\t\t\tthis.origMeter = null;\t// this is for new voices that are created after we set the meter.\n\t\t\tthis.hasMainTitle = false;\n\t\t\tthis.default_length = 0.125;\n\t\t\tthis.clef = { type: 'treble', verticalPos: 0 };\n\t\t\tthis.octave = 0;\n\t\t\tthis.next_note_duration = 0;\n\t\t\tthis.start_new_line = true;\n\t\t\tthis.is_in_header = true;\n\t\t\tthis.partForNextLine = {};\n\t\t\tthis.tempoForNextLine = [];\n\t\t\tthis.havent_set_length = true;\n\t\t\tthis.voices = {};\n\t\t\tthis.staves = [];\n\t\t\tthis.macros = {};\n\t\t\tthis.currBarNumber = 1;\n\t\t\tthis.barCounter = {};\n\t\t\tthis.ignoredDecorations = [];\n\t\t\tthis.score_is_present = false;\t// Can't have original V: lines when there is the score directive\n\t\t\tthis.inEnding = false;\n\t\t\tthis.inTie = [];\n\t\t\tthis.inTieChord = {};\n\t\t\tthis.vocalPosition = \"auto\";\n\t\t\tthis.dynamicPosition = \"auto\";\n\t\t\tthis.chordPosition = \"auto\";\n\t\t\tthis.ornamentPosition = \"auto\";\n\t\t\tthis.volumePosition = \"auto\";\n\t\t\tthis.openSlurs = [];\n\t\t\tthis.freegchord = false;\n\t\t\tthis.endingHoldOver = {};\n\t\t},\n\t\tdifferentFont: function(type, defaultFonts) {\n\t\t\tif (this[type].decoration !== defaultFonts[type].decoration) return true;\n\t\t\tif (this[type].face !== defaultFonts[type].face) return true;\n\t\t\tif (this[type].size !== defaultFonts[type].size) return true;\n\t\t\tif (this[type].style !== defaultFonts[type].style) return true;\n\t\t\tif (this[type].weight !== defaultFonts[type].weight) return true;\n\t\t\treturn false;\n\t\t},\n\t\taddFormattingOptions: function(el, defaultFonts, elType) {\n\t\t\tif (elType === 'note') {\n\t\t\t\tif (this.vocalPosition !== 'auto') addPositioning(el, 'vocalPosition', this.vocalPosition);\n\t\t\t\tif (this.dynamicPosition !== 'auto') addPositioning(el, 'dynamicPosition', this.dynamicPosition);\n\t\t\t\tif (this.chordPosition !== 'auto') addPositioning(el, 'chordPosition', this.chordPosition);\n\t\t\t\tif (this.ornamentPosition !== 'auto') addPositioning(el, 'ornamentPosition', this.ornamentPosition);\n\t\t\t\tif (this.volumePosition !== 'auto') addPositioning(el, 'volumePosition', this.volumePosition);\n\t\t\t\tif (this.differentFont(\"annotationfont\", defaultFonts)) addFont(el, 'annotationfont', this.annotationfont);\n\t\t\t\tif (this.differentFont(\"gchordfont\", defaultFonts)) addFont(el, 'gchordfont', this.gchordfont);\n\t\t\t\tif (this.differentFont(\"vocalfont\", defaultFonts)) addFont(el, 'vocalfont', this.vocalfont);\n\t\t\t\tif (this.differentFont(\"tripletfont\", defaultFonts)) addFont(el, 'tripletfont', this.tripletfont);\n\t\t\t} else if (elType === 'bar') {\n\t\t\t\tif (this.dynamicPosition !== 'auto') addPositioning(el, 'dynamicPosition', this.dynamicPosition);\n\t\t\t\tif (this.chordPosition !== 'auto') addPositioning(el, 'chordPosition', this.chordPosition);\n\t\t\t\tif (this.ornamentPosition !== 'auto') addPositioning(el, 'ornamentPosition', this.ornamentPosition);\n\t\t\t\tif (this.volumePosition !== 'auto') addPositioning(el, 'volumePosition', this.volumePosition);\n\t\t\t\tif (this.differentFont(\"measurefont\", defaultFonts)) addFont(el, 'measurefont', this.measurefont);\n\t\t\t\tif (this.differentFont(\"repeatfont\", defaultFonts)) addFont(el, 'repeatfont', this.repeatfont);\n\t\t\t}\n\t\t},\n\t\tduplicateStartEndingHoldOvers: function() {\n\t\t\tthis.endingHoldOver = {\n\t\t\t\tinTie: [],\n\t\t\t\tinTieChord: {}\n\t\t\t};\n\t\t\tfor (var i = 0; i < this.inTie.length; i++) {\n\t\t\t\tthis.endingHoldOver.inTie.push([]);\n\t\t\t\tif (this.inTie[i]) { // if a voice is suppressed there might be a gap in the array.\n\t\t\t\t\tfor (var j = 0; j < this.inTie[i].length; j++) {\n\t\t\t\t\t\tthis.endingHoldOver.inTie[i].push(this.inTie[i][j]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (var key in this.inTieChord) {\n\t\t\t\tif (this.inTieChord.hasOwnProperty(key))\n\t\t\t\t\tthis.endingHoldOver.inTieChord[key] = this.inTieChord[key];\n\t\t\t}\n\t\t},\n\t\trestoreStartEndingHoldOvers: function() {\n\t\t\tif (!this.endingHoldOver.inTie)\n\t\t\t\treturn;\n\t\t\tthis.inTie = [];\n\t\t\tthis.inTieChord = {};\n\t\t\tfor (var i = 0; i < this.endingHoldOver.inTie.length; i++) {\n\t\t\t\tthis.inTie.push([]);\n\t\t\t\tfor (var j = 0; j < this.endingHoldOver.inTie[i].length; j++) {\n\t\t\t\t\tthis.inTie[i].push(this.endingHoldOver.inTie[i][j]);\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (var key in this.endingHoldOver.inTieChord) {\n\t\t\t\tif (this.endingHoldOver.inTieChord.hasOwnProperty(key))\n\t\t\t\t\tthis.inTieChord[key] = this.endingHoldOver.inTieChord[key];\n\t\t\t}\n\t\t},\n\t};\n\n\tvar addWarning = function(str) {\n\t\tif (!multilineVars.warnings)\n\t\t\tmultilineVars.warnings = [];\n\t\tmultilineVars.warnings.push(str);\n\t};\n\n\tvar addWarningObject = function(warningObject) {\n\t\tif (!multilineVars.warningObjects)\n\t\t\tmultilineVars.warningObjects = [];\n\t\tmultilineVars.warningObjects.push(warningObject);\n\t};\n\n\tvar encode = function(str) {\n\t\tvar ret = str.replace(/\\x12/g, ' ');\n\t\tret = ret.replace(/&/g, '&');\n\t\tret = ret.replace(/</g, '<');\n\t\treturn ret.replace(/>/g, '>');\n\t};\n\n\tvar warn = function(str, line, col_num) {\n\t\tif (!line) line = \" \";\n\t\tvar bad_char = line[col_num];\n\t\tif (bad_char === ' ' || !bad_char)\n\t\t\tbad_char = \"SPACE\";\n\t\tvar clean_line = encode(line.substring(col_num - 64, col_num)) + '<span style=\"text-decoration:underline;font-size:1.3em;font-weight:bold;\">' + bad_char + '</span>' + encode(line.substring(col_num + 1).substring(0,64));\n\t\taddWarning(\"Music Line:\" + tokenizer.lineIndex + \":\" + (col_num+1) + ': ' + str + \": \" + clean_line);\n\t\taddWarningObject({message:str, line:line, startChar: multilineVars.iChar + col_num, column: col_num});\n\t};\n\n\tvar header;\n\tvar music;\n\n\tthis.getWarnings = function() {\n\t\treturn multilineVars.warnings;\n\t};\n\tthis.getWarningObjects = function() {\n\t\treturn multilineVars.warningObjects;\n\t};\n\n\tvar addWords = function(line, words) {\n\t\tif (words.indexOf('\\x12') >= 0) {\n\t\t\twordsContinuation += words\n\t\t\treturn\n\t\t}\n\t\twords = wordsContinuation + words\n\t\twordsContinuation = ''\n\n\t\tif (!line) { warn(\"Can't add words before the first line of music\", line, 0); return; }\n\t\twords = parseCommon.strip(words);\n\t\tif (words[words.length-1] !== '-')\n\t\t\twords = words + ' ';\t// Just makes it easier to parse below, since every word has a divider after it.\n\t\tvar word_list = [];\n\t\t// first make a list of words from the string we are passed. A word is divided on either a space or dash.\n\t\tvar last_divider = 0;\n\t\tvar replace = false;\n\t\tvar addWord = function(i) {\n\t\t\tvar word = parseCommon.strip(words.substring(last_divider, i));\n\t\t\tword = word.replace(/\\\\([-_*|~])/g, '$1')\n\t\t\tlast_divider = i+1;\n\t\t\tif (word.length > 0) {\n\t\t\t\tif (replace)\n\t\t\t\t\tword = word.replace(/~/g, ' ');\n\t\t\t\tvar div = words[i];\n\t\t\t\tif (div !== '_' && div !== '-')\n\t\t\t\t\tdiv = ' ';\n\t\t\t\tword_list.push({syllable: tokenizer.translateString(word), divider: div});\n\t\t\t\treplace = false;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\t\tvar escNext = false;\n\t\tfor (var i = 0; i < words.length; i++) {\n\t\t\tswitch (words[i]) {\n\t\t\t\tcase ' ':\n\t\t\t\tcase '\\x12':\n\t\t\t\t\taddWord(i);\n\t\t\t\t\tbreak;\n\t\t\t\tcase '-':\n\t\t\t\t\tif (!escNext && !addWord(i) && word_list.length > 0) {\n\t\t\t\t\t\tparseCommon.last(word_list).divider = '-';\n\t\t\t\t\t\tword_list.push({skip: true, to: 'next'});\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase '_':\n\t\t\t\t\tif (!escNext) {\n\t\t\t\t\t\taddWord(i);\n\t\t\t\t\t\tword_list.push({skip: true, to: 'slur'});\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase '*':\n\t\t\t\t\tif (!escNext) {\n\t\t\t\t\t\taddWord(i);\n\t\t\t\t\t\tword_list.push({skip: true, to: 'next'});\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase '|':\n\t\t\t\t\tif (!escNext) {\n\t\t\t\t\t\taddWord(i);\n\t\t\t\t\t\tword_list.push({skip: true, to: 'bar'});\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase '~':\n\t\t\t\t\tif (!escNext) {\n\t\t\t\t\t\treplace = true;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tescNext = words[i] === '\\\\'\n\t\t}\n\n\t\tvar inSlur = false;\n\t\tline.forEach(function(el) {\n\t\t\tif (word_list.length !== 0) {\n\t\t\t\tif (word_list[0].skip) {\n\t\t\t\t\tswitch (word_list[0].to) {\n\t\t\t\t\t\tcase 'next': if (el.el_type === 'note' && el.pitches !== null && !inSlur) word_list.shift(); break;\n\t\t\t\t\t\tcase 'slur': if (el.el_type === 'note' && el.pitches !== null) word_list.shift(); break;\n\t\t\t\t\t\tcase 'bar': if (el.el_type === 'bar') word_list.shift(); break;\n\t\t\t\t\t}\n\t\t\t\t\tif (el.el_type !== 'bar') {\n\t\t\t\t\t\tif (el.lyric === undefined)\n\t\t\t\t\t\t\tel.lyric = [{syllable: \"\", divider: \" \"}];\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tel.lyric.push({syllable: \"\", divider: \" \"});\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (el.el_type === 'note' && el.rest === undefined && !inSlur) {\n\t\t\t\t\t\tvar lyric = word_list.shift();\n\t\t\t\t\t\tif (lyric.syllable)\n\t\t\t\t\t\t\tlyric.syllable = lyric.syllable.replace(/ +/g,'\\xA0');\n\t\t\t\t\t\tif (el.lyric === undefined)\n\t\t\t\t\t\t\tel.lyric = [ lyric ];\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tel.lyric.push(lyric);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t};\n\n\tvar addSymbols = function(line, words) {\n\t\tif (words.indexOf('\\x12') >= 0) {\n\t\t\tsymbolContinuation += words\n\t\t\treturn\n\t\t}\n\t\twords = symbolContinuation + words\n\t\tsymbolContinuation = ''\n\n\t\t// TODO-PER: Currently copied from w: line. This needs to be read as symbols instead.\n\t\tif (!line) { warn(\"Can't add symbols before the first line of music\", line, 0); return; }\n\t\twords = parseCommon.strip(words);\n\t\tif (words[words.length-1] !== '-')\n\t\t\twords = words + ' ';\t// Just makes it easier to parse below, since every word has a divider after it.\n\t\tvar word_list = [];\n\t\t// first make a list of words from the string we are passed. A word is divided on either a space or dash.\n\t\tvar last_divider = 0;\n\t\tvar replace = false;\n\t\tvar addWord = function(i) {\n\t\t\tvar word = parseCommon.strip(words.substring(last_divider, i));\n\t\t\tlast_divider = i+1;\n\t\t\tif (word.length > 0) {\n\t\t\t\tif (replace)\n\t\t\t\t\tword = word.replace(/~/g, ' ');\n\t\t\t\tvar div = words[i];\n\t\t\t\tif (div !== '_' && div !== '-')\n\t\t\t\t\tdiv = ' ';\n\t\t\t\tword_list.push({syllable: tokenizer.translateString(word), divider: div});\n\t\t\t\treplace = false;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\t\tfor (var i = 0; i < words.length; i++) {\n\t\t\tswitch (words[i]) {\n\t\t\t\tcase ' ':\n\t\t\t\tcase '\\x12':\n\t\t\t\t\taddWord(i);\n\t\t\t\t\tbreak;\n\t\t\t\tcase '-':\n\t\t\t\t\tif (!addWord(i) && word_list.length > 0) {\n\t\t\t\t\t\tparseCommon.last(word_list).divider = '-';\n\t\t\t\t\t\tword_list.push({skip: true, to: 'next'});\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase '_':\n\t\t\t\t\taddWord(i);\n\t\t\t\t\tword_list.push({skip: true, to: 'slur'});\n\t\t\t\t\tbreak;\n\t\t\t\tcase '*':\n\t\t\t\t\taddWord(i);\n\t\t\t\t\tword_list.push({skip: true, to: 'next'});\n\t\t\t\t\tbreak;\n\t\t\t\tcase '|':\n\t\t\t\t\taddWord(i);\n\t\t\t\t\tword_list.push({skip: true, to: 'bar'});\n\t\t\t\t\tbreak;\n\t\t\t\tcase '~':\n\t\t\t\t\treplace = true;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tvar inSlur = false;\n\t\tline.forEach(function(el) {\n\t\t\tif (word_list.length !== 0) {\n\t\t\t\tif (word_list[0].skip) {\n\t\t\t\t\tswitch (word_list[0].to) {\n\t\t\t\t\t\tcase 'next': if (el.el_type === 'note' && el.pitches !== null && !inSlur) word_list.shift(); break;\n\t\t\t\t\t\tcase 'slur': if (el.el_type === 'note' && el.pitches !== null) word_list.shift(); break;\n\t\t\t\t\t\tcase 'bar': if (el.el_type === 'bar') word_list.shift(); break;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (el.el_type === 'note' && el.rest === undefined && !inSlur) {\n\t\t\t\t\t\tvar lyric = word_list.shift();\n\t\t\t\t\t\tif (el.lyric === undefined)\n\t\t\t\t\t\t\tel.lyric = [ lyric ];\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tel.lyric.push(lyric);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t};\n\n\tvar parseLine = function(line) {\n\t\tif (parseCommon.startsWith(line, '%%')) {\n\t\t\tvar err = parseDirective.addDirective(line.substring(2));\n\t\t\tif (err) warn(err, line, 2);\n\t\t\treturn;\n\t\t}\n\n\t\tvar i = line.indexOf('%');\n\t\tif (i >= 0)\n\t\t\tline = line.substring(0, i);\n\t\tline = line.replace(/\\s+$/, '');\n\n\t\tif (line.length === 0)\n\t\t\treturn;\n\n\t\tif (wordsContinuation) {\n\t\t\taddWords(tuneBuilder.getCurrentVoice(), line.substring(2));\n\t\t\treturn\n\t\t}\n\t\tif (symbolContinuation) {\n\t\t\taddSymbols(tuneBuilder.getCurrentVoice(), line.substring(2));\n\t\t\treturn\n\t\t}\n\t\tif (line.length < 2 || line[1] !== ':' || music.lineContinuation) {\n\t\t\tmusic.parseMusic(line);\n\t\t\treturn\n\t\t}\n\n\t\tvar ret = header.parseHeader(line);\n\t\tif (ret.regular)\n\t\t\tmusic.parseMusic(line);\n\t\tif (ret.newline)\n\t\t\tmusic.startNewLine();\n\t\tif (ret.words)\n\t\t\taddWords(tuneBuilder.getCurrentVoice(), line.substring(2));\n\t\tif (ret.symbols)\n\t\t\taddSymbols(tuneBuilder.getCurrentVoice(), line.substring(2));\n\t};\n\n\tfunction appendLastMeasure(voice, nextVoice) {\n\t\tvoice.push({\n\t\t\tel_type: 'hint'\n\t\t});\n\t\tfor (var i = 0; i < nextVoice.length; i++) {\n\t\t\tvar element = nextVoice[i];\n\t\t\tvar hint = Object.assign({},element);\n\t\t\tvoice.push(hint);\n\t\t\tif (element.el_type === 'bar')\n\t\t\t\t\treturn;\n\t\t}\n\t}\n\n\tfunction addHintMeasure(staff, nextStaff) {\n\t\tfor (var i = 0; i < staff.length; i++) {\n\t\t\tvar stave = staff[i];\n\t\t\tvar nextStave = nextStaff[i];\n\t\t\tif (nextStave) { // Be sure there is the same number of staves on the next line.\n\t\t\t\tfor (var j = 0; j < nextStave.voices.length; j++) {\n\t\t\t\t\tvar nextVoice = nextStave.voices[j];\n\t\t\t\t\tvar voice = stave.voices[j];\n\t\t\t\t\tif (voice) { // Be sure there are the same number of voices on the previous line.\n\t\t\t\t\t\tappendLastMeasure(voice, nextVoice);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction addHintMeasures() {\n\t\tfor (var i = 0; i < tune.lines.length; i++) {\n\t\t\tvar line = tune.lines[i].staff;\n\t\t\tif (line) {\n\t\t\t\tvar j = i+1;\n\t\t\t\twhile (j < tune.lines.length && tune.lines[j].staff === undefined)\n\t\t\t\t\tj++;\n\t\t\t\tif (j < tune.lines.length) {\n\t\t\t\t\tvar nextLine = tune.lines[j].staff;\n\t\t\t\t\taddHintMeasure(line, nextLine);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tthis.parse = function(strTune, switches, startPos) {\n\t\t// the switches are optional and cause a difference in the way the tune is parsed.\n\t\t// switches.header_only : stop parsing when the header is finished\n\t\t// switches.stop_on_warning : stop at the first warning encountered.\n\t\t// switches.print: format for the page instead of the browser.\n\t\t// switches.format: a hash of the desired formatting commands.\n\t\t// switches.hint_measures: put the next measure at the end of the current line.\n\t\t// switches.transpose: change the key signature, chords, and notes by a number of half-steps.\n\t\tif (!switches) switches = {};\n\t\tif (!startPos) startPos = 0;\n\t\ttune.reset();\n\n\t\t// Take care of whatever line endings come our way\n\t\t// Tack on newline temporarily to make the last line continuation work\n\t\tstrTune = strTune.replace(/\\r\\n?/g, '\\n') + '\\n';\n\n\t\t// get rid of latex commands. If a line starts with a backslash, then it is replaced by spaces to keep the character count the same.\n\t\tvar arr = strTune.split(\"\\n\\\\\");\n\t\tif (arr.length > 1) {\n\t\t\tfor (var i2 = 1; i2 < arr.length; i2++) {\n\t\t\t\twhile (arr[i2].length > 0 && arr[i2][0] !== \"\\n\") {\n\t\t\t\t\tarr[i2] = arr[i2].substr(1);\n\t\t\t\t\tarr[i2-1] += ' ';\n\t\t\t\t}\n\t\t\t}\n\t\t\tstrTune = arr.join(\" \"); //. the split removed two characters, so this puts them back\n\t\t}\n\t\t// take care of line continuations right away, but keep the same number of characters\n\t\tstrTune = strTune.replace(/\\\\([ \\t]*)(%.*)*\\n/g, function(all, backslash, comment){\n\t\t\tvar padding = comment ? Array(comment.length +1).join(' ') : \"\";\n\t\t\treturn backslash + \"\\x12\" + padding + '\\n';\n\t\t});\n\t\tvar lines = strTune.split('\\n')\n\t\tif (parseCommon.last(lines).length === 0)\t// remove the blank line we added above.\n\t\t\tlines.pop();\n\t\ttokenizer = new Tokenizer(lines, multilineVars);\n\t\theader = new ParseHeader(tokenizer, warn, multilineVars, tune, tuneBuilder);\n\t\tmusic = new ParseMusic(tokenizer, warn, multilineVars, tune, tuneBuilder, header);\n\n\t\tif (switches.print)\n\t\t\ttune.media = 'print';\n\t\tmultilineVars.reset();\n\t\tmultilineVars.iChar = startPos;\n\t\tif (switches.visualTranspose) {\n\t\t\tmultilineVars.globalTranspose = parseInt(switches.visualTranspose);\n\t\t\tif (multilineVars.globalTranspose === 0)\n\t\t\t\tmultilineVars.globalTranspose = undefined;\n\t\t\telse\n\t\t\t\ttuneBuilder.setVisualTranspose(switches.visualTranspose);\n\t\t} else\n\t\t\tmultilineVars.globalTranspose = undefined;\n\t\tif (switches.lineBreaks) {\n\t\t\t// The line break numbers are 0-based and they reflect the last measure of the current line.\n\t\t\tmultilineVars.lineBreaks = switches.lineBreaks;\n\t\t\t//multilineVars.continueall = true;\n\t\t}\n\t\theader.reset(tokenizer, warn, multilineVars, tune);\n\n\t\ttry {\n\t\t\tif (switches.format) {\n\t\t\t\tparseDirective.globalFormatting(switches.format);\n\t\t\t}\n\t\t\tvar line = tokenizer.nextLine();\n\t\t\twhile (line) {\n\t\t\t\tif (switches.header_only && multilineVars.is_in_header === false)\n\t\t\t\t\tthrow \"normal_abort\";\n\t\t\t\tif (switches.stop_on_warning && multilineVars.warnings)\n\t\t\t\t\tthrow \"normal_abort\";\n\n\t\t\t\tvar wasInHeader = multilineVars.is_in_header;\n\t\t\t\tparseLine(line);\n\t\t\t\tif (wasInHeader && !multilineVars.is_in_header) {\n\t\t\t\t\ttuneBuilder.setRunningFont(\"annotationfont\", multilineVars.annotationfont);\n\t\t\t\t\ttuneBuilder.setRunningFont(\"gchordfont\", multilineVars.gchordfont);\n\t\t\t\t\ttuneBuilder.setRunningFont(\"tripletfont\", multilineVars.tripletfont);\n\t\t\t\t\ttuneBuilder.setRunningFont(\"vocalfont\", multilineVars.vocalfont);\n\t\t\t\t}\n\t\t\t\tline = tokenizer.nextLine();\n\t\t\t}\n\n\t\t\tif (wordsContinuation) {\n\t\t\t\taddWords(tuneBuilder.getCurrentVoice(), '');\n\t\t\t}\n\t\t\tif (symbolContinuation) {\n\t\t\t\taddSymbols(tuneBuilder.getCurrentVoice(), '');\n\t\t\t}\n\t\t\tmultilineVars.openSlurs = tuneBuilder.cleanUp(multilineVars.barsperstaff, multilineVars.staffnonote, multilineVars.openSlurs);\n\n\t\t} catch (err) {\n\t\t\tif (err !== \"normal_abort\")\n\t\t\t\tthrow err;\n\t\t}\n\n\t\tvar ph = 11*72;\n\t\tvar pl = 8.5*72;\n\t\tswitch (multilineVars.papersize) {\n\t\t\t//case \"letter\": ph = 11*72; pl = 8.5*72; break;\n\t\t\tcase \"legal\": ph = 14*72; pl = 8.5*72; break;\n\t\t\tcase \"A4\": ph = 11.7*72; pl = 8.3*72; break;\n\t\t}\n\t\tif (multilineVars.landscape) {\n\t\t\tvar x = ph;\n\t\t\tph = pl;\n\t\t\tpl = x;\n\t\t}\n\t\tif (!tune.formatting.pagewidth)\n\t\t\ttune.formatting.pagewidth = pl;\n\t\tif (!tune.formatting.pageheight)\n\t\t\ttune.formatting.pageheight = ph;\n\n\t\tif (switches.hint_measures) {\n\t\t\taddHintMeasures();\n\t\t}\n\n\t\twrap.wrapLines(tune, multilineVars.lineBreaks, multilineVars.barNumbers);\n\t};\n};\n\nmodule.exports = Parse;\n","// abc_parse_book.js: parses a string representing ABC Music Notation into a usable internal structure.\n\nvar parseCommon = require('./abc_common');\n\nvar bookParser = function(book) {\n\t\"use strict\";\n\n\tvar directives = \"\";\n\tvar initialWhiteSpace = book.match(/(\\s*)/)\n\tbook = parseCommon.strip(book);\n\tvar tuneStrings = book.split(\"\\nX:\");\n\t// Put back the X: that we lost when splitting the tunes.\n\tfor (var i = 1; i < tuneStrings.length; i++)\n\t\ttuneStrings[i] = \"X:\" + tuneStrings[i];\n\t// Keep track of the character position each tune starts with. If the string starts with white space, count that, too.\n\tvar pos = initialWhiteSpace ? initialWhiteSpace[0].length : 0;\n\tvar tunes = [];\n\ttuneStrings.forEach(function(tune) {\n\t\ttunes.push({ abc: tune, startPos: pos});\n\t\tpos += tune.length + 1; // We also lost a newline when splitting, so count that.\n\t});\n\tif (tunes.length > 1 && !parseCommon.startsWith(tunes[0].abc, 'X:')) {\t// If there is only one tune, the X: might be missing, otherwise assume the top of the file is \"intertune\"\n\t\t// There could be file-wide directives in this, if so, we need to insert it into each tune. We can probably get away with\n\t\t// just looking for file-wide directives here (before the first tune) and inserting them at the bottom of each tune, since\n\t\t// the tune is parsed all at once. The directives will be seen before the engraver begins processing.\n\t\tvar dir = tunes.shift();\n\t\tvar arrDir = dir.abc.split('\\n');\n\t\tarrDir.forEach(function(line) {\n\t\t\tif (parseCommon.startsWith(line, '%%'))\n\t\t\t\tdirectives += line + '\\n';\n\t\t});\n\t}\n\tvar header = directives;\n\n\t// Now, the tune ends at a blank line, so truncate it if needed. There may be \"intertune\" stuff.\n\ttunes.forEach(function(tune) {\n\t\tvar end = tune.abc.indexOf('\\n\\n');\n\t\tif (end > 0)\n\t\t\ttune.abc = tune.abc.substring(0, end);\n\t\ttune.pure = tune.abc;\n\t\ttune.abc = directives + tune.abc;\n\n\t\t// for the user's convenience, parse and store the title separately. The title is between the first T: and the next \\n\n\t\ttune.title = \"\";\n\t\tvar title = tune.pure.split(\"T:\");\n\t\tif (title.length > 1) {\n\t\t\ttitle = title[1].split(\"\\n\");\n\t\t\ttune.title = parseCommon.strip(title[0]);\n\t\t}\n\n\t\t// for the user's convenience, parse and store the id separately. The id is between the first X: and the next \\n\n\t\tvar id = tune.pure.substring(2, tune.pure.indexOf(\"\\n\"));\n\t\ttune.id = parseCommon.strip(id);\n\t});\n\n\treturn {\n\t\theader: header,\n\t\ttunes: tunes\n\t};\n};\n\nmodule.exports = bookParser;\n\n","\n/**\n * Layout tablature informations for draw\n * @param {*} numLines \n * @param {*} lineSpace \n */\n\nfunction StringTablature(numLines, lineSpace) {\n\t//console.log(\"INIT StringTablature constructor\")\n\tthis.numLines = numLines;\n\tthis.lineSpace = lineSpace;\n\tthis.verticalSize = this.numLines * this.lineSpace;\n\tvar pitch = 3;\n\tthis.bar = {\n\t\tpitch: pitch,\n\t\tpitch2: lineSpace * numLines,\n\t\theight: 5,\n\t};\n}\n\n/**\n * return true if current line should not produce a tab\n * @param {} line \n */\nStringTablature.prototype.bypass = function (line) {\n\t//console.log(\"RENDER StringTablature bypass\")\n\tvar voices = line.staffGroup.voices;\n\tif (voices.length > 0) {\n\t\tif (voices[0].isPercussion) return true;\n\t}\n\treturn false;\n};\n\n\nStringTablature.prototype.setRelative = function (child, relative, first) {\n\t//console.log(\"RENDER StringTablature setRelative\")\n\tswitch (child.type) {\n\t\tcase 'bar':\n\t\t\trelative.pitch = this.bar.pitch;\n\t\t\trelative.pitch2 = this.bar.pitch2;\n\t\t\trelative.height = this.height;\n\t\t\tbreak;\n\t\tcase 'symbol':\n\t\t\tvar top = this.bar.pitch2 / 2;\n\t\t\tif (child.name == 'dots.dot') {\n\t\t\t\tif (first) {\n\t\t\t\t\trelative.pitch = top;\n\t\t\t\t\treturn false;\n\t\t\t\t} else {\n\t\t\t\t\trelative.pitch = top + this.lineSpace;\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t}\n\treturn first;\n};\n\nmodule.exports = StringTablature;","// abc_voice_element.js: Definition of the VoiceElement class.\n\nvar VoiceElement = function VoiceElement(voicenumber, voicetotal) {\n\tthis.children = [];\n\tthis.beams = [];\n\tthis.otherchildren = []; // ties, slurs, triplets\n\tthis.w = 0;\n\tthis.duplicate = false;\n\tthis.voicenumber = voicenumber; //number of the voice on a given stave (not staffgroup)\n\tthis.voicetotal = voicetotal;\n\tthis.bottom = 7;\n\tthis.top = 7;\n\tthis.specialY = {\n\t\ttempoHeightAbove: 0,\n\t\tpartHeightAbove: 0,\n\t\tvolumeHeightAbove: 0,\n\t\tdynamicHeightAbove: 0,\n\t\tendingHeightAbove: 0,\n\t\tchordHeightAbove: 0,\n\t\tlyricHeightAbove: 0,\n\n\t\tlyricHeightBelow: 0,\n\t\tchordHeightBelow: 0,\n\t\tvolumeHeightBelow: 0,\n\t\tdynamicHeightBelow: 0\n\t};\n};\n\nVoiceElement.prototype.addChild = function (absElem) {\n\t// This is always passed an AbsoluteElement\n\tif (absElem.type === 'bar') {\n\t\tvar firstItem = true;\n\t\tfor (var i = 0; firstItem && i < this.children.length; i++) {\n\t\t\tif (this.children[i].type.indexOf(\"staff-extra\") < 0 && this.children[i].type !== \"tempo\")\n\t\t\t\tfirstItem = false;\n\t\t}\n\t\tif (!firstItem) {\n\t\t\tthis.beams.push(\"bar\");\n\t\t\tthis.otherchildren.push(\"bar\");\n\t\t}\n\t}\n\tthis.children[this.children.length] = absElem;\n\tthis.setRange(absElem);\n};\n\nVoiceElement.prototype.setLimit = function (member, child) {\n\t// Sometimes we get an absolute element in here and sometimes we get some type of relative element.\n\t// If there is a \"specialY\" element, then assume it is an absolute element. If that doesn't exist, look for the\n\t// same members at the top level, because that's where they are in relative elements.\n\tvar specialY = child.specialY;\n\tif (!specialY) specialY = child;\n\tif (!specialY[member]) return;\n\tif (!this.specialY[member])\n\t\tthis.specialY[member] = specialY[member];\n\telse\n\t\tthis.specialY[member] = Math.max(this.specialY[member], specialY[member]);\n};\n\nVoiceElement.prototype.adjustRange = function (child) {\n\tif (child.bottom !== undefined)\n\t\tthis.bottom = Math.min(this.bottom, child.bottom);\n\tif (child.top !== undefined)\n\t\tthis.top = Math.max(this.top, child.top);\n};\n\nVoiceElement.prototype.setRange = function (child) {\n\tthis.adjustRange(child);\n\tthis.setLimit('tempoHeightAbove', child);\n\tthis.setLimit('partHeightAbove', child);\n\tthis.setLimit('volumeHeightAbove', child);\n\tthis.setLimit('dynamicHeightAbove', child);\n\tthis.setLimit('endingHeightAbove', child);\n\tthis.setLimit('chordHeightAbove', child);\n\tthis.setLimit('lyricHeightAbove', child);\n\tthis.setLimit('lyricHeightBelow', child);\n\tthis.setLimit('chordHeightBelow', child);\n\tthis.setLimit('volumeHeightBelow', child);\n\tthis.setLimit('dynamicHeightBelow', child);\n};\n\nVoiceElement.prototype.addOther = function (child) {\n\tthis.otherchildren.push(child);\n\tthis.setRange(child);\n};\n\nVoiceElement.prototype.addBeam = function (child) {\n\tthis.beams.push(child);\n};\n\nVoiceElement.prototype.setWidth = function (width) {\n\tthis.w = width;\n};\n\nmodule.exports = VoiceElement;\n","var setClass = function (elemset, addClass, removeClass, color) {\n\tif (!elemset)\n\t\treturn;\n\tfor (var i = 0; i < elemset.length; i++) {\n\t\tvar el = elemset[i];\n\t\tvar attr = el.getAttribute(\"highlight\");\n\t\tif (!attr) attr = \"fill\";\n\t\tel.setAttribute(attr, color);\n\t\tvar kls = el.getAttribute(\"class\");\n\t\tif (!kls) kls = \"\";\n\t\tkls = kls.replace(removeClass, \"\");\n\t\tkls = kls.replace(addClass, \"\");\n\t\tif (addClass.length > 0) {\n\t\t\tif (kls.length > 0 && kls[kls.length - 1] !== ' ') kls += \" \";\n\t\t\tkls += addClass;\n\t\t}\n\t\tel.setAttribute(\"class\", kls);\n\t}\n};\n\nmodule.exports = setClass;\n","var setClass = require('../helpers/set-class');\n\nvar highlight = function (klass, color) {\n\tif (klass === undefined)\n\t\tklass = \"abcjs-note_selected\";\n\tif (color === undefined)\n\t\tcolor = \"#ff0000\";\n\tsetClass(this.elemset, klass, \"\", color);\n};\n\nmodule.exports = highlight;\n","var setClass = require('../helpers/set-class');\n\nvar unhighlight = function (klass, color) {\n\tif (klass === undefined)\n\t\tklass = \"abcjs-note_selected\";\n\tif (color === undefined)\n\t\tcolor = \"#000000\";\n\tsetClass(this.elemset, \"\", klass, color);\n};\n\nmodule.exports = unhighlight;\n","// abc_absolute_element.js: Definition of the AbsoluteElement class.\n\nvar highlight = require(\"../../interactive/highlight\");\nvar unhighlight = require(\"../../interactive/unhighlight\");\n\n// Everything that is placed in the SVG is first created as an absolute element. This is one unit of graphic information.\n// That is, it embodies a concept: a clef, a time signature, a bar line,etc. or most complexly:\n// a note with its accidental, grace note, chord symbol, trill, stem, eighth flags, etc.\n// In the largest sense, these are placed on the page at a particular place that is determined during the layout phase.\n// This object doesn't contain any of the drawing information, though. That information is contained in an array of\n// RelativeElements as the \"children\" of this class.\n// During the layout phase, the width of all the children is calculated and the X coordinate of the absolute element is set.\n//\n// So, after the AbsoluteElement is placed, then its children can be placed relative to that. There are different types of\n// relative elements that are placed with different rules:\n// 1) Fixed - these elements don't move relative to the absolute element's coordinates. These are things like the notehead,\n// any ledger lines, accidentals, etc.\n// 2) Slotted - these elements can move vertically and don't get Y coordinates until after the absolute element is placed.\n// These are things like the chord symbol, many decorations, the lyrics, etc.\n//\n// Relative elements are also classified by how they are related. This could be:\n// 1) Increases the absolute element's width to the left. This doesn't change the center point of\n// the absolute element, so adding a sharp to the note won't move it to the right. However, if the elements\n// are close together then this enforces a minimum distance.\n// 2) Has no effect on the width. Annotations and the tempo act like this. No matter how long they are the width doesn't change.\n// 3) Increases the absolute element's width to the right. This doesn't change the center point,\n// but it will increase the minimum distance.\n// 4) Sets the width on both sides. This is the note heads. They are centered on both sides of the absolute element's X coordinate.\n\n// duration - actual musical duration - different from notehead duration in triplets. refer to abcelem to get the notehead duration\n// minspacing - spacing which must be taken on top of the width defined by the duration\n// type is a meta-type for the element. It is not necessary for drawing, but it is useful to make semantic sense of the element. For instance, it can be used in the element's class name.\nvar AbsoluteElement = function AbsoluteElement(abcelem, duration, minspacing, type, tuneNumber, options) {\n\t//\tconsole.log(\"Absolute:\",abcelem, duration, minspacing, type, tuneNumber, options);\n\tif (!options)\n\t\toptions = {};\n\tthis.tuneNumber = tuneNumber;\n\tthis.abcelem = abcelem;\n\tthis.duration = duration;\n\tthis.durationClass = options.durationClassOveride ? options.durationClassOveride : this.duration;\n\tthis.minspacing = minspacing || 0;\n\tthis.x = 0;\n\tthis.children = [];\n\tthis.heads = [];\n\tthis.extra = [];\n\tthis.extraw = 0;\n\tthis.w = 0;\n\tthis.right = [];\n\tthis.invisible = false;\n\tthis.bottom = undefined;\n\tthis.top = undefined;\n\tthis.type = type;\n\n\t// The following are the dimensions of the fixed part of the element.\n\t// That is, the chord text will be a different height depending on lot of factors, but the 8th flag will always be in the same place.\n\tthis.fixed = { w: 0, t: undefined, b: undefined }; // there is no x-coord here, because that is set later.\n\n\t// these are the heights of all of the vertical elements that can't be placed until the end of the line.\n\t// the vertical order of elements that are above is: tempo, part, volume/dynamic, ending/chord, lyric\n\t// the vertical order of elements that are below is: lyric, chord, volume/dynamic\n\tthis.specialY = {\n\t\ttempoHeightAbove: 0,\n\t\tpartHeightAbove: 0,\n\t\tvolumeHeightAbove: 0,\n\t\tdynamicHeightAbove: 0,\n\t\tendingHeightAbove: 0,\n\t\tchordHeightAbove: 0,\n\t\tlyricHeightAbove: 0,\n\n\t\tlyricHeightBelow: 0,\n\t\tchordHeightBelow: 0,\n\t\tvolumeHeightBelow: 0,\n\t\tdynamicHeightBelow: 0\n\t};\n};\n\nAbsoluteElement.prototype.getFixedCoords = function () {\n\treturn { x: this.x, w: this.fixed.w, t: this.fixed.t, b: this.fixed.b };\n};\n\nAbsoluteElement.prototype.addExtra = function (extra) {\n\t// used for accidentals, multi-measure rest text,\n\t// left-side decorations, gracenote heads,\n\t// left annotations, gracenote stems.\n\t// if (!(extra.c && extra.c.indexOf(\"accidentals\") >= 0) &&\n\t// \t!(extra.c && extra.c.indexOf(\"arpeggio\") >= 0) &&\n\t// \textra.type !== \"multimeasure-text\" &&\n\t// \t!(extra.c === \"noteheads.quarter\" && (extra.scalex === 0.6 || extra.scalex === 0.36)) &&\n\t// \t!(extra.type === \"stem\" && extra.linewidth === -0.6) &&\n\t// \textra.position !== \"left\"\n\t// )\n\t// \tconsole.log(\"extra\", extra);\n\n\tthis.fixed.w = Math.max(this.fixed.w, extra.dx + extra.w);\n\tif (this.fixed.t === undefined) this.fixed.t = extra.top; else this.fixed.t = Math.max(this.fixed.t, extra.top);\n\tif (this.fixed.b === undefined) this.fixed.b = extra.bottom; else this.fixed.b = Math.min(this.fixed.b, extra.bottom);\n\tif (extra.dx < this.extraw) this.extraw = extra.dx;\n\tthis.extra[this.extra.length] = extra;\n\tthis._addChild(extra);\n};\n\nAbsoluteElement.prototype.addHead = function (head) {\n\tif (head.dx < this.extraw) this.extraw = head.dx;\n\tthis.heads[this.heads.length] = head;\n\tthis.addRight(head);\n};\n\nAbsoluteElement.prototype.addRight = function (right) {\n\t// // used for clefs, note heads, bar lines, stems, key-signature accidentals, non-beamed flags, dots\n\t// if (!(right.c && right.c.indexOf(\"clefs\") >= 0) &&\n\t// \t!(right.c && right.c.indexOf(\"noteheads\") >= 0) &&\n\t// \t!(right.c && right.c.indexOf(\"flags\") >= 0) &&\n\t// \t!(right.c && right.c.indexOf(\"rests\") >= 0) &&\n\t// \t!(right.c && right.c.indexOf(\"dots.dot\") >= 0) &&\n\t// \tright.type !== \"stem\" &&\n\t// \tright.type !== \"bar\" &&\n\t// \tright.type !== \"none\" && // used when an invisible anchor is needed.\n\t// \t!(this.type.indexOf(\"clef\") >= -1 && right.c === \"8\") &&\n\t// \tthis.type.indexOf(\"key-signature\") === -1 &&\n\t// \tthis.type.indexOf(\"time-signature\") === -1 &&\n\t// \t!(this.abcelem && this.abcelem.rest && this.abcelem.rest.type === \"spacer\") &&\n\t// \t!(this.abcelem && this.abcelem.rest && this.abcelem.rest.type === \"invisible\") &&\n\t// \t!(right.type === \"text\" && right.position === \"relative\") &&\n\t// \t!(right.type === \"text\" && right.position === \"right\") &&\n\t// \t!(right.type === \"text\" && right.position === \"above\") &&\n\t// \t!(right.type === \"text\" && right.position === \"below\")\n\t// )\n\t// \tconsole.log(\"right\", right);\n\t// These are the elements that are the fixed part.\n\tthis.fixed.w = Math.max(this.fixed.w, right.dx + right.w);\n\tif (right.top !== undefined) {\n\t\tif (this.fixed.t === undefined) this.fixed.t = right.top; else this.fixed.t = Math.max(this.fixed.t, right.top);\n\t}\n\tif (right.bottom !== undefined) {\n\t\tif (this.fixed.b === undefined) this.fixed.b = right.bottom; else this.fixed.b = Math.min(this.fixed.b, right.bottom);\n\t}\n\t// if (isNaN(this.fixed.t) || isNaN(this.fixed.b))\n\t// \tdebugger;\n\tif (right.dx + right.w > this.w) this.w = right.dx + right.w;\n\tthis.right[this.right.length] = right;\n\tthis._addChild(right);\n};\n\nAbsoluteElement.prototype.addFixed = function (elem) {\n\t// used for elements that can't move relative to other elements after they have been placed.\n\t// used for ledger lines, bar numbers, debug msgs, clef, key sigs, time sigs\n\tthis._addChild(elem);\n};\n\nAbsoluteElement.prototype.addFixedX = function (elem) {\n\t// used for elements that can't move horizontally relative to other elements after they have been placed.\n\t// used for parts, tempo, decorations\n\tthis._addChild(elem);\n};\n\nAbsoluteElement.prototype.addCentered = function (elem) {\n\t// // used for chord labels, lyrics\n\t// if (!(elem.type === \"chord\" && elem.position === \"above\") &&\n\t// \t!(elem.type === \"chord\" && elem.position === \"below\") &&\n\t// \telem.type !== 'lyric'\n\t// )\n\t// \tconsole.log(\"centered\", elem);\n\tvar half = elem.w / 2;\n\tif (-half < this.extraw) this.extraw = -half;\n\tthis.extra[this.extra.length] = elem;\n\tif (elem.dx + half > this.w) this.w = elem.dx + half;\n\tthis.right[this.right.length] = elem;\n\tthis._addChild(elem);\n};\n\nAbsoluteElement.prototype.setLimit = function (member, child) {\n\tif (!child[member]) return;\n\tif (!this.specialY[member])\n\t\tthis.specialY[member] = child[member];\n\telse\n\t\tthis.specialY[member] = Math.max(this.specialY[member], child[member]);\n};\n\nAbsoluteElement.prototype._addChild = function (child) {\n // console.log(\"Relative:\",child);\n \n // MAE 30 Sep 2024 - To avoid extra space for chords if there is only a bar number on the clef\n var okToPushTop = true;\n if ((this.abcelem.el_type == \"clef\") && (child.type == \"barNumber\")){\n okToPushTop = false;\n }\n\n child.parent = this;\n this.children[this.children.length] = child;\n\n if (okToPushTop){\n this.pushTop(child.top);\n }\n \n this.pushBottom(child.bottom);\n this.setLimit('tempoHeightAbove', child);\n this.setLimit('partHeightAbove', child);\n this.setLimit('volumeHeightAbove', child);\n this.setLimit('dynamicHeightAbove', child);\n this.setLimit('endingHeightAbove', child);\n this.setLimit('chordHeightAbove', child);\n this.setLimit('lyricHeightAbove', child);\n this.setLimit('lyricHeightBelow', child);\n this.setLimit('chordHeightBelow', child);\n this.setLimit('volumeHeightBelow', child);\n this.setLimit('dynamicHeightBelow', child);\n};\n\nAbsoluteElement.prototype.pushTop = function (top) {\n\tif (top !== undefined) {\n\t\tif (this.top === undefined)\n\t\t\tthis.top = top;\n\t\telse\n\t\t\tthis.top = Math.max(top, this.top);\n\t}\n};\n\nAbsoluteElement.prototype.pushBottom = function (bottom) {\n\tif (bottom !== undefined) {\n\t\tif (this.bottom === undefined)\n\t\t\tthis.bottom = bottom;\n\t\telse\n\t\t\tthis.bottom = Math.min(bottom, this.bottom);\n\t}\n};\n\nAbsoluteElement.prototype.setX = function (x) {\n\tthis.x = x;\n\tfor (var i = 0; i < this.children.length; i++)\n\t\tthis.children[i].setX(x);\n};\n\nAbsoluteElement.prototype.center = function (before, after) {\n\t// Used to center whole rests\n\tvar midpoint = (after.x - before.x) / 2 + before.x;\n\tthis.x = midpoint - this.w / 2;\n\tfor (var k = 0; k < this.children.length; k++)\n\t\tthis.children[k].setX(this.x);\n};\n\nAbsoluteElement.prototype.setHint = function () {\n\tthis.hint = true;\n};\n\nAbsoluteElement.prototype.highlight = function (klass, color) {\n\thighlight.bind(this)(klass, color);\n};\n\nAbsoluteElement.prototype.unhighlight = function (klass, color) {\n\tunhighlight.bind(this)(klass, color);\n};\n\nmodule.exports = AbsoluteElement;\n","// abc_relative_element.js: Definition of the RelativeElement class.\n\nvar RelativeElement = function RelativeElement(c, dx, w, pitch, opt) {\n\topt = opt || {};\n\tthis.x = 0;\n\tthis.c = c; // character or path or string\n\tthis.dx = dx; // relative x position\n\tthis.w = w; // minimum width taken up by this element (can include gratuitous space)\n\tthis.pitch = pitch; // relative y position by pitch\n\tthis.scalex = opt.scalex || 1; // should the character/path be scaled?\n\tthis.scaley = opt.scaley || 1; // should the character/path be scaled?\n\tthis.type = opt.type || \"symbol\"; // cheap types.\n\tthis.pitch2 = opt.pitch2;\n\tthis.linewidth = opt.linewidth;\n\tthis.klass = opt.klass;\n\tthis.anchor = opt.anchor ? opt.anchor : 'middle'\n\tthis.top = pitch;\n\tif (this.pitch2 !== undefined && this.pitch2 > this.top) this.top = this.pitch2;\n\tthis.bottom = pitch;\n\tif (this.pitch2 !== undefined && this.pitch2 < this.bottom) this.bottom = this.pitch2;\n\tif (opt.thickness) {\n\t\tthis.top += opt.thickness / 2;\n\t\tthis.bottom -= opt.thickness / 2;\n\t}\n\tif (opt.stemHeight) {\n\t\tif (opt.stemHeight > 0)\n\t\t\tthis.top += opt.stemHeight;\n\t\telse\n\t\t\tthis.bottom += opt.stemHeight;\n\t}\n\tif (opt.dim)\n\t\tthis.dim = opt.dim;\n\tif (opt.position)\n\t\tthis.position = opt.position;\n\tthis.height = opt.height ? opt.height : 4; // The +1 is to give a little bit of padding.\n\tif (opt.top)\n\t\tthis.top = opt.top;\n\tif (opt.bottom)\n\t\tthis.bottom = opt.bottom;\n\tif (opt.name)\n\t\tthis.name = opt.name;\n\telse if (this.c)\n\t\tthis.name = this.c;\n\telse\n\t\tthis.name = this.type;\n\tif (opt.realWidth)\n\t\tthis.realWidth = opt.realWidth;\n\telse\n\t\tthis.realWidth = this.w;\n\tthis.centerVertically = false;\n\tswitch (this.type) {\n\t\tcase \"debug\":\n\t\t\tthis.chordHeightAbove = this.height;\n\t\t\tbreak;\n\t\tcase \"lyric\":\n\t\t\tif (opt.position && opt.position === 'below')\n\t\t\t\tthis.lyricHeightBelow = this.height;\n\t\t\telse\n\t\t\t\tthis.lyricHeightAbove = this.height;\n\t\t\tbreak;\n\t\tcase \"chord\":\n\t\t\tif (opt.position && opt.position === 'below')\n\t\t\t\tthis.chordHeightBelow = this.height;\n\t\t\telse\n\t\t\t\tthis.chordHeightAbove = this.height;\n\t\t\tbreak;\n\t\tcase \"text\":\n\t\t\tif (this.pitch === undefined) {\n\t\t\t\tif (opt.position && opt.position === 'below')\n\t\t\t\t\tthis.chordHeightBelow = this.height;\n\t\t\t\telse\n\t\t\t\t\tthis.chordHeightAbove = this.height;\n\t\t\t} else\n\t\t\t\tthis.centerVertically = true;\n\t\t\tbreak;\n\t\tcase \"part\": this.partHeightAbove = this.height; break;\n\t}\n};\n\nRelativeElement.prototype.getChordDim = function () {\n\tif (this.type === \"debug\")\n\t\treturn null;\n\tif (!this.chordHeightAbove && !this.chordHeightBelow)\n\t\treturn null;\n\t// Chords are centered, annotations are left justified.\n\t// NOTE: the font reports extra space to the left and right anyway, so there is a built in margin.\n\t// We add a little margin so that items can't touch - we use half the font size as the margin, so that is 1/4 on each side.\n\t// if there is only one character that we're printing, use half of that margin.\n\t// var margin = this.dim.font.size/4;\n\t// if (this.c.length === 1)\n\t// \tmargin = margin / 2;\n\tvar margin = 0;\n\n\tvar offset = this.type === \"chord\" ? this.realWidth / 2 : 0;\n\tvar left = this.x - offset - margin;\n\tvar right = left + this.realWidth + margin;\n\treturn { left: left, right: right };\n};\n\nRelativeElement.prototype.invertLane = function (total) {\n\tif (this.lane === undefined)\n\t\tthis.lane = 0;\n\tthis.lane = total - this.lane - 1;\n};\n\nRelativeElement.prototype.putChordInLane = function (i) {\n\tthis.lane = i;\n\t// Add some extra space to account for the character's descenders.\n\tif (this.chordHeightAbove)\n\t\tthis.chordHeightAbove = (this.height * 1.25) * this.lane;\n\telse\n\t\tthis.chordHeightBelow = (this.height * 1.25) * this.lane;\n};\n\nRelativeElement.prototype.getLane = function () {\n\tif (this.lane === undefined)\n\t\treturn 0;\n\treturn this.lane;\n};\n\nRelativeElement.prototype.setX = function (x) {\n\tthis.x = x + this.dx;\n};\n\nmodule.exports = RelativeElement;\n","/**\n * Tablature Absolute elements factory\n */\nvar AbsoluteElement = require('../../write/creation/elements/absolute-element');\nvar RelativeElement = require('../../write/creation/elements/relative-element');\n\nfunction isObject(a) { return a != null && a.constructor === Object; }\nfunction cloneObject(dest, src) {\n\tfor (var prop in src) {\n\t\tif (src.hasOwnProperty(prop)) {\n\t\t\tif (!(Array.isArray(src[prop]) || isObject(src[prop]))) {\n\t\t\t\tdest[prop] = src[prop];\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction cloneAbsolute(absSrc) {\n\tvar returned = new AbsoluteElement('', 0, 0, '', 0);\n\tcloneObject(returned, absSrc);\n\treturned.top = 0;\n\treturned.bottom = -1;\n\tif (absSrc.abcelem) {\n\t\treturned.abcelem = {};\n\t\tcloneObject(returned.abcelem, absSrc.abcelem);\n\t\tif (returned.abcelem.el_type === \"note\")\n\t\t\treturned.abcelem.el_type = 'tabNumber';\n\t}\n\t// TODO-PER: This fixes the classes because the element isn't created at the right time.\n\tabsSrc.cloned = returned\n\treturn returned;\n}\n\nfunction cloneAbsoluteAndRelatives(absSrc, plugin) {\n\tvar returned = cloneAbsolute(absSrc);\n\tif (plugin) {\n\t\tvar children = absSrc.children;\n\t\t// proceed with relative as well\n\t\tvar first = true;\n\t\tfor (var ii = 0; ii < children.length; ii++) {\n\t\t\tvar child = children[ii];\n\t\t\tvar relative = new RelativeElement('', 0, 0, 0, '');\n\t\t\tcloneObject(relative, child);\n\t\t\tfirst = plugin.tablature.setRelative(child, relative, first);\n\t\t\treturned.children.push(relative);\n\t\t}\n\t}\n\treturn returned;\n}\n\nfunction buildTabAbsolute(plugin, absX, relX) {\n\tvar tabIcon = 'tab.tiny';\n\tvar tabYPos = 7.5;\n\tif (plugin.isTabBig) {\n\t\ttabIcon = 'tab.big';\n\t\ttabYPos = 10;\n\t}\n\tvar element = {\n\t\tel_type: \"tab\",\n\t\ticon: tabIcon,\n\t\tYpos: tabYPos\n\t};\n\n\t// Offset the TAB symbol position if specified in the tab description\n\ttabYPos += plugin.tabSymbolOffset;\n\n\t// For tablature like whistle tab where you want the TAB symbol hidden\n\tif (!plugin.hideTabSymbol) {\n\n\t\tvar tabAbsolute = new AbsoluteElement(element, 0, 0, \"symbol\", 0);\n\t\ttabAbsolute.x = absX;\n\t\tvar tabRelative = new RelativeElement(tabIcon, 0, 0, 7.5, \"tab\");\n\t\ttabRelative.x = relX;\n\t\ttabAbsolute.children.push(tabRelative);\n\t\tif (tabAbsolute.abcelem.el_type == 'tab') {\n\t\t\ttabRelative.pitch = tabYPos;\n\t\t}\n\n\t}\n\treturn tabAbsolute;\n}\n\nfunction lyricsDim(abs) {\n\tif (abs.extra) {\n\t\tfor (var ii = 0; ii < abs.extra.length; ii++) {\n\t\t\tvar extra = abs.extra[ii];\n\t\t\tif (extra.type == 'lyric') {\n\t\t\t\treturn {\n\t\t\t\t\tbottom: extra.bottom,\n\t\t\t\t\theight: extra.height\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t}\n\treturn null;\n}\nfunction TabAbsoluteElements() {\n\t//console.log(\"RENDER TabAbsoluteElements constructor\")\n\tthis.accidentals = null;\n}\n\nfunction getInitialStaffSize(staffGroup) {\n\tvar returned = 0;\n\tfor (var ii = 0; ii < staffGroup.length; ii++) {\n\t\tif (!staffGroup[ii].tabNameInfos) returned++;\n\t}\n\treturn returned;\n}\n\nfunction buildRelativeTabNote(plugin, relX, def, curNote, isGrace) {\n\tvar strNote = curNote.num;\n\tif (curNote.note.quarter != null) {\n\t\t// add tab quarter => needs to string conversion then \n\t\tstrNote = strNote.toString();\n\t\tstrNote += curNote.note.quarter;\n\t}\n\tvar pitch = plugin.semantics.stringToPitch(curNote.str);\n\tdef.notes.push({ num: strNote, str: curNote.str, pitch: curNote.note.emit() });\n\tvar opt = {\n\t\ttype: 'tabNumber'\n\t};\n\tvar tabNoteRelative = new RelativeElement(\n\t\tstrNote, 0, 0, pitch + 0.3, opt);\n\ttabNoteRelative.x = relX;\n\ttabNoteRelative.isGrace = isGrace;\n\ttabNoteRelative.isAltered = curNote.note.isAltered;\n\treturn tabNoteRelative;\n}\n\nfunction getXGrace(abs, index) {\n\tvar found = 0;\n\tif (abs.extra) {\n\t\tfor (var ii = 0; ii < abs.extra.length; ii++) {\n\t\t\tif (abs.extra[ii].c.indexOf('noteheads') >= 0) {\n\t\t\t\tif (found === index) {\n\t\t\t\t\treturn abs.extra[ii].x + abs.extra[ii].w / 2;\n\t\t\t\t} else {\n\t\t\t\t\tfound++;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn -1;\n}\n\nfunction graceInRest(absElem) {\n\tif (absElem.abcelem) {\n\t\tvar elem = absElem.abcelem;\n\t\tif (elem.rest) {\n\t\t\treturn elem.gracenotes;\n\t\t}\n\t}\n\treturn null;\n}\n\nfunction convertToNumber(plugin, pitches, graceNotes) {\n\tvar tabPos = plugin.semantics.notesToNumber(pitches, graceNotes);\n\tif (tabPos.error) {\n\t\tplugin.setError(tabPos.error);\n\t\treturn tabPos; // give up on error here\n\t}\n\tif (tabPos.graces && tabPos.notes) {\n\t\t// add graces to last note in notes\n\t\tvar posNote = tabPos.notes.length - 1;\n\t\ttabPos.notes[posNote].graces = tabPos.graces;\n\t}\n\treturn tabPos;\n}\n\nfunction buildGraceRelativesForRest(plugin, abs, absChild, graceNotes, tabVoice) {\n\tfor (var mm = 0; mm < graceNotes.length; mm++) {\n\t\tvar defGrace = { el_type: \"note\", startChar: absChild.abcelem.startChar, endChar: absChild.abcelem.endChar, notes: [], grace: true };\n\t\tvar graceX = getXGrace(absChild, mm);\n\t\tvar curGrace = graceNotes[mm];\n\t\tvar tabGraceRelative = buildRelativeTabNote(plugin, graceX, defGrace, curGrace, true);\n\t\tabs.children.push(tabGraceRelative);\n\t\ttabVoice.push(defGrace);\n\t}\n}\n\n/**\n * Build tab absolutes by scanning current staff line absolute array\n * @param {*} staffAbsolute\n */\nTabAbsoluteElements.prototype.build = function (plugin,\n\tstaffAbsolute,\n\ttabVoice,\n\tvoiceIndex,\n\tstaffIndex,\n\tkeySig,\n\ttabVoiceIndex) {\n\t//console.log(\"RENDER TabAbsoluteElements build\")\n\tvar staffSize = getInitialStaffSize(staffAbsolute);\n\tvar source = staffAbsolute[staffIndex + voiceIndex];\n\tvar dest = staffAbsolute[tabVoiceIndex];\n\tvar tabPos = null;\n\tvar defNote = null;\n\tif (source.children[0].abcelem.el_type != 'clef') {\n\t\t// keysig missing => provide one for tabs\n\t\tif (keySig != 'none') {\n\t\t\tsource.children.splice(0, 0, keySig);\n\t\t}\n\t}\n\tfor (var ii = 0; ii < source.children.length; ii++) {\n\t\tvar absChild = source.children[ii];\n\t\tvar absX = absChild.x;\n\t\tvar relX = absX;\n\t\t// if (absChild.children.length > 0) {\n\t\t// relX = absChild.children[0].x;\n\t\t// }\n\t\tif ((absChild.isClef)) {\n\t\t\tdest.children.push(buildTabAbsolute(plugin, absX, relX));\n\t\t\tif (absChild.abcelem.type.indexOf('-8') >= 0) plugin.semantics.clefTranspose = -12\n\t\t\tif (absChild.abcelem.type.indexOf('+8') >= 0) plugin.semantics.clefTranspose = 12\n\t\t}\n\t\tswitch (absChild.type) {\n\t\t\tcase 'staff-extra key-signature':\n\t\t\t\t// refresh key accidentals\n\t\t\t\tthis.accidentals = absChild.abcelem.accidentals;\n\t\t\t\tplugin.semantics.accidentals = this.accidentals;\n\t\t\t\tbreak;\n\t\t\tcase 'bar':\n\t\t\t\tplugin.semantics.measureAccidentals = {}\n\t\t\t\tvar lastBar = false;\n\t\t\t\tif (ii === source.children.length - 1) {\n\t\t\t\t\t// used for final line bar drawing\n\t\t\t\t\t// for multi tabs / multi staves\n\t\t\t\t\tlastBar = true;\n\t\t\t\t}\n\t\t\t\tvar cloned = cloneAbsoluteAndRelatives(absChild, plugin);\n\t\t\t\tif (cloned.abcelem.barNumber) {\n\t\t\t\t\tdelete cloned.abcelem.barNumber;\n\t\t\t\t\tfor (var bn = 0; bn < cloned.children.length; bn++) {\n\t\t\t\t\t\tif (cloned.children[bn].type === \"barNumber\") {\n\t\t\t\t\t\t\tcloned.children.splice(bn, 1);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcloned.abcelem.lastBar = lastBar;\n\t\t\t\tdest.children.push(cloned);\n\t\t\t\ttabVoice.push({\n\t\t\t\t\tel_type: absChild.abcelem.el_type,\n\t\t\t\t\ttype: absChild.abcelem.type,\n\t\t\t\t\tendChar: absChild.abcelem.endChar,\n\t\t\t\t\tstartChar: absChild.abcelem.startChar,\n\t\t\t\t\tabselem: cloned\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\tcase 'rest':\n\t\t\t\tvar restGraces = graceInRest(absChild);\n\t\t\t\tif (restGraces) {\n\t\t\t\t\t// to number conversion \n\t\t\t\t\ttabPos = convertToNumber(plugin, null, restGraces);\n\t\t\t\t\tif (tabPos.error) return;\n\t\t\t\t\t// build relative for grace\n\t\t\t\t\tdefGrace = { el_type: \"note\", startChar: absChild.abcelem.startChar, endChar: absChild.abcelem.endChar, notes: [], grace: true };\n\t\t\t\t\tbuildGraceRelativesForRest(plugin, abs, absChild, tabPos.graces, tabVoice);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'note':\n\t\t\t\tvar abs = cloneAbsolute(absChild);\n\t\t\t\tabs.x = absChild.heads[0].x + absChild.heads[0].w / 2; // center the number\n\t\t\t\tabs.lyricDim = lyricsDim(absChild);\n\t\t\t\tvar pitches = absChild.abcelem.pitches;\n\t\t\t\tvar graceNotes = absChild.abcelem.gracenotes;\n\t\t\t\tabs.type = 'tabNumber';\n\t\t\t\t// to number conversion \n\t\t\t\ttabPos = convertToNumber(plugin, pitches, graceNotes);\n\t\t\t\tif (tabPos.error) return;\n\t\t\t\tif (tabPos.graces) {\n\t\t\t\t\t// add graces to last note in notes\n\t\t\t\t\tvar posNote = tabPos.notes.length - 1;\n\t\t\t\t\ttabPos.notes[posNote].graces = tabPos.graces;\n\t\t\t\t}\n\t\t\t\t// build relative\n\t\t\t\tdefNote = { el_type: \"note\", startChar: absChild.abcelem.startChar, endChar: absChild.abcelem.endChar, notes: [] };\n\t\t\t\tfor (var ll = 0; ll < tabPos.notes.length; ll++) {\n\t\t\t\t\tvar curNote = tabPos.notes[ll];\n\t\t\t\t\tif (curNote.graces) {\n\t\t\t\t\t\tfor (var mm = 0; mm < curNote.graces.length; mm++) {\n\t\t\t\t\t\t\tvar defGrace = { el_type: \"note\", startChar: absChild.abcelem.startChar, endChar: absChild.abcelem.endChar, notes: [], grace: true };\n\t\t\t\t\t\t\tvar graceX = getXGrace(absChild, mm);\n\t\t\t\t\t\t\tvar curGrace = curNote.graces[mm];\n\t\t\t\t\t\t\tvar tabGraceRelative = buildRelativeTabNote(plugin, graceX, defGrace, curGrace, true);\n\t\t\t\t\t\t\tabs.children.push(tabGraceRelative);\n\t\t\t\t\t\t\ttabVoice.push(defGrace);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tvar tabNoteRelative = buildRelativeTabNote(plugin, abs.x + absChild.heads[ll].dx, defNote, curNote, false);\n\t\t\t\t\tabs.children.push(tabNoteRelative);\n\t\t\t\t}\n\t\t\t\tif (defNote.notes.length > 0) {\n\t\t\t\t\tdefNote.abselem = abs;\n\t\t\t\t\ttabVoice.push(defNote);\n\t\t\t\t\tdest.children.push(abs);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t}\n};\n\nmodule.exports = TabAbsoluteElements;\n","/* eslint-disable no-debugger */\nvar VoiceElement = require('../../write/creation/elements/voice-element');\nvar TabAbsoluteElements = require('./tab-absolute-elements');\nvar spacing = require('../../write/helpers/spacing');\n\nfunction initSpecialY() {\n\treturn {\n\t\ttempoHeightAbove: 0,\n\t\tpartHeightAbove: 0,\n\t\tvolumeHeightAbove: 0,\n\t\tdynamicHeightAbove: 0,\n\t\tendingHeightAbove: 0,\n\t\tchordHeightAbove: 0,\n\t\tlyricHeightAbove: 0,\n\t\tlyricHeightBelow: 0,\n\t\tchordHeightBelow: 0,\n\t\tvolumeHeightBelow: 0,\n\t\tdynamicHeightBelow: 0\n\t};\n}\n\nfunction getLyricHeight(voice) {\n\tvar maxLyricHeight = 0;\n\tfor (var ii = 0; ii < voice.children.length; ii++) {\n\t\tvar curAbs = voice.children[ii];\n\t\tif (curAbs.specialY) {\n\t\t\tif (curAbs.specialY.lyricHeightBelow > maxLyricHeight) {\n\t\t\t\tmaxLyricHeight = curAbs.specialY.lyricHeightBelow;\n\t\t\t}\n\t\t}\n\t}\n\treturn maxLyricHeight; // add spacing\n}\n\nfunction buildTabName(plugin, renderer, dest) {\n\tvar stringSemantics = plugin.semantics;\n\tvar textSize = renderer.controller.getTextSize;\n\tvar tabName = stringSemantics.tabInfos(plugin);\n\tvar suppress = stringSemantics.suppress(plugin);\n\tvar doDraw = true;\n\n\tif (suppress) {\n\t\tdoDraw = false\n\t}\n\n\n\tif (doDraw) {\n\t\tvar size = textSize.calc(tabName, 'tablabelfont', 'text instrumentname');\n\t\tdest.tabNameInfos = {\n\t\t\ttextSize: { height: size.height, width: size.width },\n\t\t\tname: tabName\n\t\t};\n\t\treturn size.height;\n\t}\n\treturn 0\n\n}\n\nfunction islastTabInStaff(index, staffGroup) {\n\tif (staffGroup[index].isTabStaff) {\n\t\tif (index === staffGroup.length - 1) return true;\n\t\tif (staffGroup[index + 1].isTabStaff) {\n\t\t\treturn false;\n\t\t} else {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\nfunction getStaffNumbers(staffs) {\n\tvar nbStaffs = 0;\n\tfor (var ii = 0; ii < staffs.length; ii++) {\n\t\tif (!staffs[ii].isTabStaff) {\n\t\t\tnbStaffs++;\n\t\t}\n\t}\n\treturn nbStaffs;\n}\n\nfunction getParentStaffIndex(staffs, index) {\n\tfor (var ii = index; ii >= 0; ii--) {\n\t\tif (!staffs[ii].isTabStaff) {\n\t\t\treturn ii;\n\t\t}\n\t}\n\treturn -1;\n}\n\n\nfunction linkStaffAndTabs(staffs) {\n\tfor (var ii = 0; ii < staffs.length; ii++) {\n\t\tif (staffs[ii].isTabStaff) {\n\t\t\t// link to parent staff\n\t\t\tvar parentIndex = getParentStaffIndex(staffs, ii);\n\t\t\tstaffs[ii].hasStaff = staffs[parentIndex];\n\t\t\tif (!staffs[parentIndex].hasTab) staffs[parentIndex].hasTab = [];\n\t\t\tstaffs[parentIndex].hasTab.push(staffs[ii]);\n\t\t}\n\t}\n}\n\nfunction isMultiVoiceSingleStaff(staffs, parent) {\n\tif (getStaffNumbers(staffs) === 1) {\n\t\tif (parent.voices.length > 1) return true;\n\t}\n\treturn false;\n}\n\n\nfunction getNextTabPos(tabIndex, staffGroup) {\n\tvar startIndex = 0;\n\tvar handledVoices = 0;\n\tvar inProgress = true;\n\tvar nbVoices = 0;\n\twhile (inProgress) {\n\t\t//for (var ii = 0; ii < staffGroup.length; ii++) {\n\t\tif (!staffGroup[startIndex])\n\t\t\treturn -1;\n\t\tif (!staffGroup[startIndex].isTabStaff) {\n\t\t\tnbVoices = staffGroup[startIndex].voices.length; // get number of staff voices\n\t\t}\n\t\tif (staffGroup[startIndex].isTabStaff) {\n\t\t\thandledVoices++;\n\t\t\tif (islastTabInStaff(startIndex, staffGroup)) {\n\t\t\t\tif (handledVoices < nbVoices) return startIndex + 1;\n\t\t\t}\n\t\t} else {\n\t\t\thandledVoices = 0;\n\t\t\tif (startIndex >= tabIndex) {\n\t\t\t\tif (startIndex + 1 == staffGroup.length) return startIndex + 1;\n\t\t\t\tif (!staffGroup[startIndex + 1].isTabStaff) return startIndex + 1;\n\t\t\t}\n\t\t}\n\t\tstartIndex++;\n\t\t// out of space case\n\t\tif (startIndex > staffGroup.length) return -1;\n\t}\n}\n\nfunction getLastStaff(staffs, lastTab) {\n\tfor (var ii = lastTab; ii >= 0; ii--) {\n\t\tif (!staffs[ii].isTabStaff) {\n\t\t\treturn staffs[ii];\n\t\t}\n\t}\n\treturn null;\n}\n\nfunction checkVoiceKeySig(voices, ii) {\n\tvar curVoice = voices[ii];\n\t// on multivoice multistaff only the first voice has key signature\n\t// folling consecutive do not have one => we should provide the first voice key sig back then\n\tvar elem0 = curVoice.children[0].abcelem;\n\tif (elem0.el_type === 'clef') return null;\n\tif (ii == 0) {\n\t\t// not found => clef=none case\n\t\treturn 'none';\n\t}\n\treturn voices[ii - 1].children[0];\n}\n\nfunction tabRenderer(plugin, renderer, line, staffIndex) {\n\t//console.log(\"RENDER tabRenderer\")\n\tvar absolutes = new TabAbsoluteElements();\n\tvar tabStaff = {\n\t\tclef: {\n\t\t\ttype: 'TAB'\n\t\t}\n\t};\n\tvar tabSize = (plugin.linePitch * plugin.nbLines);\n\tvar staffs = line.staff;\n\tif (staffs) {\n\t\t// give up on staffline=0 in key \n\t\tvar firstStaff = staffs[0];\n\t\tif (firstStaff) {\n\t\t\tif (firstStaff.clef) {\n\t\t\t\tif (firstStaff.clef.stafflines == 0) {\n\t\t\t\t\tplugin.setError(\"No tablatures when stafflines=0\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tstaffs.splice(\n\t\t\tstaffs.length, 0,\n\t\t\ttabStaff\n\t\t);\n\t}\n\tvar staffGroup = line.staffGroup;\n\n\tvar voices = staffGroup.voices;\n\tvar firstVoice = voices[0];\n\t// take lyrics into account if any\n\tvar lyricsHeight = getLyricHeight(firstVoice);\n\tvar padd = 3;\n\tvar prevIndex = staffIndex;\n\tvar previousStaff = staffGroup.staffs[prevIndex];\n\tvar tabTop = tabSize + padd - previousStaff.bottom - lyricsHeight;\n\tif (previousStaff.isTabStaff) {\n\t\ttabTop = previousStaff.top;\n\t}\n\tvar staffGroupInfos = {\n\t\tbottom: -1,\n\t\tisTabStaff: true,\n\t\tspecialY: initSpecialY(),\n\t\tlines: plugin.nbLines,\n\t\tlinePitch: plugin.linePitch,\n\t\tdy: 0.15,\n\t\ttop: tabTop,\n\t};\n\tvar nextTabPos = getNextTabPos(staffIndex, staffGroup.staffs);\n\tif (nextTabPos === -1)\n\t\treturn;\n\tstaffGroupInfos.parentIndex = nextTabPos - 1;\n\tstaffGroup.staffs.splice(nextTabPos, 0, staffGroupInfos);\n\t// staffGroup.staffs.push(staffGroupInfos);\n\tstaffGroup.height += tabSize + padd;\n\tvar parentStaff = getLastStaff(staffGroup.staffs, nextTabPos);\n\tvar nbVoices = 1;\n\tif (isMultiVoiceSingleStaff(staffGroup.staffs, parentStaff)) {\n\t\tnbVoices = parentStaff.voices.length;\n\t}\n\t// build from staff\n\ttabStaff.voices = [];\n\tfor (var ii = 0; ii < nbVoices; ii++) {\n\t\tvar tabVoice = new VoiceElement(0, 0);\n\t\tif (ii > 0) tabVoice.duplicate = true;\n\t\tvar nameHeight = buildTabName(plugin, renderer, tabVoice) / spacing.STEP;\n\t\tnameHeight = Math.max(nameHeight, 1) // If there is no label for the tab line, then there needs to be a little padding\n\t\t// This was pushing down the top staff by the tab label height\n\t\t//staffGroup.staffs[staffIndex].top += nameHeight;\n\t\tstaffGroup.staffs[staffIndex].top += 1;\n\t\tstaffGroup.height += nameHeight;\n\t\ttabVoice.staff = staffGroupInfos;\n\t\tvar tabVoiceIndex = voices.length\n\t\tvoices.splice(voices.length, 0, tabVoice);\n\t\tvar keySig = checkVoiceKeySig(voices, ii + staffIndex);\n\t\ttabStaff.voices[ii] = [];\n\t\tabsolutes.build(plugin, voices, tabStaff.voices[ii], ii, staffIndex, keySig, tabVoiceIndex);\n\t}\n\tlinkStaffAndTabs(staffGroup.staffs); // crossreference tabs and staff\n}\n\nmodule.exports = tabRenderer;\n","var accidentals = {\n\t\"__\": -2,\n\t\"_\": -1,\n\t\"_/\": -0.5,\n\t\"=\": 0,\n\t\"\": 0,\n\t\"^/\": 0.5,\n\t\"^\": 1,\n\t\"^^\": 2\n}\n\nvar notesInOrder = ['C', '-', 'D', '-', 'E', 'F', '-', 'G', '-', 'A', '-', 'B', 'c', '-', 'd', '-', 'e', 'f', '-', 'g', '-', 'a', '-', 'b']\n\nfunction noteToMidi(note) {\n\tvar reg = note.match(/([_^\\/]*)([ABCDEFGabcdefg])(,*)('*)/)\n\tif (reg && reg.length === 5) {\n\t\tvar acc = accidentals[reg[1]]\n\t\tvar pitch = notesInOrder.indexOf(reg[2])\n\t\tvar octave = reg[4].length - reg[3].length\n\t\treturn 48 + pitch + acc + octave * 12;\n\t}\n\treturn 0;\n}\n\nfunction midiToNote(midi) {\n\tmidi = parseInt(midi, 10) // TODO-PER: not sure how to handle quarter sharps and flats, so strip them for now.\n\tvar octave = Math.floor(midi / 12)\n\tvar pitch = midi % 12\n\tvar name = notesInOrder[pitch]\n\tif (name === '-') {\n\t\tname = '^' + notesInOrder[pitch-1]\n\t}\n\t\n\tif (octave > 4) {\n\t\tname = name.toLowerCase()\n\t\toctave -= 5\n\t\twhile (octave > 0) {\n\t\t\tname += \"'\"\n\t\t\toctave--\n\t\t}\n\t} else {\n\t\twhile (octave < 4) {\n\t\t\tname += ','\n\t\t\toctave++\n\t\t}\n\t}\t\n\treturn name\n}\n\nmodule.exports = {noteToMidi: noteToMidi, midiToNote: midiToNote};\n","var { noteToMidi, midiToNote } = require('../../synth/note-to-midi');\n\n/**\n * \n * Note structure for Tabs\n * \n */\n\n\nfunction TabNote(note, clefTranspose) {\n\t//console.log(\"INIT/RENDER TabNote constructor\")\n\tvar pitch = noteToMidi(note)\n\tif (clefTranspose)\n\t\tpitch += clefTranspose\n\tvar newNote = midiToNote(pitch);\n\tvar isFlat = false;\n\tvar isSharp = false;\n\tvar isAltered = false;\n\tvar natural = null;\n\tvar quarter = null;\n\tvar isDouble = false;\n\tvar acc = 0;\n\n\tif (note.startsWith('_')) {\n\t\tisFlat = true;\n\t\tacc = -1;\n\t\t// check quarter flat\n\t\tif (note[1] == '/') {\n\t\t\tisFlat = false;\n\t\t\tquarter = \"v\";\n\t\t\tacc = 0;\n\t\t} else if (note[1] == '_') {\n\t\t\t// double flat\n\t\t\tisDouble = true;\n\t\t\tacc -= 1;\n\t\t}\n\t} else if (note.startsWith('^')) {\n\t\tisSharp = true;\n\t\tacc = +1;\n\t\t// check quarter sharp\n\t\tif (note[1] == '/') {\n\t\t\tisSharp = false;\n\t\t\tquarter = \"^\";\n\t\t\tacc = 0;\n\t\t} else if (note[1] == '^') {\n\t\t\t// double sharp\n\t\t\tisDouble = true;\n\t\t\tacc += 1;\n\t\t}\n\t} else if (note.startsWith('=')) {\n\t\tnatural = true;\n\t\tacc = 0;\n\t}\n\tisAltered = isFlat || isSharp || (quarter != null);\n\tif (isAltered || natural) {\n\t\tif ((quarter != null) || (isDouble)) {\n\t\t\tnewNote = note.slice(2);\n\t\t} else {\n\t\t\tnewNote = note.slice(1);\n\t\t}\n\t}\n\tvar hasComma = (newNote.match(/,/g) || []).length;\n\tvar hasQuote = (newNote.match(/'/g) || []).length;\n\n\tthis.pitch = pitch\n\tthis.pitchAltered = 0\n\tthis.name = newNote;\n\tthis.acc = acc;\n\tthis.isSharp = isSharp;\n\tthis.isKeySharp = false;\n\tthis.isDouble = isDouble;\n\tthis.isAltered = isAltered;\n\tthis.isFlat = isFlat;\n\tthis.isKeyFlat = false;\n\tthis.natural = natural;\n\tthis.quarter = quarter;\n\tthis.isLower = (this.name == this.name.toLowerCase());\n\tthis.name = this.name[0].toUpperCase();\n\tthis.hasComma = hasComma;\n\tthis.isQuoted = hasQuote;\n}\n\nfunction cloneNote(self) {\n\tvar newNote = self.name;\n\tvar newTabNote = new TabNote(newNote);\n\tnewTabNote.pitch = self.pitch;\n\tnewTabNote.hasComma = self.hasComma;\n\tnewTabNote.isLower = self.isLower;\n\tnewTabNote.isQuoted = self.isQuoted;\n\tnewTabNote.isSharp = self.isSharp;\n\tnewTabNote.isKeySharp = self.isKeySharp;\n\tnewTabNote.isFlat = self.isFlat;\n\tnewTabNote.isKeyFlat = self.isKeyFlat;\n\treturn newTabNote;\n}\nTabNote.prototype.sameNoteAs = function (note) {\n\t//console.log(\"INIT TabNote sameNoteAs\")\n\treturn note.pitch === this.pitch\n};\n\nTabNote.prototype.isLowerThan = function (note) {\n\t//console.log(\"INIT TabNote isLowerThan\")\n\treturn note.pitch > this.pitch\n};\n\nTabNote.prototype.checkKeyAccidentals = function (accidentals, measureAccidentals) {\n\t//console.log(\"RENDER TabNote checkKeyAccidentals\")\n\tif (this.isAltered || this.natural)\n\t\treturn\n\tif (measureAccidentals[this.name.toUpperCase()]) {\n\t\tswitch (measureAccidentals[this.name.toUpperCase()]) {\n\t\t\tcase \"__\": this.acc = -2; this.pitchAltered = -2; return;\n\t\t\tcase \"_\": this.acc = -1; this.pitchAltered = -1; return;\n\t\t\tcase \"=\": this.acc = 0; this.pitchAltered = 0; return;\n\t\t\tcase \"^\": this.acc = 1; this.pitchAltered = 1; return;\n\t\t\tcase \"^^\": this.acc = 2; this.pitchAltered = 2; return;\n\t\t}\n\t} else if (accidentals) {\n\t\tvar curNote = this.name;\n\t\tfor (var iii = 0; iii < accidentals.length; iii++) {\n\t\t\tvar curAccidentals = accidentals[iii];\n\t\t\tif (curNote == curAccidentals.note.toUpperCase()) {\n\t\t\t\tif (curAccidentals.acc == 'flat') {\n\t\t\t\t\tthis.acc = -1;\n\t\t\t\t\tthis.isKeyFlat = true;\n\t\t\t\t\tthis.pitchAltered = -1\n\t\t\t\t}\n\t\t\t\tif (curAccidentals.acc == 'sharp') {\n\t\t\t\t\tthis.acc = +1;\n\t\t\t\t\tthis.isKeySharp = true;\n\t\t\t\t\tthis.pitchAltered = 1\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\nTabNote.prototype.getAccidentalEquiv = function () {\n\t//console.log(\"TabNote getAccidentalEquiv\")\n\tvar cloned = cloneNote(this);\n\tif (cloned.isSharp || cloned.isKeySharp) {\n\t\tcloned = cloned.nextNote();\n\t\tcloned.isFlat = true;\n\t\tcloned.isSharp = false;\n\t\tcloned.isKeySharp = false;\n\t} else if (cloned.isFlat || cloned.isKeyFlat) {\n\t\tcloned = cloned.prevNote();\n\t\tcloned.isSharp = true;\n\t\tcloned.isFlat = false;\n\t\tcloned.isKeyFlat = false;\n\t}\n\treturn cloned;\n};\n\n\nTabNote.prototype.nextNote = function () {\n\t//console.log(\"INIT TabNote nextNote\")\n\tvar note = midiToNote(this.pitch + 1 + this.pitchAltered)\n\treturn new TabNote(note)\n};\n\nTabNote.prototype.prevNote = function () {\n\t//console.log(\"TabNote prevNote\")\n\tvar note = midiToNote(this.pitch - 1 + this.pitchAltered)\n\treturn new TabNote(note)\n};\n\nTabNote.prototype.emitNoAccidentals = function () {\n\t//console.log(\"TabNote emitNoAccidentals\")\n\tvar returned = this.name;\n\tif (this.isLower) {\n\t\treturned = returned.toLowerCase();\n\t}\n\tfor (var ii = 0; ii < this.isQuoted; ii++) {\n\t\treturned += \"'\";\n\t}\n\tfor (var jj = 0; jj < this.hasComma; jj++) {\n\t\treturned += \",\";\n\t}\n\treturn returned;\n};\n\nTabNote.prototype.emit = function () {\n\t//console.log(\"INIT/RENDER TabNote emit\")\n\tvar returned = this.name;\n\tif (this.isSharp || this.isKeySharp) {\n\t\treturned = '^' + returned;\n\t\tif (this.isDouble) {\n\t\t\treturned = '^' + returned;\n\t\t}\n\t}\n\tif (this.isFlat || this.isKeyFlat) {\n\t\treturned = '_' + returned;\n\t\tif (this.isDouble) {\n\t\t\treturned = '_' + returned;\n\t\t}\n\t}\n\tif (this.quarter) {\n\t\tif (this.quarter == \"^\") {\n\t\t\treturned = \"^/\" + returned;\n\t\t} else {\n\t\t\treturned = \"_/\" + returned;\n\t\t}\n\t}\n\tif (this.natural) {\n\t\treturned = '=' + returned;\n\t}\n\tfor (var ii = 1; ii <= this.hasComma; ii++) {\n\t\treturned += ',';\n\t}\n\n\tif (this.isLower) {\n\t\treturned = returned.toLowerCase();\n\t\tfor (var jj = 1; jj <= this.isQuoted; jj++) {\n\t\t\treturned += \"'\";\n\t\t}\n\t}\n\treturn returned;\n};\n\nmodule.exports = TabNote\n","\nvar TabNote = require('./tab-note');\n\nvar notes = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];\n\nfunction tabNotes(fromNote, toNote) {\n\t//console.log(\"INIT TabNotes\")\n\tvar fromN = new TabNote(fromNote);\n\tvar toN = new TabNote(toNote);\n\t// check that toN is not lower than fromN\n\tif (toN.isLowerThan(fromN)) {\n\t\tvar from = fromN.emit();\n\t\tvar tn = toN.emit();\n\t\treturn {\n\t\t\terror: 'Invalid string Instrument tuning : ' +\n\t\t\t\ttn + ' string lower than ' + from + ' string'\n\t\t};\n\t}\n\tvar buildReturned = [];\n\tvar startIndex = notes.indexOf(fromN.name);\n\tvar toIndex = notes.indexOf(toN.name);\n\tif ((startIndex == -1) || (toIndex == -1)) {\n\t\treturn buildReturned;\n\t}\n\tvar finished = false;\n\twhile (!finished) {\n\t\tbuildReturned.push(fromN.emit());\n\t\tfromN = fromN.nextNote();\n\t\tif (fromN.sameNoteAs(toN)) {\n\t\t\tfinished = true;\n\t\t}\n\t}\n\treturn buildReturned;\n}\n\nmodule.exports = tabNotes;\n","const { noteToMidi } = require('../../synth/note-to-midi');\nvar TabNote = require('./tab-note');\nvar tabNotes = require('./tab-notes');\n\n\nfunction buildCapo(self) {\n\tvar capoTuning = null;\n\tvar tuning = self.tuning;\n\tif (self.capo > 0) {\n\t\tcapoTuning = [];\n\t\tfor (var iii = 0; iii < tuning.length; iii++) {\n\t\t\tvar curNote = new TabNote(tuning[iii]);\n\t\t\tfor (var jjj = 0; jjj < self.capo; jjj++) {\n\t\t\t\tcurNote = curNote.nextNote();\n\t\t\t}\n\t\t\tcapoTuning[iii] = curNote.emit();\n\t\t}\n\t}\n\treturn capoTuning;\n}\n\nfunction buildPatterns(self) {\n\tvar strings = [];\n\tvar tuning = self.tuning;\n\tif (self.capo > 0) {\n\t\ttuning = self.capoTuning;\n\t}\n\tvar pos = tuning.length - 1;\n\tfor (var iii = 0; iii < tuning.length; iii++) {\n\t\tvar nextNote = self.highestNote; // highest handled note\n\t\tif (iii != tuning.length - 1) {\n\t\t\tnextNote = tuning[iii + 1];\n\t\t}\n\t\tvar stringNotes = tabNotes(tuning[iii], nextNote);\n\t\tif (stringNotes.error) {\n\t\t\treturn stringNotes;\n\t\t}\n\t\tstrings[pos--] = stringNotes;\n\t}\n\treturn strings;\n}\n\n\nfunction buildSecond(first) {\n\tvar seconds = [];\n\tseconds[0] = [];\n\tvar strings = first.strings;\n\tfor (var iii = 1; iii < strings.length; iii++) {\n\t\tseconds[iii] = strings[iii - 1];\n\t}\n\treturn seconds;\n}\n\nfunction sameString(self, chord) {\n\tfor (var jjjj = 0; jjjj < chord.length - 1; jjjj++) {\n\t\tvar curPos = chord[jjjj];\n\t\tvar nextPos = chord[jjjj + 1];\n\t\tif (curPos.str == nextPos.str) {\n\t\t\t// same String\n\t\t\t// => change lower pos \n\t\t\tif (curPos.str == self.strings.length - 1) {\n\t\t\t\t// Invalid tab Chord position for instrument\n\t\t\t\tcurPos.num = \"?\";\n\t\t\t\tnextPos.num = \"?\";\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// change lower pitch on lowest string\n\t\t\tif (nextPos.num < curPos.num) {\n\t\t\t\tnextPos.str++;\n\t\t\t\tnextPos = noteToNumber(self,\n\t\t\t\t\tnextPos.note,\n\t\t\t\t\tnextPos.str,\n\t\t\t\t\tself.secondPos,\n\t\t\t\t\tself.strings[nextPos.str].length\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tcurPos.str++;\n\t\t\t\tcurPos = noteToNumber(self,\n\t\t\t\t\tcurPos.note,\n\t\t\t\t\tcurPos.str,\n\t\t\t\t\tself.secondPos,\n\t\t\t\t\tself.strings[curPos.str].length\n\t\t\t\t);\n\t\t\t}\n\t\t\t// update table\n\t\t\tchord[jjjj] = curPos;\n\t\t\tchord[jjjj + 1] = nextPos;\n\t\t}\n\t}\n\treturn null;\n}\n\nfunction handleChordNotes(self, notes) {\n\tvar retNotes = [];\n\tfor (var iiii = 0; iiii < notes.length; iiii++) {\n\t\tif (notes[iiii].endTie)\n\t\t\tcontinue;\n\t\tvar note = new TabNote(notes[iiii].name, self.clefTranspose);\n\t\tnote.checkKeyAccidentals(self.accidentals, self.measureAccidentals)\n\t\tvar curPos = toNumber(self, note);\n\t\tretNotes.push(curPos);\n\t}\n\tsameString(self, retNotes);\n\treturn retNotes;\n}\n\nfunction noteToNumber(self, note, stringNumber, secondPosition, firstSize) {\n\tvar strings = self.strings;\n\tnote.checkKeyAccidentals(self.accidentals, self.measureAccidentals);\n\tif (secondPosition) {\n\t\tstrings = secondPosition;\n\t}\n\tvar noteName = note.emitNoAccidentals();\n\tvar num = strings[stringNumber].indexOf(noteName);\n\tvar acc = note.acc;\n\tif (num != -1) {\n\t\tif (secondPosition) {\n\t\t\tnum += firstSize;\n\t\t}\n\t\tif ((note.isFlat || note.acc == -1) && (num == 0)) {\n\t\t\t// flat on 0 pos => previous string 7th position\n\t\t\tvar noteEquiv = note.getAccidentalEquiv();\n\t\t\tstringNumber++;\n\t\t\tnum = strings[stringNumber].indexOf(noteEquiv.emit());\n\t\t\tacc = 0;\n\t\t}\n\t\treturn {\n\t\t\tnum: (num + acc),\n\t\t\tstr: stringNumber,\n\t\t\tnote: note\n\t\t};\n\t}\n\treturn null;\n}\n\nfunction toNumber(self, note) {\n\tif (note.isAltered || note.natural) {\n\t\tvar acc;\n\t\tif (note.isFlat) {\n\t\t\tif (note.isDouble)\n\t\t\t\tacc = \"__\"\n\t\t\telse\n\t\t\t\tacc = \"_\"\n\t\t} else if (note.isSharp) {\n\t\t\tif (note.isDouble)\n\t\t\t\tacc = \"^^\"\n\t\t\telse\n\t\t\t\tacc = \"^\"\n\t\t} else if (note.natural)\n\t\t\tacc = \"=\"\n\t\tself.measureAccidentals[note.name.toUpperCase()] = acc\n\t}\n\tfor (var i = self.stringPitches.length - 1; i >= 0; i--) {\n\t\tif (note.pitch + note.pitchAltered >= self.stringPitches[i]) {\n\t\t\tvar num = note.pitch + note.pitchAltered - self.stringPitches[i]\n\t\t\tif (note.quarter === '^') num -= 0.5\n\t\t\telse if (note.quarter === \"v\") num += 0.5\n\t\t\treturn {\n\t\t\t\tnum: Math.round(num),\n\t\t\t\tstr: self.stringPitches.length - 1 - i, // reverse the strings because string 0 is on the bottom\n\t\t\t\tnote: note\n\t\t\t}\n\t\t}\n\t}\n\treturn {\n\t\tnum: \"?\",\n\t\tstr: self.stringPitches.length - 1,\n\t\tnote: note,\n\t};\n}\n\nStringPatterns.prototype.stringToPitch = function (stringNumber) {\n\tvar startingPitch = 5.3;\n\tvar bottom = this.strings.length - 1;\n\treturn startingPitch + ((bottom - stringNumber) * this.linePitch);\n};\n\nfunction invalidNumber(retNotes, note) {\n\tvar number = {\n\t\tnum: \"?\",\n\t\tstr: 0,\n\t\tnote: note\n\t};\n\tretNotes.push(number);\n\tretNotes.error = note.emit() + ': unexpected note for instrument';\n}\n\nStringPatterns.prototype.notesToNumber = function (notes, graces) {\n\tvar note;\n\tvar number;\n\tvar error = null;\n\tvar retNotes = null;\n\tif (notes) {\n\t\tretNotes = [];\n\t\tif (notes.length > 1) {\n\t\t\tretNotes = handleChordNotes(this, notes);\n\t\t\tif (retNotes.error) {\n\t\t\t\terror = retNotes.error;\n\t\t\t}\n\t\t} else {\n\t\t\tif (!notes[0].endTie) {\n\t\t\t\tnote = new TabNote(notes[0].name, this.clefTranspose);\n\t\t\t\tnote.checkKeyAccidentals(this.accidentals, this.measureAccidentals)\n\t\t\t\tnumber = toNumber(this, note);\n\t\t\t\tif (number) {\n\t\t\t\t\tretNotes.push(number);\n\t\t\t\t} else {\n\t\t\t\t\tinvalidNumber(retNotes, note);\n\t\t\t\t\terror = retNotes.error;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tif (error) return retNotes;\n\tvar retGraces = null;\n\tif (graces) {\n\t\tretGraces = [];\n\t\tfor (var iiii = 0; iiii < graces.length; iiii++) {\n\t\t\tnote = new TabNote(graces[iiii].name, this.clefTranspose);\n\t\t\tnote.checkKeyAccidentals(this.accidentals, this.measureAccidentals)\n\t\t\tnumber = toNumber(this, note);\n\t\t\tif (number) {\n\t\t\t\tretGraces.push(number);\n\t\t\t} else {\n\t\t\t\tinvalidNumber(retGraces, note);\n\t\t\t\terror = retNotes.error;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\tnotes: retNotes,\n\t\tgraces: retGraces,\n\t\terror: error\n\t};\n};\n\nStringPatterns.prototype.toString = function () {\n\tvar arr = []\n\tfor (var i = 0; i < this.tuning.length; i++) {\n\t\tvar str = this.tuning[i].replaceAll(',', '').replaceAll(\"'\", '').toUpperCase();\n\t\tif (str[0] === '_') str = str[1] + 'b '\n\t\telse if (str[0] === '^') str = str[1] + \"# \"\n\t\tarr.push(str)\n\t}\n\treturn arr.join('');\n};\n\nStringPatterns.prototype.tabInfos = function (plugin) {\n\tvar name = plugin.params.label;\n\tif (name) {\n\t\tvar tunePos = name.indexOf('%T');\n\t\tvar tuning = \"\";\n\t\tif (tunePos != -1) {\n\t\t\ttuning = this.toString();\n\t\t\tif (plugin.capo > 0) {\n\t\t\t\ttuning += ' capo:' + plugin.capo;\n\t\t\t}\n\t\t\tname = name.replace('%T', tuning);\n\t\t}\n\t\treturn name;\n\t}\n\treturn '';\n};\n\n// MAE 27 Nov 2023\nStringPatterns.prototype.suppress = function (plugin) {\n\tvar suppress = plugin.params.suppress;\n\tif (suppress) {\n\t\treturn true;\n\t}\n\treturn false;\n};\n// MAE 27 Nov 2023 End\n\n/**\n * Common patterns for all string instruments\n * @param {} plugin\n * @param {} tuning\n * @param {*} capo\n * @param {*} highestNote \n */\nfunction StringPatterns(plugin) {\n\t//console.log(\"INIT StringPatterns constructor\")\n\tvar tuning = plugin.tuning;\n\tvar capo = plugin.capo;\n\tvar highestNote = plugin.params.highestNote;\n\tthis.linePitch = plugin.linePitch;\n\tthis.highestNote = \"a'\";\n\tif (highestNote) {\n\t\t// override default\n\t\tthis.highestNote = highestNote;\n\t}\n\tthis.measureAccidentals = {}\n\tthis.capo = 0;\n\tif (capo) {\n\t\tthis.capo = parseInt(capo, 10);\n\t}\n\tthis.transpose = plugin.transpose ? plugin.transpose : 0\n\tthis.tuning = tuning;\n\tthis.stringPitches = []\n\tfor (var i = 0; i < this.tuning.length; i++) {\n\t\tvar pitch = noteToMidi(this.tuning[i]) + this.capo\n\t\tthis.stringPitches.push(pitch)\n\t}\n\tif (this.capo > 0) {\n\t\tthis.capoTuning = buildCapo(this);\n\t}\n\tthis.strings = buildPatterns(this);\n\tif (this.strings.error) {\n\t\tplugin.setError(this.strings.error);\n\t\tplugin.inError = true;\n\t\treturn;\n\t}\n\t// second position pattern per string\n\tthis.secondPos = buildSecond(this);\n}\n\n\n\nmodule.exports = StringPatterns;","\nvar StringTablature = require('./string-tablature');\nvar tabRenderer = require('../render/tab-renderer');\nvar StringPatterns = require('./string-patterns');\n\n\n/**\n * upon init mainly store provided instances for later usage\n * @param {*} abcTune the parsed tune AST tree\n * @param {*} tuneNumber the parsed tune AST tree\n * @param {*} params complementary args provided to Tablature Plugin\n */\nPlugin.prototype.init = function (abcTune, tuneNumber, params, tabSettings) {\n\t//console.log(\"INIT AbcStringTab Plugin.init\")\n\tthis.tune = abcTune;\n\tthis.params = params;\n\tthis.tuneNumber = tuneNumber;\n\tthis.inError = false;\n\tthis.abcTune = abcTune;\n\tthis.linePitch = 3;\n\tthis.nbLines = tabSettings.defaultTuning.length;\n\tthis.isTabBig = tabSettings.isTabBig;\n\tthis.tabSymbolOffset = tabSettings.tabSymbolOffset;\n\tthis.capo = params.capo;\n\tthis.transpose = params.visualTranspose;\n\tthis.hideTabSymbol = params.hideTabSymbol;\n\tthis.tablature = new StringTablature(this.nbLines, this.linePitch);\n\tvar tuning = params.tuning;\n\tif (!tuning) {\n\t\ttuning = tabSettings.defaultTuning;\n\t}\n\tthis.tuning = tuning;\n\tthis.semantics = new StringPatterns(this);\n};\n\nPlugin.prototype.setError = function (error) {\n\t//console.log(\"Plugin setError\")\n\tif (error) {\n\t\tthis.error = error;\n\t\tthis.inError = true;\n\t\tif (this.tune.warnings) {\n\t\t\tthis.tune.warnings.push(error);\n\t\t} else {\n\t\t\tthis.tune.warnings = [error];\n\t\t}\n\t}\n};\n\nPlugin.prototype.render = function (renderer, line, staffIndex) {\n\t//console.log(\"RENDER AbcStringTab Plugin.render\")\n\tif (this.inError) return;\n\tif (this.tablature.bypass(line)) return;\n\ttabRenderer(this, renderer, line, staffIndex);\n};\n\nfunction Plugin() { }\n\n//\n// Tablature plugin definition\n//\nvar AbcStringTab = function () {\n\treturn { name: 'StringTab', tablature: Plugin };\n};\n\nmodule.exports = AbcStringTab;\n","/*\n * Tablature Plugins\n * tablature are defined dynamically and registered inside abcjs\n * by calling abcTablatures.register(plugin) \n * where plugin represents a plugin instance \n * \n */\n\n// This is the only entry point to the tablatures. It is called both after parsing a tune and just before engraving\n\nvar TabString = require('./instruments/tab-string');\n\n/* extend the table below when adding a new instrument plugin */\n\n// Existing tab classes \nvar pluginTab = {\n\t'violin': { name: 'StringTab', defaultTuning: ['G,', 'D', 'A', 'e'], isTabBig: false, tabSymbolOffset: 0 },\n\t'fiddle': { name: 'StringTab', defaultTuning: ['G,', 'D', 'A', 'e'], isTabBig: false, tabSymbolOffset: 0 },\n\t'mandolin': { name: 'StringTab', defaultTuning: ['G,', 'D', 'A', 'e'], isTabBig: false, tabSymbolOffset: 0 },\n\t'guitar': { name: 'StringTab', defaultTuning: ['E,', 'A,', 'D', 'G', 'B', 'e'], isTabBig: true, tabSymbolOffset: 0 },\n\t'fiveString': { name: 'StringTab', defaultTuning: ['C,', 'G,', 'D', 'A', 'e'], isTabBig: false, tabSymbolOffset: -.95 },\n};\n\nvar abcTablatures = {\n\n\tinited: false,\n\tplugins: {},\n\n\n\t/**\n\t * to be called once per plugin for registration \n\t * @param {*} plugin \n\t */\n\tregister: function (plugin) {\n\t\tvar name = plugin.name;\n\t\tvar tablature = plugin.tablature;\n\t\tthis.plugins[name] = tablature;\n\t},\n\n\tsetError: function (tune, msg) {\n\t\tif (tune.warnings) {\n\t\t\ttune.warning.push(msg);\n\t\t} else {\n\t\t\ttune.warnings = [msg];\n\t\t}\n\t},\n\n\t/**\n\t * handle params for current processed score\n\t * @param {*} tune current tune \n\t * @param {*} tuneNumber number in tune list\n\t * @param {*} params params to be processed for tablature\n\t * @return prepared tablatures plugin instances for current tune\n\t */\n\tpreparePlugins: function (tune, tuneNumber, params) {\n\t\t// Called after parsing a tune and before engraving it\n\t\tif (!this.inited) {\n\t\t\t// TODO-PER: I don't think this is needed - the plugin array can be hard coded, right?\n\t\t\tthis.register(new TabString());\n\t\t\tthis.inited = true;\n\t\t}\n\t\tvar returned = null;\n\t\tvar nbPlugins = 0;\n\t\tif (params.tablature) {\n\t\t\t// validate requested plugins \n\t\t\tvar tabs = params.tablature;\n\t\t\treturned = [];\n\t\t\tfor (var ii = 0; ii < tabs.length; ii++) {\n\t\t\t\tvar args = tabs[ii];\n\t\t\t\tvar instrument = args['instrument'];\n\t\t\t\tif (instrument == null) {\n\t\t\t\t\tthis.setError(tune, \"tablature 'instrument' is missing\");\n\t\t\t\t\treturn returned;\n\t\t\t\t}\n\t\t\t\tvar tabName = pluginTab[instrument];\n\t\t\t\tvar plugin = null;\n\t\t\t\tif (tabName) {\n\t\t\t\t\tplugin = this.plugins[tabName.name];\n\t\t\t\t}\n\t\t\t\tif (plugin) {\n\t\t\t\t\tif (params.visualTranspose != 0) {\n\t\t\t\t\t\t// populate transposition request to tabs\n\t\t\t\t\t\targs.visualTranspose = params.visualTranspose;\n\t\t\t\t\t}\n\t\t\t\t\targs.abcSrc = params.tablature.abcSrc;\n\t\t\t\t\tvar pluginInstance = {\n\t\t\t\t\t\tclassz: plugin,\n\t\t\t\t\t\ttuneNumber: tuneNumber,\n\t\t\t\t\t\tparams: args,\n\t\t\t\t\t\tinstance: null,\n\t\t\t\t\t\ttabType: tabName,\n\t\t\t\t\t};\n\t\t\t\t\t// proceed with tab plugin init \n\t\t\t\t\t// plugin.init(tune, tuneNumber, args, ii);\n\t\t\t\t\treturned.push(pluginInstance);\n\t\t\t\t\tnbPlugins++;\n\t\t\t\t} else if (instrument === '') {\n\t\t\t\t\t// create a placeholder - there is no tab for this staff\n\t\t\t\t\treturned.push(null)\n\t\t\t\t} else {\n\t\t\t\t\t// unknown tab plugin \n\t\t\t\t\t//this.emit_error('Undefined tablature plugin: ' + tabName)\n\t\t\t\t\tthis.setError(tune, 'Undefined tablature plugin: ' + instrument);\n\t\t\t\t\treturn returned;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn returned;\n\t},\n\n\t/**\n\t * Call requested plugin\n\t * @param {*} renderer \n\t * @param {*} abcTune \n\t */\n\tlayoutTablatures: function layoutTablatures(renderer, abcTune) {\n\t\tvar tabs = abcTune.tablatures;\n\n\t\t// chack tabs request for each staffs\n\t\tvar staffLineCount = 0;\n\n\t\t// Clear the suppression flag\n\t\tif (tabs && (tabs.length > 0)) {\n\t\t\tvar nTabs = tabs.length;\n\t\t\tfor (var kk = 0; kk < nTabs; ++kk) {\n\t\t\t\tif (tabs[kk] && tabs[kk].params.firstStaffOnly) {\n\t\t\t\t\ttabs[kk].params.suppress = false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (var ii = 0; ii < abcTune.lines.length; ii++) {\n\t\t\tvar line = abcTune.lines[ii];\n\n\t\t\tif (line.staff) {\n\t\t\t\tstaffLineCount++;\n\t\t\t}\n\n\t\t\t// MAE 27Nov2023\n\t\t\t// If tab param \"firstStaffOnly\", remove the tab label after the first staff\n\t\t\tif (staffLineCount > 1) {\n\t\t\t\tif (tabs && (tabs.length > 0)) {\n\t\t\t\t\tvar nTabs = tabs.length;\n\t\t\t\t\tfor (var kk = 0; kk < nTabs; ++kk) {\n\t\t\t\t\t\tif (tabs[kk].params.firstStaffOnly) {\n\t\t\t\t\t\t\t// Set the staff draw suppression flag\n\t\t\t\t\t\t\ttabs[kk].params.suppress = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar curStaff = line.staff;\n\t\t\tif (curStaff) {\n\t\t\t\tvar maxStaves = curStaff.length\n\t\t\t\tfor (var jj = 0; jj < curStaff.length; jj++) {\n\n\t\t\t\t\tif (tabs[jj] && jj < maxStaves) {\n\t\t\t\t\t\t// tablature requested for staff\n\t\t\t\t\t\tvar tabPlugin = tabs[jj];\n\t\t\t\t\t\tif (tabPlugin.instance == null) {\n\t\t\t\t\t\t\t//console.log(\"★★★★ Tab Init line: \" + ii + \" staff: \" + jj)\n\t\t\t\t\t\t\ttabPlugin.instance = new tabPlugin.classz();\n\t\t\t\t\t\t\t// plugin.init(tune, tuneNumber, args, ii);\n\t\t\t\t\t\t\t// call initer first\n\t\t\t\t\t\t\ttabPlugin.instance.init(abcTune,\n\t\t\t\t\t\t\t\ttabPlugin.tuneNumber,\n\t\t\t\t\t\t\t\ttabPlugin.params,\n\t\t\t\t\t\t\t\ttabPlugin.tabType\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// render next\n\t\t\t\t\t\t//console.log(\"★★★★ Tab Render line: \" + ii + \" staff: \" + jj)\n\t\t\t\t\t\ttabPlugin.instance.render(renderer, line, jj);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n};\n\n\nmodule.exports = abcTablatures;\n","// abc_tunebook.js: splits a string representing ABC Music Notation into individual tunes.\n\nvar Parse = require('../parse/abc_parse');\nvar bookParser = require('../parse/abc_parse_book');\nvar tablatures = require('../tablatures/abc_tablatures');\n\n\nvar tunebook = {};\n\n(function() {\n\t\"use strict\";\n\n\ttunebook.numberOfTunes = function(abc) {\n\t\tvar tunes = abc.split(\"\\nX:\");\n\t\tvar num = tunes.length;\n\t\tif (num === 0) num = 1;\n\t\treturn num;\n\t};\n\n\tvar TuneBook = tunebook.TuneBook = function(book) {\n\t\tvar parsed = bookParser(book);\n\t\tthis.header = parsed.header;\n\t\tthis.tunes = parsed.tunes;\n\t};\n\n\tTuneBook.prototype.getTuneById = function(id) {\n\t\tfor (var i = 0; i < this.tunes.length; i++) {\n\t\t\tif (this.tunes[i].id === ''+id)\n\t\t\t\treturn this.tunes[i];\n\t\t}\n\t\treturn null;\n\t};\n\n\tTuneBook.prototype.getTuneByTitle = function(title) {\n\t\tfor (var i = 0; i < this.tunes.length; i++) {\n\t\t\tif (this.tunes[i].title === title)\n\t\t\t\treturn this.tunes[i];\n\t\t}\n\t\treturn null;\n\t};\n\n\ttunebook.parseOnly = function(abc, params) {\n\t\tvar numTunes = tunebook.numberOfTunes(abc);\n\n\t\t// this just needs to be passed in because this tells the engine how many tunes to process.\n\t\tvar output = [];\n\t\tfor (var i = 0; i < numTunes; i++) {\n\t\t\toutput.push(1);\n\t\t}\n\t\tfunction callback() {\n\t\t\t// Don't need to do anything with the parsed tunes.\n\t\t}\n\t\treturn tunebook.renderEngine(callback, output, abc, params);\n\t};\n\n\ttunebook.renderEngine = function (callback, output, abc, params) {\n\t\tvar ret = [];\n\t\tvar isArray = function(testObject) {\n\t\t\treturn testObject && !(testObject.propertyIsEnumerable('length')) && typeof testObject === 'object' && typeof testObject.length === 'number';\n\t\t};\n\n\t\t// check and normalize input parameters\n\t\tif (output === undefined || abc === undefined)\n\t\t\treturn;\n\t\tif (!isArray(output))\n\t\t\toutput = [ output ];\n\t\tif (params === undefined)\n\t\t\tparams = {};\n\t\tvar currentTune = params.startingTune ? parseInt(params.startingTune, 10) : 0;\n\n\t\t// parse the abc string\n\t\tvar book = new TuneBook(abc);\n\t\tvar abcParser = new Parse();\n\n\t\t// output each tune, if it exists. Otherwise clear the div.\n\t\tfor (var i = 0; i < output.length; i++) {\n\t\t\tvar div = output[i];\n\t\t\tif (div === \"*\") {\n\t\t\t\t// This is for \"headless\" rendering: doing the work but not showing the svg.\n\t\t\t} else if (typeof(div) === \"string\")\n\t\t\t\tdiv = document.getElementById(div);\n\t\t\tif (div) {\n\t\t\t\tif (currentTune >= 0 && currentTune < book.tunes.length) {\n\t\t\t\t\tabcParser.parse(book.tunes[currentTune].abc, params, book.tunes[currentTune].startPos - book.header.length);\n\t\t\t\t\tvar tune = abcParser.getTune();\n\t\t\t\t\t//\n\t\t\t\t\t// Init tablatures plugins\n\t\t\t\t\t//\n\t\t\t\t\tif (params.tablature) {\n\t\t\t\t\t\ttune.tablatures = tablatures.preparePlugins(tune, currentTune, params);\n\t\t\t\t\t}\n\t\t\t\t\tvar warnings = abcParser.getWarnings();\n\t\t\t\t\tif (warnings)\n\t\t\t\t\t\ttune.warnings = warnings;\n\t\t\t\t\tvar override = callback(div, tune, i, book.tunes[currentTune].abc);\n\t\t\t\t\tret.push(override ? override : tune);\n\t\t\t\t} else {\n\t\t\t\t\tif (div['innerHTML'])\n\t\t\t\t\t\tdiv.innerHTML = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tcurrentTune++;\n\t\t}\n\t return ret;\n\t};\n\n\tfunction flattenTune(tuneObj) {\n\t\t// This removes the line breaks and removes the non-music lines.\n\t\tvar staves = [];\n\t\tfor (var j = 0; j < tuneObj.lines.length; j++) {\n\t\t\tvar line = tuneObj.lines[j];\n\t\t\tif (line.staff) {\n\t\t\t\tfor (var k = 0; k < line.staff.length; k++) {\n\t\t\t\t\tvar staff = line.staff[k];\n\t\t\t\t\tif (!staves[k])\n\t\t\t\t\t\tstaves[k] = staff;\n\t\t\t\t\telse {\n\t\t\t\t\t\tfor (var i = 0; i < staff.voices.length; i++) {\n\t\t\t\t\t\t\tif (staves[k].voices[i])\n\t\t\t\t\t\t\t\tstaves[k].voices[i] = staves[k].voices[i].concat(staff.voices[i]);\n\t\t\t\t\t\t\t// TODO-PER: If staves[k].voices[i] doesn't exist, that means a voice appeared in the middle of the tune. That isn't handled yet.\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn staves;\n\t}\n\n\tfunction measuresParser(staff, tune) {\n\t\tvar voices = [];\n\t\tvar lastChord = null;\n\t\tvar measureStartChord = null;\n\t\tvar fragStart = null;\n\t\tvar hasNotes = false;\n\n\t\tfor (var i = 0; i < staff.voices.length; i++) {\n\t\t\tvar voice = staff.voices[i];\n\t\t\tvoices.push([]);\n\t\t\tfor (var j = 0; j < voice.length; j++) {\n\t\t\t\tvar elem = voice[j];\n\t\t\t\tif (fragStart === null && elem.startChar >= 0) {\n\t\t\t\t\tfragStart = elem.startChar;\n\t\t\t\t\tif (elem.chord === undefined)\n\t\t\t\t\t\tmeasureStartChord = lastChord;\n\t\t\t\t\telse\n\t\t\t\t\t\tmeasureStartChord = null;\n\t\t\t\t}\n\t\t\t\tif (elem.chord)\n\t\t\t\t\tlastChord = elem;\n\t\t\t\tif (elem.el_type === 'bar') {\n\t\t\t\t\tif (hasNotes) {\n\t\t\t\t\t\tvar frag = tune.abc.substring(fragStart, elem.endChar);\n\t\t\t\t\t\tvar measure = {abc: frag};\n\t\t\t\t\t\tlastChord = measureStartChord && measureStartChord.chord && measureStartChord.chord.length > 0 ? measureStartChord.chord[0].name : null;\n\t\t\t\t\t\tif (lastChord)\n\t\t\t\t\t\t\tmeasure.lastChord = lastChord;\n\t\t\t\t\t\tif (elem.startEnding)\n\t\t\t\t\t\t\tmeasure.startEnding = elem.startEnding;\n\t\t\t\t\t\tif (elem.endEnding)\n\t\t\t\t\t\t\tmeasure.endEnding = elem.endEnding;\n\t\t\t\t\t\tvoices[i].push(measure);\n\t\t\t\t\t\tfragStart = null;\n\t\t\t\t\t\thasNotes = false;\n\t\t\t\t\t}\n\t\t\t\t} else if (elem.el_type === 'note') {\n\t\t\t\t\thasNotes = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn voices;\n\t}\n\n\ttunebook.extractMeasures = function(abc) {\n\t\tvar tunes = [];\n\t\tvar book = new TuneBook(abc);\n\t\tfor (var i = 0; i < book.tunes.length; i++) {\n\t\t\tvar tune = book.tunes[i];\n\t\t\tvar arr = tune.abc.split(\"K:\");\n\t\t\tvar arr2 = arr[1].split(\"\\n\");\n\t\t\tvar header = arr[0] + \"K:\" + arr2[0] + \"\\n\";\n\t\t\tvar lastChord = null;\n\t\t\tvar measureStartChord = null;\n\t\t\tvar fragStart = null;\n\t\t\tvar measures = [];\n\t\t\tvar hasNotes = false;\n\t\t\tvar tuneObj = tunebook.parseOnly(tune.abc)[0];\n\t\t\tvar hasPickup = tuneObj.getPickupLength() > 0;\n\t\t\t// var staves = flattenTune(tuneObj);\n\t\t\t// for (var s = 0; s < staves.length; s++) {\n\t\t\t// \tvar voices = measuresParser(staves[s], tune);\n\t\t\t// \tif (s === 0)\n\t\t\t// \t\tmeasures = voices;\n\t\t\t// \telse {\n\t\t\t// \t\tfor (var ss = 0; ss < voices.length; ss++) {\n\t\t\t// \t\t\tvar voice = voices[ss];\n\t\t\t// \t\t\tif (measures.length <= ss)\n\t\t\t// \t\t\t\tmeasures.push([]);\n\t\t\t// \t\t\tvar measureVoice = measures[ss];\n\t\t\t// \t\t\tfor (var sss = 0; sss < voice.length; sss++) {\n\t\t\t// \t\t\t\tif (measureVoice.length > sss)\n\t\t\t// \t\t\t\t\tmeasureVoice[sss].abc += \"\\n\" + voice[sss].abc;\n\t\t\t// \t\t\t\telse\n\t\t\t// \t\t\t\t\tmeasures.push(voice[sss]);\n\t\t\t// \t\t\t}\n\t\t\t// \t\t}\n\t\t\t// \t}\n\t\t\t// \tconsole.log(voices);\n\t\t\t// }\n\t\t\t// measures = measures[0];\n\n\t\t\tfor (var j = 0; j < tuneObj.lines.length; j++) {\n\t\t\t\tvar line = tuneObj.lines[j];\n\t\t\t\tif (line.staff) {\n\t\t\t\t\tfor (var k = 0; k < 1 /*line.staff.length*/; k++) {\n\t\t\t\t\t\tvar staff = line.staff[k];\n\t\t\t\t\t\tfor (var kk = 0; kk < 1 /*staff.voices.length*/; kk++) {\n\t\t\t\t\t\t\tvar voice = staff.voices[kk];\n\t\t\t\t\t\t\tfor (var kkk = 0; kkk < voice.length; kkk++) {\n\t\t\t\t\t\t\t\tvar elem = voice[kkk];\n\t\t\t\t\t\t\t\tif (fragStart === null && elem.startChar >= 0) {\n\t\t\t\t\t\t\t\t\tfragStart = elem.startChar;\n\t\t\t\t\t\t\t\t\tif (elem.chord === undefined)\n\t\t\t\t\t\t\t\t\t\tmeasureStartChord = lastChord;\n\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t\tmeasureStartChord = null;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (elem.chord)\n\t\t\t\t\t\t\t\t\tlastChord = elem;\n\t\t\t\t\t\t\t\tif (elem.el_type === 'bar') {\n\t\t\t\t\t\t\t\t\tif (hasNotes) {\n\t\t\t\t\t\t\t\t\t\tvar frag = tune.abc.substring(fragStart, elem.endChar);\n\t\t\t\t\t\t\t\t\t\tvar measure = {abc: frag};\n\t\t\t\t\t\t\t\t\t\tlastChord = measureStartChord && measureStartChord.chord && measureStartChord.chord.length > 0 ? measureStartChord.chord[0].name : null;\n\t\t\t\t\t\t\t\t\t\tif (lastChord)\n\t\t\t\t\t\t\t\t\t\t\tmeasure.lastChord = lastChord;\n\t\t\t\t\t\t\t\t\t\tif (elem.startEnding)\n\t\t\t\t\t\t\t\t\t\t\tmeasure.startEnding = elem.startEnding;\n\t\t\t\t\t\t\t\t\t\tif (elem.endEnding)\n\t\t\t\t\t\t\t\t\t\t\tmeasure.endEnding = elem.endEnding;\n\t\t\t\t\t\t\t\t\t\tmeasures.push(measure);\n\t\t\t\t\t\t\t\t\t\tfragStart = null;\n\t\t\t\t\t\t\t\t\t\thasNotes = false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else if (elem.el_type === 'note') {\n\t\t\t\t\t\t\t\t\thasNotes = true;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\ttunes.push({\n\t\t\t\theader: header,\n\t\t\t\tmeasures: measures,\n\t\t\t\thasPickup: hasPickup\n\t\t\t});\n\t\t}\n\t\treturn tunes;\n\t};\n})();\n\nmodule.exports = tunebook;\n","var keyAccidentals = require(\"../const/key-accidentals\");\nvar { relativeMajor, transposeKey, relativeMode } = require(\"../const/relative-major\");\nvar transposeChordName = require(\"../parse/transpose-chord\")\n\nvar strTranspose;\n\n(function () {\n\t\"use strict\";\n\tstrTranspose = function (abc, abcTune, steps) {\n\t\tif (abcTune === \"TEST\") // Backdoor way to get entry points for unit tests\n\t\t\treturn { keyAccidentals: keyAccidentals, relativeMajor: relativeMajor, transposeKey: transposeKey, relativeMode: relativeMode, transposeChordName: transposeChordName}\n\t\tsteps = parseInt(steps, 10)\n\t\tvar changes = [];\n\t\tvar i;\n\t\tfor (i = 0; i < abcTune.length; i++)\n\t\t\tchanges = changes.concat(transposeOneTune(abc, abcTune[i], steps))\n\n\t\t// Reverse sort so that we are replacing strings from the end to the beginning so that the indexes aren't invalidated as we go.\n\t\t// (Because voices can be written in different ways we can't count on the notes being encountered in the order they appear in the string.)\n\t\tchanges = changes.sort(function (a, b) {\n\t\t\treturn b.start - a.start\n\t\t})\n\t\tvar output = abc.split('')\n\t\tfor (i = 0; i < changes.length; i++) {\n\t\t\tvar ch = changes[i]\n\t\t\toutput.splice(ch.start, ch.end - ch.start, ch.note)\n\t\t}\n\t\treturn output.join('')\n\t}\n\n\tfunction transposeOneTune(abc, abcTune, steps) {\n\t\tvar changes = []\n\n\t\t// Don't transpose bagpipe music - that is a special case and is always a particular key\n\t\tvar key = abcTune.getKeySignature()\n\t\tif (key.root === 'Hp' || key.root === \"HP\")\n\t\t\treturn changes;\n\n\t\tchanges = changes.concat(changeAllKeySigs(abc, steps))\n\n\t\tfor (var i = 0; i < abcTune.lines.length; i++) {\n\t\t\tvar staves = abcTune.lines[i].staff\n\t\t\tif (staves) {\n\t\t\t\tfor (var j = 0; j < staves.length; j++) {\n\t\t\t\t\tvar staff = staves[j]\n\t\t\t\t\tif (staff.clef.type !== \"perc\")\n\t\t\t\t\t\tchanges = changes.concat(transposeVoices(abc, staff.voices, staff.key, steps))\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn changes\n\t}\n\n\tfunction changeAllKeySigs(abc, steps) {\n\t\tvar changes = [];\n\t\tvar arr = abc.split(\"K:\")\n\t\t// now each line except the first one will start with whatever is right after \"K:\"\n\t\tvar count = arr[0].length\n\t\tfor (var i = 1; i < arr.length; i++) {\n\t\t\tvar segment = arr[i]\n\t\t\tvar match = segment.match(/^( *)([A-G])([#b]?)(\\w*)/)\n\t\t\tif (match) {\n\t\t\t\tvar start = count + 2 + match[1].length // move past the 'K:' and optional white space\n\t\t\t\tvar key = match[2] + match[3] + match[4] // key name, accidental, and mode\n\t\t\t\tvar destinationKey = newKey({ root: match[2], acc: match[3], mode: match[4] }, steps)\n\t\t\t\tvar dest = destinationKey.root + destinationKey.acc + destinationKey.mode\n\t\t\t\tchanges.push({ start: start, end: start + key.length, note: dest })\n\t\t\t}\n\t\t\tcount += segment.length + 2\n\t\t}\n\t\treturn changes\n\t}\n\n\tfunction transposeVoices(abc, voices, key, steps) {\n\t\tvar changes = [];\n\t\tvar destinationKey = newKey(key, steps)\n\t\tfor (var i = 0; i < voices.length; i++) {\n\t\t\tchanges = changes.concat(transposeVoice(abc, voices[i], key.root, createKeyAccidentals(key), destinationKey, steps))\n\t\t}\n\t\treturn changes\n\t}\n\n\tfunction createKeyAccidentals(key) {\n\t\tvar ret = {}\n\t\tfor (var i = 0; i < key.accidentals.length; i++) {\n\t\t\tvar acc = key.accidentals[i];\n\t\t\tif (acc.acc === 'flat')\n\t\t\t\tret[acc.note.toUpperCase()] = '_'\n\t\t\telse if (acc.acc === 'sharp')\n\t\t\t\tret[acc.note.toUpperCase()] = '^'\n\t\t}\n\t\treturn ret\n\t}\n\n\tfunction setLetterDistance(destinationKey, keyRoot, steps) {\n\t\tvar letterDistance = letters.indexOf(destinationKey.root) - letters.indexOf(keyRoot)\n\t\tif (keyRoot === \"none\")\n\t\t\tletterDistance = letters.indexOf(destinationKey.root)\n\t\tif (letterDistance === 0) {\n\t\t\t// This could either be a half step (like Eb => E) or almost an octave (like E => Eb)\n\t\t\tif (steps > 2) // If it is a large leap, then we are going up an octave\n\t\t\t\tletterDistance += 7\n\t\t\telse if (steps === -12) // If it is a large leap, then we are going down an octave\t\n\t\t\t \tletterDistance -= 7\n\t\t} else if (steps > 0 && letterDistance < 0) \n\t\t\tletterDistance += 7\n\t\telse if (steps < 0 && letterDistance > 0) \n\t\t\tletterDistance -= 7\n\n\t\tif (steps > 12)\n\t\t\tletterDistance += 7\n\t\telse if (steps < -12)\n\t\t\tletterDistance -= 7\n\n\t\treturn letterDistance\n\t}\n\n\tfunction transposeVoice(abc, voice, keyRoot, keyAccidentals, destinationKey, steps) {\n\t\tvar changes = []\n\t\tvar letterDistance = setLetterDistance(destinationKey, keyRoot, steps)\n\n\t\tvar measureAccidentals = {}\n\t\tvar transposedMeasureAccidentals = {}\n\t\tfor (var i = 0; i < voice.length; i++) {\n\t\t\tvar el = voice[i];\n\t\t\tif (el.chord) {\n\t\t\t\tfor (var c = 0; c < el.chord.length; c++) {\n\t\t\t\t\tvar ch = el.chord[c]\n\t\t\t\t\tif (ch.position === 'default') {\n\t\t\t\t\t\tvar prefersFlats = destinationKey.accidentals.length && destinationKey.accidentals[0].acc === 'flat'\n\t\t\t\t\t\tvar newChord = transposeChordName(ch.name, steps, prefersFlats, true)\n\t\t\t\t\t\tnewChord = newChord.replace(/♭/g, \"b\").replace(/♯/g, \"#\")\n\t\t\t\t\t\tif (newChord !== ch.name) // If we didn't recognize the chord the input is returned unchanged and there is nothing to replace\n\t\t\t\t\t\t\tchanges.push(replaceChord(abc, el.startChar, el.endChar, newChord))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (el.el_type === 'note' && el.pitches) {\n\t\t\t\tfor (var j = 0; j < el.pitches.length; j++) {\n\t\t\t\t\tvar note = parseNote(el.pitches[j].name, keyRoot, keyAccidentals, measureAccidentals)\n\t\t\t\t\tif (note.acc)\n\t\t\t\t\t\tmeasureAccidentals[note.name.toUpperCase()] = note.acc\n\t\t\t\t\tvar newPitch = transposePitch(note, destinationKey, letterDistance, transposedMeasureAccidentals)\n\t\t\t\t\tif (newPitch.acc)\n\t\t\t\t\t\ttransposedMeasureAccidentals[newPitch.upper] = newPitch.acc\n\t\t\t\t\tchanges.push(replaceNote(abc, el.startChar, el.endChar, newPitch.acc + newPitch.name, j))\n\t\t\t\t}\n\t\t\t\tif (el.gracenotes) {\n\t\t\t\t\tfor (var g = 0; g < el.gracenotes.length; g++) {\n\t\t\t\t\t\tvar grace = parseNote(el.gracenotes[g].name, keyRoot, keyAccidentals, measureAccidentals)\n\t\t\t\t\t\tif (grace.acc)\n\t\t\t\t\t\t\tmeasureAccidentals[grace.name.toUpperCase()] = grace.acc\n\t\t\t\t\t\tvar newGrace = transposePitch(grace, destinationKey, letterDistance, measureAccidentals)\n\t\t\t\t\t\tif (newGrace.acc)\n\t\t\t\t\t\t\ttransposedMeasureAccidentals[newGrace.upper] = newGrace.acc\n\t\t\t\t\t\tchanges.push(replaceGrace(abc, el.startChar, el.endChar, newGrace.acc + newGrace.name, g))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (el.el_type === \"bar\") {\n\t\t\t\tmeasureAccidentals = {}\n\t\t\t\ttransposedMeasureAccidentals = {}\n\t\t\t} else if (el.el_type === \"keySignature\") {\n\t\t\t\tkeyRoot = el.root\n\t\t\t\tkeyAccidentals = createKeyAccidentals(el)\n\t\t\t\tdestinationKey = newKey(el, steps)\n\t\t\t\tletterDistance = setLetterDistance(destinationKey, keyRoot, steps)\n\t\t\t}\n\t\t}\n\t\treturn changes\n\t}\n\n\tvar letters = \"CDEFGAB\"\n\tvar octaves = [\",,,,\", \",,,\", \",,\", \",\", \"\", \"'\", \"''\", \"'''\", \"''''\"]\n\n\tfunction newKey(key, steps) {\n\t\tif (key.root === \"none\") {\n\t\t\treturn { root: transposeKey(\"C\", steps), mode: \"\", acc: \"\", accidentals: [] }\n\t\t}\n\t\tvar major = relativeMajor(key.root + key.acc + key.mode)\n\t\tvar newMajor = transposeKey(major, steps)\n\t\tvar newMode = relativeMode(newMajor, key.mode)\n\t\tvar acc = keyAccidentals(newMajor)\n\t\treturn { root: newMode[0], mode: key.mode, acc: newMode.length > 1 ? newMode[1] : '', accidentals: acc }\n\t}\n\n\tfunction transposePitch(note, key, letterDistance, measureAccidentals) {\n\t\t// Depending on what the current note and new note are, the octave might have changed\n\t\t// The letterDistance is how far the change is to see if we passed \"C\" when transposing.\n\n\t\tvar pitch = note.pitch\n\t\tvar origDistFromC = letters.indexOf(note.name)\n\t\tvar root = letters.indexOf(key.root)\n\t\tvar index = (root + pitch) % 7\n\t\t// if the note crosses \"c\" then the octave changes, so that is true of \"B\" when going up one step, \"A\" and \"B\" when going up two steps, etc., and reverse when going down.\n\t\tvar newDistFromC = origDistFromC + letterDistance\n\t\tvar oct = note.oct\n\t\twhile (newDistFromC > 6) {\n\t\t\toct++\n\t\t\tnewDistFromC -= 7\n\t\t}\n\t\twhile (newDistFromC < 0) {\n\t\t\toct--\n\t\t\tnewDistFromC += 7\n\t\t}\n\n\t\tvar name = letters[index]\n\n\t\tvar acc = '';\n\t\tvar adj = note.adj\n\t\t// the amount of adjustment depends on the key - if there is a sharp in the key sig, then -1 is a natural, if there isn't, then -1 is a flat.\n\t\tvar keyAcc = '=';\n\t\tfor (var i = 0; i < key.accidentals.length; i++) {\n\t\t\tif (key.accidentals[i].note.toLowerCase() === name.toLowerCase()) {\n\t\t\t\tadj = adj + (key.accidentals[i].acc === 'flat' ? -1 : 1)\n\t\t\t\tkeyAcc = (key.accidentals[i].acc === 'flat' ? '_' : '^')\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tswitch (adj) {\n\t\t\tcase -2: acc = \"__\"; break;\n\t\t\tcase -1: acc = \"_\"; break;\n\t\t\tcase 0: acc = \"=\"; break;\n\t\t\tcase 1: acc = \"^\"; break;\n\t\t\tcase 2: acc = \"^^\"; break;\n\t\t\tcase -3:\n\t\t\t\t// This requires a triple flat, so bump down the pitch and try again\n\t\t\t\tvar newNote = {}\n\t\t\t\tnewNote.pitch = note.pitch - 1\n\t\t\t\tnewNote.oct = note.oct\n\t\t\t\tnewNote.name = letters[letters.indexOf(note.name) - 1]\n\t\t\t\tif (!newNote.name) {\n\t\t\t\t\tnewNote.name = \"B\"\n\t\t\t\t\tnewNote.oct--\n\t\t\t\t}\n\t\t\t\tif (newNote.name === \"B\" || newNote.name === \"E\")\n\t\t\t\t\tnewNote.adj = note.adj + 1;\n\t\t\t\telse\n\t\t\t\t\tnewNote.adj = note.adj + 2;\n\t\t\t\treturn transposePitch(newNote, key, letterDistance + 1, measureAccidentals)\n\t\t\tcase 3:\n\t\t\t\t// This requires a triple sharp, so bump up the pitch and try again\n\t\t\t\tvar newNote = {}\n\t\t\t\tnewNote.pitch = note.pitch + 1\n\t\t\t\tnewNote.oct = note.oct\n\t\t\t\tnewNote.name = letters[letters.indexOf(note.name) + 1]\n\t\t\t\tif (!newNote.name) {\n\t\t\t\t\tnewNote.name = \"C\"\n\t\t\t\t\tnewNote.oct++\n\t\t\t\t}\n\t\t\t\tif (newNote.name === \"C\" || newNote.name === \"F\")\n\t\t\t\t\tnewNote.adj = note.adj - 1;\n\t\t\t\telse\n\t\t\t\t\tnewNote.adj = note.adj - 2;\n\t\t\t\treturn transposePitch(newNote, key, letterDistance + 1, measureAccidentals)\n\t\t}\n\t\tif ((measureAccidentals[name] === acc || (!measureAccidentals[name] && acc === keyAcc)) && !note.courtesy)\n\t\t\tacc = \"\"\n\n\t\tswitch (oct) {\n\t\t\tcase 0: name = name + \",,,\"; break;\n\t\t\tcase 1: name = name + \",,\"; break;\n\t\t\tcase 2: name = name + \",\"; break;\n\t\t\t// case 3: it is already correct\n\t\t\tcase 4: name = name.toLowerCase(); break;\n\t\t\tcase 5: name = name.toLowerCase() + \"'\"; break;\n\t\t\tcase 6: name = name.toLowerCase() + \"''\"; break;\n\t\t\tcase 7: name = name.toLowerCase() + \"'''\"; break;\n\t\t\tcase 8: name = name.toLowerCase() + \"''''\"; break;\n\t\t}\n\t\tif (oct > 4)\n\t\t\tname = name.toLowerCase();\n\n\t\treturn { acc: acc, name: name, upper: name.toUpperCase() }\n\t}\n\n\tvar regPitch = /([_^=]*)([A-Ga-g])([,']*)/\n\tvar regNote = /([_^=]*[A-Ga-g][,']*)(\\d*\\/*\\d*)([\\>\\<\\-\\)\\.\\s\\\\]*)/\n\tvar regOptionalNote = /([_^=]*[A-Ga-g][,']*)?(\\d*\\/*\\d*)?([\\>\\<\\-\\)]*)?/\n\tvar regSpace = /(\\s*)$/\n\n\t// This the relationship of the note to the tonic and an octave. So what is returned is a distance in steps from the tonic and the amount of adjustment from\n\t// a normal scale. That is - in the key of D an F# is two steps from the tonic and no adjustment. A G# is three steps from the tonic and one half-step higher.\n\t// I don't think there is any adjustment needed for minor keys since the adjustment is based on the key signature and the accidentals.\n\tfunction parseNote(note, keyRoot, keyAccidentals, measureAccidentals) {\n\t\tvar root = keyRoot === \"none\" ? 0 : letters.indexOf(keyRoot)\n\t\tvar reg = note.match(regPitch)\n\t\t// reg[1] : \"__\", \"_\", \"\", \"=\", \"^\", or \"^^\"\n\t\t// reg[2] : A-G a-g\n\t\t// reg[3] : commas or apostrophes\n\t\tvar name = reg[2].toUpperCase()\n\t\tvar pos = letters.indexOf(name) - root;\n\t\tif (pos < 0) pos += 7\n\t\tvar oct = octaves.indexOf(reg[3])\n\t\tif (name === reg[2]) // See if it is a capital letter and subtract an octave if so.\n\t\t\toct--;\n\t\tvar currentAcc = measureAccidentals[name] || keyAccidentals[name] || \"=\" // use the key accidentals if they exist, but override with the measure accidentals, and if neither of them exist, use a natural.\n\t\treturn { acc: reg[1], name: name, pitch: pos, oct: oct, adj: calcAdjustment(reg[1], keyAccidentals[name], measureAccidentals[name]), courtesy: reg[1] === currentAcc }\n\t}\n\n\tfunction replaceNote(abc, start, end, newPitch, index) {\n\t\t// There may be more than just the note between the start and end - there could be spaces, there could be a chord symbol, there could be a decoration.\n\t\t// This could also be a part of a chord. If so, then the particular note needs to be teased out.\n\t\tvar note = abc.substring(start, end)\n\t\tvar match = note.match(new RegExp(regNote.source + regSpace.source), '')\n\t\tif (match) {\n\t\t\t// This will match a single note\n\t\t\tvar noteLen = match[1].length\n\t\t\tvar trailingLen = match[2].length + match[3].length + match[4].length\n\t\t\tvar leadingLen = end - start - noteLen - trailingLen\n\t\t\tstart += leadingLen\n\t\t\tend -= trailingLen\n\t\t} else {\n\t\t\t// I don't know how to capture more than one note, so I'm separating them. There is a limit of the number of notes in a chord depending on the repeats I have here, but it is unlikely to happen in real music.\n\t\t\tvar regPreBracket = /([^\\[]*)/\n\t\t\tvar regOpenBracket = /\\[/\n\t\t\tvar regCloseBracket = /\\-?](\\d*\\/*\\d*)?([\\>\\<\\-\\)]*)/\n\t\t\tmatch = note.match(new RegExp(regPreBracket.source + regOpenBracket.source + regOptionalNote.source +\n\t\t\t\tregOptionalNote.source + regOptionalNote.source + regOptionalNote.source +\n\t\t\t\tregOptionalNote.source + regOptionalNote.source + regOptionalNote.source +\n\t\t\t\tregOptionalNote.source + regCloseBracket.source + regSpace.source))\n\n\t\t\tif (match) {\n\t\t\t\t// This will match a chord\n\t\t\t\t// Get the number of chars used by the previous notes in this chord\n\t\t\t\tvar count = 1 + match[1].length // one character for the open bracket\n\t\t\t\tfor (var i = 0; i < index; i++) { // index is the iteration through the chord. This function gets called for each one.\n\t\t\t\t\tif (match[i * 3 + 2])\n\t\t\t\t\t\tcount += match[i * 3 + 2].length\n\t\t\t\t\tif (match[i * 3 + 3])\n\t\t\t\t\t\tcount += match[i * 3 + 3].length\n\t\t\t\t\tif (match[i * 3 + 4])\n\t\t\t\t\t\tcount += match[i * 3 + 4].length\n\t\t\t\t}\n\t\t\t\tstart += count\n\t\t\t\tvar endLen = match[index * 3 + 2] ? match[index * 3 + 2].length : 0\n\t\t\t\t// endLen += match[index * 3 + 3] ? match[index * 3 + 3].length : 0\n\t\t\t\t// endLen += match[index * 3 + 4] ? match[index * 3 + 4].length : 0\n\n\t\t\t\tend = start + endLen\n\t\t\t}\n\t\t}\n\t\treturn { start: start, end: end, note: newPitch }\n\t}\n\n\tfunction replaceGrace(abc, start, end, newGrace, index) {\n\t\tvar note = abc.substring(start, end)\n\t\t// I don't know how to capture more than one note, so I'm separating them. There is a limit of the number of notes in a chord depending on the repeats I have here, but it is unlikely to happen in real music.\n\t\tvar regOpenBrace = /\\{/\n\t\tvar regCloseBrace = /\\}/\n\t\tvar regPreBrace = /([^\\{]*)/\n\t\tvar regPreNote = /(\\/*)/\n\t\tvar match = note.match(new RegExp(regPreBrace.source + regOpenBrace.source + regPreNote.source + regOptionalNote.source +\n\t\t\tregPreNote.source + regOptionalNote.source + regPreNote.source + regOptionalNote.source + regPreNote.source + regOptionalNote.source +\n\t\t\tregPreNote.source + regOptionalNote.source + regPreNote.source + regOptionalNote.source + regPreNote.source + regOptionalNote.source +\n\t\t\tregPreNote.source + regOptionalNote.source + regCloseBrace.source))\n\t\tif (match) {\n\t\t\t// This will match all notes inside a grace symbol\n\t\t\t// Get the number of chars used by the previous graces\n\t\t\tvar count = 1 + match[1].length // one character for the open brace, and whatever comes before the brace\n\t\t\tfor (var i = 0; i < index; i++) { // index is the iteration through the chord. This function gets called for each one.\n\t\t\t\tif (match[i * 3 + 2])\n\t\t\t\t\tcount += match[i * 3 + 2].length\n\t\t\t\tif (match[i * 3 + 3])\n\t\t\t\t\tcount += match[i * 3 + 3].length\n\t\t\t\tif (match[i * 3 + 4])\n\t\t\t\t\tcount += match[i * 3 + 4].length\n\t\t\t\tif (match[i * 3 + 5])\n\t\t\t\t\tcount += match[i * 3 + 5].length\n\t\t\t}\n\t\t\tif (match[index * 3 + 2])\n\t\t\t\tcount += match[i * 3 + 2].length\n\t\t\tstart += count\n\t\t\tvar endLen = match[index * 3 + 3] ? match[index * 3 + 3].length : 0\n\t\t\tendLen += match[index * 3 + 4] ? match[index * 3 + 4].length : 0\n\t\t\tendLen += match[index * 3 + 5] ? match[index * 3 + 5].length : 0\n\n\t\t\tend = start + endLen\n\t\t}\n\t\treturn { start: start, end: end, note: newGrace }\n\t}\n\n\tfunction replaceChord(abc, start, end, newChord) {\n\t\t// Isolate the chord and just replace that\n\t\tvar match = abc.substring(start, end).match(/([^\"]+)?(\".+\")+/)\n\t\tif (match[1])\n\t\t\tstart += match[1].length\n\t\tend = start + match[2].length\n\t\t// leave the quote in, so skip one more\n\t\treturn { start: start + 1, end: end - 1, note: newChord }\n\t}\n\n\tfunction calcAdjustment(thisAccidental, keyAccidental, measureAccidental) {\n\t\tif (!thisAccidental && measureAccidental) {\n\t\t\t// There was no accidental on this note, but there was earlier in the measure, so we'll use that\n\t\t\tthisAccidental = measureAccidental\n\t\t}\n\t\tif (!thisAccidental)\n\t\t\treturn 0; // there is no deviation from the key.\n\n\t\tswitch (keyAccidental) {\n\t\t\tcase undefined:\n\t\t\t\tswitch (thisAccidental) {\n\t\t\t\t\tcase '__': return -2;\n\t\t\t\t\tcase '_': return -1;\n\t\t\t\t\tcase '=': return 0;\n\t\t\t\t\tcase '^': return 1;\n\t\t\t\t\tcase '^^': return 2;\n\t\t\t\t\tdefault: return 0; // this should never happen\n\t\t\t\t}\n\t\t\tcase '_':\n\t\t\t\tswitch (thisAccidental) {\n\t\t\t\t\tcase '__': return -1;\n\t\t\t\t\tcase '_': return 0;\n\t\t\t\t\tcase '=': return 1;\n\t\t\t\t\tcase '^': return 2;\n\t\t\t\t\tcase '^^': return 3;\n\t\t\t\t\tdefault: return 0; // this should never happen\n\t\t\t\t}\n\t\t\tcase '^':\n\t\t\t\tswitch (thisAccidental) {\n\t\t\t\t\tcase '__': return -3;\n\t\t\t\t\tcase '_': return -2;\n\t\t\t\t\tcase '=': return -1;\n\t\t\t\t\tcase '^': return 0;\n\t\t\t\t\tcase '^^': return 1;\n\t\t\t\t\tdefault: return 0; // this should never happen\n\t\t\t\t}\n\t\t}\n\t\treturn 0// this should never happen\n\t}\n})();\n\nmodule.exports = strTranspose;\n","// abc_beam_element.js: Definition of the BeamElem class.\n\n// Most elements on the page are related to a particular absolute element -- notes, rests, bars, etc. Beams, however, span multiple elements.\n// This means that beams can't be laid out until the absolute elements are placed. There is the further complication that the stems for beamed\n// notes can't be laid out until the beams are because we don't know how long they will be until we know the slope of the beam and the horizontal\n// spacing of the absolute elements.\n//\n// So, when a beam is detected, a BeamElem is created, then all notes belonging to that beam are added to it. These notes are not given stems at that time.\n// Then, after the horizontal layout is complete, all of the BeamElem are iterated to set the beam position, then all of the notes that are beamed are given\n// stems. After that, we are ready for the drawing step.\n\n// There are three phases: the setup phase, when new elements are being discovered, the layout phase, when everything is calculated, and the drawing phase,\n// when the object is not changed, but is used to put the elements on the page.\n\n//\n// Setup phase\n//\nvar BeamElem = function BeamElem(stemHeight, type, flat, firstElement) {\n\t// type is \"grace\", \"up\", \"down\", or undefined. flat is used to force flat beams, as it commonly found in the grace notes of bagpipe music.\n\tthis.type = \"BeamElem\";\n\tthis.isflat = !!flat;\n\tthis.isgrace = !!(type && type === \"grace\");\n\tthis.forceup = !!(this.isgrace || (type && type === \"up\"));\n\tthis.forcedown = !!(type && type === \"down\");\n\tthis.elems = []; // all the AbsoluteElements that this beam touches. It may include embedded rests.\n\tthis.total = 0;\n\tthis.average = 6; // use middle line as start for average.\n\tthis.allrests = true;\n\tthis.stemHeight = stemHeight;\n\tthis.beams = []; // During the layout phase, this will become a list of the beams that need to be drawn.\n\tif (firstElement && firstElement.duration) {\n\t\tthis.duration = firstElement.duration;\n\t\tif (firstElement.startTriplet) {\n\t\t\tthis.duration *= firstElement.tripletMultiplier;\n\t\t}\n\t\tthis.duration = Math.round(this.duration * 1000) / 1000;\n\t} else\n\t\tthis.duration = 0;\n};\n\nBeamElem.prototype.setHint = function () {\n\tthis.hint = true;\n};\n\nBeamElem.prototype.runningDirection = function (abcelem) {\n\tvar pitch = abcelem.averagepitch;\n\tif (pitch === undefined) return; // don't include elements like spacers in beams\n\tthis.total = Math.round(this.total + pitch);\n\tif (!this.count)\n\t\tthis.count = 0;\n\tthis.count++\n};\n\nBeamElem.prototype.add = function (abselem) {\n\tvar pitch = abselem.abcelem.averagepitch;\n\tif (pitch === undefined) return; // don't include elements like spacers in beams\n\tif (!abselem.abcelem.rest)\n\t\tthis.allrests = false;\n\tabselem.beam = this;\n\tthis.elems.push(abselem);\n\tthis.total = Math.round(this.total + pitch);\n\tif (this.min === undefined || abselem.abcelem.minpitch < this.min) {\n\t\tthis.min = abselem.abcelem.minpitch;\n\t}\n\tif (this.max === undefined || abselem.abcelem.maxpitch > this.max) {\n\t\tthis.max = abselem.abcelem.maxpitch;\n\t}\n};\n\nBeamElem.prototype.addBeam = function (beam) {\n\tthis.beams.push(beam);\n};\n\nBeamElem.prototype.setStemDirection = function () {\n\t// Have to figure this out before the notes are placed because placing the notes also places the decorations.\n\tthis.average = calcAverage(this.total, this.count);\n\tif (this.forceup) {\n\t\tthis.stemsUp = true;\n\t} else if (this.forcedown) {\n\t\tthis.stemsUp = false;\n\t} else {\n\t\tvar middleLine = 6;\t// hardcoded 6 is B\n\t\tthis.stemsUp = this.average < middleLine; // true is up, false is down;\n\t}\n\tdelete this.count;\n\tthis.total = 0;\n};\n\nBeamElem.prototype.calcDir = function () {\n\tthis.average = calcAverage(this.total, this.elems.length);\n\tif (this.forceup) {\n\t\tthis.stemsUp = true;\n\t} else if (this.forcedown) {\n\t\tthis.stemsUp = false;\n\t} else {\n\t\tvar middleLine = 6;\t// hardcoded 6 is B\n\t\tthis.stemsUp = this.average < middleLine; // true is up, false is down;\n\t}\n\tvar dir = this.stemsUp ? 'up' : 'down';\n\tfor (var i = 0; i < this.elems.length; i++) {\n\t\tfor (var j = 0; j < this.elems[i].heads.length; j++) {\n\t\t\tthis.elems[i].heads[j].stemDir = dir;\n\t\t}\n\t}\n};\n\nfunction calcAverage(total, numElements) {\n\tif (!numElements)\n\t\treturn 0;\n\treturn total / numElements;\n}\n\nmodule.exports = BeamElem;\n","// abc_brace_element.js: Definition of the BraceElement class.\n\nvar BraceElem = function BraceElem(voice, type) {\n\tthis.startVoice = voice;\n\tthis.type = type;\n};\n\nBraceElem.prototype.setBottomStaff = function (voice) {\n\tthis.endVoice = voice;\n\t// If only the start brace has a name then the name belongs to the brace instead of the staff.\n\tif (this.startVoice.header && !this.endVoice.header) {\n\t\tthis.header = this.startVoice.header;\n\t\tdelete this.startVoice.header;\n\t}\n};\n\nBraceElem.prototype.continuing = function (voice) {\n\t// If the final staff isn't present, then use the last one we saw.\n\tthis.lastContinuedVoice = voice;\n};\n\nBraceElem.prototype.getWidth = function () {\n\treturn 10; // TODO-PER: right now the drawing function doesn't vary the width at all. If it does in the future then this will change.\n};\n\nBraceElem.prototype.isStartVoice = function (voice) {\n\tif (this.startVoice && this.startVoice.staff && this.startVoice.staff.voices.length > 0 && this.startVoice.staff.voices[0] === voice)\n\t\treturn true;\n\treturn false;\n};\n\nmodule.exports = BraceElem;\n","var spacing = require('../helpers/spacing');\n\n/**\n * Glyphs and some methods to adjust for their x and y baseline\n */\nvar glyphs =\n{\n\t'0': { d: [['M', 4.83, -14.97], ['c', 0.33, -0.03, 1.11, 0.00, 1.47, 0.06], ['c', 1.68, 0.36, 2.97, 1.59, 3.78, 3.60], ['c', 1.20, 2.97, 0.81, 6.96, -0.90, 9.27], ['c', -0.78, 1.08, -1.71, 1.71, -2.91, 1.95], ['c', -0.45, 0.09, -1.32, 0.09, -1.77, 0.00], ['c', -0.81, -0.18, -1.47, -0.51, -2.07, -1.02], ['c', -2.34, -2.07, -3.15, -6.72, -1.74, -10.20], ['c', 0.87, -2.16, 2.28, -3.42, 4.14, -3.66], ['z'], ['m', 1.11, 0.87], ['c', -0.21, -0.06, -0.69, -0.09, -0.87, -0.06], ['c', -0.54, 0.12, -0.87, 0.42, -1.17, 0.99], ['c', -0.36, 0.66, -0.51, 1.56, -0.60, 3.00], ['c', -0.03, 0.75, -0.03, 4.59, 0.00, 5.31], ['c', 0.09, 1.50, 0.27, 2.40, 0.60, 3.06], ['c', 0.24, 0.48, 0.57, 0.78, 0.96, 0.90], ['c', 0.27, 0.09, 0.78, 0.09, 1.05, 0.00], ['c', 0.39, -0.12, 0.72, -0.42, 0.96, -0.90], ['c', 0.33, -0.66, 0.51, -1.56, 0.60, -3.06], ['c', 0.03, -0.72, 0.03, -4.56, 0.00, -5.31], ['c', -0.09, -1.47, -0.27, -2.37, -0.60, -3.03], ['c', -0.24, -0.48, -0.54, -0.78, -0.93, -0.90], ['z']], w: 10.78, h: 14.959 },\n\t'1': { d: [['M', 3.30, -15.06], ['c', 0.06, -0.06, 0.21, -0.03, 0.66, 0.15], ['c', 0.81, 0.39, 1.08, 0.39, 1.83, 0.03], ['c', 0.21, -0.09, 0.39, -0.15, 0.42, -0.15], ['c', 0.12, 0.00, 0.21, 0.09, 0.27, 0.21], ['c', 0.06, 0.12, 0.06, 0.33, 0.06, 5.94], ['c', 0.00, 3.93, 0.00, 5.85, 0.03, 6.03], ['c', 0.06, 0.36, 0.15, 0.69, 0.27, 0.96], ['c', 0.36, 0.75, 0.93, 1.17, 1.68, 1.26], ['c', 0.30, 0.03, 0.39, 0.09, 0.39, 0.30], ['c', 0.00, 0.15, -0.03, 0.18, -0.09, 0.24], ['c', -0.06, 0.06, -0.09, 0.06, -0.48, 0.06], ['c', -0.42, 0.00, -0.69, -0.03, -2.10, -0.24], ['c', -0.90, -0.15, -1.77, -0.15, -2.67, 0.00], ['c', -1.41, 0.21, -1.68, 0.24, -2.10, 0.24], ['c', -0.39, 0.00, -0.42, 0.00, -0.48, -0.06], ['c', -0.06, -0.06, -0.06, -0.09, -0.06, -0.24], ['c', 0.00, -0.21, 0.06, -0.27, 0.36, -0.30], ['c', 0.75, -0.09, 1.32, -0.51, 1.68, -1.26], ['c', 0.12, -0.27, 0.21, -0.60, 0.27, -0.96], ['c', 0.03, -0.18, 0.03, -1.59, 0.03, -4.29], ['c', 0.00, -3.87, 0.00, -4.05, -0.06, -4.14], ['c', -0.09, -0.15, -0.18, -0.24, -0.39, -0.24], ['c', -0.12, 0.00, -0.15, 0.03, -0.21, 0.06], ['c', -0.03, 0.06, -0.45, 0.99, -0.96, 2.13], ['c', -0.48, 1.14, -0.90, 2.10, -0.93, 2.16], ['c', -0.06, 0.15, -0.21, 0.24, -0.33, 0.24], ['c', -0.24, 0.00, -0.42, -0.18, -0.42, -0.39], ['c', 0.00, -0.06, 3.27, -7.62, 3.33, -7.74], ['z']], w: 8.94, h: 15.058 },\n\t'2': { d: [['M', 4.23, -14.97], ['c', 0.57, -0.06, 1.68, 0.00, 2.34, 0.18], ['c', 0.69, 0.18, 1.50, 0.54, 2.01, 0.90], ['c', 1.35, 0.96, 1.95, 2.25, 1.77, 3.81], ['c', -0.15, 1.35, -0.66, 2.34, -1.68, 3.15], ['c', -0.60, 0.48, -1.44, 0.93, -3.12, 1.65], ['c', -1.32, 0.57, -1.80, 0.81, -2.37, 1.14], ['c', -0.57, 0.33, -0.57, 0.33, -0.24, 0.27], ['c', 0.39, -0.09, 1.26, -0.09, 1.68, 0.00], ['c', 0.72, 0.15, 1.41, 0.45, 2.10, 0.90], ['c', 0.99, 0.63, 1.86, 0.87, 2.55, 0.75], ['c', 0.24, -0.06, 0.42, -0.15, 0.57, -0.30], ['c', 0.12, -0.09, 0.30, -0.42, 0.30, -0.51], ['c', 0.00, -0.09, 0.12, -0.21, 0.24, -0.24], ['c', 0.18, -0.03, 0.39, 0.12, 0.39, 0.30], ['c', 0.00, 0.12, -0.15, 0.57, -0.30, 0.87], ['c', -0.54, 1.02, -1.56, 1.74, -2.79, 2.01], ['c', -0.42, 0.09, -1.23, 0.09, -1.62, 0.03], ['c', -0.81, -0.18, -1.32, -0.45, -2.01, -1.11], ['c', -0.45, -0.45, -0.63, -0.57, -0.96, -0.69], ['c', -0.84, -0.27, -1.89, 0.12, -2.25, 0.90], ['c', -0.12, 0.21, -0.21, 0.54, -0.21, 0.72], ['c', 0.00, 0.12, -0.12, 0.21, -0.27, 0.24], ['c', -0.15, 0.00, -0.27, -0.03, -0.33, -0.15], ['c', -0.09, -0.21, 0.09, -1.08, 0.33, -1.71], ['c', 0.24, -0.66, 0.66, -1.26, 1.29, -1.89], ['c', 0.45, -0.45, 0.90, -0.81, 1.92, -1.56], ['c', 1.29, -0.93, 1.89, -1.44, 2.34, -1.98], ['c', 0.87, -1.05, 1.26, -2.19, 1.20, -3.63], ['c', -0.06, -1.29, -0.39, -2.31, -0.96, -2.91], ['c', -0.36, -0.33, -0.72, -0.51, -1.17, -0.54], ['c', -0.84, -0.03, -1.53, 0.42, -1.59, 1.05], ['c', -0.03, 0.33, 0.12, 0.60, 0.57, 1.14], ['c', 0.45, 0.54, 0.54, 0.87, 0.42, 1.41], ['c', -0.15, 0.63, -0.54, 1.11, -1.08, 1.38], ['c', -0.63, 0.33, -1.20, 0.33, -1.83, 0.00], ['c', -0.24, -0.12, -0.33, -0.18, -0.54, -0.39], ['c', -0.18, -0.18, -0.27, -0.30, -0.36, -0.51], ['c', -0.24, -0.45, -0.27, -0.84, -0.21, -1.38], ['c', 0.12, -0.75, 0.45, -1.41, 1.02, -1.98], ['c', 0.72, -0.72, 1.74, -1.17, 2.85, -1.32], ['z']], w: 10.764, h: 14.97 },\n\t'3': { d: [['M', 3.78, -14.97], ['c', 0.30, -0.03, 1.41, 0.00, 1.83, 0.06], ['c', 2.22, 0.30, 3.51, 1.32, 3.72, 2.91], ['c', 0.03, 0.33, 0.03, 1.26, -0.03, 1.65], ['c', -0.12, 0.84, -0.48, 1.47, -1.05, 1.77], ['c', -0.27, 0.15, -0.36, 0.24, -0.45, 0.39], ['c', -0.09, 0.21, -0.09, 0.36, 0.00, 0.57], ['c', 0.09, 0.15, 0.18, 0.24, 0.51, 0.39], ['c', 0.75, 0.42, 1.23, 1.14, 1.41, 2.13], ['c', 0.06, 0.42, 0.06, 1.35, 0.00, 1.71], ['c', -0.18, 0.81, -0.48, 1.38, -1.02, 1.95], ['c', -0.75, 0.72, -1.80, 1.20, -3.18, 1.38], ['c', -0.42, 0.06, -1.56, 0.06, -1.95, 0.00], ['c', -1.89, -0.33, -3.18, -1.29, -3.51, -2.64], ['c', -0.03, -0.12, -0.03, -0.33, -0.03, -0.60], ['c', 0.00, -0.36, 0.00, -0.42, 0.06, -0.63], ['c', 0.12, -0.30, 0.27, -0.51, 0.51, -0.75], ['c', 0.24, -0.24, 0.45, -0.39, 0.75, -0.51], ['c', 0.21, -0.06, 0.27, -0.06, 0.60, -0.06], ['c', 0.33, 0.00, 0.39, 0.00, 0.60, 0.06], ['c', 0.30, 0.12, 0.51, 0.27, 0.75, 0.51], ['c', 0.36, 0.33, 0.57, 0.75, 0.60, 1.20], ['c', 0.00, 0.21, 0.00, 0.27, -0.06, 0.42], ['c', -0.09, 0.18, -0.12, 0.24, -0.54, 0.54], ['c', -0.51, 0.36, -0.63, 0.54, -0.60, 0.87], ['c', 0.06, 0.54, 0.54, 0.90, 1.38, 0.99], ['c', 0.36, 0.06, 0.72, 0.03, 0.96, -0.06], ['c', 0.81, -0.27, 1.29, -1.23, 1.44, -2.79], ['c', 0.03, -0.45, 0.03, -1.95, -0.03, -2.37], ['c', -0.09, -0.75, -0.33, -1.23, -0.75, -1.44], ['c', -0.33, -0.18, -0.45, -0.18, -1.98, -0.18], ['c', -1.35, 0.00, -1.41, 0.00, -1.50, -0.06], ['c', -0.18, -0.12, -0.24, -0.39, -0.12, -0.60], ['c', 0.12, -0.15, 0.15, -0.15, 1.68, -0.15], ['c', 1.50, 0.00, 1.62, 0.00, 1.89, -0.15], ['c', 0.18, -0.09, 0.42, -0.36, 0.54, -0.57], ['c', 0.18, -0.42, 0.27, -0.90, 0.30, -1.95], ['c', 0.03, -1.20, -0.06, -1.80, -0.36, -2.37], ['c', -0.24, -0.48, -0.63, -0.81, -1.14, -0.96], ['c', -0.30, -0.06, -1.08, -0.06, -1.38, 0.03], ['c', -0.60, 0.15, -0.90, 0.42, -0.96, 0.84], ['c', -0.03, 0.30, 0.06, 0.45, 0.63, 0.84], ['c', 0.33, 0.24, 0.42, 0.39, 0.45, 0.63], ['c', 0.03, 0.72, -0.57, 1.50, -1.32, 1.65], ['c', -1.05, 0.27, -2.10, -0.57, -2.10, -1.65], ['c', 0.00, -0.45, 0.15, -0.96, 0.39, -1.38], ['c', 0.12, -0.21, 0.54, -0.63, 0.81, -0.81], ['c', 0.57, -0.42, 1.38, -0.69, 2.25, -0.81], ['z']], w: 9.735, h: 14.967 },\n\t'4': { d: [['M', 8.64, -14.94], ['c', 0.27, -0.09, 0.42, -0.12, 0.54, -0.03], ['c', 0.09, 0.06, 0.15, 0.21, 0.15, 0.30], ['c', -0.03, 0.06, -1.92, 2.31, -4.23, 5.04], ['c', -2.31, 2.73, -4.23, 4.98, -4.26, 5.01], ['c', -0.03, 0.06, 0.12, 0.06, 2.55, 0.06], ['l', 2.61, 0.00], ['l', 0.00, -2.37], ['c', 0.00, -2.19, 0.03, -2.37, 0.06, -2.46], ['c', 0.03, -0.06, 0.21, -0.18, 0.57, -0.42], ['c', 1.08, -0.72, 1.38, -1.08, 1.86, -2.16], ['c', 0.12, -0.30, 0.24, -0.54, 0.27, -0.57], ['c', 0.12, -0.12, 0.39, -0.06, 0.45, 0.12], ['c', 0.06, 0.09, 0.06, 0.57, 0.06, 3.96], ['l', 0.00, 3.90], ['l', 1.08, 0.00], ['c', 1.05, 0.00, 1.11, 0.00, 1.20, 0.06], ['c', 0.24, 0.15, 0.24, 0.54, 0.00, 0.69], ['c', -0.09, 0.06, -0.15, 0.06, -1.20, 0.06], ['l', -1.08, 0.00], ['l', 0.00, 0.33], ['c', 0.00, 0.57, 0.09, 1.11, 0.30, 1.53], ['c', 0.36, 0.75, 0.93, 1.17, 1.68, 1.26], ['c', 0.30, 0.03, 0.39, 0.09, 0.39, 0.30], ['c', 0.00, 0.15, -0.03, 0.18, -0.09, 0.24], ['c', -0.06, 0.06, -0.09, 0.06, -0.48, 0.06], ['c', -0.42, 0.00, -0.69, -0.03, -2.10, -0.24], ['c', -0.90, -0.15, -1.77, -0.15, -2.67, 0.00], ['c', -1.41, 0.21, -1.68, 0.24, -2.10, 0.24], ['c', -0.39, 0.00, -0.42, 0.00, -0.48, -0.06], ['c', -0.06, -0.06, -0.06, -0.09, -0.06, -0.24], ['c', 0.00, -0.21, 0.06, -0.27, 0.36, -0.30], ['c', 0.75, -0.09, 1.32, -0.51, 1.68, -1.26], ['c', 0.21, -0.42, 0.30, -0.96, 0.30, -1.53], ['l', 0.00, -0.33], ['l', -2.70, 0.00], ['c', -2.91, 0.00, -2.85, 0.00, -3.09, -0.15], ['c', -0.18, -0.12, -0.30, -0.39, -0.27, -0.54], ['c', 0.03, -0.06, 0.18, -0.24, 0.33, -0.45], ['c', 0.75, -0.90, 1.59, -2.07, 2.13, -3.03], ['c', 0.33, -0.54, 0.84, -1.62, 1.05, -2.16], ['c', 0.57, -1.41, 0.84, -2.64, 0.90, -4.05], ['c', 0.03, -0.63, 0.06, -0.72, 0.24, -0.81], ['l', 0.12, -0.06], ['l', 0.45, 0.12], ['c', 0.66, 0.18, 1.02, 0.24, 1.47, 0.27], ['c', 0.60, 0.03, 1.23, -0.09, 2.01, -0.33], ['z']], w: 11.795, h: 14.994 },\n\t'5': { d: [['M', 1.02, -14.94], ['c', 0.12, -0.09, 0.03, -0.09, 1.08, 0.06], ['c', 2.49, 0.36, 4.35, 0.36, 6.96, -0.06], ['c', 0.57, -0.09, 0.66, -0.06, 0.81, 0.06], ['c', 0.15, 0.18, 0.12, 0.24, -0.15, 0.51], ['c', -1.29, 1.26, -3.24, 2.04, -5.58, 2.31], ['c', -0.60, 0.09, -1.20, 0.12, -1.71, 0.12], ['c', -0.39, 0.00, -0.45, 0.00, -0.57, 0.06], ['c', -0.09, 0.06, -0.15, 0.12, -0.21, 0.21], ['l', -0.06, 0.12], ['l', 0.00, 1.65], ['l', 0.00, 1.65], ['l', 0.21, -0.21], ['c', 0.66, -0.57, 1.41, -0.96, 2.19, -1.14], ['c', 0.33, -0.06, 1.41, -0.06, 1.95, 0.00], ['c', 2.61, 0.36, 4.02, 1.74, 4.26, 4.14], ['c', 0.03, 0.45, 0.03, 1.08, -0.03, 1.44], ['c', -0.18, 1.02, -0.78, 2.01, -1.59, 2.70], ['c', -0.72, 0.57, -1.62, 1.02, -2.49, 1.20], ['c', -1.38, 0.27, -3.03, 0.06, -4.20, -0.54], ['c', -1.08, -0.54, -1.71, -1.32, -1.86, -2.28], ['c', -0.09, -0.69, 0.09, -1.29, 0.57, -1.74], ['c', 0.24, -0.24, 0.45, -0.39, 0.75, -0.51], ['c', 0.21, -0.06, 0.27, -0.06, 0.60, -0.06], ['c', 0.33, 0.00, 0.39, 0.00, 0.60, 0.06], ['c', 0.30, 0.12, 0.51, 0.27, 0.75, 0.51], ['c', 0.36, 0.33, 0.57, 0.75, 0.60, 1.20], ['c', 0.00, 0.21, 0.00, 0.27, -0.06, 0.42], ['c', -0.09, 0.18, -0.12, 0.24, -0.54, 0.54], ['c', -0.18, 0.12, -0.36, 0.30, -0.42, 0.33], ['c', -0.36, 0.42, -0.18, 0.99, 0.36, 1.26], ['c', 0.51, 0.27, 1.47, 0.36, 2.01, 0.27], ['c', 0.93, -0.21, 1.47, -1.17, 1.65, -2.91], ['c', 0.06, -0.45, 0.06, -1.89, 0.00, -2.31], ['c', -0.15, -1.20, -0.51, -2.10, -1.05, -2.55], ['c', -0.21, -0.18, -0.54, -0.36, -0.81, -0.39], ['c', -0.30, -0.06, -0.84, -0.03, -1.26, 0.06], ['c', -0.93, 0.18, -1.65, 0.60, -2.16, 1.20], ['c', -0.15, 0.21, -0.27, 0.30, -0.39, 0.30], ['c', -0.15, 0.00, -0.30, -0.09, -0.36, -0.18], ['c', -0.06, -0.09, -0.06, -0.15, -0.06, -3.66], ['c', 0.00, -3.39, 0.00, -3.57, 0.06, -3.66], ['c', 0.03, -0.06, 0.09, -0.15, 0.15, -0.18], ['z']], w: 10.212, h: 14.997 },\n\t'6': { d: [['M', 4.98, -14.97], ['c', 0.36, -0.03, 1.20, 0.00, 1.59, 0.06], ['c', 0.90, 0.15, 1.68, 0.51, 2.25, 1.05], ['c', 0.57, 0.51, 0.87, 1.23, 0.84, 1.98], ['c', -0.03, 0.51, -0.21, 0.90, -0.60, 1.26], ['c', -0.24, 0.24, -0.45, 0.39, -0.75, 0.51], ['c', -0.21, 0.06, -0.27, 0.06, -0.60, 0.06], ['c', -0.33, 0.00, -0.39, 0.00, -0.60, -0.06], ['c', -0.30, -0.12, -0.51, -0.27, -0.75, -0.51], ['c', -0.39, -0.36, -0.57, -0.78, -0.57, -1.26], ['c', 0.00, -0.27, 0.00, -0.30, 0.09, -0.42], ['c', 0.03, -0.09, 0.18, -0.21, 0.30, -0.30], ['c', 0.12, -0.09, 0.30, -0.21, 0.39, -0.27], ['c', 0.09, -0.06, 0.21, -0.18, 0.27, -0.24], ['c', 0.06, -0.12, 0.09, -0.15, 0.09, -0.33], ['c', 0.00, -0.18, -0.03, -0.24, -0.09, -0.36], ['c', -0.24, -0.39, -0.75, -0.60, -1.38, -0.57], ['c', -0.54, 0.03, -0.90, 0.18, -1.23, 0.48], ['c', -0.81, 0.72, -1.08, 2.16, -0.96, 5.37], ['l', 0.00, 0.63], ['l', 0.30, -0.12], ['c', 0.78, -0.27, 1.29, -0.33, 2.10, -0.27], ['c', 1.47, 0.12, 2.49, 0.54, 3.27, 1.29], ['c', 0.48, 0.51, 0.81, 1.11, 0.96, 1.89], ['c', 0.06, 0.27, 0.06, 0.42, 0.06, 0.93], ['c', 0.00, 0.54, 0.00, 0.69, -0.06, 0.96], ['c', -0.15, 0.78, -0.48, 1.38, -0.96, 1.89], ['c', -0.54, 0.51, -1.17, 0.87, -1.98, 1.08], ['c', -1.14, 0.30, -2.40, 0.33, -3.24, 0.03], ['c', -1.50, -0.48, -2.64, -1.89, -3.27, -4.02], ['c', -0.36, -1.23, -0.51, -2.82, -0.42, -4.08], ['c', 0.30, -3.66, 2.28, -6.30, 4.95, -6.66], ['z'], ['m', 0.66, 7.41], ['c', -0.27, -0.09, -0.81, -0.12, -1.08, -0.06], ['c', -0.72, 0.18, -1.08, 0.69, -1.23, 1.71], ['c', -0.06, 0.54, -0.06, 3.00, 0.00, 3.54], ['c', 0.18, 1.26, 0.72, 1.77, 1.80, 1.74], ['c', 0.39, -0.03, 0.63, -0.09, 0.90, -0.27], ['c', 0.66, -0.42, 0.90, -1.32, 0.90, -3.24], ['c', 0.00, -2.22, -0.36, -3.12, -1.29, -3.42], ['z']], w: 9.956, h: 14.982 },\n\t'7': { d: [['M', 0.21, -14.97], ['c', 0.21, -0.06, 0.45, 0.00, 0.54, 0.15], ['c', 0.06, 0.09, 0.06, 0.15, 0.06, 0.39], ['c', 0.00, 0.24, 0.00, 0.33, 0.06, 0.42], ['c', 0.06, 0.12, 0.21, 0.24, 0.27, 0.24], ['c', 0.03, 0.00, 0.12, -0.12, 0.24, -0.21], ['c', 0.96, -1.20, 2.58, -1.35, 3.99, -0.42], ['c', 0.15, 0.12, 0.42, 0.30, 0.54, 0.45], ['c', 0.48, 0.39, 0.81, 0.57, 1.29, 0.60], ['c', 0.69, 0.03, 1.50, -0.30, 2.13, -0.87], ['c', 0.09, -0.09, 0.27, -0.30, 0.39, -0.45], ['c', 0.12, -0.15, 0.24, -0.27, 0.30, -0.30], ['c', 0.18, -0.06, 0.39, 0.03, 0.51, 0.21], ['c', 0.06, 0.18, 0.06, 0.24, -0.27, 0.72], ['c', -0.18, 0.24, -0.54, 0.78, -0.78, 1.17], ['c', -2.37, 3.54, -3.54, 6.27, -3.87, 9.00], ['c', -0.03, 0.33, -0.03, 0.66, -0.03, 1.26], ['c', 0.00, 0.90, 0.00, 1.08, 0.15, 1.89], ['c', 0.06, 0.45, 0.06, 0.48, 0.03, 0.60], ['c', -0.06, 0.09, -0.21, 0.21, -0.30, 0.21], ['c', -0.03, 0.00, -0.27, -0.06, -0.54, -0.15], ['c', -0.84, -0.27, -1.11, -0.30, -1.65, -0.30], ['c', -0.57, 0.00, -0.84, 0.03, -1.56, 0.27], ['c', -0.60, 0.18, -0.69, 0.21, -0.81, 0.15], ['c', -0.12, -0.06, -0.21, -0.18, -0.21, -0.30], ['c', 0.00, -0.15, 0.60, -1.44, 1.20, -2.61], ['c', 1.14, -2.22, 2.73, -4.68, 5.10, -8.01], ['c', 0.21, -0.27, 0.36, -0.48, 0.33, -0.48], ['c', 0.00, 0.00, -0.12, 0.06, -0.27, 0.12], ['c', -0.54, 0.30, -0.99, 0.39, -1.56, 0.39], ['c', -0.75, 0.03, -1.20, -0.18, -1.83, -0.75], ['c', -0.99, -0.90, -1.83, -1.17, -2.31, -0.72], ['c', -0.18, 0.15, -0.36, 0.51, -0.45, 0.84], ['c', -0.06, 0.24, -0.06, 0.33, -0.09, 1.98], ['c', 0.00, 1.62, -0.03, 1.74, -0.06, 1.80], ['c', -0.15, 0.24, -0.54, 0.24, -0.69, 0.00], ['c', -0.06, -0.09, -0.06, -0.15, -0.06, -3.57], ['c', 0.00, -3.42, 0.00, -3.48, 0.06, -3.57], ['c', 0.03, -0.06, 0.09, -0.12, 0.15, -0.15], ['z']], w: 10.561, h: 15.093 },\n\t'8': { d: [['M', 4.98, -14.97], ['c', 0.33, -0.03, 1.02, -0.03, 1.32, 0.00], ['c', 1.32, 0.12, 2.49, 0.60, 3.21, 1.32], ['c', 0.39, 0.39, 0.66, 0.81, 0.78, 1.29], ['c', 0.09, 0.36, 0.09, 1.08, 0.00, 1.44], ['c', -0.21, 0.84, -0.66, 1.59, -1.59, 2.55], ['l', -0.30, 0.30], ['l', 0.27, 0.18], ['c', 1.47, 0.93, 2.31, 2.31, 2.25, 3.75], ['c', -0.03, 0.75, -0.24, 1.35, -0.63, 1.95], ['c', -0.45, 0.66, -1.02, 1.14, -1.83, 1.53], ['c', -1.80, 0.87, -4.20, 0.87, -6.00, 0.03], ['c', -1.62, -0.78, -2.52, -2.16, -2.46, -3.66], ['c', 0.06, -0.99, 0.54, -1.77, 1.80, -2.97], ['c', 0.54, -0.51, 0.54, -0.54, 0.48, -0.57], ['c', -0.39, -0.27, -0.96, -0.78, -1.20, -1.14], ['c', -0.75, -1.11, -0.87, -2.40, -0.30, -3.60], ['c', 0.69, -1.35, 2.25, -2.25, 4.20, -2.40], ['z'], ['m', 1.53, 0.69], ['c', -0.42, -0.09, -1.11, -0.12, -1.38, -0.06], ['c', -0.30, 0.06, -0.60, 0.18, -0.81, 0.30], ['c', -0.21, 0.12, -0.60, 0.51, -0.72, 0.72], ['c', -0.51, 0.87, -0.42, 1.89, 0.21, 2.52], ['c', 0.21, 0.21, 0.36, 0.30, 1.95, 1.23], ['c', 0.96, 0.54, 1.74, 0.99, 1.77, 1.02], ['c', 0.09, 0.00, 0.63, -0.60, 0.99, -1.11], ['c', 0.21, -0.36, 0.48, -0.87, 0.57, -1.23], ['c', 0.06, -0.24, 0.06, -0.36, 0.06, -0.72], ['c', 0.00, -0.45, -0.03, -0.66, -0.15, -0.99], ['c', -0.39, -0.81, -1.29, -1.44, -2.49, -1.68], ['z'], ['m', -1.44, 8.07], ['l', -1.89, -1.08], ['c', -0.03, 0.00, -0.18, 0.15, -0.39, 0.33], ['c', -1.20, 1.08, -1.65, 1.95, -1.59, 3.00], ['c', 0.09, 1.59, 1.35, 2.85, 3.21, 3.24], ['c', 0.33, 0.06, 0.45, 0.06, 0.93, 0.06], ['c', 0.63, 0.00, 0.81, -0.03, 1.29, -0.27], ['c', 0.90, -0.42, 1.47, -1.41, 1.41, -2.40], ['c', -0.06, -0.66, -0.39, -1.29, -0.90, -1.65], ['c', -0.12, -0.09, -1.05, -0.63, -2.07, -1.23], ['z']], w: 10.926, h: 14.989 },\n\t'9': { d: [['M', 4.23, -14.97], ['c', 0.42, -0.03, 1.29, 0.00, 1.62, 0.06], ['c', 0.51, 0.12, 0.93, 0.30, 1.38, 0.57], ['c', 1.53, 1.02, 2.52, 3.24, 2.73, 5.94], ['c', 0.18, 2.55, -0.48, 4.98, -1.83, 6.57], ['c', -1.05, 1.26, -2.40, 1.89, -3.93, 1.83], ['c', -1.23, -0.06, -2.31, -0.45, -3.03, -1.14], ['c', -0.57, -0.51, -0.87, -1.23, -0.84, -1.98], ['c', 0.03, -0.51, 0.21, -0.90, 0.60, -1.26], ['c', 0.24, -0.24, 0.45, -0.39, 0.75, -0.51], ['c', 0.21, -0.06, 0.27, -0.06, 0.60, -0.06], ['c', 0.33, 0.00, 0.39, 0.00, 0.60, 0.06], ['c', 0.30, 0.12, 0.51, 0.27, 0.75, 0.51], ['c', 0.39, 0.36, 0.57, 0.78, 0.57, 1.26], ['c', 0.00, 0.27, 0.00, 0.30, -0.09, 0.42], ['c', -0.03, 0.09, -0.18, 0.21, -0.30, 0.30], ['c', -0.12, 0.09, -0.30, 0.21, -0.39, 0.27], ['c', -0.09, 0.06, -0.21, 0.18, -0.27, 0.24], ['c', -0.06, 0.12, -0.06, 0.15, -0.06, 0.33], ['c', 0.00, 0.18, 0.00, 0.24, 0.06, 0.36], ['c', 0.24, 0.39, 0.75, 0.60, 1.38, 0.57], ['c', 0.54, -0.03, 0.90, -0.18, 1.23, -0.48], ['c', 0.81, -0.72, 1.08, -2.16, 0.96, -5.37], ['l', 0.00, -0.63], ['l', -0.30, 0.12], ['c', -0.78, 0.27, -1.29, 0.33, -2.10, 0.27], ['c', -1.47, -0.12, -2.49, -0.54, -3.27, -1.29], ['c', -0.48, -0.51, -0.81, -1.11, -0.96, -1.89], ['c', -0.06, -0.27, -0.06, -0.42, -0.06, -0.96], ['c', 0.00, -0.51, 0.00, -0.66, 0.06, -0.93], ['c', 0.15, -0.78, 0.48, -1.38, 0.96, -1.89], ['c', 0.15, -0.12, 0.33, -0.27, 0.42, -0.36], ['c', 0.69, -0.51, 1.62, -0.81, 2.76, -0.93], ['z'], ['m', 1.17, 0.66], ['c', -0.21, -0.06, -0.57, -0.06, -0.81, -0.03], ['c', -0.78, 0.12, -1.26, 0.69, -1.41, 1.74], ['c', -0.12, 0.63, -0.15, 1.95, -0.09, 2.79], ['c', 0.12, 1.71, 0.63, 2.40, 1.77, 2.46], ['c', 1.08, 0.03, 1.62, -0.48, 1.80, -1.74], ['c', 0.06, -0.54, 0.06, -3.00, 0.00, -3.54], ['c', -0.15, -1.05, -0.51, -1.53, -1.26, -1.68], ['z']], w: 9.959, h: 14.986 },\n\t'rests.multimeasure': { d: [['M', 0, -4], ['l', 0, 16], ['l', 1, 0], ['l', 0, -5], ['l', 40, 0], ['l', 0, 5], ['l', 1, 0], ['l', 0, -16], ['l', -1, 0], ['l', 0, 5], ['l', -40, 0], ['l', 0, -5], ['z']], w: 42, h: 18 },\n\t'rests.whole': { d: [['M', 0.06, 0.03], ['l', 0.09, -0.06], ['l', 5.46, 0.00], ['l', 5.49, 0.00], ['l', 0.09, 0.06], ['l', 0.06, 0.09], ['l', 0.00, 2.19], ['l', 0.00, 2.19], ['l', -0.06, 0.09], ['l', -0.09, 0.06], ['l', -5.49, 0.00], ['l', -5.46, 0.00], ['l', -0.09, -0.06], ['l', -0.06, -0.09], ['l', 0.00, -2.19], ['l', 0.00, -2.19], ['z']], w: 11.25, h: 4.68 },\n\t'rests.half': { d: [['M', 0.06, -4.62], ['l', 0.09, -0.06], ['l', 5.46, 0.00], ['l', 5.49, 0.00], ['l', 0.09, 0.06], ['l', 0.06, 0.09], ['l', 0.00, 2.19], ['l', 0.00, 2.19], ['l', -0.06, 0.09], ['l', -0.09, 0.06], ['l', -5.49, 0.00], ['l', -5.46, 0.00], ['l', -0.09, -0.06], ['l', -0.06, -0.09], ['l', 0.00, -2.19], ['l', 0.00, -2.19], ['z']], w: 11.25, h: 4.68 },\n\t'rests.quarter': { d: [['M', 1.89, -11.82], ['c', 0.12, -0.06, 0.24, -0.06, 0.36, -0.03], ['c', 0.09, 0.06, 4.74, 5.58, 4.86, 5.82], ['c', 0.21, 0.39, 0.15, 0.78, -0.15, 1.26], ['c', -0.24, 0.33, -0.72, 0.81, -1.62, 1.56], ['c', -0.45, 0.36, -0.87, 0.75, -0.96, 0.84], ['c', -0.93, 0.99, -1.14, 2.49, -0.60, 3.63], ['c', 0.18, 0.39, 0.27, 0.48, 1.32, 1.68], ['c', 1.92, 2.25, 1.83, 2.16, 1.83, 2.34], ['c', 0.00, 0.18, -0.18, 0.36, -0.36, 0.39], ['c', -0.15, 0.00, -0.27, -0.06, -0.48, -0.27], ['c', -0.75, -0.75, -2.46, -1.29, -3.39, -1.08], ['c', -0.45, 0.09, -0.69, 0.27, -0.90, 0.69], ['c', -0.12, 0.30, -0.21, 0.66, -0.24, 1.14], ['c', -0.03, 0.66, 0.09, 1.35, 0.30, 2.01], ['c', 0.15, 0.42, 0.24, 0.66, 0.45, 0.96], ['c', 0.18, 0.24, 0.18, 0.33, 0.03, 0.42], ['c', -0.12, 0.06, -0.18, 0.03, -0.45, -0.30], ['c', -1.08, -1.38, -2.07, -3.36, -2.40, -4.83], ['c', -0.27, -1.05, -0.15, -1.77, 0.27, -2.07], ['c', 0.21, -0.12, 0.42, -0.15, 0.87, -0.15], ['c', 0.87, 0.06, 2.10, 0.39, 3.30, 0.90], ['l', 0.39, 0.18], ['l', -1.65, -1.95], ['c', -2.52, -2.97, -2.61, -3.09, -2.70, -3.27], ['c', -0.09, -0.24, -0.12, -0.48, -0.03, -0.75], ['c', 0.15, -0.48, 0.57, -0.96, 1.83, -2.01], ['c', 0.45, -0.36, 0.84, -0.72, 0.93, -0.78], ['c', 0.69, -0.75, 1.02, -1.80, 0.90, -2.79], ['c', -0.06, -0.33, -0.21, -0.84, -0.39, -1.11], ['c', -0.09, -0.15, -0.45, -0.60, -0.81, -1.05], ['c', -0.36, -0.42, -0.69, -0.81, -0.72, -0.87], ['c', -0.09, -0.18, 0.00, -0.42, 0.21, -0.51], ['z']], w: 7.888, h: 21.435 },\n\t'rests.8th': { d: [['M', 1.68, -6.12], ['c', 0.66, -0.09, 1.23, 0.09, 1.68, 0.51], ['c', 0.27, 0.30, 0.39, 0.54, 0.57, 1.26], ['c', 0.09, 0.33, 0.18, 0.66, 0.21, 0.72], ['c', 0.12, 0.27, 0.33, 0.45, 0.60, 0.48], ['c', 0.12, 0.00, 0.18, 0.00, 0.33, -0.09], ['c', 0.39, -0.18, 1.32, -1.29, 1.68, -1.98], ['c', 0.09, -0.21, 0.24, -0.30, 0.39, -0.30], ['c', 0.12, 0.00, 0.27, 0.09, 0.33, 0.18], ['c', 0.03, 0.06, -0.27, 1.11, -1.86, 6.42], ['c', -1.02, 3.48, -1.89, 6.39, -1.92, 6.42], ['c', 0.00, 0.03, -0.12, 0.12, -0.24, 0.15], ['c', -0.18, 0.09, -0.21, 0.09, -0.45, 0.09], ['c', -0.24, 0.00, -0.30, 0.00, -0.48, -0.06], ['c', -0.09, -0.06, -0.21, -0.12, -0.21, -0.15], ['c', -0.06, -0.03, 0.15, -0.57, 1.68, -4.92], ['c', 0.96, -2.67, 1.74, -4.89, 1.71, -4.89], ['l', -0.51, 0.15], ['c', -1.08, 0.36, -1.74, 0.48, -2.55, 0.48], ['c', -0.66, 0.00, -0.84, -0.03, -1.32, -0.27], ['c', -1.32, -0.63, -1.77, -2.16, -1.02, -3.30], ['c', 0.33, -0.45, 0.84, -0.81, 1.38, -0.90], ['z']], w: 7.534, h: 13.883 },\n\t'rests.16th': { d: [['M', 3.33, -6.12], ['c', 0.66, -0.09, 1.23, 0.09, 1.68, 0.51], ['c', 0.27, 0.30, 0.39, 0.54, 0.57, 1.26], ['c', 0.09, 0.33, 0.18, 0.66, 0.21, 0.72], ['c', 0.15, 0.39, 0.57, 0.57, 0.87, 0.42], ['c', 0.39, -0.18, 1.20, -1.23, 1.62, -2.07], ['c', 0.06, -0.15, 0.24, -0.24, 0.36, -0.24], ['c', 0.12, 0.00, 0.27, 0.09, 0.33, 0.18], ['c', 0.03, 0.06, -0.45, 1.86, -2.67, 10.17], ['c', -1.50, 5.55, -2.73, 10.14, -2.76, 10.17], ['c', -0.03, 0.03, -0.12, 0.12, -0.24, 0.15], ['c', -0.18, 0.09, -0.21, 0.09, -0.45, 0.09], ['c', -0.24, 0.00, -0.30, 0.00, -0.48, -0.06], ['c', -0.09, -0.06, -0.21, -0.12, -0.21, -0.15], ['c', -0.06, -0.03, 0.12, -0.57, 1.44, -4.92], ['c', 0.81, -2.67, 1.47, -4.86, 1.47, -4.89], ['c', -0.03, 0.00, -0.27, 0.06, -0.54, 0.15], ['c', -1.08, 0.36, -1.77, 0.48, -2.58, 0.48], ['c', -0.66, 0.00, -0.84, -0.03, -1.32, -0.27], ['c', -1.32, -0.63, -1.77, -2.16, -1.02, -3.30], ['c', 0.72, -1.05, 2.22, -1.23, 3.06, -0.42], ['c', 0.30, 0.33, 0.42, 0.60, 0.60, 1.38], ['c', 0.09, 0.45, 0.21, 0.78, 0.33, 0.90], ['c', 0.09, 0.09, 0.27, 0.18, 0.45, 0.21], ['c', 0.12, 0.00, 0.18, 0.00, 0.33, -0.09], ['c', 0.33, -0.15, 1.02, -0.93, 1.41, -1.59], ['c', 0.12, -0.21, 0.18, -0.39, 0.39, -1.08], ['c', 0.66, -2.10, 1.17, -3.84, 1.17, -3.87], ['c', 0.00, 0.00, -0.21, 0.06, -0.42, 0.15], ['c', -0.51, 0.15, -1.20, 0.33, -1.68, 0.42], ['c', -0.33, 0.06, -0.51, 0.06, -0.96, 0.06], ['c', -0.66, 0.00, -0.84, -0.03, -1.32, -0.27], ['c', -1.32, -0.63, -1.77, -2.16, -1.02, -3.30], ['c', 0.33, -0.45, 0.84, -0.81, 1.38, -0.90], ['z']], w: 9.724, h: 21.383 },\n\t'rests.32nd': { d: [['M', 4.23, -13.62], ['c', 0.66, -0.09, 1.23, 0.09, 1.68, 0.51], ['c', 0.27, 0.30, 0.39, 0.54, 0.57, 1.26], ['c', 0.09, 0.33, 0.18, 0.66, 0.21, 0.72], ['c', 0.12, 0.27, 0.33, 0.45, 0.60, 0.48], ['c', 0.12, 0.00, 0.18, 0.00, 0.27, -0.06], ['c', 0.33, -0.21, 0.99, -1.11, 1.44, -1.98], ['c', 0.09, -0.24, 0.21, -0.33, 0.39, -0.33], ['c', 0.12, 0.00, 0.27, 0.09, 0.33, 0.18], ['c', 0.03, 0.06, -0.57, 2.67, -3.21, 13.89], ['c', -1.80, 7.62, -3.30, 13.89, -3.30, 13.92], ['c', -0.03, 0.06, -0.12, 0.12, -0.24, 0.18], ['c', -0.21, 0.09, -0.24, 0.09, -0.48, 0.09], ['c', -0.24, 0.00, -0.30, 0.00, -0.48, -0.06], ['c', -0.09, -0.06, -0.21, -0.12, -0.21, -0.15], ['c', -0.06, -0.03, 0.09, -0.57, 1.23, -4.92], ['c', 0.69, -2.67, 1.26, -4.86, 1.29, -4.89], ['c', 0.00, -0.03, -0.12, -0.03, -0.48, 0.12], ['c', -1.17, 0.39, -2.22, 0.57, -3.00, 0.54], ['c', -0.42, -0.03, -0.75, -0.12, -1.11, -0.30], ['c', -1.32, -0.63, -1.77, -2.16, -1.02, -3.30], ['c', 0.72, -1.05, 2.22, -1.23, 3.06, -0.42], ['c', 0.30, 0.33, 0.42, 0.60, 0.60, 1.38], ['c', 0.09, 0.45, 0.21, 0.78, 0.33, 0.90], ['c', 0.12, 0.09, 0.30, 0.18, 0.48, 0.21], ['c', 0.12, 0.00, 0.18, 0.00, 0.30, -0.09], ['c', 0.42, -0.21, 1.29, -1.29, 1.56, -1.89], ['c', 0.03, -0.12, 1.23, -4.59, 1.23, -4.65], ['c', 0.00, -0.03, -0.18, 0.03, -0.39, 0.12], ['c', -0.63, 0.18, -1.20, 0.36, -1.74, 0.45], ['c', -0.39, 0.06, -0.54, 0.06, -1.02, 0.06], ['c', -0.66, 0.00, -0.84, -0.03, -1.32, -0.27], ['c', -1.32, -0.63, -1.77, -2.16, -1.02, -3.30], ['c', 0.72, -1.05, 2.22, -1.23, 3.06, -0.42], ['c', 0.30, 0.33, 0.42, 0.60, 0.60, 1.38], ['c', 0.09, 0.45, 0.21, 0.78, 0.33, 0.90], ['c', 0.18, 0.18, 0.51, 0.27, 0.72, 0.15], ['c', 0.30, -0.12, 0.69, -0.57, 1.08, -1.17], ['c', 0.42, -0.60, 0.39, -0.51, 1.05, -3.03], ['c', 0.33, -1.26, 0.60, -2.31, 0.60, -2.34], ['c', 0.00, 0.00, -0.21, 0.03, -0.45, 0.12], ['c', -0.57, 0.18, -1.14, 0.33, -1.62, 0.42], ['c', -0.33, 0.06, -0.51, 0.06, -0.96, 0.06], ['c', -0.66, 0.00, -0.84, -0.03, -1.32, -0.27], ['c', -1.32, -0.63, -1.77, -2.16, -1.02, -3.30], ['c', 0.33, -0.45, 0.84, -0.81, 1.38, -0.90], ['z']], w: 11.373, h: 28.883 },\n\t'rests.64th': { d: [['M', 5.13, -13.62], ['c', 0.66, -0.09, 1.23, 0.09, 1.68, 0.51], ['c', 0.27, 0.30, 0.39, 0.54, 0.57, 1.26], ['c', 0.15, 0.63, 0.21, 0.81, 0.33, 0.96], ['c', 0.18, 0.21, 0.54, 0.30, 0.75, 0.18], ['c', 0.24, -0.12, 0.63, -0.66, 1.08, -1.56], ['c', 0.33, -0.66, 0.39, -0.72, 0.60, -0.72], ['c', 0.12, 0.00, 0.27, 0.09, 0.33, 0.18], ['c', 0.03, 0.06, -0.69, 3.66, -3.54, 17.64], ['c', -1.95, 9.66, -3.57, 17.61, -3.57, 17.64], ['c', -0.03, 0.06, -0.12, 0.12, -0.24, 0.18], ['c', -0.21, 0.09, -0.24, 0.09, -0.48, 0.09], ['c', -0.24, 0.00, -0.30, 0.00, -0.48, -0.06], ['c', -0.09, -0.06, -0.21, -0.12, -0.21, -0.15], ['c', -0.06, -0.03, 0.06, -0.57, 1.05, -4.95], ['c', 0.60, -2.70, 1.08, -4.89, 1.08, -4.92], ['c', 0.00, 0.00, -0.24, 0.06, -0.51, 0.15], ['c', -0.66, 0.24, -1.20, 0.36, -1.77, 0.48], ['c', -0.42, 0.06, -0.57, 0.06, -1.05, 0.06], ['c', -0.69, 0.00, -0.87, -0.03, -1.35, -0.27], ['c', -1.32, -0.63, -1.77, -2.16, -1.02, -3.30], ['c', 0.72, -1.05, 2.22, -1.23, 3.06, -0.42], ['c', 0.30, 0.33, 0.42, 0.60, 0.60, 1.38], ['c', 0.09, 0.45, 0.21, 0.78, 0.33, 0.90], ['c', 0.09, 0.09, 0.27, 0.18, 0.45, 0.21], ['c', 0.21, 0.03, 0.39, -0.09, 0.72, -0.42], ['c', 0.45, -0.45, 1.02, -1.26, 1.17, -1.65], ['c', 0.03, -0.09, 0.27, -1.14, 0.54, -2.34], ['c', 0.27, -1.20, 0.48, -2.19, 0.51, -2.22], ['c', 0.00, -0.03, -0.09, -0.03, -0.48, 0.12], ['c', -1.17, 0.39, -2.22, 0.57, -3.00, 0.54], ['c', -0.42, -0.03, -0.75, -0.12, -1.11, -0.30], ['c', -1.32, -0.63, -1.77, -2.16, -1.02, -3.30], ['c', 0.36, -0.54, 0.96, -0.87, 1.65, -0.93], ['c', 0.54, -0.03, 1.02, 0.15, 1.41, 0.54], ['c', 0.27, 0.30, 0.39, 0.54, 0.57, 1.26], ['c', 0.09, 0.33, 0.18, 0.66, 0.21, 0.72], ['c', 0.15, 0.39, 0.57, 0.57, 0.90, 0.42], ['c', 0.36, -0.18, 1.20, -1.26, 1.47, -1.89], ['c', 0.03, -0.09, 0.30, -1.20, 0.57, -2.43], ['l', 0.51, -2.28], ['l', -0.54, 0.18], ['c', -1.11, 0.36, -1.80, 0.48, -2.61, 0.48], ['c', -0.66, 0.00, -0.84, -0.03, -1.32, -0.27], ['c', -1.32, -0.63, -1.77, -2.16, -1.02, -3.30], ['c', 0.36, -0.54, 0.96, -0.87, 1.65, -0.93], ['c', 0.54, -0.03, 1.02, 0.15, 1.41, 0.54], ['c', 0.27, 0.30, 0.39, 0.54, 0.57, 1.26], ['c', 0.15, 0.63, 0.21, 0.81, 0.33, 0.96], ['c', 0.21, 0.21, 0.54, 0.30, 0.75, 0.18], ['c', 0.36, -0.18, 0.93, -0.93, 1.29, -1.68], ['c', 0.12, -0.24, 0.18, -0.48, 0.63, -2.55], ['l', 0.51, -2.31], ['c', 0.00, -0.03, -0.18, 0.03, -0.39, 0.12], ['c', -1.14, 0.36, -2.10, 0.54, -2.82, 0.51], ['c', -0.42, -0.03, -0.75, -0.12, -1.11, -0.30], ['c', -1.32, -0.63, -1.77, -2.16, -1.02, -3.30], ['c', 0.33, -0.45, 0.84, -0.81, 1.38, -0.90], ['z']], w: 12.453, h: 36.383 },\n\t'rests.128th': { d: [['M', 6.03, -21.12], ['c', 0.66, -0.09, 1.23, 0.09, 1.68, 0.51], ['c', 0.27, 0.30, 0.39, 0.54, 0.57, 1.26], ['c', 0.09, 0.33, 0.18, 0.66, 0.21, 0.72], ['c', 0.12, 0.27, 0.33, 0.45, 0.60, 0.48], ['c', 0.21, 0.00, 0.33, -0.06, 0.54, -0.36], ['c', 0.15, -0.21, 0.54, -0.93, 0.78, -1.47], ['c', 0.15, -0.33, 0.18, -0.39, 0.30, -0.48], ['c', 0.18, -0.09, 0.45, 0.00, 0.51, 0.15], ['c', 0.03, 0.09, -7.11, 42.75, -7.17, 42.84], ['c', -0.03, 0.03, -0.15, 0.09, -0.24, 0.15], ['c', -0.18, 0.06, -0.24, 0.06, -0.45, 0.06], ['c', -0.24, 0.00, -0.30, 0.00, -0.48, -0.06], ['c', -0.09, -0.06, -0.21, -0.12, -0.21, -0.15], ['c', -0.06, -0.03, 0.03, -0.57, 0.84, -4.98], ['c', 0.51, -2.70, 0.93, -4.92, 0.90, -4.92], ['c', 0.00, 0.00, -0.15, 0.06, -0.36, 0.12], ['c', -0.78, 0.27, -1.62, 0.48, -2.31, 0.57], ['c', -0.15, 0.03, -0.54, 0.03, -0.81, 0.03], ['c', -0.66, 0.00, -0.84, -0.03, -1.32, -0.27], ['c', -1.32, -0.63, -1.77, -2.16, -1.02, -3.30], ['c', 0.36, -0.54, 0.96, -0.87, 1.65, -0.93], ['c', 0.54, -0.03, 1.02, 0.15, 1.41, 0.54], ['c', 0.27, 0.30, 0.39, 0.54, 0.57, 1.26], ['c', 0.09, 0.33, 0.18, 0.66, 0.21, 0.72], ['c', 0.12, 0.27, 0.33, 0.45, 0.63, 0.48], ['c', 0.12, 0.00, 0.18, 0.00, 0.30, -0.09], ['c', 0.42, -0.21, 1.14, -1.11, 1.50, -1.83], ['c', 0.12, -0.27, 0.12, -0.27, 0.54, -2.52], ['c', 0.24, -1.23, 0.42, -2.25, 0.39, -2.25], ['c', 0.00, 0.00, -0.24, 0.06, -0.51, 0.18], ['c', -1.26, 0.39, -2.25, 0.57, -3.06, 0.54], ['c', -0.42, -0.03, -0.75, -0.12, -1.11, -0.30], ['c', -1.32, -0.63, -1.77, -2.16, -1.02, -3.30], ['c', 0.36, -0.54, 0.96, -0.87, 1.65, -0.93], ['c', 0.54, -0.03, 1.02, 0.15, 1.41, 0.54], ['c', 0.27, 0.30, 0.39, 0.54, 0.57, 1.26], ['c', 0.15, 0.63, 0.21, 0.81, 0.33, 0.96], ['c', 0.18, 0.21, 0.51, 0.30, 0.75, 0.18], ['c', 0.36, -0.15, 1.05, -0.99, 1.41, -1.77], ['l', 0.15, -0.30], ['l', 0.42, -2.25], ['c', 0.21, -1.26, 0.42, -2.28, 0.39, -2.28], ['l', -0.51, 0.15], ['c', -1.11, 0.39, -1.89, 0.51, -2.70, 0.51], ['c', -0.66, 0.00, -0.84, -0.03, -1.32, -0.27], ['c', -1.32, -0.63, -1.77, -2.16, -1.02, -3.30], ['c', 0.36, -0.54, 0.96, -0.87, 1.65, -0.93], ['c', 0.54, -0.03, 1.02, 0.15, 1.41, 0.54], ['c', 0.27, 0.30, 0.39, 0.54, 0.57, 1.26], ['c', 0.15, 0.63, 0.21, 0.81, 0.33, 0.96], ['c', 0.18, 0.18, 0.48, 0.27, 0.72, 0.21], ['c', 0.33, -0.12, 1.14, -1.26, 1.41, -1.95], ['c', 0.00, -0.09, 0.21, -1.11, 0.45, -2.34], ['c', 0.21, -1.20, 0.39, -2.22, 0.39, -2.28], ['c', 0.03, -0.03, 0.00, -0.03, -0.45, 0.12], ['c', -0.57, 0.18, -1.20, 0.33, -1.71, 0.42], ['c', -0.30, 0.06, -0.51, 0.06, -0.93, 0.06], ['c', -0.66, 0.00, -0.84, -0.03, -1.32, -0.27], ['c', -1.32, -0.63, -1.77, -2.16, -1.02, -3.30], ['c', 0.36, -0.54, 0.96, -0.87, 1.65, -0.93], ['c', 0.54, -0.03, 1.02, 0.15, 1.41, 0.54], ['c', 0.27, 0.30, 0.39, 0.54, 0.57, 1.26], ['c', 0.09, 0.33, 0.18, 0.66, 0.21, 0.72], ['c', 0.12, 0.27, 0.33, 0.45, 0.60, 0.48], ['c', 0.18, 0.00, 0.36, -0.09, 0.57, -0.33], ['c', 0.33, -0.36, 0.78, -1.14, 0.93, -1.56], ['c', 0.03, -0.12, 0.24, -1.20, 0.45, -2.40], ['c', 0.24, -1.20, 0.42, -2.22, 0.42, -2.28], ['c', 0.03, -0.03, 0.00, -0.03, -0.39, 0.09], ['c', -1.05, 0.36, -1.80, 0.48, -2.58, 0.48], ['c', -0.63, 0.00, -0.84, -0.03, -1.29, -0.27], ['c', -1.32, -0.63, -1.77, -2.16, -1.02, -3.30], ['c', 0.33, -0.45, 0.84, -0.81, 1.38, -0.90], ['z']], w: 12.992, h: 43.883 },\n\t'accidentals.sharp': { d: [['M', 5.73, -11.19], ['c', 0.21, -0.12, 0.54, -0.03, 0.66, 0.24], ['c', 0.06, 0.12, 0.06, 0.21, 0.06, 2.31], ['c', 0.00, 1.23, 0.00, 2.22, 0.03, 2.22], ['c', 0.00, 0.00, 0.27, -0.12, 0.60, -0.24], ['c', 0.69, -0.27, 0.78, -0.30, 0.96, -0.15], ['c', 0.21, 0.15, 0.21, 0.18, 0.21, 1.38], ['c', 0.00, 1.02, 0.00, 1.11, -0.06, 1.20], ['c', -0.03, 0.06, -0.09, 0.12, -0.12, 0.15], ['c', -0.06, 0.03, -0.42, 0.21, -0.84, 0.36], ['l', -0.75, 0.33], ['l', -0.03, 2.43], ['c', 0.00, 1.32, 0.00, 2.43, 0.03, 2.43], ['c', 0.00, 0.00, 0.27, -0.12, 0.60, -0.24], ['c', 0.69, -0.27, 0.78, -0.30, 0.96, -0.15], ['c', 0.21, 0.15, 0.21, 0.18, 0.21, 1.38], ['c', 0.00, 1.02, 0.00, 1.11, -0.06, 1.20], ['c', -0.03, 0.06, -0.09, 0.12, -0.12, 0.15], ['c', -0.06, 0.03, -0.42, 0.21, -0.84, 0.36], ['l', -0.75, 0.33], ['l', -0.03, 2.52], ['c', 0.00, 2.28, -0.03, 2.55, -0.06, 2.64], ['c', -0.21, 0.36, -0.72, 0.36, -0.93, 0.00], ['c', -0.03, -0.09, -0.06, -0.33, -0.06, -2.43], ['l', 0.00, -2.31], ['l', -1.29, 0.51], ['l', -1.26, 0.51], ['l', 0.00, 2.43], ['c', 0.00, 2.58, 0.00, 2.52, -0.15, 2.67], ['c', -0.06, 0.09, -0.27, 0.18, -0.36, 0.18], ['c', -0.12, 0.00, -0.33, -0.09, -0.39, -0.18], ['c', -0.15, -0.15, -0.15, -0.09, -0.15, -2.43], ['c', 0.00, -1.23, 0.00, -2.22, -0.03, -2.22], ['c', 0.00, 0.00, -0.27, 0.12, -0.60, 0.24], ['c', -0.69, 0.27, -0.78, 0.30, -0.96, 0.15], ['c', -0.21, -0.15, -0.21, -0.18, -0.21, -1.38], ['c', 0.00, -1.02, 0.00, -1.11, 0.06, -1.20], ['c', 0.03, -0.06, 0.09, -0.12, 0.12, -0.15], ['c', 0.06, -0.03, 0.42, -0.21, 0.84, -0.36], ['l', 0.78, -0.33], ['l', 0.00, -2.43], ['c', 0.00, -1.32, 0.00, -2.43, -0.03, -2.43], ['c', 0.00, 0.00, -0.27, 0.12, -0.60, 0.24], ['c', -0.69, 0.27, -0.78, 0.30, -0.96, 0.15], ['c', -0.21, -0.15, -0.21, -0.18, -0.21, -1.38], ['c', 0.00, -1.02, 0.00, -1.11, 0.06, -1.20], ['c', 0.03, -0.06, 0.09, -0.12, 0.12, -0.15], ['c', 0.06, -0.03, 0.42, -0.21, 0.84, -0.36], ['l', 0.78, -0.33], ['l', 0.00, -2.52], ['c', 0.00, -2.28, 0.03, -2.55, 0.06, -2.64], ['c', 0.21, -0.36, 0.72, -0.36, 0.93, 0.00], ['c', 0.03, 0.09, 0.06, 0.33, 0.06, 2.43], ['l', 0.03, 2.31], ['l', 1.26, -0.51], ['l', 1.26, -0.51], ['l', 0.00, -2.43], ['c', 0.00, -2.28, 0.00, -2.43, 0.06, -2.55], ['c', 0.06, -0.12, 0.12, -0.18, 0.27, -0.24], ['z'], ['m', -0.33, 10.65], ['l', 0.00, -2.43], ['l', -1.29, 0.51], ['l', -1.26, 0.51], ['l', 0.00, 2.46], ['l', 0.00, 2.43], ['l', 0.09, -0.03], ['c', 0.06, -0.03, 0.63, -0.27, 1.29, -0.51], ['l', 1.17, -0.48], ['l', 0.00, -2.46], ['z']], w: 8.25, h: 22.462 },\n\t'accidentals.halfsharp': { d: [['M', 2.43, -10.05], ['c', 0.21, -0.12, 0.54, -0.03, 0.66, 0.24], ['c', 0.06, 0.12, 0.06, 0.21, 0.06, 2.01], ['c', 0.00, 1.05, 0.00, 1.89, 0.03, 1.89], ['l', 0.72, -0.48], ['c', 0.69, -0.48, 0.69, -0.51, 0.87, -0.51], ['c', 0.15, 0.00, 0.18, 0.03, 0.27, 0.09], ['c', 0.21, 0.15, 0.21, 0.18, 0.21, 1.41], ['c', 0.00, 1.11, -0.03, 1.14, -0.09, 1.23], ['c', -0.03, 0.03, -0.48, 0.39, -1.02, 0.75], ['l', -0.99, 0.66], ['l', 0.00, 2.37], ['c', 0.00, 1.32, 0.00, 2.37, 0.03, 2.37], ['l', 0.72, -0.48], ['c', 0.69, -0.48, 0.69, -0.51, 0.87, -0.51], ['c', 0.15, 0.00, 0.18, 0.03, 0.27, 0.09], ['c', 0.21, 0.15, 0.21, 0.18, 0.21, 1.41], ['c', 0.00, 1.11, -0.03, 1.14, -0.09, 1.23], ['c', -0.03, 0.03, -0.48, 0.39, -1.02, 0.75], ['l', -0.99, 0.66], ['l', 0.00, 2.25], ['c', 0.00, 1.95, 0.00, 2.28, -0.06, 2.37], ['c', -0.06, 0.12, -0.12, 0.21, -0.24, 0.27], ['c', -0.27, 0.12, -0.54, 0.03, -0.69, -0.24], ['c', -0.06, -0.12, -0.06, -0.21, -0.06, -2.01], ['c', 0.00, -1.05, 0.00, -1.89, -0.03, -1.89], ['l', -0.72, 0.48], ['c', -0.69, 0.48, -0.69, 0.48, -0.87, 0.48], ['c', -0.15, 0.00, -0.18, 0.00, -0.27, -0.06], ['c', -0.21, -0.15, -0.21, -0.18, -0.21, -1.41], ['c', 0.00, -1.11, 0.03, -1.14, 0.09, -1.23], ['c', 0.03, -0.03, 0.48, -0.39, 1.02, -0.75], ['l', 0.99, -0.66], ['l', 0.00, -2.37], ['c', 0.00, -1.32, 0.00, -2.37, -0.03, -2.37], ['l', -0.72, 0.48], ['c', -0.69, 0.48, -0.69, 0.48, -0.87, 0.48], ['c', -0.15, 0.00, -0.18, 0.00, -0.27, -0.06], ['c', -0.21, -0.15, -0.21, -0.18, -0.21, -1.41], ['c', 0.00, -1.11, 0.03, -1.14, 0.09, -1.23], ['c', 0.03, -0.03, 0.48, -0.39, 1.02, -0.75], ['l', 0.99, -0.66], ['l', 0.00, -2.25], ['c', 0.00, -2.13, 0.00, -2.28, 0.06, -2.40], ['c', 0.06, -0.12, 0.12, -0.18, 0.27, -0.24], ['z']], w: 5.25, h: 20.174 },\n\t'accidentals.nat': { d: [['M', 0.21, -11.40], ['c', 0.24, -0.06, 0.78, 0.00, 0.99, 0.15], ['c', 0.03, 0.03, 0.03, 0.48, 0.00, 2.61], ['c', -0.03, 1.44, -0.03, 2.61, -0.03, 2.61], ['c', 0.00, 0.03, 0.75, -0.09, 1.68, -0.24], ['c', 0.96, -0.18, 1.71, -0.27, 1.74, -0.27], ['c', 0.15, 0.03, 0.27, 0.15, 0.36, 0.30], ['l', 0.06, 0.12], ['l', 0.09, 8.67], ['c', 0.09, 6.96, 0.12, 8.67, 0.09, 8.67], ['c', -0.03, 0.03, -0.12, 0.06, -0.21, 0.09], ['c', -0.24, 0.09, -0.72, 0.09, -0.96, 0.00], ['c', -0.09, -0.03, -0.18, -0.06, -0.21, -0.09], ['c', -0.03, -0.03, -0.03, -0.48, 0.00, -2.61], ['c', 0.03, -1.44, 0.03, -2.61, 0.03, -2.61], ['c', 0.00, -0.03, -0.75, 0.09, -1.68, 0.24], ['c', -0.96, 0.18, -1.71, 0.27, -1.74, 0.27], ['c', -0.15, -0.03, -0.27, -0.15, -0.36, -0.30], ['l', -0.06, -0.15], ['l', -0.09, -7.53], ['c', -0.06, -4.14, -0.09, -8.04, -0.12, -8.67], ['l', 0.00, -1.11], ['l', 0.15, -0.06], ['c', 0.09, -0.03, 0.21, -0.06, 0.27, -0.09], ['z'], ['m', 3.75, 8.40], ['c', 0.00, -0.33, 0.00, -0.42, -0.03, -0.42], ['c', -0.12, 0.00, -2.79, 0.45, -2.79, 0.48], ['c', -0.03, 0.00, -0.09, 6.30, -0.09, 6.33], ['c', 0.03, 0.00, 2.79, -0.45, 2.82, -0.48], ['c', 0.00, 0.00, 0.09, -4.53, 0.09, -5.91], ['z']], w: 5.4, h: 22.8 },\n\t'accidentals.flat': { d: [['M', -0.36, -14.07], ['c', 0.33, -0.06, 0.87, 0.00, 1.08, 0.15], ['c', 0.06, 0.03, 0.06, 0.36, -0.03, 5.25], ['c', -0.06, 2.85, -0.09, 5.19, -0.09, 5.19], ['c', 0.00, 0.03, 0.12, -0.03, 0.24, -0.12], ['c', 0.63, -0.42, 1.41, -0.66, 2.19, -0.72], ['c', 0.81, -0.03, 1.47, 0.21, 2.04, 0.78], ['c', 0.57, 0.54, 0.87, 1.26, 0.93, 2.04], ['c', 0.03, 0.57, -0.09, 1.08, -0.36, 1.62], ['c', -0.42, 0.81, -1.02, 1.38, -2.82, 2.61], ['c', -1.14, 0.78, -1.44, 1.02, -1.80, 1.44], ['c', -0.18, 0.18, -0.39, 0.39, -0.45, 0.42], ['c', -0.27, 0.18, -0.57, 0.15, -0.81, -0.06], ['c', -0.06, -0.09, -0.12, -0.18, -0.15, -0.27], ['c', -0.03, -0.06, -0.09, -3.27, -0.18, -8.34], ['c', -0.09, -4.53, -0.15, -8.58, -0.18, -9.03], ['l', 0.00, -0.78], ['l', 0.12, -0.06], ['c', 0.06, -0.03, 0.18, -0.09, 0.27, -0.12], ['z'], ['m', 3.18, 11.01], ['c', -0.21, -0.12, -0.54, -0.15, -0.81, -0.06], ['c', -0.54, 0.15, -0.99, 0.63, -1.17, 1.26], ['c', -0.06, 0.30, -0.12, 2.88, -0.06, 3.87], ['c', 0.03, 0.42, 0.03, 0.81, 0.06, 0.90], ['l', 0.03, 0.12], ['l', 0.45, -0.39], ['c', 0.63, -0.54, 1.26, -1.17, 1.56, -1.59], ['c', 0.30, -0.42, 0.60, -0.99, 0.72, -1.41], ['c', 0.18, -0.69, 0.09, -1.47, -0.18, -2.07], ['c', -0.15, -0.30, -0.33, -0.51, -0.60, -0.63], ['z']], w: 6.75, h: 18.801 },\n\t'accidentals.halfflat': { d: [['M', 4.83, -14.07], ['c', 0.33, -0.06, 0.87, 0.00, 1.08, 0.15], ['c', 0.06, 0.03, 0.06, 0.60, -0.12, 9.06], ['c', -0.09, 5.55, -0.15, 9.06, -0.18, 9.12], ['c', -0.03, 0.09, -0.09, 0.18, -0.15, 0.27], ['c', -0.24, 0.21, -0.54, 0.24, -0.81, 0.06], ['c', -0.06, -0.03, -0.27, -0.24, -0.45, -0.42], ['c', -0.36, -0.42, -0.66, -0.66, -1.80, -1.44], ['c', -1.23, -0.84, -1.83, -1.32, -2.25, -1.77], ['c', -0.66, -0.78, -0.96, -1.56, -0.93, -2.46], ['c', 0.09, -1.41, 1.11, -2.58, 2.40, -2.79], ['c', 0.30, -0.06, 0.84, -0.03, 1.23, 0.06], ['c', 0.54, 0.12, 1.08, 0.33, 1.53, 0.63], ['c', 0.12, 0.09, 0.24, 0.15, 0.24, 0.12], ['c', 0.00, 0.00, -0.12, -8.37, -0.18, -9.75], ['l', 0.00, -0.66], ['l', 0.12, -0.06], ['c', 0.06, -0.03, 0.18, -0.09, 0.27, -0.12], ['z'], ['m', -1.65, 10.95], ['c', -0.60, -0.18, -1.08, 0.09, -1.38, 0.69], ['c', -0.27, 0.60, -0.36, 1.38, -0.18, 2.07], ['c', 0.12, 0.42, 0.42, 0.99, 0.72, 1.41], ['c', 0.30, 0.42, 0.93, 1.05, 1.56, 1.59], ['l', 0.48, 0.39], ['l', 0.00, -0.12], ['c', 0.03, -0.09, 0.03, -0.48, 0.06, -0.90], ['c', 0.03, -0.57, 0.03, -1.08, 0.00, -2.22], ['c', -0.03, -1.62, -0.03, -1.62, -0.24, -2.07], ['c', -0.21, -0.42, -0.60, -0.75, -1.02, -0.84], ['z']], w: 6.728, h: 18.801 },\n\t'accidentals.dblflat': { d: [['M', -0.36, -14.07], ['c', 0.33, -0.06, 0.87, 0.00, 1.08, 0.15], ['c', 0.06, 0.03, 0.06, 0.36, -0.03, 5.25], ['c', -0.06, 2.85, -0.09, 5.19, -0.09, 5.19], ['c', 0.00, 0.03, 0.12, -0.03, 0.24, -0.12], ['c', 0.63, -0.42, 1.41, -0.66, 2.19, -0.72], ['c', 0.81, -0.03, 1.47, 0.21, 2.04, 0.78], ['c', 0.57, 0.54, 0.87, 1.26, 0.93, 2.04], ['c', 0.03, 0.57, -0.09, 1.08, -0.36, 1.62], ['c', -0.42, 0.81, -1.02, 1.38, -2.82, 2.61], ['c', -1.14, 0.78, -1.44, 1.02, -1.80, 1.44], ['c', -0.18, 0.18, -0.39, 0.39, -0.45, 0.42], ['c', -0.27, 0.18, -0.57, 0.15, -0.81, -0.06], ['c', -0.06, -0.09, -0.12, -0.18, -0.15, -0.27], ['c', -0.03, -0.06, -0.09, -3.27, -0.18, -8.34], ['c', -0.09, -4.53, -0.15, -8.58, -0.18, -9.03], ['l', 0.00, -0.78], ['l', 0.12, -0.06], ['c', 0.06, -0.03, 0.18, -0.09, 0.27, -0.12], ['z'], ['m', 3.18, 11.01], ['c', -0.21, -0.12, -0.54, -0.15, -0.81, -0.06], ['c', -0.54, 0.15, -0.99, 0.63, -1.17, 1.26], ['c', -0.06, 0.30, -0.12, 2.88, -0.06, 3.87], ['c', 0.03, 0.42, 0.03, 0.81, 0.06, 0.90], ['l', 0.03, 0.12], ['l', 0.45, -0.39], ['c', 0.63, -0.54, 1.26, -1.17, 1.56, -1.59], ['c', 0.30, -0.42, 0.60, -0.99, 0.72, -1.41], ['c', 0.18, -0.69, 0.09, -1.47, -0.18, -2.07], ['c', -0.15, -0.30, -0.33, -0.51, -0.60, -0.63], ['z'], ['m', 3, -11], ['c', 0.33, -0.06, 0.87, 0.00, 1.08, 0.15], ['c', 0.06, 0.03, 0.06, 0.36, -0.03, 5.25], ['c', -0.06, 2.85, -0.09, 5.19, -0.09, 5.19], ['c', 0.00, 0.03, 0.12, -0.03, 0.24, -0.12], ['c', 0.63, -0.42, 1.41, -0.66, 2.19, -0.72], ['c', 0.81, -0.03, 1.47, 0.21, 2.04, 0.78], ['c', 0.57, 0.54, 0.87, 1.26, 0.93, 2.04], ['c', 0.03, 0.57, -0.09, 1.08, -0.36, 1.62], ['c', -0.42, 0.81, -1.02, 1.38, -2.82, 2.61], ['c', -1.14, 0.78, -1.44, 1.02, -1.80, 1.44], ['c', -0.18, 0.18, -0.39, 0.39, -0.45, 0.42], ['c', -0.27, 0.18, -0.57, 0.15, -0.81, -0.06], ['c', -0.06, -0.09, -0.12, -0.18, -0.15, -0.27], ['c', -0.03, -0.06, -0.09, -3.27, -0.18, -8.34], ['c', -0.09, -4.53, -0.15, -8.58, -0.18, -9.03], ['l', 0.00, -0.78], ['l', 0.12, -0.06], ['c', 0.06, -0.03, 0.18, -0.09, 0.27, -0.12], ['z'], ['m', 3.18, 11.01], ['c', -0.21, -0.12, -0.54, -0.15, -0.81, -0.06], ['c', -0.54, 0.15, -0.99, 0.63, -1.17, 1.26], ['c', -0.06, 0.30, -0.12, 2.88, -0.06, 3.87], ['c', 0.03, 0.42, 0.03, 0.81, 0.06, 0.90], ['l', 0.03, 0.12], ['l', 0.45, -0.39], ['c', 0.63, -0.54, 1.26, -1.17, 1.56, -1.59], ['c', 0.30, -0.42, 0.60, -0.99, 0.72, -1.41], ['c', 0.18, -0.69, 0.09, -1.47, -0.18, -2.07], ['c', -0.15, -0.30, -0.33, -0.51, -0.60, -0.63], ['z']], w: 12.1, h: 18.804 },\n\t'accidentals.dblsharp': { d: [['M', -0.18, -3.96], ['c', 0.06, -0.03, 0.12, -0.06, 0.15, -0.06], ['c', 0.09, 0.00, 2.76, 0.27, 2.79, 0.30], ['c', 0.12, 0.03, 0.15, 0.12, 0.15, 0.51], ['c', 0.06, 0.96, 0.24, 1.59, 0.57, 2.10], ['c', 0.06, 0.09, 0.15, 0.21, 0.18, 0.24], ['l', 0.09, 0.06], ['l', 0.09, -0.06], ['c', 0.03, -0.03, 0.12, -0.15, 0.18, -0.24], ['c', 0.33, -0.51, 0.51, -1.14, 0.57, -2.10], ['c', 0.00, -0.39, 0.03, -0.45, 0.12, -0.51], ['c', 0.03, 0.00, 0.66, -0.09, 1.44, -0.15], ['c', 1.47, -0.15, 1.50, -0.15, 1.56, -0.03], ['c', 0.03, 0.06, 0.00, 0.42, -0.09, 1.44], ['c', -0.09, 0.72, -0.15, 1.35, -0.15, 1.38], ['c', 0.00, 0.03, -0.03, 0.09, -0.06, 0.12], ['c', -0.06, 0.06, -0.12, 0.09, -0.51, 0.09], ['c', -1.08, 0.06, -1.80, 0.30, -2.28, 0.75], ['l', -0.12, 0.09], ['l', 0.09, 0.09], ['c', 0.12, 0.15, 0.39, 0.33, 0.63, 0.45], ['c', 0.42, 0.18, 0.96, 0.27, 1.68, 0.33], ['c', 0.39, 0.00, 0.45, 0.03, 0.51, 0.09], ['c', 0.03, 0.03, 0.06, 0.09, 0.06, 0.12], ['c', 0.00, 0.03, 0.06, 0.66, 0.15, 1.38], ['c', 0.09, 1.02, 0.12, 1.38, 0.09, 1.44], ['c', -0.06, 0.12, -0.09, 0.12, -1.56, -0.03], ['c', -0.78, -0.06, -1.41, -0.15, -1.44, -0.15], ['c', -0.09, -0.06, -0.12, -0.12, -0.12, -0.54], ['c', -0.06, -0.93, -0.24, -1.56, -0.57, -2.07], ['c', -0.06, -0.09, -0.15, -0.21, -0.18, -0.24], ['l', -0.09, -0.06], ['l', -0.09, 0.06], ['c', -0.03, 0.03, -0.12, 0.15, -0.18, 0.24], ['c', -0.33, 0.51, -0.51, 1.14, -0.57, 2.07], ['c', 0.00, 0.42, -0.03, 0.48, -0.12, 0.54], ['c', -0.03, 0.00, -0.66, 0.09, -1.44, 0.15], ['c', -1.47, 0.15, -1.50, 0.15, -1.56, 0.03], ['c', -0.03, -0.06, 0.00, -0.42, 0.09, -1.44], ['c', 0.09, -0.72, 0.15, -1.35, 0.15, -1.38], ['c', 0.00, -0.03, 0.03, -0.09, 0.06, -0.12], ['c', 0.06, -0.06, 0.12, -0.09, 0.51, -0.09], ['c', 0.72, -0.06, 1.26, -0.15, 1.68, -0.33], ['c', 0.24, -0.12, 0.51, -0.30, 0.63, -0.45], ['l', 0.09, -0.09], ['l', -0.12, -0.09], ['c', -0.48, -0.45, -1.20, -0.69, -2.28, -0.75], ['c', -0.39, 0.00, -0.45, -0.03, -0.51, -0.09], ['c', -0.03, -0.03, -0.06, -0.09, -0.06, -0.12], ['c', 0.00, -0.03, -0.06, -0.63, -0.12, -1.38], ['c', -0.09, -0.72, -0.15, -1.35, -0.15, -1.38], ['z']], w: 7.95, h: 7.977 },\n\t'dots.dot': { d: [['M', 1.32, -1.68], ['c', 0.09, -0.03, 0.27, -0.06, 0.39, -0.06], ['c', 0.96, 0.00, 1.74, 0.78, 1.74, 1.71], ['c', 0.00, 0.96, -0.78, 1.74, -1.71, 1.74], ['c', -0.96, 0.00, -1.74, -0.78, -1.74, -1.71], ['c', 0.00, -0.78, 0.54, -1.50, 1.32, -1.68], ['z']], w: 3.45, h: 3.45 },\n\t'noteheads.dbl': { d: [['M', -0.69, -4.02], ['c', 0.18, -0.09, 0.36, -0.09, 0.54, 0.00], ['c', 0.18, 0.09, 0.24, 0.15, 0.33, 0.30], ['c', 0.06, 0.15, 0.06, 0.18, 0.06, 1.41], ['l', 0.00, 1.23], ['l', 0.12, -0.18], ['c', 0.72, -1.26, 2.64, -2.31, 4.86, -2.64], ['c', 0.81, -0.15, 1.11, -0.15, 2.13, -0.15], ['c', 0.99, 0.00, 1.29, 0.00, 2.10, 0.15], ['c', 0.75, 0.12, 1.38, 0.27, 2.04, 0.54], ['c', 1.35, 0.51, 2.34, 1.26, 2.82, 2.10], ['l', 0.12, 0.18], ['l', 0.00, -1.23], ['c', 0.00, -1.20, 0.00, -1.26, 0.06, -1.38], ['c', 0.09, -0.18, 0.15, -0.24, 0.33, -0.33], ['c', 0.18, -0.09, 0.36, -0.09, 0.54, 0.00], ['c', 0.18, 0.09, 0.24, 0.15, 0.33, 0.30], ['l', 0.06, 0.15], ['l', 0.00, 3.54], ['l', 0.00, 3.54], ['l', -0.06, 0.15], ['c', -0.09, 0.18, -0.15, 0.24, -0.33, 0.33], ['c', -0.18, 0.09, -0.36, 0.09, -0.54, 0.00], ['c', -0.18, -0.09, -0.24, -0.15, -0.33, -0.33], ['c', -0.06, -0.12, -0.06, -0.18, -0.06, -1.38], ['l', 0.00, -1.23], ['l', -0.12, 0.18], ['c', -0.48, 0.84, -1.47, 1.59, -2.82, 2.10], ['c', -0.84, 0.33, -1.71, 0.54, -2.85, 0.66], ['c', -0.45, 0.06, -2.16, 0.06, -2.61, 0.00], ['c', -1.14, -0.12, -2.01, -0.33, -2.85, -0.66], ['c', -1.35, -0.51, -2.34, -1.26, -2.82, -2.10], ['l', -0.12, -0.18], ['l', 0.00, 1.23], ['c', 0.00, 1.23, 0.00, 1.26, -0.06, 1.38], ['c', -0.09, 0.18, -0.15, 0.24, -0.33, 0.33], ['c', -0.18, 0.09, -0.36, 0.09, -0.54, 0.00], ['c', -0.18, -0.09, -0.24, -0.15, -0.33, -0.33], ['l', -0.06, -0.15], ['l', 0.00, -3.54], ['c', 0.00, -3.48, 0.00, -3.54, 0.06, -3.66], ['c', 0.09, -0.18, 0.15, -0.24, 0.33, -0.33], ['z'], ['m', 7.71, 0.63], ['c', -0.36, -0.06, -0.90, -0.06, -1.14, 0.00], ['c', -0.30, 0.03, -0.66, 0.24, -0.87, 0.42], ['c', -0.60, 0.54, -0.90, 1.62, -0.75, 2.82], ['c', 0.12, 0.93, 0.51, 1.68, 1.11, 2.31], ['c', 0.75, 0.72, 1.83, 1.20, 2.85, 1.26], ['c', 1.05, 0.06, 1.83, -0.54, 2.10, -1.65], ['c', 0.21, -0.90, 0.12, -1.95, -0.24, -2.82], ['c', -0.36, -0.81, -1.08, -1.53, -1.95, -1.95], ['c', -0.30, -0.15, -0.78, -0.30, -1.11, -0.39], ['z']], w: 16.83, h: 8.145 },\n\t'noteheads.whole': { d: [['M', 6.51, -4.05], ['c', 0.51, -0.03, 2.01, 0.00, 2.52, 0.03], ['c', 1.41, 0.18, 2.64, 0.51, 3.72, 1.08], ['c', 1.20, 0.63, 1.95, 1.41, 2.19, 2.31], ['c', 0.09, 0.33, 0.09, 0.90, 0.00, 1.23], ['c', -0.24, 0.90, -0.99, 1.68, -2.19, 2.31], ['c', -1.08, 0.57, -2.28, 0.90, -3.75, 1.08], ['c', -0.66, 0.06, -2.31, 0.06, -2.97, 0.00], ['c', -1.47, -0.18, -2.67, -0.51, -3.75, -1.08], ['c', -1.20, -0.63, -1.95, -1.41, -2.19, -2.31], ['c', -0.09, -0.33, -0.09, -0.90, 0.00, -1.23], ['c', 0.24, -0.90, 0.99, -1.68, 2.19, -2.31], ['c', 1.20, -0.63, 2.61, -0.99, 4.23, -1.11], ['z'], ['m', 0.57, 0.66], ['c', -0.87, -0.15, -1.53, 0.00, -2.04, 0.51], ['c', -0.15, 0.15, -0.24, 0.27, -0.33, 0.48], ['c', -0.24, 0.51, -0.36, 1.08, -0.33, 1.77], ['c', 0.03, 0.69, 0.18, 1.26, 0.42, 1.77], ['c', 0.60, 1.17, 1.74, 1.98, 3.18, 2.22], ['c', 1.11, 0.21, 1.95, -0.15, 2.34, -0.99], ['c', 0.24, -0.51, 0.36, -1.08, 0.33, -1.80], ['c', -0.06, -1.11, -0.45, -2.04, -1.17, -2.76], ['c', -0.63, -0.63, -1.47, -1.05, -2.40, -1.20], ['z']], w: 14.985, h: 8.097 },\n\t'noteheads.half': { d: [['M', 7.44, -4.05], ['c', 0.06, -0.03, 0.27, -0.03, 0.48, -0.03], ['c', 1.05, 0.00, 1.71, 0.24, 2.10, 0.81], ['c', 0.42, 0.60, 0.45, 1.35, 0.18, 2.40], ['c', -0.42, 1.59, -1.14, 2.73, -2.16, 3.39], ['c', -1.41, 0.93, -3.18, 1.44, -5.40, 1.53], ['c', -1.17, 0.03, -1.89, -0.21, -2.28, -0.81], ['c', -0.42, -0.60, -0.45, -1.35, -0.18, -2.40], ['c', 0.42, -1.59, 1.14, -2.73, 2.16, -3.39], ['c', 0.63, -0.42, 1.23, -0.72, 1.98, -0.96], ['c', 0.90, -0.30, 1.65, -0.42, 3.12, -0.54], ['z'], ['m', 1.29, 0.87], ['c', -0.27, -0.09, -0.63, -0.12, -0.90, -0.03], ['c', -0.72, 0.24, -1.53, 0.69, -3.27, 1.80], ['c', -2.34, 1.50, -3.30, 2.25, -3.57, 2.79], ['c', -0.36, 0.72, -0.06, 1.50, 0.66, 1.77], ['c', 0.24, 0.12, 0.69, 0.09, 0.99, 0.00], ['c', 0.84, -0.30, 1.92, -0.93, 4.14, -2.37], ['c', 1.62, -1.08, 2.37, -1.71, 2.61, -2.19], ['c', 0.36, -0.72, 0.06, -1.50, -0.66, -1.77], ['z']], w: 10.37, h: 8.132 },\n\t'noteheads.quarter': { d: [['M', 6.09, -4.05], ['c', 0.36, -0.03, 1.20, 0.00, 1.53, 0.06], ['c', 1.17, 0.24, 1.89, 0.84, 2.16, 1.83], ['c', 0.06, 0.18, 0.06, 0.30, 0.06, 0.66], ['c', 0.00, 0.45, 0.00, 0.63, -0.15, 1.08], ['c', -0.66, 2.04, -3.06, 3.93, -5.52, 4.38], ['c', -0.54, 0.09, -1.44, 0.09, -1.83, 0.03], ['c', -1.23, -0.27, -1.98, -0.87, -2.25, -1.86], ['c', -0.06, -0.18, -0.06, -0.30, -0.06, -0.66], ['c', 0.00, -0.45, 0.00, -0.63, 0.15, -1.08], ['c', 0.24, -0.78, 0.75, -1.53, 1.44, -2.22], ['c', 1.20, -1.20, 2.85, -2.01, 4.47, -2.22], ['z']], w: 9.81, h: 8.094 },\n\t'noteheads.slash.nostem': { d: [['M', 9.30, -7.77], ['c', 0.06, -0.06, 0.18, -0.06, 1.71, -0.06], ['l', 1.65, 0.00], ['l', 0.09, 0.09], ['c', 0.06, 0.06, 0.06, 0.09, 0.06, 0.15], ['c', -0.03, 0.12, -9.21, 15.24, -9.30, 15.33], ['c', -0.06, 0.06, -0.18, 0.06, -1.71, 0.06], ['l', -1.65, 0.00], ['l', -0.09, -0.09], ['c', -0.06, -0.06, -0.06, -0.09, -0.06, -0.15], ['c', 0.03, -0.12, 9.21, -15.24, 9.30, -15.33], ['z']], w: 12.81, h: 15.63 },\n\t'noteheads.indeterminate': { d: [['M', 0.78, -4.05], ['c', 0.12, -0.03, 0.24, -0.03, 0.36, 0.03], ['c', 0.03, 0.03, 0.93, 0.72, 1.95, 1.56], ['l', 1.86, 1.50], ['l', 1.86, -1.50], ['c', 1.02, -0.84, 1.92, -1.53, 1.95, -1.56], ['c', 0.21, -0.12, 0.33, -0.09, 0.75, 0.24], ['c', 0.30, 0.27, 0.36, 0.36, 0.36, 0.54], ['c', 0.00, 0.03, -0.03, 0.12, -0.06, 0.18], ['c', -0.03, 0.06, -0.90, 0.75, -1.89, 1.56], ['l', -1.80, 1.47], ['c', 0.00, 0.03, 0.81, 0.69, 1.80, 1.50], ['c', 0.99, 0.81, 1.86, 1.50, 1.89, 1.56], ['c', 0.03, 0.06, 0.06, 0.15, 0.06, 0.18], ['c', 0.00, 0.18, -0.06, 0.27, -0.36, 0.54], ['c', -0.42, 0.33, -0.54, 0.36, -0.75, 0.24], ['c', -0.03, -0.03, -0.93, -0.72, -1.95, -1.56], ['l', -1.86, -1.50], ['l', -1.86, 1.50], ['c', -1.02, 0.84, -1.92, 1.53, -1.95, 1.56], ['c', -0.21, 0.12, -0.33, 0.09, -0.75, -0.24], ['c', -0.30, -0.27, -0.36, -0.36, -0.36, -0.54], ['c', 0.00, -0.03, 0.03, -0.12, 0.06, -0.18], ['c', 0.03, -0.06, 0.90, -0.75, 1.89, -1.56], ['l', 1.80, -1.47], ['c', 0.00, -0.03, -0.81, -0.69, -1.80, -1.50], ['c', -0.99, -0.81, -1.86, -1.50, -1.89, -1.56], ['c', -0.06, -0.12, -0.09, -0.21, -0.03, -0.36], ['c', 0.03, -0.09, 0.57, -0.57, 0.72, -0.63], ['z']], w: 9.843, h: 8.139 },\n\t'scripts.ufermata': { d: [['M', -0.75, -10.77], ['c', 0.12, 0.00, 0.45, -0.03, 0.69, -0.03], ['c', 2.91, -0.03, 5.55, 1.53, 7.41, 4.35], ['c', 1.17, 1.71, 1.95, 3.72, 2.43, 6.03], ['c', 0.12, 0.51, 0.12, 0.57, 0.03, 0.69], ['c', -0.12, 0.21, -0.48, 0.27, -0.69, 0.12], ['c', -0.12, -0.09, -0.18, -0.24, -0.27, -0.69], ['c', -0.78, -3.63, -3.42, -6.54, -6.78, -7.38], ['c', -0.78, -0.21, -1.20, -0.24, -2.07, -0.24], ['c', -0.63, 0.00, -0.84, 0.00, -1.20, 0.06], ['c', -1.83, 0.27, -3.42, 1.08, -4.80, 2.37], ['c', -1.41, 1.35, -2.40, 3.21, -2.85, 5.19], ['c', -0.09, 0.45, -0.15, 0.60, -0.27, 0.69], ['c', -0.21, 0.15, -0.57, 0.09, -0.69, -0.12], ['c', -0.09, -0.12, -0.09, -0.18, 0.03, -0.69], ['c', 0.33, -1.62, 0.78, -3.00, 1.47, -4.38], ['c', 1.77, -3.54, 4.44, -5.67, 7.56, -5.97], ['z'], ['m', 0.33, 7.47], ['c', 1.38, -0.30, 2.58, 0.90, 2.31, 2.25], ['c', -0.15, 0.72, -0.78, 1.35, -1.47, 1.50], ['c', -1.38, 0.27, -2.58, -0.93, -2.31, -2.31], ['c', 0.15, -0.69, 0.78, -1.29, 1.47, -1.44], ['z']], w: 19.748, h: 11.289 },\n\t'scripts.dfermata': { d: [['M', -9.63, -0.42], ['c', 0.15, -0.09, 0.36, -0.06, 0.51, 0.03], ['c', 0.12, 0.09, 0.18, 0.24, 0.27, 0.66], ['c', 0.78, 3.66, 3.42, 6.57, 6.78, 7.41], ['c', 0.78, 0.21, 1.20, 0.24, 2.07, 0.24], ['c', 0.63, 0.00, 0.84, 0.00, 1.20, -0.06], ['c', 1.83, -0.27, 3.42, -1.08, 4.80, -2.37], ['c', 1.41, -1.35, 2.40, -3.21, 2.85, -5.22], ['c', 0.09, -0.42, 0.15, -0.57, 0.27, -0.66], ['c', 0.21, -0.15, 0.57, -0.09, 0.69, 0.12], ['c', 0.09, 0.12, 0.09, 0.18, -0.03, 0.69], ['c', -0.33, 1.62, -0.78, 3.00, -1.47, 4.38], ['c', -1.92, 3.84, -4.89, 6.00, -8.31, 6.00], ['c', -3.42, 0.00, -6.39, -2.16, -8.31, -6.00], ['c', -0.48, -0.96, -0.84, -1.92, -1.14, -2.97], ['c', -0.18, -0.69, -0.42, -1.74, -0.42, -1.92], ['c', 0.00, -0.12, 0.09, -0.27, 0.24, -0.33], ['z'], ['m', 9.21, 0.00], ['c', 1.20, -0.27, 2.34, 0.63, 2.34, 1.86], ['c', 0.00, 0.90, -0.66, 1.68, -1.50, 1.89], ['c', -1.38, 0.27, -2.58, -0.93, -2.31, -2.31], ['c', 0.15, -0.69, 0.78, -1.29, 1.47, -1.44], ['z']], w: 19.744, h: 11.274 },\n\t'scripts.sforzato': { d: [['M', -6.45, -3.69], ['c', 0.06, -0.03, 0.15, -0.06, 0.18, -0.06], ['c', 0.06, 0.00, 2.85, 0.72, 6.24, 1.59], ['l', 6.33, 1.65], ['c', 0.33, 0.06, 0.45, 0.21, 0.45, 0.51], ['c', 0.00, 0.30, -0.12, 0.45, -0.45, 0.51], ['l', -6.33, 1.65], ['c', -3.39, 0.87, -6.18, 1.59, -6.21, 1.59], ['c', -0.21, 0.00, -0.48, -0.24, -0.51, -0.45], ['c', 0.00, -0.15, 0.06, -0.36, 0.18, -0.45], ['c', 0.09, -0.06, 0.87, -0.27, 3.84, -1.05], ['c', 2.04, -0.54, 3.84, -0.99, 4.02, -1.02], ['c', 0.15, -0.06, 1.14, -0.24, 2.22, -0.42], ['c', 1.05, -0.18, 1.92, -0.36, 1.92, -0.36], ['c', 0.00, 0.00, -0.87, -0.18, -1.92, -0.36], ['c', -1.08, -0.18, -2.07, -0.36, -2.22, -0.42], ['c', -0.18, -0.03, -1.98, -0.48, -4.02, -1.02], ['c', -2.97, -0.78, -3.75, -0.99, -3.84, -1.05], ['c', -0.12, -0.09, -0.18, -0.30, -0.18, -0.45], ['c', 0.03, -0.15, 0.15, -0.30, 0.30, -0.39], ['z']], w: 13.5, h: 7.5 },\n\t'scripts.staccato': { d: [['M', -0.36, -1.47], ['c', 0.93, -0.21, 1.86, 0.51, 1.86, 1.47], ['c', 0.00, 0.93, -0.87, 1.65, -1.80, 1.47], ['c', -0.54, -0.12, -1.02, -0.57, -1.14, -1.08], ['c', -0.21, -0.81, 0.27, -1.65, 1.08, -1.86], ['z']], w: 2.989, h: 3.004 },\n\t'scripts.tenuto': { d: [['M', -4.20, -0.48], ['l', 0.12, -0.06], ['l', 4.08, 0.00], ['l', 4.08, 0.00], ['l', 0.12, 0.06], ['c', 0.39, 0.21, 0.39, 0.75, 0.00, 0.96], ['l', -0.12, 0.06], ['l', -4.08, 0.00], ['l', -4.08, 0.00], ['l', -0.12, -0.06], ['c', -0.39, -0.21, -0.39, -0.75, 0.00, -0.96], ['z']], w: 8.985, h: 1.08 },\n\t'scripts.umarcato': { d: [['M', -0.15, -8.19], ['c', 0.15, -0.12, 0.36, -0.03, 0.45, 0.15], ['c', 0.21, 0.42, 3.45, 7.65, 3.45, 7.71], ['c', 0.00, 0.12, -0.12, 0.27, -0.21, 0.30], ['c', -0.03, 0.03, -0.51, 0.03, -1.14, 0.03], ['c', -1.05, 0.00, -1.08, 0.00, -1.17, -0.06], ['c', -0.09, -0.06, -0.24, -0.36, -1.17, -2.40], ['c', -0.57, -1.29, -1.05, -2.34, -1.08, -2.34], ['c', 0.00, -0.03, -0.51, 1.02, -1.08, 2.34], ['c', -0.93, 2.07, -1.08, 2.34, -1.14, 2.40], ['c', -0.06, 0.03, -0.15, 0.06, -0.18, 0.06], ['c', -0.15, 0.00, -0.33, -0.18, -0.33, -0.33], ['c', 0.00, -0.06, 3.24, -7.32, 3.45, -7.71], ['c', 0.03, -0.06, 0.09, -0.15, 0.15, -0.15], ['z']], w: 7.5, h: 8.245 },\n\t'scripts.dmarcato': { d: [['M', -3.57, 0.03], ['c', 0.03, 0.00, 0.57, -0.03, 1.17, -0.03], ['c', 1.05, 0.00, 1.08, 0.00, 1.17, 0.06], ['c', 0.09, 0.06, 0.24, 0.36, 1.17, 2.40], ['c', 0.57, 1.29, 1.05, 2.34, 1.08, 2.34], ['c', 0.00, 0.03, 0.51, -1.02, 1.08, -2.34], ['c', 0.93, -2.07, 1.08, -2.34, 1.14, -2.40], ['c', 0.06, -0.03, 0.15, -0.06, 0.18, -0.06], ['c', 0.15, 0.00, 0.33, 0.18, 0.33, 0.33], ['c', 0.00, 0.09, -3.45, 7.74, -3.54, 7.83], ['c', -0.12, 0.12, -0.30, 0.12, -0.42, 0.00], ['c', -0.09, -0.09, -3.54, -7.74, -3.54, -7.83], ['c', 0.00, -0.09, 0.12, -0.27, 0.18, -0.30], ['z']], w: 7.5, h: 8.25 },\n\t'scripts.stopped': { d: [['M', -0.27, -4.08], ['c', 0.18, -0.09, 0.36, -0.09, 0.54, 0.00], ['c', 0.18, 0.09, 0.24, 0.15, 0.33, 0.30], ['l', 0.06, 0.15], ['l', 0.00, 1.50], ['l', 0.00, 1.47], ['l', 1.47, 0.00], ['l', 1.50, 0.00], ['l', 0.15, 0.06], ['c', 0.15, 0.09, 0.21, 0.15, 0.30, 0.33], ['c', 0.09, 0.18, 0.09, 0.36, 0.00, 0.54], ['c', -0.09, 0.18, -0.15, 0.24, -0.33, 0.33], ['c', -0.12, 0.06, -0.18, 0.06, -1.62, 0.06], ['l', -1.47, 0.00], ['l', 0.00, 1.47], ['l', 0.00, 1.47], ['l', -0.06, 0.15], ['c', -0.09, 0.18, -0.15, 0.24, -0.33, 0.33], ['c', -0.18, 0.09, -0.36, 0.09, -0.54, 0.00], ['c', -0.18, -0.09, -0.24, -0.15, -0.33, -0.33], ['l', -0.06, -0.15], ['l', 0.00, -1.47], ['l', 0.00, -1.47], ['l', -1.47, 0.00], ['c', -1.44, 0.00, -1.50, 0.00, -1.62, -0.06], ['c', -0.18, -0.09, -0.24, -0.15, -0.33, -0.33], ['c', -0.09, -0.18, -0.09, -0.36, 0.00, -0.54], ['c', 0.09, -0.18, 0.15, -0.24, 0.33, -0.33], ['l', 0.15, -0.06], ['l', 1.47, 0.00], ['l', 1.47, 0.00], ['l', 0.00, -1.47], ['c', 0.00, -1.44, 0.00, -1.50, 0.06, -1.62], ['c', 0.09, -0.18, 0.15, -0.24, 0.33, -0.33], ['z']], w: 8.295, h: 8.295 },\n\t'scripts.upbow': { d: [['M', -4.65, -15.54], ['c', 0.12, -0.09, 0.36, -0.06, 0.48, 0.03], ['c', 0.03, 0.03, 0.09, 0.09, 0.12, 0.15], ['c', 0.03, 0.06, 0.66, 2.13, 1.41, 4.62], ['c', 1.35, 4.41, 1.38, 4.56, 2.01, 6.96], ['l', 0.63, 2.46], ['l', 0.63, -2.46], ['c', 0.63, -2.40, 0.66, -2.55, 2.01, -6.96], ['c', 0.75, -2.49, 1.38, -4.56, 1.41, -4.62], ['c', 0.06, -0.15, 0.18, -0.21, 0.36, -0.24], ['c', 0.15, 0.00, 0.30, 0.06, 0.39, 0.18], ['c', 0.15, 0.21, 0.24, -0.18, -2.10, 7.56], ['c', -1.20, 3.96, -2.22, 7.32, -2.25, 7.41], ['c', 0.00, 0.12, -0.06, 0.27, -0.09, 0.30], ['c', -0.12, 0.21, -0.60, 0.21, -0.72, 0.00], ['c', -0.03, -0.03, -0.09, -0.18, -0.09, -0.30], ['c', -0.03, -0.09, -1.05, -3.45, -2.25, -7.41], ['c', -2.34, -7.74, -2.25, -7.35, -2.10, -7.56], ['c', 0.03, -0.03, 0.09, -0.09, 0.15, -0.12], ['z']], w: 9.73, h: 15.608 },\n\t'scripts.downbow': { d: [['M', -5.55, -9.93], ['l', 0.09, -0.06], ['l', 5.46, 0.00], ['l', 5.46, 0.00], ['l', 0.09, 0.06], ['l', 0.06, 0.09], ['l', 0.00, 4.77], ['c', 0.00, 5.28, 0.00, 4.89, -0.18, 5.01], ['c', -0.18, 0.12, -0.42, 0.06, -0.54, -0.12], ['c', -0.06, -0.09, -0.06, -0.18, -0.06, -2.97], ['l', 0.00, -2.85], ['l', -4.83, 0.00], ['l', -4.83, 0.00], ['l', 0.00, 2.85], ['c', 0.00, 2.79, 0.00, 2.88, -0.06, 2.97], ['c', -0.15, 0.24, -0.51, 0.24, -0.66, 0.00], ['c', -0.06, -0.09, -0.06, -0.21, -0.06, -4.89], ['l', 0.00, -4.77], ['z']], w: 11.22, h: 9.992 },\n\t'scripts.turn': { d: [['M', -4.77, -3.90], ['c', 0.36, -0.06, 1.05, -0.06, 1.44, 0.03], ['c', 0.78, 0.15, 1.50, 0.51, 2.34, 1.14], ['c', 0.60, 0.45, 1.05, 0.87, 2.22, 2.01], ['c', 1.11, 1.08, 1.62, 1.50, 2.22, 1.86], ['c', 0.60, 0.36, 1.32, 0.57, 1.92, 0.57], ['c', 0.90, 0.00, 1.71, -0.57, 1.89, -1.35], ['c', 0.24, -0.93, -0.39, -1.89, -1.35, -2.10], ['l', -0.15, -0.06], ['l', -0.09, 0.15], ['c', -0.03, 0.09, -0.15, 0.24, -0.24, 0.33], ['c', -0.72, 0.72, -2.04, 0.54, -2.49, -0.36], ['c', -0.48, -0.93, 0.03, -1.86, 1.17, -2.19], ['c', 0.30, -0.09, 1.02, -0.09, 1.35, 0.00], ['c', 0.99, 0.27, 1.74, 0.87, 2.25, 1.83], ['c', 0.69, 1.41, 0.63, 3.00, -0.21, 4.26], ['c', -0.21, 0.30, -0.69, 0.81, -0.99, 1.02], ['c', -0.30, 0.21, -0.84, 0.45, -1.17, 0.54], ['c', -1.23, 0.36, -2.49, 0.15, -3.72, -0.60], ['c', -0.75, -0.48, -1.41, -1.02, -2.85, -2.46], ['c', -1.11, -1.08, -1.62, -1.50, -2.22, -1.86], ['c', -0.60, -0.36, -1.32, -0.57, -1.92, -0.57], ['c', -0.90, 0.00, -1.71, 0.57, -1.89, 1.35], ['c', -0.24, 0.93, 0.39, 1.89, 1.35, 2.10], ['l', 0.15, 0.06], ['l', 0.09, -0.15], ['c', 0.03, -0.09, 0.15, -0.24, 0.24, -0.33], ['c', 0.72, -0.72, 2.04, -0.54, 2.49, 0.36], ['c', 0.48, 0.93, -0.03, 1.86, -1.17, 2.19], ['c', -0.30, 0.09, -1.02, 0.09, -1.35, 0.00], ['c', -0.99, -0.27, -1.74, -0.87, -2.25, -1.83], ['c', -0.69, -1.41, -0.63, -3.00, 0.21, -4.26], ['c', 0.21, -0.30, 0.69, -0.81, 0.99, -1.02], ['c', 0.48, -0.33, 1.11, -0.57, 1.74, -0.66], ['z']], w: 16.366, h: 7.893 },\n\t'scripts.trill': { d: [['M', -0.51, -16.02], ['c', 0.12, -0.09, 0.21, -0.18, 0.21, -0.18], ['l', -0.81, 4.02], ['l', -0.81, 4.02], ['c', 0.03, 0.00, 0.51, -0.27, 1.08, -0.60], ['c', 0.60, -0.30, 1.14, -0.63, 1.26, -0.66], ['c', 1.14, -0.54, 2.31, -0.60, 3.09, -0.18], ['c', 0.27, 0.15, 0.54, 0.36, 0.60, 0.51], ['l', 0.06, 0.12], ['l', 0.21, -0.21], ['c', 0.90, -0.81, 2.22, -0.99, 3.12, -0.42], ['c', 0.60, 0.42, 0.90, 1.14, 0.78, 2.07], ['c', -0.15, 1.29, -1.05, 2.31, -1.95, 2.25], ['c', -0.48, -0.03, -0.78, -0.30, -0.96, -0.81], ['c', -0.09, -0.27, -0.09, -0.90, -0.03, -1.20], ['c', 0.21, -0.75, 0.81, -1.23, 1.59, -1.32], ['l', 0.24, -0.03], ['l', -0.09, -0.12], ['c', -0.51, -0.66, -1.62, -0.63, -2.31, 0.03], ['c', -0.39, 0.42, -0.30, 0.09, -1.23, 4.77], ['l', -0.81, 4.14], ['c', -0.03, 0.00, -0.12, -0.03, -0.21, -0.09], ['c', -0.33, -0.15, -0.54, -0.18, -0.99, -0.18], ['c', -0.42, 0.00, -0.66, 0.03, -1.05, 0.18], ['c', -0.12, 0.06, -0.21, 0.09, -0.21, 0.09], ['c', 0.00, -0.03, 0.36, -1.86, 0.81, -4.11], ['c', 0.90, -4.47, 0.87, -4.26, 0.69, -4.53], ['c', -0.21, -0.36, -0.66, -0.51, -1.17, -0.36], ['c', -0.15, 0.06, -2.22, 1.14, -2.58, 1.38], ['c', -0.12, 0.09, -0.12, 0.09, -0.21, 0.60], ['l', -0.09, 0.51], ['l', 0.21, 0.24], ['c', 0.63, 0.75, 1.02, 1.47, 1.20, 2.19], ['c', 0.06, 0.27, 0.06, 0.36, 0.06, 0.81], ['c', 0.00, 0.42, 0.00, 0.54, -0.06, 0.78], ['c', -0.15, 0.54, -0.33, 0.93, -0.63, 1.35], ['c', -0.18, 0.24, -0.57, 0.63, -0.81, 0.78], ['c', -0.24, 0.15, -0.63, 0.36, -0.84, 0.42], ['c', -0.27, 0.06, -0.66, 0.06, -0.87, 0.03], ['c', -0.81, -0.18, -1.32, -1.05, -1.38, -2.46], ['c', -0.03, -0.60, 0.03, -0.99, 0.33, -2.46], ['c', 0.21, -1.08, 0.24, -1.32, 0.21, -1.29], ['c', -1.20, 0.48, -2.40, 0.75, -3.21, 0.72], ['c', -0.69, -0.06, -1.17, -0.30, -1.41, -0.72], ['c', -0.39, -0.75, -0.12, -1.80, 0.66, -2.46], ['c', 0.24, -0.18, 0.69, -0.42, 1.02, -0.51], ['c', 0.69, -0.18, 1.53, -0.15, 2.31, 0.09], ['c', 0.30, 0.09, 0.75, 0.30, 0.99, 0.45], ['c', 0.12, 0.09, 0.15, 0.09, 0.15, 0.03], ['c', 0.03, -0.03, 0.33, -1.59, 0.72, -3.45], ['c', 0.36, -1.86, 0.66, -3.42, 0.69, -3.45], ['c', 0.00, -0.03, 0.03, -0.03, 0.21, 0.03], ['c', 0.21, 0.06, 0.27, 0.06, 0.48, 0.06], ['c', 0.42, -0.03, 0.78, -0.18, 1.26, -0.48], ['c', 0.15, -0.12, 0.36, -0.27, 0.48, -0.39], ['z'], ['m', -5.73, 7.68], ['c', -0.27, -0.03, -0.96, -0.06, -1.20, -0.03], ['c', -0.81, 0.12, -1.35, 0.57, -1.50, 1.20], ['c', -0.18, 0.66, 0.12, 1.14, 0.75, 1.29], ['c', 0.66, 0.12, 1.92, -0.12, 3.18, -0.66], ['l', 0.33, -0.15], ['l', 0.09, -0.39], ['c', 0.06, -0.21, 0.09, -0.42, 0.09, -0.45], ['c', 0.00, -0.03, -0.45, -0.30, -0.75, -0.45], ['c', -0.27, -0.15, -0.66, -0.27, -0.99, -0.36], ['z'], ['m', 4.29, 3.63], ['c', -0.24, -0.39, -0.51, -0.75, -0.51, -0.69], ['c', -0.06, 0.12, -0.39, 1.92, -0.45, 2.28], ['c', -0.09, 0.54, -0.12, 1.14, -0.06, 1.38], ['c', 0.06, 0.42, 0.21, 0.60, 0.51, 0.57], ['c', 0.39, -0.06, 0.75, -0.48, 0.93, -1.14], ['c', 0.09, -0.33, 0.09, -1.05, 0.00, -1.38], ['c', -0.09, -0.39, -0.24, -0.69, -0.42, -1.02], ['z']], w: 17.963, h: 16.49 },\n\t'scripts.segno': { d: [['M', -3.72, -11.22], ['c', 0.78, -0.09, 1.59, 0.03, 2.31, 0.42], ['c', 1.20, 0.60, 2.01, 1.71, 2.31, 3.09], ['c', 0.09, 0.42, 0.09, 1.20, 0.03, 1.50], ['c', -0.15, 0.45, -0.39, 0.81, -0.66, 0.93], ['c', -0.33, 0.18, -0.84, 0.21, -1.23, 0.15], ['c', -0.81, -0.18, -1.32, -0.93, -1.26, -1.89], ['c', 0.03, -0.36, 0.09, -0.57, 0.24, -0.90], ['c', 0.15, -0.33, 0.45, -0.60, 0.72, -0.75], ['c', 0.12, -0.06, 0.18, -0.09, 0.18, -0.12], ['c', 0.00, -0.03, -0.03, -0.15, -0.09, -0.24], ['c', -0.18, -0.45, -0.54, -0.87, -0.96, -1.08], ['c', -1.11, -0.57, -2.34, -0.18, -2.88, 0.90], ['c', -0.24, 0.51, -0.33, 1.11, -0.24, 1.83], ['c', 0.27, 1.92, 1.50, 3.54, 3.93, 5.13], ['c', 0.48, 0.33, 1.26, 0.78, 1.29, 0.78], ['c', 0.03, 0.00, 1.35, -2.19, 2.94, -4.89], ['l', 2.88, -4.89], ['l', 0.84, 0.00], ['l', 0.87, 0.00], ['l', -0.03, 0.06], ['c', -0.15, 0.21, -6.15, 10.41, -6.15, 10.44], ['c', 0.00, 0.00, 0.21, 0.15, 0.48, 0.27], ['c', 2.61, 1.47, 4.35, 3.03, 5.13, 4.65], ['c', 1.14, 2.34, 0.51, 5.07, -1.44, 6.39], ['c', -0.66, 0.42, -1.32, 0.63, -2.13, 0.69], ['c', -2.01, 0.09, -3.81, -1.41, -4.26, -3.54], ['c', -0.09, -0.42, -0.09, -1.20, -0.03, -1.50], ['c', 0.15, -0.45, 0.39, -0.81, 0.66, -0.93], ['c', 0.33, -0.18, 0.84, -0.21, 1.23, -0.15], ['c', 0.81, 0.18, 1.32, 0.93, 1.26, 1.89], ['c', -0.03, 0.36, -0.09, 0.57, -0.24, 0.90], ['c', -0.15, 0.33, -0.45, 0.60, -0.72, 0.75], ['c', -0.12, 0.06, -0.18, 0.09, -0.18, 0.12], ['c', 0.00, 0.03, 0.03, 0.15, 0.09, 0.24], ['c', 0.18, 0.45, 0.54, 0.87, 0.96, 1.08], ['c', 1.11, 0.57, 2.34, 0.18, 2.88, -0.90], ['c', 0.24, -0.51, 0.33, -1.11, 0.24, -1.83], ['c', -0.27, -1.92, -1.50, -3.54, -3.93, -5.13], ['c', -0.48, -0.33, -1.26, -0.78, -1.29, -0.78], ['c', -0.03, 0.00, -1.35, 2.19, -2.91, 4.89], ['l', -2.88, 4.89], ['l', -0.87, 0.00], ['l', -0.87, 0.00], ['l', 0.03, -0.06], ['c', 0.15, -0.21, 6.15, -10.41, 6.15, -10.44], ['c', 0.00, 0.00, -0.21, -0.15, -0.48, -0.30], ['c', -2.61, -1.44, -4.35, -3.00, -5.13, -4.62], ['c', -0.90, -1.89, -0.72, -4.02, 0.48, -5.52], ['c', 0.69, -0.84, 1.68, -1.41, 2.73, -1.53], ['z'], ['m', 8.76, 9.09], ['c', 0.03, -0.03, 0.15, -0.03, 0.27, -0.03], ['c', 0.33, 0.03, 0.57, 0.18, 0.72, 0.48], ['c', 0.09, 0.18, 0.09, 0.57, 0.00, 0.75], ['c', -0.09, 0.18, -0.21, 0.30, -0.36, 0.39], ['c', -0.15, 0.06, -0.21, 0.06, -0.39, 0.06], ['c', -0.21, 0.00, -0.27, 0.00, -0.39, -0.06], ['c', -0.30, -0.15, -0.48, -0.45, -0.48, -0.75], ['c', 0.00, -0.39, 0.24, -0.72, 0.63, -0.84], ['z'], ['m', -10.53, 2.61], ['c', 0.03, -0.03, 0.15, -0.03, 0.27, -0.03], ['c', 0.33, 0.03, 0.57, 0.18, 0.72, 0.48], ['c', 0.09, 0.18, 0.09, 0.57, 0.00, 0.75], ['c', -0.09, 0.18, -0.21, 0.30, -0.36, 0.39], ['c', -0.15, 0.06, -0.21, 0.06, -0.39, 0.06], ['c', -0.21, 0.00, -0.27, 0.00, -0.39, -0.06], ['c', -0.30, -0.15, -0.48, -0.45, -0.48, -0.75], ['c', 0.00, -0.39, 0.24, -0.72, 0.63, -0.84], ['z']], w: 15, h: 22.504 },\n\t'scripts.coda': { d: [['M', -0.21, -10.47], ['c', 0.18, -0.12, 0.42, -0.06, 0.54, 0.12], ['c', 0.06, 0.09, 0.06, 0.18, 0.06, 1.50], ['l', 0.00, 1.38], ['l', 0.18, 0.00], ['c', 0.39, 0.06, 0.96, 0.24, 1.38, 0.48], ['c', 1.68, 0.93, 2.82, 3.24, 3.03, 6.12], ['c', 0.03, 0.24, 0.03, 0.45, 0.03, 0.45], ['c', 0.00, 0.03, 0.60, 0.03, 1.35, 0.03], ['c', 1.50, 0.00, 1.47, 0.00, 1.59, 0.18], ['c', 0.09, 0.12, 0.09, 0.30, 0.00, 0.42], ['c', -0.12, 0.18, -0.09, 0.18, -1.59, 0.18], ['c', -0.75, 0.00, -1.35, 0.00, -1.35, 0.03], ['c', 0.00, 0.00, 0.00, 0.21, -0.03, 0.42], ['c', -0.24, 3.15, -1.53, 5.58, -3.45, 6.36], ['c', -0.27, 0.12, -0.72, 0.24, -0.96, 0.27], ['l', -0.18, 0.00], ['l', 0.00, 1.38], ['c', 0.00, 1.32, 0.00, 1.41, -0.06, 1.50], ['c', -0.15, 0.24, -0.51, 0.24, -0.66, 0.00], ['c', -0.06, -0.09, -0.06, -0.18, -0.06, -1.50], ['l', 0.00, -1.38], ['l', -0.18, 0.00], ['c', -0.39, -0.06, -0.96, -0.24, -1.38, -0.48], ['c', -1.68, -0.93, -2.82, -3.24, -3.03, -6.15], ['c', -0.03, -0.21, -0.03, -0.42, -0.03, -0.42], ['c', 0.00, -0.03, -0.60, -0.03, -1.35, -0.03], ['c', -1.50, 0.00, -1.47, 0.00, -1.59, -0.18], ['c', -0.09, -0.12, -0.09, -0.30, 0.00, -0.42], ['c', 0.12, -0.18, 0.09, -0.18, 1.59, -0.18], ['c', 0.75, 0.00, 1.35, 0.00, 1.35, -0.03], ['c', 0.00, 0.00, 0.00, -0.21, 0.03, -0.45], ['c', 0.24, -3.12, 1.53, -5.55, 3.45, -6.33], ['c', 0.27, -0.12, 0.72, -0.24, 0.96, -0.27], ['l', 0.18, 0.00], ['l', 0.00, -1.38], ['c', 0.00, -1.53, 0.00, -1.50, 0.18, -1.62], ['z'], ['m', -0.18, 6.93], ['c', 0.00, -2.97, 0.00, -3.15, -0.06, -3.15], ['c', -0.09, 0.00, -0.51, 0.15, -0.66, 0.21], ['c', -0.87, 0.51, -1.38, 1.62, -1.56, 3.51], ['c', -0.06, 0.54, -0.12, 1.59, -0.12, 2.16], ['l', 0.00, 0.42], ['l', 1.20, 0.00], ['l', 1.20, 0.00], ['l', 0.00, -3.15], ['z'], ['m', 1.17, -3.06], ['c', -0.09, -0.03, -0.21, -0.06, -0.27, -0.09], ['l', -0.12, 0.00], ['l', 0.00, 3.15], ['l', 0.00, 3.15], ['l', 1.20, 0.00], ['l', 1.20, 0.00], ['l', 0.00, -0.81], ['c', -0.06, -2.40, -0.33, -3.69, -0.93, -4.59], ['c', -0.27, -0.39, -0.66, -0.69, -1.08, -0.81], ['z'], ['m', -1.17, 10.14], ['l', 0.00, -3.15], ['l', -1.20, 0.00], ['l', -1.20, 0.00], ['l', 0.00, 0.81], ['c', 0.03, 0.96, 0.06, 1.47, 0.15, 2.13], ['c', 0.24, 2.04, 0.96, 3.12, 2.13, 3.36], ['l', 0.12, 0.00], ['l', 0.00, -3.15], ['z'], ['m', 3.18, -2.34], ['l', 0.00, -0.81], ['l', -1.20, 0.00], ['l', -1.20, 0.00], ['l', 0.00, 3.15], ['l', 0.00, 3.15], ['l', 0.12, 0.00], ['c', 1.17, -0.24, 1.89, -1.32, 2.13, -3.36], ['c', 0.09, -0.66, 0.12, -1.17, 0.15, -2.13], ['z']], w: 16.035, h: 21.062 },\n\t'scripts.comma': { d: [['M', 1.14, -4.62], ['c', 0.30, -0.12, 0.69, -0.03, 0.93, 0.15], ['c', 0.12, 0.12, 0.36, 0.45, 0.51, 0.78], ['c', 0.90, 1.77, 0.54, 4.05, -1.08, 6.75], ['c', -0.36, 0.63, -0.87, 1.38, -0.96, 1.44], ['c', -0.18, 0.12, -0.42, 0.06, -0.54, -0.12], ['c', -0.09, -0.18, -0.09, -0.30, 0.12, -0.60], ['c', 0.96, -1.44, 1.44, -2.97, 1.38, -4.35], ['c', -0.06, -0.93, -0.30, -1.68, -0.78, -2.46], ['c', -0.27, -0.39, -0.33, -0.63, -0.24, -0.96], ['c', 0.09, -0.27, 0.36, -0.54, 0.66, -0.63], ['z']], w: 3.042, h: 9.237 },\n\t'scripts.roll': { d: [['M', 1.95, -6.00], ['c', 0.21, -0.09, 0.36, -0.09, 0.57, 0.00], ['c', 0.39, 0.15, 0.63, 0.39, 1.47, 1.35], ['c', 0.66, 0.75, 0.78, 0.87, 1.08, 1.05], ['c', 0.75, 0.45, 1.65, 0.42, 2.40, -0.06], ['c', 0.12, -0.09, 0.27, -0.27, 0.54, -0.60], ['c', 0.42, -0.54, 0.51, -0.63, 0.69, -0.63], ['c', 0.09, 0.00, 0.30, 0.12, 0.36, 0.21], ['c', 0.09, 0.12, 0.12, 0.30, 0.03, 0.42], ['c', -0.06, 0.12, -3.15, 3.90, -3.30, 4.08], ['c', -0.06, 0.06, -0.18, 0.12, -0.27, 0.18], ['c', -0.27, 0.12, -0.60, 0.06, -0.99, -0.27], ['c', -0.27, -0.21, -0.42, -0.39, -1.08, -1.14], ['c', -0.63, -0.72, -0.81, -0.90, -1.17, -1.08], ['c', -0.36, -0.18, -0.57, -0.21, -0.99, -0.21], ['c', -0.39, 0.00, -0.63, 0.03, -0.93, 0.18], ['c', -0.36, 0.15, -0.51, 0.27, -0.90, 0.81], ['c', -0.24, 0.27, -0.45, 0.51, -0.48, 0.54], ['c', -0.12, 0.09, -0.27, 0.06, -0.39, 0.00], ['c', -0.24, -0.15, -0.33, -0.39, -0.21, -0.60], ['c', 0.09, -0.12, 3.18, -3.87, 3.33, -4.02], ['c', 0.06, -0.06, 0.18, -0.15, 0.24, -0.21], ['z']], w: 10.817, h: 6.125 },\n\t'scripts.prall': { d: [['M', -4.38, -3.69], ['c', 0.06, -0.03, 0.18, -0.06, 0.24, -0.06], ['c', 0.30, 0.00, 0.27, -0.03, 1.89, 1.95], ['l', 1.53, 1.83], ['c', 0.03, 0.00, 0.57, -0.84, 1.23, -1.83], ['c', 1.14, -1.68, 1.23, -1.83, 1.35, -1.89], ['c', 0.06, -0.03, 0.18, -0.06, 0.24, -0.06], ['c', 0.30, 0.00, 0.27, -0.03, 1.89, 1.95], ['l', 1.53, 1.83], ['l', 0.48, -0.69], ['c', 0.51, -0.78, 0.54, -0.84, 0.69, -0.90], ['c', 0.42, -0.18, 0.87, 0.15, 0.81, 0.60], ['c', -0.03, 0.12, -0.30, 0.51, -1.50, 2.37], ['c', -1.38, 2.07, -1.50, 2.22, -1.62, 2.28], ['c', -0.06, 0.03, -0.18, 0.06, -0.24, 0.06], ['c', -0.30, 0.00, -0.27, 0.03, -1.89, -1.95], ['l', -1.53, -1.83], ['c', -0.03, 0.00, -0.57, 0.84, -1.23, 1.83], ['c', -1.14, 1.68, -1.23, 1.83, -1.35, 1.89], ['c', -0.06, 0.03, -0.18, 0.06, -0.24, 0.06], ['c', -0.30, 0.00, -0.27, 0.03, -1.89, -1.95], ['l', -1.53, -1.83], ['l', -0.48, 0.69], ['c', -0.51, 0.78, -0.54, 0.84, -0.69, 0.90], ['c', -0.42, 0.18, -0.87, -0.15, -0.81, -0.60], ['c', 0.03, -0.12, 0.30, -0.51, 1.50, -2.37], ['c', 1.38, -2.07, 1.50, -2.22, 1.62, -2.28], ['z']], w: 15.011, h: 7.5 },\n\t'scripts.arpeggio': { d: [['M', 1.5, 0], ['c', 1.5, 2, 1.5, 3, 1.5, 3], ['s', 0, 1, -2, 1.5], ['s', -0.5, 3, 1, 5.5], ['l', 1.5, 0], ['s', -1.75, -2, -1.9, -3.25], ['s', 2.15, -0.6, 2.95, -1.6], ['s', 0.45, -1, 0.5, -1.25], ['s', 0, -1, -2, -3.9], ['l', -1.5, 0], ['z']], w: 5, h: 10 },\n\t'scripts.mordent': { d: [['M', -0.21, -4.95], ['c', 0.27, -0.15, 0.63, 0.00, 0.75, 0.27], ['c', 0.06, 0.12, 0.06, 0.24, 0.06, 1.44], ['l', 0.00, 1.29], ['l', 0.57, -0.84], ['c', 0.51, -0.75, 0.57, -0.84, 0.69, -0.90], ['c', 0.06, -0.03, 0.18, -0.06, 0.24, -0.06], ['c', 0.30, 0.00, 0.27, -0.03, 1.89, 1.95], ['l', 1.53, 1.83], ['l', 0.48, -0.69], ['c', 0.51, -0.78, 0.54, -0.84, 0.69, -0.90], ['c', 0.42, -0.18, 0.87, 0.15, 0.81, 0.60], ['c', -0.03, 0.12, -0.30, 0.51, -1.50, 2.37], ['c', -1.38, 2.07, -1.50, 2.22, -1.62, 2.28], ['c', -0.06, 0.03, -0.18, 0.06, -0.24, 0.06], ['c', -0.30, 0.00, -0.27, 0.03, -1.83, -1.89], ['c', -0.81, -0.99, -1.50, -1.80, -1.53, -1.86], ['c', -0.06, -0.03, -0.06, -0.03, -0.12, 0.03], ['c', -0.06, 0.06, -0.06, 0.15, -0.06, 2.28], ['c', 0.00, 1.95, 0.00, 2.25, -0.06, 2.34], ['c', -0.18, 0.45, -0.81, 0.48, -1.05, 0.03], ['c', -0.03, -0.06, -0.06, -0.24, -0.06, -1.41], ['l', 0.00, -1.35], ['l', -0.57, 0.84], ['c', -0.54, 0.78, -0.60, 0.87, -0.72, 0.93], ['c', -0.06, 0.03, -0.18, 0.06, -0.24, 0.06], ['c', -0.30, 0.00, -0.27, 0.03, -1.89, -1.95], ['l', -1.53, -1.83], ['l', -0.48, 0.69], ['c', -0.51, 0.78, -0.54, 0.84, -0.69, 0.90], ['c', -0.42, 0.18, -0.87, -0.15, -0.81, -0.60], ['c', 0.03, -0.12, 0.30, -0.51, 1.50, -2.37], ['c', 1.38, -2.07, 1.50, -2.22, 1.62, -2.28], ['c', 0.06, -0.03, 0.18, -0.06, 0.24, -0.06], ['c', 0.30, 0.00, 0.27, -0.03, 1.89, 1.95], ['l', 1.53, 1.83], ['c', 0.03, 0.00, 0.06, -0.06, 0.09, -0.09], ['c', 0.06, -0.12, 0.06, -0.15, 0.06, -2.28], ['c', 0.00, -1.92, 0.00, -2.22, 0.06, -2.31], ['c', 0.06, -0.15, 0.15, -0.24, 0.30, -0.30], ['z']], w: 15.011, h: 10.012 },\n\t'flags.u8th': { d: [['M', -0.42, 3.75], ['l', 0.00, -3.75], ['l', 0.21, 0.00], ['l', 0.21, 0.00], ['l', 0.00, 0.18], ['c', 0.00, 0.30, 0.06, 0.84, 0.12, 1.23], ['c', 0.24, 1.53, 0.90, 3.12, 2.13, 5.16], ['l', 0.99, 1.59], ['c', 0.87, 1.44, 1.38, 2.34, 1.77, 3.09], ['c', 0.81, 1.68, 1.20, 3.06, 1.26, 4.53], ['c', 0.03, 1.53, -0.21, 3.27, -0.75, 5.01], ['c', -0.21, 0.69, -0.51, 1.50, -0.60, 1.59], ['c', -0.09, 0.12, -0.27, 0.21, -0.42, 0.21], ['c', -0.15, 0.00, -0.42, -0.12, -0.51, -0.21], ['c', -0.15, -0.18, -0.18, -0.42, -0.09, -0.66], ['c', 0.15, -0.33, 0.45, -1.20, 0.57, -1.62], ['c', 0.42, -1.38, 0.60, -2.58, 0.60, -3.90], ['c', 0.00, -0.66, 0.00, -0.81, -0.06, -1.11], ['c', -0.39, -2.07, -1.80, -4.26, -4.59, -7.14], ['l', -0.42, -0.45], ['l', -0.21, 0.00], ['l', -0.21, 0.00], ['l', 0.00, -3.75], ['z']], w: 6.692, h: 22.59 },\n\t'flags.u16th': { d: [['M', -0.42, 7.50], ['l', 0.00, -7.50], ['l', 0.21, 0.00], ['l', 0.21, 0.00], ['l', 0.00, 0.39], ['c', 0.06, 1.08, 0.39, 2.19, 0.99, 3.39], ['c', 0.45, 0.90, 0.87, 1.59, 1.95, 3.12], ['c', 1.29, 1.86, 1.77, 2.64, 2.22, 3.57], ['c', 0.45, 0.93, 0.72, 1.80, 0.87, 2.64], ['c', 0.06, 0.51, 0.06, 1.50, 0.00, 1.92], ['c', -0.12, 0.60, -0.30, 1.20, -0.54, 1.71], ['l', -0.09, 0.24], ['l', 0.18, 0.45], ['c', 0.51, 1.20, 0.72, 2.22, 0.69, 3.42], ['c', -0.06, 1.53, -0.39, 3.03, -0.99, 4.53], ['c', -0.30, 0.75, -0.36, 0.81, -0.57, 0.90], ['c', -0.15, 0.09, -0.33, 0.06, -0.48, 0.00], ['c', -0.18, -0.09, -0.27, -0.18, -0.33, -0.33], ['c', -0.09, -0.18, -0.06, -0.30, 0.12, -0.75], ['c', 0.66, -1.41, 1.02, -2.88, 1.08, -4.32], ['c', 0.00, -0.60, -0.03, -1.05, -0.18, -1.59], ['c', -0.30, -1.20, -0.99, -2.40, -2.25, -3.87], ['c', -0.42, -0.48, -1.53, -1.62, -2.19, -2.22], ['l', -0.45, -0.42], ['l', -0.03, 1.11], ['l', 0.00, 1.11], ['l', -0.21, 0.00], ['l', -0.21, 0.00], ['l', 0.00, -7.50], ['z'], ['m', 1.65, 0.09], ['c', -0.30, -0.30, -0.69, -0.72, -0.90, -0.87], ['l', -0.33, -0.33], ['l', 0.00, 0.15], ['c', 0.00, 0.30, 0.06, 0.81, 0.15, 1.26], ['c', 0.27, 1.29, 0.87, 2.61, 2.04, 4.29], ['c', 0.15, 0.24, 0.60, 0.87, 0.96, 1.38], ['l', 1.08, 1.53], ['l', 0.42, 0.63], ['c', 0.03, 0.00, 0.12, -0.36, 0.21, -0.72], ['c', 0.06, -0.33, 0.06, -1.20, 0.00, -1.62], ['c', -0.33, -1.71, -1.44, -3.48, -3.63, -5.70], ['z']], w: 6.693, h: 26.337 },\n\t'flags.u32nd': { d: [['M', -0.42, 11.25], ['l', 0.00, -11.25], ['l', 0.21, 0.00], ['l', 0.21, 0.00], ['l', 0.00, 0.36], ['c', 0.09, 1.68, 0.69, 3.27, 2.07, 5.46], ['l', 0.87, 1.35], ['c', 1.02, 1.62, 1.47, 2.37, 1.86, 3.18], ['c', 0.48, 1.02, 0.78, 1.92, 0.93, 2.88], ['c', 0.06, 0.48, 0.06, 1.50, 0.00, 1.89], ['c', -0.09, 0.42, -0.21, 0.87, -0.36, 1.26], ['l', -0.12, 0.30], ['l', 0.15, 0.39], ['c', 0.69, 1.56, 0.84, 2.88, 0.54, 4.38], ['c', -0.09, 0.45, -0.27, 1.08, -0.45, 1.47], ['l', -0.12, 0.24], ['l', 0.18, 0.36], ['c', 0.33, 0.72, 0.57, 1.56, 0.69, 2.34], ['c', 0.12, 1.02, -0.06, 2.52, -0.42, 3.84], ['c', -0.27, 0.93, -0.75, 2.13, -0.93, 2.31], ['c', -0.18, 0.15, -0.45, 0.18, -0.66, 0.09], ['c', -0.18, -0.09, -0.27, -0.18, -0.33, -0.33], ['c', -0.09, -0.18, -0.06, -0.30, 0.06, -0.60], ['c', 0.21, -0.36, 0.42, -0.90, 0.57, -1.38], ['c', 0.51, -1.41, 0.69, -3.06, 0.48, -4.08], ['c', -0.15, -0.81, -0.57, -1.68, -1.20, -2.55], ['c', -0.72, -0.99, -1.83, -2.13, -3.30, -3.33], ['l', -0.48, -0.42], ['l', -0.03, 1.53], ['l', 0.00, 1.56], ['l', -0.21, 0.00], ['l', -0.21, 0.00], ['l', 0.00, -11.25], ['z'], ['m', 1.26, -3.96], ['c', -0.27, -0.30, -0.54, -0.60, -0.66, -0.72], ['l', -0.18, -0.21], ['l', 0.00, 0.42], ['c', 0.06, 0.87, 0.24, 1.74, 0.66, 2.67], ['c', 0.36, 0.87, 0.96, 1.86, 1.92, 3.18], ['c', 0.21, 0.33, 0.63, 0.87, 0.87, 1.23], ['c', 0.27, 0.39, 0.60, 0.84, 0.75, 1.08], ['l', 0.27, 0.39], ['l', 0.03, -0.12], ['c', 0.12, -0.45, 0.15, -1.05, 0.09, -1.59], ['c', -0.27, -1.86, -1.38, -3.78, -3.75, -6.33], ['z'], ['m', -0.27, 6.09], ['c', -0.27, -0.21, -0.48, -0.42, -0.51, -0.45], ['c', -0.06, -0.03, -0.06, -0.03, -0.06, 0.21], ['c', 0.00, 0.90, 0.30, 2.04, 0.81, 3.09], ['c', 0.48, 1.02, 0.96, 1.77, 2.37, 3.63], ['c', 0.60, 0.78, 1.05, 1.44, 1.29, 1.77], ['c', 0.06, 0.12, 0.15, 0.21, 0.15, 0.18], ['c', 0.03, -0.03, 0.18, -0.57, 0.24, -0.87], ['c', 0.06, -0.45, 0.06, -1.32, -0.03, -1.74], ['c', -0.09, -0.48, -0.24, -0.90, -0.51, -1.44], ['c', -0.66, -1.35, -1.83, -2.70, -3.75, -4.38], ['z']], w: 6.697, h: 32.145 },\n\t'flags.u64th': { d: [['M', -0.42, 15.00], ['l', 0.00, -15.00], ['l', 0.21, 0.00], ['l', 0.21, 0.00], ['l', 0.00, 0.36], ['c', 0.06, 1.20, 0.39, 2.37, 1.02, 3.66], ['c', 0.39, 0.81, 0.84, 1.56, 1.80, 3.09], ['c', 0.81, 1.26, 1.05, 1.68, 1.35, 2.22], ['c', 0.87, 1.50, 1.35, 2.79, 1.56, 4.08], ['c', 0.06, 0.54, 0.06, 1.56, -0.03, 2.04], ['c', -0.09, 0.48, -0.21, 0.99, -0.36, 1.35], ['l', -0.12, 0.27], ['l', 0.12, 0.27], ['c', 0.09, 0.15, 0.21, 0.45, 0.27, 0.66], ['c', 0.69, 1.89, 0.63, 3.66, -0.18, 5.46], ['l', -0.18, 0.39], ['l', 0.15, 0.33], ['c', 0.30, 0.66, 0.51, 1.44, 0.63, 2.10], ['c', 0.06, 0.48, 0.06, 1.35, 0.00, 1.71], ['c', -0.15, 0.57, -0.42, 1.20, -0.78, 1.68], ['l', -0.21, 0.27], ['l', 0.18, 0.33], ['c', 0.57, 1.05, 0.93, 2.13, 1.02, 3.18], ['c', 0.06, 0.72, 0.00, 1.83, -0.21, 2.79], ['c', -0.18, 1.02, -0.63, 2.34, -1.02, 3.09], ['c', -0.15, 0.33, -0.48, 0.45, -0.78, 0.30], ['c', -0.18, -0.09, -0.27, -0.18, -0.33, -0.33], ['c', -0.09, -0.18, -0.06, -0.30, 0.03, -0.54], ['c', 0.75, -1.50, 1.23, -3.45, 1.17, -4.89], ['c', -0.06, -1.02, -0.42, -2.01, -1.17, -3.15], ['c', -0.48, -0.72, -1.02, -1.35, -1.89, -2.22], ['c', -0.57, -0.57, -1.56, -1.50, -1.92, -1.77], ['l', -0.12, -0.09], ['l', 0.00, 1.68], ['l', 0.00, 1.68], ['l', -0.21, 0.00], ['l', -0.21, 0.00], ['l', 0.00, -15.00], ['z'], ['m', 0.93, -8.07], ['c', -0.27, -0.30, -0.48, -0.54, -0.51, -0.54], ['c', 0.00, 0.00, 0.00, 0.69, 0.03, 1.02], ['c', 0.15, 1.47, 0.75, 2.94, 2.04, 4.83], ['l', 1.08, 1.53], ['c', 0.39, 0.57, 0.84, 1.20, 0.99, 1.44], ['c', 0.15, 0.24, 0.30, 0.45, 0.30, 0.45], ['c', 0.00, 0.00, 0.03, -0.09, 0.06, -0.21], ['c', 0.36, -1.59, -0.15, -3.33, -1.47, -5.40], ['c', -0.63, -0.93, -1.35, -1.83, -2.52, -3.12], ['z'], ['m', 0.06, 6.72], ['c', -0.24, -0.21, -0.48, -0.42, -0.51, -0.45], ['l', -0.06, -0.06], ['l', 0.00, 0.33], ['c', 0.00, 1.20, 0.30, 2.34, 0.93, 3.60], ['c', 0.45, 0.90, 0.96, 1.68, 2.25, 3.51], ['c', 0.39, 0.54, 0.84, 1.17, 1.02, 1.44], ['c', 0.21, 0.33, 0.33, 0.51, 0.33, 0.48], ['c', 0.06, -0.09, 0.21, -0.63, 0.30, -0.99], ['c', 0.06, -0.33, 0.06, -0.45, 0.06, -0.96], ['c', 0.00, -0.60, -0.03, -0.84, -0.18, -1.35], ['c', -0.30, -1.08, -1.02, -2.28, -2.13, -3.57], ['c', -0.39, -0.45, -1.44, -1.47, -2.01, -1.98], ['z'], ['m', 0.00, 6.72], ['c', -0.24, -0.21, -0.48, -0.39, -0.51, -0.42], ['l', -0.06, -0.06], ['l', 0.00, 0.33], ['c', 0.00, 1.41, 0.45, 2.82, 1.38, 4.35], ['c', 0.42, 0.72, 0.72, 1.14, 1.86, 2.73], ['c', 0.36, 0.45, 0.75, 0.99, 0.87, 1.20], ['c', 0.15, 0.21, 0.30, 0.36, 0.30, 0.36], ['c', 0.06, 0.00, 0.30, -0.48, 0.39, -0.75], ['c', 0.09, -0.36, 0.12, -0.63, 0.12, -1.05], ['c', -0.06, -1.05, -0.45, -2.04, -1.20, -3.18], ['c', -0.57, -0.87, -1.11, -1.53, -2.07, -2.49], ['c', -0.36, -0.33, -0.84, -0.78, -1.08, -1.02], ['z']], w: 6.682, h: 39.694 },\n\t'flags.d8th': { d: [['M', 5.67, -21.63], ['c', 0.24, -0.12, 0.54, -0.06, 0.69, 0.15], ['c', 0.06, 0.06, 0.21, 0.36, 0.39, 0.66], ['c', 0.84, 1.77, 1.26, 3.36, 1.32, 5.10], ['c', 0.03, 1.29, -0.21, 2.37, -0.81, 3.63], ['c', -0.60, 1.23, -1.26, 2.13, -3.21, 4.38], ['c', -1.35, 1.53, -1.86, 2.19, -2.40, 2.97], ['c', -0.63, 0.93, -1.11, 1.92, -1.38, 2.79], ['c', -0.15, 0.54, -0.27, 1.35, -0.27, 1.80], ['l', 0.00, 0.15], ['l', -0.21, 0.00], ['l', -0.21, 0.00], ['l', 0.00, -3.75], ['l', 0.00, -3.75], ['l', 0.21, 0.00], ['l', 0.21, 0.00], ['l', 0.48, -0.30], ['c', 1.83, -1.11, 3.12, -2.10, 4.17, -3.12], ['c', 0.78, -0.81, 1.32, -1.53, 1.71, -2.31], ['c', 0.45, -0.93, 0.60, -1.74, 0.51, -2.88], ['c', -0.12, -1.56, -0.63, -3.18, -1.47, -4.68], ['c', -0.12, -0.21, -0.15, -0.33, -0.06, -0.51], ['c', 0.06, -0.15, 0.15, -0.24, 0.33, -0.33], ['z']], w: 8.492, h: 21.691 },\n\t'flags.ugrace': { d: [['M', 6.03, 6.93], ['c', 0.15, -0.09, 0.33, -0.06, 0.51, 0.00], ['c', 0.15, 0.09, 0.21, 0.15, 0.30, 0.33], ['c', 0.09, 0.18, 0.06, 0.39, -0.03, 0.54], ['c', -0.06, 0.15, -10.89, 8.88, -11.07, 8.97], ['c', -0.15, 0.09, -0.33, 0.06, -0.48, 0.00], ['c', -0.18, -0.09, -0.24, -0.15, -0.33, -0.33], ['c', -0.09, -0.18, -0.06, -0.39, 0.03, -0.54], ['c', 0.06, -0.15, 10.89, -8.88, 11.07, -8.97], ['z']], w: 12.019, h: 9.954 },\n\t'flags.dgrace': { d: [['M', -6.06, -15.93], ['c', 0.18, -0.09, 0.33, -0.12, 0.48, -0.06], ['c', 0.18, 0.09, 14.01, 8.04, 14.10, 8.10], ['c', 0.12, 0.12, 0.18, 0.33, 0.18, 0.51], ['c', -0.03, 0.21, -0.15, 0.39, -0.36, 0.48], ['c', -0.18, 0.09, -0.33, 0.12, -0.48, 0.06], ['c', -0.18, -0.09, -14.01, -8.04, -14.10, -8.10], ['c', -0.12, -0.12, -0.18, -0.33, -0.18, -0.51], ['c', 0.03, -0.21, 0.15, -0.39, 0.36, -0.48], ['z']], w: 15.12, h: 9.212 },\n\t'flags.d16th': { d: [['M', 6.84, -22.53], ['c', 0.27, -0.12, 0.57, -0.06, 0.72, 0.15], ['c', 0.15, 0.15, 0.33, 0.87, 0.45, 1.56], ['c', 0.06, 0.33, 0.06, 1.35, 0.00, 1.65], ['c', -0.06, 0.33, -0.15, 0.78, -0.27, 1.11], ['c', -0.12, 0.33, -0.45, 0.96, -0.66, 1.32], ['l', -0.18, 0.27], ['l', 0.09, 0.18], ['c', 0.48, 1.02, 0.72, 2.25, 0.69, 3.30], ['c', -0.06, 1.23, -0.42, 2.28, -1.26, 3.45], ['c', -0.57, 0.87, -0.99, 1.32, -3.00, 3.39], ['c', -1.56, 1.56, -2.22, 2.40, -2.76, 3.45], ['c', -0.42, 0.84, -0.66, 1.80, -0.66, 2.55], ['l', 0.00, 0.15], ['l', -0.21, 0.00], ['l', -0.21, 0.00], ['l', 0.00, -7.50], ['l', 0.00, -7.50], ['l', 0.21, 0.00], ['l', 0.21, 0.00], ['l', 0.00, 1.14], ['l', 0.00, 1.11], ['l', 0.27, -0.15], ['c', 1.11, -0.57, 1.77, -0.99, 2.52, -1.47], ['c', 2.37, -1.56, 3.69, -3.15, 4.05, -4.83], ['c', 0.03, -0.18, 0.03, -0.39, 0.03, -0.78], ['c', 0.00, -0.60, -0.03, -0.93, -0.24, -1.50], ['c', -0.06, -0.18, -0.12, -0.39, -0.15, -0.45], ['c', -0.03, -0.24, 0.12, -0.48, 0.36, -0.60], ['z'], ['m', -0.63, 7.50], ['c', -0.06, -0.18, -0.15, -0.36, -0.15, -0.36], ['c', -0.03, 0.00, -0.03, 0.03, -0.06, 0.06], ['c', -0.06, 0.12, -0.96, 1.02, -1.95, 1.98], ['c', -0.63, 0.57, -1.26, 1.17, -1.44, 1.35], ['c', -1.53, 1.62, -2.28, 2.85, -2.55, 4.32], ['c', -0.03, 0.18, -0.03, 0.54, -0.06, 0.99], ['l', 0.00, 0.69], ['l', 0.18, -0.09], ['c', 0.93, -0.54, 2.10, -1.29, 2.82, -1.83], ['c', 0.69, -0.51, 1.02, -0.81, 1.53, -1.29], ['c', 1.86, -1.89, 2.37, -3.66, 1.68, -5.82], ['z']], w: 8.475, h: 22.591 },\n\t'flags.d32nd': { d: [['M', 6.84, -29.13], ['c', 0.27, -0.12, 0.57, -0.06, 0.72, 0.15], ['c', 0.12, 0.12, 0.27, 0.63, 0.36, 1.11], ['c', 0.33, 1.59, 0.06, 3.06, -0.81, 4.47], ['l', -0.18, 0.27], ['l', 0.09, 0.15], ['c', 0.12, 0.24, 0.33, 0.69, 0.45, 1.05], ['c', 0.63, 1.83, 0.45, 3.57, -0.57, 5.22], ['l', -0.18, 0.30], ['l', 0.15, 0.27], ['c', 0.42, 0.87, 0.60, 1.71, 0.57, 2.61], ['c', -0.06, 1.29, -0.48, 2.46, -1.35, 3.78], ['c', -0.54, 0.81, -0.93, 1.29, -2.46, 3.00], ['c', -0.51, 0.54, -1.05, 1.17, -1.26, 1.41], ['c', -1.56, 1.86, -2.25, 3.36, -2.37, 5.01], ['l', 0.00, 0.33], ['l', -0.21, 0.00], ['l', -0.21, 0.00], ['l', 0.00, -11.25], ['l', 0.00, -11.25], ['l', 0.21, 0.00], ['l', 0.21, 0.00], ['l', 0.00, 1.35], ['l', 0.03, 1.35], ['l', 0.78, -0.39], ['c', 1.38, -0.69, 2.34, -1.26, 3.24, -1.92], ['c', 1.38, -1.02, 2.28, -2.13, 2.64, -3.21], ['c', 0.15, -0.48, 0.18, -0.72, 0.18, -1.29], ['c', 0.00, -0.57, -0.06, -0.90, -0.24, -1.47], ['c', -0.06, -0.18, -0.12, -0.39, -0.15, -0.45], ['c', -0.03, -0.24, 0.12, -0.48, 0.36, -0.60], ['z'], ['m', -0.63, 7.20], ['c', -0.09, -0.18, -0.12, -0.21, -0.12, -0.15], ['c', -0.03, 0.09, -1.02, 1.08, -2.04, 2.04], ['c', -1.17, 1.08, -1.65, 1.56, -2.07, 2.04], ['c', -0.84, 0.96, -1.38, 1.86, -1.68, 2.76], ['c', -0.21, 0.57, -0.27, 0.99, -0.30, 1.65], ['l', 0.00, 0.54], ['l', 0.66, -0.33], ['c', 3.57, -1.86, 5.49, -3.69, 5.94, -5.70], ['c', 0.06, -0.39, 0.06, -1.20, -0.03, -1.65], ['c', -0.06, -0.39, -0.24, -0.90, -0.36, -1.20], ['z'], ['m', -0.06, 7.20], ['c', -0.06, -0.15, -0.12, -0.33, -0.15, -0.45], ['l', -0.06, -0.18], ['l', -0.18, 0.21], ['l', -1.83, 1.83], ['c', -0.87, 0.90, -1.77, 1.80, -1.95, 2.01], ['c', -1.08, 1.29, -1.62, 2.31, -1.89, 3.51], ['c', -0.06, 0.30, -0.06, 0.51, -0.09, 0.93], ['l', 0.00, 0.57], ['l', 0.09, -0.06], ['c', 0.75, -0.45, 1.89, -1.26, 2.52, -1.74], ['c', 0.81, -0.66, 1.74, -1.53, 2.22, -2.16], ['c', 1.26, -1.53, 1.68, -3.06, 1.32, -4.47], ['z']], w: 8.385, h: 29.191 },\n\t'flags.d64th': { d: [['M', 7.08, -32.88], ['c', 0.30, -0.12, 0.66, -0.03, 0.78, 0.24], ['c', 0.18, 0.33, 0.27, 2.10, 0.15, 2.64], ['c', -0.09, 0.39, -0.21, 0.78, -0.39, 1.08], ['l', -0.15, 0.30], ['l', 0.09, 0.27], ['c', 0.03, 0.12, 0.09, 0.45, 0.12, 0.69], ['c', 0.27, 1.44, 0.18, 2.55, -0.30, 3.60], ['l', -0.12, 0.33], ['l', 0.06, 0.42], ['c', 0.27, 1.35, 0.33, 2.82, 0.21, 3.63], ['c', -0.12, 0.60, -0.30, 1.23, -0.57, 1.80], ['l', -0.15, 0.27], ['l', 0.03, 0.42], ['c', 0.06, 1.02, 0.06, 2.70, 0.03, 3.06], ['c', -0.15, 1.47, -0.66, 2.76, -1.74, 4.41], ['c', -0.45, 0.69, -0.75, 1.11, -1.74, 2.37], ['c', -1.05, 1.38, -1.50, 1.98, -1.95, 2.73], ['c', -0.93, 1.50, -1.38, 2.82, -1.44, 4.20], ['l', 0.00, 0.42], ['l', -0.21, 0.00], ['l', -0.21, 0.00], ['l', 0.00, -15.00], ['l', 0.00, -15.00], ['l', 0.21, 0.00], ['l', 0.21, 0.00], ['l', 0.00, 1.86], ['l', 0.00, 1.89], ['c', 0.00, 0.00, 0.21, -0.03, 0.45, -0.09], ['c', 2.22, -0.39, 4.08, -1.11, 5.19, -2.01], ['c', 0.63, -0.54, 1.02, -1.14, 1.20, -1.80], ['c', 0.06, -0.30, 0.06, -1.14, -0.03, -1.65], ['c', -0.03, -0.18, -0.06, -0.39, -0.09, -0.48], ['c', -0.03, -0.24, 0.12, -0.48, 0.36, -0.60], ['z'], ['m', -0.45, 6.15], ['c', -0.03, -0.18, -0.06, -0.42, -0.06, -0.54], ['l', -0.03, -0.18], ['l', -0.33, 0.30], ['c', -0.42, 0.36, -0.87, 0.72, -1.68, 1.29], ['c', -1.98, 1.38, -2.25, 1.59, -2.85, 2.16], ['c', -0.75, 0.69, -1.23, 1.44, -1.47, 2.19], ['c', -0.15, 0.45, -0.18, 0.63, -0.21, 1.35], ['l', 0.00, 0.66], ['l', 0.39, -0.18], ['c', 1.83, -0.90, 3.45, -1.95, 4.47, -2.91], ['c', 0.93, -0.90, 1.53, -1.83, 1.74, -2.82], ['c', 0.06, -0.33, 0.06, -0.87, 0.03, -1.32], ['z'], ['m', -0.27, 4.86], ['c', -0.03, -0.21, -0.06, -0.36, -0.06, -0.36], ['c', 0.00, -0.03, -0.12, 0.09, -0.24, 0.24], ['c', -0.39, 0.48, -0.99, 1.08, -2.16, 2.19], ['c', -1.47, 1.38, -1.92, 1.83, -2.46, 2.49], ['c', -0.66, 0.87, -1.08, 1.74, -1.29, 2.58], ['c', -0.09, 0.42, -0.15, 0.87, -0.15, 1.44], ['l', 0.00, 0.54], ['l', 0.48, -0.33], ['c', 1.50, -1.02, 2.58, -1.89, 3.51, -2.82], ['c', 1.47, -1.47, 2.25, -2.85, 2.40, -4.26], ['c', 0.03, -0.39, 0.03, -1.17, -0.03, -1.71], ['z'], ['m', -0.66, 7.68], ['c', 0.03, -0.15, 0.03, -0.60, 0.03, -0.99], ['l', 0.00, -0.72], ['l', -0.27, 0.33], ['l', -1.74, 1.98], ['c', -1.77, 1.92, -2.43, 2.76, -2.97, 3.90], ['c', -0.51, 1.02, -0.72, 1.77, -0.75, 2.91], ['c', 0.00, 0.63, 0.00, 0.63, 0.06, 0.60], ['c', 0.03, -0.03, 0.30, -0.27, 0.63, -0.54], ['c', 0.66, -0.60, 1.86, -1.80, 2.31, -2.31], ['c', 1.65, -1.89, 2.52, -3.54, 2.70, -5.16], ['z']], w: 8.485, h: 32.932 },\n\t'clefs.C': { d: [['M', 0.06, -14.94], ['l', 0.09, -0.06], ['l', 1.92, 0.00], ['l', 1.92, 0.00], ['l', 0.09, 0.06], ['l', 0.06, 0.09], ['l', 0.00, 14.85], ['l', 0.00, 14.82], ['l', -0.06, 0.09], ['l', -0.09, 0.06], ['l', -1.92, 0.00], ['l', -1.92, 0.00], ['l', -0.09, -0.06], ['l', -0.06, -0.09], ['l', 0.00, -14.82], ['l', 0.00, -14.85], ['z'], ['m', 5.37, 0.00], ['c', 0.09, -0.06, 0.09, -0.06, 0.57, -0.06], ['c', 0.45, 0.00, 0.45, 0.00, 0.54, 0.06], ['l', 0.06, 0.09], ['l', 0.00, 7.14], ['l', 0.00, 7.11], ['l', 0.09, -0.06], ['c', 0.18, -0.18, 0.72, -0.84, 0.96, -1.20], ['c', 0.30, -0.45, 0.66, -1.17, 0.84, -1.65], ['c', 0.36, -0.90, 0.57, -1.83, 0.60, -2.79], ['c', 0.03, -0.48, 0.03, -0.54, 0.09, -0.63], ['c', 0.12, -0.18, 0.36, -0.21, 0.54, -0.12], ['c', 0.18, 0.09, 0.21, 0.15, 0.24, 0.66], ['c', 0.06, 0.87, 0.21, 1.56, 0.57, 2.22], ['c', 0.51, 1.02, 1.26, 1.68, 2.22, 1.92], ['c', 0.21, 0.06, 0.33, 0.06, 0.78, 0.06], ['c', 0.45, 0.00, 0.57, 0.00, 0.84, -0.06], ['c', 0.45, -0.12, 0.81, -0.33, 1.08, -0.60], ['c', 0.57, -0.57, 0.87, -1.41, 0.99, -2.88], ['c', 0.06, -0.54, 0.06, -3.00, 0.00, -3.57], ['c', -0.21, -2.58, -0.84, -3.87, -2.16, -4.50], ['c', -0.48, -0.21, -1.17, -0.36, -1.77, -0.36], ['c', -0.69, 0.00, -1.29, 0.27, -1.50, 0.72], ['c', -0.06, 0.15, -0.06, 0.21, -0.06, 0.42], ['c', 0.00, 0.24, 0.00, 0.30, 0.06, 0.45], ['c', 0.12, 0.24, 0.24, 0.39, 0.63, 0.66], ['c', 0.42, 0.30, 0.57, 0.48, 0.69, 0.72], ['c', 0.06, 0.15, 0.06, 0.21, 0.06, 0.48], ['c', 0.00, 0.39, -0.03, 0.63, -0.21, 0.96], ['c', -0.30, 0.60, -0.87, 1.08, -1.50, 1.26], ['c', -0.27, 0.06, -0.87, 0.06, -1.14, 0.00], ['c', -0.78, -0.24, -1.44, -0.87, -1.65, -1.68], ['c', -0.12, -0.42, -0.09, -1.17, 0.09, -1.71], ['c', 0.51, -1.65, 1.98, -2.82, 3.81, -3.09], ['c', 0.84, -0.09, 2.46, 0.03, 3.51, 0.27], ['c', 2.22, 0.57, 3.69, 1.80, 4.44, 3.75], ['c', 0.36, 0.93, 0.57, 2.13, 0.57, 3.36], ['c', 0.00, 1.44, -0.48, 2.73, -1.38, 3.81], ['c', -1.26, 1.50, -3.27, 2.43, -5.28, 2.43], ['c', -0.48, 0.00, -0.51, 0.00, -0.75, -0.09], ['c', -0.15, -0.03, -0.48, -0.21, -0.78, -0.36], ['c', -0.69, -0.36, -0.87, -0.42, -1.26, -0.42], ['c', -0.27, 0.00, -0.30, 0.00, -0.51, 0.09], ['c', -0.57, 0.30, -0.81, 0.90, -0.81, 2.10], ['c', 0.00, 1.23, 0.24, 1.83, 0.81, 2.13], ['c', 0.21, 0.09, 0.24, 0.09, 0.51, 0.09], ['c', 0.39, 0.00, 0.57, -0.06, 1.26, -0.42], ['c', 0.30, -0.15, 0.63, -0.33, 0.78, -0.36], ['c', 0.24, -0.09, 0.27, -0.09, 0.75, -0.09], ['c', 2.01, 0.00, 4.02, 0.93, 5.28, 2.40], ['c', 0.90, 1.11, 1.38, 2.40, 1.38, 3.84], ['c', 0.00, 1.50, -0.30, 2.88, -0.84, 3.96], ['c', -0.78, 1.59, -2.19, 2.64, -4.17, 3.15], ['c', -1.05, 0.24, -2.67, 0.36, -3.51, 0.27], ['c', -1.83, -0.27, -3.30, -1.44, -3.81, -3.09], ['c', -0.18, -0.54, -0.21, -1.29, -0.09, -1.74], ['c', 0.15, -0.60, 0.63, -1.20, 1.23, -1.47], ['c', 0.36, -0.18, 0.57, -0.21, 0.99, -0.21], ['c', 0.42, 0.00, 0.63, 0.03, 1.02, 0.21], ['c', 0.42, 0.21, 0.84, 0.63, 1.05, 1.05], ['c', 0.18, 0.36, 0.21, 0.60, 0.21, 0.96], ['c', 0.00, 0.30, 0.00, 0.36, -0.06, 0.51], ['c', -0.12, 0.24, -0.27, 0.42, -0.69, 0.72], ['c', -0.57, 0.42, -0.69, 0.63, -0.69, 1.08], ['c', 0.00, 0.24, 0.00, 0.30, 0.06, 0.45], ['c', 0.12, 0.21, 0.30, 0.39, 0.57, 0.54], ['c', 0.42, 0.18, 0.87, 0.21, 1.53, 0.15], ['c', 1.08, -0.15, 1.80, -0.57, 2.34, -1.32], ['c', 0.54, -0.75, 0.84, -1.83, 0.99, -3.51], ['c', 0.06, -0.57, 0.06, -3.03, 0.00, -3.57], ['c', -0.12, -1.47, -0.42, -2.31, -0.99, -2.88], ['c', -0.27, -0.27, -0.63, -0.48, -1.08, -0.60], ['c', -0.27, -0.06, -0.39, -0.06, -0.84, -0.06], ['c', -0.45, 0.00, -0.57, 0.00, -0.78, 0.06], ['c', -1.14, 0.27, -2.01, 1.17, -2.46, 2.49], ['c', -0.21, 0.57, -0.30, 0.99, -0.33, 1.65], ['c', -0.03, 0.51, -0.06, 0.57, -0.24, 0.66], ['c', -0.12, 0.06, -0.27, 0.06, -0.39, 0.00], ['c', -0.21, -0.09, -0.21, -0.15, -0.24, -0.75], ['c', -0.09, -1.92, -0.78, -3.72, -2.01, -5.19], ['c', -0.18, -0.21, -0.36, -0.42, -0.39, -0.45], ['l', -0.09, -0.06], ['l', 0.00, 7.11], ['l', 0.00, 7.14], ['l', -0.06, 0.09], ['c', -0.09, 0.06, -0.09, 0.06, -0.54, 0.06], ['c', -0.48, 0.00, -0.48, 0.00, -0.57, -0.06], ['l', -0.06, -0.09], ['l', 0.00, -14.82], ['l', 0.00, -14.85], ['z']], w: 20.31, h: 29.97 },\n\t'clefs.F': { d: [['M', 6.30, -7.80], ['c', 0.36, -0.03, 1.65, 0.00, 2.13, 0.03], ['c', 3.60, 0.42, 6.03, 2.10, 6.93, 4.86], ['c', 0.27, 0.84, 0.36, 1.50, 0.36, 2.58], ['c', 0.00, 0.90, -0.03, 1.35, -0.18, 2.16], ['c', -0.78, 3.78, -3.54, 7.08, -8.37, 9.96], ['c', -1.74, 1.05, -3.87, 2.13, -6.18, 3.12], ['c', -0.39, 0.18, -0.75, 0.33, -0.81, 0.36], ['c', -0.06, 0.03, -0.15, 0.06, -0.18, 0.06], ['c', -0.15, 0.00, -0.33, -0.18, -0.33, -0.33], ['c', 0.00, -0.15, 0.06, -0.21, 0.51, -0.48], ['c', 3.00, -1.77, 5.13, -3.21, 6.84, -4.74], ['c', 0.51, -0.45, 1.59, -1.50, 1.95, -1.95], ['c', 1.89, -2.19, 2.88, -4.32, 3.15, -6.78], ['c', 0.06, -0.42, 0.06, -1.77, 0.00, -2.19], ['c', -0.24, -2.01, -0.93, -3.63, -2.04, -4.71], ['c', -0.63, -0.63, -1.29, -1.02, -2.07, -1.20], ['c', -1.62, -0.39, -3.36, 0.15, -4.56, 1.44], ['c', -0.54, 0.60, -1.05, 1.47, -1.32, 2.22], ['l', -0.09, 0.21], ['l', 0.24, -0.12], ['c', 0.39, -0.21, 0.63, -0.24, 1.11, -0.24], ['c', 0.30, 0.00, 0.45, 0.00, 0.66, 0.06], ['c', 1.92, 0.48, 2.85, 2.55, 1.95, 4.38], ['c', -0.45, 0.99, -1.41, 1.62, -2.46, 1.71], ['c', -1.47, 0.09, -2.91, -0.87, -3.39, -2.25], ['c', -0.18, -0.57, -0.21, -1.32, -0.03, -2.28], ['c', 0.39, -2.25, 1.83, -4.20, 3.81, -5.19], ['c', 0.69, -0.36, 1.59, -0.60, 2.37, -0.69], ['z'], ['m', 11.58, 2.52], ['c', 0.84, -0.21, 1.71, 0.30, 1.89, 1.14], ['c', 0.30, 1.17, -0.72, 2.19, -1.89, 1.89], ['c', -0.99, -0.21, -1.50, -1.32, -1.02, -2.25], ['c', 0.18, -0.39, 0.60, -0.69, 1.02, -0.78], ['z'], ['m', 0.00, 7.50], ['c', 0.84, -0.21, 1.71, 0.30, 1.89, 1.14], ['c', 0.21, 0.87, -0.30, 1.71, -1.14, 1.89], ['c', -0.87, 0.21, -1.71, -0.30, -1.89, -1.14], ['c', -0.21, -0.84, 0.30, -1.71, 1.14, -1.89], ['z']], w: 20.153, h: 23.142 },\n\t'clefs.G': { d: [['M', 9.69, -37.41], ['c', 0.09, -0.09, 0.24, -0.06, 0.36, 0.00], ['c', 0.12, 0.09, 0.57, 0.60, 0.96, 1.11], ['c', 1.77, 2.34, 3.21, 5.85, 3.57, 8.73], ['c', 0.21, 1.56, 0.03, 3.27, -0.45, 4.86], ['c', -0.69, 2.31, -1.92, 4.47, -4.23, 7.44], ['c', -0.30, 0.39, -0.57, 0.72, -0.60, 0.75], ['c', -0.03, 0.06, 0.00, 0.15, 0.18, 0.78], ['c', 0.54, 1.68, 1.38, 4.44, 1.68, 5.49], ['l', 0.09, 0.42], ['l', 0.39, 0.00], ['c', 1.47, 0.09, 2.76, 0.51, 3.96, 1.29], ['c', 1.83, 1.23, 3.06, 3.21, 3.39, 5.52], ['c', 0.09, 0.45, 0.12, 1.29, 0.06, 1.74], ['c', -0.09, 1.02, -0.33, 1.83, -0.75, 2.73], ['c', -0.84, 1.71, -2.28, 3.06, -4.02, 3.72], ['l', -0.33, 0.12], ['l', 0.03, 1.26], ['c', 0.00, 1.74, -0.06, 3.63, -0.21, 4.62], ['c', -0.45, 3.06, -2.19, 5.49, -4.47, 6.21], ['c', -0.57, 0.18, -0.90, 0.21, -1.59, 0.21], ['c', -0.69, 0.00, -1.02, -0.03, -1.65, -0.21], ['c', -1.14, -0.27, -2.13, -0.84, -2.94, -1.65], ['c', -0.99, -0.99, -1.56, -2.16, -1.71, -3.54], ['c', -0.09, -0.81, 0.06, -1.53, 0.45, -2.13], ['c', 0.63, -0.99, 1.83, -1.56, 3.00, -1.53], ['c', 1.50, 0.09, 2.64, 1.32, 2.73, 2.94], ['c', 0.06, 1.47, -0.93, 2.70, -2.37, 2.97], ['c', -0.45, 0.06, -0.84, 0.03, -1.29, -0.09], ['l', -0.21, -0.09], ['l', 0.09, 0.12], ['c', 0.39, 0.54, 0.78, 0.93, 1.32, 1.26], ['c', 1.35, 0.87, 3.06, 1.02, 4.35, 0.36], ['c', 1.44, -0.72, 2.52, -2.28, 2.97, -4.35], ['c', 0.15, -0.66, 0.24, -1.50, 0.30, -3.03], ['c', 0.03, -0.84, 0.03, -2.94, 0.00, -3.00], ['c', -0.03, 0.00, -0.18, 0.00, -0.36, 0.03], ['c', -0.66, 0.12, -0.99, 0.12, -1.83, 0.12], ['c', -1.05, 0.00, -1.71, -0.06, -2.61, -0.30], ['c', -4.02, -0.99, -7.11, -4.35, -7.80, -8.46], ['c', -0.12, -0.66, -0.12, -0.99, -0.12, -1.83], ['c', 0.00, -0.84, 0.00, -1.14, 0.15, -1.92], ['c', 0.36, -2.28, 1.41, -4.62, 3.30, -7.29], ['l', 2.79, -3.60], ['c', 0.54, -0.66, 0.96, -1.20, 0.96, -1.23], ['c', 0.00, -0.03, -0.09, -0.33, -0.18, -0.69], ['c', -0.96, -3.21, -1.41, -5.28, -1.59, -7.68], ['c', -0.12, -1.38, -0.15, -3.09, -0.06, -3.96], ['c', 0.33, -2.67, 1.38, -5.07, 3.12, -7.08], ['c', 0.36, -0.42, 0.99, -1.05, 1.17, -1.14], ['z'], ['m', 2.01, 4.71], ['c', -0.15, -0.30, -0.30, -0.54, -0.30, -0.54], ['c', -0.03, 0.00, -0.18, 0.09, -0.30, 0.21], ['c', -2.40, 1.74, -3.87, 4.20, -4.26, 7.11], ['c', -0.06, 0.54, -0.06, 1.41, -0.03, 1.89], ['c', 0.09, 1.29, 0.48, 3.12, 1.08, 5.22], ['c', 0.15, 0.42, 0.24, 0.78, 0.24, 0.81], ['c', 0.00, 0.03, 0.84, -1.11, 1.23, -1.68], ['c', 1.89, -2.73, 2.88, -5.07, 3.15, -7.53], ['c', 0.09, -0.57, 0.12, -1.74, 0.06, -2.37], ['c', -0.09, -1.23, -0.27, -1.92, -0.87, -3.12], ['z'], ['m', -2.94, 20.70], ['c', -0.21, -0.72, -0.39, -1.32, -0.42, -1.32], ['c', 0.00, 0.00, -1.20, 1.47, -1.86, 2.37], ['c', -2.79, 3.63, -4.02, 6.30, -4.35, 9.30], ['c', -0.03, 0.21, -0.03, 0.69, -0.03, 1.08], ['c', 0.00, 0.69, 0.00, 0.75, 0.06, 1.11], ['c', 0.12, 0.54, 0.27, 0.99, 0.51, 1.47], ['c', 0.69, 1.38, 1.83, 2.55, 3.42, 3.42], ['c', 0.96, 0.54, 2.07, 0.90, 3.21, 1.08], ['c', 0.78, 0.12, 2.04, 0.12, 2.94, -0.03], ['c', 0.51, -0.06, 0.45, -0.03, 0.42, -0.30], ['c', -0.24, -3.33, -0.72, -6.33, -1.62, -10.08], ['c', -0.09, -0.39, -0.18, -0.75, -0.18, -0.78], ['c', -0.03, -0.03, -0.42, 0.00, -0.81, 0.09], ['c', -0.90, 0.18, -1.65, 0.57, -2.22, 1.14], ['c', -0.72, 0.72, -1.08, 1.65, -1.05, 2.64], ['c', 0.06, 0.96, 0.48, 1.83, 1.23, 2.58], ['c', 0.36, 0.36, 0.72, 0.63, 1.17, 0.90], ['c', 0.33, 0.18, 0.36, 0.21, 0.42, 0.33], ['c', 0.18, 0.42, -0.18, 0.90, -0.60, 0.87], ['c', -0.18, -0.03, -0.84, -0.36, -1.26, -0.63], ['c', -0.78, -0.51, -1.38, -1.11, -1.86, -1.83], ['c', -1.77, -2.70, -0.99, -6.42, 1.71, -8.19], ['c', 0.30, -0.21, 0.81, -0.48, 1.17, -0.63], ['c', 0.30, -0.09, 1.02, -0.30, 1.14, -0.30], ['c', 0.06, 0.00, 0.09, 0.00, 0.09, -0.03], ['c', 0.03, -0.03, -0.51, -1.92, -1.23, -4.26], ['z'], ['m', 3.78, 7.41], ['c', -0.18, -0.03, -0.36, -0.06, -0.39, -0.06], ['c', -0.03, 0.00, 0.00, 0.21, 0.18, 1.02], ['c', 0.75, 3.18, 1.26, 6.30, 1.50, 9.09], ['c', 0.06, 0.72, 0.00, 0.69, 0.51, 0.42], ['c', 0.78, -0.36, 1.44, -0.96, 1.98, -1.77], ['c', 1.08, -1.62, 1.20, -3.69, 0.30, -5.55], ['c', -0.81, -1.62, -2.31, -2.79, -4.08, -3.15], ['z']], w: 19.051, h: 57.057 },\n\t'clefs.perc': { d: [['M', 5.07, -7.44], ['l', 0.09, -0.06], ['l', 1.53, 0.00], ['l', 1.53, 0.00], ['l', 0.09, 0.06], ['l', 0.06, 0.09], ['l', 0.00, 7.35], ['l', 0.00, 7.32], ['l', -0.06, 0.09], ['l', -0.09, 0.06], ['l', -1.53, 0.00], ['l', -1.53, 0.00], ['l', -0.09, -0.06], ['l', -0.06, -0.09], ['l', 0.00, -7.32], ['l', 0.00, -7.35], ['z'], ['m', 6.63, 0.00], ['l', 0.09, -0.06], ['l', 1.53, 0.00], ['l', 1.53, 0.00], ['l', 0.09, 0.06], ['l', 0.06, 0.09], ['l', 0.00, 7.35], ['l', 0.00, 7.32], ['l', -0.06, 0.09], ['l', -0.09, 0.06], ['l', -1.53, 0.00], ['l', -1.53, 0.00], ['l', -0.09, -0.06], ['l', -0.06, -0.09], ['l', 0.00, -7.32], ['l', 0.00, -7.35], ['z']], w: 21, h: 14.97 },\n\t'tab.big': { d: [['M', 20.16, -21.66], ['c', 0.24, -0.09, 0.66, 0.09, 0.78, 0.36], ['c', 0.09, 0.21, 0.09, 0.24, -0.18, 0.54], ['c', -0.78, 0.81, -1.86, 1.44, -2.94, 1.71], ['c', -0.87, 0.24, -1.71, 0.24, -2.55, 0.03], ['l', -0.06, -0.03], ['l', -0.18, 0.99], ['c', -0.33, 1.98, -0.75, 4.26, -0.96, 5.04], ['c', -0.42, 1.65, -1.26, 3.18, -2.28, 4.14], ['c', -0.57, 0.57, -1.17, 0.90, -1.86, 1.08], ['c', -0.18, 0.06, -0.33, 0.06, -0.66, 0.06], ['c', -0.54, 0.00, -0.78, -0.03, -1.23, -0.27], ['c', -0.39, -0.18, -0.66, -0.39, -1.38, -0.99], ['c', -0.30, -0.24, -0.66, -0.51, -0.75, -0.57], ['c', -0.21, -0.15, -0.27, -0.24, -0.24, -0.45], ['c', 0.06, -0.27, 0.36, -0.60, 0.60, -0.66], ['c', 0.18, -0.03, 0.33, 0.06, 0.90, 0.57], ['c', 0.48, 0.42, 0.72, 0.57, 0.93, 0.69], ['c', 0.66, 0.33, 1.38, 0.21, 1.95, -0.36], ['c', 0.63, -0.60, 1.05, -1.62, 1.23, -3.00], ['c', 0.03, -0.18, 0.09, -0.66, 0.09, -1.11], ['c', 0.09, -1.56, 0.33, -3.81, 0.57, -5.49], ['c', 0.06, -0.33, 0.09, -0.63, 0.09, -0.63], ['c', -0.03, -0.03, -0.81, -0.12, -1.02, -0.12], ['c', -0.57, 0.00, -1.32, 0.12, -1.80, 0.33], ['c', -0.87, 0.30, -1.35, 0.78, -1.50, 1.41], ['c', -0.18, 0.63, 0.09, 1.26, 0.66, 1.65], ['c', 0.12, 0.06, 0.15, 0.12, 0.18, 0.24], ['c', 0.09, 0.27, 0.06, 0.57, -0.09, 0.75], ['c', -0.03, 0.06, -0.12, 0.09, -0.27, 0.15], ['c', -0.72, 0.21, -1.44, 0.15, -2.10, -0.18], ['c', -0.54, -0.27, -0.96, -0.66, -1.20, -1.14], ['c', -0.39, -0.75, -0.33, -1.74, 0.15, -2.52], ['c', 0.27, -0.42, 0.84, -0.93, 1.41, -1.23], ['c', 1.17, -0.57, 2.88, -0.90, 4.80, -0.90], ['c', 0.69, 0.00, 0.78, 0.00, 1.08, 0.06], ['c', 0.45, 0.09, 1.11, 0.30, 2.07, 0.60], ['c', 1.47, 0.48, 1.83, 0.57, 2.55, 0.54], ['c', 1.02, -0.06, 2.04, -0.45, 2.94, -1.11], ['c', 0.12, -0.09, 0.24, -0.18, 0.27, -0.18], ['z'], ['m', -5.88, 13.05], ['c', 0.21, -0.03, 0.81, 0.00, 1.08, 0.06], ['c', 0.48, 0.12, 0.90, 0.42, 0.99, 0.69], ['c', 0.03, 0.09, 0.03, 0.15, 0.00, 0.27], ['c', 0.00, 0.09, -0.03, 0.57, -0.06, 1.08], ['c', -0.09, 2.19, -0.24, 5.76, -0.39, 8.28], ['c', -0.06, 1.53, -0.06, 1.77, 0.03, 2.01], ['c', 0.09, 0.18, 0.15, 0.24, 0.30, 0.30], ['c', 0.24, 0.12, 0.54, 0.06, 1.23, -0.27], ['c', 0.57, -0.27, 0.66, -0.30, 0.75, -0.24], ['c', 0.09, 0.06, 0.18, 0.30, 0.18, 0.45], ['c', 0.00, 0.33, -0.15, 0.51, -0.45, 0.63], ['c', -0.12, 0.03, -0.39, 0.15, -0.60, 0.27], ['c', -1.17, 0.60, -1.38, 0.69, -1.80, 0.72], ['c', -0.45, 0.03, -0.78, -0.09, -1.08, -0.39], ['c', -0.39, -0.42, -0.66, -1.20, -1.02, -3.12], ['c', -0.24, -1.23, -0.36, -2.07, -0.54, -3.75], ['l', 0.00, -0.18], ['l', -0.36, 0.45], ['c', -0.60, 0.75, -1.32, 1.59, -1.95, 2.25], ['c', -0.15, 0.18, -0.27, 0.30, -0.27, 0.33], ['c', 0.00, 0.00, 0.06, 0.09, 0.15, 0.18], ['c', 0.24, 0.33, 0.60, 0.57, 1.05, 0.69], ['c', 0.18, 0.06, 0.30, 0.06, 0.69, 0.06], ['l', 0.48, 0.03], ['l', 0.06, 0.12], ['c', 0.15, 0.27, 0.03, 0.72, -0.21, 0.90], ['c', -0.18, 0.12, -0.93, 0.27, -1.41, 0.27], ['c', -0.84, 0.00, -1.59, -0.30, -1.98, -0.84], ['l', -0.12, -0.15], ['l', -0.45, 0.42], ['c', -0.99, 0.87, -1.53, 1.32, -2.16, 1.74], ['c', -0.78, 0.51, -1.50, 0.84, -2.10, 0.93], ['c', -0.69, 0.12, -1.20, 0.03, -1.95, -0.42], ['c', -0.21, -0.12, -0.51, -0.27, -0.66, -0.36], ['c', -0.24, -0.12, -0.30, -0.18, -0.33, -0.24], ['c', -0.12, -0.27, 0.15, -0.78, 0.45, -0.93], ['c', 0.24, -0.12, 0.33, -0.09, 0.90, 0.18], ['c', 0.60, 0.30, 0.84, 0.39, 1.20, 0.36], ['c', 0.87, -0.09, 1.77, -0.69, 3.24, -2.31], ['c', 2.67, -2.85, 4.59, -5.94, 5.70, -9.15], ['c', 0.15, -0.45, 0.24, -0.63, 0.42, -0.81], ['c', 0.21, -0.24, 0.60, -0.45, 0.99, -0.51], ['z'], ['m', -3.99, 16.05], ['c', 0.18, 0.00, 0.69, -0.03, 1.17, 0.00], ['c', 3.27, 0.03, 5.37, 0.75, 6.00, 2.07], ['c', 0.45, 0.99, 0.12, 2.40, -0.81, 3.42], ['c', -0.24, 0.27, -0.57, 0.57, -0.84, 0.75], ['c', -0.09, 0.06, -0.18, 0.09, -0.18, 0.12], ['c', 0.00, 0.00, 0.18, 0.03, 0.42, 0.09], ['c', 1.23, 0.30, 2.01, 0.81, 2.37, 1.59], ['c', 0.27, 0.54, 0.30, 1.32, 0.09, 2.10], ['c', -0.12, 0.36, -0.45, 1.05, -0.69, 1.35], ['c', -0.87, 1.17, -2.10, 1.92, -3.54, 2.25], ['c', -0.36, 0.06, -0.48, 0.06, -0.96, 0.06], ['c', -0.45, 0.00, -0.66, 0.00, -0.84, -0.03], ['c', -0.84, -0.18, -1.47, -0.51, -2.07, -1.11], ['c', -0.33, -0.33, -0.45, -0.51, -0.45, -0.63], ['c', 0.00, -0.06, 0.03, -0.15, 0.06, -0.24], ['c', 0.18, -0.33, 0.69, -0.60, 0.93, -0.48], ['c', 0.03, 0.03, 0.15, 0.12, 0.27, 0.24], ['c', 0.39, 0.42, 0.99, 0.57, 1.62, 0.45], ['c', 1.05, -0.21, 1.98, -1.02, 2.31, -2.01], ['c', 0.48, -1.53, -0.48, -2.55, -2.58, -2.67], ['c', -0.21, 0.00, -0.36, -0.03, -0.42, -0.06], ['c', -0.15, -0.09, -0.21, -0.51, -0.06, -0.78], ['c', 0.12, -0.27, 0.24, -0.33, 0.60, -0.36], ['c', 0.57, -0.06, 1.11, -0.42, 1.50, -0.99], ['c', 0.48, -0.72, 0.54, -1.59, 0.18, -2.31], ['c', -0.12, -0.21, -0.45, -0.54, -0.69, -0.69], ['c', -0.33, -0.21, -0.93, -0.45, -1.35, -0.51], ['l', -0.12, -0.03], ['l', -0.06, 0.48], ['c', -0.54, 2.94, -1.14, 6.24, -1.29, 6.75], ['c', -0.33, 1.35, -0.93, 2.61, -1.65, 3.60], ['c', -0.30, 0.36, -0.81, 0.90, -1.14, 1.14], ['c', -0.30, 0.24, -0.84, 0.48, -1.14, 0.57], ['c', -0.33, 0.09, -0.96, 0.09, -1.26, 0.03], ['c', -0.45, -0.12, -0.87, -0.39, -1.53, -0.96], ['c', -0.24, -0.15, -0.51, -0.39, -0.63, -0.48], ['c', -0.30, -0.21, -0.33, -0.33, -0.21, -0.63], ['c', 0.12, -0.18, 0.27, -0.36, 0.42, -0.45], ['c', 0.27, -0.12, 0.36, -0.09, 0.87, 0.33], ['c', 0.78, 0.60, 1.08, 0.75, 1.65, 0.72], ['c', 0.45, -0.03, 0.81, -0.21, 1.17, -0.54], ['c', 0.87, -0.90, 1.38, -2.85, 1.38, -5.37], ['c', 0.00, -0.60, 0.03, -1.11, 0.12, -2.04], ['c', 0.06, -0.69, 0.24, -2.01, 0.33, -2.58], ['c', 0.06, -0.24, 0.06, -0.42, 0.06, -0.42], ['c', 0.00, 0.00, -0.12, 0.03, -0.21, 0.09], ['c', -1.44, 0.57, -2.16, 1.65, -1.74, 2.55], ['c', 0.09, 0.15, 0.18, 0.24, 0.27, 0.33], ['c', 0.24, 0.21, 0.30, 0.27, 0.33, 0.39], ['c', 0.06, 0.24, 0.00, 0.63, -0.15, 0.78], ['c', -0.09, 0.12, -0.54, 0.21, -0.96, 0.24], ['c', -1.02, 0.03, -2.01, -0.48, -2.43, -1.32], ['c', -0.21, -0.45, -0.27, -0.90, -0.15, -1.44], ['c', 0.06, -0.27, 0.21, -0.66, 0.39, -0.93], ['c', 0.87, -1.29, 3.00, -2.22, 5.64, -2.43], ['z']], w: 19.643, h: 43.325 },\n\t'tab.tiny': { d: [['M', 16.02, -17.25], ['c', 0.12, -0.09, 0.15, -0.09, 0.27, -0.09], ['c', 0.21, 0.03, 0.51, 0.30, 0.51, 0.45], ['c', 0.00, 0.06, -0.12, 0.18, -0.30, 0.36], ['c', -1.11, 1.08, -2.55, 1.59, -3.84, 1.41], ['c', -0.15, -0.03, -0.33, -0.06, -0.39, -0.09], ['c', -0.06, -0.03, -0.09, -0.03, -0.12, -0.03], ['c', 0.00, 0.00, -0.06, 0.42, -0.15, 0.93], ['c', -0.33, 2.01, -0.66, 3.69, -0.84, 4.26], ['c', -0.42, 1.41, -1.23, 2.67, -2.16, 3.33], ['c', -0.27, 0.18, -0.75, 0.42, -0.99, 0.48], ['c', -0.30, 0.09, -0.72, 0.09, -1.02, 0.06], ['c', -0.45, -0.09, -0.84, -0.33, -1.53, -0.90], ['c', -0.21, -0.18, -0.51, -0.39, -0.63, -0.48], ['c', -0.27, -0.21, -0.30, -0.24, -0.30, -0.36], ['c', 0.00, -0.12, 0.09, -0.36, 0.18, -0.45], ['c', 0.09, -0.09, 0.27, -0.18, 0.36, -0.18], ['c', 0.12, 0.00, 0.30, 0.12, 0.66, 0.45], ['c', 0.57, 0.51, 0.87, 0.69, 1.23, 0.72], ['c', 0.93, 0.06, 1.68, -0.78, 1.98, -2.37], ['c', 0.09, -0.39, 0.15, -0.75, 0.18, -1.53], ['c', 0.06, -0.99, 0.24, -2.79, 0.42, -4.05], ['c', 0.03, -0.30, 0.06, -0.57, 0.06, -0.60], ['c', 0.00, -0.06, -0.03, -0.09, -0.15, -0.12], ['c', -0.90, -0.18, -2.13, 0.06, -2.76, 0.57], ['c', -0.36, 0.30, -0.51, 0.60, -0.51, 1.02], ['c', 0.00, 0.45, 0.15, 0.75, 0.48, 0.99], ['c', 0.06, 0.06, 0.15, 0.18, 0.18, 0.24], ['c', 0.12, 0.24, 0.03, 0.63, -0.15, 0.69], ['c', -0.24, 0.12, -0.60, 0.15, -0.90, 0.15], ['c', -0.36, -0.03, -0.57, -0.09, -0.87, -0.24], ['c', -0.78, -0.36, -1.23, -1.11, -1.20, -1.92], ['c', 0.12, -1.53, 1.74, -2.49, 4.62, -2.70], ['c', 1.20, -0.09, 1.47, -0.03, 3.33, 0.57], ['c', 0.90, 0.30, 1.14, 0.36, 1.56, 0.39], ['c', 0.45, 0.00, 0.93, -0.06, 1.38, -0.21], ['c', 0.51, -0.18, 0.81, -0.33, 1.41, -0.75], ['z'], ['m', -4.68, 10.38], ['c', 0.39, -0.06, 0.84, 0.00, 1.20, 0.15], ['c', 0.24, 0.12, 0.36, 0.21, 0.45, 0.36], ['l', 0.09, 0.09], ['l', -0.06, 1.41], ['c', -0.09, 2.19, -0.18, 3.96, -0.27, 5.49], ['c', -0.03, 0.78, -0.06, 1.59, -0.06, 1.86], ['c', 0.00, 0.42, 0.00, 0.48, 0.06, 0.57], ['c', 0.06, 0.18, 0.18, 0.24, 0.36, 0.27], ['c', 0.18, 0.00, 0.39, -0.06, 0.84, -0.27], ['c', 0.45, -0.21, 0.54, -0.24, 0.63, -0.18], ['c', 0.12, 0.12, 0.15, 0.54, 0.03, 0.69], ['c', -0.03, 0.03, -0.15, 0.12, -0.27, 0.18], ['c', -0.15, 0.03, -0.30, 0.12, -0.36, 0.15], ['c', -0.87, 0.45, -1.02, 0.51, -1.26, 0.57], ['c', -0.33, 0.09, -0.60, 0.06, -0.84, -0.06], ['c', -0.42, -0.18, -0.63, -0.60, -0.87, -1.44], ['c', -0.30, -1.23, -0.57, -2.97, -0.66, -4.08], ['c', 0.00, -0.18, -0.03, -0.30, -0.03, -0.33], ['l', -0.06, 0.06], ['c', -0.18, 0.27, -1.11, 1.38, -1.68, 2.01], ['l', -0.33, 0.33], ['l', 0.06, 0.09], ['c', 0.06, 0.15, 0.27, 0.33, 0.48, 0.42], ['c', 0.27, 0.18, 0.51, 0.24, 0.96, 0.27], ['l', 0.39, 0.00], ['l', 0.03, 0.12], ['c', 0.12, 0.21, 0.03, 0.57, -0.15, 0.69], ['c', -0.03, 0.03, -0.21, 0.09, -0.36, 0.15], ['c', -0.27, 0.06, -0.39, 0.06, -0.75, 0.06], ['c', -0.48, 0.00, -0.75, -0.03, -1.08, -0.21], ['c', -0.21, -0.12, -0.51, -0.36, -0.57, -0.48], ['l', -0.03, -0.09], ['l', -0.39, 0.36], ['c', -1.47, 1.35, -2.49, 1.98, -3.42, 2.13], ['c', -0.54, 0.09, -0.96, -0.03, -1.62, -0.39], ['c', -0.21, -0.15, -0.45, -0.27, -0.54, -0.30], ['c', -0.18, -0.09, -0.21, -0.21, -0.12, -0.45], ['c', 0.06, -0.27, 0.33, -0.48, 0.54, -0.48], ['c', 0.03, 0.00, 0.27, 0.09, 0.48, 0.21], ['c', 0.48, 0.24, 0.69, 0.27, 0.99, 0.27], ['c', 0.60, -0.06, 1.17, -0.42, 2.10, -1.35], ['c', 2.22, -2.22, 4.02, -4.98, 4.95, -7.59], ['c', 0.21, -0.57, 0.30, -0.78, 0.48, -0.93], ['c', 0.15, -0.15, 0.42, -0.27, 0.66, -0.33], ['z'], ['m', -3.06, 12.84], ['c', 0.27, -0.03, 1.68, 0.00, 2.01, 0.03], ['c', 1.92, 0.18, 3.15, 0.69, 3.63, 1.50], ['c', 0.18, 0.33, 0.24, 0.51, 0.21, 0.93], ['c', 0.00, 0.45, -0.06, 0.72, -0.24, 1.11], ['c', -0.24, 0.51, -0.69, 1.02, -1.17, 1.35], ['c', -0.21, 0.15, -0.21, 0.15, -0.12, 0.18], ['c', 0.72, 0.15, 1.11, 0.30, 1.50, 0.57], ['c', 0.39, 0.24, 0.63, 0.57, 0.75, 0.96], ['c', 0.09, 0.30, 0.09, 0.96, 0.00, 1.29], ['c', -0.15, 0.57, -0.39, 1.05, -0.78, 1.50], ['c', -0.66, 0.75, -1.62, 1.32, -2.61, 1.53], ['c', -0.27, 0.06, -0.42, 0.06, -0.84, 0.06], ['c', -0.48, 0.00, -0.57, 0.00, -0.81, -0.06], ['c', -0.60, -0.18, -1.05, -0.42, -1.47, -0.81], ['c', -0.36, -0.39, -0.42, -0.51, -0.30, -0.75], ['c', 0.12, -0.21, 0.39, -0.39, 0.60, -0.39], ['c', 0.09, 0.00, 0.15, 0.03, 0.33, 0.18], ['c', 0.12, 0.12, 0.27, 0.24, 0.36, 0.27], ['c', 0.96, 0.48, 2.46, -0.33, 2.82, -1.50], ['c', 0.24, -0.81, -0.03, -1.44, -0.69, -1.77], ['c', -0.39, -0.21, -1.02, -0.33, -1.53, -0.33], ['c', -0.18, 0.00, -0.21, 0.00, -0.27, -0.09], ['c', -0.06, -0.09, -0.06, -0.30, -0.03, -0.48], ['c', 0.06, -0.18, 0.18, -0.36, 0.33, -0.36], ['c', 0.39, -0.06, 0.51, -0.09, 0.72, -0.18], ['c', 0.69, -0.36, 1.11, -1.23, 0.99, -2.01], ['c', -0.09, -0.51, -0.42, -0.90, -0.93, -1.17], ['c', -0.24, -0.12, -0.60, -0.27, -0.87, -0.30], ['c', -0.09, -0.03, -0.09, -0.03, -0.12, 0.12], ['c', 0.00, 0.09, -0.21, 1.11, -0.42, 2.25], ['c', -0.66, 3.75, -0.72, 3.99, -1.26, 5.07], ['c', -0.90, 1.89, -2.25, 2.85, -3.48, 2.61], ['c', -0.39, -0.09, -0.69, -0.27, -1.38, -0.84], ['c', -0.63, -0.51, -0.63, -0.48, -0.63, -0.60], ['c', 0.00, -0.18, 0.18, -0.48, 0.39, -0.57], ['c', 0.21, -0.12, 0.30, -0.09, 0.81, 0.33], ['c', 0.15, 0.15, 0.39, 0.30, 0.54, 0.36], ['c', 0.18, 0.12, 0.27, 0.12, 0.48, 0.15], ['c', 0.99, 0.06, 1.71, -0.78, 2.04, -2.46], ['c', 0.12, -0.66, 0.18, -1.14, 0.21, -2.22], ['c', 0.03, -1.23, 0.12, -2.25, 0.36, -3.63], ['c', 0.03, -0.24, 0.06, -0.45, 0.06, -0.48], ['c', -0.06, -0.03, -0.66, 0.27, -0.90, 0.42], ['c', -0.06, 0.06, -0.21, 0.18, -0.33, 0.30], ['c', -0.57, 0.57, -0.60, 1.35, -0.06, 1.74], ['c', 0.18, 0.12, 0.24, 0.24, 0.21, 0.51], ['c', -0.03, 0.30, -0.15, 0.42, -0.57, 0.48], ['c', -1.11, 0.24, -2.22, -0.42, -2.43, -1.38], ['c', -0.09, -0.45, 0.03, -1.02, 0.30, -1.47], ['c', 0.18, -0.24, 0.60, -0.63, 0.90, -0.84], ['c', 0.90, -0.60, 2.28, -1.02, 3.69, -1.11], ['z']], w: 15.709, h: 34.656 },\n\t'timesig.common': { d: [['M', 6.66, -7.83], ['c', 0.72, -0.06, 1.41, -0.03, 1.98, 0.09], ['c', 1.20, 0.27, 2.34, 0.96, 3.09, 1.92], ['c', 0.63, 0.81, 1.08, 1.86, 1.14, 2.73], ['c', 0.06, 1.02, -0.51, 1.92, -1.44, 2.22], ['c', -0.24, 0.09, -0.30, 0.09, -0.63, 0.09], ['c', -0.33, 0.00, -0.42, 0.00, -0.63, -0.06], ['c', -0.66, -0.24, -1.14, -0.63, -1.41, -1.20], ['c', -0.15, -0.30, -0.21, -0.51, -0.24, -0.90], ['c', -0.06, -1.08, 0.57, -2.04, 1.56, -2.37], ['c', 0.18, -0.06, 0.27, -0.06, 0.63, -0.06], ['l', 0.45, 0.00], ['c', 0.06, 0.03, 0.09, 0.03, 0.09, 0.00], ['c', 0.00, 0.00, -0.09, -0.12, -0.24, -0.27], ['c', -1.02, -1.11, -2.55, -1.68, -4.08, -1.50], ['c', -1.29, 0.15, -2.04, 0.69, -2.40, 1.74], ['c', -0.36, 0.93, -0.42, 1.89, -0.42, 5.37], ['c', 0.00, 2.97, 0.06, 3.96, 0.24, 4.77], ['c', 0.24, 1.08, 0.63, 1.68, 1.41, 2.07], ['c', 0.81, 0.39, 2.16, 0.45, 3.18, 0.09], ['c', 1.29, -0.45, 2.37, -1.53, 3.03, -2.97], ['c', 0.15, -0.33, 0.33, -0.87, 0.39, -1.17], ['c', 0.09, -0.24, 0.15, -0.36, 0.30, -0.39], ['c', 0.21, -0.03, 0.42, 0.15, 0.39, 0.36], ['c', -0.06, 0.39, -0.42, 1.38, -0.69, 1.89], ['c', -0.96, 1.80, -2.49, 2.94, -4.23, 3.18], ['c', -0.99, 0.12, -2.58, -0.06, -3.63, -0.45], ['c', -0.96, -0.36, -1.71, -0.84, -2.40, -1.50], ['c', -1.11, -1.11, -1.80, -2.61, -2.04, -4.56], ['c', -0.06, -0.60, -0.06, -2.01, 0.00, -2.61], ['c', 0.24, -1.95, 0.90, -3.45, 2.01, -4.56], ['c', 0.69, -0.66, 1.44, -1.11, 2.37, -1.47], ['c', 0.63, -0.24, 1.47, -0.42, 2.22, -0.48], ['z']], w: 13.038, h: 15.689 },\n\t'timesig.cut': { d: [['M', 6.24, -10.44], ['c', 0.09, -0.06, 0.09, -0.06, 0.48, -0.06], ['c', 0.36, 0.00, 0.36, 0.00, 0.45, 0.06], ['l', 0.06, 0.09], ['l', 0.00, 1.23], ['l', 0.00, 1.26], ['l', 0.27, 0.00], ['c', 1.26, 0.00, 2.49, 0.45, 3.48, 1.29], ['c', 1.05, 0.87, 1.80, 2.28, 1.89, 3.48], ['c', 0.06, 1.02, -0.51, 1.92, -1.44, 2.22], ['c', -0.24, 0.09, -0.30, 0.09, -0.63, 0.09], ['c', -0.33, 0.00, -0.42, 0.00, -0.63, -0.06], ['c', -0.66, -0.24, -1.14, -0.63, -1.41, -1.20], ['c', -0.15, -0.30, -0.21, -0.51, -0.24, -0.90], ['c', -0.06, -1.08, 0.57, -2.04, 1.56, -2.37], ['c', 0.18, -0.06, 0.27, -0.06, 0.63, -0.06], ['l', 0.45, 0.00], ['c', 0.06, 0.03, 0.09, 0.03, 0.09, 0.00], ['c', 0.00, -0.03, -0.45, -0.51, -0.66, -0.69], ['c', -0.87, -0.69, -1.83, -1.05, -2.94, -1.11], ['l', -0.42, 0.00], ['l', 0.00, 7.17], ['l', 0.00, 7.14], ['l', 0.42, 0.00], ['c', 0.69, -0.03, 1.23, -0.18, 1.86, -0.51], ['c', 1.05, -0.51, 1.89, -1.47, 2.46, -2.70], ['c', 0.15, -0.33, 0.33, -0.87, 0.39, -1.17], ['c', 0.09, -0.24, 0.15, -0.36, 0.30, -0.39], ['c', 0.21, -0.03, 0.42, 0.15, 0.39, 0.36], ['c', -0.03, 0.24, -0.21, 0.78, -0.39, 1.20], ['c', -0.96, 2.37, -2.94, 3.90, -5.13, 3.90], ['l', -0.30, 0.00], ['l', 0.00, 1.26], ['l', 0.00, 1.23], ['l', -0.06, 0.09], ['c', -0.09, 0.06, -0.09, 0.06, -0.45, 0.06], ['c', -0.39, 0.00, -0.39, 0.00, -0.48, -0.06], ['l', -0.06, -0.09], ['l', 0.00, -1.29], ['l', 0.00, -1.29], ['l', -0.21, -0.03], ['c', -1.23, -0.21, -2.31, -0.63, -3.21, -1.29], ['c', -0.15, -0.09, -0.45, -0.36, -0.66, -0.57], ['c', -1.11, -1.11, -1.80, -2.61, -2.04, -4.56], ['c', -0.06, -0.60, -0.06, -2.01, 0.00, -2.61], ['c', 0.24, -1.95, 0.93, -3.45, 2.04, -4.59], ['c', 0.42, -0.39, 0.78, -0.66, 1.26, -0.93], ['c', 0.75, -0.45, 1.65, -0.75, 2.61, -0.90], ['l', 0.21, -0.03], ['l', 0.00, -1.29], ['l', 0.00, -1.29], ['z'], ['m', -0.06, 10.44], ['c', 0.00, -5.58, 0.00, -6.99, -0.03, -6.99], ['c', -0.15, 0.00, -0.63, 0.27, -0.87, 0.45], ['c', -0.45, 0.36, -0.75, 0.93, -0.93, 1.77], ['c', -0.18, 0.81, -0.24, 1.80, -0.24, 4.74], ['c', 0.00, 2.97, 0.06, 3.96, 0.24, 4.77], ['c', 0.24, 1.08, 0.66, 1.68, 1.41, 2.07], ['c', 0.12, 0.06, 0.30, 0.12, 0.33, 0.15], ['l', 0.09, 0.00], ['l', 0.00, -6.96], ['z']], w: 13.038, h: 20.97 },\n\t'timesig.imperfectum': { d: [['M', 13, -5], ['a', 8, 8, 0, 1, 0, 0, 10]], w: 13.038, h: 20.97 },\n\t'timesig.imperfectum2': { d: [['M', 13, -5], ['a', 8, 8, 0, 1, 0, 0, 10]], w: 13.038, h: 20.97 },\n\t'timesig.perfectum': { d: [['M', 13, -5], ['a', 8, 8, 0, 1, 0, 0, 10]], w: 13.038, h: 20.97 },\n\t'timesig.perfectum2': { d: [['M', 13, -5], ['a', 8, 8, 0, 1, 0, 0, 10]], w: 13.038, h: 20.97 },\n\t'f': { d: [['M', 9.93, -14.28], ['c', 1.53, -0.18, 2.88, 0.45, 3.12, 1.50], ['c', 0.12, 0.51, 0.00, 1.32, -0.27, 1.86], ['c', -0.15, 0.30, -0.42, 0.57, -0.63, 0.69], ['c', -0.69, 0.36, -1.56, 0.03, -1.83, -0.69], ['c', -0.09, -0.24, -0.09, -0.69, 0.00, -0.87], ['c', 0.06, -0.12, 0.21, -0.24, 0.45, -0.42], ['c', 0.42, -0.24, 0.57, -0.45, 0.60, -0.72], ['c', 0.03, -0.33, -0.09, -0.39, -0.63, -0.42], ['c', -0.30, 0.00, -0.45, 0.00, -0.60, 0.03], ['c', -0.81, 0.21, -1.35, 0.93, -1.74, 2.46], ['c', -0.06, 0.27, -0.48, 2.25, -0.48, 2.31], ['c', 0.00, 0.03, 0.39, 0.03, 0.90, 0.03], ['c', 0.72, 0.00, 0.90, 0.00, 0.99, 0.06], ['c', 0.42, 0.15, 0.45, 0.72, 0.03, 0.90], ['c', -0.12, 0.06, -0.24, 0.06, -1.17, 0.06], ['l', -1.05, 0.00], ['l', -0.78, 2.55], ['c', -0.45, 1.41, -0.87, 2.79, -0.96, 3.06], ['c', -0.87, 2.37, -2.37, 4.74, -3.78, 5.91], ['c', -1.05, 0.90, -2.04, 1.23, -3.09, 1.08], ['c', -1.11, -0.18, -1.89, -0.78, -2.04, -1.59], ['c', -0.12, -0.66, 0.15, -1.71, 0.54, -2.19], ['c', 0.69, -0.75, 1.86, -0.54, 2.22, 0.39], ['c', 0.06, 0.15, 0.09, 0.27, 0.09, 0.48], ['c', 0.00, 0.24, -0.03, 0.27, -0.12, 0.42], ['c', -0.03, 0.09, -0.15, 0.18, -0.27, 0.27], ['c', -0.09, 0.06, -0.27, 0.21, -0.36, 0.27], ['c', -0.24, 0.18, -0.36, 0.36, -0.39, 0.60], ['c', -0.03, 0.33, 0.09, 0.39, 0.63, 0.42], ['c', 0.42, 0.00, 0.63, -0.03, 0.90, -0.15], ['c', 0.60, -0.30, 0.96, -0.96, 1.38, -2.64], ['c', 0.09, -0.42, 0.63, -2.55, 1.17, -4.77], ['l', 1.02, -4.08], ['c', 0.00, -0.03, -0.36, -0.03, -0.81, -0.03], ['c', -0.72, 0.00, -0.81, 0.00, -0.93, -0.06], ['c', -0.42, -0.18, -0.39, -0.75, 0.03, -0.90], ['c', 0.09, -0.06, 0.27, -0.06, 1.05, -0.06], ['l', 0.96, 0.00], ['l', 0.00, -0.09], ['c', 0.06, -0.18, 0.30, -0.72, 0.51, -1.17], ['c', 1.20, -2.46, 3.30, -4.23, 5.34, -4.50], ['z']], w: 16.155, h: 19.445 },\n\t'm': { d: [['M', 2.79, -8.91], ['c', 0.09, 0.00, 0.30, -0.03, 0.45, -0.03], ['c', 0.24, 0.03, 0.30, 0.03, 0.45, 0.12], ['c', 0.36, 0.15, 0.63, 0.54, 0.75, 1.02], ['l', 0.03, 0.21], ['l', 0.33, -0.30], ['c', 0.69, -0.69, 1.38, -1.02, 2.07, -1.02], ['c', 0.27, 0.00, 0.33, 0.00, 0.48, 0.06], ['c', 0.21, 0.09, 0.48, 0.36, 0.63, 0.60], ['c', 0.03, 0.09, 0.12, 0.27, 0.18, 0.42], ['c', 0.03, 0.15, 0.09, 0.27, 0.12, 0.27], ['c', 0.00, 0.00, 0.09, -0.09, 0.18, -0.21], ['c', 0.33, -0.39, 0.87, -0.81, 1.29, -0.99], ['c', 0.78, -0.33, 1.47, -0.21, 2.01, 0.33], ['c', 0.30, 0.33, 0.48, 0.69, 0.60, 1.14], ['c', 0.09, 0.42, 0.06, 0.54, -0.54, 3.06], ['c', -0.33, 1.29, -0.57, 2.40, -0.57, 2.43], ['c', 0.00, 0.12, 0.09, 0.21, 0.21, 0.21], ['c', 0.24, 0.00, 0.75, -0.30, 1.20, -0.72], ['c', 0.45, -0.39, 0.60, -0.45, 0.78, -0.27], ['c', 0.18, 0.18, 0.09, 0.36, -0.45, 0.87], ['c', -1.05, 0.96, -1.83, 1.47, -2.58, 1.71], ['c', -0.93, 0.33, -1.53, 0.21, -1.80, -0.33], ['c', -0.06, -0.15, -0.06, -0.21, -0.06, -0.45], ['c', 0.00, -0.24, 0.03, -0.48, 0.60, -2.82], ['c', 0.42, -1.71, 0.60, -2.64, 0.63, -2.79], ['c', 0.03, -0.57, -0.30, -0.75, -0.84, -0.48], ['c', -0.24, 0.12, -0.54, 0.39, -0.66, 0.63], ['c', -0.03, 0.09, -0.42, 1.38, -0.90, 3.00], ['c', -0.90, 3.15, -0.84, 3.00, -1.14, 3.15], ['l', -0.15, 0.09], ['l', -0.78, 0.00], ['c', -0.60, 0.00, -0.78, 0.00, -0.84, -0.06], ['c', -0.09, -0.03, -0.18, -0.18, -0.18, -0.27], ['c', 0.00, -0.03, 0.36, -1.38, 0.84, -2.97], ['c', 0.57, -2.04, 0.81, -2.97, 0.84, -3.12], ['c', 0.03, -0.54, -0.30, -0.72, -0.84, -0.45], ['c', -0.24, 0.12, -0.57, 0.42, -0.66, 0.63], ['c', -0.06, 0.09, -0.51, 1.44, -1.05, 2.97], ['c', -0.51, 1.56, -0.99, 2.85, -0.99, 2.91], ['c', -0.06, 0.12, -0.21, 0.24, -0.36, 0.30], ['c', -0.12, 0.06, -0.21, 0.06, -0.90, 0.06], ['c', -0.60, 0.00, -0.78, 0.00, -0.84, -0.06], ['c', -0.09, -0.03, -0.18, -0.18, -0.18, -0.27], ['c', 0.00, -0.03, 0.45, -1.38, 0.99, -2.97], ['c', 1.05, -3.18, 1.05, -3.18, 0.93, -3.45], ['c', -0.12, -0.27, -0.39, -0.30, -0.72, -0.15], ['c', -0.54, 0.27, -1.14, 1.17, -1.56, 2.40], ['c', -0.06, 0.15, -0.15, 0.30, -0.18, 0.36], ['c', -0.21, 0.21, -0.57, 0.27, -0.72, 0.09], ['c', -0.09, -0.09, -0.06, -0.21, 0.06, -0.63], ['c', 0.48, -1.26, 1.26, -2.46, 2.01, -3.21], ['c', 0.57, -0.54, 1.20, -0.87, 1.83, -1.02], ['z']], w: 14.687, h: 9.126 },\n\t'p': { d: [['M', 1.92, -8.70], ['c', 0.27, -0.09, 0.81, -0.06, 1.11, 0.03], ['c', 0.54, 0.18, 0.93, 0.51, 1.17, 0.99], ['c', 0.09, 0.15, 0.15, 0.33, 0.18, 0.36], ['l', 0.00, 0.12], ['l', 0.30, -0.27], ['c', 0.66, -0.60, 1.35, -1.02, 2.13, -1.20], ['c', 0.21, -0.06, 0.33, -0.06, 0.78, -0.06], ['c', 0.45, 0.00, 0.51, 0.00, 0.84, 0.09], ['c', 1.29, 0.33, 2.07, 1.32, 2.25, 2.79], ['c', 0.09, 0.81, -0.09, 2.01, -0.45, 2.79], ['c', -0.54, 1.26, -1.86, 2.55, -3.18, 3.03], ['c', -0.45, 0.18, -0.81, 0.24, -1.29, 0.24], ['c', -0.69, -0.03, -1.35, -0.18, -1.86, -0.45], ['c', -0.30, -0.15, -0.51, -0.18, -0.69, -0.09], ['c', -0.09, 0.03, -0.18, 0.09, -0.18, 0.12], ['c', -0.09, 0.12, -1.05, 2.94, -1.05, 3.06], ['c', 0.00, 0.24, 0.18, 0.48, 0.51, 0.63], ['c', 0.18, 0.06, 0.54, 0.15, 0.75, 0.15], ['c', 0.21, 0.00, 0.36, 0.06, 0.42, 0.18], ['c', 0.12, 0.18, 0.06, 0.42, -0.12, 0.54], ['c', -0.09, 0.03, -0.15, 0.03, -0.78, 0.00], ['c', -1.98, -0.15, -3.81, -0.15, -5.79, 0.00], ['c', -0.63, 0.03, -0.69, 0.03, -0.78, 0.00], ['c', -0.24, -0.15, -0.24, -0.57, 0.03, -0.66], ['c', 0.06, -0.03, 0.48, -0.09, 0.99, -0.12], ['c', 0.87, -0.06, 1.11, -0.09, 1.35, -0.21], ['c', 0.18, -0.06, 0.33, -0.18, 0.39, -0.30], ['c', 0.06, -0.12, 3.24, -9.42, 3.27, -9.60], ['c', 0.06, -0.33, 0.03, -0.57, -0.15, -0.69], ['c', -0.09, -0.06, -0.12, -0.06, -0.30, -0.06], ['c', -0.69, 0.06, -1.53, 1.02, -2.28, 2.61], ['c', -0.09, 0.21, -0.21, 0.45, -0.27, 0.51], ['c', -0.09, 0.12, -0.33, 0.24, -0.48, 0.24], ['c', -0.18, 0.00, -0.36, -0.15, -0.36, -0.30], ['c', 0.00, -0.24, 0.78, -1.83, 1.26, -2.55], ['c', 0.72, -1.11, 1.47, -1.74, 2.28, -1.92], ['z'], ['m', 5.37, 1.47], ['c', -0.27, -0.12, -0.75, -0.03, -1.14, 0.21], ['c', -0.75, 0.48, -1.47, 1.68, -1.89, 3.15], ['c', -0.45, 1.47, -0.42, 2.34, 0.00, 2.70], ['c', 0.45, 0.39, 1.26, 0.21, 1.83, -0.36], ['c', 0.51, -0.51, 0.99, -1.68, 1.38, -3.27], ['c', 0.30, -1.17, 0.33, -1.74, 0.15, -2.13], ['c', -0.09, -0.15, -0.15, -0.21, -0.33, -0.30], ['z']], w: 14.689, h: 13.127 },\n\t'r': { d: [['M', 6.33, -9.12], ['c', 0.27, -0.03, 0.93, 0.00, 1.20, 0.06], ['c', 0.84, 0.21, 1.23, 0.81, 1.02, 1.53], ['c', -0.24, 0.75, -0.90, 1.17, -1.56, 0.96], ['c', -0.33, -0.09, -0.51, -0.30, -0.66, -0.75], ['c', -0.03, -0.12, -0.09, -0.24, -0.12, -0.30], ['c', -0.09, -0.15, -0.30, -0.24, -0.48, -0.24], ['c', -0.57, 0.00, -1.38, 0.54, -1.65, 1.08], ['c', -0.06, 0.15, -0.33, 1.17, -0.90, 3.27], ['c', -0.57, 2.31, -0.81, 3.12, -0.87, 3.21], ['c', -0.03, 0.06, -0.12, 0.15, -0.18, 0.21], ['l', -0.12, 0.06], ['l', -0.81, 0.03], ['c', -0.69, 0.00, -0.81, 0.00, -0.90, -0.03], ['c', -0.09, -0.06, -0.18, -0.21, -0.18, -0.30], ['c', 0.00, -0.06, 0.39, -1.62, 0.90, -3.51], ['c', 0.84, -3.24, 0.87, -3.45, 0.87, -3.72], ['c', 0.00, -0.21, 0.00, -0.27, -0.03, -0.36], ['c', -0.12, -0.15, -0.21, -0.24, -0.42, -0.24], ['c', -0.24, 0.00, -0.45, 0.15, -0.78, 0.42], ['c', -0.33, 0.36, -0.45, 0.54, -0.72, 1.14], ['c', -0.03, 0.12, -0.21, 0.24, -0.36, 0.27], ['c', -0.12, 0.00, -0.15, 0.00, -0.24, -0.06], ['c', -0.18, -0.12, -0.18, -0.21, -0.06, -0.54], ['c', 0.21, -0.57, 0.42, -0.93, 0.78, -1.32], ['c', 0.54, -0.51, 1.20, -0.81, 1.95, -0.87], ['c', 0.81, -0.03, 1.53, 0.30, 1.92, 0.87], ['l', 0.12, 0.18], ['l', 0.09, -0.09], ['c', 0.57, -0.45, 1.41, -0.84, 2.19, -0.96], ['z']], w: 9.41, h: 9.132 },\n\t's': { d: [['M', 4.47, -8.73], ['c', 0.09, 0.00, 0.36, -0.03, 0.57, -0.03], ['c', 0.75, 0.03, 1.29, 0.24, 1.71, 0.63], ['c', 0.51, 0.54, 0.66, 1.26, 0.36, 1.83], ['c', -0.24, 0.42, -0.63, 0.57, -1.11, 0.42], ['c', -0.33, -0.09, -0.60, -0.36, -0.60, -0.57], ['c', 0.00, -0.03, 0.06, -0.21, 0.15, -0.39], ['c', 0.12, -0.21, 0.15, -0.33, 0.18, -0.48], ['c', 0.00, -0.24, -0.06, -0.48, -0.15, -0.60], ['c', -0.15, -0.21, -0.42, -0.24, -0.75, -0.15], ['c', -0.27, 0.06, -0.48, 0.18, -0.69, 0.36], ['c', -0.39, 0.39, -0.51, 0.96, -0.33, 1.38], ['c', 0.09, 0.21, 0.42, 0.51, 0.78, 0.72], ['c', 1.11, 0.69, 1.59, 1.11, 1.89, 1.68], ['c', 0.21, 0.39, 0.24, 0.78, 0.15, 1.29], ['c', -0.18, 1.20, -1.17, 2.16, -2.52, 2.52], ['c', -1.02, 0.24, -1.95, 0.12, -2.70, -0.42], ['c', -0.72, -0.51, -0.99, -1.47, -0.60, -2.19], ['c', 0.24, -0.48, 0.72, -0.63, 1.17, -0.42], ['c', 0.33, 0.18, 0.54, 0.45, 0.57, 0.81], ['c', 0.00, 0.21, -0.03, 0.30, -0.33, 0.51], ['c', -0.33, 0.24, -0.39, 0.42, -0.27, 0.69], ['c', 0.06, 0.15, 0.21, 0.27, 0.45, 0.33], ['c', 0.30, 0.09, 0.87, 0.09, 1.20, 0.00], ['c', 0.75, -0.21, 1.23, -0.72, 1.29, -1.35], ['c', 0.03, -0.42, -0.15, -0.81, -0.54, -1.20], ['c', -0.24, -0.24, -0.48, -0.42, -1.41, -1.02], ['c', -0.69, -0.42, -1.05, -0.93, -1.05, -1.47], ['c', 0.00, -0.39, 0.12, -0.87, 0.30, -1.23], ['c', 0.27, -0.57, 0.78, -1.05, 1.38, -1.35], ['c', 0.24, -0.12, 0.63, -0.27, 0.90, -0.30], ['z']], w: 6.632, h: 8.758 },\n\t'z': { d: [['M', 2.64, -7.95], ['c', 0.36, -0.09, 0.81, -0.03, 1.71, 0.27], ['c', 0.78, 0.21, 0.96, 0.27, 1.74, 0.30], ['c', 0.87, 0.06, 1.02, 0.03, 1.38, -0.21], ['c', 0.21, -0.15, 0.33, -0.15, 0.48, -0.06], ['c', 0.15, 0.09, 0.21, 0.30, 0.15, 0.45], ['c', -0.03, 0.06, -1.26, 1.26, -2.76, 2.67], ['l', -2.73, 2.55], ['l', 0.54, 0.03], ['c', 0.54, 0.03, 0.72, 0.03, 2.01, 0.15], ['c', 0.36, 0.03, 0.90, 0.06, 1.20, 0.09], ['c', 0.66, 0.00, 0.81, -0.03, 1.02, -0.24], ['c', 0.30, -0.30, 0.39, -0.72, 0.27, -1.23], ['c', -0.06, -0.27, -0.06, -0.27, -0.03, -0.39], ['c', 0.15, -0.30, 0.54, -0.27, 0.69, 0.03], ['c', 0.15, 0.33, 0.27, 1.02, 0.27, 1.50], ['c', 0.00, 1.47, -1.11, 2.70, -2.52, 2.79], ['c', -0.57, 0.03, -1.02, -0.09, -2.01, -0.51], ['c', -1.02, -0.42, -1.23, -0.48, -2.13, -0.54], ['c', -0.81, -0.06, -0.96, -0.03, -1.26, 0.18], ['c', -0.12, 0.06, -0.24, 0.12, -0.27, 0.12], ['c', -0.27, 0.00, -0.45, -0.30, -0.36, -0.51], ['c', 0.03, -0.06, 1.32, -1.32, 2.91, -2.79], ['l', 2.88, -2.73], ['c', -0.03, 0.00, -0.21, 0.03, -0.42, 0.06], ['c', -0.21, 0.03, -0.78, 0.09, -1.23, 0.12], ['c', -1.11, 0.12, -1.23, 0.15, -1.95, 0.27], ['c', -0.72, 0.15, -1.17, 0.18, -1.29, 0.09], ['c', -0.27, -0.18, -0.21, -0.75, 0.12, -1.26], ['c', 0.39, -0.60, 0.93, -1.02, 1.59, -1.20], ['z']], w: 8.573, h: 8.743 },\n\t'+': { d: [['M', 3.48, -9.3], ['c', 0.18, -0.09, 0.36, -0.09, 0.54, 0.00], ['c', 0.18, 0.09, 0.24, 0.15, 0.33, 0.30], ['l', 0.06, 0.15], ['l', 0.00, 1.29], ['l', 0.00, 1.29], ['l', 1.29, 0.00], ['c', 1.23, 0.00, 1.29, 0.00, 1.41, 0.06], ['c', 0.06, 0.03, 0.15, 0.09, 0.18, 0.12], ['c', 0.12, 0.09, 0.21, 0.33, 0.21, 0.48], ['c', 0.00, 0.15, -0.09, 0.39, -0.21, 0.48], ['c', -0.03, 0.03, -0.12, 0.09, -0.18, 0.12], ['c', -0.12, 0.06, -0.18, 0.06, -1.41, 0.06], ['l', -1.29, 0.00], ['l', 0.00, 1.29], ['c', 0.00, 1.23, 0.00, 1.29, -0.06, 1.41], ['c', -0.09, 0.18, -0.15, 0.24, -0.30, 0.33], ['c', -0.21, 0.09, -0.39, 0.09, -0.57, 0.00], ['c', -0.18, -0.09, -0.24, -0.15, -0.33, -0.33], ['c', -0.06, -0.12, -0.06, -0.18, -0.06, -1.41], ['l', 0.00, -1.29], ['l', -1.29, 0.00], ['c', -1.23, 0.00, -1.29, 0.00, -1.41, -0.06], ['c', -0.18, -0.09, -0.24, -0.15, -0.33, -0.33], ['c', -0.09, -0.18, -0.09, -0.36, 0.00, -0.54], ['c', 0.09, -0.18, 0.15, -0.24, 0.33, -0.33], ['l', 0.15, -0.06], ['l', 1.26, 0.00], ['l', 1.29, 0.00], ['l', 0.00, -1.29], ['c', 0.00, -1.23, 0.00, -1.29, 0.06, -1.41], ['c', 0.09, -0.18, 0.15, -0.24, 0.33, -0.33], ['z']], w: 7.507, h: 7.515 },\n\t',': { d: [['M', 1.85, -3.36], ['c', 0.57, -0.15, 1.17, 0.03, 1.59, 0.45], ['c', 0.45, 0.45, 0.60, 0.96, 0.51, 1.89], ['c', -0.09, 1.23, -0.42, 2.46, -0.99, 3.93], ['c', -0.30, 0.72, -0.72, 1.62, -0.78, 1.68], ['c', -0.18, 0.21, -0.51, 0.18, -0.66, -0.06], ['c', -0.03, -0.06, -0.06, -0.15, -0.06, -0.18], ['c', 0.00, -0.06, 0.12, -0.33, 0.24, -0.63], ['c', 0.84, -1.80, 1.02, -2.61, 0.69, -3.24], ['c', -0.12, -0.24, -0.27, -0.36, -0.75, -0.60], ['c', -0.36, -0.15, -0.42, -0.21, -0.60, -0.39], ['c', -0.69, -0.69, -0.69, -1.71, 0.00, -2.40], ['c', 0.21, -0.21, 0.51, -0.39, 0.81, -0.45], ['z']], w: 3.452, h: 8.143 },\n\t'-': { d: [['M', 0.18, -5.34], ['c', 0.09, -0.06, 0.15, -0.06, 2.31, -0.06], ['c', 2.46, 0.00, 2.37, 0.00, 2.46, 0.21], ['c', 0.12, 0.21, 0.03, 0.42, -0.15, 0.54], ['c', -0.09, 0.06, -0.15, 0.06, -2.28, 0.06], ['c', -2.16, 0.00, -2.22, 0.00, -2.31, -0.06], ['c', -0.27, -0.15, -0.27, -0.54, -0.03, -0.69], ['z']], w: 5.001, h: 0.81 },\n\t'.': { d: [['M', 1.32, -3.36], ['c', 1.05, -0.27, 2.10, 0.57, 2.10, 1.65], ['c', 0.00, 1.08, -1.05, 1.92, -2.10, 1.65], ['c', -0.90, -0.21, -1.50, -1.14, -1.26, -2.04], ['c', 0.12, -0.63, 0.63, -1.11, 1.26, -1.26], ['z']], w: 3.413, h: 3.402 },\n\t'scripts.wedge': { d: [['M', -3.66, -7.44], ['c', 0.06, -0.09, 0.00, -0.09, 0.81, 0.03], ['c', 1.86, 0.30, 3.84, 0.30, 5.73, 0.00], ['c', 0.78, -0.12, 0.72, -0.12, 0.78, -0.03], ['c', 0.15, 0.15, 0.12, 0.24, -0.24, 0.60], ['c', -0.93, 0.93, -1.98, 2.76, -2.67, 4.62], ['c', -0.30, 0.78, -0.51, 1.71, -0.51, 2.13], ['c', 0.00, 0.15, 0.00, 0.18, -0.06, 0.27], ['c', -0.12, 0.09, -0.24, 0.09, -0.36, 0.00], ['c', -0.06, -0.09, -0.06, -0.12, -0.06, -0.27], ['c', 0.00, -0.42, -0.21, -1.35, -0.51, -2.13], ['c', -0.69, -1.86, -1.74, -3.69, -2.67, -4.62], ['c', -0.36, -0.36, -0.39, -0.45, -0.24, -0.60], ['z']], w: 7.49, h: 7.752 },\n\t'scripts.thumb': { d: [['M', -0.54, -3.69], ['c', 0.15, -0.03, 0.36, -0.06, 0.51, -0.06], ['c', 1.44, 0.00, 2.58, 1.11, 2.94, 2.85], ['c', 0.09, 0.48, 0.09, 1.32, 0.00, 1.80], ['c', -0.27, 1.41, -1.08, 2.43, -2.16, 2.73], ['l', -0.18, 0.06], ['l', 0.00, 0.12], ['c', 0.03, 0.06, 0.06, 0.45, 0.09, 0.87], ['c', 0.03, 0.57, 0.03, 0.78, 0.00, 0.84], ['c', -0.09, 0.27, -0.39, 0.48, -0.66, 0.48], ['c', -0.27, 0.00, -0.57, -0.21, -0.66, -0.48], ['c', -0.03, -0.06, -0.03, -0.27, 0.00, -0.84], ['c', 0.03, -0.42, 0.06, -0.81, 0.09, -0.87], ['l', 0.00, -0.12], ['l', -0.18, -0.06], ['c', -1.08, -0.30, -1.89, -1.32, -2.16, -2.73], ['c', -0.09, -0.48, -0.09, -1.32, 0.00, -1.80], ['c', 0.15, -0.84, 0.51, -1.53, 1.02, -2.04], ['c', 0.39, -0.39, 0.84, -0.63, 1.35, -0.75], ['z'], ['m', 1.05, 0.90], ['c', -0.15, -0.09, -0.21, -0.09, -0.45, -0.12], ['c', -0.15, 0.00, -0.30, 0.03, -0.39, 0.03], ['c', -0.57, 0.18, -0.90, 0.72, -1.08, 1.74], ['c', -0.06, 0.48, -0.06, 1.80, 0.00, 2.28], ['c', 0.15, 0.90, 0.42, 1.44, 0.90, 1.65], ['c', 0.18, 0.09, 0.21, 0.09, 0.51, 0.09], ['c', 0.30, 0.00, 0.33, 0.00, 0.51, -0.09], ['c', 0.48, -0.21, 0.75, -0.75, 0.90, -1.65], ['c', 0.03, -0.27, 0.03, -0.54, 0.03, -1.14], ['c', 0.00, -0.60, 0.00, -0.87, -0.03, -1.14], ['c', -0.15, -0.90, -0.45, -1.44, -0.90, -1.65], ['z']], w: 5.955, h: 9.75 },\n\t'scripts.open': { d: [['M', -0.54, -3.69], ['c', 0.15, -0.03, 0.36, -0.06, 0.51, -0.06], ['c', 1.44, 0.00, 2.58, 1.11, 2.94, 2.85], ['c', 0.09, 0.48, 0.09, 1.32, 0.00, 1.80], ['c', -0.33, 1.74, -1.47, 2.85, -2.91, 2.85], ['c', -1.44, 0.00, -2.58, -1.11, -2.91, -2.85], ['c', -0.09, -0.48, -0.09, -1.32, 0.00, -1.80], ['c', 0.15, -0.84, 0.51, -1.53, 1.02, -2.04], ['c', 0.39, -0.39, 0.84, -0.63, 1.35, -0.75], ['z'], ['m', 1.11, 0.90], ['c', -0.21, -0.09, -0.27, -0.09, -0.51, -0.12], ['c', -0.30, 0.00, -0.42, 0.03, -0.66, 0.15], ['c', -0.24, 0.12, -0.51, 0.39, -0.66, 0.63], ['c', -0.54, 0.93, -0.63, 2.64, -0.21, 3.81], ['c', 0.21, 0.54, 0.51, 0.90, 0.93, 1.11], ['c', 0.21, 0.09, 0.24, 0.09, 0.54, 0.09], ['c', 0.30, 0.00, 0.33, 0.00, 0.54, -0.09], ['c', 0.42, -0.21, 0.72, -0.57, 0.93, -1.11], ['c', 0.36, -0.99, 0.36, -2.37, 0.00, -3.36], ['c', -0.21, -0.54, -0.51, -0.90, -0.90, -1.11], ['z']], w: 5.955, h: 7.5 },\n\t'scripts.longphrase': { d: [['M', 1.47, -15.09], ['c', 0.36, -0.09, 0.66, -0.18, 0.69, -0.18], ['c', 0.06, 0.00, 0.06, 0.54, 0.06, 11.25], ['l', 0.00, 11.25], ['l', -0.63, 0.15], ['c', -0.66, 0.18, -1.44, 0.39, -1.50, 0.39], ['c', -0.03, 0.00, -0.03, -3.39, -0.03, -11.25], ['l', 0.00, -11.25], ['l', 0.36, -0.09], ['c', 0.21, -0.06, 0.66, -0.18, 1.05, -0.27], ['z']], w: 2.16, h: 23.04 },\n\t'scripts.mediumphrase': { d: [['M', 1.47, -7.59], ['c', 0.36, -0.09, 0.66, -0.18, 0.69, -0.18], ['c', 0.06, 0.00, 0.06, 0.39, 0.06, 7.50], ['l', 0.00, 7.50], ['l', -0.63, 0.15], ['c', -0.66, 0.18, -1.44, 0.39, -1.50, 0.39], ['c', -0.03, 0.00, -0.03, -2.28, -0.03, -7.50], ['l', 0.00, -7.50], ['l', 0.36, -0.09], ['c', 0.21, -0.06, 0.66, -0.18, 1.05, -0.27], ['z']], w: 2.16, h: 15.54 },\n\t'scripts.shortphrase': { d: [['M', 1.47, -7.59], ['c', 0.36, -0.09, 0.66, -0.18, 0.69, -0.18], ['c', 0.06, 0.00, 0.06, 0.21, 0.06, 3.75], ['l', 0.00, 3.75], ['l', -0.42, 0.09], ['c', -0.57, 0.18, -1.65, 0.45, -1.71, 0.45], ['c', -0.03, 0.00, -0.03, -0.72, -0.03, -3.75], ['l', 0.00, -3.75], ['l', 0.36, -0.09], ['c', 0.21, -0.06, 0.66, -0.18, 1.05, -0.27], ['z']], w: 2.16, h: 8.04 },\n\t'scripts.snap': { d: [['M', 4.50, -3.39], ['c', 0.36, -0.03, 0.96, -0.03, 1.35, 0.00], ['c', 1.56, 0.15, 3.15, 0.90, 4.20, 2.01], ['c', 0.24, 0.27, 0.33, 0.42, 0.33, 0.60], ['c', 0.00, 0.27, 0.03, 0.24, -2.46, 2.22], ['c', -1.29, 1.02, -2.40, 1.86, -2.49, 1.92], ['c', -0.18, 0.09, -0.30, 0.09, -0.48, 0.00], ['c', -0.09, -0.06, -1.20, -0.90, -2.49, -1.92], ['c', -2.49, -1.98, -2.46, -1.95, -2.46, -2.22], ['c', 0.00, -0.18, 0.09, -0.33, 0.33, -0.60], ['c', 1.05, -1.08, 2.64, -1.86, 4.17, -2.01], ['z'], ['m', 1.29, 1.17], ['c', -1.47, -0.15, -2.97, 0.30, -4.14, 1.20], ['l', -0.18, 0.15], ['l', 0.06, 0.09], ['c', 0.15, 0.12, 3.63, 2.85, 3.66, 2.85], ['c', 0.03, 0.00, 3.51, -2.73, 3.66, -2.85], ['l', 0.06, -0.09], ['l', -0.18, -0.15], ['c', -0.84, -0.66, -1.89, -1.08, -2.94, -1.20], ['z']], w: 10.38, h: 6.84 }\n};\n\n// Custom characters that weren't generated from the font:\nglyphs['noteheads.slash.whole'] = { d: [['M', 5, -5], ['l', 1, 1], ['l', -5, 5], ['l', -1, -1], ['z'], ['m', 4, 6], ['l', -5, -5], ['l', 2, -2], ['l', 5, 5], ['z'], ['m', 0, -2], ['l', 1, 1], ['l', -5, 5], ['l', -1, -1], ['z'], ['m', -4, 6], ['l', -5, -5], ['l', 2, -2], ['l', 5, 5], ['z']], w: 10.81, h: 15.63 };\n\nglyphs['noteheads.slash.quarter'] = { d: [['M', 9, -6], ['l', 0, 4], ['l', -9, 9], ['l', 0, -4], ['z']], w: 9, h: 9 };\n\nglyphs['noteheads.harmonic.quarter'] = { d: [['M', 3.63, -4.02], ['c', 0.09, -0.06, 0.18, -0.09, 0.24, -0.03], ['c', 0.03, 0.03, 0.87, 0.93, 1.83, 2.01], ['c', 1.50, 1.65, 1.80, 1.98, 1.80, 2.04], ['c', 0.00, 0.06, -0.30, 0.39, -1.80, 2.04], ['c', -0.96, 1.08, -1.80, 1.98, -1.83, 2.01], ['c', -0.06, 0.06, -0.15, 0.03, -0.24, -0.03], ['c', -0.12, -0.09, -3.54, -3.84, -3.60, -3.93], ['c', -0.03, -0.03, -0.03, -0.09, -0.03, -0.15], ['c', 0.03, -0.06, 3.45, -3.84, 3.63, -3.96], ['z']], w: 7.5, h: 8.165 };\n\nglyphs['noteheads.triangle.quarter'] = { d: [['M', 0, 4], ['l', 9, 0], ['l', -4.5, -9], ['z']], w: 9, h: 9 };\n\nvar pathClone = function (pathArray) {\n\tvar res = [];\n\tfor (var i = 0, ii = pathArray.length; i < ii; i++) {\n\t\tres[i] = [];\n\t\tfor (var j = 0, jj = pathArray[i].length; j < jj; j++) {\n\t\t\tres[i][j] = pathArray[i][j];\n\t\t}\n\t}\n\treturn res;\n};\n\nvar pathScale = function (pathArray, kx, ky) {\n\tfor (var i = 0, ii = pathArray.length; i < ii; i++) {\n\t\tvar p = pathArray[i];\n\t\tvar j, jj;\n\t\tfor (j = 1, jj = p.length; j < jj; j++) {\n\t\t\tp[j] *= (j % 2) ? kx : ky;\n\t\t}\n\t}\n};\n\nvar Glyphs = {\n\tprintSymbol: function (x, y, symb, paper, attrs) {\n\t\tif (!glyphs[symb]) return null;\n\t\tvar pathArray = pathClone(glyphs[symb].d);\n\t\tpathArray[0][1] += x;\n\t\tpathArray[0][2] += y;\n\t\tvar path = \"\";\n\t\tfor (var i = 0; i < pathArray.length; i++)\n\t\t\tpath += pathArray[i].join(\" \");\n\t\tattrs.path = path;\n\t\treturn paper.path(attrs);\n\t},\n\n\tgetPathForSymbol: function (x, y, symb, scalex, scaley) {\n\t\tscalex = scalex || 1;\n\t\tscaley = scaley || 1;\n\t\tif (!glyphs[symb]) return null;\n\t\tvar pathArray = pathClone(glyphs[symb].d);\n\t\tif (scalex !== 1 || scaley !== 1) pathScale(pathArray, scalex, scaley);\n\t\tpathArray[0][1] += x;\n\t\tpathArray[0][2] += y;\n\n\t\treturn pathArray;\n\t},\n\n\tgetSymbolWidth: function (symbol) {\n\t\tif (glyphs[symbol]) return glyphs[symbol].w;\n\t\treturn 0;\n\t},\n\n\tsymbolHeightInPitches: function (symbol) {\n\t\tvar height = glyphs[symbol] ? glyphs[symbol].h : 0;\n\t\treturn height / spacing.STEP;\n\t},\n\n\tgetSymbolAlign: function (symbol) {\n\t\tif (symbol.substring(0, 7) === \"scripts\" &&\n\t\t\tsymbol !== \"scripts.roll\") {\n\t\t\treturn \"center\";\n\t\t}\n\t\treturn \"left\";\n\t},\n\n\tgetYCorr: function (symbol) {\n\t\tswitch (symbol) {\n\t\t\tcase \"0\":\n\t\t\tcase \"1\":\n\t\t\tcase \"2\":\n\t\t\tcase \"3\":\n\t\t\tcase \"4\":\n\t\t\tcase \"5\":\n\t\t\tcase \"6\":\n\t\t\tcase \"7\":\n\t\t\tcase \"8\":\n\t\t\tcase \"9\":\n\t\t\tcase \"+\": return -2;\n\t\t\tcase \"timesig.common\":\n\t\t\tcase \"timesig.cut\": return 0;\n\t\t\tcase \"flags.d32nd\": return -1;\n\t\t\tcase \"flags.d64th\": return -2;\n\t\t\tcase \"flags.u32nd\": return 1;\n\t\t\tcase \"flags.u64th\": return 3;\n\t\t\tcase \"rests.whole\": return 1;\n\t\t\tcase \"rests.half\": return -1;\n\t\t\tcase \"rests.8th\": return -1;\n\t\t\tcase \"rests.quarter\": return -1;\n\t\t\tcase \"rests.16th\": return -1;\n\t\t\tcase \"rests.32nd\": return -1;\n\t\t\tcase \"rests.64th\": return -1;\n\t\t\tcase \"f\":\n\t\t\tcase \"m\":\n\t\t\tcase \"p\":\n\t\t\tcase \"s\":\n\t\t\tcase \"z\":\n\t\t\t\treturn -4;\n\t\t\tcase \"scripts.trill\":\n\t\t\tcase \"scripts.upbow\":\n\t\t\tcase \"scripts.downbow\":\n\t\t\t\treturn -2;\n\t\t\tcase \"scripts.ufermata\":\n\t\t\tcase \"scripts.wedge\":\n\t\t\tcase \"scripts.roll\":\n\t\t\tcase \"scripts.shortphrase\":\n\t\t\tcase \"scripts.longphrase\":\n\t\t\t\treturn -1;\n\t\t\tcase \"scripts.dfermata\":\n\t\t\t\treturn 1;\n\t\t\tdefault: return 0;\n\t\t}\n\t},\n\tsetSymbol: function (name, path) {\n\t\tglyphs[name] = path;\n\t}\n};\n\nmodule.exports = Glyphs; // we need the glyphs for layout information\n","// abc_create_clef.js\n\nvar AbsoluteElement = require('./elements/absolute-element');\nvar glyphs = require('./glyphs');\nvar RelativeElement = require('./elements/relative-element');\n\nvar createClef = function (elem, tuneNumber) {\n\tvar clef;\n\tvar octave = 0;\n\telem.el_type = \"clef\";\n\tvar abselem = new AbsoluteElement(elem, 0, 10, 'staff-extra clef', tuneNumber);\n\tabselem.isClef = true;\n\tswitch (elem.type) {\n\t\tcase \"treble\": clef = \"clefs.G\"; break;\n\t\tcase \"tenor\": clef = \"clefs.C\"; break;\n\t\tcase \"alto\": clef = \"clefs.C\"; break;\n\t\tcase \"bass\": clef = \"clefs.F\"; break;\n\t\tcase 'treble+8': clef = \"clefs.G\"; octave = 1; break;\n\t\tcase 'tenor+8': clef = \"clefs.C\"; octave = 1; break;\n\t\tcase 'bass+8': clef = \"clefs.F\"; octave = 1; break;\n\t\tcase 'alto+8': clef = \"clefs.C\"; octave = 1; break;\n\t\tcase 'treble-8': clef = \"clefs.G\"; octave = -1; break;\n\t\tcase 'tenor-8': clef = \"clefs.C\"; octave = -1; break;\n\t\tcase 'bass-8': clef = \"clefs.F\"; octave = -1; break;\n\t\tcase 'alto-8': clef = \"clefs.C\"; octave = -1; break;\n\t\tcase 'none': return null;\n\t\tcase 'perc': clef = \"clefs.perc\"; break;\n\t\tdefault: abselem.addFixed(new RelativeElement(\"clef=\" + elem.type, 0, 0, undefined, { type: \"debug\" }));\n\t}\n\t// if (elem.verticalPos) {\n\t// pitch = elem.verticalPos;\n\t// }\n\tvar dx = 5;\n\tif (clef) {\n\t\tvar height = glyphs.symbolHeightInPitches(clef);\n\t\tvar ofs = clefOffsets(clef);\n\t\tabselem.addRight(new RelativeElement(clef, dx, glyphs.getSymbolWidth(clef), elem.clefPos, { top: height + elem.clefPos + ofs, bottom: elem.clefPos + ofs }));\n\n\t\tif (octave !== 0) {\n\t\t\tvar scale = 2 / 3;\n\t\t\tvar adjustspacing = (glyphs.getSymbolWidth(clef) - glyphs.getSymbolWidth(\"8\") * scale) / 2;\n\t\t\tvar pitch = (octave > 0) ? abselem.top + 3 : abselem.bottom - 1;\n\t\t\tvar top = (octave > 0) ? abselem.top + 3 : abselem.bottom - 3;\n\t\t\tvar bottom = top - 2;\n\t\t\tif (elem.type === \"bass-8\") {\n\t\t\t\t// The placement for bass octave is a little different. It should hug the clef.\n\t\t\t\tpitch = 3;\n\t\t\t\tadjustspacing = 0;\n\t\t\t}\n\t\t\tabselem.addRight(new RelativeElement(\"8\", dx + adjustspacing, glyphs.getSymbolWidth(\"8\") * scale, pitch, {\n\t\t\t\tscalex: scale,\n\t\t\t\tscaley: scale,\n\t\t\t\ttop: top,\n\t\t\t\tbottom: bottom\n\t\t\t}));\n\t\t\t//abselem.top += 2;\n\t\t}\n\t}\n\treturn abselem;\n};\n\nfunction clefOffsets(clef) {\n\tswitch (clef) {\n\t\tcase \"clefs.G\": return -5;\n\t\tcase \"clefs.C\": return -4;\n\t\tcase \"clefs.F\": return -4;\n\t\tcase \"clefs.perc\": return -2;\n\t\tdefault: return 0;\n\t}\n}\n\nmodule.exports = createClef;\n","// abc_create_key_signature.js\n\nvar AbsoluteElement = require('./elements/absolute-element');\nvar glyphs = require('./glyphs');\nvar RelativeElement = require('./elements/relative-element');\n\nvar createKeySignature = function (elem, tuneNumber) {\n\telem.el_type = \"keySignature\";\n\tif (!elem.accidentals || elem.accidentals.length === 0)\n\t\treturn null;\n\tvar abselem = new AbsoluteElement(elem, 0, 10, 'staff-extra key-signature', tuneNumber);\n\tabselem.isKeySig = true;\n\tvar dx = 0;\n\telem.accidentals.forEach(function (acc) {\n\t\tvar symbol;\n\t\tvar fudge = 0;\n\t\tswitch (acc.acc) {\n\t\t\tcase \"sharp\": symbol = \"accidentals.sharp\"; fudge = -3; break;\n\t\t\tcase \"natural\": symbol = \"accidentals.nat\"; break;\n\t\t\tcase \"flat\": symbol = \"accidentals.flat\"; fudge = -1.2; break;\n\t\t\tcase \"quartersharp\": symbol = \"accidentals.halfsharp\"; fudge = -2.5; break;\n\t\t\tcase \"quarterflat\": symbol = \"accidentals.halfflat\"; fudge = -1.2; break;\n\t\t\tdefault: symbol = \"accidentals.flat\";\n\t\t}\n\t\tabselem.addRight(new RelativeElement(symbol, dx, glyphs.getSymbolWidth(symbol), acc.verticalPos, { thickness: glyphs.symbolHeightInPitches(symbol), top: acc.verticalPos + glyphs.symbolHeightInPitches(symbol) + fudge, bottom: acc.verticalPos + fudge }));\n\t\tdx += glyphs.getSymbolWidth(symbol) + 2;\n\t}, this);\n\treturn abselem;\n};\n\nmodule.exports = createKeySignature;\n","var glyphs = require('./glyphs');\nvar RelativeElement = require('./elements/relative-element');\n\nvar createNoteHead = function (abselem, c, pitchelem, options) {\n\tif (!options) options = {};\n\tvar dir = (options.dir !== undefined) ? options.dir : null;\n\tvar headx = (options.headx !== undefined) ? options.headx : 0;\n\tvar extrax = (options.extrax !== undefined) ? options.extrax : 0;\n\tvar flag = (options.flag !== undefined) ? options.flag : null;\n\tvar dot = (options.dot !== undefined) ? options.dot : 0;\n\tvar dotshiftx = (options.dotshiftx !== undefined) ? options.dotshiftx : 0;\n\tvar scale = (options.scale !== undefined) ? options.scale : 1;\n\tvar accidentalSlot = (options.accidentalSlot !== undefined) ? options.accidentalSlot : [];\n\tvar shouldExtendStem = (options.shouldExtendStem !== undefined) ? options.shouldExtendStem : false;\n\tvar printAccidentals = (options.printAccidentals !== undefined) ? options.printAccidentals : true;\n\n\t// TODO scale the dot as well\n\tvar pitch = pitchelem.verticalPos;\n\tvar notehead;\n\tvar accidentalshiftx = 0;\n\tvar newDotShiftX = 0;\n\tvar extraLeft = 0;\n\tif (c === undefined)\n\t\tabselem.addFixed(new RelativeElement(\"pitch is undefined\", 0, 0, 0, { type: \"debug\" }));\n\telse if (c === \"\") {\n\t\tnotehead = new RelativeElement(null, 0, 0, pitch);\n\t} else {\n\t\tvar shiftheadx = headx;\n\t\tif (pitchelem.printer_shift) {\n\t\t\tvar adjust = (pitchelem.printer_shift === \"same\") ? 1 : 0;\n\t\t\tshiftheadx = (dir === \"down\") ? -glyphs.getSymbolWidth(c) * scale + adjust : glyphs.getSymbolWidth(c) * scale - adjust;\n\t\t}\n\t\tvar opts = { scalex: scale, scaley: scale, thickness: glyphs.symbolHeightInPitches(c) * scale, name: pitchelem.name };\n\t\tnotehead = new RelativeElement(c, shiftheadx, glyphs.getSymbolWidth(c) * scale, pitch, opts);\n\t\tnotehead.stemDir = dir;\n\t\tif (flag) {\n\t\t\tvar pos = pitch + ((dir === \"down\") ? -7 : 7) * scale;\n\t\t\t// if this is a regular note, (not grace or tempo indicator) then the stem will have been stretched to the middle line if it is far from the center.\n\t\t\tif (shouldExtendStem) {\n\t\t\t\tif (dir === \"down\" && pos > 6)\n\t\t\t\t\tpos = 6;\n\t\t\t\tif (dir === \"up\" && pos < 6)\n\t\t\t\t\tpos = 6;\n\t\t\t}\n\t\t\t//if (scale===1 && (dir===\"down\")?(pos>6):(pos<6)) pos=6;\n\t\t\tvar xdelta = (dir === \"down\") ? headx : headx + notehead.w - 0.6;\n\t\t\tabselem.addRight(new RelativeElement(flag, xdelta, glyphs.getSymbolWidth(flag) * scale, pos, { scalex: scale, scaley: scale }));\n\t\t}\n\t\tnewDotShiftX = notehead.w + dotshiftx - 2 + 5 * dot;\n\t\tfor (; dot > 0; dot--) {\n\t\t\tvar dotadjusty = (1 - Math.abs(pitch) % 2); //PER: take abs value of the pitch. And the shift still happens on ledger lines.\n\t\t\tabselem.addRight(new RelativeElement(\"dots.dot\", notehead.w + dotshiftx - 2 + 5 * dot, glyphs.getSymbolWidth(\"dots.dot\"), pitch + dotadjusty));\n\t\t}\n\t}\n\tif (notehead)\n\t\tnotehead.highestVert = pitchelem.highestVert;\n\n\tif (printAccidentals && pitchelem.accidental) {\n\t\tvar symb;\n\t\tswitch (pitchelem.accidental) {\n\t\t\tcase \"quartersharp\":\n\t\t\t\tsymb = \"accidentals.halfsharp\";\n\t\t\t\tbreak;\n\t\t\tcase \"dblsharp\":\n\t\t\t\tsymb = \"accidentals.dblsharp\";\n\t\t\t\tbreak;\n\t\t\tcase \"sharp\":\n\t\t\t\tsymb = \"accidentals.sharp\";\n\t\t\t\tbreak;\n\t\t\tcase \"quarterflat\":\n\t\t\t\tsymb = \"accidentals.halfflat\";\n\t\t\t\tbreak;\n\t\t\tcase \"flat\":\n\t\t\t\tsymb = \"accidentals.flat\";\n\t\t\t\tbreak;\n\t\t\tcase \"dblflat\":\n\t\t\t\tsymb = \"accidentals.dblflat\";\n\t\t\t\tbreak;\n\t\t\tcase \"natural\":\n\t\t\t\tsymb = \"accidentals.nat\";\n\t\t}\n\t\t// if a note is at least a sixth away, it can share a slot with another accidental\n\t\tvar accSlotFound = false;\n\t\tvar accPlace = extrax;\n\t\tfor (var j = 0; j < accidentalSlot.length; j++) {\n\t\t\tif (pitch - accidentalSlot[j][0] >= 6) {\n\t\t\t\taccidentalSlot[j][0] = pitch;\n\t\t\t\taccPlace = accidentalSlot[j][1];\n\t\t\t\taccSlotFound = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (accSlotFound === false) {\n\t\t\taccPlace -= (glyphs.getSymbolWidth(symb) * scale + 2);\n\t\t\taccidentalSlot.push([pitch, accPlace]);\n\t\t\taccidentalshiftx = (glyphs.getSymbolWidth(symb) * scale + 2);\n\t\t}\n\t\tvar h = glyphs.symbolHeightInPitches(symb);\n\t\tabselem.addExtra(new RelativeElement(symb, accPlace, glyphs.getSymbolWidth(symb), pitch, { scalex: scale, scaley: scale, top: pitch + h / 2, bottom: pitch - h / 2 }));\n\t\textraLeft = glyphs.getSymbolWidth(symb) / 2; // TODO-PER: We need a little extra width if there is an accidental, but I'm not sure why it isn't the full width of the accidental.\n\t}\n\n\treturn { notehead: notehead, accidentalshiftx: accidentalshiftx, dotshiftx: newDotShiftX, extraLeft: extraLeft };\n\n};\n\nmodule.exports = createNoteHead;\n","// abc_create_time_signature.js\n\nvar AbsoluteElement = require('./elements/absolute-element');\nvar glyphs = require('./glyphs');\nvar RelativeElement = require('./elements/relative-element');\n\nvar createTimeSignature = function (elem, tuneNumber) {\n\telem.el_type = \"timeSignature\";\n\tvar abselem = new AbsoluteElement(elem, 0, 10, 'staff-extra time-signature', tuneNumber);\n\tif (elem.type === \"specified\") {\n\t\tvar x = 0;\n\t\tfor (var i = 0; i < elem.value.length; i++) {\n\t\t\tif (i !== 0) {\n\t\t\t\tabselem.addRight(new RelativeElement('+', x + 1, glyphs.getSymbolWidth(\"+\"), 6, { thickness: glyphs.symbolHeightInPitches(\"+\") }));\n\t\t\t\tx += glyphs.getSymbolWidth(\"+\") + 2;\n\t\t\t}\n\t\t\tif (elem.value[i].den) {\n\t\t\t\tvar numWidth = 0;\n\t\t\t\tfor (var i2 = 0; i2 < elem.value[i].num.length; i2++)\n\t\t\t\t\tnumWidth += glyphs.getSymbolWidth(elem.value[i].num[i2]);\n\t\t\t\tvar denWidth = 0;\n\t\t\t\tfor (i2 = 0; i2 < elem.value[i].num.length; i2++)\n\t\t\t\t\tdenWidth += glyphs.getSymbolWidth(elem.value[i].den[i2]);\n\t\t\t\tvar maxWidth = Math.max(numWidth, denWidth);\n\t\t\t\tabselem.addRight(new RelativeElement(elem.value[i].num, x + (maxWidth - numWidth) / 2, numWidth, 8, { thickness: glyphs.symbolHeightInPitches(elem.value[i].num[0]) }));\n\t\t\t\tabselem.addRight(new RelativeElement(elem.value[i].den, x + (maxWidth - denWidth) / 2, denWidth, 4, { thickness: glyphs.symbolHeightInPitches(elem.value[i].den[0]) }));\n\t\t\t\tx += maxWidth\n\t\t\t} else {\n\t\t\t\tvar thisWidth = 0;\n\t\t\t\tfor (var i3 = 0; i3 < elem.value[i].num.length; i3++)\n\t\t\t\t\tthisWidth += glyphs.getSymbolWidth(elem.value[i].num[i3]);\n\t\t\t\tabselem.addRight(new RelativeElement(elem.value[i].num, x, thisWidth, 6, { thickness: glyphs.symbolHeightInPitches(elem.value[i].num[0]) }));\n\t\t\t\tx += thisWidth;\n\t\t\t}\n\t\t}\n\t} else if (elem.type === \"common_time\") {\n\t\tabselem.addRight(new RelativeElement(\"timesig.common\", 0, glyphs.getSymbolWidth(\"timesig.common\"), 6, { thickness: glyphs.symbolHeightInPitches(\"timesig.common\") }));\n\n\t} else if (elem.type === \"cut_time\") {\n\t\tabselem.addRight(new RelativeElement(\"timesig.cut\", 0, glyphs.getSymbolWidth(\"timesig.cut\"), 6, { thickness: glyphs.symbolHeightInPitches(\"timesig.cut\") }));\n\t} else if (elem.type === \"tempus_imperfectum\") {\n\t\tabselem.addRight(new RelativeElement(\"timesig.imperfectum\", 0, glyphs.getSymbolWidth(\"timesig.imperfectum\"), 6, { thickness: glyphs.symbolHeightInPitches(\"timesig.imperfectum\") }));\n\t} else if (elem.type === \"tempus_imperfectum_prolatio\") {\n\t\tabselem.addRight(new RelativeElement(\"timesig.imperfectum2\", 0, glyphs.getSymbolWidth(\"timesig.imperfectum2\"), 6, { thickness: glyphs.symbolHeightInPitches(\"timesig.imperfectum2\") }));\n\t} else if (elem.type === \"tempus_perfectum\") {\n\t\tabselem.addRight(new RelativeElement(\"timesig.perfectum\", 0, glyphs.getSymbolWidth(\"timesig.perfectum\"), 6, { thickness: glyphs.symbolHeightInPitches(\"timesig.perfectum\") }));\n\t} else if (elem.type === \"tempus_perfectum_prolatio\") {\n\t\tabselem.addRight(new RelativeElement(\"timesig.perfectum2\", 0, glyphs.getSymbolWidth(\"timesig.perfectum2\"), 6, { thickness: glyphs.symbolHeightInPitches(\"timesig.perfectum2\") }));\n\t} else {\n\t\tconsole.log(\"time signature:\", elem);\n\t}\n\treturn abselem;\n};\n\nmodule.exports = createTimeSignature;\n","// abc_dynamic_decoration.js: Definition of the DynamicDecoration class.\n\nvar DynamicDecoration = function DynamicDecoration(anchor, dec, position) {\n\tthis.type = \"DynamicDecoration\";\n\tthis.anchor = anchor;\n\tthis.dec = dec;\n\tif (position === 'below')\n\t\tthis.volumeHeightBelow = 6;\n\telse\n\t\tthis.volumeHeightAbove = 6;\n\tthis.pitch = undefined; // This will be set later\n};\n\nmodule.exports = DynamicDecoration;\n","// abc_crescendo_element.js: Definition of the CrescendoElem class.\n\nvar CrescendoElem = function CrescendoElem(anchor1, anchor2, dir, positioning) {\n\tthis.type = \"CrescendoElem\";\n\tthis.anchor1 = anchor1; // must have a .x and a .parent property or be null (means starts at the \"beginning\" of the line - after keysig)\n\tthis.anchor2 = anchor2; // must have a .x property or be null (means ends at the end of the line)\n\tthis.dir = dir; // either \"<\" or \">\"\n\tif (positioning === 'above')\n\t\tthis.dynamicHeightAbove = 6;\n\telse\n\t\tthis.dynamicHeightBelow = 6;\n\tthis.pitch = undefined; // This will be set later\n};\n\nmodule.exports = CrescendoElem;\n","var GlissandoElem = function GlissandoElem(anchor1, anchor2) {\n\tthis.type = \"GlissandoElem\";\n\tthis.anchor1 = anchor1; // must have a .x and a .parent property or be null (means starts at the \"beginning\" of the line - after keysig)\n\tthis.anchor2 = anchor2; // must have a .x property or be null (means ends at the end of the line)\n};\n\nmodule.exports = GlissandoElem;\n","// abc_tie_element.js: Definition of the TieElement class.\n\nvar TieElem = function TieElem(options) {\n\tthis.type = \"TieElem\";\n\t//\tconsole.log(\"constructor\", options.anchor1 ? options.anchor1.pitch : \"N/A\", options.anchor2 ? options.anchor2.pitch : \"N/A\", options.isTie, options.isGrace);\n\tthis.anchor1 = options.anchor1; // must have a .x and a .pitch, and a .parent property or be null (means starts at the \"beginning\" of the line - after keysig)\n\tthis.anchor2 = options.anchor2; // must have a .x and a .pitch property or be null (means ends at the end of the line)\n\tif (options.isGrace)\n\t\tthis.isGrace = true;\n\tif (options.fixedY)\n\t\tthis.fixedY = true;\n\tif (options.stemDir)\n\t\tthis.stemDir = options.stemDir;\n\tif (options.voiceNumber !== undefined)\n\t\tthis.voiceNumber = options.voiceNumber;\n\tif (options.style !== undefined)\n\t\tthis.dotted = true;\n\tthis.internalNotes = [];\n};\n\nTieElem.prototype.addInternalNote = function (note) {\n\tthis.internalNotes.push(note);\n};\n\nTieElem.prototype.setEndAnchor = function (anchor2) {\n\t//\tconsole.log(\"end\", this.anchor1 ? this.anchor1.pitch : \"N/A\", anchor2 ? anchor2.pitch : \"N/A\", this.isTie, this.isGrace);\n\tthis.anchor2 = anchor2; // must have a .x and a .pitch property or be null (means ends at the end of the line)\n\n\t// we don't really have enough info to know what the vertical extent is yet and we won't until drawing. This will just give it enough\n\t// room on either side (we don't even know if the slur will be above yet). We need to set this so that we can make sure the voice has\n\t// at least enough room that the line doesn't get cut off if the tie or slur is the lowest thing.\n\tif (this.anchor1) {\n\t\tthis.top = Math.max(this.anchor1.pitch, this.anchor2.pitch) + 4\n\t\tthis.bottom = Math.min(this.anchor1.pitch, this.anchor2.pitch) - 4\n\t} else {\n\t\tthis.top = this.anchor2.pitch + 4\n\t\tthis.bottom = this.anchor2.pitch - 4\n\t}\n};\n\n// If we encounter a repeat sign, then we don't want to extend either a tie or a slur past it, so these are called to be a limit.\nTieElem.prototype.setStartX = function (startLimitElem) {\n\tthis.startLimitX = startLimitElem;\n};\n\nTieElem.prototype.setEndX = function (endLimitElem) {\n\tthis.endLimitX = endLimitElem;\n};\n\nTieElem.prototype.setHint = function () {\n\tthis.hint = true;\n};\n\nTieElem.prototype.calcTieDirection = function () {\n\t// The rules:\n\t// 1) If it is in a grace note group, then the direction is always BELOW.\n\t// 2) If it is in a single voice, then the direction is always OPPOSITE of the stem (or where the stem would have been in the case of whole notes.)\n\t// 3) If the stem direction is forced (probably because there are two voices on the same line), then the direction is the SAME as the stem direction.\n\n\tif (this.isGrace)\n\t\tthis.above = false;\n\telse if (this.voiceNumber === 0)\n\t\tthis.above = true;\n\telse if (this.voiceNumber > 0)\n\t\tthis.above = false;\n\telse {\n\t\tvar referencePitch;\n\t\tif (this.anchor1)\n\t\t\treferencePitch = this.anchor1.pitch;\n\t\telse if (this.anchor2)\n\t\t\treferencePitch = this.anchor2.pitch;\n\t\telse\n\t\t\treferencePitch = 14; // TODO-PER: this can't really happen normally. This would imply that a tie crossed over three lines, something like \"C-\\nz\\nC\"\n\t\t// Put the arc in the opposite direction of the stem. That isn't always the pitch if one or both of the notes are beamed with something that affects its stem.\n\t\tif ((this.anchor1 && this.anchor1.stemDir === 'down') && (this.anchor2 && this.anchor2.stemDir === \"down\"))\n\t\t\tthis.above = true;\n\t\telse if ((this.anchor1 && this.anchor1.stemDir === 'up') && (this.anchor2 && this.anchor2.stemDir === \"up\"))\n\t\t\tthis.above = false;\n\t\telse if (this.anchor1 && this.anchor2)\n\t\t\tthis.above = referencePitch >= 6;\n\t\telse if (this.anchor1)\n\t\t\tthis.above = this.anchor1.stemDir === \"down\";\n\t\telse if (this.anchor2)\n\t\t\tthis.above = this.anchor2.stemDir === \"down\";\n\t\telse\n\t\t\tthis.above = referencePitch >= 6;\n\t}\n};\n\n// From \"standard music notation practice\" by Music Publishers’ Association:\n// 1) Slurs are placed under the note heads if all stems go up.\n// 2) Slurs are placed over the note heads if all stems go down.\n// 3) If there are both up stems and down stems, prefer placing the slur over.\n// 4) When the staff has opposite stemmed voices, all slurs should be on the stemmed side.\n\nTieElem.prototype.calcSlurDirection = function () {\n\tif (this.isGrace)\n\t\tthis.above = false;\n\telse if (this.voiceNumber === 0)\n\t\tthis.above = true;\n\telse if (this.voiceNumber > 0)\n\t\tthis.above = false;\n\telse {\n\t\tvar hasDownStem = false;\n\t\tif (this.anchor1 && this.anchor1.stemDir === \"down\")\n\t\t\thasDownStem = true;\n\t\tif (this.anchor2 && this.anchor2.stemDir === \"down\")\n\t\t\thasDownStem = true;\n\t\tfor (var i = 0; i < this.internalNotes.length; i++) {\n\t\t\tvar n = this.internalNotes[i];\n\t\t\tif (n.stemDir === \"down\")\n\t\t\t\thasDownStem = true;\n\t\t}\n\t\tthis.above = hasDownStem;\n\t}\n};\n\nTieElem.prototype.calcX = function (lineStartX, lineEndX) {\n\tif (this.anchor1) {\n\t\tthis.startX = this.anchor1.x; // The normal case where there is a starting element to attach to.\n\t\tif (this.anchor1.scalex < 1) // this is a grace note - don't offset the tie as much.\n\t\t\tthis.startX -= 3;\n\t} else if (this.startLimitX)\n\t\tthis.startX = this.startLimitX.x + this.startLimitX.w; // if there is no start element, but there is a repeat mark before the start of the line.\n\telse {\n\t\tif (this.anchor2)\n\t\t\tthis.startX = this.anchor2.x - 20; // There is no element and no repeat mark: make a small arc\n\t\telse\n\t\t\tthis.startX = lineStartX; // Don't have any guidance, so extend to beginning of line\n\t}\n\tif (!this.anchor1 && this.dotted)\n\t\tthis.startX -= 3; // The arc needs to be long enough to tell that it is dotted.\n\n\tif (this.anchor2)\n\t\tthis.endX = this.anchor2.x; // The normal case where there is a starting element to attach to.\n\telse if (this.endLimitX)\n\t\tthis.endX = this.endLimitX.x; // if there is no start element, but there is a repeat mark before the start of the line.\n\telse\n\t\tthis.endX = lineEndX; // There is no element and no repeat mark: extend to the beginning of the line.\n};\n\nTieElem.prototype.calcTieY = function () {\n\t// If the tie comes from another line, then one or both anchors will be missing.\n\tif (this.anchor1)\n\t\tthis.startY = this.anchor1.pitch;\n\telse if (this.anchor2)\n\t\tthis.startY = this.anchor2.pitch;\n\telse\n\t\tthis.startY = this.above ? 14 : 0;\n\n\tif (this.anchor2)\n\t\tthis.endY = this.anchor2.pitch;\n\telse if (this.anchor1)\n\t\tthis.endY = this.anchor1.pitch;\n\telse\n\t\tthis.endY = this.above ? 14 : 0;\n};\n\n// From \"standard music notation practice\" by Music Publishers’ Association:\n// 1) If the anchor note is down stem, the slur points to the note head.\n// 2) If the anchor note is up stem, and the slur is over, then point to middle of stem.\n\nTieElem.prototype.calcSlurY = function () {\n\tif (this.anchor1 && this.anchor2) {\n\t\tif (this.above && this.anchor1.stemDir === \"up\" && !this.fixedY) {\n\t\t\tthis.startY = (this.anchor1.highestVert + this.anchor1.pitch) / 2;\n\t\t\tthis.startX += this.anchor1.w / 2; // When going to the middle of the stem, bump the line to the right a little bit to make it look right.\n\t\t} else\n\t\t\tthis.startY = this.anchor1.pitch;\n\n\t\t// If the closing note has an up stem, and it is beamed, and it isn't the first note in the beam, then the beam will get in the way.\n\t\tvar beamInterferes = this.anchor2.parent.beam && this.anchor2.parent.beam.stemsUp && this.anchor2.parent.beam.elems[0] !== this.anchor2.parent;\n\t\tvar midPoint = (this.anchor2.highestVert + this.anchor2.pitch) / 2;\n\t\tif (this.above && this.anchor2.stemDir === \"up\" && !this.fixedY && !beamInterferes && (midPoint < this.startY)) {\n\t\t\tthis.endY = midPoint;\n\t\t\tthis.endX += Math.round(this.anchor2.w / 2); // When going to the middle of the stem, bump the line to the right a little bit to make it look right.\n\t\t} else\n\t\t\tthis.endY = this.above && beamInterferes ? this.anchor2.highestVert : this.anchor2.pitch;\n\n\t\tif (this.anchor1.scalex === 1) { // Need a way to tell if this is a grace note - if so then keep the slur as close as possible. TODO-PER-HACK: this should be more declaratively determined.\n\t\t\tvar hasBeam1 = !!this.anchor1.parent.beam\n\t\t\tvar hasBeam2 = !!this.anchor2.parent.beam\n\t\t\tif (hasBeam1) {\n\t\t\t\tvar isLastInBeam = this.anchor1.parent === this.anchor1.parent.beam.elems[this.anchor1.parent.beam.elems.length-1]\n\t\t\t\tif (!isLastInBeam) {\n\t\t\t\t\t\tif (this.above)\n\t\t\t\t\t\tthis.startY = this.anchor1.parent.fixed.t\n\t\t\t\t\telse\n\t\t\t\t\t\tthis.startY = this.anchor1.parent.fixed.b\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (hasBeam2) {\n\t\t\t\tvar isFirstInBeam = this.anchor2.parent === this.anchor2.parent.beam.elems[0]\n\t\t\t\tif (!isFirstInBeam) {\n\t\t\t\t\tif (this.above)\n\t\t\t\t\t\tthis.endY = this.anchor2.parent.fixed.t\n\t\t\t\t\telse\n\t\t\t\t\t\tthis.endY = this.anchor2.parent.fixed.b\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else if (this.anchor1) {\n\t\tthis.startY = this.endY = this.anchor1.pitch;\n\t} else if (this.anchor2) {\n\t\tthis.startY = this.endY = this.anchor2.pitch;\n\t} else {\n\t\t// This is the case where the slur covers the entire line.\n\t\t// TODO-PER: figure out where the real top and bottom of the line are.\n\t\tthis.startY = this.above ? 14 : 0;\n\t\tthis.endY = this.above ? 14 : 0;\n\t}\n};\n\nTieElem.prototype.avoidCollisionAbove = function () {\n\t// Double check that an interior note in the slur isn't so high that it interferes.\n\tif (this.above) {\n\t\tvar maxInnerHeight = -50;\n\t\tfor (var i = 0; i < this.internalNotes.length; i++) {\n\t\t\tif (this.internalNotes[i].highestVert > maxInnerHeight)\n\t\t\t\tmaxInnerHeight = this.internalNotes[i].highestVert;\n\t\t}\n\t\tif (maxInnerHeight > this.startY && maxInnerHeight > this.endY)\n\t\t\tthis.startY = this.endY = maxInnerHeight - 1;\n\t}\n};\n\nTieElem.prototype.getYBounds = function () {\n\tvar lineStartX = 10 // TODO-PER: I'm not sure where to get this number from but it probably doesn't matter much\n\tvar lineEndX = 1000 // TODO-PER: I'm not sure where to get this number from but it probably doesn't matter much\n\tif (this.isTie) {\n\t\tthis.calcTieDirection();\n\t\tthis.calcX(lineStartX, lineEndX);\n\t\tthis.calcTieY();\n\n\t} else {\n\t\tthis.calcSlurDirection();\n\t\tthis.calcX(lineStartX, lineEndX);\n\t\tthis.calcSlurY();\n\t}\n\tvar top;\n\tvar bottom;\n\t// TODO-PER: It's hard to tell how far the arc is, so I'm just using 3 as the max\n\tif (this.above) {\n\t\tbottom = Math.min(this.startY, this.endY)\n\t\ttop = bottom + 3\n\t} else {\n\t\ttop = Math.min(this.startY, this.endY)\n\t\tbottom = top - 3\n\t}\n\treturn [ top, bottom ]\n};\n\nmodule.exports = TieElem;\n","// abc_decoration.js: Creates a data structure suitable for printing a line of abc\n\nvar DynamicDecoration = require('./elements/dynamic-decoration');\nvar CrescendoElem = require('./elements/crescendo-element');\nvar GlissandoElem = require('./elements/glissando-element');\nvar glyphs = require('./glyphs');\nvar RelativeElement = require('./elements/relative-element');\nvar TieElem = require('./elements/tie-element');\n\nvar Decoration = function Decoration() {\n\tthis.startDiminuendoX = undefined;\n\tthis.startCrescendoX = undefined;\n\tthis.minTop = 12;\t// TODO-PER: this is assuming a 5-line staff. Pass that info in.\n\tthis.minBottom = 0;\n};\n\nvar closeDecoration = function (voice, decoration, pitch, width, abselem, roomtaken, dir, minPitch, accentAbove) {\n\tvar yPos;\n\tfor (var i = 0; i < decoration.length; i++) {\n\t\tif (decoration[i] === \"staccato\" || decoration[i] === \"tenuto\" || (decoration[i] === \"accent\" && !accentAbove)) {\n\t\t\tvar symbol = \"scripts.\" + decoration[i];\n\t\t\tif (decoration[i] === \"accent\") symbol = \"scripts.sforzato\";\n\t\t\tif (yPos === undefined)\n\t\t\t\tyPos = (dir === \"down\") ? pitch + 2 : minPitch - 2;\n\t\t\telse\n\t\t\t\tyPos = (dir === \"down\") ? yPos + 2 : yPos - 2;\n\t\t\tif (decoration[i] === \"accent\") {\n\t\t\t\t// Always place the accent three pitches away, no matter whether that is a line or space.\n\t\t\t\tif (dir === \"up\") yPos--;\n\t\t\t\telse yPos++;\n\t\t\t} else {\n\t\t\t\t// don't place on a stave line. The stave lines are 2,4,6,8,10\n\t\t\t\tswitch (yPos) {\n\t\t\t\t\tcase 2:\n\t\t\t\t\tcase 4:\n\t\t\t\t\tcase 6:\n\t\t\t\t\tcase 8:\n\t\t\t\t\tcase 10:\n\t\t\t\t\t\tif (dir === \"up\") yPos--;\n\t\t\t\t\t\telse yPos++;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (pitch > 9) yPos++; // take up some room of those that are above\n\t\t\tvar deltaX = width / 2;\n\t\t\tif (glyphs.getSymbolAlign(symbol) !== \"center\") {\n\t\t\t\tdeltaX -= (glyphs.getSymbolWidth(symbol) / 2);\n\t\t\t}\n\t\t\tabselem.addFixedX(new RelativeElement(symbol, deltaX, glyphs.getSymbolWidth(symbol), yPos));\n\t\t}\n\t\tif (decoration[i] === \"slide\" && abselem.heads[0]) {\n\t\t\tvar yPos2 = abselem.heads[0].pitch;\n\t\t\tyPos2 -= 2; // TODO-PER: not sure what this fudge factor is.\n\t\t\tvar blank1 = new RelativeElement(\"\", -roomtaken - 15, 0, yPos2 - 1);\n\t\t\tvar blank2 = new RelativeElement(\"\", -roomtaken - 5, 0, yPos2 + 1);\n\t\t\tabselem.addFixedX(blank1);\n\t\t\tabselem.addFixedX(blank2);\n\t\t\tvoice.addOther(new TieElem({ anchor1: blank1, anchor2: blank2, fixedY: true }));\n\t\t}\n\t}\n\tif (yPos === undefined)\n\t\tyPos = pitch;\n\n\treturn { above: yPos, below: abselem.bottom };\n};\n\nvar volumeDecoration = function (voice, decoration, abselem, positioning) {\n\tfor (var i = 0; i < decoration.length; i++) {\n\t\tswitch (decoration[i]) {\n\t\t\tcase \"p\":\n\t\t\tcase \"mp\":\n\t\t\tcase \"pp\":\n\t\t\tcase \"ppp\":\n\t\t\tcase \"pppp\":\n\t\t\tcase \"f\":\n\t\t\tcase \"ff\":\n\t\t\tcase \"fff\":\n\t\t\tcase \"ffff\":\n\t\t\tcase \"sfz\":\n\t\t\tcase \"mf\":\n\t\t\t\tvar elem = new DynamicDecoration(abselem, decoration[i], positioning);\n\t\t\t\tvoice.addOther(elem);\n\t\t}\n\t}\n};\n\nvar compoundDecoration = function (decoration, pitch, width, abselem, dir) {\n\tfunction highestPitch() {\n\t\tif (abselem.heads.length === 0)\n\t\t\treturn 10;\t// TODO-PER: I don't know if this can happen, but we'll return the top of the staff if so.\n\t\tvar pitch = abselem.heads[0].pitch;\n\t\tfor (var i = 1; i < abselem.heads.length; i++)\n\t\t\tpitch = Math.max(pitch, abselem.heads[i].pitch);\n\t\treturn pitch;\n\t}\n\tfunction lowestPitch() {\n\t\tif (abselem.heads.length === 0)\n\t\t\treturn 2;\t// TODO-PER: I don't know if this can happen, but we'll return the bottom of the staff if so.\n\t\tvar pitch = abselem.heads[0].pitch;\n\t\tfor (var i = 1; i < abselem.heads.length; i++)\n\t\t\tpitch = Math.min(pitch, abselem.heads[i].pitch);\n\t\treturn pitch;\n\t}\n\tfunction compoundDecoration(symbol, count) {\n\t\tvar placement = (dir === 'down') ? lowestPitch() + 1 : highestPitch() + 9;\n\t\tif (dir !== 'down' && count === 1)\n\t\t\tplacement--;\n\t\tvar deltaX = width / 2;\n\t\tdeltaX += (dir === 'down') ? -5 : 3;\n\t\tfor (var i = 0; i < count; i++) {\n\t\t\tplacement -= 1;\n\t\t\tabselem.addFixedX(new RelativeElement(symbol, deltaX, glyphs.getSymbolWidth(symbol), placement));\n\t\t}\n\t}\n\n\tfor (var i = 0; i < decoration.length; i++) {\n\t\tswitch (decoration[i]) {\n\t\t\tcase \"/\": compoundDecoration(\"flags.ugrace\", 1); break;\n\t\t\tcase \"//\": compoundDecoration(\"flags.ugrace\", 2); break;\n\t\t\tcase \"///\": compoundDecoration(\"flags.ugrace\", 3); break;\n\t\t\tcase \"////\": compoundDecoration(\"flags.ugrace\", 4); break;\n\t\t}\n\t}\n};\n\nvar stackedDecoration = function (decoration, width, abselem, yPos, positioning, minTop, minBottom, accentAbove) {\n\tfunction incrementPlacement(placement, height) {\n\t\tif (placement === 'above')\n\t\t\tyPos.above += height;\n\t\telse\n\t\t\tyPos.below -= height;\n\t}\n\tfunction getPlacement(placement) {\n\t\tvar y;\n\t\tif (placement === 'above') {\n\t\t\ty = yPos.above;\n\t\t\tif (y < minTop)\n\t\t\t\ty = minTop;\n\t\t} else {\n\t\t\ty = yPos.below;\n\t\t\tif (y > minBottom)\n\t\t\t\ty = minBottom;\n\t\t}\n\t\treturn y;\n\t}\n\tfunction textDecoration(text, placement, anchor) {\n\t\tvar y = getPlacement(placement);\n\t\tvar textFudge = 2;\n\t\tvar textHeight = 5;\n\t\t// TODO-PER: Get the height of the current font and use that for the thickness.\n\t\tabselem.addFixedX(new RelativeElement(text, width / 2, 0, y + textFudge, { type: \"decoration\", klass: 'ornament', thickness: 3, anchor: anchor }));\n\n\t\tincrementPlacement(placement, textHeight);\n\t}\n\tfunction symbolDecoration(symbol, placement) {\n\t\tvar deltaX = width / 2;\n\t\tif (glyphs.getSymbolAlign(symbol) !== \"center\") {\n\t\t\tdeltaX -= (glyphs.getSymbolWidth(symbol) / 2);\n\t\t}\n\t\tvar height = glyphs.symbolHeightInPitches(symbol) + 1; // adding a little padding so nothing touches.\n\t\tvar y = getPlacement(placement);\n\t\ty = (placement === 'above') ? y + height / 2 : y - height / 2;// Center the element vertically.\n\t\tabselem.addFixedX(new RelativeElement(symbol, deltaX, glyphs.getSymbolWidth(symbol), y, { klass: 'ornament', thickness: glyphs.symbolHeightInPitches(symbol), position: placement }));\n\n\t\tincrementPlacement(placement, height);\n\t}\n\n\tvar symbolList = {\n\t\t\"+\": \"scripts.stopped\",\n\t\t\"open\": \"scripts.open\",\n\t\t\"snap\": \"scripts.snap\",\n\t\t\"wedge\": \"scripts.wedge\",\n\t\t\"thumb\": \"scripts.thumb\",\n\t\t\"shortphrase\": \"scripts.shortphrase\",\n\t\t\"mediumphrase\": \"scripts.mediumphrase\",\n\t\t\"longphrase\": \"scripts.longphrase\",\n\t\t\"trill\": \"scripts.trill\",\n\t\t\"roll\": \"scripts.roll\",\n\t\t\"irishroll\": \"scripts.roll\",\n\t\t\"marcato\": \"scripts.umarcato\",\n\t\t\"dmarcato\": \"scripts.dmarcato\",\n\t\t\"umarcato\": \"scripts.umarcato\",\n\t\t\"turn\": \"scripts.turn\",\n\t\t\"uppermordent\": \"scripts.prall\",\n\t\t\"pralltriller\": \"scripts.prall\",\n\t\t\"mordent\": \"scripts.mordent\",\n\t\t\"lowermordent\": \"scripts.mordent\",\n\t\t\"downbow\": \"scripts.downbow\",\n\t\t\"upbow\": \"scripts.upbow\",\n\t\t\"fermata\": \"scripts.ufermata\",\n\t\t\"invertedfermata\": \"scripts.dfermata\",\n\t\t\"breath\": \",\",\n\t\t\"coda\": \"scripts.coda\",\n\t\t\"segno\": \"scripts.segno\"\n\t};\n\n\tvar hasOne = false;\n\tfor (var i = 0; i < decoration.length; i++) {\n\t\tswitch (decoration[i]) {\n\t\t\tcase \"0\":\n\t\t\tcase \"1\":\n\t\t\tcase \"2\":\n\t\t\tcase \"3\":\n\t\t\tcase \"4\":\n\t\t\tcase \"5\":\n\t\t\tcase \"D.C.\":\n\t\t\tcase \"D.S.\":\n\t\t\t\ttextDecoration(decoration[i], positioning, 'middle');\n\t\t\t\thasOne = true;\n\t\t\t\tbreak;\n\t\t\tcase \"D.C.alcoda\":\n\t\t\t\ttextDecoration(\"D.C. al coda\", positioning, 'end');\n\t\t\t\thasOne = true;\n\t\t\t\tbreak;\n\t\t\tcase \"D.C.alfine\":\n\t\t\t\ttextDecoration(\"D.C. al fine\", positioning, 'end');\n\t\t\t\thasOne = true;\n\t\t\t\tbreak;\n\t\t\tcase \"D.S.alcoda\":\n\t\t\t\ttextDecoration(\"D.S. al coda\", positioning, 'end');\n\t\t\t\thasOne = true;\n\t\t\t\tbreak;\n\t\t\tcase \"D.S.alfine\":\n\t\t\t\ttextDecoration(\"D.S. al fine\", positioning, 'end');\n\t\t\t\thasOne = true;\n\t\t\t\tbreak;\n\t\t\tcase \"fine\":\n\t\t\t\ttextDecoration(\"FINE\", positioning, 'middle');\n\t\t\t\thasOne = true;\n\t\t\t\tbreak;\n\t\t\tcase \"+\":\n\t\t\tcase \"open\":\n\t\t\tcase \"snap\":\n\t\t\tcase \"wedge\":\n\t\t\tcase \"thumb\":\n\t\t\tcase \"shortphrase\":\n\t\t\tcase \"mediumphrase\":\n\t\t\tcase \"longphrase\":\n\t\t\tcase \"trill\":\n\t\t\tcase \"roll\":\n\t\t\tcase \"irishroll\":\n\t\t\tcase \"marcato\":\n\t\t\tcase \"dmarcato\":\n\t\t\tcase \"turn\":\n\t\t\tcase \"uppermordent\":\n\t\t\tcase \"pralltriller\":\n\t\t\tcase \"mordent\":\n\t\t\tcase \"lowermordent\":\n\t\t\tcase \"downbow\":\n\t\t\tcase \"upbow\":\n\t\t\tcase \"fermata\":\n\t\t\tcase \"breath\":\n\t\t\tcase \"umarcato\":\n\t\t\tcase \"coda\":\n\t\t\tcase \"segno\":\n\t\t\t\tsymbolDecoration(symbolList[decoration[i]], positioning);\n\t\t\t\thasOne = true;\n\t\t\t\tbreak;\n\t\t\tcase \"invertedfermata\":\n\t\t\t\tsymbolDecoration(symbolList[decoration[i]], 'below');\n\t\t\t\thasOne = true;\n\t\t\t\tbreak;\n\t\t\tcase \"mark\":\n\t\t\t\tabselem.klass = \"mark\";\n\t\t\t\tbreak;\n\t\t\tcase \"accent\":\n\t\t\t\tif (accentAbove) {\n\t\t\t\t\tsymbolDecoration(\"scripts.sforzato\", positioning);\n\t\t\t\t\thasOne = true;\n\t\t\t\t}\n\t\t\t\tbreak;\t\n\t\t}\n\t}\n\treturn hasOne;\n};\n\nfunction leftDecoration(decoration, abselem, roomtaken) {\n\tfor (var i = 0; i < decoration.length; i++) {\n\t\tswitch (decoration[i]) {\n\t\t\tcase \"arpeggio\":\n\t\t\t\t// The arpeggio symbol is the height of a note (that is, two Y units). This stacks as many as we need to go from the\n\t\t\t\t// top note to the bottom note. The arpeggio should also be a little taller than the stacked notes, so there is an extra\n\t\t\t\t// one drawn and it is offset by half of a note height (that is, one Y unit).\n\t\t\t\tfor (var j = abselem.abcelem.minpitch - 1; j <= abselem.abcelem.maxpitch; j += 2) {\n\t\t\t\t\tabselem.addExtra(\n\t\t\t\t\t\tnew RelativeElement(\n\t\t\t\t\t\t\t\"scripts.arpeggio\",\n\t\t\t\t\t\t\t-glyphs.getSymbolWidth(\"scripts.arpeggio\") * 2 - roomtaken,\n\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\tj + 2,\n\t\t\t\t\t\t\t{ klass: 'ornament', thickness: glyphs.symbolHeightInPitches(\"scripts.arpeggio\") }\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t}\n}\n\nDecoration.prototype.dynamicDecoration = function (voice, decoration, abselem, positioning) {\n\tvar diminuendo;\n\tvar crescendo;\n\tvar glissando;\n\tfor (var i = 0; i < decoration.length; i++) {\n\t\tswitch (decoration[i]) {\n\t\t\tcase \"diminuendo(\":\n\t\t\t\tthis.startDiminuendoX = abselem;\n\t\t\t\tdiminuendo = undefined;\n\t\t\t\tbreak;\n\t\t\tcase \"diminuendo)\":\n\t\t\t\tdiminuendo = { start: this.startDiminuendoX, stop: abselem };\n\t\t\t\tthis.startDiminuendoX = undefined;\n\t\t\t\tbreak;\n\t\t\tcase \"crescendo(\":\n\t\t\t\tthis.startCrescendoX = abselem;\n\t\t\t\tcrescendo = undefined;\n\t\t\t\tbreak;\n\t\t\tcase \"crescendo)\":\n\t\t\t\tcrescendo = { start: this.startCrescendoX, stop: abselem };\n\t\t\t\tthis.startCrescendoX = undefined;\n\t\t\t\tbreak;\n\t\t\tcase '~(':\n\t\t\tcase \"glissando(\":\n\t\t\t\tthis.startGlissandoX = abselem;\n\t\t\t\tglissando = undefined;\n\t\t\t\tbreak;\n\t\t\tcase '~)':\n\t\t\tcase \"glissando)\":\n\t\t\t\tglissando = { start: this.startGlissandoX, stop: abselem };\n\t\t\t\tthis.startGlissandoX = undefined;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\tif (diminuendo) {\n\t\tvoice.addOther(new CrescendoElem(diminuendo.start, diminuendo.stop, \">\", positioning));\n\t}\n\tif (crescendo) {\n\t\tvoice.addOther(new CrescendoElem(crescendo.start, crescendo.stop, \"<\", positioning));\n\t}\n\tif (glissando) {\n\t\tvoice.addOther(new GlissandoElem(glissando.start, glissando.stop));\n\t}\n};\n\nDecoration.prototype.createDecoration = function (voice, decoration, pitch, width, abselem, roomtaken, dir, minPitch, positioning, hasVocals, accentAbove) {\n\tif (!positioning)\n\t\tpositioning = { ornamentPosition: 'above', volumePosition: hasVocals ? 'above' : 'below', dynamicPosition: hasVocals ? 'above' : 'below' };\n\t// These decorations don't affect the placement of other decorations\n\tvolumeDecoration(voice, decoration, abselem, positioning.volumePosition);\n\tthis.dynamicDecoration(voice, decoration, abselem, positioning.dynamicPosition);\n\tcompoundDecoration(decoration, pitch, width, abselem, dir);\n\n\t// treat staccato, accent, and tenuto first (may need to shift other markers)\n\tvar yPos = closeDecoration(voice, decoration, pitch, width, abselem, roomtaken, dir, minPitch, accentAbove);\n\t// yPos is an object containing 'above' and 'below'. That is the placement of the next symbol on either side.\n\n\tyPos.above = Math.max(yPos.above, this.minTop);\n\tyPos.below = Math.min(yPos.below, minPitch);\n\tvar hasOne = stackedDecoration(decoration, width, abselem, yPos, positioning.ornamentPosition, this.minTop, minPitch, accentAbove);\n\t//if (hasOne) {\n\t\t//\t\t\tabselem.top = Math.max(yPos.above + 3, abselem.top); // TODO-PER: Not sure why we need this fudge factor.\n\t//}\n\tleftDecoration(decoration, abselem, roomtaken);\n};\n\nmodule.exports = Decoration;\n","// abc_ending_element.js: Definition of the EndingElement class.\n\nvar EndingElem = function EndingElem(text, anchor1, anchor2) {\n\tthis.type = \"EndingElem\";\n\tthis.text = text; // text to be displayed top left\n\tthis.anchor1 = anchor1; // must have a .x property or be null (means starts at the \"beginning\" of the line - after keysig)\n\tthis.anchor2 = anchor2; // must have a .x property or be null (means ends at the end of the line)\n\tthis.endingHeightAbove = 5;\n\tthis.pitch = undefined; // This will be set later\n};\n\nmodule.exports = EndingElem;\n","var calcHeight = function (staffGroup) {\n\t// the height is calculated here in a parallel way to the drawing below in hopes that both of these functions will be modified together.\n\t// TODO-PER: also add the space between staves. (That's systemStaffSeparation, which is the minimum distance between the staff LINES.)\n\tvar height = 0;\n\tfor (var i = 0; i < staffGroup.voices.length; i++) {\n\t\tvar staff = staffGroup.voices[i].staff;\n\t\tif (!staffGroup.voices[i].duplicate) {\n\t\t\theight += staff.top;\n\t\t\t//if (staff.bottom < 0)\n\t\t\theight += -staff.bottom;\n\t\t}\n\t}\n\treturn height;\n};\n\nmodule.exports = calcHeight;\n\n","// abc_staff_group_element.js: Definition of the StaffGroupElement class.\n\n// StaffGroupElement contains all the elements that go together to make one line of music.\n// That might be multiple staves that are tied together, and it might be multiple voices on one staff.\n//\n// Methods:\n// constructor: some basic initialization\n// addVoice(): Called once for each voice. May add a new staff if needed.\n// finished(): Called only internally by layout()\n// layout(): This does all the layout. It sets the following: spacingunits, startx, minspace, w, and the x-coordinate of each element in each voice.\n// draw(): Calls the underlying methods on the voice objects to do the drawing. Sets y and height.\n//\n// Members:\n// staffs: an array of all the staves in this group. Each staff contains the following elements:\n// { top, bottom, highest, lowest, y }\n// voices: array of VoiceElement objects. This is mostly passed in, but the VoiceElement objects are modified here.\n//\n// spacingunits: number of relative x-units in the line. Used by the calling function to pass back in as the \"spacing\" input parameter.\n// TODO-PER: This should actually be passed back as a return value.\n// minspace: smallest space between two notes. Used by the calling function to pass back in as the \"spacing\" input parameter.\n// TODO-PER: This should actually be passed back as a return value.\n// startx: The left edge, taking the margin and the optional voice name. Used by the draw() method.\n// w: The width of the line. Used by calling function to pass back in as the \"spacing\" input parameter, and the draw() method.\n// TODO-PER: This should actually be passed back as a return value. (TODO-PER: in pixels or spacing units?)\n// y: The top of the staff group, in pixels. This is set in the draw method.\n// TODO-PER: Where is that used? It looks like it might not be needed.\n// height: Set in the draw() method to the height actually used. Used by the calling function to know where to start the next staff group.\n// TODO-PER: This should actually be set in the layout method and passed back as a return value.\nvar calcHeight = require('../calc-height');\n\nvar StaffGroupElement = function (getTextSize) {\n\tthis.getTextSize = getTextSize;\n\tthis.voices = [];\n\tthis.staffs = [];\n\tthis.brace = undefined; //tony\n\tthis.bracket = undefined;\n};\n\nStaffGroupElement.prototype.setLimit = function (member, voice) {\n\tif (!voice.specialY[member]) return;\n\tif (!voice.staff.specialY[member])\n\t\tvoice.staff.specialY[member] = voice.specialY[member];\n\telse\n\t\tvoice.staff.specialY[member] = Math.max(voice.staff.specialY[member], voice.specialY[member]);\n};\n\nStaffGroupElement.prototype.addVoice = function (voice, staffnumber, stafflines) {\n\tvar voiceNum = this.voices.length;\n\tthis.voices[voiceNum] = voice;\n\tif (this.staffs[staffnumber])\n\t\tthis.staffs[staffnumber].voices.push(voiceNum);\n\telse {\n\t\t// TODO-PER: how does the min/max change when stafflines is not 5?\n\t\tthis.staffs[this.staffs.length] = {\n\t\t\ttop: 10,\n\t\t\tbottom: 2,\n\t\t\tlines: stafflines,\n\t\t\tvoices: [voiceNum],\n\t\t\tspecialY: {\n\t\t\t\ttempoHeightAbove: 0,\n\t\t\t\tpartHeightAbove: 0,\n\t\t\t\tvolumeHeightAbove: 0,\n\t\t\t\tdynamicHeightAbove: 0,\n\t\t\t\tendingHeightAbove: 0,\n\t\t\t\tchordHeightAbove: 0,\n\t\t\t\tlyricHeightAbove: 0,\n\n\t\t\t\tlyricHeightBelow: 0,\n\t\t\t\tchordHeightBelow: 0,\n\t\t\t\tvolumeHeightBelow: 0,\n\t\t\t\tdynamicHeightBelow: 0\n\t\t\t}\n\t\t};\n\t}\n\tvoice.staff = this.staffs[staffnumber];\n};\n\nStaffGroupElement.prototype.setHeight = function () {\n\tthis.height = calcHeight(this);\n};\n\nStaffGroupElement.prototype.setWidth = function (width) {\n\tthis.w = width;\n\tfor (var i = 0; i < this.voices.length; i++) {\n\t\tthis.voices[i].setWidth(width);\n\t}\n};\n\nStaffGroupElement.prototype.setStaffLimits = function (voice) {\n\tvoice.staff.top = Math.max(voice.staff.top, voice.top);\n\tvoice.staff.bottom = Math.min(voice.staff.bottom, voice.bottom);\n\tthis.setLimit('tempoHeightAbove', voice);\n\tthis.setLimit('partHeightAbove', voice);\n\tthis.setLimit('volumeHeightAbove', voice);\n\tthis.setLimit('dynamicHeightAbove', voice);\n\tthis.setLimit('endingHeightAbove', voice);\n\tthis.setLimit('chordHeightAbove', voice);\n\tthis.setLimit('lyricHeightAbove', voice);\n\tthis.setLimit('lyricHeightBelow', voice);\n\tthis.setLimit('chordHeightBelow', voice);\n\tthis.setLimit('volumeHeightBelow', voice);\n\tthis.setLimit('dynamicHeightBelow', voice);\n};\n\nmodule.exports = StaffGroupElement;\n","// abc_tempo_element.js: Definition of the TempoElement class.\n\nvar AbsoluteElement = require('./absolute-element');\nvar RelativeElement = require('./relative-element');\n\nvar TempoElement = function TempoElement(tempo, tuneNumber, createNoteHead) {\n\tthis.type = \"TempoElement\";\n\tthis.tempo = tempo;\n\tthis.tempo.type = \"tempo\"; /// TODO-PER: this should be set earlier, in the parser, probably.\n\tthis.tuneNumber = tuneNumber;\n\t// TODO: can these two properties be merged?\n\tthis.totalHeightInPitches = 6;\n\tthis.tempoHeightAbove = this.totalHeightInPitches;\n\tthis.pitch = undefined; // This will be set later\n\tif (this.tempo.duration && !this.tempo.suppressBpm) {\n\t\tthis.note = this.createNote(createNoteHead, tempo, tuneNumber);\n\t}\n};\n\nTempoElement.prototype.setX = function (x) {\n\tthis.x = x;\n};\n\nTempoElement.prototype.createNote = function (createNoteHead, tempo, tuneNumber) {\n\tvar temposcale = 0.75;\n\tvar duration = tempo.duration[0]; // TODO when multiple durations\n\tvar absElem = new AbsoluteElement(tempo, duration, 1, 'tempo', tuneNumber);\n\t// There aren't an infinite number of note values, but we are passed a float, so just in case something is off upstream,\n\t// merge all of the in between points.\n\tvar dot;\n\tvar flag;\n\tvar note;\n\tif (duration <= 1 / 32) { note = \"noteheads.quarter\"; flag = \"flags.u32nd\"; dot = 0; }\n\telse if (duration <= 1 / 16) { note = \"noteheads.quarter\"; flag = \"flags.u16th\"; dot = 0; }\n\telse if (duration <= 3 / 32) { note = \"noteheads.quarter\"; flag = \"flags.u16nd\"; dot = 1; }\n\telse if (duration <= 1 / 8) { note = \"noteheads.quarter\"; flag = \"flags.u8th\"; dot = 0; }\n\telse if (duration <= 3 / 16) { note = \"noteheads.quarter\"; flag = \"flags.u8th\"; dot = 1; }\n\telse if (duration <= 1 / 4) { note = \"noteheads.quarter\"; dot = 0; }\n\telse if (duration <= 3 / 8) { note = \"noteheads.quarter\"; dot = 1; }\n\telse if (duration <= 1 / 2) { note = \"noteheads.half\"; dot = 0; }\n\telse if (duration <= 3 / 4) { note = \"noteheads.half\"; dot = 1; }\n\telse if (duration <= 1) { note = \"noteheads.whole\"; dot = 0; }\n\telse if (duration <= 1.5) { note = \"noteheads.whole\"; dot = 1; }\n\telse if (duration <= 2) { note = \"noteheads.dbl\"; dot = 0; }\n\telse { note = \"noteheads.dbl\"; dot = 1; }\n\n\tvar ret = createNoteHead(absElem, note, { verticalPos: 0 }, // This is just temporary: we'll offset the vertical positioning when we get the actual vertical spot.\n\t\t{ dir: \"up\", flag: flag, dot: dot, scale: temposcale });\n\tvar tempoNote = ret.notehead;\n\tabsElem.addHead(tempoNote);\n\tvar stem;\n\tif (note !== \"noteheads.whole\" && note !== \"noteheads.dbl\") {\n\t\tvar p1 = 1 / 3 * temposcale;\n\t\tvar p2 = 5 * temposcale;\n\t\tvar dx = tempoNote.dx + tempoNote.w;\n\t\tvar width = -0.6;\n\t\tstem = new RelativeElement(null, dx, 0, p1, { \"type\": \"stem\", \"pitch2\": p2, linewidth: width });\n\t\tabsElem.addRight(stem);\n\t}\n\treturn absElem;\n};\n\nmodule.exports = TempoElement;\n","// abc_triplet_element.js: Definition of the TripletElem class.\n\nvar TripletElem = function TripletElem(number, anchor1, options) {\n\tthis.type = \"TripletElem\";\n\tthis.anchor1 = anchor1; // must have a .x and a .parent property or be null (means starts at the \"beginning\" of the line - after key signature)\n\tthis.number = number;\n\tthis.durationClass = ('d' + (Math.round(anchor1.parent.durationClass * 1000) / 1000)).replace(/\\./, '-');\n\tthis.middleElems = []; // This is to calculate the highest interior pitch. It is used to make sure that the drawn bracket never crosses a really high middle note.\n\tthis.flatBeams = options.flatBeams;\n};\n\nTripletElem.prototype.isClosed = function () {\n\treturn !!this.anchor2;\n};\n\nTripletElem.prototype.middleNote = function (elem) {\n\tthis.middleElems.push(elem);\n};\n\nTripletElem.prototype.setCloseAnchor = function (anchor2) {\n\tthis.anchor2 = anchor2;\n\t// TODO-PER: This used to be just for beamed triplets but it looks like bracketed triplets need extra room, too. The only one that doesn't is stem down and beamed\n\t//if (this.anchor1.parent.beam)\n\tif (!this.anchor1.parent.beam || this.anchor1.stemDir === 'up')\n\t\tthis.endingHeightAbove = 4;\n};\n\nmodule.exports = TripletElem;\n","function germanNote(note) {\n\tswitch (note) {\n\t\tcase \"B#\": return \"H#\";\n\t\tcase \"B♯\": return \"H♯\";\n\t\tcase \"B\": return \"H\";\n\t\tcase \"Bb\": return \"B\";\n\t\tcase \"B♭\": return \"B\";\n\t}\n\treturn note;\n}\n\nfunction translateChord(chordString, jazzchords, germanAlphabet) {\n\tvar lines = chordString.split(\"\\n\");\n\tfor (let i = 0; i < lines.length; i++) {\n\t\tlet chord = lines[i];\n\t\t// If the chord isn't in a recognizable format then just skip it.\n\t\tlet reg = chord.match(/^([ABCDEFG][♯♭]?)?([^\\/]+)?(\\/([ABCDEFG][#b♯♭]?))?/);\n\t\tif (!reg) {\n\t\t\tcontinue;\n\t\t}\n\t\tlet baseChord = reg[1] || \"\";\n\t\tlet modifier = reg[2] || \"\";\n\t\tlet bassNote = reg[4] || \"\";\n\t\tif (germanAlphabet) {\n\t\t\tbaseChord = germanNote(baseChord);\n\t\t\tbassNote = germanNote(bassNote);\n\t\t}\n\t\t// This puts markers in the pieces of the chord that are read by the svg creator.\n\t\t// After the main part of the chord (the letter, a sharp or flat, and \"m\") a marker is added. Before a slash a marker is added.\n\t\tconst marker = jazzchords ? \"\\x03\" : \"\";\n\t\tconst bass = bassNote ? \"/\" + bassNote : \"\";\n\t\tlines[i] = [baseChord, modifier, bass].join(marker);\n\t}\n\treturn lines.join(\"\\n\");\n}\n\nmodule.exports = translateChord;\n","var RelativeElement = require('./elements/relative-element');\nvar spacing = require('../helpers/spacing');\nconst translateChord = require(\"./translate-chord\");\n\nvar addChord = function (getTextSize, abselem, elem, roomTaken, roomTakenRight, noteheadWidth, jazzchords, germanAlphabet) {\n\tfor (var i = 0; i < elem.chord.length; i++) {\n\t\tvar pos = elem.chord[i].position;\n\t\tvar rel_position = elem.chord[i].rel_position;\n\t\tvar isAnnotation = pos === \"left\" || pos === \"right\" || pos === \"below\" || pos === \"above\" || !!rel_position\n\t\tvar font;\n\t\tvar klass;\n\t\tif (isAnnotation) {\n\t\t\tfont = 'annotationfont';\n\t\t\tklass = \"abcjs-annotation\";\n\t\t} else {\n\t\t\tfont = 'gchordfont';\n\t\t\tklass = \"abcjs-chord\";\n\t\t}\n\t\tvar attr = getTextSize.attr(font, klass);\n\n\t\tvar name = elem.chord[i].name\n\t\tvar ret;\n\t\t//console.log(\"chord\",name)\n\t\tif (typeof name === \"string\") {\n\t\t\tret = chordString(name, pos, rel_position, isAnnotation, font, klass, attr, getTextSize, abselem, elem, roomTaken, roomTakenRight, noteheadWidth, jazzchords, germanAlphabet)\n\t\t\troomTaken = ret.roomTaken\n\t\t\troomTakenRight = ret.roomTakenRight\n\t\t} else {\n\t\t\tfor (var j = 0; j < name.length; j++) {\n\t\t\t\tret = chordString(name[j].text, pos, rel_position, isAnnotation, font, klass, attr, getTextSize, abselem, elem, roomTaken, roomTakenRight, noteheadWidth, jazzchords, germanAlphabet)\n\t\t\t\troomTaken = ret.roomTaken\n\t\t\t\troomTakenRight = ret.roomTakenRight\n\t\t\t}\n\t\t}\n\t}\n\treturn { roomTaken: roomTaken, roomTakenRight: roomTakenRight };\n};\n\nfunction chordString(chordString, pos, rel_position, isAnnotation, font, klass, attr, getTextSize, abselem, elem, roomTaken, roomTakenRight, noteheadWidth, jazzchords, germanAlphabet) {\n\tvar chords = chordString.split(\"\\n\");\n\tfor (var j = chords.length - 1; j >= 0; j--) { // parse these in opposite order because we place them from bottom to top.\n\t\tvar chord = chords[j];\n\t\tvar x = 0;\n\t\tvar y;\n\t\tif (!isAnnotation)\n\t\t\tchord = translateChord(chord, jazzchords, germanAlphabet);\n\t\tvar dim = getTextSize.calc(chord, font, klass);\n\t\tvar chordWidth = dim.width;\n\t\tvar chordHeight = dim.height / spacing.STEP;\n\t\tswitch (pos) {\n\t\t\tcase \"left\":\n\t\t\t\troomTaken += chordWidth + 7;\n\t\t\t\tx = -roomTaken; // TODO-PER: This is just a guess from trial and error\n\t\t\t\ty = elem.averagepitch;\n\t\t\t\tabselem.addExtra(new RelativeElement(chord, x, chordWidth + 4, y, {\n\t\t\t\t\ttype: \"text\",\n\t\t\t\t\theight: chordHeight,\n\t\t\t\t\tdim: attr,\n\t\t\t\t\tposition: \"left\"\n\t\t\t\t}));\n\t\t\t\tbreak;\n\t\t\tcase \"right\":\n\t\t\t\troomTakenRight += 4;\n\t\t\t\tx = roomTakenRight;// TODO-PER: This is just a guess from trial and error\n\t\t\t\ty = elem.averagepitch;\n\t\t\t\tabselem.addRight(new RelativeElement(chord, x, chordWidth + 4, y, {\n\t\t\t\t\ttype: \"text\",\n\t\t\t\t\theight: chordHeight,\n\t\t\t\t\tdim: attr,\n\t\t\t\t\tposition: \"right\"\n\t\t\t\t}));\n\t\t\t\tbreak;\n\t\t\tcase \"below\":\n\t\t\t\t// setting the y-coordinate to undefined for now: it will be overwritten later on, after we figure out what the highest element on the line is.\n\t\t\t\tabselem.addRight(new RelativeElement(chord, 0, 0, undefined, {\n\t\t\t\t\ttype: \"text\",\n\t\t\t\t\tposition: \"below\",\n\t\t\t\t\theight: chordHeight,\n\t\t\t\t\tdim: attr,\n\t\t\t\t\trealWidth: chordWidth\n\t\t\t\t}));\n\t\t\t\tbreak;\n\t\t\tcase \"above\":\n\t\t\t\t// setting the y-coordinate to undefined for now: it will be overwritten later on, after we figure out what the highest element on the line is.\n\t\t\t\tabselem.addRight(new RelativeElement(chord, 0, 0, undefined, {\n\t\t\t\t\ttype: \"text\",\n\t\t\t\t\tposition: \"above\",\n\t\t\t\t\theight: chordHeight,\n\t\t\t\t\tdim: attr,\n\t\t\t\t\trealWidth: chordWidth\n\t\t\t\t}));\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tif (rel_position) {\n\t\t\t\t\tvar relPositionY = rel_position.y + 3 * spacing.STEP; // TODO-PER: this is a fudge factor to make it line up with abcm2ps\n\t\t\t\t\tabselem.addRight(new RelativeElement(chord, x + rel_position.x, 0, elem.minpitch + relPositionY / spacing.STEP, {\n\t\t\t\t\t\tposition: \"relative\",\n\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\theight: chordHeight,\n\t\t\t\t\t\tdim: attr\n\t\t\t\t\t}));\n\t\t\t\t} else {\n\t\t\t\t\t// setting the y-coordinate to undefined for now: it will be overwritten later on, after we figure out what the highest element on the line is.\n\t\t\t\t\tvar pos2 = 'above';\n\t\t\t\t\tif (elem.positioning && elem.positioning.chordPosition)\n\t\t\t\t\t\tpos2 = elem.positioning.chordPosition;\n\n\t\t\t\t\tif (pos2 !== 'hidden') {\n\t\t\t\t\t\tabselem.addCentered(new RelativeElement(chord, noteheadWidth / 2, chordWidth, undefined, {\n\t\t\t\t\t\t\ttype: \"chord\",\n\t\t\t\t\t\t\tposition: pos2,\n\t\t\t\t\t\t\theight: chordHeight,\n\t\t\t\t\t\t\tdim: attr,\n\t\t\t\t\t\t\trealWidth: chordWidth\n\t\t\t\t\t\t}));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t}\n\t}\n\treturn { roomTaken: roomTaken, roomTakenRight: roomTakenRight };\n}\nmodule.exports = addChord;\n","// abc_abstract_engraver.js: Creates a data structure suitable for printing a line of abc\n\nvar AbsoluteElement = require('./elements/absolute-element');\nvar BeamElem = require('./elements/beam-element');\nvar BraceElem = require('./elements/brace-element');\nvar createClef = require('./create-clef');\nvar createKeySignature = require('./create-key-signature');\nvar createNoteHead = require('./create-note-head');\nvar createTimeSignature = require('./create-time-signature');\nvar Decoration = require('./decoration');\nvar EndingElem = require('./elements/ending-element');\nvar glyphs = require('./glyphs');\nvar RelativeElement = require('./elements/relative-element');\nvar spacing = require('../helpers/spacing');\nvar StaffGroupElement = require('./elements/staff-group-element');\nvar TempoElement = require('./elements/tempo-element');\nvar TieElem = require('./elements/tie-element');\nvar TripletElem = require('./elements/triplet-element');\nvar VoiceElement = require('./elements/voice-element');\nvar addChord = require('./add-chord');\nvar pitchesToPerc = require('../../synth/pitches-to-perc')\n\nvar parseCommon = require('../../parse/abc_common');\n\nvar getDuration = function (elem) {\n\tvar d = 0;\n\tif (elem.duration) {\n\t\td = elem.duration;\n\t}\n\treturn d;\n};\n\nvar hint = false;\n\nvar chartable = {\n\trest: { 0: \"rests.whole\", 1: \"rests.half\", 2: \"rests.quarter\", 3: \"rests.8th\", 4: \"rests.16th\", 5: \"rests.32nd\", 6: \"rests.64th\", 7: \"rests.128th\", \"multi\": \"rests.multimeasure\" },\n\tnote: { \"-1\": \"noteheads.dbl\", 0: \"noteheads.whole\", 1: \"noteheads.half\", 2: \"noteheads.quarter\", 3: \"noteheads.quarter\", 4: \"noteheads.quarter\", 5: \"noteheads.quarter\", 6: \"noteheads.quarter\", 7: \"noteheads.quarter\", 'nostem': \"noteheads.quarter\" },\n\trhythm: { \"-1\": \"noteheads.slash.whole\", 0: \"noteheads.slash.whole\", 1: \"noteheads.slash.whole\", 2: \"noteheads.slash.quarter\", 3: \"noteheads.slash.quarter\", 4: \"noteheads.slash.quarter\", 5: \"noteheads.slash.quarter\", 6: \"noteheads.slash.quarter\", 7: \"noteheads.slash.quarter\", nostem: \"noteheads.slash.nostem\" },\n\tx: { \"-1\": \"noteheads.indeterminate\", 0: \"noteheads.indeterminate\", 1: \"noteheads.indeterminate\", 2: \"noteheads.indeterminate\", 3: \"noteheads.indeterminate\", 4: \"noteheads.indeterminate\", 5: \"noteheads.indeterminate\", 6: \"noteheads.indeterminate\", 7: \"noteheads.indeterminate\", nostem: \"noteheads.indeterminate\" },\n\tharmonic: { \"-1\": \"noteheads.harmonic.quarter\", 0: \"noteheads.harmonic.quarter\", 1: \"noteheads.harmonic.quarter\", 2: \"noteheads.harmonic.quarter\", 3: \"noteheads.harmonic.quarter\", 4: \"noteheads.harmonic.quarter\", 5: \"noteheads.harmonic.quarter\", 6: \"noteheads.harmonic.quarter\", 7: \"noteheads.harmonic.quarter\", nostem: \"noteheads.harmonic.quarter\" },\n\ttriangle: { \"-1\": \"noteheads.triangle.quarter\", 0: \"noteheads.triangle.quarter\", 1: \"noteheads.triangle.quarter\", 2: \"noteheads.triangle.quarter\", 3: \"noteheads.triangle.quarter\", 4: \"noteheads.triangle.quarter\", 5: \"noteheads.triangle.quarter\", 6: \"noteheads.triangle.quarter\", 7: \"noteheads.triangle.quarter\", nostem: \"noteheads.triangle.quarter\" },\n\tuflags: { 3: \"flags.u8th\", 4: \"flags.u16th\", 5: \"flags.u32nd\", 6: \"flags.u64th\" },\n\tdflags: { 3: \"flags.d8th\", 4: \"flags.d16th\", 5: \"flags.d32nd\", 6: \"flags.d64th\" }\n};\n\nvar AbstractEngraver = function (getTextSize, tuneNumber, options) {\n\tthis.decoration = new Decoration();\n\tthis.getTextSize = getTextSize;\n\tthis.tuneNumber = tuneNumber;\n\tthis.isBagpipes = options.bagpipes;\n\tthis.flatBeams = options.flatbeams;\n\tthis.graceSlurs = options.graceSlurs;\n\tthis.percmap = options.percmap;\n\tthis.initialClef = options.initialClef\n\tthis.jazzchords = !!options.jazzchords\n\tthis.accentAbove = !!options.accentAbove\n\tthis.germanAlphabet = !!options.germanAlphabet\n\tthis.reset();\n};\n\nAbstractEngraver.prototype.reset = function () {\n\tthis.slurs = {};\n\tthis.ties = [];\n\tthis.voiceScale = 1;\n\tthis.voiceColor = undefined;\n\tthis.slursbyvoice = {};\n\tthis.tiesbyvoice = {};\n\tthis.endingsbyvoice = {};\n\tthis.scaleByVoice = {};\n\tthis.colorByVoice = {};\n\tthis.tripletmultiplier = 1;\n\n\tthis.abcline = undefined;\n\tthis.accidentalSlot = undefined;\n\tthis.accidentalshiftx = undefined;\n\tthis.dotshiftx = undefined;\n\tthis.hasVocals = false;\n\tthis.minY = undefined;\n\tthis.partstartelem = undefined;\n\tthis.startlimitelem = undefined;\n\tthis.stemdir = undefined;\n};\n\nAbstractEngraver.prototype.setStemHeight = function (heightInPixels) {\n\tthis.stemHeight = Math.round(heightInPixels * 10 / spacing.STEP) / 10;\n};\n\nAbstractEngraver.prototype.getCurrentVoiceId = function (s, v) {\n\treturn \"s\" + s + \"v\" + v;\n};\n\nAbstractEngraver.prototype.pushCrossLineElems = function (s, v) {\n\tthis.slursbyvoice[this.getCurrentVoiceId(s, v)] = this.slurs;\n\tthis.tiesbyvoice[this.getCurrentVoiceId(s, v)] = this.ties;\n\tthis.endingsbyvoice[this.getCurrentVoiceId(s, v)] = this.partstartelem;\n\tthis.scaleByVoice[this.getCurrentVoiceId(s, v)] = this.voiceScale;\n\tif (this.voiceColor)\n\t\tthis.colorByVoice[this.getCurrentVoiceId(s, v)] = this.voiceColor;\n};\n\nAbstractEngraver.prototype.popCrossLineElems = function (s, v) {\n\tthis.slurs = this.slursbyvoice[this.getCurrentVoiceId(s, v)] || {};\n\tthis.ties = this.tiesbyvoice[this.getCurrentVoiceId(s, v)] || [];\n\tthis.partstartelem = this.endingsbyvoice[this.getCurrentVoiceId(s, v)];\n\tthis.voiceScale = this.scaleByVoice[this.getCurrentVoiceId(s, v)];\n\tif (this.voiceScale === undefined) this.voiceScale = 1;\n\tthis.voiceColor = this.colorByVoice[this.getCurrentVoiceId(s, v)];\n};\n\nAbstractEngraver.prototype.containsLyrics = function (staves) {\n\tfor (var i = 0; i < staves.length; i++) {\n\t\tfor (var j = 0; j < staves[i].voices.length; j++) {\n\t\t\tfor (var k = 0; k < staves[i].voices[j].length; k++) {\n\t\t\t\tvar el = staves[i].voices[j][k];\n\t\t\t\tif (el.lyric) {\n\t\t\t\t\t// We just want to see if there are vocals below the music to know where to put the dynamics.\n\t\t\t\t\tif (!el.positioning || el.positioning.vocalPosition === 'below')\n\t\t\t\t\t\tthis.hasVocals = true;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\nAbstractEngraver.prototype.createABCLine = function (staffs, tempo, l) {\n\tthis.minY = 2; // PER: This will be the lowest that any note reaches. It will be used to set the dynamics row.\n\t// See if there are any lyrics on this line.\n\tthis.containsLyrics(staffs);\n\tvar staffgroup = new StaffGroupElement(this.getTextSize);\n\tthis.tempoSet = false;\n\tfor (var s = 0; s < staffs.length; s++) {\n\t\tif (hint)\n\t\t\tthis.restoreState();\n\t\thint = false;\n\t\tthis.createABCStaff(staffgroup, staffs[s], tempo, s, l);\n\t}\n\treturn staffgroup;\n};\n\nAbstractEngraver.prototype.createABCStaff = function (staffgroup, abcstaff, tempo, s, l) {\n\t// If the tempo is passed in, then the first element should get the tempo attached to it.\n\tstaffgroup.getTextSize.updateFonts(abcstaff);\n\tfor (var v = 0; v < abcstaff.voices.length; v++) {\n\t\tvar voice = new VoiceElement(v, abcstaff.voices.length);\n\t\tif (v === 0) {\n\t\t\tvoice.barfrom = (abcstaff.connectBarLines === \"start\" || abcstaff.connectBarLines === \"continue\");\n\t\t\tvoice.barto = (abcstaff.connectBarLines === \"continue\" || abcstaff.connectBarLines === \"end\");\n\t\t} else {\n\t\t\tvoice.duplicate = true; // bar lines and other duplicate info need not be created\n\t\t}\n\t\tif (abcstaff.title && abcstaff.title[v]) {\n\t\t\tvoice.header = abcstaff.title[v].replace(/\\\\n/g, \"\\n\");\n\t\t\tvoice.headerPosition = 6 + staffgroup.getTextSize.baselineToCenter(voice.header, \"voicefont\", 'staff-extra voice-name', v, abcstaff.voices.length) / spacing.STEP;\n\t\t}\n\t\tif (abcstaff.clef && abcstaff.clef.type === \"perc\")\n\t\t\tvoice.isPercussion = true;\n\t\tvar clef = (!this.initialClef || l === 0) && createClef(abcstaff.clef, this.tuneNumber);\n\t\tif (clef) {\n\t\t\tif (v === 0 && abcstaff.barNumber) {\n\t\t\t\tthis.addMeasureNumber(abcstaff.barNumber, clef);\n\t\t\t}\n\t\t\tvoice.addChild(clef);\n\t\t\tthis.startlimitelem = clef; // limit ties here\n\t\t}\n\t\tvar keySig = createKeySignature(abcstaff.key, this.tuneNumber);\n\t\tif (keySig) {\n\t\t\tvoice.addChild(keySig);\n\t\t\tthis.startlimitelem = keySig; // limit ties here\n\t\t}\n\t\tif (abcstaff.meter) {\n\t\t\tif (abcstaff.meter.type === 'specified') {\n\t\t\t\tthis.measureLength = abcstaff.meter.value[0].num / abcstaff.meter.value[0].den;\n\t\t\t} else\n\t\t\t\tthis.measureLength = 1;\n\t\t\tvar ts = createTimeSignature(abcstaff.meter, this.tuneNumber);\n\t\t\tvoice.addChild(ts);\n\t\t\tthis.startlimitelem = ts; // limit ties here\n\t\t}\n\t\tif (voice.duplicate)\n\t\t\tvoice.children = []; // we shouldn't reprint the above if we're reusing the same staff. We just created them to get the right spacing.\n\t\tvar staffLines = abcstaff.clef.stafflines || abcstaff.clef.stafflines === 0 ? abcstaff.clef.stafflines : 5;\n\t\tstaffgroup.addVoice(voice, s, staffLines);\n\t\tvar isSingleLineStaff = staffLines === 1;\n\t\tthis.createABCVoice(abcstaff.voices[v], tempo, s, v, isSingleLineStaff, voice);\n\t\tstaffgroup.setStaffLimits(voice);\n\t\tif (v === 0) {\n\t\t\t// only do brace and bracket processing on the first voice, otherwise it would be done twice.\n\t\t\tif (abcstaff.brace === \"start\" || (!staffgroup.brace && abcstaff.brace)) {\n\t\t\t\tif (!staffgroup.brace)\n\t\t\t\t\tstaffgroup.brace = [];\n\t\t\t\tstaffgroup.brace.push(new BraceElem(voice, \"brace\"));\n\t\t\t} else if (abcstaff.brace === \"end\" && staffgroup.brace) {\n\t\t\t\tstaffgroup.brace[staffgroup.brace.length - 1].setBottomStaff(voice);\n\t\t\t} else if (abcstaff.brace === \"continue\" && staffgroup.brace) {\n\t\t\t\tstaffgroup.brace[staffgroup.brace.length - 1].continuing(voice);\n\t\t\t}\n\t\t\tif (abcstaff.bracket === \"start\" || (!staffgroup.bracket && abcstaff.bracket)) {\n\t\t\t\tif (!staffgroup.bracket)\n\t\t\t\t\tstaffgroup.bracket = [];\n\t\t\t\tstaffgroup.bracket.push(new BraceElem(voice, \"bracket\"));\n\t\t\t} else if (abcstaff.bracket === \"end\" && staffgroup.bracket) {\n\t\t\t\tstaffgroup.bracket[staffgroup.bracket.length - 1].setBottomStaff(voice);\n\t\t\t} else if (abcstaff.bracket === \"continue\" && staffgroup.bracket) {\n\t\t\t\tstaffgroup.bracket[staffgroup.bracket.length - 1].continuing(voice);\n\t\t\t}\n\t\t}\n\t}\n};\n\nfunction getBeamGroup(abcline, pos) {\n\t// If there are notes beamed together, they are handled as a group, so find all of them here.\n\tvar elem = abcline[pos];\n\tif (elem.el_type !== 'note' || !elem.startBeam || elem.endBeam)\n\t\treturn { count: 1, elem: elem };\n\n\tvar group = [];\n\twhile (pos < abcline.length && abcline[pos].el_type === 'note') {\n\t\tgroup.push(abcline[pos]);\n\t\tif (abcline[pos].endBeam)\n\t\t\tbreak;\n\t\tpos++;\n\t}\n\treturn { count: group.length, elem: group };\n}\n\nAbstractEngraver.prototype.createABCVoice = function (abcline, tempo, s, v, isSingleLineStaff, voice) {\n\tthis.popCrossLineElems(s, v);\n\tthis.stemdir = (this.isBagpipes) ? \"down\" : null;\n\tthis.abcline = abcline;\n\tif (this.partstartelem) {\n\t\tthis.partstartelem = new EndingElem(\"\", null, null);\n\t\tvoice.addOther(this.partstartelem);\n\t}\n\tvar voiceNumber = voice.voicetotal < 2 ? -1 : voice.voicenumber;\n\tfor (var slur in this.slurs) {\n\t\tif (this.slurs.hasOwnProperty(slur)) {\n\t\t\t// this is already a slur element, but it was created for the last line, so recreate it.\n\t\t\tthis.slurs[slur] = new TieElem({ force: this.slurs[slur].force, voiceNumber: voiceNumber, stemDir: this.slurs[slur].stemDir, style: this.slurs[slur].dotted });\n\t\t\tif (hint) this.slurs[slur].setHint();\n\t\t\tvoice.addOther(this.slurs[slur]);\n\t\t}\n\t}\n\tfor (var i = 0; i < this.ties.length; i++) {\n\t\t// this is already a tie element, but it was created for the last line, so recreate it.\n\t\tthis.ties[i] = new TieElem({ force: this.ties[i].force, stemDir: this.ties[i].stemDir, voiceNumber: voiceNumber, style: this.ties[i].dotted });\n\t\tif (hint) this.ties[i].setHint();\n\t\tvoice.addOther(this.ties[i]);\n\t}\n\n\tfor (var j = 0; j < this.abcline.length; j++) {\n\t\tsetAveragePitch(this.abcline[j]);\n\t\tthis.minY = Math.min(this.abcline[j].minpitch, this.minY);\n\t}\n\n\tvar isFirstStaff = (s === 0);\n\tvar pos = 0;\n\twhile (pos < this.abcline.length) {\n\t\tvar ret = getBeamGroup(this.abcline, pos);\n\t\tvar abselems = this.createABCElement(isFirstStaff, isSingleLineStaff, voice, ret.elem);\n\t\tif (abselems) {\n\t\t\tfor (i = 0; i < abselems.length; i++) {\n\t\t\t\tif (!this.tempoSet && tempo && !tempo.suppress) {\n\t\t\t\t\tthis.tempoSet = true;\n\t\t\t\t\tvar tempoElement = new AbsoluteElement(tempo, 0, 0, \"tempo\", this.tuneNumber, {});\n\t\t\t\t\ttempoElement.addFixedX(new TempoElement(tempo, this.tuneNumber, createNoteHead));\n\t\t\t\t\tvoice.addChild(tempoElement);\n\t\t\t\t}\n\t\t\t\tvoice.addChild(abselems[i]);\n\t\t\t}\n\t\t}\n\t\tpos += ret.count;\n\t}\n\tthis.pushCrossLineElems(s, v);\n};\n\nAbstractEngraver.prototype.saveState = function () {\n\tthis.tiesSave = parseCommon.cloneArray(this.ties);\n\tthis.slursSave = parseCommon.cloneHashOfHash(this.slurs);\n\tthis.slursbyvoiceSave = parseCommon.cloneHashOfHash(this.slursbyvoice);\n\tthis.tiesbyvoiceSave = parseCommon.cloneHashOfArrayOfHash(this.tiesbyvoice);\n};\n\nAbstractEngraver.prototype.restoreState = function () {\n\tthis.ties = parseCommon.cloneArray(this.tiesSave);\n\tthis.slurs = parseCommon.cloneHashOfHash(this.slursSave);\n\tthis.slursbyvoice = parseCommon.cloneHashOfHash(this.slursbyvoiceSave);\n\tthis.tiesbyvoice = parseCommon.cloneHashOfArrayOfHash(this.tiesbyvoiceSave);\n};\n\n// function writeMeasureWidth(voice) {\n// \tvar width = 0;\n// \tfor (var i = voice.children.length-1; i >= 0; i--) {\n// \t\tvar elem = voice.children[i];\n// \t\tif (elem.abcelem.el_type === 'bar')\n// \t\t\tbreak;\n// \t\twidth += elem.w;\n// \t}\n// \treturn new RelativeElement(width.toFixed(2), -70, 0, undefined, {type:\"debug\"});\n// }\n\n// return an array of AbsoluteElement\nAbstractEngraver.prototype.createABCElement = function (isFirstStaff, isSingleLineStaff, voice, elem) {\n\tvar elemset = [];\n\tswitch (elem.el_type) {\n\t\tcase undefined:\n\t\t\t// it is undefined if we were passed an array in - an array means a set of notes that should be beamed together.\n\t\t\telemset = this.createBeam(isSingleLineStaff, voice, elem);\n\t\t\tbreak;\n\t\tcase \"note\":\n\t\t\telemset[0] = this.createNote(elem, false, isSingleLineStaff, voice);\n\t\t\tif (this.triplet && this.triplet.isClosed()) {\n\t\t\t\tvoice.addOther(this.triplet);\n\t\t\t\tthis.triplet = null;\n\t\t\t\tthis.tripletmultiplier = 1;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase \"bar\":\n\t\t\telemset[0] = this.createBarLine(voice, elem, isFirstStaff);\n\t\t\tif (voice.duplicate && elemset.length > 0) elemset[0].invisible = true;\n\t\t\t//\t elemset[0].addChild(writeMeasureWidth(voice));\n\t\t\tbreak;\n\t\tcase \"meter\":\n\t\t\telemset[0] = createTimeSignature(elem, this.tuneNumber);\n\t\t\tthis.startlimitelem = elemset[0]; // limit ties here\n\t\t\tif (voice.duplicate && elemset.length > 0) elemset[0].invisible = true;\n\t\t\tbreak;\n\t\tcase \"clef\":\n\t\t\telemset[0] = createClef(elem, this.tuneNumber);\n\t\t\tif (!elemset[0]) return null;\n\t\t\tif (voice.duplicate && elemset.length > 0) elemset[0].invisible = true;\n\t\t\tbreak;\n\t\tcase \"key\":\n\t\t\tvar absKey = createKeySignature(elem, this.tuneNumber);\n\t\t\tif (absKey) {\n\t\t\t\telemset[0] = absKey;\n\t\t\t\tthis.startlimitelem = elemset[0]; // limit ties here\n\t\t\t}\n\t\t\tif (voice.duplicate && elemset.length > 0) elemset[0].invisible = true;\n\t\t\tbreak;\n\t\tcase \"stem\":\n\t\t\tthis.stemdir = elem.direction === \"auto\" ? undefined : elem.direction;\n\t\t\tbreak;\n\t\tcase \"part\":\n\t\t\tvar abselem = new AbsoluteElement(elem, 0, 0, 'part', this.tuneNumber);\n\t\t\tvar dim = this.getTextSize.calc(elem.title, 'partsfont', \"part\");\n\t\t\tabselem.addFixedX(new RelativeElement(elem.title, 0, 0, undefined, { type: \"part\", height: dim.height / spacing.STEP }));\n\t\t\telemset[0] = abselem;\n\t\t\tbreak;\n\t\tcase \"tempo\":\n\t\t\tvar abselem3 = new AbsoluteElement(elem, 0, 0, 'tempo', this.tuneNumber);\n\t\t\tabselem3.addFixedX(new TempoElement(elem, this.tuneNumber, createNoteHead));\n\t\t\telemset[0] = abselem3;\n\t\t\tbreak;\n\t\tcase \"style\":\n\t\t\tif (elem.head === \"normal\")\n\t\t\t\tdelete this.style;\n\t\t\telse\n\t\t\t\tthis.style = elem.head;\n\t\t\tbreak;\n\t\tcase \"hint\":\n\t\t\thint = true;\n\t\t\tthis.saveState();\n\t\t\tbreak;\n\t\tcase \"midi\":\n\t\t\t// This has no effect on the visible music, so just skip it.\n\t\t\tbreak;\n\t\tcase \"scale\":\n\t\t\tthis.voiceScale = elem.size;\n\t\t\tbreak;\n\t\tcase \"color\":\n\t\t\tthis.voiceColor = elem.color;\n\t\t\tvoice.color = this.voiceColor;\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tvar abselem2 = new AbsoluteElement(elem, 0, 0, 'unsupported', this.tuneNumber);\n\t\t\tabselem2.addFixed(new RelativeElement(\"element type \" + elem.el_type, 0, 0, undefined, { type: \"debug\" }));\n\t\t\telemset[0] = abselem2;\n\t}\n\n\treturn elemset;\n};\n\nfunction setAveragePitch(elem) {\n\tif (elem.pitches) {\n\t\tsortPitch(elem);\n\t\tvar sum = 0;\n\t\tfor (var p = 0; p < elem.pitches.length; p++) {\n\t\t\tsum += elem.pitches[p].verticalPos;\n\t\t}\n\t\telem.averagepitch = sum / elem.pitches.length;\n\t\telem.minpitch = elem.pitches[0].verticalPos;\n\t\telem.maxpitch = elem.pitches[elem.pitches.length - 1].verticalPos;\n\t}\n}\n\nAbstractEngraver.prototype.createBeam = function (isSingleLineStaff, voice, elems) {\n\tvar abselemset = [];\n\n\tvar beamelem = new BeamElem(this.stemHeight * this.voiceScale, this.stemdir, this.flatBeams, elems[0]);\n\tif (hint) beamelem.setHint();\n\tfor (var i = 0; i < elems.length; i++) {\n\t\t// Do a first pass to figure out the stem direction before creating the notes, so that staccatos and other decorations can be placed correctly.\n\t\tbeamelem.runningDirection(elems[i])\n\t}\n\tbeamelem.setStemDirection()\n\tvar tempStemDir = this.stemdir\n\tthis.stemdir = beamelem.stemsUp ? 'up' : 'down'\n\tfor (i = 0; i < elems.length; i++) {\n\t\tvar elem = elems[i];\n\t\tvar abselem = this.createNote(elem, true, isSingleLineStaff, voice);\n\t\tabselemset.push(abselem);\n\t\tbeamelem.add(abselem);\n\t\tif (this.triplet && this.triplet.isClosed()) {\n\t\t\tvoice.addOther(this.triplet);\n\t\t\tthis.triplet = null;\n\t\t\tthis.tripletmultiplier = 1;\n\t\t}\n\t}\n\tbeamelem.calcDir();\n\tvoice.addBeam(beamelem);\n\tthis.stemdir = tempStemDir\n\treturn abselemset;\n};\n\nvar sortPitch = function (elem) {\n\tvar sorted;\n\tdo {\n\t\tsorted = true;\n\t\tfor (var p = 0; p < elem.pitches.length - 1; p++) {\n\t\t\tif (elem.pitches[p].pitch > elem.pitches[p + 1].pitch) {\n\t\t\t\tsorted = false;\n\t\t\t\tvar tmp = elem.pitches[p];\n\t\t\t\telem.pitches[p] = elem.pitches[p + 1];\n\t\t\t\telem.pitches[p + 1] = tmp;\n\t\t\t}\n\t\t}\n\t} while (!sorted);\n};\n\nvar ledgerLines = function (abselem, minPitch, maxPitch, isRest, symbolWidth, additionalLedgers, dir, dx, scale) {\n\tfor (var i = maxPitch; i > 11; i--) {\n\t\tif (i % 2 === 0 && !isRest) {\n\t\t\tabselem.addFixed(new RelativeElement(null, dx, (symbolWidth + 4) * scale, i, { type: \"ledger\" }));\n\t\t}\n\t}\n\n\tfor (i = minPitch; i < 1; i++) {\n\t\tif (i % 2 === 0 && !isRest) {\n\t\t\tabselem.addFixed(new RelativeElement(null, dx, (symbolWidth + 4) * scale, i, { type: \"ledger\" }));\n\t\t}\n\t}\n\n\tfor (i = 0; i < additionalLedgers.length; i++) { // PER: draw additional ledgers\n\t\tvar ofs = symbolWidth;\n\t\tif (dir === 'down') ofs = -ofs;\n\t\tabselem.addFixed(new RelativeElement(null, ofs + dx, (symbolWidth + 4) * scale, additionalLedgers[i], { type: \"ledger\" }));\n\t}\n};\n\nAbstractEngraver.prototype.addGraceNotes = function (elem, voice, abselem, notehead, stemHeight, isBagpipes, roomtaken) {\n\tvar gracescale = 3 / 5;\n\tvar graceScaleStem = 3.5 / 5; // TODO-PER: empirically found constant.\n\tstemHeight = Math.round(stemHeight * graceScaleStem);\n\tvar gracebeam = null;\n\tvar flag;\n\n\tif (elem.gracenotes.length > 1) {\n\t\tgracebeam = new BeamElem(stemHeight, \"grace\", isBagpipes);\n\t\tif (hint) gracebeam.setHint();\n\t\tgracebeam.mainNote = abselem;\t// this gives us a reference back to the note this is attached to so that the stems can be attached somewhere.\n\t}\n\n\tvar i;\n\tvar graceoffsets = [];\n\tfor (i = elem.gracenotes.length - 1; i >= 0; i--) { // figure out where to place each gracenote\n\t\troomtaken += 10;\n\t\tgraceoffsets[i] = roomtaken;\n\t\tif (elem.gracenotes[i].accidental) {\n\t\t\troomtaken += 7;\n\t\t}\n\t}\n\n\tfor (i = 0; i < elem.gracenotes.length; i++) {\n\t\tvar gracepitch = elem.gracenotes[i].verticalPos;\n\n\t\tflag = (gracebeam) ? null : chartable.uflags[(isBagpipes) ? 5 : 3];\n\t\tvar accidentalSlot = [];\n\t\tvar ret = createNoteHead(abselem, \"noteheads.quarter\", elem.gracenotes[i],\n\t\t\t{ dir: \"up\", headx: -graceoffsets[i], extrax: -graceoffsets[i], flag: flag, scale: gracescale * this.voiceScale, accidentalSlot: accidentalSlot });\n\t\tret.notehead.highestVert = ret.notehead.pitch + stemHeight;\n\t\tvar grace = ret.notehead;\n\t\tthis.addSlursAndTies(abselem, elem.gracenotes[i], grace, voice, \"up\", true);\n\n\t\tabselem.addExtra(grace);\n\t\t// PER: added acciaccatura slash\n\t\tif (elem.gracenotes[i].acciaccatura) {\n\t\t\tvar pos = elem.gracenotes[i].verticalPos + 7 * gracescale; // the same formula that determines the flag position.\n\t\t\tvar dAcciaccatura = gracebeam ? 5 : 6; // just an offset to make it line up correctly.\n\t\t\tabselem.addRight(new RelativeElement(\"flags.ugrace\", -graceoffsets[i] + dAcciaccatura, 0, pos, { scalex: gracescale, scaley: gracescale }));\n\t\t}\n\t\tif (gracebeam) { // give the beam the necessary info\n\t\t\tvar graceDuration = elem.gracenotes[i].duration / 2;\n\t\t\tif (isBagpipes) graceDuration /= 2;\n\t\t\tvar pseudoabselem = {\n\t\t\t\theads: [grace],\n\t\t\t\tabcelem: { averagepitch: gracepitch, minpitch: gracepitch, maxpitch: gracepitch, duration: graceDuration }\n\t\t\t};\n\t\t\tgracebeam.add(pseudoabselem);\n\t\t} else { // draw the stem\n\t\t\tvar p1 = gracepitch + 1 / 3 * gracescale;\n\t\t\tvar p2 = gracepitch + 7 * gracescale;\n\t\t\tvar dx = grace.dx + grace.w;\n\t\t\tvar width = -0.6;\n\t\t\tabselem.addExtra(new RelativeElement(null, dx, 0, p1, { \"type\": \"stem\", \"pitch2\": p2, linewidth: width }));\n\t\t}\n\t\tledgerLines(abselem, gracepitch, gracepitch, false, glyphs.getSymbolWidth(\"noteheads.quarter\"), [], true, grace.dx - 1, 0.6);\n\n\t\t// if this is the first grace note, we might want to start a slur.\n\t\t// there is a slur if graceSlurs is specifically set.\n\t\t// there is no slur if it is bagpipes.\n\t\t// there is not a slur if the element is a spacer or invisible rest.\n\t\tvar isInvisibleRest = elem.rest && (elem.rest.type === \"spacer\" || elem.rest.type === \"invisible\");\n\t\tif (i === 0 && !isBagpipes && this.graceSlurs && !isInvisibleRest) {\n\t\t\t// This is the overall slur that is under the grace notes.\n\t\t\tvoice.addOther(new TieElem({ anchor1: grace, anchor2: notehead, isGrace: true }));\n\t\t}\n\t}\n\n\tif (gracebeam) {\n\t\tgracebeam.calcDir();\n\t\tvoice.addBeam(gracebeam);\n\t}\n\treturn roomtaken;\n};\n\nfunction addRestToAbsElement(abselem, elem, duration, dot, isMultiVoice, stemdir, isSingleLineStaff, durlog, voiceScale) {\n\tvar c;\n\tvar restpitch = 7;\n\tvar noteHead;\n\tvar roomTaken;\n\tvar roomTakenRight;\n\n\tif (isMultiVoice) {\n\t\tif (stemdir === \"down\") restpitch = 3;\n\t\tif (stemdir === \"up\") restpitch = 11;\n\t}\n\t// There is special placement for the percussion staff. If there is one staff line, then move the rest position.\n\tif (isSingleLineStaff) {\n\t\t// The half and whole rests are attached to different lines normally, so we need to tweak their position to get them to both be attached to the same one.\n\t\tif (duration < 0.5)\n\t\t\trestpitch = 7;\n\t\telse if (duration < 1)\n\t\t\trestpitch = 7;\t// half rest\n\t\telse\n\t\t\trestpitch = 5; // whole rest\n\t}\n\tswitch (elem.rest.type) {\n\t\tcase \"whole\":\n\t\t\tc = chartable.rest[0];\n\t\t\telem.averagepitch = restpitch;\n\t\t\telem.minpitch = restpitch;\n\t\t\telem.maxpitch = restpitch;\n\t\t\tdot = 0;\n\t\t\tbreak;\n\t\tcase \"rest\":\n\t\t\tif (elem.style === \"rhythm\") // special case for rhythm: rests are a handy way to express the rhythm.\n\t\t\t\tc = chartable.rhythm[-durlog];\n\t\t\telse\n\t\t\t\tc = chartable.rest[-durlog];\n\t\t\telem.averagepitch = restpitch;\n\t\t\telem.minpitch = restpitch;\n\t\t\telem.maxpitch = restpitch;\n\t\t\tbreak;\n\t\tcase \"invisible\":\n\t\tcase \"invisible-multimeasure\":\n\t\tcase \"spacer\":\n\t\t\tc = \"\";\n\t\t\telem.averagepitch = restpitch;\n\t\t\telem.minpitch = restpitch;\n\t\t\telem.maxpitch = restpitch;\n\t\t\tbreak;\n\t\tcase \"multimeasure\":\n\t\t\tc = chartable.rest['multi'];\n\t\t\telem.averagepitch = restpitch;\n\t\t\telem.minpitch = restpitch;\n\t\t\telem.maxpitch = restpitch;\n\t\t\tdot = 0;\n\t\t\tvar mmWidth = glyphs.getSymbolWidth(c);\n\t\t\tabselem.addHead(new RelativeElement(c, mmWidth, mmWidth * 2, 7));\n\t\t\tvar numMeasures = new RelativeElement(\"\" + elem.rest.text, mmWidth, mmWidth, 16, { type: \"multimeasure-text\" });\n\t\t\tabselem.addExtra(numMeasures);\n\t}\n\tif (elem.rest.type.indexOf(\"multimeasure\") < 0 && elem.rest.type !== \"invisible\") {\n\t\tvar ret = createNoteHead(abselem, c, { verticalPos: restpitch },\n\t\t\t{ dot: dot, scale: voiceScale });\n\t\tnoteHead = ret.notehead;\n\t\tif (noteHead) {\n\t\t\tabselem.addHead(noteHead);\n\t\t\troomTaken = ret.accidentalshiftx;\n\t\t\troomTakenRight = ret.dotshiftx;\n\t\t}\n\t}\n\treturn { noteHead: noteHead, roomTaken: roomTaken, roomTakenRight: roomTakenRight };\n}\n\nfunction addIfNotExist(arr, item) {\n\tfor (var i = 0; i < arr.length; i++) {\n\t\tif (JSON.stringify(arr[i]) === JSON.stringify(item))\n\t\t\treturn;\n\t}\n\tarr.push(item);\n}\n\nAbstractEngraver.prototype.addNoteToAbcElement = function (abselem, elem, dot, stemdir, style, zeroDuration, durlog, nostem, voice) {\n\tvar dotshiftx = 0; // room taken by chords with displaced noteheads which cause dots to shift\n\tvar noteHead;\n\tvar roomTaken = 0;\n\tvar roomTakenRight = 0;\n\tvar min;\n\tvar i;\n\tvar additionalLedgers = [];\n\t// The accidentalSlot will hold a list of all the accidentals on this chord. Each element is a vertical place,\n\t// and contains a pitch, which is the last pitch that contains an accidental in that slot. The slots are numbered\n\t// from closest to the note to farther left. We only need to know the last accidental we placed because\n\t// we know that the pitches are sorted by now.\n\tvar accidentalSlot = [];\n\tvar symbolWidth = 0;\n\n\tvar dir = (elem.averagepitch >= 6) ? \"down\" : \"up\";\n\tif (stemdir) dir = stemdir;\n\n\tstyle = elem.style ? elem.style : style; // get the style of note head.\n\tif (!style || style === \"normal\") style = \"note\";\n\tvar noteSymbol;\n\tif (zeroDuration)\n\t\tnoteSymbol = chartable[style].nostem;\n\telse\n\t\tnoteSymbol = chartable[style][-durlog];\n\tif (!noteSymbol)\n\t\tconsole.log(\"noteSymbol:\", style, durlog, zeroDuration);\n\n\t// determine elements of chords which should be shifted\n\tvar p;\n\tfor (p = (dir === \"down\") ? elem.pitches.length - 2 : 1; (dir === \"down\") ? p >= 0 : p < elem.pitches.length; p = (dir === \"down\") ? p - 1 : p + 1) {\n\t\tvar prev = elem.pitches[(dir === \"down\") ? p + 1 : p - 1];\n\t\tvar curr = elem.pitches[p];\n\t\tvar delta = (dir === \"down\") ? prev.pitch - curr.pitch : curr.pitch - prev.pitch;\n\t\tif (delta <= 1 && !prev.printer_shift) {\n\t\t\tcurr.printer_shift = (delta) ? \"different\" : \"same\";\n\t\t\tif (curr.verticalPos > 11 || curr.verticalPos < 1) { // PER: add extra ledger line\n\t\t\t\tadditionalLedgers.push(curr.verticalPos - (curr.verticalPos % 2));\n\t\t\t}\n\t\t\tif (dir === \"down\") {\n\t\t\t\troomTaken = glyphs.getSymbolWidth(noteSymbol) + 2;\n\t\t\t} else {\n\t\t\t\tdotshiftx = glyphs.getSymbolWidth(noteSymbol) + 2;\n\t\t\t}\n\t\t}\n\t}\n\n\tvar pp = elem.pitches.length;\n\tfor (p = 0; p < elem.pitches.length; p++) {\n\n\t\tif (!nostem) {\n\t\t\tvar flag;\n\t\t\tif ((dir === \"down\" && p !== 0) || (dir === \"up\" && p !== pp - 1)) { // not the stemmed elem of the chord\n\t\t\t\tflag = null;\n\t\t\t} else {\n\t\t\t\tflag = chartable[(dir === \"down\") ? \"dflags\" : \"uflags\"][-durlog];\n\t\t\t}\n\t\t}\n\t\tvar c;\n\t\tif (elem.pitches[p].style) { // There is a style for the whole group of pitches, but there could also be an override for a particular pitch.\n\t\t\tc = chartable[elem.pitches[p].style][-durlog];\n\t\t} else if (voice.isPercussion && this.percmap) {\n\t\t\tc = noteSymbol;\n\t\t\tvar percHead = this.percmap[pitchesToPerc(elem.pitches[p])];\n\t\t\tif (percHead && percHead.noteHead) {\n\t\t\t\tif (chartable[percHead.noteHead])\n\t\t\t\t\tc = chartable[percHead.noteHead][-durlog];\n\t\t\t}\n\t\t} else\n\t\t\tc = noteSymbol;\n\t\t// The highest position for the sake of placing slurs is itself if the slur is internal. It is the highest position possible if the slur is for the whole chord.\n\t\t// If the note is the only one in the chord, then any slur it has counts as if it were on the whole chord.\n\t\telem.pitches[p].highestVert = elem.pitches[p].verticalPos;\n\t\tvar isTopWhenStemIsDown = (stemdir === \"up\" || dir === \"up\") && p === 0;\n\t\tvar isBottomWhenStemIsUp = (stemdir === \"down\" || dir === \"down\") && p === pp - 1;\n\t\tif (isTopWhenStemIsDown || isBottomWhenStemIsUp) { // place to put slurs if not already on pitches\n\n\t\t\tif (elem.startSlur || pp === 1) {\n\t\t\t\telem.pitches[p].highestVert = elem.pitches[pp - 1].verticalPos;\n\t\t\t\tif (getDuration(elem) < 1 && (stemdir === \"up\" || dir === \"up\"))\n\t\t\t\t\telem.pitches[p].highestVert += 6; // If the stem is up, then compensate for the length of the stem\n\t\t\t}\n\t\t\tif (elem.startSlur) {\n\t\t\t\tif (!elem.pitches[p].startSlur) elem.pitches[p].startSlur = []; //TODO possibly redundant, provided array is not optional\n\t\t\t\tfor (i = 0; i < elem.startSlur.length; i++) {\n\t\t\t\t\taddIfNotExist(elem.pitches[p].startSlur, elem.startSlur[i]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (elem.endSlur) {\n\t\t\t\telem.pitches[p].highestVert = elem.pitches[pp - 1].verticalPos;\n\t\t\t\tif (getDuration(elem) < 1 && (stemdir === \"up\" || dir === \"up\"))\n\t\t\t\t\telem.pitches[p].highestVert += 6; // If the stem is up, then compensate for the length of the stem\n\t\t\t\tif (!elem.pitches[p].endSlur) elem.pitches[p].endSlur = []; //TODO possibly redundant, provided array is not optional\n\t\t\t\tfor (i = 0; i < elem.endSlur.length; i++) {\n\t\t\t\t\taddIfNotExist(elem.pitches[p].endSlur, elem.endSlur[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tvar hasStem = !nostem && durlog <= -1;\n\t\tvar ret = createNoteHead(abselem, c, elem.pitches[p],\n\t\t\t{ dir: dir, extrax: -roomTaken, flag: flag, dot: dot, dotshiftx: dotshiftx, scale: this.voiceScale, accidentalSlot: accidentalSlot, shouldExtendStem: !stemdir, printAccidentals: !voice.isPercussion });\n\t\tsymbolWidth = Math.max(glyphs.getSymbolWidth(c), symbolWidth);\n\t\tabselem.extraw -= ret.extraLeft;\n\t\tnoteHead = ret.notehead;\n\t\tif (noteHead) {\n\t\t\tthis.addSlursAndTies(abselem, elem.pitches[p], noteHead, voice, hasStem ? dir : null, false);\n\n\t\t\tif (elem.gracenotes && elem.gracenotes.length > 0)\n\t\t\t\tnoteHead.bottom = noteHead.bottom - 1;\t // If there is a tie to the grace notes, leave a little more room for the note to avoid collisions.\n\t\t\tabselem.addHead(noteHead);\n\t\t}\n\t\troomTaken += ret.accidentalshiftx;\n\t\troomTakenRight = Math.max(roomTakenRight, ret.dotshiftx);\n\t}\n\n\t// draw stem from the furthest note to a pitch above/below the stemmed note\n\tif (hasStem) {\n\t\tvar stemHeight = Math.round(70 * this.voiceScale) / 10;\n\t\tvar p1 = (dir === \"down\") ? elem.minpitch - stemHeight : elem.minpitch + 1 / 3;\n\t\t// PER added stemdir test to make the line meet the note.\n\t\tif (p1 > 6 && !stemdir) p1 = 6;\n\t\tvar p2 = (dir === \"down\") ? elem.maxpitch - 1 / 3 : elem.maxpitch + stemHeight;\n\t\t// PER added stemdir test to make the line meet the note.\n\t\tif (p2 < 6 && !stemdir) p2 = 6;\n\t\tvar dx = (dir === \"down\" || abselem.heads.length === 0) ? 0 : abselem.heads[0].w;\n\t\tvar width = (dir === \"down\") ? 1 : -1;\n\t\t// TODO-PER-HACK: One type of note head has a different placement of the stem. This should be more generically calculated:\n\t\tif (noteHead && noteHead.c === 'noteheads.slash.quarter') {\n\t\t\tif (dir === 'down')\n\t\t\t\tp2 -= 1;\n\t\t\telse\n\t\t\t\tp1 += 1;\n\t\t}\n\t\tif (noteHead && noteHead.c === 'noteheads.triangle.quarter') {\n\t\t\tif (dir === 'down')\n\t\t\t\tp2 -= 0.7;\n\t\t\telse\n\t\t\t\tp1 -= 1.2;\n\t\t}\n\t\tabselem.addRight(new RelativeElement(null, dx, 0, p1, { \"type\": \"stem\", \"pitch2\": p2, linewidth: width, bottom: p1 - 1 }));\n\t\t//var RelativeElement = function RelativeElement(c, dx, w, pitch, opt) {\n\t\tmin = Math.min(p1, p2);\n\t}\n\treturn { noteHead: noteHead, roomTaken: roomTaken, roomTakenRight: roomTakenRight, min: min, additionalLedgers: additionalLedgers, dir: dir, symbolWidth: symbolWidth };\n};\n\nAbstractEngraver.prototype.addLyric = function (abselem, elem) {\n\tvar lyricStr = \"\";\n\telem.lyric.forEach(function (ly) {\n\t\tvar div = ly.divider === ' ' ? \"\" : ly.divider;\n\t\tlyricStr += ly.syllable + div + \"\\n\";\n\t});\n\tvar lyricDim = this.getTextSize.calc(lyricStr, 'vocalfont', \"lyric\");\n\tvar position = elem.positioning ? elem.positioning.vocalPosition : 'below';\n\tabselem.addCentered(new RelativeElement(lyricStr, 0, lyricDim.width, undefined, { type: \"lyric\", position: position, height: lyricDim.height / spacing.STEP, dim: this.getTextSize.attr('vocalfont', \"lyric\") }));\n};\n\nAbstractEngraver.prototype.createNote = function (elem, nostem, isSingleLineStaff, voice) { //stem presence: true for drawing stemless notehead\n\tvar notehead = null;\n\tvar roomtaken = 0; // room needed to the left of the note\n\tvar roomtakenright = 0; // room needed to the right of the note\n\tvar symbolWidth = 0;\n\tvar additionalLedgers = []; // PER: handle the case of [bc'], where the b doesn't have a ledger line\n\n\tvar dir;\n\n\tvar duration = getDuration(elem);\n\tvar zeroDuration = false;\n\tif (duration === 0) { zeroDuration = true; duration = 0.25; nostem = true; } //PER: zero duration will draw a quarter note head.\n\tvar durlog = Math.floor(Math.log(duration) / Math.log(2)); //TODO use getDurlog\n\tvar dot = 0;\n\n\tfor (var tot = Math.pow(2, durlog), inc = tot / 2; tot < duration; dot++, tot += inc, inc /= 2);\n\n\n\tif (elem.startTriplet) {\n\t\tthis.tripletmultiplier = elem.tripletMultiplier;\n\t}\n\n\tvar durationForSpacing = duration * this.tripletmultiplier;\n\tif (elem.rest && elem.rest.type === 'multimeasure')\n\t\tdurationForSpacing = 1;\n\tif (elem.rest && elem.rest.type === 'invisible-multimeasure')\n\t\tdurationForSpacing = this.measureLength * elem.rest.text;\n\tvar absType = elem.rest ? \"rest\" : \"note\";\n\tvar abselem = new AbsoluteElement(elem, durationForSpacing, 1, absType, this.tuneNumber, { durationClassOveride: elem.duration * this.tripletmultiplier });\n\tif (hint) abselem.setHint();\n\n\tif (elem.rest) {\n\t\tif (this.measureLength === duration && elem.rest.type !== 'invisible' && elem.rest.type !== 'spacer' && elem.rest.type.indexOf('multimeasure') < 0)\n\t\t\telem.rest.type = 'whole'; // If the rest is exactly a measure, always use a whole rest\n\t\tvar ret1 = addRestToAbsElement(abselem, elem, duration, dot, voice.voicetotal > 1, this.stemdir, isSingleLineStaff, durlog, this.voiceScale);\n\t\tnotehead = ret1.noteHead;\n\t\troomtaken = ret1.roomTaken;\n\t\troomtakenright = ret1.roomTakenRight;\n\t} else {\n\t\tvar ret2 = this.addNoteToAbcElement(abselem, elem, dot, this.stemdir, this.style, zeroDuration, durlog, nostem, voice);\n\t\tif (ret2.min !== undefined)\n\t\t\tthis.minY = Math.min(ret2.min, this.minY);\n\t\tnotehead = ret2.noteHead;\n\t\troomtaken = ret2.roomTaken;\n\t\troomtakenright = ret2.roomTakenRight;\n\t\tadditionalLedgers = ret2.additionalLedgers;\n\t\tdir = ret2.dir;\n\t\tsymbolWidth = ret2.symbolWidth;\n\t}\n\n\tif (elem.lyric !== undefined) {\n\t\tthis.addLyric(abselem, elem);\n\t}\n\n\tif (elem.gracenotes !== undefined) {\n\t\troomtaken += this.addGraceNotes(elem, voice, abselem, notehead, this.stemHeight * this.voiceScale, this.isBagpipes, roomtaken);\n\t}\n\n\tif (elem.decoration) {\n\t\t// TODO-PER: nostem is true if this is beamed. In that case we don't know where to place the decoration yet so just make a guess. This should be refactored to not place decorations until after the beams are determined.\n\t\t// This should probably be combined with moveDecorations()\n\t\tvar bottom = nostem && dir !== 'up' ? Math.min(-3, abselem.bottom - 6) : abselem.bottom\n\t\tthis.decoration.createDecoration(voice, elem.decoration, abselem.top, (notehead) ? notehead.w : 0, abselem, roomtaken, dir, bottom, elem.positioning, this.hasVocals, this.accentAbove);\n\t}\n\n\tif (elem.barNumber) {\n\t\tabselem.addFixed(new RelativeElement(elem.barNumber, -10, 0, 0, { type: \"barNumber\" }));\n\t}\n\n\t// ledger lines\n\tledgerLines(abselem, elem.minpitch, elem.maxpitch, elem.rest, symbolWidth, additionalLedgers, dir, -2, 1);\n\n\tif (elem.chord !== undefined) {\n\t\tvar ret3 = addChord(this.getTextSize, abselem, elem, roomtaken, roomtakenright, symbolWidth, this.jazzchords, this.germanAlphabet);\n\t\troomtaken = ret3.roomTaken;\n\t\troomtakenright = ret3.roomTakenRight;\n\t}\n\n\tif (elem.startTriplet) {\n\t\tthis.triplet = new TripletElem(elem.startTriplet, notehead, { flatBeams: this.flatBeams }); // above is opposite from case of slurs\n\t}\n\n\tif (elem.endTriplet && this.triplet) {\n\t\tthis.triplet.setCloseAnchor(notehead);\n\t}\n\n\tif (this.triplet && !elem.startTriplet && !elem.endTriplet && !(elem.rest && elem.rest.type === \"spacer\")) {\n\t\tthis.triplet.middleNote(notehead);\n\t}\n\n\treturn abselem;\n};\n\nAbstractEngraver.prototype.addSlursAndTies = function (abselem, pitchelem, notehead, voice, dir, isGrace) {\n\tif (pitchelem.endTie) {\n\t\tif (this.ties.length > 0) {\n\t\t\t// If there are multiple open ties, find the one that applies by matching the pitch, if possible.\n\t\t\tvar found = false;\n\t\t\tfor (var j = 0; j < this.ties.length; j++) {\n\t\t\t\tif (this.ties[j].anchor1 && this.ties[j].anchor1.pitch === notehead.pitch) {\n\t\t\t\t\tthis.ties[j].setEndAnchor(notehead);\n\t\t\t\t\tvoice.setRange(this.ties[j])\n\t\t\t\t\tthis.ties.splice(j, 1);\n\t\t\t\t\tfound = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!found) {\n\t\t\t\tthis.ties[0].setEndAnchor(notehead);\n\t\t\t\tvoice.setRange(this.ties[0])\n\t\t\t\tthis.ties.splice(0, 1);\n\t\t\t}\n\t\t}\n\t}\n\n\tvar voiceNumber = voice.voicetotal < 2 ? -1 : voice.voicenumber;\n\tif (pitchelem.startTie) {\n\t\tvar tie = new TieElem({ anchor1: notehead, force: (this.stemdir === \"down\" || this.stemdir === \"up\"), stemDir: this.stemdir, isGrace: isGrace, voiceNumber: voiceNumber, style: pitchelem.startTie.style });\n\t\tif (hint) tie.setHint();\n\n\t\tthis.ties[this.ties.length] = tie;\n\t\tvoice.addOther(tie);\n\t\t// HACK-PER: For the animation, we need to know if a note is tied to the next one, so here's a flag.\n\t\t// Unfortunately, only some of the notes in the current event might be tied, but this will consider it\n\t\t// tied if any one of them is. That will work for most cases.\n\t\tabselem.startTie = true;\n\t}\n\n\tvar slur;\n\tvar slurid;\n\tif (pitchelem.endSlur) {\n\t\tfor (var i = 0; i < pitchelem.endSlur.length; i++) {\n\t\t\tslurid = pitchelem.endSlur[i];\n\t\t\tif (this.slurs[slurid]) {\n\t\t\t\tslur = this.slurs[slurid];\n\t\t\t\tslur.setEndAnchor(notehead);\n\t\t\t\tvoice.setRange(slur)\n\t\t\t\tdelete this.slurs[slurid];\n\t\t\t} else {\n\t\t\t\tslur = new TieElem({ anchor2: notehead, stemDir: this.stemdir, voiceNumber: voiceNumber });\n\t\t\t\tif (hint) slur.setHint();\n\t\t\t\tvoice.addOther(slur);\n\t\t\t}\n\t\t\tif (this.startlimitelem) {\n\t\t\t\tslur.setStartX(this.startlimitelem);\n\t\t\t}\n\t\t}\n\t} else if (!isGrace) {\n\t\tfor (var s in this.slurs) {\n\t\t\tif (this.slurs.hasOwnProperty(s)) {\n\t\t\t\tthis.slurs[s].addInternalNote(notehead);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (pitchelem.startSlur) {\n\t\tfor (i = 0; i < pitchelem.startSlur.length; i++) {\n\t\t\tslurid = pitchelem.startSlur[i].label;\n\t\t\tslur = new TieElem({ anchor1: notehead, stemDir: this.stemdir, voiceNumber: voiceNumber, style: pitchelem.startSlur[i].style });\n\t\t\tif (hint) slur.setHint();\n\t\t\tthis.slurs[slurid] = slur;\n\t\t\tvoice.addOther(slur);\n\t\t}\n\t}\n};\n\nAbstractEngraver.prototype.addMeasureNumber = function (number, abselem) {\n\tvar measureNumDim = this.getTextSize.calc(number, \"measurefont\", 'bar-number');\n\tvar dx = 0;\n\tif (abselem.isClef) // If this is a clef rather than bar line, then the number shouldn't be centered because it could overlap the left side. This is an easy way to let it be centered but move it over, too.\n\t\tdx += measureNumDim.width / 2\n\t// MAE 1 Oct 2024 - Change 13 to 13.5 since previously bar numbers were very slightly overlapping the top of the clef\n\tvar vert = measureNumDim.width > 10 && abselem.abcelem.type === \"treble\" ? 13.5 : 11\n\tabselem.addFixed(new RelativeElement(number, dx, measureNumDim.width, vert + measureNumDim.height / spacing.STEP, { type: \"barNumber\", dim: this.getTextSize.attr(\"measurefont\", 'bar-number') }));\n};\n\nAbstractEngraver.prototype.createBarLine = function (voice, elem, isFirstStaff) {\n\t// bar_thin, bar_thin_thick, bar_thin_thin, bar_thick_thin, bar_right_repeat, bar_left_repeat, bar_double_repeat\n\n\tvar abselem = new AbsoluteElement(elem, 0, 10, 'bar', this.tuneNumber);\n\tvar anchor = null; // place to attach part lines\n\tvar dx = 0;\n\n\tif (elem.barNumber) {\n\t\tthis.addMeasureNumber(elem.barNumber, abselem);\n\t}\n\n\n\tvar firstdots = (elem.type === \"bar_right_repeat\" || elem.type === \"bar_dbl_repeat\");\n\tvar firstthin = (elem.type !== \"bar_left_repeat\" && elem.type !== \"bar_thick_thin\" && elem.type !== \"bar_invisible\");\n\tvar thick = (elem.type === \"bar_right_repeat\" || elem.type === \"bar_dbl_repeat\" || elem.type === \"bar_left_repeat\" ||\n\t\telem.type === \"bar_thin_thick\" || elem.type === \"bar_thick_thin\");\n\tvar secondthin = (elem.type === \"bar_left_repeat\" || elem.type === \"bar_thick_thin\" || elem.type === \"bar_thin_thin\" || elem.type === \"bar_dbl_repeat\");\n\tvar seconddots = (elem.type === \"bar_left_repeat\" || elem.type === \"bar_dbl_repeat\");\n\n\t// limit positioning of slurs\n\tif (firstdots || seconddots) {\n\t\tfor (var slur in this.slurs) {\n\t\t\tif (this.slurs.hasOwnProperty(slur)) {\n\t\t\t\tthis.slurs[slur].setEndX(abselem);\n\t\t\t}\n\t\t}\n\t\tthis.startlimitelem = abselem;\n\t}\n\n\tif (firstdots) {\n\t\tabselem.addRight(new RelativeElement(\"dots.dot\", dx, 1, 7));\n\t\tabselem.addRight(new RelativeElement(\"dots.dot\", dx, 1, 5));\n\t\tdx += 6; //2 hardcoded, twice;\n\t}\n\n\tif (firstthin) {\n\t\tanchor = new RelativeElement(null, dx, 1, 2, { \"type\": \"bar\", \"pitch2\": 10, linewidth: 0.6 });\n\t\tabselem.addRight(anchor);\n\t}\n\n\tif (elem.type === \"bar_invisible\") {\n\t\tanchor = new RelativeElement(null, dx, 1, 2, { \"type\": \"none\", \"pitch2\": 10, linewidth: 0.6 });\n\t\tabselem.addRight(anchor);\n\t}\n\n\tif (elem.decoration) {\n\t\tthis.decoration.createDecoration(voice, elem.decoration, 12, (thick) ? 3 : 1, abselem, 0, \"down\", 2, elem.positioning, this.hasVocals, this.accentAbove);\n\t}\n\n\tif (thick) {\n\t\tdx += 4; //3 hardcoded;\n\t\tanchor = new RelativeElement(null, dx, 4, 2, { \"type\": \"bar\", \"pitch2\": 10, linewidth: 4 });\n\t\tabselem.addRight(anchor);\n\t\tdx += 5;\n\t}\n\n\t// if (this.partstartelem && (thick || (firstthin && secondthin))) { // means end of nth part\n\t// this.partstartelem.anchor2=anchor;\n\t// this.partstartelem = null;\n\t// }\n\n\tif (this.partstartelem && elem.endEnding) {\n\t\tthis.partstartelem.anchor2 = anchor;\n\t\tthis.partstartelem = null;\n\t}\n\n\tif (secondthin) {\n\t\tdx += 3; //3 hardcoded;\n\t\tanchor = new RelativeElement(null, dx, 1, 2, { \"type\": \"bar\", \"pitch2\": 10, linewidth: 0.6 });\n\t\tabselem.addRight(anchor); // 3 is hardcoded\n\t}\n\n\tif (seconddots) {\n\t\tdx += 3; //3 hardcoded;\n\t\tabselem.addRight(new RelativeElement(\"dots.dot\", dx, 1, 7));\n\t\tabselem.addRight(new RelativeElement(\"dots.dot\", dx, 1, 5));\n\t} // 2 is hardcoded\n\n\tif (elem.startEnding && isFirstStaff) { // only put the first & second ending marks on the first staff\n\t\tvar textWidth = this.getTextSize.calc(elem.startEnding, \"repeatfont\", '').width;\n\t\tabselem.minspacing += textWidth + 10; // Give plenty of room for the ending number.\n\t\tthis.partstartelem = new EndingElem(elem.startEnding, anchor, null);\n\t\tvoice.addOther(this.partstartelem);\n\t}\n\n\t// Add a little space to the left of the bar line so that nothing can crowd it.\n\tabselem.extraw -= 5;\n\n\tif (elem.chord !== undefined) {\n\t\tvar ret3 = addChord(this.getTextSize, abselem, elem, 0, 0, 0, false, this.germanAlphabet);\n\t}\n\n\treturn abselem;\n\n};\n\nmodule.exports = AbstractEngraver;\n","// abc_voice_element.js: Definition of the VoiceElement class.\n\n/*global module */\n\nvar svgNS = \"http://www.w3.org/2000/svg\";\n\nfunction Svg(wrapper) {\n\tthis.svg = createSvg();\n\tthis.currentGroup = [];\n\twrapper.appendChild(this.svg);\n}\n\nSvg.prototype.clear = function () {\n\tif (this.svg) {\n\t\tvar wrapper = this.svg.parentNode;\n\t\tthis.svg = createSvg();\n\t\tthis.currentGroup = [];\n\t\tif (wrapper) {\n\t\t\t// TODO-PER: If the wrapper is not present, then the underlying div was pulled out from under this instance. It's possible that is still useful (for creating the music off page?)\n\t\t\twrapper.innerHTML = \"\";\n\t\t\twrapper.appendChild(this.svg);\n\t\t}\n\t}\n};\n\nSvg.prototype.setTitle = function (title) {\n\tvar titleEl = document.createElement(\"title\");\n\tvar titleNode = document.createTextNode(title);\n\ttitleEl.appendChild(titleNode);\n\tthis.svg.insertBefore(titleEl, this.svg.firstChild);\n};\n\nSvg.prototype.setResponsiveWidth = function (w, h) {\n\t// this technique is from: http://thenewcode.com/744/Make-SVG-Responsive, thx to https://github.com/iantresman\n\tthis.svg.setAttribute(\"viewBox\", \"0 0 \" + w + \" \" + h);\n\tthis.svg.setAttribute(\"preserveAspectRatio\", \"xMinYMin meet\");\n\tthis.svg.removeAttribute(\"height\");\n\tthis.svg.removeAttribute(\"width\");\n\tthis.svg.style['display'] = \"inline-block\";\n\tthis.svg.style['position'] = \"absolute\";\n\tthis.svg.style['top'] = \"0\";\n\tthis.svg.style['left'] = \"0\";\n\n\tif (this.svg.parentNode) {\n\t\tvar cls = this.svg.parentNode.getAttribute(\"class\");\n\t\tif (!cls)\n\t\t\tthis.svg.parentNode.setAttribute(\"class\", \"abcjs-container\");\n\t\telse if (cls.indexOf(\"abcjs-container\") < 0)\n\t\t\tthis.svg.parentNode.setAttribute(\"class\", cls + \" abcjs-container\");\n\t\tthis.svg.parentNode.style['display'] = \"inline-block\";\n\t\tthis.svg.parentNode.style['position'] = \"relative\";\n\t\tthis.svg.parentNode.style['width'] = \"100%\";\n\t\t// PER: I changed the padding from 100% to this through trial and error.\n\t\t// The example was using a square image, but this music might be either wider or taller.\n\t\tvar padding = h / w * 100;\n\t\tthis.svg.parentNode.style['padding-bottom'] = padding + \"%\";\n\t\tthis.svg.parentNode.style['vertical-align'] = \"middle\";\n\t\tthis.svg.parentNode.style['overflow'] = \"hidden\";\n\t}\n};\n\nSvg.prototype.setSize = function (w, h) {\n\tthis.svg.setAttribute('width', w);\n\tthis.svg.setAttribute('height', h);\n};\n\nSvg.prototype.setAttribute = function (attr, value) {\n\tthis.svg.setAttribute(attr, value);\n};\n\nSvg.prototype.setScale = function (scale) {\n\tif (scale !== 1) {\n\t\tthis.svg.style.transform = \"scale(\" + scale + \",\" + scale + \")\";\n\t\tthis.svg.style['-ms-transform'] = \"scale(\" + scale + \",\" + scale + \")\";\n\t\tthis.svg.style['-webkit-transform'] = \"scale(\" + scale + \",\" + scale + \")\";\n\t\tthis.svg.style['transform-origin'] = \"0 0\";\n\t\tthis.svg.style['-ms-transform-origin-x'] = \"0\";\n\t\tthis.svg.style['-ms-transform-origin-y'] = \"0\";\n\t\tthis.svg.style['-webkit-transform-origin-x'] = \"0\";\n\t\tthis.svg.style['-webkit-transform-origin-y'] = \"0\";\n\t} else {\n\t\tthis.svg.style.transform = \"\";\n\t\tthis.svg.style['-ms-transform'] = \"\";\n\t\tthis.svg.style['-webkit-transform'] = \"\";\n\t}\n};\n\nSvg.prototype.insertStyles = function (styles) {\n\tvar el = document.createElementNS(svgNS, \"style\");\n\tel.textContent = styles;\n\tthis.svg.insertBefore(el, this.svg.firstChild); // prepend is not available on older browsers.\n\t//\tthis.svg.prepend(el);\n};\n\nSvg.prototype.setParentStyles = function (attr) {\n\t// This is needed to get the size right when there is scaling involved.\n\tfor (var key in attr) {\n\t\tif (attr.hasOwnProperty(key)) {\n\t\t\tif (this.svg.parentNode)\n\t\t\t\tthis.svg.parentNode.style[key] = attr[key];\n\t\t}\n\t}\n\t// This is the last thing that gets called, so delete the temporary SVG if one was created\n\tif (this.dummySvg) {\n\t\tvar body = document.querySelector('body');\n\t\tbody.removeChild(this.dummySvg);\n\t\tthis.dummySvg = null;\n\t}\n\n};\n\nfunction constructHLine(x1, y1, x2) {\n\tvar len = x2 - x1;\n\treturn \"M \" + x1 + \" \" + y1 +\n\t\t\" l \" + len + ' ' + 0 +\n\t\t\" l \" + 0 + \" \" + 1 + \" \" +\n\t\t\" l \" + (-len) + \" \" + 0 + \" \" + \" z \";\n}\n\nfunction constructVLine(x1, y1, y2) {\n\tvar len = y2 - y1;\n\treturn \"M \" + x1 + \" \" + y1 +\n\t\t\" l \" + 0 + ' ' + len +\n\t\t\" l \" + 1 + \" \" + 0 + \" \" +\n\t\t\" l \" + 0 + \" \" + (-len) + \" \" + \" z \";\n}\n\nSvg.prototype.rect = function (attr) {\n\t// This uses path instead of rect so that it can be hollow and the color changes with \"fill\" instead of \"stroke\".\n\tvar lines = [];\n\tvar x1 = attr.x;\n\tvar y1 = attr.y;\n\tvar x2 = attr.x + attr.width;\n\tvar y2 = attr.y + attr.height;\n\tlines.push(constructHLine(x1, y1, x2));\n\tlines.push(constructHLine(x1, y2, x2));\n\tlines.push(constructVLine(x2, y1, y2));\n\tlines.push(constructVLine(x1, y2, y1));\n\n\treturn this.path({ path: lines.join(\" \"), stroke: \"none\", \"data-name\": attr[\"data-name\"] });\n};\n\nSvg.prototype.dottedLine = function (attr) {\n\tvar el = document.createElementNS(svgNS, 'line');\n\tel.setAttribute(\"x1\", attr.x1);\n\tel.setAttribute(\"x2\", attr.x2);\n\tel.setAttribute(\"y1\", attr.y1);\n\tel.setAttribute(\"y2\", attr.y2);\n\tel.setAttribute(\"stroke\", attr.stroke);\n\tel.setAttribute(\"stroke-dasharray\", \"5,5\");\n\tthis.svg.insertBefore(el, this.svg.firstChild);\n};\n\nSvg.prototype.rectBeneath = function (attr) {\n\tvar el = document.createElementNS(svgNS, 'rect');\n\tel.setAttribute(\"x\", attr.x);\n\tel.setAttribute(\"width\", attr.width);\n\tel.setAttribute(\"y\", attr.y);\n\tel.setAttribute(\"height\", attr.height);\n\tif (attr.stroke)\n\t\tel.setAttribute(\"stroke\", attr.stroke);\n\tif (attr['stroke-opacity'])\n\t\tel.setAttribute(\"stroke-opacity\", attr['stroke-opacity']);\n\tif (attr.fill)\n\t\tel.setAttribute(\"fill\", attr.fill);\n\tif (attr['fill-opacity'])\n\t\tel.setAttribute(\"fill-opacity\", attr['fill-opacity']);\n\tthis.svg.insertBefore(el, this.svg.firstChild);\n};\n\nSvg.prototype.text = function (text, attr, target) {\n\tvar el = document.createElementNS(svgNS, 'text');\n\tel.setAttribute(\"stroke\", \"none\");\n\tfor (var key in attr) {\n\t\tif (attr.hasOwnProperty(key)) {\n\t\t\tel.setAttribute(key, attr[key]);\n\t\t}\n\t}\n\tvar lines = (\"\" + text).split(\"\\n\");\n\tfor (var i = 0; i < lines.length; i++) {\n\t\tvar line = document.createElementNS(svgNS, 'tspan');\n\t\tline.setAttribute(\"x\", attr.x ? attr.x : 0);\n\t\tif (i !== 0)\n\t\t\tline.setAttribute(\"dy\", \"1.2em\");\n\t\tif (lines[i].indexOf(\"\\x03\") !== -1) {\n\t\t\tvar parts = lines[i].split('\\x03')\n\t\t\tline.textContent = parts[0];\n\t\t\tif (parts[1]) {\n\t\t\t\tvar ts2 = document.createElementNS(svgNS, 'tspan');\n\t\t\t\tts2.setAttribute(\"dy\", \"-0.3em\");\n\t\t\t\tts2.setAttribute(\"style\", \"font-size:0.7em\");\n\t\t\t\tts2.textContent = parts[1];\n\t\t\t\tline.appendChild(ts2);\n\t\t\t}\n\t\t\tif (parts[2]) {\n\t\t\t\tvar dist = parts[1] ? \"0.4em\" : \"0.1em\";\n\t\t\t\tvar ts3 = document.createElementNS(svgNS, 'tspan');\n\t\t\t\tts3.setAttribute(\"dy\", dist);\n\t\t\t\tts3.setAttribute(\"style\", \"font-size:0.7em\");\n\t\t\t\tts3.textContent = parts[2];\n\t\t\t\tline.appendChild(ts3);\n\t\t\t}\n\t\t} else\n\t\t\tline.textContent = lines[i];\n\t\tel.appendChild(line);\n\t}\n\tif (target)\n\t\ttarget.appendChild(el);\n\telse\n\t\tthis.append(el);\n\treturn el;\n};\n\nSvg.prototype.richTextLine = function (phrases, x, y, klass, anchor, target) {\n\tvar el = document.createElementNS(svgNS, 'text');\n\tel.setAttribute(\"stroke\", \"none\");\n\tel.setAttribute(\"class\", klass);\n\tel.setAttribute(\"x\", x);\n\tel.setAttribute(\"y\", y);\n\tel.setAttribute(\"text-anchor\", anchor);\n\tel.setAttribute(\"dominant-baseline\", \"middle\");\n\n\tfor (var i = 0; i < phrases.length; i++) {\n\t\tvar phrase = phrases[i]\n\t\tvar tspan = document.createElementNS(svgNS, 'tspan');\n\t\tvar attrs = Object.keys(phrase.attrs)\n\t\tfor (var j = 0; j < attrs.length; j++) {\n\t\t\tvar value = phrase.attrs[attrs[j]]\n\t\t\tif (value !== '')\n\t\t\t\ttspan.setAttribute(attrs[j], value)\n\t\t}\n\t\ttspan.textContent = phrase.content;\n\n\t\tel.appendChild(tspan);\n\t}\n\n\tif (target)\n\t\ttarget.appendChild(el);\n\telse\n\t\tthis.append(el);\n\treturn el;\n}\n\nSvg.prototype.guessWidth = function (text, attr) {\n\tvar svg = this.createDummySvg();\n\tvar el = this.text(text, attr, svg);\n\tvar size;\n\ttry {\n\t\tsize = el.getBBox();\n\t\tif (isNaN(size.height) || !size.height) // TODO-PER: I don't think this can happen unless there isn't a browser at all.\n\t\t\tsize = { width: attr['font-size'] / 2, height: attr['font-size'] + 2 }; // Just a wild guess.\n\t\telse\n\t\t\tsize = { width: size.width, height: size.height };\n\t} catch (ex) {\n\t\tsize = { width: attr['font-size'] / 2, height: attr['font-size'] + 2 }; // Just a wild guess.\n\t}\n\tsvg.removeChild(el);\n\treturn size;\n};\n\nSvg.prototype.createDummySvg = function () {\n\tif (!this.dummySvg) {\n\t\tthis.dummySvg = createSvg();\n\t\tvar styles = [\n\t\t\t\"display: block !important;\",\n\t\t\t\"height: 1px;\",\n\t\t\t\"width: 1px;\",\n\t\t\t\"position: absolute;\"\n\t\t];\n\t\tthis.dummySvg.setAttribute('style', styles.join(\"\"));\n\t\tvar body = document.querySelector('body');\n\t\tbody.appendChild(this.dummySvg);\n\t}\n\n\treturn this.dummySvg;\n};\n\nvar sizeCache = {};\n\nSvg.prototype.getTextSize = function (text, attr, el) {\n\tif (typeof text === 'number')\n\t\ttext = '' + text;\n\tif (!text || text.match(/^\\s+$/))\n\t\treturn { width: 0, height: 0 };\n\tvar key;\n\tif (text.length < 20) {\n\t\t// The short text tends to be repetitive and getBBox is really slow, so lets cache.\n\t\tkey = text + JSON.stringify(attr);\n\t\tif (sizeCache[key])\n\t\t\treturn sizeCache[key];\n\t}\n\tvar removeLater = !el;\n\tif (!el)\n\t\tel = this.text(text, attr);\n\tvar size;\n\ttry {\n\t\tsize = el.getBBox();\n\t\tif (isNaN(size.height) || !size.height)\n\t\t\tsize = this.guessWidth(text, attr);\n\t\telse\n\t\t\tsize = { width: size.width, height: size.height };\n\t} catch (ex) {\n\t\tsize = this.guessWidth(text, attr);\n\t}\n\tif (removeLater) {\n\t\tif (this.currentGroup.length > 0)\n\t\t\tthis.currentGroup[0].removeChild(el);\n\t\telse\n\t\t\tthis.svg.removeChild(el);\n\t}\n\tif (key)\n\t\tsizeCache[key] = size;\n\treturn size;\n};\n\nSvg.prototype.openGroup = function (options) {\n\toptions = options ? options : {};\n\tvar el = document.createElementNS(svgNS, \"g\");\n\tif (options.klass)\n\t\tel.setAttribute(\"class\", options.klass);\n\tif (options.fill)\n\t\tel.setAttribute(\"fill\", options.fill);\n\tif (options.stroke)\n\t\tel.setAttribute(\"stroke\", options.stroke);\n\tif (options['data-name'])\n\t\tel.setAttribute(\"data-name\", options['data-name']);\n\n\tif (options.prepend)\n\t\tthis.prepend(el);\n\telse\n\t\tthis.append(el);\n\tthis.currentGroup.unshift(el);\n\treturn el;\n};\n\nSvg.prototype.closeGroup = function () {\n\tvar g = this.currentGroup.shift();\n\tif (g && g.children.length === 0) {\n\t\t// If nothing was added to the group it is because all the elements were invisible. We don't need the group, then.\n\t\tg.parentElement.removeChild(g);\n\t\treturn null;\n\t}\n\treturn g;\n};\n\nSvg.prototype.path = function (attr) {\n\tvar el = document.createElementNS(svgNS, \"path\");\n\tfor (var key in attr) {\n\t\tif (attr.hasOwnProperty(key)) {\n\t\t\tif (key === 'path')\n\t\t\t\tel.setAttributeNS(null, 'd', attr.path);\n\t\t\telse if (key === 'klass')\n\t\t\t\tel.setAttributeNS(null, \"class\", attr[key]);\n\t\t\telse if (attr[key] !== undefined)\n\t\t\t\tel.setAttributeNS(null, key, attr[key]);\n\t\t}\n\t}\n\tthis.append(el);\n\treturn el;\n};\n\nSvg.prototype.pathToBack = function (attr) {\n\tvar el = document.createElementNS(svgNS, \"path\");\n\tfor (var key in attr) {\n\t\tif (attr.hasOwnProperty(key)) {\n\t\t\tif (key === 'path')\n\t\t\t\tel.setAttributeNS(null, 'd', attr.path);\n\t\t\telse if (key === 'klass')\n\t\t\t\tel.setAttributeNS(null, \"class\", attr[key]);\n\t\t\telse\n\t\t\t\tel.setAttributeNS(null, key, attr[key]);\n\t\t}\n\t}\n\tthis.prepend(el);\n\treturn el;\n};\n\nSvg.prototype.lineToBack = function (attr) {\n\tvar el = document.createElementNS(svgNS, 'line');\n\tvar keys = Object.keys(attr)\n\tfor (var i = 0; i < keys.length; i++)\n\t\tel.setAttribute(keys[i], attr[keys[i]]);\n\tthis.prepend(el);\n\treturn el;\n};\n\n\nSvg.prototype.append = function (el) {\n\tif (this.currentGroup.length > 0)\n\t\tthis.currentGroup[0].appendChild(el);\n\telse\n\t\tthis.svg.appendChild(el);\n};\n\nSvg.prototype.prepend = function (el) {\n\t// The entire group is prepended, so don't prepend the individual elements.\n\tif (this.currentGroup.length > 0)\n\t\tthis.currentGroup[0].appendChild(el);\n\telse\n\t\tthis.svg.insertBefore(el, this.svg.firstChild);\n};\n\nSvg.prototype.setAttributeOnElement = function (el, attr) {\n\tfor (var key in attr) {\n\t\tif (attr.hasOwnProperty(key)) {\n\t\t\tel.setAttributeNS(null, key, attr[key]);\n\t\t}\n\t}\n};\n\nSvg.prototype.moveElementToChild = function (parent, child) {\n\tparent.appendChild(child);\n};\n\nfunction createSvg() {\n\tvar svg = document.createElementNS(svgNS, \"svg\");\n\tsvg.setAttributeNS(\"http://www.w3.org/2000/xmlns/\", \"xmlns:xlink\", \"http://www.w3.org/1999/xlink\");\n\tsvg.setAttribute('role', 'img'); // for accessibility\n\tsvg.setAttribute('fill', 'currentColor'); // for automatically picking up dark mode and high contrast\n\tsvg.setAttribute('stroke', 'currentColor'); // for automatically picking up dark mode and high contrast\n\treturn svg;\n}\n\n\nmodule.exports = Svg;\n","// abc_renderer.js: API to render to SVG/Raphael/whatever rendering engine\n\n/*global Math */\n\nvar spacing = require('./helpers/spacing');\nvar Svg = require('./svg');\n\n/**\n * Implements the API for rendering ABCJS Abstract Rendering Structure to a canvas/paper (e.g. SVG, Raphael, etc)\n * @param {Object} paper\n */\nvar Renderer = function (paper) {\n\tthis.paper = new Svg(paper);\n\tthis.controller = null;\n\n\tthis.space = 3 * spacing.SPACE;\n\tthis.padding = {}; // renderer's padding is managed by the controller\n\tthis.reset();\n\tthis.firefox112 = navigator.userAgent.indexOf('Firefox/112.0') >= 0\n};\n\nRenderer.prototype.reset = function () {\n\n\tthis.paper.clear();\n\tthis.y = 0;\n\tthis.abctune = null;\n\tthis.path = null;\n\tthis.isPrint = false;\n\tthis.lineThickness = 0;\n\tthis.initVerticalSpace();\n};\n\nRenderer.prototype.newTune = function (abcTune) {\n\tthis.abctune = abcTune; // TODO-PER: this is just to get the font info.\n\tthis.setVerticalSpace(abcTune.formatting);\n\t//this.measureNumber = null;\n\t//this.noteNumber = null;\n\tthis.isPrint = abcTune.media === 'print';\n\tthis.setPadding(abcTune);\n};\n\nRenderer.prototype.setLineThickness = function (lineThickness) {\n\tthis.lineThickness = lineThickness\n};\n\nRenderer.prototype.setPaddingOverride = function (params) {\n\tthis.paddingOverride = {\n\t\ttop: params.paddingtop, bottom: params.paddingbottom,\n\t\tright: params.paddingright, left: params.paddingleft\n\t};\n};\n\nRenderer.prototype.setPadding = function (abctune) {\n\t// If the padding is set in the tune, then use that.\n\t// Otherwise, if the padding is set in the override, use that.\n\t// Otherwise, use the defaults (there are a different set of defaults for screen and print.)\n\tfunction setPaddingVariable(self, paddingKey, formattingKey, printDefault, screenDefault) {\n\t\tif (abctune.formatting[formattingKey] !== undefined)\n\t\t\tself.padding[paddingKey] = abctune.formatting[formattingKey];\n\t\telse if (self.paddingOverride[paddingKey] !== undefined)\n\t\t\tself.padding[paddingKey] = self.paddingOverride[paddingKey];\n\t\telse if (self.isPrint)\n\t\t\tself.padding[paddingKey] = printDefault;\n\t\telse\n\t\t\tself.padding[paddingKey] = screenDefault;\n\t}\n\t// 1cm x 0.393701in/cm x 72pt/in x 1.33px/pt = 38px\n\t// 1.8cm x 0.393701in/cm x 72pt/in x 1.33px/pt = 68px\n\tsetPaddingVariable(this, 'top', 'topmargin', 38, 15);\n\tsetPaddingVariable(this, 'bottom', 'botmargin', 38, 15);\n\tsetPaddingVariable(this, 'left', 'leftmargin', 68, 15);\n\tsetPaddingVariable(this, 'right', 'rightmargin', 68, 15);\n};\n\n/**\n * Some of the items on the page are not scaled, so adjust them in the opposite direction of scaling to cancel out the scaling.\n * @param {float} scale\n */\nRenderer.prototype.adjustNonScaledItems = function (scale) {\n\tthis.padding.top /= scale;\n\tthis.padding.bottom /= scale;\n\tthis.padding.left /= scale;\n\tthis.padding.right /= scale;\n\tthis.abctune.formatting.headerfont.size /= scale;\n\tthis.abctune.formatting.footerfont.size /= scale;\n};\n\n/**\n * Set the the values for all the configurable vertical space options.\n */\nRenderer.prototype.initVerticalSpace = function () {\n\t// conversion: 37.7953 = conversion factor for cm to px.\n\t// All of the following values are in px.\n\tthis.spacing = {\n\t\tcomposer: 7.56, // Set the vertical space above the composer.\n\t\tgraceBefore: 8.67, // Define the space before, inside and after the grace notes.\n\t\tgraceInside: 10.67,\n\t\tgraceAfter: 16,\n\t\tinfo: 0, // Set the vertical space above the infoline.\n\t\tlineSkipFactor: 1.1, // Set the factor for spacing between lines of text. (multiply this by the font size)\n\t\tmusic: 7.56, // Set the vertical space above the first staff.\n\t\tparagraphSkipFactor: 0.4, // Set the factor for spacing between text paragraphs. (multiply this by the font size)\n\t\tparts: 11.33, // Set the vertical space above a new part.\n\t\tslurHeight: 1.0, // Set the slur height factor.\n\t\tstaffSeparation: 61.33, // Do not put a staff system closer than <unit> from the previous system.\n\t\tstaffTopMargin: 0,\n\t\tstemHeight: 26.67 + 10, // Set the stem height.\n\t\tsubtitle: 3.78, // Set the vertical space above the subtitle.\n\t\tsystemStaffSeparation: 48, // Do not place the staves closer than <unit> inside a system. * This values applies to all staves when in the tune header. Otherwise, it applies to the next staff\n\t\ttext: 18.9, // Set the vertical space above the history.\n\t\ttitle: 7.56, // Set the vertical space above the title.\n\t\ttop: 30.24, //Set the vertical space above the tunes and on the top of the continuation pages.\n\t\tvocal: 0, // Set the vertical space above the lyrics under the staves.\n\t\twords: 0 // Set the vertical space above the lyrics at the end of the tune.\n\t};\n\t/*\n\tTODO-PER: Handle the x-coordinate spacing items, too.\nmaxshrink <float>Default: 0.65\nSet how much to compress horizontally when music line breaks\nare automatic.\n<float> must be between 0 (natural spacing)\nand 1 (max shrinking).\n\n// This next value is used to compute the natural spacing of\n// the notes. The base spacing of the crotchet is always\n// 40 pts. When the duration of a note type is twice the\n// duration of an other note type, its spacing is multiplied\n// by this factor.\n// The default value causes the note spacing to be multiplied\n// by 2 when its duration is multiplied by 4, i.e. the\n// space of the semibreve is 80 pts and the space of the\n// semiquaver is 20 pts.\n// Setting this value to 1 sets all note spacing to 40 pts.\nnoteSpacingFactor: 1.414, // Set the note spacing factor to <float> (range 1..2).\n\nscale <float> Default: 0.75 Set the page scale factor. Note that the header and footer are not scaled.\n\nstretchlast <float>Default: 0.8\nStretch the last music line of a tune when it exceeds\nthe <float> fraction of the page width.\n<float> range is 0.0 to 1.0.\n\t */\n};\n\nRenderer.prototype.setVerticalSpace = function (formatting) {\n\t// conversion from pts to px 4/3\n\tif (formatting.staffsep !== undefined)\n\t\tthis.spacing.staffSeparation = formatting.staffsep * 4 / 3;\n\tif (formatting.composerspace !== undefined)\n\t\tthis.spacing.composer = formatting.composerspace * 4 / 3;\n\tif (formatting.partsspace !== undefined)\n\t\tthis.spacing.parts = formatting.partsspace * 4 / 3;\n\tif (formatting.textspace !== undefined)\n\t\tthis.spacing.text = formatting.textspace * 4 / 3;\n\tif (formatting.musicspace !== undefined)\n\t\tthis.spacing.music = formatting.musicspace * 4 / 3;\n\tif (formatting.titlespace !== undefined)\n\t\tthis.spacing.title = formatting.titlespace * 4 / 3;\n\tif (formatting.sysstaffsep !== undefined)\n\t\tthis.spacing.systemStaffSeparation = formatting.sysstaffsep * 4 / 3;\n\tif (formatting.stafftopmargin !== undefined)\n\t\tthis.spacing.staffTopMargin = formatting.stafftopmargin * 4 / 3;\n\tif (formatting.subtitlespace !== undefined)\n\t\tthis.spacing.subtitle = formatting.subtitlespace * 4 / 3;\n\tif (formatting.topspace !== undefined)\n\t\tthis.spacing.top = formatting.topspace * 4 / 3;\n\tif (formatting.vocalspace !== undefined)\n\t\tthis.spacing.vocal = formatting.vocalspace * 4 / 3;\n\tif (formatting.wordsspace !== undefined)\n\t\tthis.spacing.words = formatting.wordsspace * 4 / 3;\n};\n\n\n/**\n * Calculates the y for a given pitch value (relative to the stave the renderer is currently printing)\n * @param {number} ofs pitch value (bottom C on a G clef = 0, D=1, etc.)\n */\nRenderer.prototype.calcY = function (ofs) {\n\treturn this.y - ofs * spacing.STEP;\n};\n\nRenderer.prototype.moveY = function (em, numLines) {\n\tif (numLines === undefined) numLines = 1;\n\tthis.y += em * numLines;\n};\n\nRenderer.prototype.absolutemoveY = function (y) {\n\tthis.y = y;\n};\n\nmodule.exports = Renderer;\n","function FreeText(info, vskip, getFontAndAttr, paddingLeft, width, getTextSize) {\n\tvar text = info.text;\n\tthis.rows = [];\n\tvar size;\n\tif (vskip)\n\t\tthis.rows.push({ move: vskip });\n\tvar hash = getFontAndAttr.calc('textfont', 'defined-text');\n\tif (text === \"\") {\t// we do want to print out blank lines if they have been specified.\n\t\tthis.rows.push({ move: hash.attr['font-size'] * 2 }); // move the distance of the line, plus the distance of the margin, which is also one line.\n\t} else if (typeof text === 'string') {\n\t\tthis.rows.push({ move: hash.attr['font-size'] / 2 }); // TODO-PER: move down some - the y location should be the top of the text, but we output text specifying the center line.\n\t\tthis.rows.push({ left: paddingLeft, text: text, font: 'textfont', klass: 'defined-text', anchor: \"start\", startChar: info.startChar, endChar: info.endChar, absElemType: \"freeText\", name: \"free-text\" });\n\t\tsize = getTextSize.calc(text, 'textfont', 'defined-text');\n\t\tthis.rows.push({ move: size.height });\n\t} else if (text) {\n\t\tvar maxHeight = 0;\n\t\tvar leftSide = paddingLeft;\n\t\tvar currentFont = 'textfont';\n\t\tfor (var i = 0; i < text.length; i++) {\n\t\t\tif (text[i].font) {\n\t\t\t\tcurrentFont = text[i].font;\n\t\t\t} else\n\t\t\t\tcurrentFont = 'textfont';\n\t\t\tthis.rows.push({ left: leftSide, text: text[i].text, font: currentFont, klass: 'defined-text', anchor: 'start', startChar: info.startChar, endChar: info.endChar, absElemType: \"freeText\", name: \"free-text\" });\n\t\t\tsize = getTextSize.calc(text[i].text, getFontAndAttr.calc(currentFont, 'defined-text').font, 'defined-text');\n\t\t\tleftSide += size.width + size.height / 2; // add a little padding to the right side. The height of the font is probably a close enough approximation.\n\t\t\tmaxHeight = Math.max(maxHeight, size.height)\n\t\t}\n\t\tthis.rows.push({ move: maxHeight });\n\t} else {\n\t\t// The structure is wrong here: it requires an array to do centering, but it shouldn't have.\n\t\tif (info.length === 1) {\n\t\t\tvar x = width / 2;\n\t\t\tthis.rows.push({ left: x, text: info[0].text, font: 'textfont', klass: 'defined-text', anchor: 'middle', startChar: info.startChar, endChar: info.endChar, absElemType: \"freeText\", name: \"free-text\" });\n\t\t\tsize = getTextSize.calc(info[0].text, 'textfont', 'defined-text');\n\t\t\tthis.rows.push({ move: size.height });\n\t\t}\n\t}\n}\n\nmodule.exports = FreeText;\n","function Separator(spaceAbove, lineLength, spaceBelow) {\n\tthis.rows = [];\n\tif (spaceAbove)\n\t\tthis.rows.push({ move: spaceAbove });\n\tthis.rows.push({ separator: lineLength, absElemType: \"separator\" });\n\tif (spaceBelow)\n\t\tthis.rows.push({ move: spaceBelow });\n}\n\nmodule.exports = Separator;\n","function Subtitle(spaceAbove, formatting, info, center, paddingLeft, getTextSize) {\n\tthis.rows = [];\n\tif (spaceAbove)\n\t\tthis.rows.push({ move: spaceAbove });\n\tvar tAnchor = formatting.titleleft ? 'start' : 'middle';\n\tvar tLeft = formatting.titleleft ? paddingLeft : center;\n\tthis.rows.push({ left: tLeft, text: info.text, font: 'subtitlefont', klass: 'text subtitle', anchor: tAnchor, startChar: info.startChar, endChar: info.endChar, absElemType: \"subtitle\", name: \"subtitle\" });\n\tvar size = getTextSize.calc(info.text, 'subtitlefont', 'text subtitle');\n\tthis.rows.push({ move: size.height });\n}\n\nmodule.exports = Subtitle;\n","function addTextIf(rows, params, getTextSize) {\n\tif (!params.text)\n\t\treturn;\n\tif (!params.marginLeft) params.marginLeft = 0;\n\tif (!params.klass) params.klass = '';\n\tif (!params.anchor) params.anchor = 'start';\n\tif (!params.info) params.info = { startChar: -2, endChar: -2 }\n\n\tif (params.marginTop)\n\t\trows.push({ move: params.marginTop });\n\tvar attr = { left: params.marginLeft, text: params.text, font: params.font, anchor: params.anchor, startChar: params.info.startChar, endChar: params.info.endChar, 'dominant-baseline': params['dominant-baseline'] };\n\tif (params.absElemType)\n\t\tattr.absElemType = params.absElemType;\n\tif (!params.inGroup && params.klass)\n\t\tattr.klass = params.klass;\n\tif (params.name)\n\t\tattr.name = params.name;\n\n\trows.push(attr);\n\t// If there are blank lines they won't be counted by getTextSize, so just get the height of one line and multiply\n\tvar size = getTextSize.calc(\"A\", params.font, params.klass);\n\tvar numLines = params.text.split(\"\\n\").length;\n\tif (params.text[params.text.length - 1] === '\\n')\n\t\tnumLines--; // If there is a new line at the end of the string, then an extra line will be counted.\n\tif (!params.noMove) {\n\t\tvar h = (size.height * 1.1) * numLines;\n\t\trows.push({ move: Math.round(h) });\n\t\tif (params.marginBottom)\n\t\t\trows.push({ move: params.marginBottom });\n\t}\n}\n\nmodule.exports = addTextIf;\n","const addTextIf = require(\"../add-text-if\");\n\nfunction richText(rows, str, defFont, klass, name, paddingLeft, attr, getTextSize) {\n\tvar space = getTextSize.calc(\"i\", defFont, klass);\n\tif (str === '') {\n\t\trows.push({ move: space.height });\n\t} else {\n\t\tif (typeof str === 'string') {\n\t\t\taddTextIf(rows, { marginLeft: paddingLeft, text: str, font: defFont, klass: klass, marginTop: attr.marginTop, anchor: attr.anchor, absElemType: attr.absElemType, info: attr.info, name: name }, getTextSize);\n\t\t\treturn\n\t\t}\n\t\tif (attr.marginTop)\n\t\t\trows.push({move: attr.marginTop})\n\n\t\tvar largestY = 0;\n\t\tvar gap = 0;\n\t\tvar row = {\n\t\t\tleft: paddingLeft,\n\t\t\tanchor: attr.anchor,\n\t\t\tphrases: []\n\t\t}\n\t\tif (klass)\n\t\t\trow.klass = klass\n\t\trows.push(row)\n\t\tfor (var k = 0; k < str.length; k++) {\n\t\t\tvar thisWord = str[k];\n\t\t\tvar font = (thisWord.font) ? thisWord.font : getTextSize.attr(defFont, klass).font;\n\t\t\tvar phrase = {\n\t\t\t\tcontent: thisWord.text,\n\t\t\t}\n\t\t\tif (font)\n\t\t\t\tphrase.attrs = {\n\t\t\t\t\t\"font-family\": getTextSize.getFamily(font.face),\n\t\t\t\t\t\"font-size\": font.size,\n\t\t\t\t\t\"font-weight\": font.weight,\n\t\t\t\t\t\"font-style\": font.style,\n\t\t\t\t\t\"font-decoration\": font.decoration,\n\t\t\t}\n\t\t\t//if (thisWord.text) {\n\t\t\t\trow.phrases.push(phrase);\n\t\t\t\tvar size = getTextSize.calc(thisWord.text, font, klass);\n\t\t\t\tlargestY = Math.max(largestY, size.height);\n\t\t\t\tif (thisWord.text[thisWord.text.length - 1] === ' ') {\n\t\t\t\t\tgap = space.width\n\t\t\t\t}\n\t\t}\n\t\trows.push({ move: largestY });\n\t}\n}\n\nmodule.exports = richText;\n","const addTextIf = require(\"../add-text-if\");\nconst richText = require(\"./rich-text\");\n\nfunction TopText(metaText, metaTextInfo, formatting, lines, width, isPrint, paddingLeft, spacing, shouldAddClasses, getTextSize) {\n\tthis.rows = [];\n\n\tif (metaText.header && isPrint) {\n\t\t// Note: whether there is a header or not doesn't change any other positioning, so this doesn't change the Y-coordinate.\n\t\t// This text goes above the margin, so we'll temporarily move up.\n\t\tvar headerTextHeight = getTextSize.calc(\"X\", \"headerfont\", 'abcjs-header abcjs-meta-top').height;\n\t\taddTextIf(this.rows, { marginLeft: paddingLeft, text: metaText.header.left, font: 'headerfont', klass: 'header meta-top', marginTop: -headerTextHeight, info: metaTextInfo.header, name: \"header\" }, getTextSize);\n\t\taddTextIf(this.rows, { marginLeft: paddingLeft + width / 2, text: metaText.header.center, font: 'headerfont', klass: 'header meta-top', marginTop: -headerTextHeight, anchor: 'middle', info: metaTextInfo.header, name: \"header\" }, getTextSize);\n\t\taddTextIf(this.rows, { marginLeft: paddingLeft + width, text: metaText.header.right, font: 'headerfont', klass: 'header meta-top', marginTop: -headerTextHeight, anchor: 'end', info: metaTextInfo.header, name: \"header\" }, getTextSize);\n\n\t\t//\t\tTopText.prototype.addTextIf = function (marginLeft, text, font, klass, marginTop, marginBottom, anchor, getTextSize, absElemType, noMove) {\n\t}\n\tif (isPrint)\n\t\tthis.rows.push({ move: spacing.top });\n\tvar tAnchor = formatting.titleleft ? 'start' : 'middle';\n\tvar tLeft = formatting.titleleft ? paddingLeft : paddingLeft + width / 2;\n\tif (metaText.title) {\n\t\tvar klass = shouldAddClasses ? 'abcjs-title' : ''\n\t\trichText(this.rows, metaText.title, \"titlefont\", klass, 'title', tLeft, {marginTop: spacing.title, anchor: tAnchor, absElemType: \"title\", info: metaTextInfo.title}, getTextSize)\n\t}\n\tif (lines.length) {\n\t\tvar index = 0;\n\t\twhile (index < lines.length && lines[index].subtitle) {\n\t\t\tvar klass = shouldAddClasses ? 'abcjs-text abcjs-subtitle' : ''\n\t\t\trichText(this.rows, lines[index].subtitle.text, \"subtitlefont\", klass, 'subtitle', tLeft, {marginTop: spacing.subtitle, anchor: tAnchor, absElemType: \"subtitle\", info: lines[index].subtitle}, getTextSize)\n\t\t\tindex++;\n\t\t}\n\t}\n\n\tif (metaText.rhythm || metaText.origin || metaText.composer) {\n\t\tthis.rows.push({ move: spacing.composer });\n\t\tif (metaText.rhythm && metaText.rhythm.length > 0) {\n\t\t\tvar noMove = !!(metaText.composer || metaText.origin);\n\t\t\tvar klass = shouldAddClasses ? 'abcjs-rhythm' : ''\n\t\t\taddTextIf(this.rows, { marginLeft: paddingLeft, text: metaText.rhythm, font: 'infofont', klass: klass, absElemType: \"rhythm\", noMove: noMove, info: metaTextInfo.rhythm, name: \"rhythm\" }, getTextSize);\n\t\t}\n\t\tvar hasSimpleComposerLine = true\n\t\tif (metaText.composer && typeof metaText.composer !== 'string')\n\t\t\thasSimpleComposerLine = false\n\t\tif (metaText.origin && typeof metaText.origin !== 'string')\n\t\t\thasSimpleComposerLine = false\n\t\t\t\n\t\tvar composerLine = metaText.composer ? metaText.composer : '';\n\t\tif (metaText.origin) {\n\t\t\tif (typeof composerLine === 'string' && typeof metaText.origin === 'string')\n\t\t\t\tcomposerLine += ' (' + metaText.origin + ')';\n\t\t\telse if (typeof composerLine === 'string' && typeof metaText.origin !== 'string') {\n\t\t\t\tcomposerLine = [{text:composerLine}]\n\t\t\t\tcomposerLine.push({text:\" (\"})\n\t\t\t\tcomposerLine = composerLine.concat(metaText.origin)\n\t\t\t\tcomposerLine.push({text:\")\"})\n\t\t\t} else {\n\t\t\t\tcomposerLine.push({text:\" (\"})\n\t\t\t\tcomposerLine = composerLine.concat(metaText.origin)\n\t\t\t\tcomposerLine.push({text:\")\"})\n\t\t\t}\n\t\t}\n\t\tif (composerLine) {\n\t\t\tvar klass = shouldAddClasses ? 'abcjs-composer' : ''\n\t\t\trichText(this.rows, composerLine, 'composerfont', klass, \"composer\", paddingLeft+width, {anchor: \"end\", absElemType: \"composer\", info: metaTextInfo.composer, ingroup: true}, getTextSize)\n\t\t}\n\t}\n\n\tif (metaText.author && metaText.author.length > 0) {\n\t\tvar klass = shouldAddClasses ? 'abcjs-author' : ''\n\t\trichText(this.rows, metaText.author, 'composerfont', klass, \"author\", paddingLeft+width, {anchor: \"end\", absElemType: \"author\", info: metaTextInfo.author}, getTextSize)\n\t}\n\n\tif (metaText.partOrder && metaText.partOrder.length > 0) {\n\t\tvar klass = shouldAddClasses ? 'abcjs-part-order' : ''\n\t\trichText(this.rows, metaText.partOrder, 'partsfont', klass, \"part-order\", paddingLeft, {absElemType: \"partOrder\", info: metaTextInfo.partOrder, anchor: 'start'}, getTextSize)\n\n\t}\n}\n\nmodule.exports = TopText;\n","const addTextIf = require(\"../add-text-if\");\nconst richText = require(\"./rich-text\");\n\nfunction BottomText(metaText, width, isPrint, paddingLeft, spacing, shouldAddClasses, getTextSize) {\n\tthis.rows = [];\n\tif (metaText.unalignedWords && metaText.unalignedWords.length > 0)\n\t\tthis.unalignedWords(metaText.unalignedWords, paddingLeft, spacing, shouldAddClasses, getTextSize);\n\tthis.extraText(metaText, paddingLeft, spacing, shouldAddClasses, getTextSize);\n\tif (metaText.footer && isPrint)\n\t\tthis.footer(metaText.footer, width, paddingLeft, getTextSize);\n}\n\nBottomText.prototype.unalignedWords = function (unalignedWords, marginLeft, spacing, shouldAddClasses, getTextSize) {\n\tvar klass = shouldAddClasses ? 'abcjs-unaligned-words' : ''\n\tvar defFont = 'wordsfont';\n\tvar space = getTextSize.calc(\"i\", defFont, klass);\n\t\n\tthis.rows.push({ move: spacing.words });\n\t\n\taddMultiLine(this.rows, '', unalignedWords, marginLeft, defFont, \"unalignedWords\", \"unalignedWords\", klass, \"unalignedWords\", spacing, shouldAddClasses, getTextSize)\n\tthis.rows.push({ move: space.height });\n}\n\nfunction addSingleLine(rows, preface, text, marginLeft, klass, shouldAddClasses, getTextSize) {\n\tif (text) {\n\t\tif (preface) {\n\t\t\tif (typeof text === 'string')\n\t\t\t\ttext = preface + text\n\t\t\telse\n\t\t\t\ttext = [{text: preface}].concat(text)\n\t\t}\n\t\tklass = shouldAddClasses ? 'abcjs-extra-text '+klass : ''\n\t\trichText(rows, text, 'historyfont', klass, \"description\", marginLeft, {absElemType: \"extraText\", anchor: 'start'}, getTextSize)\n\t}\n\n}\n\nfunction addMultiLine(rows, preface, content, marginLeft, defFont, absElemType, groupName, klass, name, spacing, shouldAddClasses, getTextSize) {\n\tif (content) {\n\t\tklass = shouldAddClasses ? 'abcjs-extra-text '+klass : ''\n\t\tvar size = getTextSize.calc(\"A\", defFont, klass);\n\t\tif (typeof content === 'string') {\n\t\t\tif (preface)\n\t\t\t\tcontent = preface + \"\\n\" + content\n\t\t\taddTextIf(rows, { marginLeft: marginLeft, text: content, font: defFont, absElemType: \"extraText\", name: name, 'dominant-baseline': 'middle', klass: klass }, getTextSize);\n\t\t\t//rows.push({move: size.height*3/4})\n\t\t} else {\n\t\t\trows.push({ startGroup: groupName, klass: klass, name: name });\n\t\t\trows.push({move: spacing.info})\n\t\t\tif (preface) {\n\t\t\t\taddTextIf(rows, { marginLeft: marginLeft, text: preface, font: defFont, absElemType: \"extraText\", name: name, 'dominant-baseline': 'middle' }, getTextSize);\n\t\t\t\trows.push({move: size.height*3/4})\n\t\t\t}\n\n\t\t\tfor (var j = 0; j < content.length; j++) {\n\t\t\t\trichText(rows, content[j], defFont, '', name, marginLeft, {anchor: 'start'}, getTextSize)\n\t\t\t\t// TODO-PER: Hack! the string and rich lines should have used up the same amount of space without this.\n\t\t\t\tif (j < content.length-1 && typeof content[j] === 'string' && typeof content[j+1] !== 'string')\n\t\t\t\t\trows.push({move: size.height*3/4})\n\t\t\t}\n\t\t\trows.push({ endGroup: groupName, absElemType: absElemType, startChar: -1, endChar: -1, name: name });\n\t\t\trows.push({move: size.height})\n\t\t}\n\t}\n}\nBottomText.prototype.extraText = function (metaText, marginLeft, spacing, shouldAddClasses, getTextSize) {\n\taddSingleLine(this.rows, \"Book: \", metaText.book, marginLeft, 'abcjs-book', shouldAddClasses, getTextSize)\n\taddSingleLine(this.rows, \"Source: \", metaText.source, marginLeft, 'abcjs-source', shouldAddClasses, getTextSize)\n\taddSingleLine(this.rows, \"Discography: \", metaText.discography, marginLeft, 'abcjs-discography', shouldAddClasses, getTextSize)\n\n\taddMultiLine(this.rows, 'Notes:', metaText.notes, marginLeft, 'historyfont', \"extraText\", \"notes\", 'abcjs-notes', \"description\", spacing, shouldAddClasses, getTextSize)\n\n\taddSingleLine(this.rows, \"Transcription: \", metaText.transcription, marginLeft, 'abcjs-transcription', shouldAddClasses, getTextSize)\n\n\taddMultiLine(this.rows, \"History:\", metaText.history, marginLeft, 'historyfont', \"extraText\", \"history\", 'abcjs-history', \"description\", spacing, shouldAddClasses, getTextSize)\n\n\taddSingleLine(this.rows, \"Copyright: \", metaText['abc-copyright'], marginLeft, 'abcjs-copyright', shouldAddClasses, getTextSize)\n\taddSingleLine(this.rows, \"Creator: \", metaText['abc-creator'], marginLeft, 'abcjs-creator', shouldAddClasses, getTextSize)\n\taddSingleLine(this.rows, \"Edited By: \", metaText['abc-edited-by'], marginLeft, 'abcjs-edited-by', shouldAddClasses, getTextSize)\n\n}\n\nBottomText.prototype.footer = function (footer, width, paddingLeft, getTextSize) {\n\tvar klass = 'header meta-bottom';\n\tvar font = \"footerfont\";\n\tthis.rows.push({ startGroup: \"footer\", klass: klass });\n\t// Note: whether there is a footer or not doesn't change any other positioning, so this doesn't change the Y-coordinate.\n\taddTextIf(this.rows, { marginLeft: paddingLeft, text: footer.left, font: font, klass: klass, name: \"footer\" }, getTextSize);\n\taddTextIf(this.rows, { marginLeft: paddingLeft + width / 2, text: footer.center, font: font, klass: klass, anchor: 'middle', name: \"footer\" }, getTextSize);\n\taddTextIf(this.rows, { marginLeft: paddingLeft + width, text: footer.right, font: font, klass: klass, anchor: 'end', name: \"footer\" }, getTextSize);\n}\n\nmodule.exports = BottomText;\n","function findNumber(klass, match, target, name) {\n\tif (klass.indexOf(match) === 0) {\n\t\tvar value = klass.replace(match, '');\n\t\tvar num = parseInt(value, 10);\n\t\tif ('' + num === value)\n\t\t\ttarget[name] = num;\n\t}\n}\n\nfunction createAnalysis(target, ev) {\n\tvar classes = [];\n\tif (target.absEl.elemset) {\n\t\tvar classObj = {};\n\t\tfor (var j = 0; j < target.absEl.elemset.length; j++) {\n\t\t\tvar es = target.absEl.elemset[j];\n\t\t\tif (es) {\n\t\t\t\tvar klass = es.getAttribute(\"class\").split(' ');\n\t\t\t\tfor (var k = 0; k < klass.length; k++)\n\t\t\t\t\tclassObj[klass[k]] = true;\n\t\t\t}\n\t\t}\n\t\tfor (var kk = 0; kk < Object.keys(classObj).length; kk++)\n\t\t\tclasses.push(Object.keys(classObj)[kk]);\n\t}\n\tvar analysis = {};\n\tfor (var ii = 0; ii < classes.length; ii++) {\n\t\tfindNumber(classes[ii], \"abcjs-v\", analysis, \"voice\");\n\t\tfindNumber(classes[ii], \"abcjs-l\", analysis, \"line\");\n\t\tfindNumber(classes[ii], \"abcjs-m\", analysis, \"measure\");\n\t}\n\tif (target.staffPos)\n\t\tanalysis.staffPos = target.staffPos;\n\tvar closest = ev.target;\n\twhile (closest && closest.dataset && !closest.dataset.name && closest.tagName.toLowerCase() !== 'svg')\n\t\tclosest = closest.parentNode;\n\tvar parent = ev.target;\n\twhile (parent && parent.dataset && !parent.dataset.index && parent.tagName.toLowerCase() !== 'svg')\n\t\tparent = parent.parentNode;\n\tif (parent && parent.dataset) {\n\t\tanalysis.name = parent.dataset.name;\n\t\tanalysis.clickedName = closest.dataset.name;\n\t\tanalysis.parentClasses = parent.classList;\n\t}\n\tif (closest && closest.classList)\n\t\tanalysis.clickedClasses = closest.classList;\n\tanalysis.selectableElement = target.svgEl;\n\treturn {classes: classes, analysis: analysis}\n}\n\nmodule.exports = createAnalysis;\n","var spacing = require('../helpers/spacing');\nvar createAnalysis = require('./create-analysis');\n\nfunction setupSelection(engraver, svgs) {\n\tengraver.rangeHighlight = rangeHighlight;\n\tif (engraver.dragging) {\n\t\tfor (var h = 0; h < engraver.selectables.length; h++) {\n\t\t\tvar hist = engraver.selectables[h];\n\t\t\tif (hist.svgEl.getAttribute(\"selectable\") === \"true\") {\n\t\t\t\thist.svgEl.setAttribute(\"tabindex\", 0);\n\t\t\t\thist.svgEl.setAttribute(\"data-index\", h);\n\t\t\t\thist.svgEl.addEventListener(\"keydown\", keyboardDown.bind(engraver));\n\t\t\t\thist.svgEl.addEventListener(\"keyup\", keyboardSelection.bind(engraver));\n\t\t\t\thist.svgEl.addEventListener(\"focus\", elementFocused.bind(engraver));\n\t\t\t}\n\t\t}\n\t}\n\tfor (var i = 0; i < svgs.length; i++) {\n\t\tsvgs[i].addEventListener('touchstart', mouseDown.bind(engraver), { passive: true });\n\t\tsvgs[i].addEventListener('touchmove', mouseMove.bind(engraver), { passive: true });\n\t\tsvgs[i].addEventListener('touchend', mouseUp.bind(engraver), { passive: true });\n\t\tsvgs[i].addEventListener('mousedown', mouseDown.bind(engraver));\n\t\tsvgs[i].addEventListener('mousemove', mouseMove.bind(engraver));\n\t\tsvgs[i].addEventListener('mouseup', mouseUp.bind(engraver));\n\t}\n}\n\nfunction getCoord(ev) {\n\tvar scaleX = 1;\n\tvar scaleY = 1;\n\tvar svg = ev.target.closest('svg')\n\tvar yOffset = 0\n\n\t// when renderer.options.responsive === 'resize' the click coords are in relation to the HTML\n\t// element, we need to convert to the SVG viewBox coords\n\tif (svg && svg.viewBox && svg.viewBox.baseVal) { // Firefox passes null to this when no viewBox is given\n\t\t// Chrome makes these values null when no viewBox is given.\n\t\tif (svg.viewBox.baseVal.width !== 0)\n\t\t\tscaleX = svg.viewBox.baseVal.width / svg.clientWidth\n\t\tif (svg.viewBox.baseVal.height !== 0)\n\t\t\tscaleY = svg.viewBox.baseVal.height / svg.clientHeight\n\t\tyOffset = svg.viewBox.baseVal.y\n\t}\n\n\tvar svgClicked = ev.target && ev.target.tagName === \"svg\";\n\tvar x;\n\tvar y;\n\tif (svgClicked) {\n\t\tx = ev.offsetX;\n\t\ty = ev.offsetY;\n\t} else {\n\t\tx = ev.layerX;\n\t\ty = ev.layerY;\n\t}\n\n\tx = x * scaleX;\n\ty = y * scaleY;\n\t//console.log(x, y)\n\n\treturn [x, y + yOffset];\n}\n\nfunction elementFocused(ev) {\n\t// If there had been another element focused and is being dragged, then report that before setting the new element up.\n\tif (this.dragMechanism === \"keyboard\" && this.dragYStep !== 0 && this.dragTarget)\n\t\tnotifySelect.bind(this)(this.dragTarget, this.dragYStep, this.selectables.length, this.dragIndex, ev);\n\n\tthis.dragYStep = 0;\n}\n\nfunction keyboardDown(ev) {\n\t// Swallow the up and down arrow events - they will be used for dragging with the keyboard\n\tswitch (ev.keyCode) {\n\t\tcase 38:\n\t\tcase 40:\n\t\t\tev.preventDefault();\n\t}\n}\n\nfunction keyboardSelection(ev) {\n\t// \"this\" is the EngraverController because of the bind(this) when setting the event listener.\n\tvar handled = false;\n\tvar index = ev.target.dataset.index;\n\tswitch (ev.keyCode) {\n\t\tcase 13:\n\t\tcase 32:\n\t\t\thandled = true;\n\t\t\tthis.dragTarget = this.selectables[index];\n\t\t\tthis.dragIndex = index;\n\t\t\tthis.dragMechanism = \"keyboard\";\n\t\t\tmouseUp.bind(this)(ev);\n\t\t\tbreak;\n\t\tcase 38: // arrow up\n\t\t\thandled = true;\n\t\t\tthis.dragTarget = this.selectables[index];\n\t\t\tthis.dragIndex = index;\n\t\t\tif (this.dragTarget && this.dragTarget.isDraggable) {\n\t\t\t\tif (this.dragging && this.dragTarget.isDraggable)\n\t\t\t\t\tthis.dragTarget.absEl.highlight(undefined, this.dragColor);\n\t\t\t\tthis.dragYStep--;\n\t\t\t\tthis.dragTarget.svgEl.setAttribute(\"transform\", \"translate(0,\" + (this.dragYStep * spacing.STEP) + \")\");\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 40: // arrow down\n\t\t\thandled = true;\n\t\t\tthis.dragTarget = this.selectables[index];\n\t\t\tthis.dragIndex = index;\n\t\t\tthis.dragMechanism = \"keyboard\";\n\t\t\tif (this.dragTarget && this.dragTarget.isDraggable) {\n\t\t\t\tif (this.dragging && this.dragTarget.isDraggable)\n\t\t\t\t\tthis.dragTarget.absEl.highlight(undefined, this.dragColor);\n\t\t\t\tthis.dragYStep++;\n\t\t\t\tthis.dragTarget.svgEl.setAttribute(\"transform\", \"translate(0,\" + (this.dragYStep * spacing.STEP) + \")\");\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 9: // tab\n\t\t\t// This is losing focus - if there had been dragging, then do the callback\n\t\t\tif (this.dragYStep !== 0) {\n\t\t\t\tmouseUp.bind(this)(ev);\n\t\t\t}\n\t\t\tbreak;\n\t\tdefault:\n\t\t\t//console.log(ev);\n\t\t\tbreak;\n\t}\n\tif (handled)\n\t\tev.preventDefault();\n}\n\nfunction findElementInHistory(selectables, el) {\n\tif (!el)\n\t\treturn -1;\n\tfor (var i = 0; i < selectables.length; i++) {\n\t\tif (el.dataset.index === selectables[i].svgEl.dataset.index)\n\t\t\treturn i;\n\t}\n\treturn -1;\n}\n\nfunction findElementByCoord(self, x, y) {\n\tvar minDistance = 9999999;\n\tvar closestIndex = -1;\n\tfor (var i = 0; i < self.selectables.length && minDistance > 0; i++) {\n\t\tvar el = self.selectables[i];\n\n\t\tself.getDim(el);\n\t\tif (el.dim.left < x && el.dim.right > x && el.dim.top < y && el.dim.bottom > y) {\n\t\t\t// See if it is a direct hit on an element - if so, definitely take it (there are no overlapping elements)\n\t\t\tclosestIndex = i;\n\t\t\tminDistance = 0;\n\t\t} else if (el.dim.top < y && el.dim.bottom > y) {\n\t\t\t// See if it is the same vertical as the element. Then the distance is the x difference\n\t\t\tvar horiz = Math.min(Math.abs(el.dim.left - x), Math.abs(el.dim.right - x));\n\t\t\tif (horiz < minDistance) {\n\t\t\t\tminDistance = horiz;\n\t\t\t\tclosestIndex = i;\n\t\t\t}\n\t\t} else if (el.dim.left < x && el.dim.right > x) {\n\t\t\t// See if it is the same horizontal as the element. Then the distance is the y difference\n\t\t\tvar vert = Math.min(Math.abs(el.dim.top - y), Math.abs(el.dim.bottom - y));\n\t\t\tif (vert < minDistance) {\n\t\t\t\tminDistance = vert;\n\t\t\t\tclosestIndex = i;\n\t\t\t}\n\t\t} else {\n\t\t\t// figure out the distance to this element.\n\t\t\tvar dx = Math.abs(x - el.dim.left) > Math.abs(x - el.dim.right) ? Math.abs(x - el.dim.right) : Math.abs(x - el.dim.left);\n\t\t\tvar dy = Math.abs(y - el.dim.top) > Math.abs(y - el.dim.bottom) ? Math.abs(y - el.dim.bottom) : Math.abs(y - el.dim.top);\n\t\t\tvar hypotenuse = Math.sqrt(dx * dx + dy * dy);\n\t\t\tif (hypotenuse < minDistance) {\n\t\t\t\tminDistance = hypotenuse;\n\t\t\t\tclosestIndex = i;\n\t\t\t}\n\t\t}\n\t}\n\treturn (closestIndex >= 0 && minDistance <= 12) ? closestIndex : -1;\n}\n\nfunction getBestMatchCoordinates(dim, ev, scale) {\n\t// Different browsers have conflicting meanings for the coordinates that are returned.\n\t// If the item we want is clicked on directly, then we will just see what is the best match.\n\t// This seems like less of a hack than browser sniffing.\n\tif (dim.x <= ev.offsetX && dim.x + dim.width >= ev.offsetX &&\n\t\tdim.y <= ev.offsetY && dim.y + dim.height >= ev.offsetY)\n\t\treturn [ev.offsetX, ev.offsetY];\n\t// Firefox returns a weird value for offset, but layer is correct.\n\t// Safari and Chrome return the correct value for offset, but layer is multiplied by the scale (that is, if it were rendered with { scale: 2 })\n\t// For instance (if scale is 2):\n\t// Firefox: { offsetY: 5, layerY: 335 }\n\t// Others: {offsetY: 335, layerY: 670} (there could be a little rounding, so the number might not be exactly 2x)\n\t// So, if layerY/scale is approx. offsetY, then use offsetY, otherwise use layerY\n\tvar epsilon = Math.abs(ev.layerY / scale - ev.offsetY);\n\tif (epsilon < 3)\n\t\treturn [ev.offsetX, ev.offsetY];\n\telse\n\t\treturn [ev.layerX, ev.layerY];\n}\n\nfunction getTarget(target) {\n\t// This searches up the dom for the first item containing the attribute \"selectable\", or stopping at the SVG.\n\tif (!target)\n\t\treturn null;\n\tif (target.tagName === \"svg\")\n\t\treturn target;\n\n\tif (!target.getAttribute)\n\t\treturn null;\t\n\tvar found = target.getAttribute(\"selectable\");\n\twhile (!found) {\n\t\tif (!target.parentElement)\n\t\t\tfound = true;\n\t\telse {\n\t\t\ttarget = target.parentElement;\n\t\t\tif (target.tagName === \"svg\")\n\t\t\t\tfound = true;\n\t\t\telse\n\t\t\t\tfound = target.getAttribute(\"selectable\");\n\t\t}\n\t}\n\treturn target;\n}\n\nfunction getMousePosition(self, ev) {\n\t// if the user clicked exactly on an element that we're interested in, then we already have the answer.\n\t// This is more reliable than the calculations because firefox returns different coords for offsetX, offsetY\n\tvar x;\n\tvar y;\n\tvar box;\n\tvar clickedOn = findElementInHistory(self.selectables, getTarget(ev.target));\n\tif (clickedOn >= 0) {\n\t\t// There was a direct hit on an element.\n\t\tbox = getBestMatchCoordinates(self.selectables[clickedOn].svgEl.getBBox(), ev, self.scale);\n\t\tx = box[0];\n\t\ty = box[1];\n\t\t//console.log(\"clicked on\", clickedOn, x, y, self.selectables[clickedOn].svgEl.getBBox(), ev.target.getBBox());\n\t} else {\n\t\t// See if they clicked close to an element.\n\t\tbox = getCoord(ev);\n\t\tx = box[0];\n\t\ty = box[1];\n\t\tclickedOn = findElementByCoord(self, x, y);\n\t\t//console.log(\"clicked near\", clickedOn, x, y, printEl(ev.target));\n\t}\n\treturn { x: x, y: y, clickedOn: clickedOn };\n}\n\nfunction attachMissingTouchEventAttributes(touchEv) {\n\tif (!touchEv || !touchEv.target || !touchEv.touches || touchEv.touches.length < 1)\n\t\treturn\n\tvar rect = touchEv.target.getBoundingClientRect();\n\tvar offsetX = touchEv.touches[0].pageX - rect.left;\n\tvar offsetY = touchEv.touches[0].pageY - rect.top;\n\n\ttouchEv.touches[0].offsetX = offsetX;\n\ttouchEv.touches[0].offsetY = offsetY;\n\n\ttouchEv.touches[0].layerX = touchEv.touches[0].pageX;\n\ttouchEv.touches[0].layerY = touchEv.touches[0].pageY;\n}\n\nfunction mouseDown(ev) {\n\t// \"this\" is the EngraverController because of the bind(this) when setting the event listener.\n\tvar _ev = ev;\n\tif (ev.type === 'touchstart') {\n\t\tattachMissingTouchEventAttributes(ev);\n\t\tif (ev.touches.length > 0)\n\t\t\t_ev = ev.touches[0];\n\t}\n\n\tvar positioning = getMousePosition(this, _ev);\n\n\t// Only start dragging if the user clicked close enough to an element and clicked with the main mouse button.\n\tif (positioning.clickedOn >= 0 && (ev.type === 'touchstart' || ev.button === 0) && this.selectables[positioning.clickedOn]) {\n\t\tthis.dragTarget = this.selectables[positioning.clickedOn];\n\t\tthis.dragIndex = positioning.clickedOn;\n\t\tthis.dragMechanism = \"mouse\";\n\t\tthis.dragMouseStart = { x: positioning.x, y: positioning.y };\n\t\tif (this.dragging && this.dragTarget.isDraggable) {\n\t\t\taddGlobalClass(this.renderer.paper, \"abcjs-dragging-in-progress\");\n\t\t\tthis.dragTarget.absEl.highlight(undefined, this.dragColor);\n\t\t}\n\t}\n}\n\nfunction mouseMove(ev) {\n\tvar _ev = ev;\n\tif (ev.type === 'touchmove') {\n\t\tattachMissingTouchEventAttributes(ev);\n\t\tif (ev.touches.length > 0)\n\t\t\t_ev = ev.touches[0];\n\t}\n\tthis.lastTouchMove = ev;\n\t// \"this\" is the EngraverController because of the bind(this) when setting the event listener.\n\n\tif (!this.dragTarget || !this.dragging || !this.dragTarget.isDraggable || this.dragMechanism !== 'mouse' || !this.dragMouseStart)\n\t\treturn;\n\n\tvar positioning = getMousePosition(this, _ev);\n\n\tvar yDist = Math.round((positioning.y - this.dragMouseStart.y) / spacing.STEP);\n\tif (yDist !== this.dragYStep) {\n\t\tthis.dragYStep = yDist;\n\t\tthis.dragTarget.svgEl.setAttribute(\"transform\", \"translate(0,\" + (yDist * spacing.STEP) + \")\");\n\t}\n}\n\nfunction mouseUp(ev) {\n\t// \"this\" is the EngraverController because of the bind(this) when setting the event listener.\n\tvar _ev = ev;\n\tif (ev.type === 'touchend' && this.lastTouchMove) {\n\t\tattachMissingTouchEventAttributes(this.lastTouchMove);\n\t\tif (this.lastTouchMove && this.lastTouchMove.touches && this.lastTouchMove.touches.length > 0)\n\t\t\t_ev = this.lastTouchMove.touches[0];\n\t}\n\n\tif (!this.dragTarget)\n\t\treturn;\n\n\tclearSelection.bind(this)();\n\tif (this.dragTarget.absEl && this.dragTarget.absEl.highlight) {\n\t\tthis.selected = [this.dragTarget.absEl];\n\t\tthis.dragTarget.absEl.highlight(undefined, this.selectionColor);\n\t}\n\n\tnotifySelect.bind(this)(this.dragTarget, this.dragYStep, this.selectables.length, this.dragIndex, _ev);\n\tif (this.dragTarget.svgEl && this.dragTarget.svgEl.focus) {\n\t\tthis.dragTarget.svgEl.focus();\n\t\tthis.dragTarget = null;\n\t\tthis.dragIndex = -1;\n\t}\n\tremoveGlobalClass(this.renderer.svg, \"abcjs-dragging-in-progress\");\n}\n\nfunction setSelection(dragIndex) {\n\tif (dragIndex >= 0 && dragIndex < this.selectables.length) {\n\t\tthis.dragTarget = this.selectables[dragIndex];\n\t\tthis.dragIndex = dragIndex;\n\t\tthis.dragMechanism = \"keyboard\";\n\t\tmouseUp.bind(this)({ target: this.dragTarget.svgEl });\n\t}\n}\n\n\nfunction notifySelect(target, dragStep, dragMax, dragIndex, ev) {\n\tvar ret = createAnalysis(target, ev)\n\tvar classes = ret.classes\n\tvar analysis = ret.analysis\n\n\tfor (var i = 0; i < this.listeners.length; i++) {\n\t\tthis.listeners[i](target.absEl.abcelem, target.absEl.tuneNumber, classes.join(' '), analysis, { step: dragStep, max: dragMax, index: dragIndex, setSelection: setSelection.bind(this) }, ev);\n\t}\n}\n\nfunction clearSelection() {\n\tfor (var i = 0; i < this.selected.length; i++) {\n\t\tthis.selected[i].unhighlight(undefined, this.renderer.foregroundColor);\n\t}\n\tthis.selected = [];\n}\n\nfunction rangeHighlight(start, end) {\n\tclearSelection.bind(this)();\n\tfor (var line = 0; line < this.staffgroups.length; line++) {\n\t\tvar voices = this.staffgroups[line].voices;\n\t\tfor (var voice = 0; voice < voices.length; voice++) {\n\t\t\tvar elems = voices[voice].children;\n\t\t\tfor (var elem = 0; elem < elems.length; elem++) {\n\t\t\t\t// Since the user can highlight more than an element, or part of an element, a hit is if any of the endpoints\n\t\t\t\t// is inside the other range.\n\t\t\t\tvar elStart = elems[elem].abcelem.startChar;\n\t\t\t\tvar elEnd = elems[elem].abcelem.endChar;\n\t\t\t\tif ((end > elStart && start < elEnd) || ((end === start) && end === elEnd)) {\n\t\t\t\t\t//\t\tif (elems[elem].abcelem.startChar>=start && elems[elem].abcelem.endChar<=end) {\n\t\t\t\t\tthis.selected[this.selected.length] = elems[elem];\n\t\t\t\t\telems[elem].highlight(undefined, this.selectionColor);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction getClassSet(el) {\n\tvar oldClass = el.getAttribute('class');\n\tif (!oldClass)\n\t\toldClass = \"\";\n\tvar klasses = oldClass.split(\" \");\n\tvar obj = {};\n\tfor (var i = 0; i < klasses.length; i++)\n\t\tobj[klasses[i]] = true;\n\treturn obj;\n}\n\nfunction setClassSet(el, klassSet) {\n\tvar klasses = [];\n\tfor (var key in klassSet) {\n\t\tif (klassSet.hasOwnProperty(key))\n\t\t\tklasses.push(key);\n\t}\n\tel.setAttribute('class', klasses.join(' '));\n}\n\nfunction addGlobalClass(svg, klass) {\n\tif (svg) {\n\t\tvar obj = getClassSet(svg.svg);\n\t\tobj[klass] = true;\n\t\tsetClassSet(svg.svg, obj);\n\t}\n}\n\nfunction removeGlobalClass(svg, klass) {\n\tif (svg) {\n\t\tvar obj = getClassSet(svg.svg);\n\t\tdelete obj[klass];\n\t\tsetClassSet(svg.svg, obj);\n\t}\n}\n\nmodule.exports = setupSelection;\n","function getBarYAt(startx, starty, endx, endy, x) {\n\treturn starty + (endy - starty) / (endx - startx) * (x - startx);\n}\n\nmodule.exports = getBarYAt;\n\n","var RelativeElement = require('../creation/elements/relative-element');\nvar spacing = require('../helpers/spacing');\nvar getBarYAt = require('./get-bar-y-at');\n\nvar layoutBeam = function (beam) {\n\tif (beam.elems.length === 0 || beam.allrests) return;\n\n\tvar dy = calcDy(beam.stemsUp, beam.isgrace); // This is the width of the beam line.\n\n\t// create the main beam\n\tvar firstElement = beam.elems[0];\n\tvar lastElement = beam.elems[beam.elems.length - 1];\n\tvar minStemHeight = 0; // The following is to leave space for \"!///!\" marks.\n\tvar referencePitch = beam.stemsUp ? firstElement.abcelem.maxpitch : firstElement.abcelem.minpitch;\n\tminStemHeight = minStem(firstElement, beam.stemsUp, referencePitch, minStemHeight);\n\tminStemHeight = minStem(lastElement, beam.stemsUp, referencePitch, minStemHeight);\n\tminStemHeight = Math.max(beam.stemHeight, minStemHeight + 3); // TODO-PER: The 3 is the width of a 16th beam. The actual height of the beam should be used instead.\n\tvar yPos = calcYPos(beam.average, beam.elems.length, minStemHeight, beam.stemsUp, firstElement.abcelem.averagepitch, lastElement.abcelem.averagepitch, beam.isflat, beam.min, beam.max, beam.isgrace);\n\tvar xPos = calcXPos(beam.stemsUp, firstElement, lastElement);\n\tbeam.addBeam({ startX: xPos[0], endX: xPos[1], startY: yPos[0], endY: yPos[1], dy: dy });\n\n\t// create the rest of the beams (in the case of 1/16th notes, etc.\n\tvar beams = createAdditionalBeams(beam.elems, beam.stemsUp, beam.beams[0], beam.isgrace, dy);\n\tfor (var i = 0; i < beams.length; i++)\n\t\tbeam.addBeam(beams[i]);\n\n\t// Now that the main beam is defined, we know how tall the stems should be, so create them and attach them to the original notes.\n\tcreateStems(beam.elems, beam.stemsUp, beam.beams[0], dy, beam.mainNote);\n};\n\nvar getDurlog = function (duration) {\n\t// TODO-PER: This is a hack to prevent a Chrome lockup. Duration should have been defined already,\n\t// but there's definitely a case where it isn't. [Probably something to do with triplets.]\n\tif (duration === undefined) {\n\t\treturn 0;\n\t}\n\t// console.log(\"getDurlog: \" + duration);\n\treturn Math.floor(Math.log(duration) / Math.log(2));\n};\n\n//\n// private functions\n//\nfunction minStem(element, stemsUp, referencePitch, minStemHeight) {\n\tif (!element.children)\n\t\treturn minStemHeight;\n\tfor (var i = 0; i < element.children.length; i++) {\n\t\tvar elem = element.children[i];\n\t\tif (stemsUp && elem.top !== undefined && elem.c === \"flags.ugrace\")\n\t\t\tminStemHeight = Math.max(minStemHeight, elem.top - referencePitch);\n\t\telse if (!stemsUp && elem.bottom !== undefined && elem.c === \"flags.ugrace\")\n\t\t\tminStemHeight = Math.max(minStemHeight, referencePitch - elem.bottom + 7); // The extra 7 is because we are measuring the slash from the top.\n\t}\n\treturn minStemHeight;\n}\n\nfunction calcSlant(leftAveragePitch, rightAveragePitch, numStems, isFlat) {\n\tif (isFlat)\n\t\treturn 0;\n\tvar slant = leftAveragePitch - rightAveragePitch;\n\tvar maxSlant = numStems / 2;\n\n\tif (slant > maxSlant) slant = maxSlant;\n\tif (slant < -maxSlant) slant = -maxSlant;\n\treturn slant;\n}\n\nfunction calcDy(asc, isGrace) {\n\tvar dy = (asc) ? spacing.STEP : -spacing.STEP;\n\tif (isGrace) dy = dy * 0.4;\n\treturn dy;\n}\n\nfunction calcXPos(asc, firstElement, lastElement) {\n\tvar starthead = firstElement.heads[asc ? 0 : firstElement.heads.length - 1];\n\tvar endhead = lastElement.heads[asc ? 0 : lastElement.heads.length - 1];\n\tvar startX = starthead.x;\n\tif (asc) startX += starthead.w - 0.6;\n\tvar endX = endhead.x;\n\tendX += (asc) ? endhead.w : 0.6;\n\treturn [startX, endX];\n}\n\nfunction calcYPos(average, numElements, stemHeight, asc, firstAveragePitch, lastAveragePitch, isFlat, minPitch, maxPitch, isGrace) {\n\tvar barpos = stemHeight - 2; // (isGrace)? 5:7;\n\tvar barminpos = stemHeight - 2;\n\tvar pos = Math.round(asc ? Math.max(average + barpos, maxPitch + barminpos) : Math.min(average - barpos, minPitch - barminpos));\n\n\tvar slant = calcSlant(firstAveragePitch, lastAveragePitch, numElements, isFlat);\n\tvar startY = pos + Math.floor(slant / 2);\n\tvar endY = pos + Math.floor(-slant / 2);\n\n\t// If the notes are too high or too low, make the beam go down to the middle\n\tif (!isGrace) {\n\t\tif (asc && pos < 6) {\n\t\t\tstartY = 6;\n\t\t\tendY = 6;\n\t\t} else if (!asc && pos > 6) {\n\t\t\tstartY = 6;\n\t\t\tendY = 6;\n\t\t}\n\t}\n\n\treturn [startY, endY];\n}\n\nfunction createStems(elems, asc, beam, dy, mainNote) {\n\tfor (var i = 0; i < elems.length; i++) {\n\t\tvar elem = elems[i];\n\t\tif (elem.abcelem.rest)\n\t\t\tcontinue;\n\t\t// TODO-PER: This is odd. If it is a regular beam then elems is an array of AbsoluteElements, if it is a grace beam then it is an array of objects , so we directly attach the element to the parent. We tell it if is a grace note because they are passed in as a generic object instead of an AbsoluteElement.\n\t\tvar isGrace = elem.addExtra ? false : true;\n\t\tvar parent = isGrace ? mainNote : elem;\n\t\tvar furthestHead = elem.heads[(asc) ? 0 : elem.heads.length - 1];\n\t\tvar ovalDelta = 1 / 5;//(isGrace)?1/3:1/5;\n\t\tvar pitch = furthestHead.pitch + ((asc) ? ovalDelta : -ovalDelta);\n\t\tvar dx = asc ? furthestHead.w : 0; // down-pointing stems start on the left side of the note, up-pointing stems start on the right side, so we offset by the note width.\n\t\tif (!isGrace)\n\t\t\tdx += furthestHead.dx;\n\t\tvar x = furthestHead.x + dx; // this is now the actual x location in pixels.\n\t\tvar bary = getBarYAt(beam.startX, beam.startY, beam.endX, beam.endY, x);\n\t\tvar lineWidth = (asc) ? -0.6 : 0.6;\n\t\tif (!asc)\n\t\t\tbary -= (dy / 2) / spacing.STEP;\t// TODO-PER: This is just a fudge factor so the down-pointing stems don't overlap.\n\t\tif (isGrace)\n\t\t\tdx += elem.heads[0].dx;\n\t\t// TODO-PER-HACK: One type of note head has a different placement of the stem. This should be more generically calculated:\n\t\tif (furthestHead.c === 'noteheads.slash.quarter') {\n\t\t\tif (asc)\n\t\t\t\tpitch += 1;\n\t\t\telse\n\t\t\t\tpitch -= 1;\n\t\t}\n\t\tvar stem = new RelativeElement(null, dx, 0, pitch, {\n\t\t\t\"type\": \"stem\",\n\t\t\t\"pitch2\": bary,\n\t\t\tlinewidth: lineWidth\n\t\t});\n\t\tstem.setX(parent.x); // This is after the x coordinates were set, so we have to set it directly.\n\t\tparent.addRight(stem);\n\t}\n\n}\n\nfunction createAdditionalBeams(elems, asc, beam, isGrace, dy) {\n\tvar beams = [];\n\tvar auxBeams = []; // auxbeam will be {x, y, durlog, single} auxbeam[0] should match with durlog=-4 (16th) (j=-4-durlog)\n\tfor (var i = 0; i < elems.length; i++) {\n\t\tvar elem = elems[i];\n\t\tif (elem.abcelem.rest)\n\t\t\tcontinue;\n\t\tvar furthestHead = elem.heads[(asc) ? 0 : elem.heads.length - 1];\n\t\tvar x = furthestHead.x + ((asc) ? furthestHead.w : 0);\n\t\tvar bary = getBarYAt(beam.startX, beam.startY, beam.endX, beam.endY, x);\n\n\t\tvar sy = (asc) ? -1.5 : 1.5;\n\t\tif (isGrace) sy = sy * 2 / 3; // This makes the second beam on grace notes closer to the first one.\n\t\tvar duration = elem.abcelem.duration; // get the duration via abcelem because of triplets\n\t\tif (duration === 0) duration = 0.25; // if this is stemless, then we use quarter note as the duration.\n\t\tfor (var durlog = getDurlog(duration); durlog < -3; durlog++) {\n\t\t\tvar index = -4 - durlog;\n\t\t\tif (auxBeams[index]) {\n\t\t\t\tauxBeams[index].single = false;\n\t\t\t} else {\n\t\t\t\tauxBeams[index] = {\n\t\t\t\t\tx: x + ((asc) ? -0.6 : 0), y: bary + sy * (index + 1),\n\t\t\t\t\tdurlog: durlog, single: true\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (i > 0 && elem.abcelem.beambr && elem.abcelem.beambr <= (index + 1)) {\n\t\t\t\tif (!auxBeams[index].split)\n\t\t\t\t\tauxBeams[index].split = [auxBeams[index].x];\n\t\t\t\tvar xPos = calcXPos(asc, elems[i - 1], elem);\n\t\t\t\tif (auxBeams[index].split[auxBeams[index].split.length - 1] >= xPos[0]) {\n\t\t\t\t\t// the reduction in beams leaves a note unattached so create a small flag for it.\n\t\t\t\t\txPos[0] += elem.w;\n\t\t\t\t}\n\t\t\t\tauxBeams[index].split.push(xPos[0]);\n\t\t\t\tauxBeams[index].split.push(xPos[1]);\n\t\t\t}\n\t\t}\n\n\t\tfor (var j = auxBeams.length - 1; j >= 0; j--) {\n\t\t\tif (i === elems.length - 1 || getDurlog(elems[i + 1].abcelem.duration) > (-j - 4)) {\n\n\t\t\t\tvar auxBeamEndX = x;\n\t\t\t\tvar auxBeamEndY = bary + sy * (j + 1);\n\n\n\t\t\t\tif (auxBeams[j].single) {\n\t\t\t\t\tauxBeamEndX = (i === 0) ? x + 5 : x - 5;\n\t\t\t\t\tauxBeamEndY = getBarYAt(beam.startX, beam.startY, beam.endX, beam.endY, auxBeamEndX) + sy * (j + 1);\n\t\t\t\t}\n\t\t\t\tvar b = { startX: auxBeams[j].x, endX: auxBeamEndX, startY: auxBeams[j].y, endY: auxBeamEndY, dy: dy }\n\t\t\t\tif (auxBeams[j].split !== undefined) {\n\t\t\t\t\tvar split = auxBeams[j].split;\n\t\t\t\t\tif (b.endX <= split[split.length - 1]) {\n\t\t\t\t\t\t// the reduction in beams leaves the last note by itself, so create a little flag for it\n\t\t\t\t\t\tsplit[split.length - 1] -= elem.w;\n\t\t\t\t\t}\n\t\t\t\t\tsplit.push(b.endX);\n\t\t\t\t\tb.split = auxBeams[j].split;\n\t\t\t\t}\n\t\t\t\tbeams.push(b);\n\t\t\t\tauxBeams = auxBeams.slice(0, j);\n\t\t\t}\n\t\t}\n\t}\n\treturn beams;\n}\n\nmodule.exports = layoutBeam;\n","var getBarYAt = require('./get-bar-y-at');\n\nfunction layoutTriplet(element) {\n\t// TODO end and beginning of line (PER: P.S. I'm not sure this can happen: I think the parser will always specify both the start and end points.)\n\tif (element.anchor1 && element.anchor2) {\n\t\telement.hasBeam = !!element.anchor1.parent.beam && element.anchor1.parent.beam === element.anchor2.parent.beam;\n\t\tvar beam = element.anchor1.parent.beam;\n\t\t// if hasBeam is true, then the first and last element in the triplet have the same beam.\n\t\t// We also need to check if the beam doesn't contain other notes so that `(3 dcdcc` will do a bracket.\n\t\tif (element.hasBeam && (beam.elems[0] !== element.anchor1.parent || beam.elems[beam.elems.length - 1] !== element.anchor2.parent))\n\t\t\telement.hasBeam = false;\n\n\t\tif (element.hasBeam) {\n\t\t\t// If there is a beam then we don't need to draw anything except the text. The beam could either be above or below.\n\t\t\tvar left = isAbove(beam) ? element.anchor1.x + element.anchor1.w : element.anchor1.x;\n\t\t\telement.yTextPos = heightAtMidpoint(left, element.anchor2.x, beam);\n\t\t\telement.yTextPos += isAbove(beam) ? 3 : -2; // This creates some space between the beam and the number.\n\t\t\telement.xTextPos = xAtMidpoint(left, element.anchor2.x);\n\t\t\telement.top = element.yTextPos + 1;\n\t\t\telement.bottom = element.yTextPos - 2;\n\t\t\tif (isAbove(beam))\n\t\t\t\telement.endingHeightAbove = 4;\n\t\t} else {\n\t\t\t// If there isn't a beam, then we need to draw the bracket and the text. The bracket is always above.\n\t\t\t// The bracket is never lower than the 'a' line, but is 4 pitches above the first and last notes. If there is\n\t\t\t// a tall note in the middle, the bracket is horizontal and above the highest note.\n\t\t\telement.startNote = Math.max(element.anchor1.parent.top, 9) + 4;\n\t\t\telement.endNote = Math.max(element.anchor2.parent.top, 9) + 4;\n\t\t\t// If it starts or ends on a rest, make the beam horizontal\n\t\t\tif (element.anchor1.parent.type === \"rest\" && element.anchor2.parent.type !== \"rest\")\n\t\t\t\telement.startNote = element.endNote;\n\t\t\telse if (element.anchor2.parent.type === \"rest\" && element.anchor1.parent.type !== \"rest\")\n\t\t\t\telement.endNote = element.startNote;\n\t\t\t// See if the middle note is really high.\n\t\t\tvar max = 0;\n\t\t\tfor (var i = 0; i < element.middleElems.length; i++) {\n\t\t\t\tmax = Math.max(max, element.middleElems[i].top);\n\t\t\t}\n\t\t\tmax += 4;\n\t\t\tif (max > element.startNote || max > element.endNote) {\n\t\t\t\telement.startNote = max;\n\t\t\t\telement.endNote = max;\n\t\t\t}\n\t\t\tif (element.flatBeams) {\n\t\t\t\telement.startNote = Math.max(element.startNote, element.endNote);\n\t\t\t\telement.endNote = Math.max(element.startNote, element.endNote);\n\t\t\t}\n\n\t\t\telement.yTextPos = element.startNote + (element.endNote - element.startNote) / 2;\n\t\t\telement.xTextPos = element.anchor1.x + (element.anchor2.x + element.anchor2.w - element.anchor1.x) / 2;\n\t\t\telement.top = element.yTextPos + 1;\n\t\t}\n\t}\n\tdelete element.middleElems;\n\tdelete element.flatBeams;\n}\n\nfunction isAbove(beam) {\n\treturn beam.stemsUp;\n}\n\n// We can't just use the entire beam for the calculation. The range has to be passed in, because the beam might extend into some unrelated notes. for instance, (3_a'f'e'f'2 when L:16\nfunction heightAtMidpoint(startX, endX, beam) {\n\tif (beam.beams.length === 0)\n\t\treturn 0;\n\tbeam = beam.beams[0];\n\tvar midPoint = startX + (endX - startX) / 2;\n\treturn getBarYAt(beam.startX, beam.startY, beam.endX, beam.endY, midPoint);\n}\n\nfunction xAtMidpoint(startX, endX) {\n\treturn startX + (endX - startX) / 2;\n}\n\nmodule.exports = layoutTriplet;\n","var layoutBeam = require('./beam');\nvar getBarYAt = require('./get-bar-y-at');\nvar layoutTriplet = require('./triplet');\n\nvar layoutVoice = function (voice) {\n\tfor (var i = 0; i < voice.beams.length; i++) {\n\t\tif (voice.beams[i].type === 'BeamElem') {\n\t\t\tlayoutBeam(voice.beams[i]);\n\t\t\tmoveDecorations(voice.beams[i]);\n\t\t\t// The above will change the top and bottom of the abselem children, so see if we need to expand our range.\n\t\t\tfor (var j = 0; j < voice.beams[i].elems.length; j++) {\n\t\t\t\tvoice.adjustRange(voice.beams[i].elems[j]);\n\t\t\t}\n\t\t}\n\t}\n\tvoice.staff.specialY.chordLines = setLaneForChord(voice.children);\n\n\t// Now we can layout the triplets\n\tfor (i = 0; i < voice.otherchildren.length; i++) {\n\t\tvar child = voice.otherchildren[i];\n\t\tif (child.type === 'TripletElem') {\n\t\t\tlayoutTriplet(child);\n\t\t\tvoice.adjustRange(child);\n\t\t}\n\t}\n\tvoice.staff.top = Math.max(voice.staff.top, voice.top);\n\tvoice.staff.bottom = Math.min(voice.staff.bottom, voice.bottom);\n};\n\nfunction moveDecorations(beam) {\n\tvar padding = 1.5; // This is the vertical padding between elements, in pitches.\n\tfor (var ch = 0; ch < beam.elems.length; ch++) {\n\t\tvar child = beam.elems[ch];\n\t\tif (child.top) {\n\t\t\t// We now know where the ornaments should have been placed, so move them if they would overlap.\n\t\t\tvar top = yAtNote(child, beam);\n\t\t\tfor (var i = 0; i < child.children.length; i++) {\n\t\t\t\tvar el = child.children[i];\n\t\t\t\tif (el.klass === 'ornament' && el.position !== 'below') {\n\t\t\t\t\tif (el.bottom - padding < top) {\n\t\t\t\t\t\tvar distance = top - el.bottom + padding; // Find the distance that it needs to move and add a little margin so the element doesn't touch the beam.\n\t\t\t\t\t\tel.bottom += distance;\n\t\t\t\t\t\tel.top += distance;\n\t\t\t\t\t\tel.pitch += distance;\n\t\t\t\t\t\ttop = child.top = el.top;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction placeInLane(rightMost, relElem) {\n\t// These items are centered so figure the coordinates accordingly.\n\t// The font reports some extra space so the margin is built in.\n\tvar xCoords = relElem.getChordDim();\n\tif (xCoords) {\n\t\tfor (var i = 0; i < rightMost.length; i++) {\n\t\t\tvar fits = rightMost[i] < xCoords.left;\n\t\t\tif (fits) {\n\t\t\t\tif (i > 0)\n\t\t\t\t\trelElem.putChordInLane(i);\n\t\t\t\trightMost[i] = xCoords.right;\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t// If we didn't return early, then we need a new row\n\t\trightMost.push(xCoords.right);\n\t\trelElem.putChordInLane(rightMost.length - 1);\n\t}\n}\n\nfunction setLaneForChord(absElems) {\n\t// Criteria:\n\t// 1) lane numbers start from the bottom so that as many items as possible are in lane 0, closest to the music.\n\t// 2) a chord can have more than one line (for instance \"C\\nD\") each line is a lane.\n\t// 3) if two adjoining items would touch then push the second one to the next lane.\n\t// 4) use as many lanes as is necessary to get everything to not touch.\n\t// 5) leave a margin between items, so use another lane if the chords would have less than a character's width.\n\t// 6) if the chord only has one character, allow it to be closer than if the chord has more than one character.\n\tvar rightMostAbove = [0];\n\tvar rightMostBelow = [0];\n\tvar i;\n\tvar j;\n\tvar relElem;\n\tfor (i = 0; i < absElems.length; i++) {\n\t\tfor (j = 0; j < absElems[i].children.length; j++) {\n\t\t\trelElem = absElems[i].children[j];\n\t\t\tif (relElem.chordHeightAbove) {\n\t\t\t\tplaceInLane(rightMostAbove, relElem);\n\t\t\t}\n\t\t}\n\t\tfor (j = absElems[i].children.length - 1; j >= 0; j--) {\n\t\t\trelElem = absElems[i].children[j];\n\t\t\tif (relElem.chordHeightBelow) {\n\t\t\t\tplaceInLane(rightMostBelow, relElem);\n\t\t\t}\n\t\t}\n\t}\n\t// If we used a second line, then we need to go back and set the first lines.\n\t// Also we need to flip the indexes of the names so that we can count from the top line.\n\tif (rightMostAbove.length > 1 || rightMostBelow.length > 1)\n\t\tsetLane(absElems, rightMostAbove.length, rightMostBelow.length);\n\treturn { above: rightMostAbove.length, below: rightMostBelow.length };\n}\n\nfunction numAnnotationsBelow(absElem) {\n\tvar count = 0;\n\tfor (var j = 0; j < absElem.children.length; j++) {\n\t\tvar relElem = absElem.children[j];\n\t\tif (relElem.chordHeightBelow)\n\t\t\tcount++;\n\t}\n\treturn count;\n}\n\nfunction setLane(absElems, numLanesAbove, numLanesBelow) {\n\tfor (var i = 0; i < absElems.length; i++) {\n\t\tvar below = numAnnotationsBelow(absElems[i]);\n\t\tfor (var j = 0; j < absElems[i].children.length; j++) {\n\t\t\tvar relElem = absElems[i].children[j];\n\t\t\tif (relElem.chordHeightAbove) {\n\t\t\t\trelElem.invertLane(numLanesAbove);\n\t\t\t\t// } else if (relElem.chordHeightBelow) {\n\t\t\t\t// \trelElem.invertLane(below);\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction yAtNote(element, beam) {\n\tbeam = beam.beams[0];\n\treturn getBarYAt(beam.startX, beam.startY, beam.endX, beam.endY, element.x);\n}\n\n\nmodule.exports = layoutVoice;\n","var spacing = require('../helpers/spacing');\n\nvar setUpperAndLowerElements = function (renderer, staffGroup) {\n\t// Each staff already has the top and bottom set, now we see if there are elements that are always on top and bottom, and resolve their pitch.\n\t// Also, get the overall height of all the staves in this group.\n\tvar lastStaffBottom;\n\tfor (var i = 0; i < staffGroup.staffs.length; i++) {\n\t\tvar staff = staffGroup.staffs[i];\n\t\t// the vertical order of elements that are above is: tempo, part, volume/dynamic, ending/chord, lyric\n\t\t// the vertical order of elements that are below is: lyric, chord, volume/dynamic\n\t\tvar positionY = {\n\t\t\ttempoHeightAbove: 0,\n\t\t\tpartHeightAbove: 0,\n\t\t\tvolumeHeightAbove: 0,\n\t\t\tdynamicHeightAbove: 0,\n\t\t\tendingHeightAbove: 0,\n\t\t\tchordHeightAbove: 0,\n\t\t\tlyricHeightAbove: 0,\n\n\t\t\tlyricHeightBelow: 0,\n\t\t\tchordHeightBelow: 0,\n\t\t\tvolumeHeightBelow: 0,\n\t\t\tdynamicHeightBelow: 0\n\t\t};\n\n\t\tif (renderer.showDebug && renderer.showDebug.indexOf(\"box\") >= 0) {\n\t\t\tstaff.originalTop = staff.top; // This is just being stored for debugging purposes.\n\t\t\tstaff.originalBottom = staff.bottom; // This is just being stored for debugging purposes.\n\t\t}\n\n\t\tincTop(staff, positionY, 'lyricHeightAbove');\n\t\tincTop(staff, positionY, 'chordHeightAbove', staff.specialY.chordLines.above);\n\t\tif (staff.specialY.endingHeightAbove) {\n\t\t\tif (staff.specialY.chordHeightAbove)\n\t\t\t\tstaff.top += 2;\n\t\t\telse\n\t\t\t\tstaff.top += staff.specialY.endingHeightAbove + margin;\n\t\t\tpositionY.endingHeightAbove = staff.top;\n\t\t}\n\t\tif (staff.specialY.dynamicHeightAbove && staff.specialY.volumeHeightAbove) {\n\t\t\tstaff.top += Math.max(staff.specialY.dynamicHeightAbove, staff.specialY.volumeHeightAbove) + margin;\n\t\t\tpositionY.dynamicHeightAbove = staff.top;\n\t\t\tpositionY.volumeHeightAbove = staff.top;\n\t\t} else {\n\t\t\tincTop(staff, positionY, 'dynamicHeightAbove');\n\t\t\tincTop(staff, positionY, 'volumeHeightAbove');\n\t\t}\n\t\tincTop(staff, positionY, 'partHeightAbove');\n\t\tincTop(staff, positionY, 'tempoHeightAbove');\n\n\t\tif (staff.specialY.lyricHeightBelow) {\n\t\t\tstaff.specialY.lyricHeightBelow += renderer.spacing.vocal / spacing.STEP;\n\t\t\tpositionY.lyricHeightBelow = staff.bottom;\n\t\t\tstaff.bottom -= (staff.specialY.lyricHeightBelow + margin);\n\t\t}\n\t\tif (staff.specialY.chordHeightBelow) {\n\t\t\tpositionY.chordHeightBelow = staff.bottom;\n\t\t\tvar hgt = staff.specialY.chordHeightBelow;\n\t\t\tif (staff.specialY.chordLines.below)\n\t\t\t\thgt *= staff.specialY.chordLines.below;\n\t\t\tstaff.bottom -= (hgt + margin);\n\t\t}\n\t\tif (staff.specialY.volumeHeightBelow && staff.specialY.dynamicHeightBelow) {\n\t\t\tpositionY.volumeHeightBelow = staff.bottom;\n\t\t\tpositionY.dynamicHeightBelow = staff.bottom;\n\t\t\tstaff.bottom -= (Math.max(staff.specialY.volumeHeightBelow, staff.specialY.dynamicHeightBelow) + margin);\n\t\t} else if (staff.specialY.volumeHeightBelow) {\n\t\t\tpositionY.volumeHeightBelow = staff.bottom; staff.bottom -= (staff.specialY.volumeHeightBelow + margin);\n\t\t} else if (staff.specialY.dynamicHeightBelow) {\n\t\t\tpositionY.dynamicHeightBelow = staff.bottom; staff.bottom -= (staff.specialY.dynamicHeightBelow + margin);\n\t\t}\n\n\t\tif (renderer.showDebug && renderer.showDebug.indexOf(\"box\") >= 0)\n\t\t\tstaff.positionY = positionY; // This is just being stored for debugging purposes.\n\n\t\tfor (var j = 0; j < staff.voices.length; j++) {\n\t\t\tvar voice = staffGroup.voices[staff.voices[j]];\n\t\t\tsetUpperAndLowerVoiceElements(positionY, voice, renderer.spacing);\n\t\t}\n\t\t// We might need a little space in between staves if the staves haven't been pushed far enough apart by notes or extra vertical stuff.\n\t\t// Only try to put in extra space if this isn't the top staff.\n\t\tif (lastStaffBottom !== undefined) {\n\t\t\tvar thisStaffTop = staff.top - 10;\n\t\t\tvar forcedSpacingBetween = lastStaffBottom + thisStaffTop;\n\t\t\tvar minSpacingInPitches = renderer.spacing.systemStaffSeparation / spacing.STEP;\n\t\t\tvar addedSpace = minSpacingInPitches - forcedSpacingBetween;\n\t\t\tif (addedSpace > 0)\n\t\t\t\tstaff.top += addedSpace;\n\t\t}\n\t\tstaff.top += renderer.spacing.staffTopMargin / spacing.STEP\n\n\t\tlastStaffBottom = 2 - staff.bottom; // the staff starts at position 2 and the bottom variable is negative. Therefore to find out how large the bottom is, we reverse the sign of the bottom, and add the 2 in.\n\n\t\t// Now we need a little margin on the top, so we'll just throw that in.\n\t\t//staff.top += 4;\n\t\t//console.log(\"Staff Y: \",i,heightInPitches,staff.top,staff.bottom);\n\t}\n\t//console.log(\"Staff Height: \",heightInPitches,this.height);\n};\n\nvar margin = 1;\nfunction incTop(staff, positionY, item, count) {\n\tif (staff.specialY[item]) {\n\t\tvar height = staff.specialY[item];\n\t\tif (count)\n\t\t\theight *= count;\n\t\tstaff.top += height + margin;\n\t\tpositionY[item] = staff.top;\n\t}\n}\n\nfunction setUpperAndLowerVoiceElements(positionY, voice, spacing) {\n\tvar i;\n\tvar abselem;\n\tfor (i = 0; i < voice.children.length; i++) {\n\t\tabselem = voice.children[i];\n\t\tsetUpperAndLowerAbsoluteElements(positionY, abselem, spacing);\n\t}\n\tfor (i = 0; i < voice.otherchildren.length; i++) {\n\t\tabselem = voice.otherchildren[i];\n\t\tswitch (abselem.type) {\n\t\t\tcase 'CrescendoElem':\n\t\t\t\tsetUpperAndLowerCrescendoElements(positionY, abselem);\n\t\t\t\tbreak;\n\t\t\tcase 'DynamicDecoration':\n\t\t\t\tsetUpperAndLowerDynamicElements(positionY, abselem);\n\t\t\t\tbreak;\n\t\t\tcase 'EndingElem':\n\t\t\t\tsetUpperAndLowerEndingElements(positionY, abselem);\n\t\t\t\tbreak;\n\t\t\tcase 'TieElem':\n\t\t\t\t// If a tie element is the highest or lowest thing then space might need to make room for it.\n\t\t\t\tvar yBounds = abselem.getYBounds()\n\t\t\t\tvoice.staff.top = Math.max(voice.staff.top, yBounds[0])\n\t\t\t\tvoice.staff.top = Math.max(voice.staff.top, yBounds[1])\n\t\t\t\tvoice.staff.bottom = Math.min(voice.staff.bottom, yBounds[0])\n\t\t\t\tvoice.staff.bottom = Math.min(voice.staff.bottom, yBounds[1])\n\t\t\t\tbreak;\n\t\t}\n\t}\n}\n\n// For each of the relative elements that can't be placed in advance (because their vertical placement depends on everything\n// else on the line), this iterates through them and sets their pitch. By the time this is called, specialYResolved contains a\n// hash with the vertical placement (in pitch units) for each type.\n// TODO-PER: I think this needs to be separated by \"above\" and \"below\". How do we know that for dynamics at the point where they are being defined, though? We need a pass through all the relative elements to set \"above\" and \"below\".\nfunction setUpperAndLowerAbsoluteElements(specialYResolved, element, spacing) {\n\t// specialYResolved contains the actual pitch for each of the classes of elements.\n\tfor (var i = 0; i < element.children.length; i++) {\n\t\tvar child = element.children[i];\n\t\tfor (var key in element.specialY) { // for each class of element that needs to be placed vertically\n\t\t\tif (element.specialY.hasOwnProperty(key)) {\n\t\t\t\tif (child[key]) { // If this relative element has defined a height for this class of element\n\t\t\t\t\tchild.pitch = specialYResolved[key];\n\t\t\t\t\tif (child.top === undefined) { // TODO-PER: HACK! Not sure this is the right place to do this.\n\t\t\t\t\t\tif (child.type === 'TempoElement') {\n\t\t\t\t\t\t\tsetUpperAndLowerTempoElement(specialYResolved, child);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsetUpperAndLowerRelativeElements(specialYResolved, child, spacing);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telement.pushTop(child.top);\n\t\t\t\t\t\telement.pushBottom(child.bottom);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction setUpperAndLowerCrescendoElements(positionY, element) {\n\tif (element.dynamicHeightAbove)\n\t\telement.pitch = positionY.dynamicHeightAbove;\n\telse\n\t\telement.pitch = positionY.dynamicHeightBelow;\n}\n\nfunction setUpperAndLowerDynamicElements(positionY, element) {\n\tif (element.volumeHeightAbove)\n\t\telement.pitch = positionY.volumeHeightAbove;\n\telse\n\t\telement.pitch = positionY.volumeHeightBelow;\n}\n\nfunction setUpperAndLowerEndingElements(positionY, element) {\n\telement.pitch = positionY.endingHeightAbove - 2;\n}\n\nfunction setUpperAndLowerTempoElement(positionY, element) {\n\telement.pitch = positionY.tempoHeightAbove;\n\telement.top = positionY.tempoHeightAbove;\n\telement.bottom = positionY.tempoHeightAbove;\n\tif (element.note) {\n\t\tvar tempoPitch = element.pitch - element.totalHeightInPitches + 1; // The pitch we receive is the top of the allotted area: change that to practically the bottom.\n\t\telement.note.top = tempoPitch;\n\t\telement.note.bottom = tempoPitch;\n\t\tfor (var i = 0; i < element.note.children.length; i++) {\n\t\t\tvar child = element.note.children[i];\n\t\t\tchild.top += tempoPitch;\n\t\t\tchild.bottom += tempoPitch;\n\t\t\tchild.pitch += tempoPitch;\n\t\t\tif (child.pitch2 !== undefined)\n\t\t\t\tchild.pitch2 += tempoPitch;\n\t\t}\n\t}\n}\n\nfunction setUpperAndLowerRelativeElements(positionY, element, renderSpacing) {\n\tswitch (element.type) {\n\t\tcase \"part\":\n\t\t\telement.top = positionY.partHeightAbove + element.height;\n\t\t\telement.bottom = positionY.partHeightAbove;\n\t\t\tbreak;\n\t\tcase \"text\":\n\t\tcase \"chord\":\n\t\t\tif (element.chordHeightAbove) {\n\t\t\t\telement.top = positionY.chordHeightAbove;\n\t\t\t\telement.bottom = positionY.chordHeightAbove;\n\t\t\t} else {\n\t\t\t\telement.top = positionY.chordHeightBelow;\n\t\t\t\telement.bottom = positionY.chordHeightBelow;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase \"lyric\":\n\t\t\tif (element.lyricHeightAbove) {\n\t\t\t\telement.top = positionY.lyricHeightAbove;\n\t\t\t\telement.bottom = positionY.lyricHeightAbove;\n\t\t\t} else {\n\t\t\t\telement.top = positionY.lyricHeightBelow + renderSpacing.vocal / spacing.STEP;\n\t\t\t\telement.bottom = positionY.lyricHeightBelow + renderSpacing.vocal / spacing.STEP;\n\t\t\t\telement.pitch -= renderSpacing.vocal / spacing.STEP;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase \"debug\":\n\t\t\telement.top = positionY.chordHeightAbove;\n\t\t\telement.bottom = positionY.chordHeightAbove;\n\t\t\tbreak;\n\t}\n\tif (element.pitch === undefined || element.top === undefined)\n\t\tconsole.error(\"RelativeElement position not set.\", element.type, element.pitch, element.top, positionY);\n}\n\nmodule.exports = setUpperAndLowerElements;\n","var VoiceElement = function VoiceElements() { }\n\nVoiceElement.beginLayout = function (startx, voice) {\n\tvoice.i = 0;\n\tvoice.durationindex = 0;\n\t//this.ii=this.children.length;\n\tvoice.startx = startx;\n\tvoice.minx = startx; // furthest left to where negatively positioned elements are allowed to go\n\tvoice.nextx = startx; // x position where the next element of this voice should be placed assuming no other voices and no fixed width constraints\n\tvoice.spacingduration = 0; // duration left to be laid out in current iteration (omitting additional spacing due to other aspects, such as bars, dots, sharps and flats)\n};\n\nVoiceElement.layoutEnded = function (voice) {\n\treturn (voice.i >= voice.children.length);\n};\n\nVoiceElement.getNextX = function (voice) {\n\treturn Math.max(voice.minx, voice.nextx);\n};\n\n// number of spacing units expected for next positioning\nVoiceElement.getSpacingUnits = function (voice) {\n\treturn Math.sqrt(voice.spacingduration * 8);\n};\n\n// Try to layout the element at index this.i\n// x - position to try to layout the element at\n// spacing - base spacing\n// can't call this function more than once per iteration\nVoiceElement.layoutOneItem = function (x, spacing, voice, minPadding, firstVoice) {\n\tvar child = voice.children[voice.i];\n\tif (!child) return 0;\n\tvar er = x - voice.minx; // available extrawidth to the left\n\tvar pad = voice.durationindex + child.duration > 0 ? minPadding : 0; // only add padding to the items that aren't fixed to the left edge.\n\t// See if this item overlaps the item in the first voice. If firstVoice is undefined then there's nothing to compare.\n\tif (child.abcelem.el_type === \"note\" && !child.abcelem.rest && voice.voicenumber !== 0 && firstVoice) {\n\t\tvar firstChild = firstVoice.children[firstVoice.i];\n\t\t// It overlaps if the either the child's top or bottom is inside the firstChild's or at least within 1\n\t\t// A special case is if the element is on the same line then it can share a note head, if the notehead is the same\n\t\tvar overlaps = firstChild &&\n\t\t\t((child.abcelem.maxpitch <= firstChild.abcelem.maxpitch + 1 && child.abcelem.maxpitch >= firstChild.abcelem.minpitch - 1) ||\n\t\t\t\t(child.abcelem.minpitch <= firstChild.abcelem.maxpitch + 1 && child.abcelem.minpitch >= firstChild.abcelem.minpitch - 1))\n\t\t// See if they can share a note head\n\t\tif (overlaps && child.abcelem.minpitch === firstChild.abcelem.minpitch && child.abcelem.maxpitch === firstChild.abcelem.maxpitch &&\n\t\t\tfirstChild.heads && firstChild.heads.length > 0 && child.heads && child.heads.length > 0 &&\n\t\t\tfirstChild.heads[0].c === child.heads[0].c)\n\t\t\toverlaps = false;\n\t\t// If this note overlaps the note in the first voice and we haven't moved the note yet (this can be called multiple times)\n\t\tif (overlaps) {\n\t\t\t// I think that firstChild should always have at least one note head, but defensively make sure.\n\t\t\t// There was a problem with this being called more than once so if a value is adjusted then it is saved so it is only adjusted once.\n\t\t\tvar firstChildNoteWidth = firstChild.heads && firstChild.heads.length > 0 ? firstChild.heads[0].realWidth : firstChild.fixed.w;\n\t\t\tif (!child.adjustedWidth)\n\t\t\t\tchild.adjustedWidth = firstChildNoteWidth + child.w;\n\t\t\tchild.w = child.adjustedWidth\n\t\t\tfor (var j = 0; j < child.children.length; j++) {\n\t\t\t\tvar relativeChild = child.children[j];\n\t\t\t\tif (relativeChild.name.indexOf(\"accidental\") < 0) {\n\t\t\t\t\tif (!relativeChild.adjustedWidth)\n\t\t\t\t\t\trelativeChild.adjustedWidth = relativeChild.dx + firstChildNoteWidth;\n\t\t\t\t\trelativeChild.dx = relativeChild.adjustedWidth\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\tvar extraWidth = getExtraWidth(child, pad);\n\tif (er < extraWidth) { // shift right by needed amount\n\t\t// There's an exception if a bar element is after a Part element, there is no shift.\n\t\tif (voice.i === 0 || child.type !== 'bar' || (voice.children[voice.i - 1].type !== 'part' && voice.children[voice.i - 1].type !== 'tempo'))\n\t\t\tx += extraWidth - er;\n\t}\n\tchild.setX(x);\n\n\tvoice.spacingduration = child.duration;\n\t//update minx\n\tvoice.minx = x + getMinWidth(child); // add necessary layout space\n\tif (voice.i !== voice.children.length - 1) voice.minx += child.minspacing; // add minimumspacing except on last elem\n\n\tthis.updateNextX(x, spacing, voice);\n\n\t// contribute to staff y position\n\t//this.staff.top = Math.max(child.top,this.staff.top);\n\t//this.staff.bottom = Math.min(child.bottom,this.staff.bottom);\n\n\treturn x; // where we end up having placed the child\n};\n\nVoiceElement.shiftRight = function (dx, voice) {\n\tvar child = voice.children[voice.i];\n\tif (!child) return;\n\tchild.setX(child.x + dx);\n\tvoice.minx += dx;\n\tvoice.nextx += dx;\n};\n\n// call when spacingduration has been updated\nVoiceElement.updateNextX = function (x, spacing, voice) {\n\tvoice.nextx = x + (spacing * this.getSpacingUnits(voice));\n};\n\nVoiceElement.updateIndices = function (voice) {\n\tif (!this.layoutEnded(voice)) {\n\t\tvoice.durationindex += voice.children[voice.i].duration;\n\t\tif (voice.children[voice.i].type === 'bar') voice.durationindex = Math.round(voice.durationindex * 64) / 64; // everytime we meet a barline, do rounding to nearest 64th\n\t\tvoice.i++;\n\t}\n};\n\nfunction getExtraWidth(child, minPadding) { // space needed to the left of the note\n\tvar padding = 0;\n\tif (child.type === 'note' || child.type === 'bar')\n\t\tpadding = minPadding;\n\treturn -child.extraw + padding;\n}\n\nfunction getMinWidth(child) { // absolute space taken to the right of the note\n\treturn child.w;\n}\n\nmodule.exports = VoiceElement;\n","var layoutVoiceElements = require('./voice-elements');\n\nfunction checkLastBarX(voices) {\n\tvar maxX = 0;\n\tfor (var i = 0; i < voices.length; i++) {\n\t\tvar curVoice = voices[i];\n\t\tif (curVoice.children.length > 0) {\n\t\t\tvar lastChild = curVoice.children.length - 1;\n\t\t\tvar maxChild = curVoice.children[lastChild];\n\t\t\tif (maxChild.abcelem.el_type === 'bar') {\n\t\t\t\tvar barX = maxChild.children[0].x;\n\t\t\t\tif (barX > maxX) {\n\t\t\t\t\tmaxX = barX;\n\t\t\t\t} else {\n\t\t\t\t\tmaxChild.children[0].x = maxX;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nvar layoutStaffGroup = function (spacing, minPadding, debug, staffGroup, leftEdge) {\n\tvar epsilon = 0.0000001; // Fudging for inexactness of floating point math.\n\tvar spacingunits = 0; // number of times we will have ended up using the spacing distance (as opposed to fixed width distances)\n\tvar minspace = 1000; // a big number to start off with - used to find out what the smallest space between two notes is -- GD 2014.1.7\n\n\tvar x = leftEdge;\n\tstaffGroup.startx = x;\n\tvar i;\n\n\tvar currentduration = 0;\n\tif (debug) console.log(\"init layout\", spacing);\n\tfor (i = 0; i < staffGroup.voices.length; i++) {\n\t\tlayoutVoiceElements.beginLayout(x, staffGroup.voices[i]);\n\t}\n\n\tvar spacingunit = 0; // number of spacingunits coming from the previously laid out element to this one\n\twhile (!finished(staffGroup.voices)) {\n\t\t// find first duration level to be laid out among candidates across voices\n\t\tcurrentduration = null; // candidate smallest duration level\n\t\tfor (i = 0; i < staffGroup.voices.length; i++) {\n\t\t\tif (!layoutVoiceElements.layoutEnded(staffGroup.voices[i]) && (!currentduration || getDurationIndex(staffGroup.voices[i]) < currentduration))\n\t\t\t\tcurrentduration = getDurationIndex(staffGroup.voices[i]);\n\t\t}\n\n\n\t\t// isolate voices at current duration level\n\t\tvar currentvoices = [];\n\t\tvar othervoices = [];\n\t\tfor (i = 0; i < staffGroup.voices.length; i++) {\n\t\t\tvar durationIndex = getDurationIndex(staffGroup.voices[i]);\n\t\t\t// PER: Because of the inexactness of JS floating point math, we just get close.\n\t\t\tif (durationIndex - currentduration > epsilon) {\n\t\t\t\tothervoices.push(staffGroup.voices[i]);\n\t\t\t\t//console.log(\"out: voice \",i);\n\t\t\t} else {\n\t\t\t\tcurrentvoices.push(staffGroup.voices[i]);\n\t\t\t\t//if (debug) console.log(\"in: voice \",i);\n\t\t\t}\n\t\t}\n\n\t\t// among the current duration level find the one which needs starting furthest right\n\t\tspacingunit = 0; // number of spacingunits coming from the previously laid out element to this one\n\t\tvar spacingduration = 0;\n\t\tfor (i = 0; i < currentvoices.length; i++) {\n\t\t\t//console.log(\"greatest spacing unit\", x, layoutVoiceElements.getNextX(currentvoices[i]), layoutVoiceElements.getSpacingUnits(currentvoices[i]), currentvoices[i].spacingduration);\n\t\t\tif (layoutVoiceElements.getNextX(currentvoices[i]) > x) {\n\t\t\t\tx = layoutVoiceElements.getNextX(currentvoices[i]);\n\t\t\t\tspacingunit = layoutVoiceElements.getSpacingUnits(currentvoices[i]);\n\t\t\t\tspacingduration = currentvoices[i].spacingduration;\n\t\t\t}\n\t\t}\n\t\tspacingunits += spacingunit;\n\t\tminspace = Math.min(minspace, spacingunit);\n\t\tif (debug) console.log(\"currentduration: \", currentduration, spacingunits, minspace);\n\n\t\tvar lastTopVoice = undefined;\n\t\tfor (i = 0; i < currentvoices.length; i++) {\n\t\t\tvar v = currentvoices[i];\n\t\t\tif (v.voicenumber === 0)\n\t\t\t\tlastTopVoice = i;\n\t\t\tvar topVoice = (lastTopVoice !== undefined && currentvoices[lastTopVoice].voicenumber !== v.voicenumber) ? currentvoices[lastTopVoice] : undefined;\n\t\t\tif (!isSameStaff(v, topVoice))\n\t\t\t\ttopVoice = undefined;\n\t\t\tvar voicechildx = layoutVoiceElements.layoutOneItem(x, spacing, v, minPadding, topVoice);\n\t\t\tvar dx = voicechildx - x;\n\t\t\tif (dx > 0) {\n\t\t\t\tx = voicechildx; //update x\n\t\t\t\tfor (var j = 0; j < i; j++) { // shift over all previously laid out elements\n\t\t\t\t\tlayoutVoiceElements.shiftRight(dx, currentvoices[j]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// remove the value of already counted spacing units in other voices (e.g. if a voice had planned to use up 5 spacing units but is not in line to be laid out at this duration level - where we've used 2 spacing units - then we must use up 3 spacing units, not 5)\n\t\tfor (i = 0; i < othervoices.length; i++) {\n\t\t\tothervoices[i].spacingduration -= spacingduration;\n\t\t\tlayoutVoiceElements.updateNextX(x, spacing, othervoices[i]); // adjust other voices expectations\n\t\t}\n\n\t\t// update indexes of currently laid out elems\n\t\tfor (i = 0; i < currentvoices.length; i++) {\n\t\t\tvar voice = currentvoices[i];\n\t\t\tlayoutVoiceElements.updateIndices(voice);\n\t\t}\n\t} // finished laying out\n\n\n\t// find the greatest remaining x as a base for the width\n\tfor (i = 0; i < staffGroup.voices.length; i++) {\n\t\tif (layoutVoiceElements.getNextX(staffGroup.voices[i]) > x) {\n\t\t\tx = layoutVoiceElements.getNextX(staffGroup.voices[i]);\n\t\t\tspacingunit = layoutVoiceElements.getSpacingUnits(staffGroup.voices[i]);\n\t\t}\n\t}\n\n\t// adjust lastBar when needed (multi staves)\n\tcheckLastBarX(staffGroup.voices);\n\t//console.log(\"greatest remaining\",spacingunit,x);\n\tspacingunits += spacingunit;\n\tstaffGroup.setWidth(x);\n\n\treturn { spacingUnits: spacingunits, minSpace: minspace };\n};\n\n\nfunction finished(voices) {\n\tfor (var i = 0; i < voices.length; i++) {\n\t\tif (!layoutVoiceElements.layoutEnded(voices[i])) return false;\n\t}\n\treturn true;\n}\n\nfunction getDurationIndex(element) {\n\treturn element.durationindex - (element.children[element.i] && (element.children[element.i].duration > 0) ? 0 : 0.0000005); // if the ith element doesn't have a duration (is not a note), its duration index is fractionally before. This enables CLEF KEYSIG TIMESIG PART, etc. to be laid out before we get to the first note of other voices\n}\n\nfunction isSameStaff(voice1, voice2) {\n\tif (!voice1 || !voice1.staff || !voice1.staff.voices || voice1.staff.voices.length === 0)\n\t\treturn false;\n\tif (!voice2 || !voice2.staff || !voice2.staff.voices || voice2.staff.voices.length === 0)\n\t\treturn false;\n\treturn (voice1.staff.voices[0] === voice2.staff.voices[0]);\n}\n\nmodule.exports = layoutStaffGroup;\n","function getLeftEdgeOfStaff(renderer, getTextSize, voices, brace, bracket) {\n\tvar x = renderer.padding.left;\n\n\t// find out how much space will be taken up by voice headers\n\tvar voiceheaderw = 0;\n\tvar i;\n\tvar size;\n\tfor (i = 0; i < voices.length; i++) {\n\t\tif (voices[i].header) {\n\t\t\tsize = getTextSize.calc(voices[i].header, 'voicefont', '');\n\t\t\tvoiceheaderw = Math.max(voiceheaderw, size.width);\n\t\t}\n\t}\n\tvoiceheaderw = addBraceSize(voiceheaderw, brace, getTextSize);\n\tvoiceheaderw = addBraceSize(voiceheaderw, bracket, getTextSize);\n\n\tif (voiceheaderw) {\n\t\t// Give enough spacing to the right - we use the width of an A for the amount of spacing.\n\t\tvar sizeW = getTextSize.calc(\"A\", 'voicefont', '');\n\t\tvoiceheaderw += sizeW.width;\n\t}\n\tx += voiceheaderw;\n\n\tvar ofs = 0;\n\tofs = setBraceLocation(brace, x, ofs);\n\tofs = setBraceLocation(bracket, x, ofs);\n\treturn x + ofs;\n}\n\nfunction addBraceSize(voiceheaderw, brace, getTextSize) {\n\tif (brace) {\n\t\tfor (var i = 0; i < brace.length; i++) {\n\t\t\tif (brace[i].header) {\n\t\t\t\tvar size = getTextSize.calc(brace[i].header, 'voicefont', '');\n\t\t\t\tvoiceheaderw = Math.max(voiceheaderw, size.width);\n\t\t\t}\n\t\t}\n\t}\n\treturn voiceheaderw;\n}\n\nfunction setBraceLocation(brace, x, ofs) {\n\tif (brace) {\n\t\tfor (var i = 0; i < brace.length; i++) {\n\t\t\tsetLocation(x, brace[i]);\n\t\t\tofs = Math.max(ofs, brace[i].getWidth());\n\t\t}\n\t}\n\treturn ofs;\n}\n\nfunction setLocation(x, element) {\n\telement.x = x;\n}\n\nmodule.exports = getLeftEdgeOfStaff;\n","var getLeftEdgeOfStaff = require('./get-left-edge-of-staff');\n\nfunction layoutInGrid(renderer, staffGroup, timeBasedLayout) {\n\tvar leftEdge = getLeftEdgeOfStaff(renderer, staffGroup.getTextSize, staffGroup.voices, staffGroup.brace, staffGroup.bracket);\n\tvar ret = getTotalDuration(staffGroup, timeBasedLayout.minPadding)\n\tvar totalDuration = ret.totalDuration\n\tvar minSpacing = ret.minSpacing\n\tvar totalWidth = minSpacing * totalDuration\n\tif (timeBasedLayout.minWidth)\n\t\ttotalWidth = Math.max(totalWidth, timeBasedLayout.minWidth)\n\tvar leftAlignPadding = timeBasedLayout.minPadding ? timeBasedLayout.minPadding/2 : 2 // If the padding isn't specified still give it some\n\n\tstaffGroup.startx = leftEdge\n\tstaffGroup.w = totalWidth + leftEdge\n\tfor (var i = 0; i < staffGroup.voices.length; i++) {\n\t\tvar voice = staffGroup.voices[i]\n\t\tvoice.startx = leftEdge\n\t\tvoice.w = totalWidth + leftEdge\n\n\t\tvar x = leftEdge\n\t\tvar afterFixedLeft = false\n\t\tvar durationUnit = 0\n\t\tfor (var j = 0; j < voice.children.length; j++) {\n\t\t\tvar child = voice.children[j]\n\t\t\tif (!afterFixedLeft) {\n\t\t\t\tif (child.duration !== 0) {\n\t\t\t\t\t// We got to the first music element on the line\n\t\t\t\t\tafterFixedLeft = true\n\t\t\t\t\tdurationUnit = (totalWidth + leftEdge - x) / totalDuration\n\t\t\t\t\tstaffGroup.gridStart = x\n\t\t\t\t} else {\n\t\t\t\t\t// We are still doing the preliminary stuff - clef, time sig, etc.\n\t\t\t\t\tchild.x = x\n\t\t\t\t\tx += child.w + child.minspacing\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (afterFixedLeft) {\n\t\t\t\tif (timeBasedLayout.align === 'center')\n\t\t\t\t\tchild.x = x + (child.duration * durationUnit) / 2 - child.w / 2\n\t\t\t\telse {\n\t\t\t\t\t// left align with padding - but no padding for barlines, they should be right aligned.\n\t\t\t\t\t// TODO-PER: it looks better to move bar lines one pixel to right. Not sure why.\n\t\t\t\t\tif (child.duration === 0) {\n\t\t\t\t\t\tchild.x = x + 1 - child.w\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// child.extraw has the width of the accidentals - push the note to the right to take that into consideration. It will be 0 if there is nothing to the left.\n\t\t\t\t\t\tchild.x = x + leftAlignPadding - child.extraw\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tx += child.duration * durationUnit\n\t\t\t}\n\t\t\tfor (var k = 0; k < child.children.length; k++) {\n\t\t\t\tvar grandchild = child.children[k]\n\t\t\t\t// some elements don't have a dx - Tempo, for instance\n\t\t\t\tvar dx = grandchild.dx ? grandchild.dx : 0\n\t\t\t\tgrandchild.x = child.x + dx\n\t\t\t}\n\t\t}\n\t\tstaffGroup.gridEnd = x\n\t}\n\treturn totalWidth\n}\n\nfunction getTotalDuration(staffGroup, timeBasedLayout) {\n\tvar maxSpacing = 0\n\tvar maxCount = 0\n\tfor (var i = 0; i < staffGroup.voices.length; i++) {\n\t\tvar count = 0\n\t\tvar voice = staffGroup.voices[i]\n\t\tfor (var j = 0; j < voice.children.length; j++) {\n\t\t\tvar element = voice.children[j]\n\t\t\tcount += element.duration\n\t\t\tif (element.duration) {\n\t\t\t\tvar width = (element.w+timeBasedLayout) / element.duration\n\t\t\t\tmaxSpacing = Math.max(maxSpacing, width)\n\t\t\t}\n\t\t}\n\t\tmaxCount = Math.max(maxCount, count)\n\t}\n\treturn { totalDuration: maxCount, minSpacing: maxSpacing}\n}\n\nmodule.exports = layoutInGrid;\n","var layoutVoice = require('./voice');\nvar setUpperAndLowerElements = require('./set-upper-and-lower-elements');\nvar layoutStaffGroup = require('./staff-group');\nvar getLeftEdgeOfStaff = require('./get-left-edge-of-staff');\nvar layoutInGrid = require('./layout-in-grid');\n\n// This sets the \"x\" attribute on all the children in abctune.lines\n// It also sets the \"w\" and \"startx\" attributes on \"voices\"\n// It also sets the \"w\" and \"startx\" attributes on \"voices.children\"\nvar layout = function (renderer, abctune, width, space, expandToWidest, timeBasedLayout) {\n\tvar i;\n\tvar abcLine;\n\t// Adjust the x-coordinates to their absolute positions\n\tvar maxWidth = width;\n\tfor (i = 0; i < abctune.lines.length; i++) {\n\t\tabcLine = abctune.lines[i];\n\t\tif (abcLine.staff) {\n\t\t\t// console.log(\"=== line\", i)\n\t\t\tvar thisWidth;\n\t\t\tif (timeBasedLayout !== undefined)\n\t\t\t\tthisWidth = layoutInGrid(renderer, abcLine.staffGroup, timeBasedLayout);\n\t\t\telse\n\t\t\t\tthisWidth = setXSpacing(renderer, maxWidth, space, abcLine.staffGroup, abctune.formatting, i === abctune.lines.length - 1, false);\n\t\t\t// console.log(thisWidth, maxWidth)\n\t\t\tif (Math.round(thisWidth) > Math.round(maxWidth)) { // to take care of floating point weirdness\n\t\t\t\tmaxWidth = thisWidth\n\t\t\t\tif (expandToWidest)\n\t\t\t\t\ti = -1 // do the calculations over with the new width\n\t\t\t}\n\t\t}\n\t}\n\n\t// Layout the beams and add the stems to the beamed notes.\n\tfor (i = 0; i < abctune.lines.length; i++) {\n\t\tabcLine = abctune.lines[i];\n\t\tif (abcLine.staffGroup && abcLine.staffGroup.voices) {\n\t\t\tfor (var j = 0; j < abcLine.staffGroup.voices.length; j++)\n\t\t\t\tlayoutVoice(abcLine.staffGroup.voices[j]);\n\t\t\tsetUpperAndLowerElements(renderer, abcLine.staffGroup);\n\t\t}\n\t}\n\n\t// Set the staff spacing\n\t// TODO-PER: we should have been able to do this by the time we called setUpperAndLowerElements, but for some reason the \"bottom\" element seems to be set as a side effect of setting the X spacing.\n\tfor (i = 0; i < abctune.lines.length; i++) {\n\t\tabcLine = abctune.lines[i];\n\t\tif (abcLine.staffGroup) {\n\t\t\tabcLine.staffGroup.setHeight();\n\t\t}\n\t}\n\treturn maxWidth;\n}\n// Do the x-axis positioning for a single line (a group of related staffs)\nvar setXSpacing = function (renderer, width, space, staffGroup, formatting, isLastLine, debug) {\n\tvar leftEdge = getLeftEdgeOfStaff(renderer, staffGroup.getTextSize, staffGroup.voices, staffGroup.brace, staffGroup.bracket);\n\tvar newspace = space;\n\t//dumpGroup(\"before\", staffGroup)\n\tfor (var it = 0; it < 8; it++) { // TODO-PER: shouldn't need multiple passes, but each pass gets it closer to the right spacing. (Only affects long lines: normal lines break out of this loop quickly.)\n\t\t// console.log(\"iteration\", it)\n\t\tvar ret = layoutStaffGroup(newspace, renderer.minPadding, debug, staffGroup, leftEdge);\n\t\tnewspace = calcHorizontalSpacing(isLastLine, formatting.stretchlast, width + renderer.padding.left, staffGroup.w, newspace, ret.spacingUnits, ret.minSpace, renderer.padding.left + renderer.padding.right);\n\t\tif (debug)\n\t\t\tconsole.log(\"setXSpace\", it, staffGroup.w, newspace, staffGroup.minspace);\n\t\tif (newspace === null) break;\n\t}\n\t//dumpGroup(\"after\",staffGroup)\n\tcenterWholeRests(staffGroup.voices);\n\treturn staffGroup.w - leftEdge\n};\n\nfunction replacer(key, value) {\n\t// Filtering out properties\n\tif (key === 'parent') {\n\t\treturn 'parent';\n\t}\n\tif (key === 'beam') {\n\t\treturn 'beam';\n\t}\n\treturn value;\n}\n\nfunction dumpGroup(label, staffGroup) {\n\tconsole.log(\"=================== \" + label + \" =========================\")\n\tconsole.log(staffGroup)\n\tconsole.log(JSON.stringify(staffGroup, replacer, \"\\t\"))\n}\n\nfunction calcHorizontalSpacing(isLastLine, stretchLast, targetWidth, lineWidth, spacing, spacingUnits, minSpace, padding) {\n\tif (isLastLine) {\n\t\tif (stretchLast === undefined) {\n\t\t\tif (lineWidth / targetWidth < 0.66) return null; // keep this for backward compatibility. The break isn't quite the same for some reason.\n\t\t} else {\n\t\t\t// \"Stretch the last music line of a tune when it lacks less than the float fraction of the page width.\"\n\t\t\tvar lack = 1 - (lineWidth + padding) / targetWidth;\n\t\t\tvar stretch = lack < stretchLast;\n\t\t\tif (!stretch) return null; // don't stretch last line too much\n\t\t}\n\t}\n\tif (Math.abs(targetWidth - lineWidth) < 2) return null; // if we are already near the target width, we're done.\n\tvar relSpace = spacingUnits * spacing;\n\tvar constSpace = lineWidth - relSpace;\n\tif (spacingUnits > 0) {\n\t\tspacing = (targetWidth - constSpace) / spacingUnits;\n\t\tif (spacing * minSpace > 50) {\n\t\t\tspacing = 50 / minSpace;\n\t\t}\n\t\treturn spacing;\n\t}\n\treturn null;\n}\n\nfunction centerWholeRests(voices) {\n\t// whole rests are a special case: if they are by themselves in a measure, then they should be centered.\n\t// (If they are not by themselves, that is probably a user error, but we'll just center it between the two items to either side of it.)\n\tfor (var i = 0; i < voices.length; i++) {\n\t\tvar voice = voices[i];\n\t\t// Look through all of the elements except for the first and last. If the whole note appears there then there isn't anything to center it between anyway.\n\t\tfor (var j = 1; j < voice.children.length - 1; j++) {\n\t\t\tvar absElem = voice.children[j];\n\t\t\tif (absElem.abcelem.rest && (absElem.abcelem.rest.type === 'whole' || absElem.abcelem.rest.type === 'multimeasure')) {\n\t\t\t\tvar before = voice.children[j - 1];\n\t\t\t\tvar after = voice.children[j + 1];\n\t\t\t\tabsElem.center(before, after);\n\t\t\t}\n\t\t}\n\t}\n}\n\nmodule.exports = layout;\n","var Classes = function Classes(options) {\n\tthis.shouldAddClasses = options.shouldAddClasses;\n\tthis.reset();\n}\n\nClasses.prototype.reset = function () {\n\tthis.lineNumber = null;\n\tthis.voiceNumber = null;\n\tthis.measureNumber = null;\n\tthis.measureTotalPerLine = [];\n\tthis.noteNumber = null;\n}\n\nClasses.prototype.incrLine = function () {\n\tif (this.lineNumber === null)\n\t\tthis.lineNumber = 0;\n\telse\n\t\tthis.lineNumber++;\n\tthis.voiceNumber = null;\n\tthis.measureNumber = null;\n\tthis.noteNumber = null;\n};\n\nClasses.prototype.incrVoice = function () {\n\tif (this.voiceNumber === null)\n\t\tthis.voiceNumber = 0;\n\telse\n\t\tthis.voiceNumber++;\n\tthis.measureNumber = null;\n\tthis.noteNumber = null;\n};\n\nClasses.prototype.isInMeasure = function () {\n\treturn this.measureNumber !== null;\n};\n\nClasses.prototype.newMeasure = function () {\n\tif (this.measureNumber)\n\t\tthis.measureTotalPerLine[this.lineNumber] = this.measureNumber;\n\tthis.measureNumber = null;\n\tthis.noteNumber = null;\n};\n\nClasses.prototype.startMeasure = function () {\n\tthis.measureNumber = 0;\n\tthis.noteNumber = 0;\n};\n\nClasses.prototype.incrMeasure = function () {\n\tthis.measureNumber++;\n\tthis.noteNumber = 0;\n};\n\nClasses.prototype.incrNote = function () {\n\tthis.noteNumber++;\n};\n\nClasses.prototype.measureTotal = function () {\n\tvar total = 0;\n\tfor (var i = 0; i < this.lineNumber; i++)\n\t\ttotal += this.measureTotalPerLine[i] ? this.measureTotalPerLine[i] : 0; // This can be null when non-music things are present.\n\tif (this.measureNumber)\n\t\ttotal += this.measureNumber;\n\treturn total;\n};\n\nClasses.prototype.getCurrent = function (c) {\n\treturn {\n\t\tline: this.lineNumber,\n\t\tmeasure: this.measureNumber,\n\t\tmeasureTotal: this.measureTotal(),\n\t\tvoice: this.voiceNumber,\n\t\tnote: this.noteNumber\n\t};\n};\n\nClasses.prototype.generate = function (c) {\n\tif (!this.shouldAddClasses)\n\t\treturn \"\";\n\tvar ret = [];\n\tif (c && c.length > 0) ret.push(c);\n\tif (c === \"abcjs-tab-number\") // TODO-PER-HACK! straighten out the tablature\n\t\treturn ret.join(' ')\n\tif (c === \"text instrument-name\")\n\t\treturn \"abcjs-text abcjs-instrument-name\"\n\tif (this.lineNumber !== null) ret.push(\"l\" + this.lineNumber);\n\tif (this.measureNumber !== null) ret.push(\"m\" + this.measureNumber);\n\tif (this.measureNumber !== null) ret.push(\"mm\" + this.measureTotal()); // measureNumber is null between measures so this is still the test for measureTotal\n\tif (this.voiceNumber !== null) ret.push(\"v\" + this.voiceNumber);\n\tif (c && (c.indexOf('note') >= 0 || c.indexOf('rest') >= 0 || c.indexOf('lyric') >= 0) && this.noteNumber !== null) ret.push(\"n\" + this.noteNumber);\n\t// add a prefix to all classes that abcjs adds.\n\tif (ret.length > 0) {\n\t\tret = ret.join(' '); // Some strings are compound classes - that is, specify more than one class in a string.\n\t\tret = ret.split(' ');\n\t\tfor (var i = 0; i < ret.length; i++) {\n\t\t\tif (ret[i].indexOf('abcjs-') !== 0 && ret[i].length > 0) // if the prefix doesn't already exist and the class is not blank.\n\t\t\t\tret[i] = 'abcjs-' + ret[i];\n\t\t}\n\t}\n\treturn ret.join(' ');\n};\n\n\nmodule.exports = Classes;\n","var GetFontAndAttr = function GetFontAndAttr(formatting, classes) {\n\tthis.formatting = formatting;\n\tthis.classes = classes;\n};\n\nGetFontAndAttr.prototype.updateFonts = function (fontOverrides) {\n\tif (fontOverrides.gchordfont)\n\t\tthis.formatting.gchordfont = fontOverrides.gchordfont;\n\tif (fontOverrides.tripletfont)\n\t\tthis.formatting.tripletfont = fontOverrides.tripletfont;\n\tif (fontOverrides.annotationfont)\n\t\tthis.formatting.annotationfont = fontOverrides.annotationfont;\n\tif (fontOverrides.vocalfont)\n\t\tthis.formatting.vocalfont = fontOverrides.vocalfont;\n};\n\nGetFontAndAttr.prototype.getFamily = function (type) {\n\tif (type[0] === '\"' && type[type.length-1] === '\"') {\n\t\treturn type.substring(1, type.length-1)\n\t}\n\treturn type\n};\n\nGetFontAndAttr.prototype.calc = function (type, klass) {\n\tvar font;\n\tif (typeof type === 'string') {\n\t\tfont = this.formatting[type];\n\t\t// Raphael deliberately changes the font units to pixels for some reason, so we need to change points to pixels here.\n\t\tif (font)\n\t\t\tfont = { face: font.face, size: Math.round(font.size * 4 / 3), decoration: font.decoration, style: font.style, weight: font.weight, box: font.box };\n\t\telse\n\t\t\tfont = { face: \"Arial\", size: Math.round(12 * 4 / 3), decoration: \"underline\", style: \"normal\", weight: \"normal\" };\n\t} else\n\t\tfont = { face: type.face, size: Math.round(type.size * 4 / 3), decoration: type.decoration, style: type.style, weight: type.weight, box: type.box };\n\tvar paddingPercent = this.formatting.fontboxpadding ? this.formatting.fontboxpadding : 0.1\n\tfont.padding = font.size * paddingPercent;\n\n\tvar attr = {\n\t\t\"font-size\": font.size, 'font-style': font.style,\n\t\t\"font-family\": this.getFamily(font.face), 'font-weight': font.weight, 'text-decoration': font.decoration,\n\t\t'class': this.classes.generate(klass)\n\t};\n\treturn { font: font, attr: attr };\n};\n\nmodule.exports = GetFontAndAttr;\n","var GetTextSize = function GetTextSize(getFontAndAttr, svg) {\n\tthis.getFontAndAttr = getFontAndAttr;\n\tthis.svg = svg;\n};\n\nGetTextSize.prototype.updateFonts = function (fontOverrides) {\n\tthis.getFontAndAttr.updateFonts(fontOverrides);\n};\n\nGetTextSize.prototype.attr = function (type, klass) {\n\treturn this.getFontAndAttr.calc(type, klass);\n};\n\nGetTextSize.prototype.getFamily = function (type) {\n\tif (type[0] === '\"' && type[type.length-1] === '\"') {\n\t\treturn type.substring(1, type.length-1)\n\t}\n\treturn type\n};\n\nGetTextSize.prototype.calc = function (text, type, klass, el) {\n\tvar hash;\n\t// This can be passed in either a string or a font. If it is a string it names one of the standard fonts.\n\tif (typeof type === 'string')\n\t\thash = this.attr(type, klass);\n\telse {\n\t\thash = {\n\t\t\tfont: {\n\t\t\t\tface: type.face,\n\t\t\t\tsize: type.size,\n\t\t\t\tdecoration: type.decoration,\n\t\t\t\tstyle: type.style,\n\t\t\t\tweight: type.weight\n\t\t\t},\n\t\t\tattr: {\n\t\t\t\t\"font-size\": type.size,\n\t\t\t\t\"font-style\": type.style,\n\t\t\t\t\"font-family\": this.getFamily(type.face),\n\t\t\t\t\"font-weight\": type.weight,\n\t\t\t\t\"text-decoration\": type.decoration,\n\t\t\t\t\"class\": this.getFontAndAttr.classes.generate(klass)\n\t\t\t}\n\t\t}\n\t}\n\tvar size = this.svg.getTextSize(text, hash.attr, el);\n\tif (hash.font.box) {\n\t\t// Add padding and an equal margin to each side.\n\t\treturn { height: size.height + hash.font.padding * 4, width: size.width + hash.font.padding * 4 };\n\t}\n\treturn size;\n};\n\nGetTextSize.prototype.baselineToCenter = function (text, type, klass, index, total) {\n\t// This is for the case where SVG wants to use the baseline of the first line as the Y coordinate.\n\t// If there are multiple lines of text or there is an array of text then that will not be centered so this adjusts it.\n\tvar height = this.calc(text, type, klass).height;\n\tvar fontHeight = this.attr(type, klass).font.size;\n\n\treturn height * 0.5 + (total - index - 2) * fontHeight;\n};\n\n\nmodule.exports = GetTextSize;\n","/**\n * sprintf() for JavaScript v.0.4\n *\n Copyright (c) 2007-present, Alexandru Mărășteanu <hello@alexei.ro>\n All rights reserved.\n\n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n * Neither the name of this software nor the names of its contributors may be\n used to endorse or promote products derived from this software without\n specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR\n ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n//function str_repeat(i, m) { for (var o = []; m > 0; o[--m] = i); return(o.join('')); }\n\nvar sprintf = function () {\n\tvar i = 0, a, f = arguments[i++], o = [], m, p, c, x;\n\twhile (f) {\n\t\tif (m = /^[^\\x25]+/.exec(f)) o.push(m[0]);\n\t\telse if (m = /^\\x25{2}/.exec(f)) o.push('%');\n\t\telse if (m = /^\\x25(?:(\\d+)\\$)?(\\+)?(0|'[^$])?(-)?(\\d+)?(?:\\.(\\d+))?([b-fosuxX])/.exec(f)) {\n\t\t\tif (((a = arguments[m[1] || i++]) == null) || (a == undefined)) throw (\"Too few arguments.\");\n\t\t\tif (/[^s]/.test(m[7]) && (typeof (a) != 'number'))\n\t\t\t\tthrow (\"Expecting number but found \" + typeof (a));\n\t\t\tswitch (m[7]) {\n\t\t\t\tcase 'b': a = a.toString(2); break;\n\t\t\t\tcase 'c': a = String.fromCharCode(a); break;\n\t\t\t\tcase 'd': a = parseInt(a); break;\n\t\t\t\tcase 'e': a = m[6] ? a.toExponential(m[6]) : a.toExponential(); break;\n\t\t\t\tcase 'f': a = m[6] ? parseFloat(a).toFixed(m[6]) : parseFloat(a); break;\n\t\t\t\tcase 'o': a = a.toString(8); break;\n\t\t\t\tcase 's': a = ((a = String(a)) && m[6] ? a.substring(0, m[6]) : a); break;\n\t\t\t\tcase 'u': a = Math.abs(a); break;\n\t\t\t\tcase 'x': a = a.toString(16); break;\n\t\t\t\tcase 'X': a = a.toString(16).toUpperCase(); break;\n\t\t\t}\n\t\t\ta = (/[def]/.test(m[7]) && m[2] && a > 0 ? '+' + a : a);\n\t\t\tc = m[3] ? m[3] == '0' ? '0' : m[3][1] : ' ';\n\t\t\tx = m[5] - String(a).length;\n\t\t\tp = m[5] ? str_repeat(c, x) : '';\n\t\t\to.push(m[4] ? a + p : p + a);\n\t\t}\n\t\telse throw (\"Huh ?!\");\n\t\tf = f.substring(m[0].length);\n\t}\n\treturn o.join('');\n};\n\nmodule.exports = sprintf;\n","function roundNumber(x) {\n\treturn parseFloat(x.toFixed(2));\n}\n\nmodule.exports = roundNumber;\n","var roundNumber = require(\"./round-number\");\n\nfunction renderText(renderer, params, alreadyInGroup) {\n\tvar y = params.y;\n\n\t// TODO-PER: Probably need to merge the regular text and rich text better. At the least, rich text loses the font box.\n\tif (params.phrases) {\n\t\t//richTextLine = function (phrases, x, y, klass, anchor, target)\n\t\tvar elem = renderer.paper.richTextLine(params.phrases, params.x, params.y, params.klass, params.anchor);\n\t\treturn elem;\n\t}\n\n\tif (params.lane) {\n\t\tvar laneMargin = params.dim.font.size * 0.25;\n\t\ty += (params.dim.font.size + laneMargin) * params.lane;\n\t}\n\n\tvar hash;\n\tif (params.dim) {\n\t\thash = params.dim;\n\t\thash.attr.class = params.klass;\n\t} else\n\t\thash = renderer.controller.getFontAndAttr.calc(params.type, params.klass);\n\tif (params.anchor)\n\t\thash.attr[\"text-anchor\"] = params.anchor;\n\tif (params['dominant-baseline'])\n\t\thash.attr[\"dominant-baseline\"] = params['dominant-baseline'];\n\thash.attr.x = params.x;\n\thash.attr.y = y;\n\tif (!params.centerVertically)\n\t\thash.attr.y += hash.font.size;\n\tif (params.type === 'debugfont') {\n\t\tconsole.log(\"Debug msg: \" + params.text);\n\t\thash.attr.stroke = \"#ff0000\";\n\t}\n\tif (params.cursor) {\n\t\thash.attr.cursor = params.cursor;\n\t}\n\n\tvar text = params.text.replace(/\\n\\n/g, \"\\n \\n\");\n\ttext = text.replace(/^\\n/, \"\\xA0\\n\");\n\n\tif (hash.font.box) {\n\t\tif (!alreadyInGroup)\n\t\t\trenderer.paper.openGroup({ klass: hash.attr['class'], fill: renderer.foregroundColor, \"data-name\": params.name });\n\t\tif (hash.attr[\"text-anchor\"] === \"end\") {\n\t\t\thash.attr.x -= hash.font.padding;\n\t\t} else if (hash.attr[\"text-anchor\"] === \"start\") {\n\t\t\thash.attr.x += hash.font.padding;\n\t\t}\n\t\thash.attr.y += hash.font.padding;\n\t\tdelete hash.attr['class'];\n\t}\n\tif (params.noClass)\n\t\tdelete hash.attr['class'];\n\thash.attr.x = roundNumber(hash.attr.x);\n\thash.attr.y = roundNumber(hash.attr.y);\n\tif (params.name)\n\t\thash.attr[\"data-name\"] = params.name;\n\tvar elem = renderer.paper.text(text, hash.attr);\n\tif (hash.font.box) {\n\t\tvar size = elem.getBBox();\n\n\t\tvar delta = 0;\n\t\tif (hash.attr[\"text-anchor\"] === \"middle\") {\n\t\t\tdelta = size.width / 2 + hash.font.padding;\n\t\t} else if (hash.attr[\"text-anchor\"] === \"end\") {\n\t\t\tdelta = size.width + hash.font.padding * 2;\n\t\t}\n\t\tvar deltaY = 0;\n\t\tif (params.centerVertically) {\n\t\t\tdeltaY = size.height - hash.font.padding;\n\t\t}\n\t\trenderer.paper.rect({ \"data-name\": \"box\", x: Math.round(params.x - delta), y: Math.round(y - deltaY), width: Math.round(size.width + hash.font.padding * 2), height: Math.round(size.height + hash.font.padding * 2) });\n\t\tif (!alreadyInGroup)\n\t\t\telem = renderer.paper.closeGroup();\n\t}\n\treturn elem;\n}\n\nmodule.exports = renderText;\n","var sprintf = require('./sprintf');\nvar spacing = require('../helpers/spacing');\nvar renderText = require('./text');\n\nfunction drawBrace(renderer, params, selectables) {\n\t// The absoluteY number is the spot where the note on the first ledger line is drawn (i.e. middle C if treble clef)\n\t// The STEP offset here moves it to the top and bottom lines\n\tvar startY = params.startVoice.staff.absoluteY - spacing.STEP * 10;\n\tif (params.endVoice && params.endVoice.staff)\n\t\tparams.endY = params.endVoice.staff.absoluteY - spacing.STEP * 2;\n\telse if (params.lastContinuedVoice && params.lastContinuedVoice.staff)\n\t\tparams.endY = params.lastContinuedVoice.staff.absoluteY - spacing.STEP * 2;\n\telse\n\t\tparams.endY = params.startVoice.staff.absoluteY - spacing.STEP * 2;\n\treturn draw(renderer, params.x, startY, params.endY, params.type, params.header, selectables);\n}\n\nfunction straightPath(renderer, xLeft, yTop, yBottom, type) {\n\txLeft += spacing.STEP;\n\tvar xLineWidth = spacing.STEP * 0.75;\n\tvar yOverlap = spacing.STEP * 0.75;\n\tvar height = yBottom - yTop;\n\t// Straight line\n\tvar pathString = sprintf(\"M %f %f l %f %f l %f %f l %f %f z\",\n\t\txLeft, yTop - yOverlap, // top left line\n\t\t0, height + yOverlap * 2, // bottom left line\n\t\txLineWidth, 0, // bottom right line\n\t\t0, - (height + yOverlap * 2) // top right line\n\t);\n\t// Top arm\n\tvar wCurve = spacing.STEP * 2;\n\tvar hCurve = spacing.STEP;\n\tpathString += sprintf(\"M %f %f q %f %f %f %f q %f %f %f %f z\",\n\t\txLeft + xLineWidth, yTop - yOverlap, // top left arm\n\t\twCurve * 0.6, hCurve * 0.2,\n\t\twCurve, -hCurve, // right point\n\t\t-wCurve * 0.1, hCurve * 0.3,\n\t\t-wCurve, hCurve + spacing.STEP // left bottom\n\t);\n\t// Bottom arm\n\tpathString += sprintf(\"M %f %f q %f %f %f %f q %f %f %f %f z\",\n\t\txLeft + xLineWidth, yTop + yOverlap + height, // bottom left arm\n\t\twCurve * 0.6, -hCurve * 0.2,\n\t\twCurve, hCurve, // right point\n\t\t-wCurve * 0.1, -hCurve * 0.3,\n\t\t-wCurve, -hCurve - spacing.STEP // left bottom\n\t);\n\treturn renderer.paper.path({ path: pathString, stroke: renderer.foregroundColor, fill: renderer.foregroundColor, 'class': renderer.controller.classes.generate(type), \"data-name\": type });\n}\n\nfunction curvyPath(renderer, xLeft, yTop, yBottom, type) {\n\tvar yHeight = yBottom - yTop;\n\n\tvar pathString = curve(xLeft,\n\t\tyTop,\n\t\t[7.5, -8, 21, 0, 18.5, -10.5, 7.5],\n\t\t[0, yHeight / 5.5, yHeight / 3.14, yHeight / 2, yHeight / 2.93, yHeight / 4.88, 0]);\n\n\tpathString += curve(xLeft,\n\t\tyTop,\n\t\t[0, 17.5, -7.5, 6.6, -5, 20, 0],\n\t\t[yHeight / 2, yHeight / 1.46, yHeight / 1.22, yHeight, yHeight / 1.19, yHeight / 1.42, yHeight / 2]);\n\n\treturn renderer.paper.path({ path: pathString, stroke: renderer.foregroundColor, fill: renderer.foregroundColor, 'class': renderer.controller.classes.generate(type), \"data-name\": type });\n}\n\nfunction curve(xLeft, yTop, xCurve, yCurve) {\n\treturn sprintf(\"M %f %f C %f %f %f %f %f %f C %f %f %f %f %f %f z\",\n\t\txLeft + xCurve[0], yTop + yCurve[0],\n\t\txLeft + xCurve[1], yTop + yCurve[1],\n\t\txLeft + xCurve[2], yTop + yCurve[2],\n\t\txLeft + xCurve[3], yTop + yCurve[3],\n\t\txLeft + xCurve[4], yTop + yCurve[4],\n\t\txLeft + xCurve[5], yTop + yCurve[5],\n\t\txLeft + xCurve[6], yTop + yCurve[6]);\n}\n\nvar draw = function (renderer, xLeft, yTop, yBottom, type, header, selectables) {//Tony\n\tvar ret;\n\tif (header) {\n\t\trenderer.paper.openGroup({ klass: renderer.controller.classes.generate(\"staff-extra voice-name\"), \"data-name\": type });\n\t\tvar position = yTop + (yBottom - yTop) / 2;\n\t\tposition = position - renderer.controller.getTextSize.baselineToCenter(header, \"voicefont\", 'staff-extra voice-name', 0, 1);\n\n\t\trenderText(renderer, {\n\t\t\tx: renderer.padding.left,\n\t\t\ty: position,\n\t\t\ttext: header,\n\t\t\ttype: 'voicefont',\n\t\t\tklass: 'staff-extra voice-name',\n\t\t\tanchor: 'start',\n\t\t\tcenterVertically: true\n\t\t});\n\t}\n\tif (type === \"brace\")\n\t\tret = curvyPath(renderer, xLeft, yTop, yBottom, type);\n\telse if (type === \"bracket\")\n\t\tret = straightPath(renderer, xLeft, yTop, yBottom, type);\n\tif (header) {\n\t\tret = renderer.paper.closeGroup();\n\t}\n\tselectables.wrapSvgEl({ el_type: type, startChar: -1, endChar: -1 }, ret);\n\n\treturn ret;\n};\nmodule.exports = drawBrace;\n","function printPath(renderer, attrs, params) {\n\tvar ret = renderer.paper.path(attrs);\n\n\treturn ret;\n}\n\nmodule.exports = printPath;\n","var sprintf = require('./sprintf');\nvar printPath = require('./print-path');\nvar roundNumber = require(\"./round-number\");\n\nfunction drawGlissando(renderer, params, selectables) {\n\tif (!params.anchor1 || !params.anchor2 || !params.anchor1.heads || !params.anchor2.heads || params.anchor1.heads.length === 0 || params.anchor2.heads.length === 0)\n\t\twindow.console.error(\"Glissando Element not set.\");\n\n\tvar margin = 4;\n\tvar leftY = renderer.calcY(params.anchor1.heads[0].pitch)\n\tvar rightY = renderer.calcY(params.anchor2.heads[0].pitch)\n\tvar leftX = params.anchor1.x + params.anchor1.w / 2\n\tvar rightX = params.anchor2.x + params.anchor2.w / 2\n\t\n\tvar len = lineLength(leftX, leftY, rightX, rightY)\n\tvar marginLeft = params.anchor1.w / 2 + margin\n\tvar marginRight = params.anchor2.w / 2 + margin\n\tvar s = slope(leftX, leftY, rightX, rightY)\n\tvar leftYAdj = getY(leftY, s, marginLeft)\n\tvar rightYAdj = getY(rightY, s, -marginRight)\n\tvar num = numSquigglies(len - marginLeft - marginRight)\n\n\tvar el = drawSquiggly(renderer, leftX + marginLeft, leftYAdj, num, s)\n\tselectables.wrapSvgEl({ el_type: \"glissando\", startChar: -1, endChar: -1 }, el);\n\treturn [el];\n}\n\nfunction lineLength(leftX, leftY, rightX, rightY) {\n\t// The length from notehead center to notehead center.\n\tvar w = rightX - leftX\n\tvar h = rightY - leftY\n\treturn Math.sqrt(w * w + h * h)\n}\n\nfunction slope(leftX, leftY, rightX, rightY) {\n\treturn (rightY - leftY) / (rightX - leftX)\n}\n\nfunction getY(y, slope, xOfs) {\n\treturn roundNumber(y + (xOfs) * slope);\n}\n\nfunction numSquigglies(length) {\n\tvar endLen = 5; // The width of the end - that is, the non repeating part\n\treturn Math.max(2, Math.floor((length - endLen * 2) / 6));\n}\n\nvar leftStart = [[3.5, -4.8]]\nvar right = [[1.5, -1], [.3, -.3], [-3.5, 3.8]]\nvar leftEnd = [[-1.5, 2]]\nvar top = [[3, 4], [3, -4]]\nvar bottom = [[-3, 4], [-3, -4]]\n\nfunction segment(arr, slope) {\n\tvar ret = \"\";\n\tfor (var i = 0; i < arr.length; i++) {\n\t\tret += 'l' + arr[i][0] + ' ' + getY(arr[i][1], slope, arr[i][0])\n\t}\n\treturn ret\n}\n\nvar drawSquiggly = function (renderer, x, y, num, slope) {\n\tvar p = sprintf(\"M %f %f\", x, y);\n\tp += segment(leftStart, slope)\n\tvar i\n\tfor (i = 0; i < num; i++) {\n\t\tp += segment(top, slope)\n\t}\n\tp += segment(right, slope)\n\tfor (i = 0; i < num; i++)\n\t\tp += segment(bottom, slope)\n\tp += segment(leftEnd, slope) + 'z'\n\treturn printPath(renderer, { path: p, highlight: \"stroke\", stroke: renderer.foregroundColor, 'class': renderer.controller.classes.generate('decoration'), \"data-name\": \"glissando\" });\n}\n\nmodule.exports = drawGlissando;\n","var sprintf = require('./sprintf');\nvar printPath = require('./print-path');\nvar roundNumber = require(\"./round-number\");\n\nfunction drawCrescendo(renderer, params, selectables) {\n\tif (params.pitch === undefined)\n\t\twindow.console.error(\"Crescendo Element y-coordinate not set.\");\n\tvar y = renderer.calcY(params.pitch) + 4; // This is the top pixel to use (it is offset a little so that it looks good with the volume marks.)\n\tvar height = 8;\n\n\t// TODO-PER: This is just a quick hack to make the dynamic marks not crash if they are mismatched. See the slur treatment for the way to get the beginning and end.\n\tvar left = params.anchor1 ? params.anchor1.x : 0;\n\tvar right = params.anchor2 ? params.anchor2.x : 800;\n\n\tvar el;\n\tif (params.dir === \"<\") {\n\t\tel = drawLine(renderer, y + height / 2, y, y + height / 2, y + height, left, right);\n\t} else {\n\t\tel = drawLine(renderer, y, y + height / 2, y + height, y + height / 2, left, right);\n\t}\n\tselectables.wrapSvgEl({ el_type: \"dynamicDecoration\", startChar: -1, endChar: -1 }, el);\n\treturn [el];\n}\n\nvar drawLine = function (renderer, y1, y2, y3, y4, left, right) {\n\ty1 = roundNumber(y1);\n\ty2 = roundNumber(y2);\n\ty3 = roundNumber(y3);\n\ty4 = roundNumber(y4);\n\tleft = roundNumber(left);\n\tright = roundNumber(right);\n\n\tvar pathString = sprintf(\"M %f %f L %f %f M %f %f L %f %f\",\n\t\tleft, y1, right, y2, left, y3, right, y4);\n\treturn printPath(renderer, { path: pathString, highlight: \"stroke\", stroke: renderer.foregroundColor, 'class': renderer.controller.classes.generate('dynamics decoration'), \"data-name\": \"dynamics\" });\n};\n\nmodule.exports = drawCrescendo;\n","/**\n * Begin a group of glyphs that will always be moved, scaled and highlighted together\n */\n\nvar roundNumber = require(\"./round-number\");\n\nfunction Group() {\n\tthis.ingroup = false;\n}\n\nGroup.prototype.beginGroup = function (paper, controller) {\n\tthis.paper = paper;\n\tthis.controller = controller;\n\tthis.path = [];\n\tthis.lastM = [0, 0];\n\tthis.ingroup = true;\n\tthis.paper.openGroup();\n};\n\nGroup.prototype.isInGroup = function () {\n\treturn this.ingroup;\n}\n\nGroup.prototype.addPath = function (path) {\n\tpath = path || [];\n\tif (path.length === 0) return;\n\tpath[0][0] = \"m\";\n\tpath[0][1] = roundNumber(path[0][1] - this.lastM[0]);\n\tpath[0][2] = roundNumber(path[0][2] - this.lastM[1]);\n\tthis.lastM[0] += path[0][1];\n\tthis.lastM[1] += path[0][2];\n\tthis.path.push(path[0]);\n\tfor (var i = 1, ii = path.length; i < ii; i++) {\n\t\tif (path[i][0] === \"m\") {\n\t\t\tthis.lastM[0] += path[i][1];\n\t\t\tthis.lastM[1] += path[i][2];\n\t\t}\n\t\tthis.path.push(path[i]);\n\t}\n};\n\n/**\n * End a group of glyphs that will always be moved, scaled and highlighted together\n */\nGroup.prototype.endGroup = function (klass, name) {\n\tthis.ingroup = false;\n\t//if (this.path.length === 0) return null;\n\tvar path = \"\";\n\tfor (var i = 0; i < this.path.length; i++)\n\t\tpath += this.path[i].join(\" \");\n\tthis.path = [];\n\n\tvar ret = this.paper.closeGroup();\n\tif (ret) {\n\t\tret.setAttribute(\"class\", this.controller.classes.generate(klass))\n\t\tret.setAttribute(\"fill\", this.controller.renderer.foregroundColor)\n\t\tret.setAttribute(\"stroke\", \"none\")\n\t\tret.setAttribute(\"data-name\", name)\n\t}\n\treturn ret;\n};\n\n// There is just a singleton of this object.\nvar elementGroup = new Group();\n\nmodule.exports = elementGroup;\n","var renderText = require('./text');\nvar glyphs = require('../creation/glyphs');\nvar elementGroup = require('./group-elements');\n\n/**\n * assumes this.y is set appropriately\n * if symbol is a multichar string without a . (as in scripts.staccato) 1 symbol per char is assumed\n * not scaled if not in printgroup\n */\nfunction printSymbol(renderer, x, offset, symbol, options) {\n\t// TODO-PER: what happened to scalex, and scaley? That might have been a bug introduced in refactoring\n\tvar el;\n\tvar ycorr;\n\tif (!symbol) return null;\n\tif (symbol.length > 1 && symbol.indexOf(\".\") < 0) {\n\t\tvar groupClass = elementGroup.isInGroup() ? '' : options.klass // If this is already in a group then don't repeat the classes for the sub-group)\n\t\trenderer.paper.openGroup({ \"data-name\": options.name, klass: groupClass });\n\t\tvar dx = 0;\n\t\tfor (var i = 0; i < symbol.length; i++) {\n\t\t\tvar s = symbol[i];\n\t\t\tycorr = glyphs.getYCorr(s);\n\t\t\tel = glyphs.printSymbol(x + dx, renderer.calcY(offset + ycorr), s, renderer.paper, { stroke: options.stroke, fill: options.fill });\n\t\t\tif (el) {\n\t\t\t\tif (i < symbol.length - 1)\n\t\t\t\t\tdx += kernSymbols(s, symbol[i + 1], glyphs.getSymbolWidth(s));\n\t\t\t} else {\n\t\t\t\trenderText(renderer, { x: x, y: renderer.y, text: \"no symbol:\" + symbol, type: \"debugfont\", klass: 'debug-msg', anchor: 'start' }, false);\n\t\t\t}\n\t\t}\n\t\tvar g = renderer.paper.closeGroup();\n\t\treturn g;\n\t} else {\n\t\tycorr = glyphs.getYCorr(symbol);\n\t\tif (elementGroup.isInGroup()) {\n\t\t\tel = glyphs.printSymbol(x, renderer.calcY(offset + ycorr), symbol, renderer.paper, { \"data-name\": options.name });\n\t\t} else {\n\t\t\tel = glyphs.printSymbol(x, renderer.calcY(offset + ycorr), symbol, renderer.paper, { klass: options.klass, stroke: options.stroke, fill: options.fill, \"data-name\": options.name });\n\t\t}\n\t\tif (el) {\n\t\t\treturn el;\n\t\t}\n\t\trenderText(renderer, { x: x, y: renderer.y, text: \"no symbol:\" + symbol, type: \"debugfont\", klass: 'debug-msg', anchor: 'start' }, false);\n\t\treturn null;\n\t}\n}\n\nfunction kernSymbols(lastSymbol, thisSymbol, lastSymbolWidth) {\n\t// This is just some adjustments to make it look better.\n\tvar width = lastSymbolWidth;\n\tif (lastSymbol === 'f' && thisSymbol === 'f')\n\t\twidth = width * 2 / 3;\n\tif (lastSymbol === 'p' && thisSymbol === 'p')\n\t\twidth = width * 5 / 6;\n\tif (lastSymbol === 'f' && thisSymbol === 'z')\n\t\twidth = width * 5 / 8;\n\treturn width;\n}\n\nmodule.exports = printSymbol;\n","var printSymbol = require('./print-symbol');\n\nfunction drawDynamics(renderer, params, selectables) {\n\tif (params.pitch === undefined)\n\t\twindow.console.error(\"Dynamic Element y-coordinate not set.\");\n\tvar scalex = 1;\n\tvar scaley = 1;\n\tvar el = printSymbol(renderer, params.anchor.x, params.pitch, params.dec, {\n\t\tscalex: scalex,\n\t\tscaley: scaley,\n\t\tklass: renderer.controller.classes.generate('decoration dynamics'),\n\t\tfill: renderer.foregroundColor,\n\t\tstroke: \"none\",\n\t\tname: \"dynamics\"\n\t});\n\tselectables.wrapSvgEl({ el_type: \"dynamicDecoration\", startChar: -1, endChar: -1, decoration: params.dec }, el);\n\treturn [el];\n}\n\nmodule.exports = drawDynamics;\n","var sprintf = require('./sprintf');\nvar renderText = require('./text');\nvar printPath = require('./print-path');\nvar roundNumber = require(\"./round-number\");\n\nfunction drawTriplet(renderer, params, selectables) {\n\trenderer.paper.openGroup({ klass: renderer.controller.classes.generate('triplet ' + params.durationClass), \"data-name\": \"triplet\" });\n\tif (!params.hasBeam) {\n\t\tdrawBracket(renderer, params.anchor1.x, params.startNote, params.anchor2.x + params.anchor2.w, params.endNote);\n\t}\n\t// HACK: adjust the position of \"3\". It is too high in all cases so we fudge it by subtracting 1 here.\n\trenderText(renderer, { x: params.xTextPos, y: renderer.calcY(params.yTextPos - 1), text: \"\" + params.number, type: 'tripletfont', anchor: \"middle\", centerVertically: true, noClass: true, name: \"\" + params.number }, true);\n\tvar g = renderer.paper.closeGroup();\n\tselectables.wrapSvgEl({ el_type: \"triplet\", startChar: -1, endChar: -1 }, g);\n\treturn g;\n}\n\nfunction drawLine(l, t, r, b) {\n\treturn sprintf(\"M %f %f L %f %f\", roundNumber(l), roundNumber(t), roundNumber(r), roundNumber(b));\n}\n\nfunction drawBracket(renderer, x1, y1, x2, y2) {\n\ty1 = renderer.calcY(y1);\n\ty2 = renderer.calcY(y2);\n\tvar bracketHeight = 5;\n\n\t// Draw vertical lines at the beginning and end\n\tvar pathString = \"\";\n\tpathString += drawLine(x1, y1, x1, y1 + bracketHeight);\n\tpathString += drawLine(x2, y2, x2, y2 + bracketHeight);\n\n\t// figure out midpoints to draw the broken line.\n\tvar midX = x1 + (x2 - x1) / 2;\n\t//var midY = y1 + (y2-y1)/2;\n\tvar gapWidth = 8;\n\tvar slope = (y2 - y1) / (x2 - x1);\n\tvar leftEndX = midX - gapWidth;\n\tvar leftEndY = y1 + (leftEndX - x1) * slope;\n\tpathString += drawLine(x1, y1, leftEndX, leftEndY);\n\tvar rightStartX = midX + gapWidth;\n\tvar rightStartY = y1 + (rightStartX - x1) * slope;\n\tpathString += drawLine(rightStartX, rightStartY, x2, y2);\n\tprintPath(renderer, { path: pathString, stroke: renderer.foregroundColor, \"data-name\": \"triplet-bracket\" });\n}\n\nmodule.exports = drawTriplet;\n","var sprintf = require('./sprintf');\nvar renderText = require('./text');\nvar printPath = require('./print-path');\nvar roundNumber = require(\"./round-number\");\n\nfunction drawEnding(renderer, params, linestartx, lineendx, selectables) {\n\tif (params.pitch === undefined)\n\t\twindow.console.error(\"Ending Element y-coordinate not set.\");\n\tvar y = roundNumber(renderer.calcY(params.pitch));\n\tvar height = 20;\n\tvar pathString = '';\n\n\tif (params.anchor1) {\n\t\tlinestartx = roundNumber(params.anchor1.x + params.anchor1.w);\n\t\tpathString += sprintf(\"M %f %f L %f %f \",\n\t\t\tlinestartx, y, linestartx, roundNumber(y + height));\n\t}\n\n\tif (params.anchor2) {\n\t\tlineendx = roundNumber(params.anchor2.x);\n\t\tpathString += sprintf(\"M %f %f L %f %f \",\n\t\t\tlineendx, y, lineendx, roundNumber(y + height));\n\t}\n\n\tpathString += sprintf(\"M %f %f L %f %f \",\n\t\tlinestartx, y, lineendx, y);\n\n\trenderer.paper.openGroup({ klass: renderer.controller.classes.generate(\"ending\"), \"data-name\": \"ending\" });\n\tprintPath(renderer, { path: pathString, stroke: renderer.foregroundColor, fill: renderer.foregroundColor, \"data-name\": \"line\" });\n\tif (params.anchor1)\n\t\trenderText(renderer, {\n\t\t\tx: roundNumber(linestartx + 5),\n\t\t\ty: roundNumber(renderer.calcY(params.pitch - 0.5)),\n\t\t\ttext: params.text,\n\t\t\ttype: 'repeatfont',\n\t\t\tklass: 'ending',\n\t\t\tanchor: \"start\",\n\t\t\tnoClass: true,\n\t\t\tname: params.text\n\t\t});\n\tvar g = renderer.paper.closeGroup();\n\tselectables.wrapSvgEl({ el_type: \"ending\", startChar: -1, endChar: -1 }, g);\n\treturn [g];\n}\n\nmodule.exports = drawEnding;\n","var sprintf = require('./sprintf');\nvar roundNumber = require(\"./round-number\");\n\nfunction drawTie(renderer, params, linestartx, lineendx, selectables) {\n\tlayout(params, linestartx, lineendx);\n\n\tvar klass = '';\n\tif (params.anchor1) {\n\t\tklass += 'abcjs-start-m' + params.anchor1.parent.counters.measure + '-n' + params.anchor1.parent.counters.note;\n\t} else\n\t\tklass += 'abcjs-start-edge';\n\tif (params.anchor2) {\n\t\tklass += ' abcjs-end-m' + params.anchor2.parent.counters.measure + '-n' + params.anchor2.parent.counters.note;\n\t} else\n\t\tklass += ' abcjs-end-edge';\n\tif (params.hint)\n\t\tklass = \"abcjs-hint\";\n\tvar fudgeY = params.fixedY ? 1.5 : 0; // TODO-PER: This just compensates for drawArc, which contains too much knowledge of ties and slurs.\n\tvar el = drawArc(renderer, params.startX, params.endX, params.startY + fudgeY, params.endY + fudgeY, params.above, klass, params.isTie, params.dotted);\n\tvar startChar = -1\n\t// This gets the start and end points of the contents of the slur. We assume that the parenthesis are just to the outside of that.\n\tif (params.anchor1 && !params.isTie)\n\t\tstartChar = params.anchor1.parent.abcelem.startChar - 1\n\tvar endChar = -1\n\tif (params.anchor2 && !params.isTie)\n\t\tendChar = params.anchor2.parent.abcelem.endChar + 1\n\n\tselectables.wrapSvgEl({ el_type: \"slur\", startChar: startChar, endChar: endChar }, el);\n\treturn [el];\n}\n\n// TODO-PER: I think params part should have been done earlier in the layout pass.\nvar layout = function (params, lineStartX, lineEndX) {\n\t// We now have all of the input variables set, so we can figure out the start and ending x,y coordinates, and finalize the direction of the arc.\n\n\t// Ties and slurs are handled a little differently, so do calculations for them separately.\n\tif (!params.anchor1 || !params.anchor2)\n\t\tparams.isTie = true; // if the slur goes off the end of the line, then draw it like a tie\n\telse if (params.anchor1.pitch === params.anchor2.pitch && params.internalNotes.length === 0)\n\t\tparams.isTie = true;\n\telse\n\t\tparams.isTie = false;\n\n\tif (params.isTie) {\n\t\tparams.calcTieDirection();\n\t\tparams.calcX(lineStartX, lineEndX);\n\t\tparams.calcTieY();\n\n\t} else {\n\t\tparams.calcSlurDirection();\n\t\tparams.calcX(lineStartX, lineEndX);\n\t\tparams.calcSlurY();\n\t}\n\tparams.avoidCollisionAbove();\n};\n\nvar drawArc = function (renderer, x1, x2, pitch1, pitch2, above, klass, isTie, dotted) {\n\t// If it is a tie vs. a slur, draw it shallower.\n\tvar spacing = isTie ? 1.2 : 1.5;\n\n\tx1 = roundNumber(x1 + 6);\n\tx2 = roundNumber(x2 + 4);\n\tpitch1 = pitch1 + ((above) ? spacing : -spacing);\n\tpitch2 = pitch2 + ((above) ? spacing : -spacing);\n\tvar y1 = roundNumber(renderer.calcY(pitch1));\n\tvar y2 = roundNumber(renderer.calcY(pitch2));\n\n\t//unit direction vector\n\tvar dx = x2 - x1;\n\tvar dy = y2 - y1;\n\tvar norm = Math.sqrt(dx * dx + dy * dy);\n\tvar ux = dx / norm;\n\tvar uy = dy / norm;\n\n\tvar flatten = norm / 3.5;\n\tvar maxFlatten = isTie ? 10 : 25; // If it is a tie vs. a slur, draw it shallower.\n\tvar curve = ((above) ? -1 : 1) * Math.min(maxFlatten, Math.max(4, flatten));\n\n\tvar controlx1 = roundNumber(x1 + flatten * ux - curve * uy);\n\tvar controly1 = roundNumber(y1 + flatten * uy + curve * ux);\n\tvar controlx2 = roundNumber(x2 - flatten * ux - curve * uy);\n\tvar controly2 = roundNumber(y2 - flatten * uy + curve * ux);\n\tvar thickness = 2;\n\tif (klass)\n\t\tklass += ' slur';\n\telse\n\t\tklass = 'slur';\n\tklass += isTie ? ' tie' : ' legato';\n\tvar ret;\n\tif (dotted) {\n\t\tklass += ' dotted';\n\t\tvar pathString2 = sprintf(\"M %f %f C %f %f %f %f %f %f\", x1, y1,\n\t\t\tcontrolx1, controly1, controlx2, controly2, x2, y2);\n\t\tret = renderer.paper.path({ path: pathString2, stroke: renderer.foregroundColor, fill: \"none\", 'stroke-dasharray': \"5 5\", 'class': renderer.controller.classes.generate(klass), \"data-name\": isTie ? \"tie\" : \"slur\" });\n\t} else {\n\t\tvar pathString = sprintf(\"M %f %f C %f %f %f %f %f %f C %f %f %f %f %f %f z\", x1, y1,\n\t\t\tcontrolx1, controly1, controlx2, controly2, x2, y2,\n\t\t\troundNumber(controlx2 - thickness * uy), roundNumber(controly2 + thickness * ux), roundNumber(controlx1 - thickness * uy), roundNumber(controly1 + thickness * ux), x1, y1);\n\t\tret = renderer.paper.path({ path: pathString, stroke: \"none\", fill: renderer.foregroundColor, 'class': renderer.controller.classes.generate(klass), \"data-name\": isTie ? \"tie\" : \"slur\" });\n\t}\n\n\treturn ret;\n};\n\nmodule.exports = drawTie;\n","var printPath = require('./print-path');\nvar roundNumber = require(\"./round-number\");\n\nfunction drawBeam(renderer, params) {\n\tif (params.beams.length === 0) return;\n\n\tvar pathString = \"\";\n\tfor (var i = 0; i < params.beams.length; i++) {\n\t\tvar beam = params.beams[i];\n\t\tif (beam.split) {\n\t\t\tvar slope = getSlope(renderer, beam.startX, beam.startY, beam.endX, beam.endY);\n\t\t\tvar xes = [];\n\t\t\tfor (var j = 0; j < beam.split.length; j += 2) {\n\t\t\t\txes.push([beam.split[j], beam.split[j + 1]]);\n\t\t\t}\n\t\t\tfor (j = 0; j < xes.length; j++) {\n\t\t\t\tvar y1 = getY(beam.startX, beam.startY, slope, xes[j][0]);\n\t\t\t\tvar y2 = getY(beam.startX, beam.startY, slope, xes[j][1]);\n\t\t\t\tpathString += draw(renderer, xes[j][0], y1, xes[j][1], y2, beam.dy);\n\t\t\t}\n\t\t} else\n\t\t\tpathString += draw(renderer, beam.startX, beam.startY, beam.endX, beam.endY, beam.dy);\n\t}\n\tvar durationClass = (\"abcjs-d\" + params.duration).replace(/\\./g, \"-\");\n\tvar klasses = renderer.controller.classes.generate('beam-elem ' + durationClass);\n\tvar el = printPath(renderer, {\n\t\tpath: pathString,\n\t\tstroke: \"none\",\n\t\tfill: renderer.foregroundColor,\n\t\t'class': klasses\n\t});\n\treturn [el];\n}\n\nfunction draw(renderer, startX, startY, endX, endY, dy) {\n\t// the X coordinates are actual coordinates, but the Y coordinates are in pitches.\n\tstartY = roundNumber(renderer.calcY(startY));\n\tendY = roundNumber(renderer.calcY(endY));\n\tstartX = roundNumber(startX);\n\tendX = roundNumber(endX);\n\tvar startY2 = roundNumber(startY + dy);\n\tvar endY2 = roundNumber(endY + dy);\n\treturn \"M\" + startX + \" \" + startY + \" L\" + endX + \" \" + endY +\n\t\t\"L\" + endX + \" \" + endY2 + \" L\" + startX + \" \" + startY2 + \"z\";\n}\n\nfunction getSlope(renderer, startX, startY, endX, endY) {\n\treturn (endY - startY) / (endX - startX);\n}\n\nfunction getY(startX, startY, slope, currentX) {\n\tvar x = currentX - startX;\n\treturn startY + x * slope;\n}\n\nmodule.exports = drawBeam;\n","var elementGroup = require('./group-elements');\nvar roundNumber = require(\"./round-number\");\n\nfunction printStem(renderer, x, dx, y1, y2, klass, name) {\n\tif (dx < 0 || y1 < y2) { // correct path \"handedness\" for intersection with other elements\n\t\tvar tmp = roundNumber(y2);\n\t\ty2 = roundNumber(y1);\n\t\ty1 = tmp;\n\t} else {\n\t\ty1 = roundNumber(y1);\n\t\ty2 = roundNumber(y2);\n\t}\n\tx = roundNumber(x);\n\tvar x2 = roundNumber(x + dx);\n\t// TODO-PER: This fixes a firefox bug where it isn't displayed\n\tif (renderer.firefox112) {\n\t\tx += dx / 2; // Because the x coordinate is the edge of where the line goes but the width widens from the middle.\n\t\tvar attr = {\n\t\t\tx1: x,\n\t\t\tx2: x,\n\t\t\ty1: y1,\n\t\t\ty2: y2,\n\t\t\tstroke: renderer.foregroundColor,\n\t\t\t'stroke-width': Math.abs(dx)\n\t\t}\n\t\tif (klass)\n\t\t\tattr['class'] = klass;\n\t\tif (name)\n\t\t\tattr['data-name'] = name;\n\t\t\n\t\treturn renderer.paper.lineToBack(attr);\n\t}\n\tvar pathArray = [[\"M\", x, y1], [\"L\", x, y2], [\"L\", x2, y2], [\"L\", x2, y1], [\"z\"]];\n\tvar attr = { path: \"\" };\n\tfor (var i = 0; i < pathArray.length; i++)\n\t\tattr.path += pathArray[i].join(\" \");\n\tif (klass)\n\t\tattr['class'] = klass;\n\tif (name)\n\t\tattr['data-name'] = name;\n\tif (!elementGroup.isInGroup()) {\n\t\tattr.stroke = \"none\";\n\t\tattr.fill = renderer.foregroundColor;\n\t}\n\treturn renderer.paper.pathToBack(attr);\n}\n\nmodule.exports = printStem;\n","var sprintf = require('./sprintf');\nvar roundNumber = require(\"./round-number\");\n\nfunction printLine(renderer, x1, x2, y, klass, name, dy) {\n\tvar fill = renderer.foregroundColor;\n\tx1 = roundNumber(x1);\n\tx2 = roundNumber(x2);\n\tvar y1 = roundNumber(y - dy);\n\tvar y2 = roundNumber(y + dy);\n\t// TODO-PER: This fixes a firefox bug where it isn't displayed\n\tif (renderer.firefox112) {\n\t\ty += dy / 2; // Because the y coordinate is the edge of where the line goes but the width widens from the middle.\n\t\tvar attr = {\n\t\t\tx1: x1,\n\t\t\tx2: x2,\n\t\t\ty1: y,\n\t\t\ty2: y,\n\t\t\tstroke: renderer.foregroundColor,\n\t\t\t'stroke-width': Math.abs(dy*2)\n\t\t}\n\t\tif (klass)\n\t\t\tattr['class'] = klass;\n\t\tif (name)\n\t\t\tattr['data-name'] = name;\n\t\t\n\t\treturn renderer.paper.lineToBack(attr);\n\t}\n\n\tvar pathString = sprintf(\"M %f %f L %f %f L %f %f L %f %f z\", x1, y1, x2, y1,\n\t\tx2, y2, x1, y2);\n\tvar options = { path: pathString, stroke: \"none\", fill: fill };\n\tif (name)\n\t\toptions['data-name'] = name;\n\tif (klass)\n\t\toptions['class'] = klass;\n\tvar ret = renderer.paper.pathToBack(options);\n\n\treturn ret;\n}\n\nmodule.exports = printLine;\n\n","var printLine = require('./print-line');\n\nfunction printStaffLine(renderer, x1, x2, pitch, klass, name, dy) {\n\tvar y = renderer.calcY(pitch);\n\treturn printLine(renderer, x1, x2, y, klass, name, dy);\n}\n\nmodule.exports = printStaffLine;\n\n","var renderText = require('./text');\nvar printStem = require('./print-stem');\nvar printStaffLine = require('./staff-line');\nvar printSymbol = require('./print-symbol');\n\nfunction drawRelativeElement(renderer, params, bartop) {\n\tif (params.pitch === undefined)\n\t\twindow.console.error(params.type + \" Relative Element y-coordinate not set.\");\n\tvar y = renderer.calcY(params.pitch);\n\tswitch (params.type) {\n\t\tcase \"symbol\":\n\t\t\tif (params.c === null) return null;\n\t\t\tvar klass = \"symbol\";\n\t\t\tif (params.klass) klass += \" \" + params.klass;\n\t\t\tparams.graphelem = printSymbol(renderer, params.x, params.pitch, params.c, {\n\t\t\t\tscalex: params.scalex,\n\t\t\t\tscaley: params.scaley,\n\t\t\t\tklass: renderer.controller.classes.generate(klass),\n\t\t\t\t//\t\t\t\tfill:\"none\",\n\t\t\t\t//\t\t\t\tstroke: renderer.foregroundColor,\n\t\t\t\tname: params.name\n\t\t\t});\n\t\t\tbreak;\n\t\tcase \"debug\":\n\t\t\tparams.graphelem = renderText(renderer, { x: params.x, y: renderer.calcY(15), text: \"\" + params.c, type: \"debugfont\", klass: renderer.controller.classes.generate('debug-msg'), anchor: 'start', centerVertically: false, dim: params.dim }, false);\n\t\t\tbreak;\n\t\tcase \"tabNumber\":\n\t\t\tvar hAnchor = \"middle\";\n\t\t\tvar tabFont = \"tabnumberfont\";\n\t\t\tvar tabClass = 'abcjs-tab-number';\n\t\t\tif (params.isGrace) {\n\t\t\t\ttabFont = \"tabgracefont\";\n\t\t\t\ty += 2.5;\n\t\t\t\ttabClass = 'tab-grace'\n\t\t\t}\n\t\t\tparams.graphelem = renderText(renderer, { x: params.x, y: y, text: \"\" + params.c, type: tabFont, klass: renderer.controller.classes.generate(tabClass), anchor: hAnchor, centerVertically: false, dim: params.dim, cursor: 'default' }, false);\n\t\t\tbreak;\n\t\tcase \"barNumber\":\n\t\t\tparams.graphelem = renderText(renderer, { x: params.x, y: y, text: \"\" + params.c, type: \"measurefont\", klass: renderer.controller.classes.generate('bar-number'), anchor: \"middle\", dim: params.dim, name: \"bar-number\" }, true);\n\t\t\tbreak;\n\t\tcase \"lyric\":\n\t\t\tparams.graphelem = renderText(renderer, { x: params.x, y: y, text: params.c, type: \"vocalfont\", klass: renderer.controller.classes.generate('lyric'), anchor: \"middle\", dim: params.dim, name: \"lyric\" }, false);\n\t\t\tbreak;\n\t\tcase \"chord\":\n\t\t\tparams.graphelem = renderText(renderer, { x: params.x, y: y, text: params.c, type: 'gchordfont', klass: renderer.controller.classes.generate(\"chord\"), anchor: \"middle\", dim: params.dim, lane: params.getLane(), name: \"chord\" }, false);\n\t\t\tbreak;\n\t\tcase \"decoration\":\n\t\t\t// The +6 is to compensate for the placement of text in svg: to be on the same row as symbols, the y-coord needs to compensate for the center line.\n\t\t\tparams.graphelem = renderText(renderer, { x: params.x, y: y + 6, text: params.c, type: 'annotationfont', klass: renderer.controller.classes.generate(\"annotation\"), anchor: params.anchor, centerVertically: true, dim: params.dim }, false);\n\t\t\tbreak;\n\t\tcase \"text\":\n\t\t\tparams.graphelem = renderText(renderer, { x: params.x, y: y, text: params.c, type: 'annotationfont', klass: renderer.controller.classes.generate(\"annotation\"), anchor: \"start\", centerVertically: params.centerVertically, dim: params.dim, lane: params.getLane(), name: \"annotation\" }, false);\n\t\t\tbreak;\n\t\tcase \"multimeasure-text\":\n\t\t\tparams.graphelem = renderText(renderer, { x: params.x + params.w / 2, y: y, text: params.c, type: 'tempofont', klass: renderer.controller.classes.generate(\"rest\"), anchor: \"middle\", centerVertically: false, dim: params.dim }, false);\n\t\t\tbreak;\n\t\tcase \"part\":\n\t\t\tparams.graphelem = renderText(renderer, { x: params.x, y: y, text: params.c, type: 'partsfont', klass: renderer.controller.classes.generate(\"part\"), anchor: \"start\", dim: params.dim, name: params.c }, true);\n\t\t\tbreak;\n\t\tcase \"bar\":\n\t\t\tparams.graphelem = printStem(renderer, params.x, params.linewidth + renderer.lineThickness, y, (bartop) ? bartop : renderer.calcY(params.pitch2), null, \"bar\"); break; // bartop can't be 0\n\t\tcase \"stem\":\n\t\t\tvar stemWidth = params.linewidth > 0 ? params.linewidth + renderer.lineThickness : params.linewidth - renderer.lineThickness\n\t\t\tparams.graphelem = printStem(renderer, params.x, stemWidth, y, renderer.calcY(params.pitch2), 'abcjs-stem', 'stem'); break;\n\t\tcase \"ledger\":\n\t\t\tparams.graphelem = printStaffLine(renderer, params.x, params.x + params.w, params.pitch, \"abcjs-ledger\", \"ledger\", 0.35 + renderer.lineThickness); break;\n\t}\n\tif (params.scalex !== 1 && params.graphelem) {\n\t\tscaleExistingElem(renderer.paper, params.graphelem, params.scalex, params.scaley, params.x, y);\n\t}\n\treturn params.graphelem;\n}\n\nfunction scaleExistingElem(paper, elem, scaleX, scaleY, x, y) {\n\tpaper.setAttributeOnElement(elem, { style: \"transform:scale(\" + scaleX + \",\" + scaleY + \");transform-origin:\" + x + \"px \" + y + \"px;\" });\n}\n\nmodule.exports = drawRelativeElement;\n","var drawRelativeElement = require('./relative');\nvar renderText = require('./text');\n\nfunction drawTempo(renderer, params) {\n\tvar x = params.x;\n\tif (params.pitch === undefined)\n\t\twindow.console.error(\"Tempo Element y-coordinate not set.\");\n\n\t//var tempoGroup;\n\tparams.tempo.el_type = \"tempo\";\n\t//\trenderer.wrapInAbsElem(params.tempo, \"abcjs-tempo\", function () {\n\t//renderer.paper.openGroup({klass: renderer.controller.classes.generate(\"tempo wha\")});\n\t// The text is aligned with extra room for descenders but numbers look like they are a little too high, so bump it a little.\n\tvar descenderHeight = 2;\n\tvar y = renderer.calcY(params.pitch) + 2;\n\tvar text;\n\tvar size;\n\tif (params.tempo.preString) {\n\t\ttext = renderText(renderer, { x: x, y: y, text: params.tempo.preString, type: 'tempofont', klass: 'abcjs-tempo', anchor: \"start\", noClass: true, name: \"pre\" }, true);\n\t\tsize = renderer.controller.getTextSize.calc(params.tempo.preString, 'tempofont', 'tempo', text);\n\t\tvar preWidth = size.width;\n\t\tvar charWidth = preWidth / params.tempo.preString.length; // Just get some average number to increase the spacing.\n\t\tx += preWidth + charWidth;\n\t}\n\tif (params.note) {\n\t\tparams.note.setX(x);\n\t\tfor (var i = 0; i < params.note.children.length; i++)\n\t\t\tdrawRelativeElement(renderer, params.note.children[i], x);\n\t\tx += (params.note.w + 5);\n\t\tvar str = \"= \" + params.tempo.bpm;\n\t\ttext = renderText(renderer, { x: x, y: y, text: str, type: 'tempofont', klass: 'abcjs-tempo', anchor: \"start\", noClass: true, name: \"beats\" });\n\t\tsize = renderer.controller.getTextSize.calc(str, 'tempofont', 'tempo', text);\n\t\tvar postWidth = size.width;\n\t\tvar charWidth2 = postWidth / str.length; // Just get some average number to increase the spacing.\n\t\tx += postWidth + charWidth2;\n\t}\n\tif (params.tempo.postString) {\n\t\trenderText(renderer, { x: x, y: y, text: params.tempo.postString, type: 'tempofont', klass: 'abcjs-tempo', anchor: \"start\", noClass: true, name: \"post\" }, true);\n\t}\n\t//tempoGroup = renderer.paper.closeGroup();\n\t//\t});\n\t//return [tempoGroup];\n}\n\nmodule.exports = drawTempo;\n","var drawTempo = require('./tempo');\nvar drawRelativeElement = require('./relative');\nvar spacing = require('../helpers/spacing');\nvar setClass = require('../helpers/set-class');\nvar elementGroup = require('./group-elements');\n\nfunction drawAbsolute(renderer, params, bartop, selectables, staffPos) {\n\tif (params.invisible) return;\n\tvar isTempo = params.children.length > 0 && params.children[0].type === \"TempoElement\";\n\tparams.elemset = [];\n\telementGroup.beginGroup(renderer.paper, renderer.controller);\n\tfor (var i = 0; i < params.children.length; i++) {\n\t\tvar child = params.children[i];\n\t\tswitch (child.type) {\n\t\t\tcase \"TempoElement\":\n\t\t\t\tdrawTempo(renderer, child);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tvar el = drawRelativeElement(renderer, child, bartop);\n\t\t\t\tif (child.type === \"symbol\" && child.c && child.c.indexOf('notehead') >= 0) {\n\t\t\t\t\tel.setAttribute('class', 'abcjs-notehead')\n\t\t\t\t}\n\t\t}\n\t}\n\tvar klass = params.type;\n\tif (params.type === 'note' || params.type === 'rest') {\n\t\tparams.counters = renderer.controller.classes.getCurrent();\n\t\tklass += ' d' + Math.round(params.durationClass * 1000) / 1000;\n\t\tklass = klass.replace(/\\./g, '-');\n\t\tif (params.abcelem.pitches) {\n\t\t\tfor (var j = 0; j < params.abcelem.pitches.length; j++) {\n\t\t\t\tklass += ' p' + params.abcelem.pitches[j].pitch;\n\t\t\t}\n\t\t}\n\t}\n\tvar g = elementGroup.endGroup(klass, params.type);\n\tif (g) {\n\t\t// TODO-PER-HACK! This corrects the classes because the tablature is not being created at the right time.\n\t\tif (params.cloned) {\n\t\t\tparams.cloned.overrideClasses = g.className.baseVal\n\t\t}\n\t\tif (params.overrideClasses) {\n\t\t\tvar type = g.classList && g.classList.length > 0 ? g.classList[0] + ' ' : ''\n\t\t\tg.setAttribute(\"class\", type + params.overrideClasses)\n\t\t}\n\t\tif (isTempo) {\n\t\t\tparams.startChar = params.abcelem.startChar;\n\t\t\tparams.endChar = params.abcelem.endChar;\n\t\t\tselectables.add(params, g, false, staffPos);\n\t\t} else {\n\t\t\tparams.elemset.push(g);\n\t\t\tvar isSelectable = false;\n\t\t\tif (params.type === 'note' || params.type === 'tabNumber') {\n\t\t\t\tisSelectable = true;\n\t\t\t}\n\t\t\tselectables.add(params, g, isSelectable, staffPos);\n\t\t}\n\t} else if (params.elemset.length > 0)\n\t\tselectables.add(params, params.elemset[0], params.type === 'note', staffPos);\n\t// If there was no output, then don't add to the selectables. This happens when using the \"y\" spacer, for instance.\n\n\tif (params.klass)\n\t\tsetClass(params.elemset, \"mark\", \"\", \"#00ff00\");\n\tif (params.hint)\n\t\tsetClass(params.elemset, \"abcjs-hint\", \"\", null);\n\tparams.abcelem.abselem = params;\n\n\tif (params.heads && params.heads.length > 0) {\n\t\tparams.notePositions = [];\n\t\tfor (var jj = 0; jj < params.heads.length; jj++) {\n\t\t\tparams.notePositions.push({\n\t\t\t\tx: params.heads[jj].x + params.heads[jj].w / 2,\n\t\t\t\ty: staffPos.zero - params.heads[jj].pitch * spacing.STEP\n\t\t\t});\n\t\t}\n\t}\n}\n\nmodule.exports = drawAbsolute;\n","var drawGlissando = require('./glissando');\nvar drawCrescendo = require('./crescendo');\nvar drawDynamics = require('./dynamics');\nvar drawTriplet = require('./triplet');\nvar drawEnding = require('./ending');\nvar drawTie = require('./tie');\nvar drawBeam = require('./beam');\nvar renderText = require('./text');\nvar drawAbsolute = require('./absolute');\n\nfunction drawVoice(renderer, params, bartop, selectables, staffPos) {\n\tvar width = params.w - 1;\n\trenderer.staffbottom = params.staff.bottom;\n\tvar saveColor = renderer.foregroundColor\n\tif (params.color)\n\t\trenderer.foregroundColor = params.color\n\n\tif (params.header) { // print voice name\n\t\tvar textEl = renderText(renderer, { x: renderer.padding.left, y: renderer.calcY(params.headerPosition), text: params.header, type: 'voicefont', klass: 'staff-extra voice-name', anchor: 'start', centerVertically: true, name: \"voice-name\" }, true);\n\t\tselectables.wrapSvgEl({ el_type: \"voiceName\", startChar: -1, endChar: -1, text: params.header }, textEl);\n\t}\n\n\tvar i;\n\tvar child;\n\tvar foundNote = false;\n\tfor (i = 0; i < params.children.length; i++) {\n\t\tchild = params.children[i];\n\t\tif (child.type === 'note' || child.type === 'rest')\n\t\t\tfoundNote = true;\n\t\tvar justInitializedMeasureNumber = false;\n\t\tif (child.type !== 'staff-extra' && !renderer.controller.classes.isInMeasure()) {\n\t\t\trenderer.controller.classes.startMeasure();\n\t\t\tjustInitializedMeasureNumber = true;\n\t\t}\n\t\tif (params.staff.isTabStaff) {\n\t\t\tchild.invisible = false;\n\t\t\tif (child.type == 'bar') {\n\t\t\t\tif (child.abcelem.lastBar) {\n\t\t\t\t\tbartop = params.topLine;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tdrawAbsolute(renderer, child, (params.barto || i === params.children.length - 1) ? bartop : 0, selectables, staffPos);\n\n\t\tif (child.type === 'note' || isNonSpacerRest(child))\n\t\t\trenderer.controller.classes.incrNote();\n\t\tif (child.type === 'bar' && !justInitializedMeasureNumber && foundNote) {\n\t\t\trenderer.controller.classes.incrMeasure();\n\t\t}\n\t}\n\n\trenderer.controller.classes.startMeasure();\n\n\tfor (i = 0; i < params.beams.length; i++) {\n\t\tvar beam = params.beams[i];\n\t\tif (beam === 'bar') {\n\t\t\trenderer.controller.classes.incrMeasure();\n\t\t} else\n\t\t\tdrawBeam(renderer, beam, selectables); // beams must be drawn first for proper printing of triplets, slurs and ties.\n\t}\n\n\trenderer.controller.classes.startMeasure();\n\tfor (i = 0; i < params.otherchildren.length; i++) {\n\t\tchild = params.otherchildren[i];\n\t\tif (child === 'bar') {\n\t\t\trenderer.controller.classes.incrMeasure();\n\t\t} else {\n\t\t\tswitch (child.type) {\n\t\t\t\tcase \"GlissandoElem\":\n\t\t\t\t\tchild.elemset = drawGlissando(renderer, child, selectables);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"CrescendoElem\":\n\t\t\t\t\tchild.elemset = drawCrescendo(renderer, child, selectables);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"DynamicDecoration\":\n\t\t\t\t\tchild.elemset = drawDynamics(renderer, child, selectables);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"TripletElem\":\n\t\t\t\t\tdrawTriplet(renderer, child, selectables);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"EndingElem\":\n\t\t\t\t\tchild.elemset = drawEnding(renderer, child, params.startx + 10, width, selectables);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"TieElem\":\n\t\t\t\t\tchild.elemset = drawTie(renderer, child, params.startx + 10, width, selectables);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tconsole.log(child);\n\t\t\t\t\tdrawAbsolute(renderer, child, params.startx + 10, width, selectables, staffPos);\n\t\t\t}\n\t\t}\n\t}\n\trenderer.foregroundColor = saveColor\n\n}\n\nfunction isNonSpacerRest(elem) {\n\tif (elem.type !== 'rest')\n\t\treturn false;\n\tif (elem.abcelem && elem.abcelem.rest && elem.abcelem.rest.type !== 'spacer')\n\t\treturn true;\n\treturn false;\n}\n\nmodule.exports = drawVoice;\n","var printStaffLine = require('./staff-line');\n\nfunction printStaff(renderer, startx, endx, numLines, linePitch, dy) {\n\tvar klass = \"abcjs-top-line\";\n\tvar pitch = 2;\n\tif (linePitch) {\n\t\tpitch = linePitch;\n\t}\n\trenderer.paper.openGroup({ prepend: true, klass: renderer.controller.classes.generate(\"abcjs-staff\") });\n\t// If there is one line, it is the B line. Otherwise, the bottom line is the E line.\n\tvar firstYLine = 0;\n\tvar lastYLine = 0;\n\tif (numLines === 1) {\n\t\tprintStaffLine(renderer, startx, endx, 6, klass, null, dy + renderer.lineThickness);\n\t\tfirstYLine = renderer.calcY(10);\n\t\tlastYLine = renderer.calcY(2);\n\t} else {\n\n\t\tfor (var i = numLines - 1; i >= 0; i--) {\n\t\t\tvar curpitch = (i + 1) * pitch;\n\t\t\tlastYLine = renderer.calcY(curpitch);\n\t\t\tif (firstYLine === 0) {\n\t\t\t\tfirstYLine = lastYLine;\n\t\t\t}\n\t\t\tprintStaffLine(renderer, startx, endx, curpitch, klass, null, dy + renderer.lineThickness);\n\t\t\tklass = undefined;\n\t\t}\n\t}\n\trenderer.paper.closeGroup();\n\treturn [firstYLine, lastYLine];\n}\n\nmodule.exports = printStaff;\n","function printDebugBox(renderer, attr, comment) {\n\tvar box = renderer.paper.rectBeneath(attr);\n\tif (comment)\n\t\trenderer.paper.text(comment, { x: 0, y: attr.y + 7, \"text-anchor\": \"start\", \"font-size\": \"14px\", fill: \"rgba(0,0,255,.4)\", stroke: \"rgba(0,0,255,.4)\" });\n\treturn box;\n}\n\nmodule.exports = printDebugBox;\n","function drawSeparator(renderer, width) {\n\tvar fill = \"rgba(0,0,0,255)\";\n\tvar stroke = \"rgba(0,0,0,0)\";\n\tvar y = Math.round(renderer.y);\n\tvar staffWidth = renderer.controller.width;\n\tvar x1 = (staffWidth - width) / 2;\n\tvar x2 = x1 + width;\n\tvar pathString = 'M ' + x1 + ' ' + y +\n\t\t' L ' + x2 + ' ' + y +\n\t\t' L ' + x2 + ' ' + (y + 1) +\n\t\t' L ' + x1 + ' ' + (y + 1) +\n\t\t' L ' + x1 + ' ' + y + ' z';\n\trenderer.paper.pathToBack({ path: pathString, stroke: stroke, fill: fill, 'class': renderer.controller.classes.generate('defined-text') });\n}\n\nmodule.exports = drawSeparator;\n","var drawSeparator = require('./separator');\nvar renderText = require('./text');\n\nfunction nonMusic(renderer, obj, selectables) {\n\tfor (var i = 0; i < obj.rows.length; i++) {\n\t\tvar row = obj.rows[i];\n\t\tif (row.absmove) {\n\t\t\trenderer.absolutemoveY(row.absmove);\n\t\t} else if (row.move) {\n\t\t\trenderer.moveY(row.move);\n\t\t} else if (row.text || row.phrases) {\n\t\t\tvar x = row.left ? row.left : 0;\n\t\t\tvar el = renderText(renderer, {\n\t\t\t\tx: x,\n\t\t\t\ty: renderer.y,\n\t\t\t\ttext: row.text,\n\t\t\t\tphrases: row.phrases,\n\t\t\t\t'dominant-baseline': row['dominant-baseline'],\n\t\t\t\ttype: row.font,\n\t\t\t\tklass: row.klass,\n\t\t\t\tname: row.name,\n\t\t\t\tanchor: row.anchor\n\t\t\t});\n\t\t\tif (row.absElemType) {\n\t\t\t\tselectables.wrapSvgEl({\n\t\t\t\t\tel_type: row.absElemType,\n\t\t\t\t\tname: row.name,\n\t\t\t\t\tstartChar: row.startChar,\n\t\t\t\t\tendChar: row.endChar,\n\t\t\t\t\ttext: row.text\n\t\t\t\t}, el);\n\t\t\t}\n\t\t} else if (row.separator) {\n\t\t\tdrawSeparator(renderer, row.separator)\n\t\t} else if (row.startGroup) {\n\t\t\trenderer.paper.openGroup({ klass: row.klass, \"data-name\": row.name });\n\t\t} else if (row.endGroup) {\n\t\t\t// TODO-PER: also create a history element with the title \"row.endGroup\"\n\t\t\tvar g = renderer.paper.closeGroup();\n\t\t\tif (row.absElemType)\n\t\t\t\tselectables.wrapSvgEl({\n\t\t\t\t\tel_type: row.absElemType,\n\t\t\t\t\tname: row.name,\n\t\t\t\t\tstartChar: row.startChar,\n\t\t\t\t\tendChar: row.endChar,\n\t\t\t\t\ttext: \"\"\n\t\t\t\t}, g);\n\t\t}\n\t}\n}\n\nmodule.exports = nonMusic;\n","var spacing = require('../helpers/spacing');\nvar drawBrace = require('./brace');\nvar drawVoice = require('./voice');\nvar printStaff = require('./staff');\nvar printDebugBox = require('./debug-box');\nvar printStem = require('./print-stem');\nvar nonMusic = require('./non-music');\n\nfunction drawStaffGroup(renderer, params, selectables, lineNumber) {\n\t// We enter this method with renderer.y pointing to the topmost coordinate that we're allowed to draw.\n\t// All of the children that will be drawn have a relative \"pitch\" set, where zero is the first ledger line below the staff.\n\t// renderer.y will be offset at the beginning of each staff by the amount required to make the relative pitch work.\n\t// If there are multiple staves, then renderer.y will be incremented for each new staff.\n\n\tvar colorIndex;\n\n\t// An invisible marker is useful to be able to find where each system starts.\n\t//addInvisibleMarker(renderer, \"abcjs-top-of-system\");\n\n\tvar startY = renderer.y; // So that it can be restored after we're done.\n\t// Set the absolute Y position for each staff here, so the voice drawing below can just use if.\n\tfor (var j = 0; j < params.staffs.length; j++) {\n\t\tvar staff1 = params.staffs[j];\n\t\t//renderer.printHorizontalLine(50, renderer.y, \"start\");\n\t\trenderer.moveY(spacing.STEP, staff1.top);\n\t\tstaff1.absoluteY = renderer.y;\n\t\tif (renderer.showDebug) {\n\t\t\tif (renderer.showDebug.indexOf(\"box\") >= 0 && staff1.voices) {\n\t\t\t\tboxAllElements(renderer, params.voices, staff1.voices);\n\t\t\t}\n\t\t\tif (renderer.showDebug.indexOf(\"grid\") >= 0) {\n\t\t\t\trenderer.paper.dottedLine({ x1: renderer.padding.left, x2: renderer.padding.left + renderer.controller.width, y1: startY, y2: startY, stroke: \"#0000ff\" });\n\t\t\t\tprintDebugBox(renderer,\n\t\t\t\t\t{\n\t\t\t\t\t\tx: renderer.padding.left,\n\t\t\t\t\t\ty: renderer.calcY(staff1.originalTop),\n\t\t\t\t\t\twidth: renderer.controller.width,\n\t\t\t\t\t\theight: renderer.calcY(staff1.originalBottom) - renderer.calcY(staff1.originalTop),\n\t\t\t\t\t\tfill: renderer.foregroundColor,\n\t\t\t\t\t\tstroke: renderer.foregroundColor,\n\t\t\t\t\t\t\"fill-opacity\": 0.1,\n\t\t\t\t\t\t\"stroke-opacity\": 0.1\n\t\t\t\t\t});\n\t\t\t\tcolorIndex = 0;\n\t\t\t\tdebugPrintGridItem(staff1, 'chordHeightAbove');\n\t\t\t\tdebugPrintGridItem(staff1, 'chordHeightBelow');\n\t\t\t\tdebugPrintGridItem(staff1, 'dynamicHeightAbove');\n\t\t\t\tdebugPrintGridItem(staff1, 'dynamicHeightBelow');\n\t\t\t\tdebugPrintGridItem(staff1, 'endingHeightAbove');\n\t\t\t\tdebugPrintGridItem(staff1, 'lyricHeightAbove');\n\t\t\t\tdebugPrintGridItem(staff1, 'lyricHeightBelow');\n\t\t\t\tdebugPrintGridItem(staff1, 'partHeightAbove');\n\t\t\t\tdebugPrintGridItem(staff1, 'tempoHeightAbove');\n\t\t\t\tdebugPrintGridItem(staff1, 'volumeHeightAbove');\n\t\t\t\tdebugPrintGridItem(staff1, 'volumeHeightBelow');\n\t\t\t}\n\t\t}\n\t\trenderer.moveY(spacing.STEP, -staff1.bottom);\n\t\tif (renderer.showDebug) {\n\t\t\tif (renderer.showDebug.indexOf(\"grid\") >= 0) {\n\t\t\t\trenderer.paper.dottedLine({\n\t\t\t\t\tx1: renderer.padding.left,\n\t\t\t\t\tx2: renderer.padding.left + renderer.controller.width,\n\t\t\t\t\ty1: renderer.y,\n\t\t\t\t\ty2: renderer.y,\n\t\t\t\t\tstroke: \"#0000aa\"\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\tvar topLine; // these are to connect multiple staves. We need to remember where they are.\n\tvar bottomLine;\n\n\tvar linePitch = 2;\n\tvar bartop = 0;\n\tfor (var i = 0; i < params.voices.length; i++) {\n\t\tvar staff = params.voices[i].staff;\n\t\tvar tabName = params.voices[i].tabNameInfos;\n\t\trenderer.y = staff.absoluteY;\n\t\trenderer.controller.classes.incrVoice();\n\t\t//renderer.y = staff.y;\n\t\t// offset for starting the counting at middle C\n\t\tif (!params.voices[i].duplicate) {\n\t\t\t//\t\t\trenderer.moveY(spacing.STEP, staff.top);\n\t\t\tif (!topLine) topLine = renderer.calcY(10);\n\t\t\tbottomLine = renderer.calcY(linePitch);\n\t\t\tif (staff.lines !== 0) {\n\t\t\t\tif (staff.linePitch) {\n\t\t\t\t\tlinePitch = staff.linePitch;\n\t\t\t\t}\n\t\t\t\trenderer.controller.classes.newMeasure();\n\t\t\t\tvar lines = printStaff(renderer, params.startx, params.w, staff.lines, staff.linePitch, 0.35);\n\t\t\t\tbottomLine = lines[1];\n\t\t\t\tstaff.bottomLine = bottomLine;\n\t\t\t\tstaff.topLine = lines[0];\n\t\t\t\t// rework bartop when tabs are present with current staff\n\t\t\t\tif (staff.hasTab) {\n\t\t\t\t\t// do not link to staff above (ugly looking)\n\t\t\t\t\tbartop = staff.topLine;\n\t\t\t\t}\n\t\t\t\tif (staff.hasStaff) {\n\t\t\t\t\t// this is a tab\n\t\t\t\t\tbartop = staff.hasStaff.topLine;\n\t\t\t\t\tparams.voices[i].barto = true;\n\t\t\t\t\tparams.voices[i].topLine = topLine;\n\t\t\t\t}\n\n\t\t\t}\n\t\t\tprintBrace(renderer, staff.absoluteY, params.brace, i, selectables);\n\t\t\tprintBrace(renderer, staff.absoluteY, params.bracket, i, selectables);\n\t\t}\n\t\tdrawVoice(renderer, params.voices[i], bartop, selectables, {\n\t\t\ttop: startY,\n\t\t\tzero: renderer.y,\n\t\t\theight: params.height * spacing.STEP\n\t\t});\n\t\tvar tabNameHeight = 0;\n\t\tif (tabName) {\n\t\t\t// print tab infos on staffBottom\n\t\t\tvar r = { rows: [] };\n\t\t\tr.rows.push({ absmove: bottomLine + 2 });\n\t\t\tvar leftMargin = 8;\n\t\t\tr.rows.push({ left: params.startx + leftMargin, text: tabName.name, font: 'tablabelfont', klass: 'text instrument-name', anchor: 'start' });\n\t\t\tr.rows.push({ move: tabName.textSize.height });\n\t\t\tnonMusic(renderer, r);\n\t\t\ttabNameHeight = tabName.textSize.height;\n\t\t}\n\n\t\trenderer.controller.classes.newMeasure();\n\t\tif (!params.voices[i].duplicate) {\n\t\t\tbartop = renderer.calcY(2 + tabNameHeight); // This connects the bar lines between two different staves.\n\t\t\t//\t\t\tif (staff.bottom < 0)\n\t\t\t//\t\t\t\trenderer.moveY(spacing.STEP, -staff.bottom);\n\t\t}\n\t}\n\trenderer.controller.classes.newMeasure();\n\n\t// connect all the staves together with a vertical line\n\tvar staffSize = params.staffs.length;\n\tif (staffSize > 1) {\n\t\ttopLine = params.staffs[0].topLine;\n\t\tbottomLine = params.staffs[staffSize - 1].bottomLine;\n\t\tprintStem(renderer, params.startx, 0.6, topLine, bottomLine, null);\n\t}\n\trenderer.y = startY;\n\n\tfunction debugPrintGridItem(staff, key) {\n\t\tvar colors = [\"rgb(207,27,36)\", \"rgb(168,214,80)\", \"rgb(110,161,224)\", \"rgb(191,119,218)\", \"rgb(195,30,151)\",\n\t\t\t\"rgb(31,170,177)\", \"rgb(220,166,142)\"];\n\t\tif (staff.positionY && staff.positionY[key]) {\n\t\t\tvar height = staff.specialY[key] * spacing.STEP;\n\t\t\tif (key === \"chordHeightAbove\" && staff.specialY.chordLines && staff.specialY.chordLines.above)\n\t\t\t\theight *= staff.specialY.chordLines.above;\n\t\t\tif (key === \"chordHeightBelow\" && staff.specialY.chordLines && staff.specialY.chordLines.below)\n\t\t\t\theight *= staff.specialY.chordLines.below;\n\t\t\tprintDebugBox(renderer,\n\t\t\t\t{\n\t\t\t\t\tx: renderer.padding.left,\n\t\t\t\t\ty: renderer.calcY(staff.positionY[key]),\n\t\t\t\t\twidth: renderer.controller.width,\n\t\t\t\t\theight: height,\n\t\t\t\t\tfill: colors[colorIndex],\n\t\t\t\t\tstroke: colors[colorIndex],\n\t\t\t\t\t\"fill-opacity\": 0.4,\n\t\t\t\t\t\"stroke-opacity\": 0.4\n\t\t\t\t},\n\t\t\t\tkey.substr(0, 4));\n\t\t\tcolorIndex += 1; if (colorIndex > 6) colorIndex = 0;\n\t\t}\n\t}\n}\n\nfunction printBrace(renderer, absoluteY, brace, index, selectables) {\n\tif (brace) {\n\t\tfor (var i = 0; i < brace.length; i++) {\n\t\t\tif (brace[i].isStartVoice(index)) {\n\t\t\t\tbrace[i].startY = absoluteY - spacing.STEP * 10;\n\t\t\t\tbrace[i].elemset = drawBrace(renderer, brace[i], selectables);\n\t\t\t}\n\t\t}\n\t}\n}\n\n// function addInvisibleMarker(renderer, className) {\n// \tvar y = Math.round(renderer.y);\n// \trenderer.paper.pathToBack({path:\"M 0 \" + y + \" L 0 0\", stroke:\"none\", fill:\"none\", \"stroke-opacity\": 0, \"fill-opacity\": 0, 'class': renderer.controller.classes.generate(className), 'data-vertical': y });\n// }\n\nfunction boxAllElements(renderer, voices, which) {\n\tfor (var i = 0; i < which.length; i++) {\n\t\tvar children = voices[which[i]].children;\n\t\tfor (var j = 0; j < children.length; j++) {\n\t\t\tvar elem = children[j];\n\t\t\tvar coords = elem.getFixedCoords();\n\t\t\tif (elem.invisible || coords.t === undefined || coords.b === undefined)\n\t\t\t\tcontinue;\n\t\t\tvar height = (coords.t - coords.b) * spacing.STEP;\n\t\t\tprintDebugBox(renderer,\n\t\t\t\t{\n\t\t\t\t\tx: coords.x,\n\t\t\t\t\ty: renderer.calcY(coords.t),\n\t\t\t\t\twidth: coords.w,\n\t\t\t\t\theight: height,\n\t\t\t\t\tfill: \"#88e888\",\n\t\t\t\t\t\"fill-opacity\": 0.4,\n\t\t\t\t\tstroke: \"#4aa93d\",\n\t\t\t\t\t\"stroke-opacity\": 0.8\n\t\t\t\t});\n\n\t\t\tfor (var k = 0; k < elem.children.length; k++) {\n\t\t\t\tvar relElem = elem.children[k];\n\t\t\t\tvar chord = relElem.getChordDim();\n\t\t\t\tif (chord) {\n\t\t\t\t\tvar y = renderer.calcY(relElem.pitch);\n\t\t\t\t\ty += relElem.dim.font.size * relElem.getLane();\n\t\t\t\t\tprintDebugBox(renderer,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tx: chord.left,\n\t\t\t\t\t\t\ty: y,\n\t\t\t\t\t\t\twidth: chord.right - chord.left,\n\t\t\t\t\t\t\theight: relElem.dim.font.size,\n\t\t\t\t\t\t\tfill: \"none\",\n\t\t\t\t\t\t\tstroke: \"#4aa93d\",\n\t\t\t\t\t\t\t\"stroke-opacity\": 0.8\n\t\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nmodule.exports = drawStaffGroup;\n","function setPaperSize(renderer, maxwidth, scale, responsive) {\n\tvar w = (maxwidth + renderer.padding.left + renderer.padding.right) * scale;\n\tvar h = (renderer.y + renderer.padding.bottom) * scale;\n\tif (renderer.isPrint)\n\t\th = Math.max(h, 1056); // 11in x 72pt/in x 1.33px/pt\n\t// TODO-PER: We are letting the page get as long as it needs now, but eventually that should go to a second page.\n\n\t// for accessibility\n\tif (renderer.ariaLabel !== '') {\n\t\tvar text = \"Sheet Music\";\n\t\tif (renderer.abctune && renderer.abctune.metaText && renderer.abctune.metaText.title)\n\t\t\ttext += \" for \\\"\" + renderer.abctune.metaText.title + '\"';\n\t\trenderer.paper.setTitle(text);\n\t\tvar label = renderer.ariaLabel ? renderer.ariaLabel : text;\n\t\trenderer.paper.setAttribute(\"aria-label\", label);\n\t}\n\n\t// for dragging - don't select during drag\n\tvar styles = [\n\t\t\"-webkit-touch-callout: none;\",\n\t\t\"-webkit-user-select: none;\",\n\t\t\"-khtml-user-select: none;\",\n\t\t\"-moz-user-select: none;\",\n\t\t\"-ms-user-select: none;\",\n\t\t\"user-select: none;\"\n\t];\n\trenderer.paper.insertStyles(\".abcjs-dragging-in-progress text, .abcjs-dragging-in-progress tspan {\" + styles.join(\" \") + \"}\");\n\n\tvar parentStyles = { overflow: \"hidden\" };\n\tif (responsive === 'resize') {\n\t\trenderer.paper.setResponsiveWidth(w, h);\n\t} else {\n\t\tparentStyles.width = \"\";\n\t\tparentStyles.height = h + \"px\";\n\t\tif (scale < 1) {\n\t\t\tparentStyles.width = w + \"px\";\n\t\t\trenderer.paper.setSize(w / scale, h / scale);\n\t\t} else\n\t\t\trenderer.paper.setSize(w, h);\n\t}\n\trenderer.paper.setScale(scale);\n\trenderer.paper.setParentStyles(parentStyles);\n}\n\nmodule.exports = setPaperSize;\n","var highlight = require('../interactive/highlight');\nvar unhighlight = require('../interactive/unhighlight');\n\nfunction Selectables(paper, selectTypes, tuneNumber) {\n\tthis.elements = [];\n\tthis.paper = paper;\n\tthis.tuneNumber = tuneNumber;\n\tthis.selectTypes = selectTypes;\n}\n\nSelectables.prototype.getElements = function () {\n\treturn this.elements;\n};\n\nSelectables.prototype.add = function (absEl, svgEl, isNoteOrTabNumber, staffPos) {\n\tif (!this.canSelect(absEl))\n\t\treturn;\n\tvar params;\n\tif (this.selectTypes === undefined)\n\t\tparams = { selectable: false, \"data-index\": this.elements.length }; // This is the old behavior.\n\telse\n\t\tparams = { selectable: true, tabindex: 0, \"data-index\": this.elements.length };\n\tthis.paper.setAttributeOnElement(svgEl, params);\n\tvar sel = { absEl: absEl, svgEl: svgEl, isDraggable: isNoteOrTabNumber };\n\tif (staffPos !== undefined)\n\t\tsel.staffPos = staffPos;\n\tthis.elements.push(sel);\n\n};\n\nSelectables.prototype.canSelect = function (absEl) {\n\tif (this.selectTypes === false)\n\t\treturn false;\n\tif (!absEl || !absEl.abcelem)\n\t\treturn false;\n\tif (this.selectTypes === true)\n\t\treturn true;\n\tif (this.selectTypes === undefined) {\n\t\t// by default, only notes and tab numbers can be clicked.\n\t\tif (absEl.abcelem.el_type === 'note' || absEl.abcelem.el_type === 'tabNumber') {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\treturn this.selectTypes.indexOf(absEl.abcelem.el_type) >= 0;\n};\n\nSelectables.prototype.wrapSvgEl = function (abcelem, el) {\n\tvar absEl = {\n\t\ttuneNumber: this.tuneNumber,\n\t\tabcelem: abcelem,\n\t\telemset: [el],\n\t\thighlight: highlight,\n\t\tunhighlight: unhighlight\n\t};\n\tthis.add(absEl, el, false);\n};\n\nmodule.exports = Selectables;\n","var drawStaffGroup = require('./staff-group');\nvar setPaperSize = require('./set-paper-size');\nvar nonMusic = require('./non-music');\nvar spacing = require('../helpers/spacing');\nvar Selectables = require('./selectables');\n\nfunction draw(renderer, classes, abcTune, width, maxWidth, responsive, scale, selectTypes, tuneNumber, lineOffset) {\n\tvar selectables = new Selectables(renderer.paper, selectTypes, tuneNumber);\n\tvar groupClasses = {}\n\tif (classes.shouldAddClasses)\n\t\tgroupClasses.klass = \"abcjs-meta-top\"\n\trenderer.paper.openGroup(groupClasses)\n\trenderer.moveY(renderer.padding.top);\n\tnonMusic(renderer, abcTune.topText, selectables);\n\trenderer.paper.closeGroup()\n\trenderer.moveY(renderer.spacing.music);\n\tvar staffgroups = [];\n\tfor (var line = 0; line < abcTune.lines.length; line++) {\n\t\tclasses.incrLine();\n\t\tvar abcLine = abcTune.lines[line];\n\t\tif (abcLine.staff) {\n\t\t\tif (classes.shouldAddClasses)\n\t\t\t\tgroupClasses.klass = \"abcjs-staff-wrapper abcjs-l\" + classes.lineNumber\n\t\t\trenderer.paper.openGroup(groupClasses)\n\t\t\tif (abcLine.vskip) {\n\t\t\t\trenderer.moveY(abcLine.vskip);\n\t\t\t}\n\t\t\tif (staffgroups.length >= 1)\n\t\t\t\taddStaffPadding(renderer, renderer.spacing.staffSeparation, staffgroups[staffgroups.length - 1], abcLine.staffGroup);\n\t\t\tvar staffgroup = engraveStaffLine(renderer, abcLine.staffGroup, selectables, line);\n\t\t\tstaffgroup.line = lineOffset + line; // If there are non-music lines then the staffgroup array won't line up with the line array, so this keeps track.\n\t\t\tstaffgroups.push(staffgroup);\n\t\t\trenderer.paper.closeGroup()\n\t\t} else if (abcLine.nonMusic) {\n\t\t\tif (classes.shouldAddClasses)\n\t\t\t\tgroupClasses.klass = \"abcjs-non-music\"\n\t\t\trenderer.paper.openGroup(groupClasses)\n\t\t\tnonMusic(renderer, abcLine.nonMusic, selectables);\n\t\t\trenderer.paper.closeGroup()\n\t\t}\n\t}\n\n\tclasses.reset();\n\tif (abcTune.bottomText && abcTune.bottomText.rows && abcTune.bottomText.rows.length > 0) {\n\t\tif (classes.shouldAddClasses)\n\t\t\tgroupClasses.klass = \"abcjs-meta-bottom\"\n\t\trenderer.paper.openGroup(groupClasses)\n\t\trenderer.moveY(24); // TODO-PER: Empirically discovered. What variable should this be?\n\t\tnonMusic(renderer, abcTune.bottomText, selectables);\n\t\trenderer.paper.closeGroup()\n\t}\n\tsetPaperSize(renderer, maxWidth, scale, responsive);\n\treturn { staffgroups: staffgroups, selectables: selectables.getElements() };\n}\n\nfunction engraveStaffLine(renderer, staffGroup, selectables, lineNumber) {\n\tdrawStaffGroup(renderer, staffGroup, selectables, lineNumber);\n\tvar height = staffGroup.height * spacing.STEP;\n\trenderer.y += height;\n\treturn staffGroup;\n}\n\nfunction addStaffPadding(renderer, staffSeparation, lastStaffGroup, thisStaffGroup) {\n\tvar lastStaff = lastStaffGroup.staffs[lastStaffGroup.staffs.length - 1];\n\tvar lastBottomLine = -(lastStaff.bottom - 2); // The 2 is because the scale goes to 2 below the last line.\n\tvar nextTopLine = thisStaffGroup.staffs[0].top - 10; // Because 10 represents the top line.\n\tvar naturalSeparation = nextTopLine + lastBottomLine; // This is how far apart they'd be without extra spacing\n\tvar separationInPixels = naturalSeparation * spacing.STEP;\n\tif (separationInPixels < staffSeparation)\n\t\trenderer.moveY(staffSeparation - separationInPixels);\n}\n\nmodule.exports = draw;\n","var createAnalysis = require('./create-analysis');\n\nfunction findSelectableElement(event) {\n\tvar selectable = event\n\twhile (selectable && selectable.attributes && selectable.tagName.toLowerCase() !== 'svg' && !selectable.attributes.selectable) {\n\t\tselectable = selectable.parentNode\n\t}\n\tif (selectable && selectable.attributes && selectable.attributes.selectable) {\n\t\tvar index = selectable.attributes['data-index'].nodeValue\n\t\tif (index) {\n\t\t\tindex = parseInt(index, 10)\n\t\t\tif (index >= 0 && index < this.selectables.length) {\n\t\t\t\tvar element = this.selectables[index]\n\t\t\t\tvar ret = createAnalysis(element, event)\n\t\t\t\tret.index = index\n\t\t\t\tret.element = element\n\t\t\t\treturn ret\n\t\t\t}\n\t\t}\n\t}\n\treturn null\n}\n\nmodule.exports = findSelectableElement;\n","// abc_engraver_controller.js: Controls the engraving process of an ABCJS abstract syntax tree as produced by ABCJS/parse\n\n/*global Math */\n\nvar spacing = require('./helpers/spacing');\nvar AbstractEngraver = require('./creation/abstract-engraver');\nvar Renderer = require('./renderer');\nvar FreeText = require('./creation/elements/free-text');\nvar Separator = require('./creation/elements/separator');\nvar Subtitle = require('./creation/elements/subtitle');\nvar TopText = require('./creation/elements/top-text');\nvar BottomText = require('./creation/elements/bottom-text');\nvar setupSelection = require('./interactive/selection');\nvar layout = require('./layout/layout');\nvar Classes = require('./helpers/classes');\nvar GetFontAndAttr = require('./helpers/get-font-and-attr');\nvar GetTextSize = require('./helpers/get-text-size');\nvar draw = require('./draw/draw');\nvar tablatures = require('../tablatures/abc_tablatures');\nvar findSelectableElement = require('./interactive/find-selectable-element');\n\n/**\n * @class\n * Controls the engraving process, from ABCJS Abstract Syntax Tree (ABCJS AST) to rendered score sheet\n *\n * Call engraveABC to run the process. This creates a graphelems ABCJS Abstract Engraving Structure (ABCJS AES) that can be accessed through this.staffgroups\n * this data structure is first laid out (giving the graphelems x and y coordinates) and then drawn onto the renderer\n * each ABCJS AES represents a single staffgroup - all elements that are not in a staffgroup are rendered directly by the controller\n *\n * elements in ABCJS AES know their \"source data\" in the ABCJS AST, and their \"target shape\"\n * in the renderer for highlighting purposes\n *\n */\nvar EngraverController = function (paper, params) {\n\tparams = params || {};\n\tthis.findSelectableElement = findSelectableElement;\n\tthis.oneSvgPerLine = params.oneSvgPerLine;\n\tthis.selectionColor = params.selectionColor;\n\tthis.dragColor = params.dragColor ? params.dragColor : params.selectionColor;\n\tthis.dragging = !!params.dragging;\n\tthis.selectTypes = params.selectTypes;\n\tthis.responsive = params.responsive;\n\tthis.space = 3 * spacing.SPACE;\n\tthis.initialClef = params.initialClef;\n\tthis.timeBasedLayout = params.timeBasedLayout;\n\tthis.expandToWidest = !!params.expandToWidest;\n\tthis.scale = params.scale ? parseFloat(params.scale) : 0;\n\tthis.classes = new Classes({ shouldAddClasses: params.add_classes });\n\tif (!(this.scale > 0.1))\n\t\tthis.scale = undefined;\n\n\tif (params.staffwidth) {\n\t\t// Note: Normally all measurements to the engraver are in POINTS. However, if a person is formatting for the\n\t\t// screen and directly inputting the width, then it is more logical to have the measurement in pixels.\n\t\tthis.staffwidthScreen = params.staffwidth;\n\t\tthis.staffwidthPrint = params.staffwidth;\n\t} else {\n\t\tthis.staffwidthScreen = 740; // TODO-PER: Not sure where this number comes from, but this is how it's always been.\n\t\tthis.staffwidthPrint = 680; // The number of pixels in 8.5\", after 1cm of margin has been removed.\n\t}\n\tthis.listeners = [];\n\tif (params.clickListener)\n\t\tthis.addSelectListener(params.clickListener);\n\n\tthis.renderer = new Renderer(paper);\n\tthis.renderer.setPaddingOverride(params);\n\tif (params.showDebug)\n\t\tthis.renderer.showDebug = params.showDebug;\n\tif (params.jazzchords)\n\t\tthis.jazzchords = params.jazzchords;\n\tif (params.accentAbove)\n\t\tthis.accentAbove = params.accentAbove;\n\tif (params.germanAlphabet)\n\t\tthis.germanAlphabet = params.germanAlphabet;\n\tif (params.lineThickness)\n\t\tthis.lineThickness = params.lineThickness;\n\tthis.renderer.controller = this; // TODO-GD needed for highlighting\n\tthis.renderer.foregroundColor = params.foregroundColor ? params.foregroundColor : \"currentColor\";\n\tif (params.ariaLabel !== undefined)\n\t\tthis.renderer.ariaLabel = params.ariaLabel;\n\tthis.renderer.minPadding = params.minPadding ? params.minPadding : 0;\n\n\tthis.reset();\n};\n\nEngraverController.prototype.reset = function () {\n\tthis.selected = [];\n\tthis.staffgroups = [];\n\tif (this.engraver)\n\t\tthis.engraver.reset();\n\tthis.engraver = null;\n\tthis.renderer.reset();\n\tthis.dragTarget = null;\n\tthis.dragIndex = -1;\n\tthis.dragMouseStart = { x: -1, y: -1 };\n\tthis.dragYStep = 0;\n\tif (this.lineThickness)\n\t\tthis.renderer.setLineThickness(this.lineThickness)\n};\n\n/**\n * run the engraving process\n */\nEngraverController.prototype.engraveABC = function (abctunes, tuneNumber, lineOffset) {\n\tif (abctunes[0] === undefined) {\n\t\tabctunes = [abctunes];\n\t}\n\tthis.reset();\n\n\tfor (var i = 0; i < abctunes.length; i++) {\n\t\tif (tuneNumber === undefined)\n\t\t\ttuneNumber = i;\n\t\tthis.getFontAndAttr = new GetFontAndAttr(abctunes[i].formatting, this.classes);\n\t\tthis.getTextSize = new GetTextSize(this.getFontAndAttr, this.renderer.paper);\n\t\tthis.engraveTune(abctunes[i], tuneNumber, lineOffset);\n\t}\n};\n\n/**\n * Some of the items on the page are not scaled, so adjust them in the opposite direction of scaling to cancel out the scaling.\n */\nEngraverController.prototype.adjustNonScaledItems = function (scale) {\n\tthis.width /= scale;\n\tthis.renderer.adjustNonScaledItems(scale);\n};\n\nEngraverController.prototype.getMeasureWidths = function (abcTune) {\n\tthis.reset();\n\tthis.getFontAndAttr = new GetFontAndAttr(abcTune.formatting, this.classes);\n\tthis.getTextSize = new GetTextSize(this.getFontAndAttr, this.renderer.paper);\n\tvar origJazzChords = this.jazzchords\n\n\tthis.setupTune(abcTune, 0);\n\tthis.constructTuneElements(abcTune);\n\t// layout() sets the x-coordinate of the abcTune element here:\n\t// abcTune.lines[0].staffGroup.voices[0].children[0].x\n\tlayout(this.renderer, abcTune, 0, this.space, this.timeBasedLayout);\n\n\tvar ret = [];\n\tvar section;\n\n\tvar needNewSection = true;\n\tfor (var i = 0; i < abcTune.lines.length; i++) {\n\t\tvar abcLine = abcTune.lines[i];\n\t\tif (abcLine.staff) {\n\t\t\tif (needNewSection) {\n\t\t\t\tsection = {\n\t\t\t\t\tleft: 0,\n\t\t\t\t\tmeasureWidths: [],\n\t\t\t\t\t//height: this.renderer.padding.top + this.renderer.spacing.music + this.renderer.padding.bottom + 24, // the 24 is the empirical value added to the bottom of all tunes.\n\t\t\t\t\ttotal: 0\n\t\t\t\t};\n\t\t\t\tret.push(section);\n\t\t\t\tneedNewSection = false;\n\t\t\t}\n\t\t\t// At this point, the voices are laid out so that the bar lines are even with each other. So we just need to get the placement of the first voice.\n\t\t\tif (abcLine.staffGroup.voices.length > 0) {\n\t\t\t\tvar voice = abcLine.staffGroup.voices[0];\n\t\t\t\tvar foundNotStaffExtra = false;\n\t\t\t\tvar lastXPosition = 0;\n\t\t\t\tfor (var k = 0; k < voice.children.length; k++) {\n\t\t\t\t\tvar child = voice.children[k];\n\t\t\t\t\tif (!foundNotStaffExtra && !child.isClef && !child.isKeySig) {\n\t\t\t\t\t\tfoundNotStaffExtra = true;\n\t\t\t\t\t\tsection.left = child.x;\n\t\t\t\t\t\tlastXPosition = child.x;\n\t\t\t\t\t}\n\t\t\t\t\tif (child.type === 'bar') {\n\t\t\t\t\t\tsection.measureWidths.push(child.x - lastXPosition);\n\t\t\t\t\t\tsection.total += (child.x - lastXPosition);\n\t\t\t\t\t\tlastXPosition = child.x;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t//section.height += calcHeight(abcLine.staffGroup) * spacing.STEP;\n\t\t} else\n\t\t\tneedNewSection = true;\n\t}\n\tthis.jazzchords = origJazzChords\n\treturn ret;\n};\n\nEngraverController.prototype.setupTune = function (abcTune, tuneNumber) {\n\tthis.classes.reset();\n\n\tif (abcTune.formatting.jazzchords !== undefined)\n\t\tthis.jazzchords = abcTune.formatting.jazzchords;\n\tif (abcTune.formatting.accentAbove !== undefined)\n\t\tthis.accentAbove = abcTune.formatting.accentAbove;\n\n\tthis.renderer.newTune(abcTune);\n\tthis.engraver = new AbstractEngraver(this.getTextSize, tuneNumber, {\n\t\tbagpipes: abcTune.formatting.bagpipes,\n\t\tflatbeams: abcTune.formatting.flatbeams,\n\t\tgraceSlurs: abcTune.formatting.graceSlurs !== false, // undefined is the default, which is true\n\t\tpercmap: abcTune.formatting.percmap,\n\t\tinitialClef: this.initialClef,\n\t\tjazzchords: this.jazzchords,\n\t\ttimeBasedLayout: this.timeBasedLayout,\n\t\taccentAbove: this.accentAbove,\n\t\tgermanAlphabet: this.germanAlphabet\n\t});\n\tthis.engraver.setStemHeight(this.renderer.spacing.stemHeight);\n\tthis.engraver.measureLength = abcTune.getMeterFraction().num / abcTune.getMeterFraction().den;\n\tif (abcTune.formatting.staffwidth) {\n\t\tthis.width = abcTune.formatting.staffwidth * 1.33; // The width is expressed in pt; convert to px.\n\t} else {\n\t\tthis.width = this.renderer.isPrint ? this.staffwidthPrint : this.staffwidthScreen;\n\t}\n\n\tvar scale = abcTune.formatting.scale ? abcTune.formatting.scale : this.scale;\n\tif (this.responsive === \"resize\") // The resizing will mess with the scaling, so just don't do it explicitly.\n\t\tscale = undefined;\n\tif (scale === undefined) scale = this.renderer.isPrint ? 0.75 : 1;\n\tthis.adjustNonScaledItems(scale);\n\treturn scale;\n};\n\nEngraverController.prototype.constructTuneElements = function (abcTune) {\n\tabcTune.topText = new TopText(abcTune.metaText, abcTune.metaTextInfo, abcTune.formatting, abcTune.lines, this.width, this.renderer.isPrint, this.renderer.padding.left, this.renderer.spacing, this.classes.shouldAddClasses, this.getTextSize);\n\n\t// Generate the raw staff line data\n\tvar i;\n\tvar abcLine;\n\tvar hasPrintedTempo = false;\n\tvar hasSeenNonSubtitle = false;\n\tfor (i = 0; i < abcTune.lines.length; i++) {\n\t\tabcLine = abcTune.lines[i];\n\t\tif (abcLine.staff) {\n\t\t\thasSeenNonSubtitle = true;\n\t\t\tabcLine.staffGroup = this.engraver.createABCLine(abcLine.staff, !hasPrintedTempo ? abcTune.metaText.tempo : null, i);\n\t\t\thasPrintedTempo = true;\n\t\t} else if (abcLine.subtitle) {\n\t\t\t// If the subtitle is at the top, then it was already accounted for. So skip all subtitles until the first non-subtitle line.\n\t\t\tif (hasSeenNonSubtitle) {\n\t\t\t\tvar center = this.width / 2 + this.renderer.padding.left;\n\t\t\t\tabcLine.nonMusic = new Subtitle(this.renderer.spacing.subtitle, abcTune.formatting, abcLine.subtitle, center, this.renderer.padding.left, this.getTextSize);\n\t\t\t}\n\t\t} else if (abcLine.text !== undefined) {\n\t\t\thasSeenNonSubtitle = true;\n\t\t\tabcLine.nonMusic = new FreeText(abcLine.text, abcLine.vskip, this.getFontAndAttr, this.renderer.padding.left, this.width, this.getTextSize);\n\t\t} else if (abcLine.separator !== undefined && abcLine.separator.lineLength) {\n\t\t\thasSeenNonSubtitle = true;\n\t\t\tabcLine.nonMusic = new Separator(abcLine.separator.spaceAbove, abcLine.separator.lineLength, abcLine.separator.spaceBelow);\n\t\t}\n\t}\n\tabcTune.bottomText = new BottomText(abcTune.metaText, this.width, this.renderer.isPrint, this.renderer.padding.left, this.renderer.spacing, this.classes.shouldAddClasses, this.getTextSize);\n};\n\nEngraverController.prototype.engraveTune = function (abcTune, tuneNumber, lineOffset) {\n\n\tvar origJazzChords = this.jazzchords\n\tvar scale = this.setupTune(abcTune, tuneNumber);\n \n\t// Create all of the element objects that will appear on the page.\n\tthis.constructTuneElements(abcTune);\n \n\t//Set the top text now that we know the width\n \n\t// Do all the positioning, both horizontally and vertically\n\tvar maxWidth = layout(this.renderer, abcTune, this.width, this.space, this.expandToWidest, this.timeBasedLayout);\n \n\t//Set the top text now that we know the width\n\tif (this.expandToWidest && maxWidth > this.width + 1) {\n \n\t\tabcTune.topText = new TopText(abcTune.metaText, abcTune.metaTextInfo, abcTune.formatting, abcTune.lines, maxWidth, this.renderer.isPrint, this.renderer.padding.left, this.renderer.spacing, this.classes.shouldAddClasses, this.getTextSize);\n \n\t\tif ((abcTune.lines)&&(abcTune.lines.length > 0)){\n\t\t\tvar nlines = abcTune.lines.length;\n\n\t\t\tfor (var i=0;i<nlines;++i){\n\t\t\t\tvar entry = abcTune.lines[i];\n\t\t\t\tif (entry.nonMusic){\n\t\t\t\t\tif ((entry.nonMusic.rows) && (entry.nonMusic.rows.length > 0)){\n\t\t\t\t\t\tvar nRows = entry.nonMusic.rows.length;\n\t\t\t\t\t\tfor (var j=0;j<nRows;++j){\n\t\t\t\t\t\t\tvar thisRow = entry.nonMusic.rows[j];\n\t\t\t\t\t\t\t// Recenter the element if it's a subtitle or centered text \n\t\t\t\t\t\t\tif (thisRow.left){\n\t\t\t\t\t\t\t\tif (entry.subtitle){\n\t\t\t\t\t\t\t\t\tthisRow.left = (maxWidth/2) + this.renderer.padding.left;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tif ((entry.text)&&(entry.text.length>0)){\n\t\t\t\t\t\t\t\t\t\tif (entry.text[0].center){\n\t\t\t\t\t\t\t\t\t\t\tthisRow.left = (maxWidth/2) + this.renderer.padding.left;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Deal with tablature for staff\n\tif (abcTune.tablatures) {\n\t tablatures.layoutTablatures(this.renderer, abcTune);\n\t}\n \n\t// Do all the writing to the SVG\n\tvar ret = draw(this.renderer, this.classes, abcTune, this.width, maxWidth, this.responsive, scale, this.selectTypes, tuneNumber, lineOffset);\n\tthis.staffgroups = ret.staffgroups;\n\tthis.selectables = ret.selectables;\n\tif (this.oneSvgPerLine) {\n\t var div = this.renderer.paper.svg.parentNode;\n\t this.svgs = splitSvgIntoLines(this.renderer, div, abcTune.metaText.title, this.responsive, scale);\n\t} else {\n\t this.svgs = [this.renderer.paper.svg];\n\t}\n\tsetupSelection(this, this.svgs);\n\t\n\tthis.jazzchords = origJazzChords\n};\n\nfunction splitSvgIntoLines(renderer, output, title, responsive, scale) {\n\t// Each line is a top level <g> in the svg. To split it into separate\n\t// svgs iterate through each of those and put them in a new svg. Since\n\t// they are placed absolutely, the viewBox needs to be manipulated to\n\t// get the correct vertical positioning.\n\t// We copy all the attributes from the original svg except for the aria-label\n\t// since we want that to include a count. And the height is now a fraction of the original svg.\n\tif (!title) title = \"Untitled\"\n\tvar source = output.querySelector(\"svg\")\n\tif (responsive === 'resize')\n\t\toutput.style.paddingBottom = ''\n\tvar style = source.querySelector(\"style\")\n\tvar width = responsive === 'resize' ? source.viewBox.baseVal.width : source.getAttribute(\"width\")\n\tvar sections = output.querySelectorAll(\"svg > g\") // each section is a line, or the top matter or the bottom matter, or text that has been inserted.\n\tvar nextTop = 0 // There are often gaps between the elements for spacing, so the actual top and height needs to be inferred.\n\tvar wrappers = [] // Create all the elements and place them at once because we use the current svg to get data. It would disappear after placing the first line.\n\tvar svgs = []\n\tfor (var i = 0; i < sections.length; i++) {\n\t\tvar section = sections[i]\n\t\tvar box = section.getBBox()\n\t\tvar gapBetweenLines = box.y - nextTop // take the margin into account\n\t\tvar height = box.height + gapBetweenLines;\n\t\tvar wrapper = document.createElement(\"div\");\n\t\tvar divStyles = \"overflow: hidden;\"\n\t\tif (responsive !== 'resize')\n\t\t\tdivStyles += \"height:\" + (height * scale) + \"px;\"\n\t\twrapper.setAttribute(\"style\", divStyles)\n\t\tvar svg = duplicateSvg(source)\n\t\tvar fullTitle = \"Sheet Music for \\\"\" + title + \"\\\" section \" + (i + 1)\n\t\tsvg.setAttribute(\"aria-label\", fullTitle)\n\t\tif (responsive !== 'resize')\n\t\t\tsvg.setAttribute(\"height\", height)\n\t\tif (responsive === 'resize')\n\t\t\tsvg.style.position = ''\n\t\t// TODO-PER: Hack! Not sure why this is needed.\n\t\tvar viewBoxHeight = renderer.firefox112 ? height+1 : height\n\t\tsvg.setAttribute(\"viewBox\", \"0 \" + nextTop + \" \" + width + \" \" + viewBoxHeight)\n\t\tsvg.appendChild(style.cloneNode(true))\n\t\tvar titleEl = document.createElement(\"title\")\n\t\ttitleEl.innerText = fullTitle\n\t\tsvg.appendChild(titleEl)\n\t\tsvg.appendChild(section)\n\n\t\twrapper.appendChild(svg)\n\t\tsvgs.push(svg)\n\t\toutput.appendChild(wrapper)\n\t\t//wrappers.push(wrapper)\n\t\tnextTop = box.y + box.height\n\t}\n\t// for (i = 0; i < wrappers.length; i++)\n\t// \toutput.appendChild(wrappers[i])\n\toutput.removeChild(source)\n\treturn svgs;\n}\n\nfunction duplicateSvg(source) {\n\tvar svgNS = \"http://www.w3.org/2000/svg\";\n\tvar svg = document.createElementNS(svgNS, \"svg\");\n\tfor (var i = 0; i < source.attributes.length; i++) {\n\t\tvar attr = source.attributes[i];\n\t\tif (attr.name !== \"height\" && attr.name != \"aria-label\")\n\t\t\tsvg.setAttribute(attr.name, attr.value)\n\t}\n\treturn svg;\n}\n\nEngraverController.prototype.getDim = function (historyEl) {\n\t// Get the dimensions on demand because the getBBox call is expensive.\n\tif (!historyEl.dim) {\n\t\tvar box = historyEl.svgEl.getBBox();\n\t\thistoryEl.dim = { left: Math.round(box.x), top: Math.round(box.y), right: Math.round(box.x + box.width), bottom: Math.round(box.y + box.height) };\n\t}\n\treturn historyEl.dim;\n};\n\nEngraverController.prototype.addSelectListener = function (clickListener) {\n\tthis.listeners[this.listeners.length] = clickListener;\n};\n\nmodule.exports = EngraverController;\n","var tunebook = require('./abc_tunebook');\nvar Tune = require('../data/abc_tune');\n\nvar EngraverController = require('../write/engraver-controller');\nvar Parse = require('../parse/abc_parse');\nvar wrap = require('../parse/wrap_lines');\n\n\nvar resizeDivs = {};\nfunction resizeOuter() {\n var width = window.innerWidth;\n for (var id in resizeDivs) {\n if (resizeDivs.hasOwnProperty(id)) {\n var outer = resizeDivs[id];\n var ofs = outer.offsetLeft;\n width -= ofs * 2;\n outer.style.width = width + \"px\";\n }\n }\n}\n\ntry {\n window.addEventListener(\"resize\", resizeOuter);\n window.addEventListener(\"orientationChange\", resizeOuter);\n} catch(e) {\n // if we aren't in a browser, this code will crash, but it is not needed then either.\n}\n\nfunction renderOne(div, tune, params, tuneNumber, lineOffset) {\n if (params.viewportHorizontal) {\n // Create an inner div that holds the music, so that the passed in div will be the viewport.\n div.innerHTML = '<div class=\"abcjs-inner\"></div>';\n if (params.scrollHorizontal) {\n div.style.overflowX = \"auto\";\n div.style.overflowY = \"hidden\";\n } else\n div.style.overflow = \"hidden\";\n resizeDivs[div.id] = div; // We use a hash on the element's id so that multiple calls won't keep adding to the list.\n div = div.children[0]; // The music should be rendered in the inner div.\n }\n else if (params.viewportVertical) {\n // Create an inner div that holds the music, so that the passed in div will be the viewport.\n div.innerHTML = '<div class=\"abcjs-inner scroll-amount\"></div>';\n div.style.overflowX = \"hidden\";\n div.style.overflowY = \"auto\";\n div = div.children[0]; // The music should be rendered in the inner div.\n }\n else\n\t div.innerHTML = \"\";\n var engraver_controller = new EngraverController(div, params);\n engraver_controller.engraveABC(tune, tuneNumber, lineOffset);\n tune.engraver = engraver_controller;\n if (params.viewportVertical || params.viewportHorizontal) {\n // If we added a wrapper around the div, then we need to size the wrapper, too.\n var parent = div.parentNode;\n parent.style.width = div.style.width;\n }\n}\n\n// A quick way to render a tune from javascript when interactivity is not required.\n// This is used when a javascript routine has some abc text that it wants to render\n// in a div or collection of divs. One tune or many can be rendered.\n//\n// parameters:\n// output: an array of divs that the individual tunes are rendered to.\n// If the number of tunes exceeds the number of divs in the array, then\n// only the first tunes are rendered. If the number of divs exceeds the number\n// of tunes, then the unused divs are cleared. The divs can be passed as either\n// elements or strings of ids. If ids are passed, then the div MUST exist already.\n// (if a single element is passed, then it is an implied array of length one.)\n// (if a null is passed for an element, or the element doesn't exist, then that tune is skipped.)\n// abc: text representing a tune or an entire tune book in ABC notation.\n// renderParams: hash of:\n// startingTune: an index, starting at zero, representing which tune to start rendering at.\n// (If this element is not present, then rendering starts at zero.)\n// width: 800 by default. The width in pixels of the output paper\nvar renderAbc = function(output, abc, parserParams, engraverParams, renderParams) {\n // Note: all parameters have been condensed into the first ones. It doesn't hurt anything to allow the old format, so just copy them here.\n var params = {};\n var key;\n if (parserParams) {\n for (key in parserParams) {\n if (parserParams.hasOwnProperty(key)) {\n params[key] = parserParams[key];\n }\n }\n if (params.warnings_id && params.tablature) {\n params.tablature.warning_id = params.warnings_id;\n }\n }\n if (engraverParams) {\n for (key in engraverParams) {\n if (engraverParams.hasOwnProperty(key)) {\n\t // There is a conflict with the name of the parameter \"listener\". If it is in the second parameter, then it is for click.\n\t if (key === \"listener\") {\n\t \tif (engraverParams[key].highlight)\n\t\t params.clickListener = engraverParams[key].highlight;\n\t } else\n params[key] = engraverParams[key];\n }\n }\n }\n if (renderParams) {\n for (key in renderParams) {\n if (renderParams.hasOwnProperty(key)) {\n params[key] = renderParams[key];\n }\n }\n }\n\n function callback(div, tune, tuneNumber, abcString) {\n var removeDiv = false;\n if (div === \"*\") {\n removeDiv = true;\n div = document.createElement(\"div\");\n div.setAttribute(\"style\", \"visibility: hidden;\");\n document.body.appendChild(div);\n }\n if (!removeDiv && params.wrap && params.staffwidth) {\n tune = doLineWrapping(div, tune, tuneNumber, abcString, params);\n\t return tune;\n }\n if (params.afterParsing)\n params.afterParsing(tune, tuneNumber, abcString);\n renderOne(div, tune, params, tuneNumber, 0);\n if (removeDiv)\n div.parentNode.removeChild(div);\n return null;\n }\n\n return tunebook.renderEngine(callback, output, abc, params);\n};\n\nfunction doLineWrapping(div, tune, tuneNumber, abcString, params) {\n\tvar engraver_controller = new EngraverController(div, params);\n\tvar widths = engraver_controller.getMeasureWidths(tune);\n\n\tvar ret = wrap.calcLineWraps(tune, widths, params);\n\tif (ret.reParse) {\n var abcParser = new Parse();\n abcParser.parse(abcString, ret.revisedParams);\n tune = abcParser.getTune();\n var warnings = abcParser.getWarnings();\n if (warnings)\n tune.warnings = warnings;\n }\n if (params.afterParsing)\n params.afterParsing(tune, tuneNumber, abcString);\n renderOne(div, tune, ret.revisedParams, tuneNumber, 0);\n\ttune.explanation = ret.explanation;\n\treturn tune;\n}\n\nmodule.exports = renderAbc;\n","var tunebook = require('./abc_tunebook');\nvar EngraverController = require('../write/engraver-controller');\n\nvar tuneMetrics = function(abc, params) {\n function callback(div, tune, tuneNumber, abcString) {\n\t\tdiv = document.createElement(\"div\");\n\t\tdiv.setAttribute(\"style\", \"visibility: hidden;\");\n\t\tdocument.body.appendChild(div);\n\t\tvar engraver_controller = new EngraverController(div, params);\n\t\tvar widths = engraver_controller.getMeasureWidths(tune);\n div.parentNode.removeChild(div);\n return {sections: widths};\n }\n\n return tunebook.renderEngine(callback, \"*\", abc, params);\n};\n\nmodule.exports = tuneMetrics;\n","var soundsCache = {\n};\n\nmodule.exports = soundsCache;\n","// Load one mp3 file for one note.\n// url = the base url for the soundfont\n// instrument = the instrument name (e.g. \"acoustic_grand_piano\")\n// name = the pitch name (e.g. \"A3\")\nvar soundsCache = require(\"./sounds-cache\");\n\nvar getNote = function (url, instrument, name, audioContext) {\n\tif (!soundsCache[instrument]) soundsCache[instrument] = {};\n\tvar instrumentCache = soundsCache[instrument];\n\n\tif (!instrumentCache[name])\n\t\tinstrumentCache[name] = new Promise(function (resolve, reject) {\n\t\t\tvar xhr = new XMLHttpRequest();\n\t\t\tlet noteUrl = url + instrument + \"-mp3/\" + name + \".mp3\";\n\t\t\txhr.open(\"GET\", noteUrl, true);\n\t\t\txhr.responseType = \"arraybuffer\";\n\t\t\txhr.onload = function () {\n\t\t\t\tif (xhr.status !== 200) {\n\t\t\t\t\treject(Error(\"Can't load sound at \" + noteUrl + ' status=' + xhr.status));\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tvar noteDecoded = function(audioBuffer) {\n\t\t\t\t\tresolve({instrument: instrument, name: name, status: \"loaded\", audioBuffer: audioBuffer})\n\t\t\t\t}\n\t\t\t\tvar maybePromise = audioContext.decodeAudioData(xhr.response, noteDecoded, function () {\n\t\t\t\t\treject(Error(\"Can't decode sound at \" + noteUrl));\n\t\t\t\t});\n\t\t\t\t// In older browsers `BaseAudioContext.decodeAudio()` did not return a promise\n\t\t\t\tif (maybePromise && typeof maybePromise.catch === \"function\") maybePromise.catch(reject);\n\t\t\t};\n\t\t\txhr.onerror = function () {\n\t\t\t\treject(Error(\"Can't load sound at \" + noteUrl));\n\t\t\t};\n\t\t\txhr.send();\n\t\t})\n\t\t\t.catch(err => {\n\t\t\t\tconsole.error(\"Didn't load note\", instrument, name, \":\", err.message);\n\t\t\t\tthrow err;\n\t\t\t});\n\n\treturn instrumentCache[name];\n};\n\nmodule.exports = getNote;\n","var instrumentIndexToName = [\n\t\"acoustic_grand_piano\",\n\t\"bright_acoustic_piano\",\n\t\"electric_grand_piano\",\n\t\"honkytonk_piano\",\n\t\"electric_piano_1\",\n\t\"electric_piano_2\",\n\t\"harpsichord\",\n\t\"clavinet\",\n\n\t\"celesta\",\n\t\"glockenspiel\",\n\t\"music_box\",\n\t\"vibraphone\",\n\t\"marimba\",\n\t\"xylophone\",\n\t\"tubular_bells\",\n\t\"dulcimer\",\n\n\t\"drawbar_organ\",\n\t\"percussive_organ\",\n\t\"rock_organ\",\n\t\"church_organ\",\n\t\"reed_organ\",\n\t\"accordion\",\n\t\"harmonica\",\n\t\"tango_accordion\",\n\n\t\"acoustic_guitar_nylon\",\n\t\"acoustic_guitar_steel\",\n\t\"electric_guitar_jazz\",\n\t\"electric_guitar_clean\",\n\t\"electric_guitar_muted\",\n\t\"overdriven_guitar\",\n\t\"distortion_guitar\",\n\t\"guitar_harmonics\",\n\n\t\"acoustic_bass\",\n\t\"electric_bass_finger\",\n\t\"electric_bass_pick\",\n\t\"fretless_bass\",\n\t\"slap_bass_1\",\n\t\"slap_bass_2\",\n\t\"synth_bass_1\",\n\t\"synth_bass_2\",\n\n\t\"violin\",\n\t\"viola\",\n\t\"cello\",\n\t\"contrabass\",\n\t\"tremolo_strings\",\n\t\"pizzicato_strings\",\n\t\"orchestral_harp\",\n\t\"timpani\",\n\n\t\"string_ensemble_1\",\n\t\"string_ensemble_2\",\n\t\"synth_strings_1\",\n\t\"synth_strings_2\",\n\t\"choir_aahs\",\n\t\"voice_oohs\",\n\t\"synth_choir\",\n\t\"orchestra_hit\",\n\n\t\"trumpet\",\n\t\"trombone\",\n\t\"tuba\",\n\t\"muted_trumpet\",\n\t\"french_horn\",\n\t\"brass_section\",\n\t\"synth_brass_1\",\n\t\"synth_brass_2\",\n\n\t\"soprano_sax\",\n\t\"alto_sax\",\n\t\"tenor_sax\",\n\t\"baritone_sax\",\n\t\"oboe\",\n\t\"english_horn\",\n\t\"bassoon\",\n\t\"clarinet\",\n\n\t\"piccolo\",\n\t\"flute\",\n\t\"recorder\",\n\t\"pan_flute\",\n\t\"blown_bottle\",\n\t\"shakuhachi\",\n\t\"whistle\",\n\t\"ocarina\",\n\n\t\"lead_1_square\",\n\t\"lead_2_sawtooth\",\n\t\"lead_3_calliope\",\n\t\"lead_4_chiff\",\n\t\"lead_5_charang\",\n\t\"lead_6_voice\",\n\t\"lead_7_fifths\",\n\t\"lead_8_bass_lead\",\n\n\t\"pad_1_new_age\",\n\t\"pad_2_warm\",\n\t\"pad_3_polysynth\",\n\t\"pad_4_choir\",\n\t\"pad_5_bowed\",\n\t\"pad_6_metallic\",\n\t\"pad_7_halo\",\n\t\"pad_8_sweep\",\n\n\t\"fx_1_rain\",\n\t\"fx_2_soundtrack\",\n\t\"fx_3_crystal\",\n\t\"fx_4_atmosphere\",\n\t\"fx_5_brightness\",\n\t\"fx_6_goblins\",\n\t\"fx_7_echoes\",\n\t\"fx_8_scifi\",\n\n\t\"sitar\",\n\t\"banjo\",\n\t\"shamisen\",\n\t\"koto\",\n\t\"kalimba\",\n\t\"bagpipe\",\n\t\"fiddle\",\n\t\"shanai\",\n\n\t\"tinkle_bell\",\n\t\"agogo\",\n\t\"steel_drums\",\n\t\"woodblock\",\n\t\"taiko_drum\",\n\t\"melodic_tom\",\n\t\"synth_drum\",\n\t\"reverse_cymbal\",\n\n\t\"guitar_fret_noise\",\n\t\"breath_noise\",\n\t\"seashore\",\n\t\"bird_tweet\",\n\t\"telephone_ring\",\n\t\"helicopter\",\n\t\"applause\",\n\t\"gunshot\",\n\n\t\"percussion\"\n];\n\nmodule.exports = instrumentIndexToName;\n","// Convert the input structure to a more useful structure where each item has a length of its own.\n\nvar instrumentIndexToName = require('./instrument-index-to-name');\n\nvar createNoteMap = function(sequence) {\n\tvar map = [];\n\tfor (var i = 0; i < sequence.tracks.length; i++)\n\t\tmap.push([]);\n\n\t// TODO-PER: handle more than one note in a track\n\tvar nextNote = {};\n\tvar currentInstrument = instrumentIndexToName[0];\n\t// ev.start and ev.duration are in whole notes. Need to turn them into\n\tsequence.tracks.forEach(function(track, i) {\n\t\ttrack.forEach(function(ev) {\n\t\t\tswitch (ev.cmd) {\n\t\t\t\tcase \"note\":\n\t\t\t\t\t// ev contains:\n\t\t\t\t\t// {\"cmd\":\"note\",\"pitch\":72,\"volume\":95,\"start\":0.125,\"duration\":0.25,\"instrument\":0,\"gap\":0}\n\t\t\t\t\t// where start and duration are in whole notes, gap is in 1/1920 of a second (i.e. MIDI ticks)\n\t\t\t\t\tvar inst = ev.instrument !== undefined ? instrumentIndexToName[ev.instrument] : currentInstrument\n\t\t\t\t\tif (ev.duration > 0) {\n\t\t\t\t\t\tvar gap = ev.gap ? ev.gap : 0;\n\t\t\t\t\t\tvar len = ev.duration;\n\t\t\t\t\t\tgap = Math.min(gap, len * 2 / 3);\n\t\t\t\t\t\tvar obj = {\n\t\t\t\t\t\t\tpitch: ev.pitch,\n\t\t\t\t\t\t\tinstrument: inst,\n\t\t\t\t\t\t\tstart: Math.round((ev.start) * 1000000)/1000000,\n\t\t\t\t\t\t\tend: Math.round((ev.start + len - gap) * 1000000)/1000000,\n\t\t\t\t\t\t\tvolume: ev.volume\n\t\t\t\t\t\t};\n\t\t\t\t\t\tif (ev.startChar)\n\t\t\t\t\t\t\tobj.startChar = ev.startChar;\n\t\t\t\t\t\tif (ev.endChar)\n\t\t\t\t\t\t\tobj.endChar = ev.endChar;\n\t\t\t\t\t\tif (ev.style)\n\t\t\t\t\t\t\tobj.style = ev.style;\n\t\t\t\t\t\tif (ev.cents)\n\t\t\t\t\t\t\tobj.cents = ev.cents;\n\t\t\t\t\t\tmap[i].push(obj);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"program\":\n\t\t\t\t\tcurrentInstrument = instrumentIndexToName[ev.instrument];\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"text\":\n\t\t\t\t\t// Ignore the track names - that is just for midi files.\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\t// TODO-PER: handle other event types\n\t\t\t\t\tconsole.log(\"Unhandled midi event\", ev);\n\t\t\t}\n\t\t});\n\t});\n\treturn map;\n};\n\nmodule.exports = createNoteMap;\n","// Call this when it is safe for the abcjs to produce sound. This is after the first user gesture on the page.\n// If you call it with no parameters, then an AudioContext is created and stored.\n// If you call it with a parameter, that is used as an already created AudioContext.\n\nfunction registerAudioContext(ac) {\n\t// If one is passed in, that is the one to use even if there was already one created.\n\tif (ac)\n\t\twindow.abcjsAudioContext = ac;\n\telse {\n\t\t// no audio context passed in, so create it unless there is already one from before.\n\t\tif (!window.abcjsAudioContext) {\n\t\t\tvar AudioContext = window.AudioContext || window.webkitAudioContext;\n\t\t\tif (AudioContext)\n\t\t\t\twindow.abcjsAudioContext = new AudioContext();\n\t\t\telse\n\t\t\t\treturn false;\n\t\t}\n\t}\n\treturn window.abcjsAudioContext.state !== \"suspended\";\n}\n\nmodule.exports = registerAudioContext;\n","var registerAudioContext = require('./register-audio-context.js');\n\nfunction activeAudioContext() {\n\tif (!window.abcjsAudioContext)\n\t\tregisterAudioContext();\n\treturn window.abcjsAudioContext;\n}\n\nmodule.exports = activeAudioContext;\n","var activeAudioContext = require('./active-audio-context');\n\n//\n// Support for audio depends on three things: support for Promise, support for AudioContext, and support for AudioContext.resume.\n// Unfortunately, AudioContext.resume cannot be detected unless an AudioContext is created, and creating an AudioContext can't\n// be done until a user click, so there is no way to know for sure if audio is supported until the user tries.\n// We can get close, though - we can test for Promises and AudioContext - there are just a few evergreen browsers that supported\n// that before supporting resume, so we'll test what we can.\n\n// The best use of this routine is to call it before doing any audio related stuff to decide whether to bother.\n// But then, call it again after a user interaction to test for resume.\n\nfunction supportsAudio() {\n\tif (!window.Promise)\n\t\treturn false;\n\n\tif (!window.AudioContext &&\n\t\t!window.webkitAudioContext &&\n\t\t!navigator.mozAudioContext &&\n\t\t!navigator.msAudioContext)\n\t\treturn false;\n\n\tvar aac = activeAudioContext();\n\tif (aac)\n\t\treturn aac.resume !== undefined;\n}\n\nmodule.exports = supportsAudio;\n","var pitchToNoteName = {\n\t21: 'A0',\n\t22: 'Bb0',\n\t23: 'B0',\n\t24: 'C1',\n\t25: 'Db1',\n\t26: 'D1',\n\t27: 'Eb1',\n\t28: 'E1',\n\t29: 'F1',\n\t30: 'Gb1',\n\t31: 'G1',\n\t32: 'Ab1',\n\t33: 'A1',\n\t34: 'Bb1',\n\t35: 'B1',\n\t36: 'C2',\n\t37: 'Db2',\n\t38: 'D2',\n\t39: 'Eb2',\n\t40: 'E2',\n\t41: 'F2',\n\t42: 'Gb2',\n\t43: 'G2',\n\t44: 'Ab2',\n\t45: 'A2',\n\t46: 'Bb2',\n\t47: 'B2',\n\t48: 'C3',\n\t49: 'Db3',\n\t50: 'D3',\n\t51: 'Eb3',\n\t52: 'E3',\n\t53: 'F3',\n\t54: 'Gb3',\n\t55: 'G3',\n\t56: 'Ab3',\n\t57: 'A3',\n\t58: 'Bb3',\n\t59: 'B3',\n\t60: 'C4',\n\t61: 'Db4',\n\t62: 'D4',\n\t63: 'Eb4',\n\t64: 'E4',\n\t65: 'F4',\n\t66: 'Gb4',\n\t67: 'G4',\n\t68: 'Ab4',\n\t69: 'A4',\n\t70: 'Bb4',\n\t71: 'B4',\n\t72: 'C5',\n\t73: 'Db5',\n\t74: 'D5',\n\t75: 'Eb5',\n\t76: 'E5',\n\t77: 'F5',\n\t78: 'Gb5',\n\t79: 'G5',\n\t80: 'Ab5',\n\t81: 'A5',\n\t82: 'Bb5',\n\t83: 'B5',\n\t84: 'C6',\n\t85: 'Db6',\n\t86: 'D6',\n\t87: 'Eb6',\n\t88: 'E6',\n\t89: 'F6',\n\t90: 'Gb6',\n\t91: 'G6',\n\t92: 'Ab6',\n\t93: 'A6',\n\t94: 'Bb6',\n\t95: 'B6',\n\t96: 'C7',\n\t97: 'Db7',\n\t98: 'D7',\n\t99: 'Eb7',\n\t100: 'E7',\n\t101: 'F7',\n\t102: 'Gb7',\n\t103: 'G7',\n\t104: 'Ab7',\n\t105: 'A7',\n\t106: 'Bb7',\n\t107: 'B7',\n\t108: 'C8',\n\t109: 'Db8',\n\t110: 'D8',\n\t111: 'Eb8',\n\t112: 'E8',\n\t113: 'F8',\n\t114: 'Gb8',\n\t115: 'G8',\n\t116: 'Ab8',\n\t117: 'A8',\n\t118: 'Bb8',\n\t119: 'B8',\n\t120: 'C9',\n\t121: 'Db9'\n};\n\nmodule.exports = pitchToNoteName;\n","var downloadBuffer = function(buffer) {\n\treturn window.URL.createObjectURL(bufferToWave(buffer.audioBuffers));\n};\n\n// Convert an AudioBuffer to a Blob using WAVE representation\nfunction bufferToWave(audioBuffers) {\n\tvar audioBuffer = audioBuffers[0];\n\tvar numOfChan = audioBuffer.numberOfChannels;\n\tvar length = audioBuffer.length * numOfChan * 2 + 44;\n\tvar buffer = new ArrayBuffer(length);\n\tvar view = new DataView(buffer);\n\tvar channels = [];\n\tvar i;\n\tvar sample;\n\tvar offset = 0;\n\tvar pos = 0;\n\n\t// write WAVE header\n\tsetUint32(0x46464952); // \"RIFF\"\n\tsetUint32(length - 8); // file length - 8\n\tsetUint32(0x45564157); // \"WAVE\"\n\n\tsetUint32(0x20746d66); // \"fmt \" chunk\n\tsetUint32(16); // length = 16\n\tsetUint16(1); // PCM (uncompressed)\n\tsetUint16(numOfChan);\n\tsetUint32(audioBuffer.sampleRate);\n\tsetUint32(audioBuffer.sampleRate * 2 * numOfChan); // avg. bytes/sec\n\tsetUint16(numOfChan * 2); // block-align\n\tsetUint16(16); // 16-bit (hardcoded in this demo)\n\n\tsetUint32(0x61746164); // \"data\" - chunk\n\tsetUint32(length - pos - 4); // chunk length\n\n\t// write interleaved data\n\tfor(i = 0; i < numOfChan; i++)\n\t\tchannels.push(audioBuffer.getChannelData(i));\n\n\twhile(pos < length) {\n\t\tfor(i = 0; i < channels.length; i++) { // interleave channels\n\t\t\tsample = Math.max(-1, Math.min(1, channels[i][offset])); // clamp\n\t\t\tsample = (0.5 + sample < 0 ? sample * 32768 : sample * 32767)|0; // scale to 16-bit signed int\n\t\t\tview.setInt16(pos, sample, true); // write 16-bit sample\n\t\t\tpos += 2;\n\t\t}\n\t\toffset++; // next source sample\n\t}\n\n\t// create Blob\n\treturn new Blob([buffer], {type: \"audio/wav\"});\n\n\tfunction setUint16(data) {\n\t\tview.setUint16(pos, data, true);\n\t\tpos += 2;\n\t}\n\n\tfunction setUint32(data) {\n\t\tview.setUint32(pos, data, true);\n\t\tpos += 4;\n\t}\n}\n\nmodule.exports = downloadBuffer;\n","// This turns the number of cents to detune into a value that is convenient to use in pitch calculations\n// A cent is 1/100 of a musical half step and is calculated exponentially over the course of an octave.\n// The equation is:\n// Two to the power of cents divided by 1200\n\nfunction centsToFactor(cents) {\n\treturn Math.pow(2, cents/1200);\n}\n\nmodule.exports = centsToFactor;\n","var soundsCache = require('./sounds-cache');\nvar pitchToNoteName = require('./pitch-to-note-name');\nvar centsToFactor = require(\"./cents-to-factor\");\n\nfunction placeNote(outputAudioBuffer, sampleRate, sound, startArray, volumeMultiplier, ofsMs, fadeTimeSec, noteEndSec, debugCallback) {\n\t// sound contains { instrument, pitch, volume, len, pan, tempoMultiplier\n\t// len is in whole notes. Multiply by tempoMultiplier to get seconds.\n\t// ofsMs is an offset to subtract from the note to line up programs that have different length onsets.\n\tvar OfflineAC = window.OfflineAudioContext ||\n\t\twindow.webkitOfflineAudioContext;\n\n\tvar len = sound.len * sound.tempoMultiplier;\n\tif (ofsMs)\n\t\tlen +=ofsMs/1000;\n\tlen -= noteEndSec;\n\tif (len < 0)\n\t\tlen = 0.005; // Have some small audible length no matter how short the note is.\n\tvar offlineCtx = new OfflineAC(2,Math.floor((len+fadeTimeSec)*sampleRate),sampleRate);\n\tvar noteName = pitchToNoteName[sound.pitch];\n\tif (!soundsCache[sound.instrument]) {\n\t\t// It shouldn't happen that the entire instrument cache wasn't created, but this has been seen in practice, so guard against it.\n\t\tif (debugCallback)\n\t\t\tdebugCallback('placeNote skipped (instrument empty): '+sound.instrument+':'+noteName)\n\t\treturn Promise.resolve();\n\t}\n\tvar noteBufferPromise = soundsCache[sound.instrument][noteName];\n\n\tif (!noteBufferPromise) {\n\t\t// if the note isn't present then just skip it - it will leave a blank spot in the audio.\n\t\tif (debugCallback)\n\t\t\tdebugCallback('placeNote skipped: '+sound.instrument+':'+noteName)\n\t\treturn Promise.resolve();\n\t}\n\n\treturn noteBufferPromise\n\t\t.then(function (response) {\n\t\t\t// create audio buffer\n\t\t\tvar source = offlineCtx.createBufferSource();\n\t\t\tsource.buffer = response.audioBuffer;\n\n\t\t\t// add gain\n\t\t\t// volume can be between 1 to 127. This translation to gain is just trial and error.\n\t\t\t// The smaller the first number, the more dynamic range between the quietest to loudest.\n\t\t\t// The larger the second number, the louder it will be in general.\n\t\t\tvar volume = (sound.volume / 96) * volumeMultiplier;\n\t\t\tsource.gainNode = offlineCtx.createGain();\n\n\t\t\t// add pan if supported and present\n\t\t\tif (sound.pan && offlineCtx.createStereoPanner) {\n\t\t\t\tsource.panNode = offlineCtx.createStereoPanner();\n\t\t\t\tsource.panNode.pan.setValueAtTime(sound.pan, 0);\n\t\t\t}\n\t\t\tsource.gainNode.gain.value = volume; // Math.min(2, Math.max(0, volume));\n\t\t\tsource.gainNode.gain.linearRampToValueAtTime(source.gainNode.gain.value, len);\n\t\t\tsource.gainNode.gain.linearRampToValueAtTime(0.0, len + fadeTimeSec);\n\n\t\t\tif (sound.cents) {\n\t\t\t\tsource.playbackRate.value = centsToFactor(sound.cents);\n\t\t\t}\n\n\t\t\t// connect all the nodes\n\t\t\tif (source.panNode) {\n\t\t\t\tsource.panNode.connect(offlineCtx.destination);\n\t\t\t\tsource.gainNode.connect(source.panNode);\n\t\t\t} else {\n\t\t\t\tsource.gainNode.connect(offlineCtx.destination);\n\t\t\t}\n\t\t\tsource.connect(source.gainNode);\n\n\t\t\t// Do the process of creating the sound and placing it in the buffer\n\t\t\tsource.start(0);\n\n\t\t\tif (source.noteOff) {\n\t\t\t\tsource.noteOff(len + fadeTimeSec);\n\t\t\t} else {\n\t\t\t\tsource.stop(len + fadeTimeSec);\n\t\t\t}\n\t\t\tvar fnResolve;\n\t\t\tofflineCtx.oncomplete = function(e) {\n\t\t\t\tif (e.renderedBuffer && e.renderedBuffer.getChannelData) { // If the system gets overloaded or there are network problems then this can start failing. Just drop the note if so.\n\t\t\t\t\tfor (var i = 0; i < startArray.length; i++) {\n\t\t\t\t\t\t//Math.floor(startArray[i] * sound.tempoMultiplier * sampleRate)\n\t\t\t\t\t\tvar start = startArray[i] * sound.tempoMultiplier;\n\t\t\t\t\t\tif (ofsMs)\n\t\t\t\t\t\t\tstart -=ofsMs/1000;\n\t\t\t\t\t\tif (start < 0)\n\t\t\t\t\t\t\tstart = 0; // If the item that is moved back is at the very beginning of the buffer then don't move it back. To do that would be to push everything else forward. TODO-PER: this should probably be done at some point but then it would change timing in existing apps.\n\t\t\t\t\t\tstart = Math.floor(start*sampleRate);\n\t\t\t\t\t\tcopyToChannel(outputAudioBuffer, e.renderedBuffer, start);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (debugCallback)\n\t\t\t\t\tdebugCallback('placeNote: '+sound.instrument+':'+noteName)\n\t\t\t\tfnResolve();\n\t\t\t};\n\t\t\tofflineCtx.startRendering();\n\t\t\treturn new Promise(function(resolve) {\n\t\t\t\tfnResolve = resolve;\n\t\t\t});\n\t\t})\n\t\t.catch(function (error) {\n\t\t\tif (debugCallback)\n\t\t\t\tdebugCallback('placeNote catch: '+error.message)\n\t\t\treturn Promise.resolve()\n\t\t});\n}\n\nvar copyToChannel = function(toBuffer, fromBuffer, start) {\n\tfor (var ch = 0; ch < 2; ch++) {\n\t\tvar fromData = fromBuffer.getChannelData(ch);\n\t\tvar toData = toBuffer.getChannelData(ch);\n\n\t\t// Mix the current note into the existing track\n\t\tfor (var n = 0; n < fromData.length; n++) {\n\t\t\ttoData[n + start] += fromData[n];\n\t\t}\n\t}\n};\n\nmodule.exports = placeNote;\n","var getNote = require('./load-note');\nvar createNoteMap = require('./create-note-map');\nvar registerAudioContext = require('./register-audio-context');\nvar activeAudioContext = require('./active-audio-context');\nvar supportsAudio = require('./supports-audio');\nvar pitchToNoteName = require('./pitch-to-note-name');\nvar instrumentIndexToName = require('./instrument-index-to-name');\nvar downloadBuffer = require('./download-buffer');\nvar placeNote = require('./place-note');\nvar soundsCache = require('./sounds-cache');\n\n// TODO-PER: remove the midi tests from here: I don't think the object can be constructed unless it passes.\nvar notSupportedMessage = \"MIDI is not supported in this browser.\";\n\nvar originalSoundFontUrl = \"https://paulrosen.github.io/midi-js-soundfonts/abcjs/\";\n// These are the original soundfonts supplied. They will need a volume boost:\nvar defaultSoundFontUrl = \"https://paulrosen.github.io/midi-js-soundfonts/FluidR3_GM/\";\nvar alternateSoundFontUrl = \"https://paulrosen.github.io/midi-js-soundfonts/MusyngKite/\";\n\nfunction CreateSynth() {\n\tvar self = this;\n\tself.audioBufferPossible = undefined;\n\tself.directSource = []; // type: AudioBufferSourceNode\n\tself.startTimeSec = undefined; // the time (in seconds) that the audio started: used for pause to get the pausedTimeSec.\n\tself.pausedTimeSec = undefined; // the position (in seconds) that the audio was paused: used for resume.\n\tself.audioBuffers = []; // cache of the buffers so starting play can be fast.\n\tself.duration = undefined; // the duration of the tune in seconds.\n\tself.isRunning = false; // whether there is currently a sound buffer running.\n\tself.options = undefined\n\tself.pickupLength = 0\n\n\t// Load and cache all needed sounds\n\tself.init = function(options) {\n\t\tif (!options)\n\t\t\toptions = {};\n\t\tif (options.options)\n\t\t\tself.options = options.options\n\t\tregisterAudioContext(options.audioContext); // This works no matter what - if there is already an ac it is a nop; if the context is not passed in, then it creates one.\n\t\tvar startTime = activeAudioContext().currentTime;\n\t\tself.debugCallback = options.debugCallback;\n\t\tif (self.debugCallback)\n\t\t\tself.debugCallback(\"init called\");\n\t\tself.audioBufferPossible = self._deviceCapable();\n\t\tif (!self.audioBufferPossible)\n\t\t\treturn Promise.reject({ status: \"NotSupported\", message: notSupportedMessage});\n\t\tvar params = options.options ? options.options : {};\n\t\tself.soundFontUrl = params.soundFontUrl ? params.soundFontUrl : defaultSoundFontUrl;\n\t\tif (self.soundFontUrl[self.soundFontUrl.length-1] !== '/')\n\t\t\tself.soundFontUrl += '/';\n\t\tif (params.soundFontVolumeMultiplier || params.soundFontVolumeMultiplier === 0)\n\t\t\tself.soundFontVolumeMultiplier = params.soundFontVolumeMultiplier;\n\t\telse if (self.soundFontUrl === defaultSoundFontUrl || self.soundFontUrl === alternateSoundFontUrl)\n\t\t\tself.soundFontVolumeMultiplier = 3.0;\n\t\telse if (self.soundFontUrl === originalSoundFontUrl)\n\t\t\tself.soundFontVolumeMultiplier = 0.4;\n\t\telse\n\t\t\tself.soundFontVolumeMultiplier = 1.0;\n\t\tif (params.programOffsets)\n\t\t\tself.programOffsets = params.programOffsets;\n\t\telse if (self.soundFontUrl === originalSoundFontUrl)\n\t\t\tself.programOffsets = {\n\t\t\t\t\"bright_acoustic_piano\": 20,\n\t\t\t\t\"honkytonk_piano\": 20,\n\t\t\t\t\"electric_piano_1\": 30,\n\t\t\t\t\"electric_piano_2\": 30,\n\t\t\t\t\"harpsichord\": 40,\n\t\t\t\t\"clavinet\": 20,\n\t\t\t\t\"celesta\": 20,\n\t\t\t\t\"glockenspiel\": 40,\n\t\t\t\t\"vibraphone\": 30,\n\t\t\t\t\"marimba\": 35,\n\t\t\t\t\"xylophone\": 30,\n\t\t\t\t\"tubular_bells\": 35,\n\t\t\t\t\"dulcimer\": 30,\n\t\t\t\t\"drawbar_organ\": 20,\n\t\t\t\t\"percussive_organ\": 25,\n\t\t\t\t\"rock_organ\": 20,\n\t\t\t\t\"church_organ\": 40,\n\t\t\t\t\"reed_organ\": 40,\n\t\t\t\t\"accordion\": 40,\n\t\t\t\t\"harmonica\": 40,\n\t\t\t\t\"acoustic_guitar_nylon\": 20,\n\t\t\t\t\"acoustic_guitar_steel\": 30,\n\t\t\t\t\"electric_guitar_jazz\": 25,\n\t\t\t\t\"electric_guitar_clean\": 15,\n\t\t\t\t\"electric_guitar_muted\": 35,\n\t\t\t\t\"overdriven_guitar\": 25,\n\t\t\t\t\"distortion_guitar\": 20,\n\t\t\t\t\"guitar_harmonics\": 30,\n\t\t\t\t\"electric_bass_finger\": 15,\n\t\t\t\t\"electric_bass_pick\": 30,\n\t\t\t\t\"fretless_bass\": 40,\n\t\t\t\t\"violin\": 105,\n\t\t\t\t\"viola\": 50,\n\t\t\t\t\"cello\": 40,\n\t\t\t\t\"contrabass\": 60,\n\t\t\t\t\"trumpet\": 10,\n\t\t\t\t\"trombone\": 90,\n\t\t\t\t\"alto_sax\": 20,\n\t\t\t\t\"tenor_sax\": 20,\n\t\t\t\t\"clarinet\": 20,\n\t\t\t\t\"flute\": 50,\n\t\t\t\t\"banjo\": 50,\n\t\t\t\t\"woodblock\": 20,\n\t\t\t};\n\t\telse\n\t\t\tself.programOffsets = {};\n\t\tvar p = params.fadeLength !== undefined ? parseInt(params.fadeLength,10) : NaN;\n\t\tself.fadeLength = isNaN(p) ? 200 : p;\n\t\tp = params.noteEnd !== undefined ? parseInt(params.noteEnd,10) : NaN;\n\t\tself.noteEnd = isNaN(p) ? 0 : p;\n\n\t\tself.pan = params.pan;\n\t\tself.meterSize = 1;\n\t\tif (options.visualObj) {\n\t\t\tself.flattened = options.visualObj.setUpAudio(params);\n\t\t\tvar meter = options.visualObj.getMeterFraction();\n\t\t\tif (meter.den)\n\t\t\t\tself.meterSize = options.visualObj.getMeterFraction().num / options.visualObj.getMeterFraction().den;\n\t\t\tself.pickupLength = options.visualObj.getPickupLength()\n\t\t} else if (options.sequence)\n\t\t\tself.flattened = options.sequence;\n\t\telse\n\t\t\treturn Promise.reject(new Error(\"Must pass in either a visualObj or a sequence\"));\n\t\tself.millisecondsPerMeasure = options.millisecondsPerMeasure ? options.millisecondsPerMeasure : (options.visualObj ? options.visualObj.millisecondsPerMeasure(self.flattened.tempo) : 1000);\n\t\tself.beatsPerMeasure = options.visualObj ? options.visualObj.getBeatsPerMeasure() : 4;\n\t\tself.sequenceCallback = params.sequenceCallback;\n\t\tself.callbackContext = params.callbackContext;\n\t\tself.onEnded = params.onEnded;\n\t\tself.meterFraction = options.visualObj ? options.visualObj.getMeterFraction() : {den: 1} // If we are given a sequence instead of a regular visual obj, then don't do the swing\n\n\t\tvar allNotes = {};\n\t\tvar cached = [];\n\t\tvar errorNotes = [];\n\t\tvar currentInstrument = instrumentIndexToName[0];\n\t\tself.flattened.tracks.forEach(function(track) {\n\t\t\ttrack.forEach(function(event) {\n\t\t\t\tif (event.cmd === \"program\" && instrumentIndexToName[event.instrument])\n\t\t\t\t\tcurrentInstrument = instrumentIndexToName[event.instrument];\n\t\t\t\tif (event.pitch !== undefined) {\n\t\t\t\t\tvar pitchNumber = event.pitch;\n\t\t\t\t\tvar noteName = pitchToNoteName[pitchNumber];\n\t\t\t\t\tvar inst = event.instrument !== undefined ? instrumentIndexToName[event.instrument] : currentInstrument\n\t\t\t\t\tif (noteName) {\n\t\t\t\t\t\tif (!allNotes[inst])\n\t\t\t\t\t\t\tallNotes[inst] = {};\n\t\t\t\t\t\tif (!soundsCache[inst] || !soundsCache[inst][noteName])\n\t\t\t\t\t\t\tallNotes[inst][noteName] = true;\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tvar label2 = inst+\":\"+noteName\n\t\t\t\t\t\t\tif (cached.indexOf(label2) < 0)\n\t\t\t\t\t\t\t\tcached.push(label2);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvar label = inst+\":\"+noteName\n\t\t\t\t\t\tconsole.log(\"Can't find note: \", pitchNumber, label);\n\t\t\t\t\t\tif (errorNotes.indexOf(label) < 0)\n\t\t\t\t\t\t\terrorNotes.push(label)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t\tif (self.debugCallback)\n\t\t\tself.debugCallback(\"note gathering time = \" + Math.floor((activeAudioContext().currentTime - startTime)*1000)+\"ms\");\n\t\tstartTime = activeAudioContext().currentTime;\n\n\t\tvar notes = [];\n\t\tObject.keys(allNotes).forEach(function(instrument) {\n\t\t\tObject.keys(allNotes[instrument]).forEach(function(note) {\n\t\t\t\tnotes.push({ instrument: instrument, note: note });\n\t\t\t});\n\t\t});\n\t\tif (self.debugCallback)\n\t\t\tself.debugCallback(\"notes \"+JSON.stringify(notes));\n\n\t\t// If there are lots of notes, load them in batches\n\t\tvar batches = [];\n\t\tvar CHUNK = 256;\n\t\tfor (var i=0; i < notes.length; i += CHUNK) {\n\t\t\tbatches.push(notes.slice(i, i + CHUNK));\n\t\t}\n\n\t\treturn new Promise(function(resolve, reject) {\n\t\t\tvar results = {\n\t\t\t\tcached: cached,\n\t\t\t\terror: errorNotes,\n\t\t\t\tloaded: []\n\t\t\t};\n\n\t\t\tvar index = 0;\n\t\t\tvar next = function() {\n\t\t\t\tif (self.debugCallback)\n\t\t\t\t\tself.debugCallback(\"loadBatch idx=\"+index+ \" len=\"+batches.length);\n\t\n\t\t\t\tif (index < batches.length) {\n\t\t\t\t\tself._loadBatch(batches[index], self.soundFontUrl, startTime).then(function(data) {\n\t\t\t\t\t\tif (self.debugCallback)\n\t\t\t\t\t\t\tself.debugCallback(\"loadBatch then\");\n\t\t\t\t\t\tstartTime = activeAudioContext().currentTime;\n\t\t\t\t\t\tif (data) {\n\t\t\t\t\t\t\tif (data.error)\n\t\t\t\t\t\t\t\tresults.error = results.error.concat(data.error);\n\t\t\t\t\t\t\tif (data.loaded)\n\t\t\t\t\t\t\t\tresults.loaded = results.loaded.concat(data.loaded);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tindex++;\n\t\t\t\t\t\tnext();\n\t\t\t\t\t}, reject);\n\t\t\t\t} else {\n\t\t\t\t\tif (self.debugCallback)\n\t\t\t\t\t\tself.debugCallback(\"resolve init\");\n\t\t\n\t\t\t\t\tresolve(results);\n\t\t\t\t}\n\t\t\t};\n\t\t\tnext();\n\t\t});\n\t};\n\n\tself._loadBatch = (function(batch, soundFontUrl, startTime, delay) {\n\t\t// This is called recursively to see if the sounds have loaded. The \"delay\" parameter is how long it has been since the original call.\n\t\tvar promises = [];\n\t\tbatch.forEach(function(item) {\n\t\t\tif (self.debugCallback)\n\t\t\t\tself.debugCallback(\"getNote \" + item.instrument+':'+item.note);\n\t\t\tpromises.push(getNote(soundFontUrl, item.instrument, item.note, activeAudioContext()));\n\t\t});\n\t\treturn Promise.all(promises).then(function(response) {\n\t\t\tif (self.debugCallback)\n\t\t\t\tself.debugCallback(\"mp3 load time = \" + Math.floor((activeAudioContext().currentTime - startTime)*1000)+\"ms\");\n\t\t\tvar loaded = [];\n\t\t\tvar cached = [];\n\t\t\tvar pending = [];\n\t\t\tvar error = [];\n\t\t\tfor (var i = 0; i < response.length; i++) {\n\t\t\t\tvar oneResponse = response[i];\n\t\t\t\tvar which = oneResponse.instrument + \":\" + oneResponse.name;\n\t\t\t\tif (oneResponse.status === \"loaded\")\n\t\t\t\t\tloaded.push(which);\n\t\t\t\telse if (oneResponse.status === \"pending\")\n\t\t\t\t\tpending.push(which);\n\t\t\t\telse if (oneResponse.status === \"cached\")\n\t\t\t\t\tcached.push(which);\n\t\t\t\telse\n\t\t\t\t\terror.push(which + ' ' + oneResponse.message);\n\t\t\t}\n\t\t\tif (pending.length > 0) {\n\t\t\t\tif (self.debugCallback)\n\t\t\t\t\tself.debugCallback(\"pending \" + JSON.stringify(pending));\n\t\t\t\t// There was probably a second call for notes before the first one finished, so just retry a few times to see if they stop being pending.\n\t\t\t\t// Retry quickly at first so that there isn't an unnecessary delay, but increase the delay each time.\n\t\t\t\tif (!delay)\n\t\t\t\t\tdelay = 50;\n\t\t\t\telse\n\t\t\t\t\tdelay = delay * 2;\n\t\t\t\tif (delay < 90000) {\n\t\t\t\t\treturn new Promise(function (resolve, reject) {\n\t\t\t\t\t\tsetTimeout(function () {\n\t\t\t\t\t\t\tvar newBatch = [];\n\t\t\t\t\t\t\tfor (i = 0; i < pending.length; i++) {\n\t\t\t\t\t\t\t\twhich = pending[i].split(\":\");\n\t\t\t\t\t\t\t\tnewBatch.push({instrument: which[0], note: which[1]});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (self.debugCallback)\n\t\t\t\t\t\t\t\tself.debugCallback(\"retry \" + JSON.stringify(newBatch));\n\t\t\t\t\t\t\t\t\tself._loadBatch(newBatch, soundFontUrl, startTime, delay).then(function (response) {\n\t\t\t\t\t\t\t\tresolve(response);\n\t\t\t\t\t\t\t}).catch(function (error) {\n\t\t\t\t\t\t\t\treject(error);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}, delay);\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tvar list = [];\n\t\t\t\t\tfor (var j = 0; j < batch.length; j++)\n\t\t\t\t\t\tlist.push(batch[j].instrument+'/'+batch[j].note)\n\t\t\t\t\t\tif (self.debugCallback)\n\t\t\t\t\t\t\tself.debugCallback(\"loadBatch timeout\")\n\t\t\t\t\t\treturn Promise.reject(new Error(\"timeout attempting to load: \" + list.join(\", \")));\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (self.debugCallback)\n\t\t\t\t\tself.debugCallback(\"loadBatch resolve\")\n\t\t\t\treturn Promise.resolve({loaded: loaded, cached: cached, error: error});\n\t\t\t}\n\t\t}).catch(function (error) {\n\t\t\tif (self.debugCallback)\n\t\t\t\tself.debugCallback(\"loadBatch catch \"+error.message)\n\t\t});\n\t});\n\n\tself.prime = function() {\n\t\t// At this point all of the notes are loaded. This function writes them into the output buffer.\n\t\t// Most music has a lot of repeating notes. If a note is the same pitch, volume, length, etc. as another one,\n\t\t// It saves a lot of time to just create it once and place it repeatedly where ever it needs to be.\n\t\tvar fadeTimeSec = self.fadeLength/1000;\n\t\tself.isRunning = false;\n\t\tif (!self.audioBufferPossible)\n\t\t\treturn Promise.reject(new Error(notSupportedMessage));\n\t\tif (self.debugCallback)\n\t\t\tself.debugCallback(\"prime called\");\n\t\treturn new Promise(function(resolve) {\n\t\t\tvar startTime = activeAudioContext().currentTime;\n\t\t\tvar tempoMultiplier = self.millisecondsPerMeasure / 1000 / self.meterSize;\n\t\t\tself.duration = self.flattened.totalDuration * tempoMultiplier;\n\t\t\tif(self.duration <= 0) {\n\t\t\t\tself.audioBuffers = [];\n\t\t\t\treturn resolve({ status: \"empty\", seconds: 0});\n\t\t\t}\n\t\t\tself.duration += fadeTimeSec;\n\t\t\tvar totalSamples = Math.floor(activeAudioContext().sampleRate * self.duration);\n\n\t\t\t// There might be a previous run that needs to be turned off.\n\t\t\tself.stop();\n\n\t\t\tvar noteMapTracks = createNoteMap(self.flattened);\n\n\t\t\tif (self.options.swing)\n\t\t\t\taddSwing(noteMapTracks, self.options.swing, self.meterFraction, self.pickupLength)\n\n\t\t\tif (self.sequenceCallback)\n\t\t\t\tself.sequenceCallback(noteMapTracks, self.callbackContext);\n\n\t\t\tvar panDistances = setPan(noteMapTracks.length, self.pan);\n\n\t\t\t// Create a simple list of all the unique sounds in this music and where they should be placed.\n\t\t\t// There appears to be a limit on how many audio buffers can be created at once so this technique limits the number needed.\n\t\t\tvar uniqueSounds = {};\n\t\t\tnoteMapTracks.forEach(function(noteMap, trackNumber) {\n\t\t\t\tvar panDistance = panDistances && panDistances.length > trackNumber ? panDistances[trackNumber] : 0;\n\t\t\t\tnoteMap.forEach(function(note) {\n\t\t\t\t\tvar key = note.instrument + ':' + note.pitch + ':' +note.volume + ':' + Math.round((note.end-note.start)*1000)/1000 + ':' + panDistance + ':' + tempoMultiplier + ':' + (note.cents ? note.cents : 0);\n\t\t\t\t\tif (self.debugCallback)\n\t\t\t\t\t\tself.debugCallback(\"noteMapTrack \"+key)\n\t\t\t\t\tif (!uniqueSounds[key])\n\t\t\t\t\t\tuniqueSounds[key] = [];\n\t\t\t\t\tuniqueSounds[key].push(note.start);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\t// Now that we know what we are trying to create, construct the audio buffer by creating each sound and placing it.\n\t\t\tvar allPromises = [];\n\t\t\tvar audioBuffer = activeAudioContext().createBuffer(2, totalSamples, activeAudioContext().sampleRate);\n\t\t\tfor (var key2 = 0; key2 < Object.keys(uniqueSounds).length; key2++) {\n\t\t\t\tvar k = Object.keys(uniqueSounds)[key2];\n\t\t\t\tvar parts = k.split(\":\");\n\t\t\t\tvar cents = parts[6] !== undefined ? parseFloat(parts[6]) : 0;\n\t\t\t\tparts = {instrument: parts[0], pitch: parseInt(parts[1], 10), volume: parseInt(parts[2], 10), len: parseFloat(parts[3]), pan: parseFloat(parts[4]), tempoMultiplier: parseFloat(parts[5]), cents: cents};\n\t\t\t\tallPromises.push(placeNote(audioBuffer, activeAudioContext().sampleRate, parts, uniqueSounds[k], self.soundFontVolumeMultiplier, self.programOffsets[parts.instrument], fadeTimeSec, self.noteEnd/1000, self.debugCallback));\n\t\t\t}\n\t\t\tself.audioBuffers = [audioBuffer];\n\n\t\t\tif (self.debugCallback) {\n\t\t\t\tself.debugCallback(\"sampleRate = \" + activeAudioContext().sampleRate);\n\t\t\t\tself.debugCallback(\"totalSamples = \" + totalSamples);\n\t\t\t\tself.debugCallback(\"creationTime = \" + Math.floor((activeAudioContext().currentTime - startTime)*1000) + \"ms\");\n\t\t\t}\n\t\t\tfunction resolveData(me) {\n\t\t\t\tvar duration = me && me.audioBuffers && me.audioBuffers.length > 0 ? me.audioBuffers[0].duration : 0;\n\t\t\t\treturn { status: activeAudioContext().state, duration: duration}\n\t\t\t}\n\t\t\tPromise.all(allPromises).then(function() {\n\t\t\t\t// Safari iOS can mess with the audioContext state, so resume if needed.\n\t\t\t\tif (activeAudioContext().state === \"suspended\") {\n\t\t\t\t\tactiveAudioContext().resume().then(function () {\n\t\t\t\t\t\tresolve(resolveData(self));\n\t\t\t\t\t})\n\t\t\t\t} else if (activeAudioContext().state === \"interrupted\") {\n\t\t\t\t\tactiveAudioContext().suspend().then(function () {\n\t\t\t\t\t\tactiveAudioContext().resume().then(function () {\n\t\t\t\t\t\t\tresolve(resolveData(self));\n\t\t\t\t\t\t})\n\t\t\t\t\t})\n\t\t\t\t} else {\n\t\t\t\t\tresolve(resolveData(self));\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t};\n\n\tfunction setPan(numTracks, panParam) {\n\t\t// panParam, if it is set, can be either a number representing the separation between each track,\n\t\t// or an array, which is the absolute pan position for each track.\n\t\tif (panParam === null || panParam === undefined)\n\t\t\treturn null;\n\n\t\tvar panDistances = [];\n\t\tif (panParam.length) {\n\t\t\t// We received an array. If there are the same number of items in the pan array as the number of tracks,\n\t\t\t// it all lines up perfectly. If there are more items in the pan array than the tracks then the excess items are ignored.\n\t\t\t// If there are more tracks than items in the pan array then the remaining tracks are placed in the middle.\n\t\t\t// If any of the pan numbers are out of range then they are adjusted.\n\t\t\tfor (var pp = 0; pp < numTracks; pp++) {\n\t\t\t\tif (pp < panParam.length) {\n\t\t\t\t\tvar x = parseFloat(panParam[pp]);\n\t\t\t\t\tif (x < -1)\n\t\t\t\t\t\tx = -1;\n\t\t\t\t\telse if (x > 1)\n\t\t\t\t\t\tx = 1;\n\t\t\t\t\tpanDistances.push(x);\n\t\t\t\t} else\n\t\t\t\t\tpanDistances.push(0)\n\t\t\t}\n\t\t\treturn panDistances;\n\t\t} else {\n\t\t\tvar panNumber = parseFloat(panParam);\n\t\t\t// the separation needs to be no further than 2 (i.e. -1 to 1) so test to see if there are too many tracks for the passed in distance\n\t\t\tif (panNumber*(numTracks-1) > 2)\n\t\t\t\treturn null;\n\n\t\t\t// If there are an even number of tracks, then offset so that the first two are centered around the middle\n\t\t\tvar even = numTracks % 2 === 0;\n\t\t\tvar currLow = even ? 0 - panNumber/2 : 0;\n\t\t\tvar currHigh = currLow+panNumber;\n\t\t\t// Now add the tracks to either side\n\t\t\tfor (var p = 0; p < numTracks; p++) {\n\t\t\t\teven = p % 2 === 0;\n\t\t\t\tif (even) {\n\t\t\t\t\tpanDistances.push(currLow);\n\t\t\t\t\tcurrLow -= panNumber;\n\t\t\t\t} else {\n\t\t\t\t\tpanDistances.push(currHigh);\n\t\t\t\t\tcurrHigh += panNumber;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn panDistances;\n\t\t}\n\t\t// There was either no panning, or the parameters were illegal\n\t\treturn null;\n\t}\n\n\t// This is called after everything is set up, so it can quickly make sound\n\tself.start = function() {\n\t\tif (!self.audioBufferPossible)\n\t\t\tthrow new Error(notSupportedMessage);\n\t\tif (self.debugCallback)\n\t\t\tself.debugCallback(\"start called\");\n\n\t\tvar resumePosition = self.pausedTimeSec ? self.pausedTimeSec : 0;\n\t\tself._kickOffSound(resumePosition);\n\t\tself.startTimeSec = activeAudioContext().currentTime - resumePosition;\n\t\tself.pausedTimeSec = undefined;\n\n\t\tif (self.debugCallback)\n\t\t\tself.debugCallback(\"MIDI STARTED\", self.startTimeSec);\n\t};\n\n\tself.pause = function() {\n\t\tif (!self.audioBufferPossible)\n\t\t\tthrow new Error(notSupportedMessage);\n\t\tif (self.debugCallback)\n\t\t\tself.debugCallback(\"pause called\");\n\n\t\tself.pausedTimeSec = self.stop();\n\t\treturn self.pausedTimeSec;\n\t};\n\n\tself.resume = function() {\n\t\tself.start();\n\t};\n\n\tself.seek = function(position, units) {\n\t\tvar offset;\n\t\tswitch (units) {\n\t\t\tcase \"seconds\":\n\t\t\t\toffset = position;\n\t\t\t\tbreak;\n\t\t\tcase \"beats\":\n\t\t\t\toffset = position * self.millisecondsPerMeasure / self.beatsPerMeasure / 1000;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\t// this is \"percent\" or any illegal value\n\t\t\t\toffset = (self.duration-self.fadeLength/1000) * position;\n\t\t\t\tbreak;\n\t\t}\n\n\t\t// TODO-PER: can seek when paused or when playing\n\t\tif (!self.audioBufferPossible)\n\t\t\tthrow new Error(notSupportedMessage);\n\t\tif (self.debugCallback)\n\t\t\tself.debugCallback(\"seek called sec=\" + offset);\n\n\t\tif (self.isRunning) {\n\t\t\tself.stop();\n\t\t\tself._kickOffSound(offset);\n\t\t} else {\n\t\t\tself.pausedTimeSec = offset;\n\t\t}\n\t\tself.pausedTimeSec = offset;\n\t};\n\n\tself.stop = function() {\n\t\tself.isRunning = false;\n\t\tself.pausedTimeSec = undefined;\n\t\tself.directSource.forEach(function(source) {\n\t\t\ttry {\n\t\t\t\tsource.stop();\n\t\t\t} catch (error) {\n\t\t\t\t// We don't care if self succeeds: it might fail if something else turned off the sound or it ended for some reason.\n\t\t\t\tconsole.log(\"direct source didn't stop:\", error)\n\t\t\t}\n\t\t});\n\t\tself.directSource = [];\n\t\tvar elapsed = activeAudioContext().currentTime - self.startTimeSec;\n\t\treturn elapsed;\n\t};\n\tself.finished = function() {\n\t\tself.startTimeSec = undefined;\n\t\tself.pausedTimeSec = undefined;\n\t\tself.isRunning = false;\n\t};\n\n\tself.download = function() {\n\t\treturn downloadBuffer(self);\n\t};\n\n\tself.getAudioBuffer = function() {\n\t\treturn self.audioBuffers[0];\n\t};\n\n\tself.getIsRunning = function() {\n\t\treturn self.isRunning;\n\t}\n\n\t/////////////// Private functions //////////////\n\n\tself._deviceCapable = function() {\n\t\tif (!supportsAudio()) {\n\t\t\tconsole.warn(notSupportedMessage);\n\t\t\tif (self.debugCallback)\n\t\t\t\tself.debugCallback(notSupportedMessage);\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t};\n\n\tself._kickOffSound = function(seconds) {\n\t\tself.isRunning = true;\n\t\tself.directSource = [];\n\t\tself.audioBuffers.forEach(function(audioBuffer, trackNum) {\n\t\t\tself.directSource[trackNum] = activeAudioContext().createBufferSource(); // creates a sound source\n\t\t\tself.directSource[trackNum].buffer = audioBuffer; // tell the source which sound to play\n\t\t\tself.directSource[trackNum].connect(activeAudioContext().destination); // connect the source to the context's destination (the speakers)\n\t\t});\n\t\tself.directSource.forEach(function(source) {\n\t\t\tsource.start(0, seconds);\n\t\t});\n\t\tif (self.onEnded) {\n\t\t\tself.directSource[0].onended = function () {\n\t\t\t\tself.onEnded(self.callbackContext);\n\t\t\t};\n\t\t}\n\t};\n\n\tfunction addSwing(noteMapTracks, swing, meterFraction, pickupLength) {\n\n\t\t// we can only swing in X/4 and X/8 meters.\n\t\tif (meterFraction.den != 4 && meterFraction.den != 8)\n\t\t\treturn;\n\n\t\tswing = parseFloat(swing);\n\n\t\t// 50 (or less) is no swing, \n\t\tif (isNaN(swing) || swing <= 50)\n\t\t\treturn;\n\n\t\t// 66 is triplet swing 2:1, and \n\t\t// 60 is swing with a ratio of 3:2. \n\t\t// 75 is the maximum swing where the first eight is played as a dotted eight and the second as a sixteenth. \n\t\tif (swing > 75)\n\t\t\tswing = 75;\n\n\t\t// convert the swing percentage to a percentage of increase for the first half of the beat\n\t\tswing = swing/50 - 1;\n\n\t\t// The volume of the swung notes is increased by this factor\n\t\t// could be also in the settings. Try out values such 0.1, 0.2\n\t\tvar volumeIncrease = 0.0;\n\n\t\t// the beatLength in X/8 meters\n\t\tvar beatLength = 0.25; \n\n\t\t// in X/8 meters the 16s swing so the beatLength is halved\n\t\tif (meterFraction.den === 8) \n\t\t\tbeatLength = beatLength/2; \n\n\t\t// duration of a half beat\n\t\tvar halfbeatLength = beatLength/2;\n\n\t\t// the extra duration of the first swung notes and the delay of the second notes\n\t\tvar swingDuration = halfbeatLength * swing;\n\n\t\tfor (var t = 0; t < noteMapTracks.length; t++) {\n\t\t\tvar track = noteMapTracks[t];\n\t\t\tfor (var i = 0; i < track.length; i++) {\n\t\t\t\tvar event = track[i];\n\t\t\t\tif (\n\t\t\t\t\t// is halfbeat\n\t\t\t\t\t(event.start-pickupLength) % halfbeatLength == 0 && (event.start-pickupLength) % beatLength != 0 \n\t\t\t\t\t&& (\n\t\t\t\t\t\t// the previous note is on the beat or before OR there is no previous note \n\t\t\t\t\t\ti == 0 \n\t\t\t\t\t\t|| track[i-1].start <= track[i].start - halfbeatLength\n\t\t\t\t\t)\n\t\t\t\t\t&& (\n\t\t\t\t\t\t// the next note is on the beat or after OR there is no next note\n\t\t\t\t\t\ti == track.length - 1 \n\t\t\t\t\t\t|| track[i+1].start >= track[i].start + halfbeatLength\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\tvar oldEventStart = event.start;\n\n\t\t\t\t\tevent.start += swingDuration;\n\n\t\t\t\t\t// Increase volume of swung notes\n\t\t\t\t\tevent.volume *= 1 + volumeIncrease;\n\n\t\t\t\t\t// if there is a previous note ending at the start of this note, extend its end\n\t\t\t\t\t// and decrease its volume\n\t\t\t\t\tif (i > 0 && track[i-1].end == oldEventStart) {\n\t\t\t\t\t\ttrack[i-1].end = event.start;\n\t\t\t\t\t\ttrack[i-1].volume *= 1 - volumeIncrease;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n}\n\nmodule.exports = CreateSynth;\n","var SynthSequence = function() {\n\tvar self = this;\n\tself.tracks = [];\n\tself.totalDuration = 0;\n\tself.currentInstrument = [];\n\tself.starts = [];\n\n\tself.addTrack = function() {\n\t\tself.tracks.push([]);\n\t\tself.currentInstrument.push(0);\n\t\tself.starts.push(0);\n\t\treturn self.tracks.length - 1;\n\t};\n\n\tself.setInstrument = function(trackNumber, instrumentNumber) {\n\t\tself.tracks[trackNumber].push({\n\t\t\tchannel: 0,\n\t\t\tcmd: \"program\",\n\t\t\tinstrument: instrumentNumber\n\t\t});\n\t\tself.currentInstrument[trackNumber] = instrumentNumber;\n\t};\n\n\tself.appendNote = function(trackNumber, pitch, durationInMeasures, volume, cents) {\n\t\tvar note = {\n\t\t\tcmd: \"note\",\n\t\t\tduration: durationInMeasures,\n\t\t\tgap: 0,\n\t\t\tinstrument: self.currentInstrument[trackNumber],\n\t\t\tpitch: pitch,\n\t\t\tstart: self.starts[trackNumber],\n\t\t\tvolume: volume\n\t\t};\n\t\tif (cents)\n\t\t\tnote.cents = cents;\n\t\tself.tracks[trackNumber].push(note);\n\t\tself.starts[trackNumber] += durationInMeasures;\n\n\t\tself.totalDuration = Math.max(self.totalDuration, self.starts[trackNumber]);\n\t};\n};\n\nmodule.exports = SynthSequence;\n","var svg = `\n<svg version=\"1.0\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 700 700\" preserveAspectRatio=\"xMidYMid meet\">\n\t<g transform=\"translate(0,700) scale(0.1,-0.1)\" >\n\t<path d=\"M3111 6981 c-20 -37 -90 -55 -364 -96 -120 -18 -190 -33 -244 -55\n\t-42 -17 -124 -42 -182 -56 -78 -18 -119 -34 -157 -60 -28 -19 -86 -46 -128\n\t-60 -43 -13 -107 -42 -144 -64 -37 -23 -84 -46 -106 -52 -21 -7 -56 -29 -79\n\t-50 -22 -22 -61 -50 -86 -63 -26 -13 -67 -40 -91 -60 -24 -20 -65 -47 -90 -60\n\t-25 -13 -53 -31 -61 -41 -8 -9 -32 -30 -54 -46 -75 -54 -486 -460 -512 -507\n\t-15 -25 -48 -69 -75 -98 -26 -28 -48 -57 -48 -63 0 -6 -18 -29 -39 -53 -21\n\t-23 -56 -71 -77 -107 -20 -36 -50 -80 -65 -97 -16 -18 -33 -52 -40 -75 -12\n\t-47 -47 -115 -84 -166 -13 -18 -30 -56 -38 -83 -8 -27 -34 -80 -56 -118 -33\n\t-53 -46 -91 -62 -167 -12 -63 -34 -127 -59 -179 -42 -84 -60 -166 -60 -270 0\n\t-90 26 -122 125 -154 54 -17 96 -19 430 -20 305 -1 381 2 430 14 82 22 140 51\n\t153 78 6 12 22 47 37 77 14 30 38 77 54 103 15 27 34 73 40 103 7 30 28 78 48\n\t107 19 28 44 74 55 101 10 28 34 67 53 87 18 20 49 61 68 90 19 30 44 63 57\n\t74 13 11 36 40 52 65 59 94 232 270 306 313 20 11 57 37 82 58 25 20 70 52\n\t100 72 30 19 66 47 79 61 13 14 49 35 80 46 30 12 80 37 111 56 31 19 95 45\n\t143 58 48 12 110 37 139 55 63 40 127 55 323 76 83 9 208 28 279 41 156 29\n\t165 29 330 4 453 -71 514 -84 606 -130 31 -16 83 -36 116 -45 32 -9 84 -34\n\t115 -56 31 -21 82 -48 113 -60 32 -11 72 -33 89 -48 18 -16 59 -45 92 -65 33\n\t-21 74 -51 90 -66 17 -15 49 -40 73 -54 52 -32 65 -61 50 -113 -8 -31 -61 -90\n\t-277 -308 -300 -303 -361 -382 -369 -481 -2 -29 0 -66 6 -81 13 -40 88 -138\n\t115 -151 12 -6 54 -26 92 -44 l70 -33 945 -2 c520 -1 975 2 1012 7 64 8 191\n\t50 231 76 11 7 33 34 50 60 22 34 42 51 65 58 l32 9 0 1101 0 1102 -32 9 c-21\n\t7 -44 26 -64 55 -60 84 -77 97 -140 110 -44 9 -76 10 -127 2 -59 -9 -77 -17\n\t-134 -62 -37 -28 -172 -155 -301 -281 -129 -127 -249 -237 -267 -245 -25 -10\n\t-41 -11 -71 -2 -58 15 -112 45 -124 69 -6 11 -35 35 -64 54 -28 18 -58 41 -66\n\t50 -8 9 -41 35 -75 58 -33 22 -77 56 -99 75 -21 18 -64 46 -95 61 -31 14 -73\n\t39 -93 55 -20 15 -70 40 -110 55 -40 15 -97 44 -127 64 -29 21 -78 44 -107 53\n\t-30 8 -77 31 -105 51 -42 28 -73 39 -173 60 -68 14 -154 39 -196 58 -95 43\n\t-131 51 -343 76 -209 24 -242 32 -279 70 l-30 29 -328 0 c-312 0 -330 -1 -339\n\t-19z\"></path>\n\t<path d=\"M254 2875 c-89 -16 -107 -26 -145 -78 -32 -44 -62 -66 -91 -67 -17 0\n\t-18 -61 -18 -1140 l0 -1140 24 0 c16 0 41 -17 72 -50 40 -42 61 -55 117 -72\n\tl69 -21 82 23 c44 12 96 30 114 39 18 9 148 132 290 272 141 141 267 261 279\n\t268 51 26 86 14 176 -61 32 -26 62 -48 66 -48 5 0 36 -25 70 -55 34 -30 74\n\t-61 89 -69 15 -8 37 -28 50 -45 12 -17 50 -45 84 -62 34 -17 78 -44 98 -60 19\n\t-16 61 -37 93 -48 32 -11 81 -37 107 -56 27 -20 76 -45 109 -56 33 -12 75 -31\n\t93 -44 62 -45 93 -58 191 -82 54 -12 130 -37 168 -54 68 -29 180 -58 226 -59\n\t62 0 183 -64 183 -96 0 -12 88 -14 639 -14 l639 0 12 30 c18 44 76 66 233 89\n\t89 14 160 30 200 47 34 15 106 42 159 60 54 18 112 44 130 57 47 35 85 52 146\n\t67 29 7 76 28 105 48 29 20 77 48 107 63 30 15 66 39 80 54 14 15 50 40 81 56\n\t31 15 78 46 104 69 26 22 61 46 79 54 17 7 43 26 56 42 14 16 41 41 60 56 64\n\t48 380 362 408 405 15 23 40 51 55 63 15 12 36 38 46 58 11 21 37 57 58 82 22\n\t25 49 62 62 83 13 20 38 56 57 78 19 23 50 74 69 113 19 39 46 86 59 104 14\n\t18 34 62 46 98 12 36 32 77 45 92 31 38 60 97 80 167 9 33 26 76 37 95 29 50\n\t47 103 68 206 10 52 32 117 51 155 29 56 33 74 34 140 0 94 -10 108 -101 138\n\t-61 20 -83 21 -463 21 -226 0 -421 -4 -451 -10 -63 -12 -86 -30 -110 -85 -10\n\t-22 -33 -63 -52 -92 -21 -31 -42 -80 -53 -123 -11 -44 -32 -93 -56 -128 -20\n\t-32 -47 -83 -59 -115 -12 -32 -37 -77 -56 -100 -19 -23 -50 -65 -69 -94 -19\n\t-29 -44 -57 -54 -63 -11 -5 -29 -27 -42 -47 -52 -85 -234 -277 -300 -315 -25\n\t-15 -53 -38 -62 -51 -9 -14 -42 -39 -74 -57 -32 -18 -75 -48 -95 -66 -21 -18\n\t-59 -44 -85 -58 -26 -13 -72 -40 -100 -59 -35 -24 -78 -41 -128 -52 -47 -11\n\t-99 -31 -139 -56 -69 -42 -94 -49 -391 -110 -245 -51 -425 -66 -595 -50 -168\n\t16 -230 27 -330 61 -47 16 -123 35 -170 44 -98 17 -123 25 -172 58 -20 14 -71\n\t37 -114 53 -44 15 -95 40 -115 56 -20 16 -70 42 -110 59 -40 16 -88 45 -108\n\t63 -20 19 -55 46 -78 61 -24 14 -49 35 -55 47 -7 11 -34 33 -60 49 -50 31 -65\n\t61 -53 102 4 13 130 147 281 298 236 238 277 283 299 335 15 32 35 71 46 86\n\t12 18 19 44 19 76 0 42 -8 63 -53 138 -92 151 11 139 -1207 141 -798 2 -1030\n\t0 -1086 -11z\"></path>\n\t</g>\n</svg>\n`\n\nmodule.exports = svg\n","var svg = `\n<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 25 25\" class=\"abcjs-play-svg\">\n <g>\n <polygon points=\"4 0 23 12.5 4 25\"/>\n </g>\n</svg>\n`\n\nmodule.exports = svg\n","var svg = `\n<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 25 25\" class=\"abcjs-pause-svg\">\n <g>\n <rect width=\"8.23\" height=\"25\"/>\n <rect width=\"8.23\" height=\"25\" x=\"17\"/>\n </g>\n</svg>\n`\n\nmodule.exports = svg\n","var svg = `\n<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 100 100\" class=\"abcjs-loading-svg\">\n <circle cx=\"50\" cy=\"50\" fill=\"none\" stroke-width=\"20\" r=\"35\" stroke-dasharray=\"160 55\"></circle>\n</svg>\n`\n\nmodule.exports = svg\n","var svg = `\n<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 25 25\">\n <g>\n <polygon points=\"5 12.5 24 0 24 25\"/>\n <rect width=\"3\" height=\"25\" x=\"0\" y=\"0\"/>\n </g>\n</svg>\n`\n\nmodule.exports = svg\n","var supportsAudio = require('./supports-audio');\nvar registerAudioContext = require('./register-audio-context');\nvar activeAudioContext = require('./active-audio-context');\n\nvar loopImage = require('./images/loop.svg.js');\nvar playImage = require('./images/play.svg.js');\nvar pauseImage = require('./images/pause.svg.js');\nvar loadingImage = require('./images/loading.svg.js');\nvar resetImage = require('./images/reset.svg.js');\n\nfunction CreateSynthControl(parent, options) {\n\tvar self = this;\n\t// parent is either an element or a selector.\n\tif (typeof parent === \"string\") {\n\t\tvar selector = parent;\n\t\tparent = document.querySelector(selector);\n\t\tif (!parent)\n\t\t\tthrow new Error(\"Cannot find element \\\"\" + selector + \"\\\" in the DOM.\");\n\t} else if (!(parent instanceof HTMLElement))\n\t\tthrow new Error(\"The first parameter must be a valid element or selector in the DOM.\");\n\n\tself.parent = parent;\n\tself.options = {};\n\tif (options)\n\t\tself.options = Object.assign({},options);\n\n\t// This can be called in the following cases:\n\t// AC already registered and not suspended\n\t// AC already registered and suspended\n\t// AC not registered and not passed in\n\t// AC not registered but passed in (but suspended)\n\t// AC not registered but passed in (not suspended)\n\t// If the AC is already registered, then just use it - ignore what is passed in\n\t// Create the AC if necessary if there isn't one already.\n\t// We don't care right now if the AC is suspended - whenever a button is clicked then we check it.\n\tif (self.options.ac)\n\t\tregisterAudioContext(self.options.ac);\n\tbuildDom(self.parent, self.options);\n\tattachListeners(self);\n\n\tself.disable = function(isDisabled) {\n\t\tvar el = self.parent.querySelector(\".abcjs-inline-audio\");\n\t\tif (isDisabled)\n\t\t\tel.classList.add(\"abcjs-disabled\");\n\t\telse\n\t\t\tel.classList.remove(\"abcjs-disabled\");\n\t};\n\tself.setWarp = function(tempo, warp) {\n\t\tvar el = self.parent.querySelector(\".abcjs-midi-tempo\");\n\t\tel.value = Math.round(warp);\n\t\tself.setTempo(tempo)\n\t};\n\tself.setTempo = function(tempo) {\n\t\tvar el = self.parent.querySelector(\".abcjs-midi-current-tempo\");\n\t\tif (el)\n\t\t\tel.innerHTML = Math.round(tempo);\n\t};\n\tself.resetAll = function() {\n\t\tvar pushedButtons = self.parent.querySelectorAll(\".abcjs-pushed\");\n\t\tfor (var i = 0; i < pushedButtons.length; i++) {\n\t\t\tvar button = pushedButtons[i];\n\t\t\tbutton.classList.remove(\"abcjs-pushed\");\n\t\t}\n\t};\n\tself.pushPlay = function(push) {\n\t\tvar startButton = self.parent.querySelector(\".abcjs-midi-start\");\n\t\tif (!startButton)\n\t\t\treturn;\n\t\tif (push)\n\t\t\tstartButton.classList.add(\"abcjs-pushed\");\n\t\telse\n\t\t\tstartButton.classList.remove(\"abcjs-pushed\");\n\t};\n\tself.pushLoop = function(push) {\n\t\tvar loopButton = self.parent.querySelector(\".abcjs-midi-loop\");\n\t\tif (!loopButton)\n\t\t\treturn;\n\t\tif (push)\n\t\t\tloopButton.classList.add(\"abcjs-pushed\");\n\t\telse\n\t\t\tloopButton.classList.remove(\"abcjs-pushed\");\n\t};\n\n\tself.setProgress = function (percent, totalTime) {\n\t\tvar progressBackground = self.parent.querySelector(\".abcjs-midi-progress-background\");\n\t\tvar progressThumb = self.parent.querySelector(\".abcjs-midi-progress-indicator\");\n\t\tif (!progressBackground || !progressThumb)\n\t\t\treturn;\n\t\tvar width = progressBackground.clientWidth;\n\t\tvar left = width * percent;\n\t\tprogressThumb.style.left = left + \"px\";\n\n\t\tvar clock = self.parent.querySelector(\".abcjs-midi-clock\");\n\t\tif (clock) {\n\t\t\tvar totalSeconds = (totalTime * percent) / 1000;\n\t\t\tvar minutes = Math.floor(totalSeconds / 60);\n\t\t\tvar seconds = Math.floor(totalSeconds % 60);\n\t\t\tvar secondsFormatted = seconds < 10 ? \"0\" + seconds : seconds;\n\t\t\tclock.innerHTML = minutes + \":\" + secondsFormatted;\n\t\t}\n\t};\n\n\tif (self.options.afterResume) {\n\t\tvar isResumed = false;\n\t\tif (self.options.ac) {\n\t\t\tisResumed = self.options.ac.state !== \"suspended\";\n\t\t} else if (activeAudioContext()) {\n\t\t\tisResumed = activeAudioContext().state !== \"suspended\";\n\t\t}\n\t\tif (isResumed)\n\t\t\tself.options.afterResume();\n\t}\n}\n\nfunction buildDom(parent, options) {\n\tvar hasLoop = !!options.loopHandler;\n\tvar hasRestart = !!options.restartHandler;\n\tvar hasPlay = !!options.playHandler || !!options.playPromiseHandler;\n\tvar hasProgress = !!options.progressHandler;\n\tvar hasWarp = !!options.warpHandler;\n\tvar hasClock = options.hasClock !== false;\n\n\tvar html = '<div class=\"abcjs-inline-audio\">\\n';\n\tif (hasLoop) {\n\t\tvar repeatTitle = options.repeatTitle ? options.repeatTitle : \"Click to toggle play once/repeat.\";\n\t\tvar repeatAria = options.repeatAria ? options.repeatAria : repeatTitle;\n\t\thtml += '<button type=\"button\" class=\"abcjs-midi-loop abcjs-btn\" title=\"' + repeatTitle + '\" aria-label=\"' + repeatAria + '\">' + loopImage + '</button>\\n';\n\t}\n\tif (hasRestart) {\n\t\tvar restartTitle = options.restartTitle ? options.restartTitle : \"Click to go to beginning.\";\n\t\tvar restartAria = options.restartAria ? options.restartAria : restartTitle;\n\t\thtml += '<button type=\"button\" class=\"abcjs-midi-reset abcjs-btn\" title=\"' + restartTitle + '\" aria-label=\"' + restartAria + '\">' + resetImage + '</button>\\n';\n\t}\n\tif (hasPlay) {\n\t\tvar playTitle = options.playTitle ? options.playTitle : \"Click to play/pause.\";\n\t\tvar playAria = options.playAria ? options.playAria : playTitle;\n\t\thtml += '<button type=\"button\" class=\"abcjs-midi-start abcjs-btn\" title=\"' + playTitle + '\" aria-label=\"' + playAria + '\">' + playImage + pauseImage + loadingImage + '</button>\\n';\n\t}\n\tif (hasProgress) {\n\t\tvar randomTitle = options.randomTitle ? options.randomTitle : \"Click to change the playback position.\";\n\t\tvar randomAria = options.randomAria ? options.randomAria : randomTitle;\n\t\thtml += '<button type=\"button\" class=\"abcjs-midi-progress-background\" title=\"' + randomTitle + '\" aria-label=\"' + randomAria + '\"><span class=\"abcjs-midi-progress-indicator\"></span></button>\\n';\n\t}\n\tif (hasClock) {\n\t\thtml += '<span class=\"abcjs-midi-clock\"></span>\\n';\n\t}\n\tif (hasWarp) {\n\t\tvar warpTitle = options.warpTitle ? options.warpTitle : \"Change the playback speed.\";\n\t\tvar warpAria = options.warpAria ? options.warpAria : warpTitle;\n\t\tvar bpm = options.bpm ? options.bpm : \"BPM\";\n\t\thtml += '<span class=\"abcjs-tempo-wrapper\"><label><input class=\"abcjs-midi-tempo\" type=\"number\" min=\"1\" max=\"300\" value=\"100\" title=\"' + warpTitle + '\" aria-label=\"' + warpAria + '\">%</label><span> (<span class=\"abcjs-midi-current-tempo\"></span> ' + bpm + ')</span></span>\\n';\n\t}\n\thtml += '<div class=\"abcjs-css-warning\" style=\"font-size: 12px;color:red;border: 1px solid red;text-align: center;width: 300px;margin-top: 4px;font-weight: bold;border-radius: 4px;\">CSS required: load abcjs-audio.css</div>';\n\thtml += '</div>\\n';\n\tparent.innerHTML = html;\n}\n\nfunction acResumerMiddleWare(next, ev, playBtn, afterResume, isPromise) {\n\tvar needsInit = true;\n\tif (!activeAudioContext()) {\n\t\tregisterAudioContext();\n\t} else {\n\t\tneedsInit = activeAudioContext().state === \"suspended\";\n\t}\n\tif (!supportsAudio()) {\n\t\tthrow { status: \"NotSupported\", message: \"This browser does not support audio.\"};\n\t}\n\n\tif ((needsInit || isPromise) && playBtn)\n\t\tplayBtn.classList.add(\"abcjs-loading\");\n\n\tif (needsInit) {\n\t\tactiveAudioContext().resume().then(function () {\n\t\t\tif (afterResume) {\n\t\t\t\tafterResume().then(function (response) {\n\t\t\t\t\tdoNext(next, ev, playBtn, isPromise);\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tdoNext(next, ev, playBtn, isPromise);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tdoNext(next, ev, playBtn, isPromise);\n\t}\n}\n\nfunction doNext(next, ev, playBtn, isPromise) {\n\tif (isPromise) {\n\t\tnext(ev).then(function() {\n\t\t\tif (playBtn)\n\t\t\t\tplayBtn.classList.remove(\"abcjs-loading\");\n\t\t});\n\t} else {\n\t\tnext(ev);\n\t\tif (playBtn)\n\t\t\tplayBtn.classList.remove(\"abcjs-loading\");\n\t}\n}\n\nfunction attachListeners(self) {\n\tvar hasLoop = !!self.options.loopHandler;\n\tvar hasRestart = !!self.options.restartHandler;\n\tvar hasPlay = !!self.options.playHandler || !!self.options.playPromiseHandler;\n\tvar hasProgress = !!self.options.progressHandler;\n\tvar hasWarp = !!self.options.warpHandler;\n\tvar playBtn = self.parent.querySelector(\".abcjs-midi-start\");\n\n\tif (hasLoop)\n\t\tself.parent.querySelector(\".abcjs-midi-loop\").addEventListener(\"click\", function(ev){acResumerMiddleWare(self.options.loopHandler, ev, playBtn, self.options.afterResume)});\n\tif (hasRestart)\n\t\tself.parent.querySelector(\".abcjs-midi-reset\").addEventListener(\"click\", function(ev){acResumerMiddleWare(self.options.restartHandler, ev, playBtn, self.options.afterResume)});\n\tif (hasPlay)\n\t\tplayBtn.addEventListener(\"click\", function(ev){\n\t\t\tacResumerMiddleWare(\n\t\t\t\tself.options.playPromiseHandler || self.options.playHandler,\n\t\t\t\tev,\n\t\t\t\tplayBtn,\n\t\t\t\tself.options.afterResume,\n\t\t\t\t!!self.options.playPromiseHandler)\n\t\t});\n\tif (hasProgress)\n\t\tself.parent.querySelector(\".abcjs-midi-progress-background\").addEventListener(\"click\", function(ev){acResumerMiddleWare(self.options.progressHandler, ev, playBtn, self.options.afterResume)});\n\tif (hasWarp)\n\t\tself.parent.querySelector(\".abcjs-midi-tempo\").addEventListener(\"change\", function(ev){acResumerMiddleWare(self.options.warpHandler, ev, playBtn, self.options.afterResume)});\n}\nmodule.exports = CreateSynthControl;\n","var SynthSequence = require('./synth-sequence');\nvar CreateSynth = require('./create-synth');\nvar activeAudioContext = require(\"./active-audio-context\");\n\nfunction playEvent(midiPitches, midiGracePitches, millisecondsPerMeasure, soundFontUrl, debugCallback) {\n\tvar sequence = new SynthSequence();\n\n\tfor (var i = 0; i < midiPitches.length; i++) {\n\t\tvar note = midiPitches[i];\n\t\tvar trackNum = sequence.addTrack();\n\t\tsequence.setInstrument(trackNum, note.instrument);\n\t\tif (i === 0 && midiGracePitches) {\n\t\t\tfor (var j = 0; j < midiGracePitches.length; j++) {\n\t\t\t\tvar grace = midiGracePitches[j];\n\t\t\t\tsequence.appendNote(trackNum, grace.pitch, 1 / 64, grace.volume, grace.cents);\n\t\t\t}\n\t\t}\n\t\tsequence.appendNote(trackNum, note.pitch, note.duration, note.volume, note.cents);\n\t}\n\n\tvar ac = activeAudioContext();\n\tif (ac.state === \"suspended\") {\n\t\treturn ac.resume().then(function () {\n\t\t\treturn doPlay(sequence, millisecondsPerMeasure, soundFontUrl, debugCallback);\n\t\t});\n\t} else {\n\t\treturn doPlay(sequence, millisecondsPerMeasure, soundFontUrl, debugCallback);\n\t}\n}\n\nfunction doPlay(sequence, millisecondsPerMeasure, soundFontUrl, debugCallback) {\n\tvar buffer = new CreateSynth();\n\treturn buffer.init({\n\t\tsequence: sequence,\n\t\tmillisecondsPerMeasure: millisecondsPerMeasure,\n\t\toptions: { soundFontUrl: soundFontUrl },\n\t\tdebugCallback: debugCallback,\n\t}).then(function () {\n\t\treturn buffer.prime();\n\t}).then(function () {\n\t\tbuffer.start();\n\t\treturn Promise.resolve();\n\t});\n}\n\nmodule.exports = playEvent;\n","var CreateSynthControl = require('./create-synth-control');\nvar CreateSynth = require('./create-synth');\nvar TimingCallbacks = require('../api/abc_timing_callbacks');\nvar activeAudioContext = require('./active-audio-context');\n\nfunction SynthController() {\n\tvar self = this;\n\tself.warp = 100;\n\tself.cursorControl = null;\n\tself.visualObj = null;\n\tself.timer = null;\n\tself.midiBuffer = null;\n\tself.options = null;\n\tself.currentTempo = null;\n\tself.control = null;\n\tself.isLooping = false;\n\tself.isStarted = false;\n\tself.isLoaded = false;\n\tself.isLoading = false;\n\n\tself.load = function (selector, cursorControl, visualOptions) {\n\t\tif (!visualOptions)\n\t\t\tvisualOptions = {};\n\t\tif (visualOptions.displayPlay === undefined)\n\t\t\tvisualOptions.displayPlay = true\n\t\tif (visualOptions.displayProgress === undefined)\n\t\t\tvisualOptions.displayProgress = true\n\t\tself.control = new CreateSynthControl(selector, {\n\t\t\tloopHandler: visualOptions.displayLoop ? self.toggleLoop : undefined,\n\t\t\trestartHandler: visualOptions.displayRestart ? self.restart : undefined,\n\t\t\tplayPromiseHandler: visualOptions.displayPlay ? self.play : undefined,\n\t\t\tprogressHandler: visualOptions.displayProgress ? self.randomAccess : undefined,\n\t\t\twarpHandler: visualOptions.displayWarp ? self.onWarp : undefined,\n\t\t\tafterResume: self.init\n\t\t});\n\t\tself.cursorControl = cursorControl;\n\t\tself.disable(true);\n\t};\n\n\tself.disable = function(isDisabled) {\n\t\tif (self.control)\n\t\t\tself.control.disable(isDisabled);\n\t};\n\n\tself.setTune = function(visualObj, userAction, audioParams) {\n\t\tself.visualObj = visualObj;\n\t\tself.disable(false);\n\t\tself.options = audioParams ? audioParams : {};\n\n\t\tif (self.control) {\n\t\t\tself.pause();\n\t\t\tself.setProgress(0, 1);\n\t\t\tself.control.resetAll();\n\t\t\tself.restart();\n\t\t\tself.isStarted = false;\n\t\t}\n\t\tself.isLooping = false;\n\n\t\tif (userAction)\n\t\t\treturn self.go();\n\t\telse {\n\t\t\treturn Promise.resolve({status: \"no-audio-context\"});\n\t\t}\n\t};\n\n\tself.go = function () {\n\t\tself.isLoading = true;\n\t\tvar millisecondsPerMeasure = self.visualObj.millisecondsPerMeasure() * 100 / self.warp;\n\t\tself.currentTempo = Math.round(self.visualObj.getBeatsPerMeasure() / millisecondsPerMeasure * 60000);\n\t\tif (self.control)\n\t\t\tself.control.setTempo(self.currentTempo);\n\t\tself.percent = 0;\n\t\tvar loadingResponse;\n\n\t\tif (!self.midiBuffer)\n\t\t\tself.midiBuffer = new CreateSynth();\n\t\treturn activeAudioContext().resume().then(function (response) {\n\t\t\treturn self.midiBuffer.init({\n\t\t\t\tvisualObj: self.visualObj,\n\t\t\t\toptions: self.options,\n\t\t\t\tmillisecondsPerMeasure: millisecondsPerMeasure\n\t\t\t});\n\t\t}).then(function (response) {\n\t\t\tloadingResponse = response;\n\t\t\treturn self.midiBuffer.prime();\n\t\t}).then(function () {\n\t\t\tvar subdivisions = 16;\n\t\t\tif (self.cursorControl &&\n\t\t\t\tself.cursorControl.beatSubdivisions !== undefined &&\n\t\t\t\tparseInt(self.cursorControl.beatSubdivisions, 10) >= 1 &&\n\t\t\t\tparseInt(self.cursorControl.beatSubdivisions, 10) <= 64)\n\t\t\t\tsubdivisions = parseInt(self.cursorControl.beatSubdivisions, 10);\n\n\t\t\t// Need to create the TimingCallbacks after priming the midi so that the midi data is available for the callbacks.\n\t\t\tself.timer = new TimingCallbacks(self.visualObj, {\n\t\t\t\tbeatCallback: self.beatCallback,\n\t\t\t\teventCallback: self.eventCallback,\n\t\t\t\tlineEndCallback: self.lineEndCallback,\n\t\t\t\tqpm: self.currentTempo,\n\n\t\t\t\textraMeasuresAtBeginning: self.cursorControl ? self.cursorControl.extraMeasuresAtBeginning : undefined,\n\t\t\t\tlineEndAnticipation: self.cursorControl ? self.cursorControl.lineEndAnticipation : 0,\n\t\t\t\tbeatSubdivisions: subdivisions,\n\t\t\t});\n\t\t\tif (self.cursorControl && self.cursorControl.onReady && typeof self.cursorControl.onReady === 'function')\n\t\t\t\tself.cursorControl.onReady(self);\n\t\t\tself.isLoaded = true;\n\t\t\tself.isLoading = false;\n\t\t\treturn Promise.resolve({ status: \"created\", notesStatus: loadingResponse });\n\t\t});\n\t};\n\n\tself.destroy = function () {\n\t\tif (self.timer) {\n\t\t\tself.timer.reset();\n\t\t\tself.timer.stop();\n\t\t\tself.timer = null;\n\t\t}\n\t\tif (self.midiBuffer) {\n\t\t\tself.midiBuffer.stop();\n\t\t\tself.midiBuffer = null;\n\t\t}\n\t\tself.setProgress(0, 1);\n\t\tif (self.control)\n\t\t\tself.control.resetAll();\n\t};\n\n\tself.play = function () {\n\t\treturn self.runWhenReady(self._play, undefined);\n\t};\n\n\tfunction sleep(ms) {\n\t\treturn new Promise(function (resolve) {\n\t\t\tsetTimeout(resolve, ms)\n\t\t});\n\t}\n\n\tself.runWhenReady = function(fn, arg1) {\n\t\tif (!self.visualObj)\n\t\t\treturn Promise.resolve({status: \"loading\"});\n\t\tif (self.isLoading) {\n\t\t\t// Some other promise is waiting for the tune to be loaded, so just wait.\n\t\t\treturn sleep(500).then(function() {\n\t\t\t\tif (self.isLoading)\n\t\t\t\t\treturn self.runWhenReady(fn, arg1);\n\t\t\t\treturn fn(arg1);\n\t\t\t})\n\t\t} else if (!self.isLoaded) {\n\t\t\treturn self.go().then(function () {\n\t\t\t\treturn fn(arg1);\n\t\t\t});\n\t\t} else {\n\t\t\treturn fn(arg1);\n\t\t}\n\t};\n\n\tself._play = function () {\n\t\treturn activeAudioContext().resume().then(function () {\n\t\t\tself.isStarted = !self.isStarted;\n\t\t\tif (self.isStarted) {\n\t\t\t\tif (self.cursorControl && self.cursorControl.onStart && typeof self.cursorControl.onStart === 'function')\n\t\t\t\t\tself.cursorControl.onStart();\n\t\t\t\tself.midiBuffer.start();\n\t\t\t\tself.timer.start(self.percent);\n\t\t\t\tif (self.control)\n\t\t\t\t\tself.control.pushPlay(true);\n\t\t\t} else {\n\t\t\t\tself.pause();\n\t\t\t}\n\t\t\treturn Promise.resolve({status: \"ok\"});\n\t\t})\n\t};\n\n\tself.pause = function() {\n\t\tif (self.timer) {\n\t\t\tself.timer.pause();\n\t\t\tself.midiBuffer.pause();\n\t\t\tif (self.control)\n\t\t\t\tself.control.pushPlay(false);\n\t\t}\n\t};\n\n\tself.toggleLoop = function () {\n\t\tself.isLooping = !self.isLooping;\n\t\tif (self.control)\n\t\t\tself.control.pushLoop(self.isLooping);\n\t};\n\n\tself.restart = function () {\n\t\tif (self.timer) {\n\t\t\tself.timer.setProgress(0);\n\t\t\tself.midiBuffer.seek(0);\n\t\t}\n\t};\n\n\tself.randomAccess = function (ev) {\n\t\treturn self.runWhenReady(self._randomAccess, ev);\n\t};\n\n\tself._randomAccess = function (ev) {\n\t\tvar background = (ev.target.classList.contains('abcjs-midi-progress-indicator')) ? ev.target.parentNode : ev.target;\n\t\tvar percent = (ev.x - background.getBoundingClientRect().left) / background.offsetWidth;\n\t\tif (percent < 0)\n\t\t\tpercent = 0;\n\t\tif (percent > 1)\n\t\t\tpercent = 1;\n\t\tself.seek(percent);\n\t\treturn Promise.resolve({status: \"ok\"});\n\t};\n\n\tself.seek = function (percent, units) {\n\t\tif (self.timer && self.midiBuffer) {\n\t\t\tself.timer.setProgress(percent, units);\n\t\t\tself.midiBuffer.seek(percent, units);\n\t\t}\n\t};\n\n\tself.setWarp = function (newWarp) {\n\t\tif (parseInt(newWarp, 10) > 0) {\n\t\t\tself.warp = parseInt(newWarp, 10);\n\t\t\tvar wasPlaying = self.isStarted;\n\t\t\tvar startPercent = self.percent;\n\t\t\tself.destroy();\n\t\t\tself.isStarted = false;\n\t\t\treturn self.go().then(function () {\n\t\t\t\tself.setProgress(startPercent, self.midiBuffer.duration * 1000);\n\t\t\t\tif (self.control)\n\t\t\t\t\tself.control.setWarp(self.currentTempo, self.warp);\n\t\t\t\tif (wasPlaying) {\n\t\t\t\t\treturn self.play().then(function () {\n\t\t\t\t\t\tself.seek(startPercent);\n\t\t\t\t\t\treturn Promise.resolve();\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tself.seek(startPercent);\n\t\t\t\treturn Promise.resolve();\n\t\t\t});\n\t\t}\n\t\treturn Promise.resolve();\n\t};\n\n\tself.onWarp = function (ev) {\n\t\tvar newWarp = ev.target.value;\n\t\treturn self.setWarp(newWarp);\n\t};\n\n\tself.setProgress = function (percent, totalTime) {\n\t\tself.percent = percent;\n\t\tif (self.control)\n\t\t\tself.control.setProgress(percent, totalTime);\n\t};\n\n\tself.finished = function () {\n\t\tself.timer.reset();\n\t\tif (self.isLooping) {\n\t\t\tself.timer.start(0);\n\t\t\tself.midiBuffer.finished();\n\t\t\tself.midiBuffer.start();\n\t\t\treturn \"continue\";\n\t\t} else {\n\t\t\tself.timer.stop();\n\t\t\tif (self.isStarted) {\n\t\t\t\tif (self.control)\n\t\t\t\t\tself.control.pushPlay(false);\n\t\t\t\tself.isStarted = false;\n\t\t\t\tself.midiBuffer.finished();\n\t\t\t\tif (self.cursorControl && self.cursorControl.onFinished && typeof self.cursorControl.onFinished === 'function')\n\t\t\t\t\tself.cursorControl.onFinished();\n\t\t\t\tself.setProgress(0, 1);\n\t\t\t}\n\t\t}\n\t};\n\n\tself.beatCallback = function (beatNumber, totalBeats, totalTime, position) {\n\t\tvar percent = beatNumber / totalBeats;\n\t\tself.setProgress(percent, totalTime);\n\t\tif (self.cursorControl && self.cursorControl.onBeat && typeof self.cursorControl.onBeat === 'function')\n\t\t\tself.cursorControl.onBeat(beatNumber, totalBeats, totalTime, position);\n\t};\n\n\tself.eventCallback = function (event) {\n\t\tif (event) {\n\t\t\tif (self.cursorControl && self.cursorControl.onEvent && typeof self.cursorControl.onEvent === 'function')\n\t\t\t\tself.cursorControl.onEvent(event);\n\t\t} else {\n\t\t\treturn self.finished();\n\t\t}\n\t};\n\n\tself.lineEndCallback = function (lineEvent, leftEvent) {\n\t\tif (self.cursorControl && self.cursorControl.onLineEnd && typeof self.cursorControl.onLineEnd === 'function')\n\t\t\tself.cursorControl.onLineEnd(lineEvent, leftEvent);\n\t};\n\n\tself.getUrl = function () {\n\t\treturn self.midiBuffer.download();\n\t};\n\n\tself.download = function(fileName) {\n\t\tvar url = self.getUrl();\n\t\tvar link = document.createElement('a');\n\t\tdocument.body.appendChild(link);\n\t\tlink.setAttribute(\"style\",\"display: none;\");\n\t\tlink.href = url;\n\t\tlink.download = fileName ? fileName : 'output.wav';\n\t\tlink.click();\n\t\twindow.URL.revokeObjectURL(url);\n\t\tdocument.body.removeChild(link);\n\t};\n}\n\nmodule.exports = SynthController;\n","// abc_midi_renderer.js: Create the actual format for the midi.\n\nvar centsToFactor = require(\"./cents-to-factor\");\nvar rendererFactory;\n\n(function() {\n\t\"use strict\";\n\tfunction setAttributes(elm, attrs) {\n\t\tfor (var attr in attrs)\n\t\t\tif (attrs.hasOwnProperty(attr))\n\t\t\t\telm.setAttribute(attr, attrs[attr]);\n\t\treturn elm;\n\t}\n\n\tfunction Midi() {\n\t\tthis.trackstrings = \"\";\n\t\tthis.trackcount = 0;\n\t\tthis.noteOnAndChannel = \"%90\";\n\t\tthis.noteOffAndChannel = \"%80\";\n\t}\n\n\tMidi.prototype.setTempo = function(qpm) {\n\t\tif (this.trackcount === 0) {\n\t\t\tthis.startTrack();\n\t\t\tthis.track += \"%00%FF%51%03\" + toHex(Math.round(60000000 / qpm), 6);\n\t\t\tthis.endTrack();\n\t\t}\n\t};\n\n\tMidi.prototype.setGlobalInfo = function(qpm, name, key, time) {\n\t\tif (this.trackcount === 0) {\n\t\t\tthis.startTrack();\n\t\t\tvar divisions = Math.round(60000000 / qpm);\n\t\t\t// Add the tempo\n\t\t\tthis.track += \"%00%FF%51%03\" + toHex(divisions, 6);\n\n\t\t\tif (key)\n\t\t\t\tthis.track += keySignature(key);\n\t\t\tif (time)\n\t\t\t\tthis.track += timeSignature(time);\n\t\t\tif (name) {\n\t\t\t\tthis.track += encodeString(name, \"%01\");\n\t\t\t}\n\t\t\tthis.endTrack();\n\t\t}\n\t};\n\n\tMidi.prototype.startTrack = function() {\n\t\tthis.noteWarped = {};\n\t\tthis.track = \"\";\n\t\tthis.trackName = \"\";\n\t\tthis.trackInstrument = \"\";\n\t\tthis.silencelength = 0;\n\t\tthis.trackcount++;\n\t\tif (this.instrument) {\n\t\t\tthis.setInstrument(this.instrument);\n\t\t}\n\t};\n\n\tMidi.prototype.endTrack = function() {\n\t\tthis.track = this.trackName + this.trackInstrument + this.track;\n\t\tvar tracklength = toHex(this.track.length / 3 + 4, 8);\n\t\tthis.track = \"MTrk\" + tracklength + // track header\n\t\t\tthis.track +\n\t\t\t'%00%FF%2F%00'; // track end\n\t\tthis.trackstrings += this.track;\n\t};\n\n\tMidi.prototype.setText = function(type, text) {\n\t\t// MIDI defines the following types of events:\n\t\t//FF 01 len text Text Event\n\t\t//FF 02 len text Copyright Notice\n\t\t//FF 03 len text Sequence/Track Name\n\t\t//FF 04 len text Instrument Name\n\t\t//FF 05 len text Lyric\n\t\t//FF 06 len text Marker\n\t\t//FF 07 len text Cue Point\n\t\tswitch(type) {\n\t\t\tcase 'name':\n\t\t\t\tthis.trackName = encodeString(text, \"%03\");\n\t\t\t\tbreak;\n\t\t}\n\t};\n\n\tMidi.prototype.setInstrument = function(number) {\n\t\tthis.trackInstrument = \"%00%C0\" + toHex(number, 2);\n\t\tthis.instrument = number;\n\t};\n\n\tMidi.prototype.setChannel = function(number, pan) {\n\t\tthis.channel = number;\n\t\tvar ccPrefix = \"%00%B\" + this.channel.toString(16);\n\t\t// Reset midi, in case it was set previously.\n\t\tthis.track += ccPrefix + \"%79%00\"; // Reset All Controllers\n\t\tthis.track += ccPrefix + \"%40%00\"; // Damper pedal\n\t\tthis.track += ccPrefix + \"%5B%30\"; // Effect 1 Depth (reverb)\n\t\t// Translate pan as -1 to 1 to 0 to 127\n\t\tif (!pan)\n\t\t\tpan = 0;\n\t\tpan = Math.round((pan + 1) * 64);\n\t\tthis.track += ccPrefix + \"%0A\" + toHex(pan, 2); // Pan\n\t\tthis.track += ccPrefix + \"%07%64\"; // Channel Volume\n\n\t\tthis.noteOnAndChannel = \"%9\" + this.channel.toString(16);\n\t\tthis.noteOffAndChannel = \"%8\" + this.channel.toString(16);\n\t};\n\n\tvar HALF_STEP = 4096; // For the pitch wheel - (i.e. the distance from C to C#)\n\tMidi.prototype.startNote = function(pitch, loudness, cents) {\n\t\tthis.track += toDurationHex(this.silencelength); // only need to shift by amount of silence (if there is any)\n\t\tthis.silencelength = 0;\n\t\tif (cents) {\n\t\t\t// the pitch is altered so send a midi pitch wheel event\n\t\t\tthis.track += \"%e\" + this.channel.toString(16);\n\t\t\tvar bend = Math.round(centsToFactor(cents)*HALF_STEP);\n\t\t\tthis.track += to7BitHex(0x2000 + bend);\n\t\t\tthis.track += toDurationHex(0); // this all happens at once so there is a zero length here\n\t\t\tthis.noteWarped[pitch] = true;\n\t\t}\n\t\tthis.track += this.noteOnAndChannel;\n\t\tthis.track += \"%\" + pitch.toString(16) + toHex(loudness, 2); //note\n\t};\n\n\tMidi.prototype.endNote = function(pitch) {\n\t\tthis.track += toDurationHex(this.silencelength); // only need to shift by amount of silence (if there is any)\n\t\tthis.silencelength = 0;\n\t\tif (this.noteWarped[pitch]) {\n\t\t\t// the pitch was altered so alter it back.\n\t\t\tthis.track += \"%e\" + this.channel.toString(16);\n\t\t\tthis.track += to7BitHex(0x2000);\n\t\t\tthis.track += toDurationHex(0); // this all happens at once so there is a zero length here\n\t\t\tthis.noteWarped[pitch] = false;\n\t\t}\n\t\tthis.track += this.noteOffAndChannel;\n\t\tthis.track += \"%\" + pitch.toString(16) + \"%00\";//end note\n\t};\n\n\tMidi.prototype.addRest = function(length) {\n\t\tthis.silencelength += length;\n\t\tif (this.silencelength < 0)\n\t\t\tthis.silencelength = 0;\n\t};\n\n\tMidi.prototype.getData = function() {\n\t\treturn \"data:audio/midi,\" +\n\t\t\t\"MThd%00%00%00%06%00%01\" + toHex(this.trackcount, 4) + \"%01%e0\" + // header\n\t\t\tthis.trackstrings;\n\t};\n\n\tMidi.prototype.embed = function(parent, noplayer) {\n\n\t\tvar data = this.getData();\n\n\t\tvar link = setAttributes(document.createElement('a'), {\n\t\t\thref: data\n\t\t});\n\t\tlink.innerHTML = \"download midi\";\n\t\tparent.insertBefore(link, parent.firstChild);\n\n\t\tif (noplayer) return;\n\n\t\tvar embed = setAttributes(document.createElement('embed'), {\n\t\t\tsrc: data,\n\t\t\ttype: 'video/quicktime',\n\t\t\tcontroller: 'true',\n\t\t\tautoplay: 'false',\n\t\t\tloop: 'false',\n\t\t\tenablejavascript: 'true',\n\t\t\tstyle: 'display:block; height: 20px;'\n\t\t});\n\t\tparent.insertBefore(embed, parent.firstChild);\n\t};\n\n\tfunction encodeString(str, cmdType) {\n\t\t// If there are multi-byte chars, we don't know how long the string will be until we create it.\n\t\tvar nameArray = \"\";\n\t\tfor (var i = 0; i < str.length; i++)\n\t\t\tnameArray += toHex(str.charCodeAt(i), 2);\n\t\treturn \"%00%FF\" + cmdType + toHex(nameArray.length/3, 2) + nameArray; // Each byte is represented by three chars \"%XX\", so divide by 3 to get the length.\n\t}\n\n\tfunction keySignature(key) {\n\t\t//00 FF 5902 03 00 - key signature\n\t\tif (!key || !key.accidentals)\n\t\t\treturn \"\";\n\t\tvar hex = \"%00%FF%59%02\";\n\t\tvar sharpCount = 0;\n\t\tvar flatCount = 256;\n\t\tfor (var i = 0; i < key.accidentals.length; i++) {\n\t\t\tif (key.accidentals[i].acc === \"sharp\") sharpCount++;\n\t\t\telse if (key.accidentals[i].acc === \"flat\") flatCount--;\n\t\t}\n\t\tvar sig = flatCount !== 256 ? toHex(flatCount, 2) : toHex(sharpCount, 2);\n\t\tvar mode = (key.mode === \"m\") ? \"%01\" : \"%00\";\n\t\treturn hex + sig + mode;\n\t}\n\n\tfunction timeSignature(time) {\n\t\t//00 FF 58 04 04 02 30 08 - time signature\n\t\tvar hex = \"%00%FF%58%04\" + toHex(time.num,2);\n\t\tvar dens = { 1: 0, 2: 1, 4: 2, 8: 3, 16: 4, 32: 5 };\n\t\tvar den = dens[time.den];\n\t\tif (!den)\n\t\t\treturn \"\"; // the denominator is not supported, so just don't include this.\n\t\thex += toHex(den, 2);\n\n\t\tvar clocks;\n\t\tswitch (time.num+\"/\"+time.den) {\n\t\t\tcase \"2/4\":\n\t\t\tcase \"3/4\":\n\t\t\tcase \"4/4\":\n\t\t\tcase \"5/4\":\n\t\t\t\tclocks = 24;\n\t\t\t\tbreak;\n\t\t\tcase \"6/4\":\n\t\t\t\tclocks = 72;\n\t\t\t\tbreak;\n\t\t\tcase \"2/2\":\n\t\t\tcase \"3/2\":\n\t\t\tcase \"4/2\":\n\t\t\t\tclocks = 48;\n\t\t\t\tbreak;\n\t\t\tcase \"3/8\":\n\t\t\tcase \"6/8\":\n\t\t\tcase \"9/8\":\n\t\t\tcase \"12/8\":\n\t\t\t\tclocks = 36;\n\t\t\t\tbreak;\n\t\t}\n\t\tif (!clocks)\n\t\t\treturn \"\"; // time sig is not supported.\n\t\thex += toHex(clocks, 2);\n\t\treturn hex + \"%08\";\n\t}\n\n\t// s is assumed to be of even length\n\tfunction encodeHex(s) {\n\t\tvar ret = \"\";\n\t\tfor (var i = 0; i < s.length; i += 2) {\n\t\t\tret += \"%\";\n\t\t\tret += s.substr(i, 2);\n\t\t}\n\t\treturn ret;\n\t}\n\n\tfunction toHex(n, padding) {\n\t\tvar s = n.toString(16);\n\t\ts = s.split(\".\")[0];\n\t\twhile (s.length < padding) {\n\t\t\ts = \"0\" + s;\n\t\t}\n\t\tif (s.length > padding)\n\t\t\ts = s.substring(0,padding)\n\t\treturn encodeHex(s);\n\t}\n\n\tfunction to7BitHex(n) {\n\t\t// this takes a number and shifts all digits from the 7th one to the left.\n\t\tn = Math.round(n);\n\t\tvar lower = n % 128;\n\t\tvar higher = n - lower;\n\t\treturn toHex(higher*2+lower, 4);\n\t}\n\n\tfunction toDurationHex(n) {\n\t\tvar res = 0;\n\t\tvar a = [];\n\n\t\t// cut up into 7 bit chunks;\n\t\tn = Math.round(n);\n\t\twhile (n !== 0) {\n\t\t\ta.push(n & 0x7F);\n\t\t\tn = n >> 7;\n\t\t}\n\n\t\t// join the 7 bit chunks together, all but last chunk get leading 1\n\t\tfor (var i = a.length - 1; i >= 0; i--) {\n\t\t\tres = res << 8;\n\t\t\tvar bits = a[i];\n\t\t\tif (i !== 0) {\n\t\t\t\tbits = bits | 0x80;\n\t\t\t}\n\t\t\tres = res | bits;\n\t\t}\n\n\t\tvar padding = res.toString(16).length;\n\t\tpadding += padding % 2;\n\n\t\treturn toHex(res, padding);\n\t}\n\n\trendererFactory = function() {\n\t\treturn new Midi();\n\t};\n})();\n\nmodule.exports = rendererFactory;\n","// abc_midi_create.js: Turn a linear series of events into a midi file.\n\nvar rendererFactory = require('../synth/abc_midi_renderer');\n\nvar create;\n\n(function() {\n\t\"use strict\";\n\n\tvar baseDuration = 480*4; // nice and divisible, equals 1 whole note\n\n\tcreate = function create(abcTune, options) {\n\t\tif (options === undefined) options = {};\n\t\tvar commands = abcTune.setUpAudio(options);\n\t\tvar midi = rendererFactory();\n\t\tvar title = abcTune.metaText ? abcTune.metaText.title : undefined;\n\t\tif (title && title.length > 128) title = title.substring(0, 124) + '...';\n\t\tvar key = abcTune.getKeySignature();\n\t\tvar time = abcTune.getMeterFraction();\n\n\t\t// MAE 7 July 2024 - Fix for */8 meter tempos\n\t\tvar tempo = commands.tempo;\n\n\t\tvar beatsPerSecond = tempo / 60;\n\n\t\t// Fix tempo for */8 meters\n\t\tif (time.den == 8){\n\n\t\t\t// Compute the tempo based on the actual milliseconds per measure, scaled by the number of eight notes and halved to get tempo in bpm.\n\t\t\tvar msPerMeasure = abcTune.millisecondsPerMeasure();\n\t\t\t\n\t\t\ttempo = (60000 / (msPerMeasure/time.num)) / 2;\n\t\t\t\n\t\t\tbeatsPerSecond = tempo/60;\n\n\t\t}\n\n\t\t//var beatLength = abcTune.getBeatLength();\n\t\tmidi.setGlobalInfo(tempo, title, key, time);\n\t\t\n\t\tfor (var i = 0; i < commands.tracks.length; i++) {\n\t\t\tmidi.startTrack();\n\t\t\tvar notePlacement = {};\n\t\t\tfor (var j = 0; j < commands.tracks[i].length; j++) {\n\t\t\t\tvar event = commands.tracks[i][j];\n\t\t\t\tswitch (event.cmd) {\n\t\t\t\t\tcase 'text':\n\t\t\t\t\t\tmidi.setText(event.type, event.text);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'program':\n\t\t\t\t\t\tvar pan = 0;\n\t\t\t\t\t\tif (options.pan && options.pan.length > i)\n\t\t\t\t\t\t\tpan = options.pan[i];\n\t\t\t\t\t\tif (event.instrument === 128) {\n\t\t\t\t\t\t\t// If we're using the percussion voice, change to Channel 10\n\t\t\t\t\t\t\tmidi.setChannel(9, pan);\n\t\t\t\t\t\t\tmidi.setInstrument(0);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tmidi.setChannel(event.channel, pan);\n\t\t\t\t\t\t\tmidi.setInstrument(event.instrument);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'note':\n\t\t\t\t\t\tvar gapLengthInBeats = event.gap * beatsPerSecond;\n\t\t\t\t\t\tvar start = event.start;\n\t\t\t\t\t\t// The staccato and legato are indicated by event.gap.\n\t\t\t\t\t\t// event.gap is in seconds but the durations are in whole notes.\n\t\t\t\t\t\tvar end = start + event.duration - gapLengthInBeats;\n\t\t\t\t\t\tif (!notePlacement[start])\n\t\t\t\t\t\t\tnotePlacement[start] = [];\n\t\t\t\t\t\tnotePlacement[start].push({ pitch: event.pitch, volume: event.volume, cents: event.cents });\n\t\t\t\t\t\tif (!notePlacement[end])\n\t\t\t\t\t\t\tnotePlacement[end] = [];\n\t\t\t\t\t\tnotePlacement[end].push({ pitch: event.pitch, volume: 0 });\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tconsole.log(\"MIDI create Unknown: \" + event.cmd);\n\t\t\t\t}\n\t\t\t}\n\t\t\taddNotes(midi, notePlacement, baseDuration);\n\t\t\tmidi.endTrack();\n\t\t}\n\n\t\treturn midi.getData();\n\t};\n\n\tfunction addNotes(midi, notePlacement, baseDuration) {\n\t\tvar times = Object.keys(notePlacement);\n\t\tfor (var h = 0; h < times.length; h++)\n\t\t\ttimes[h] = parseFloat(times[h]);\n\t\ttimes.sort(function(a,b) {\n\t\t\treturn a - b;\n\t\t});\n\t\tvar lastTime = 0;\n\t\tfor (var i = 0; i < times.length; i++) {\n\t\t\tvar events = notePlacement[times[i]];\n\t\t\tif (times[i] > lastTime) {\n\t\t\t\tvar distance = (times[i] - lastTime) * baseDuration;\n\t\t\t\tmidi.addRest(distance);\n\t\t\t\tlastTime = times[i];\n\t\t\t}\n\t\t\tfor (var j = 0; j < events.length; j++) {\n\t\t\t\tvar event = events[j];\n\t\t\t\tif (event.volume) {\n\t\t\t\t\tmidi.startNote(event.pitch, event.volume, event.cents);\n\t\t\t\t} else {\n\t\t\t\t\tmidi.endNote(event.pitch);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n})();\n\nmodule.exports = create;\n","var tunebook = require('../api/abc_tunebook');\nvar midiCreate = require('../midi/abc_midi_create');\n\nvar getMidiFile = function(source, options) {\n\tvar params = {};\n\tif (options) {\n\t\tfor (var key in options) {\n\t\t\tif (options.hasOwnProperty(key)) {\n\t\t\t\tparams[key] = options[key];\n\t\t\t}\n\t\t}\n\t}\n\tparams.generateInline = false;\n\n\tfunction callback(div, tune, index) {\n\t\tvar downloadMidi = midiCreate(tune, params);\n\t\tswitch (params.midiOutputType) {\n\t\t\tcase \"encoded\":\n\t\t\t\treturn downloadMidi;\n\t\t\tcase \"binary\":\n\t\t\t\tvar decoded = downloadMidi.replace(\"data:audio/midi,\", \"\");\n\t\t\t\tdecoded = decoded.replace(/MThd/g,\"%4d%54%68%64\");\n\t\t\t\tdecoded = decoded.replace(/MTrk/g,\"%4d%54%72%6b\");\n\t\t\t\tvar buffer = new ArrayBuffer(decoded.length/3);\n\t\t\t\tvar output = new Uint8Array(buffer);\n\t\t\t\tfor (var i = 0; i < decoded.length/3; i++) {\n\t\t\t\t\tvar p = i*3+1;\n\t\t\t\t\tvar d = parseInt(decoded.substring(p, p+2), 16);\n\t\t\t\t\toutput[i] = d;\n\t\t\t\t}\n\t\t\t\treturn output;\n\t\t\tcase \"link\":\n\t\t\tdefault:\n\t\t\t\treturn generateMidiDownloadLink(tune, params, downloadMidi, index);\n\t\t}\n\t}\n\n\tif (typeof source === \"string\")\n\t\treturn tunebook.renderEngine(callback, \"*\", source, params);\n\telse\n\t\treturn callback(null, source, 0);\n};\n\nfunction isFunction(functionToCheck) {\n\tvar getType = {};\n\treturn functionToCheck && getType.toString.call(functionToCheck) === '[object Function]';\n}\n\nvar generateMidiDownloadLink = function(tune, midiParams, midi, index) {\n\tvar divClasses = ['abcjs-download-midi', 'abcjs-midi-' + index]\n\tif (midiParams.downloadClass)\n\t\tdivClasses.push(midiParams.downloadClass)\n\tvar html = '<div class=\"' + divClasses.join(' ') + '\">';\n\tif (midiParams.preTextDownload)\n\t\thtml += midiParams.preTextDownload;\n\tvar title = tune.metaText && tune.metaText.title ? tune.metaText.title : 'Untitled';\n\tvar label;\n\tif (midiParams.downloadLabel && isFunction(midiParams.downloadLabel))\n\t\tlabel = midiParams.downloadLabel(tune, index);\n\telse if (midiParams.downloadLabel)\n\t\tlabel = midiParams.downloadLabel.replace(/%T/, title);\n\telse\n\t\tlabel = \"Download MIDI for \\\"\" + title + \"\\\"\";\n\ttitle = title.toLowerCase().replace(/'/g, '').replace(/\\W/g, '_').replace(/__/g, '_');\n\tvar filename = (midiParams.fileName) ? midiParams.fileName : title + '.midi';\n\thtml += '<a download=\"' + filename + '\" href=\"' + midi + '\">' + label + '</a>';\n\tif (midiParams.postTextDownload)\n\t\thtml += midiParams.postTextDownload;\n\treturn html + \"</div>\";\n};\n\n\nmodule.exports = getMidiFile;\n","// abc_editor.js\n\n// window.ABCJS.Editor is the interface class for the area that contains the ABC text. It is responsible for\n// holding the text of the tune and calling the parser and the rendering engines.\n//\n// EditArea is an example of using a textarea as the control that is shown to the user. As long as\n// the same interface is used, window.ABCJS.Editor can use a different type of object.\n//\n// EditArea:\n// - constructor(textareaid)\n//\t\tThis contains the id of a textarea control that will be used.\n// - addSelectionListener(listener)\n//\t\tA callback class that contains the entry point fireSelectionChanged()\n// - addChangeListener(listener)\n//\t\tA callback class that contains the entry point fireChanged()\n// - getSelection()\n//\t\treturns the object { start: , end: } with the current selection in characters\n// - setSelection(start, end)\n//\t\tstart and end are the character positions that should be selected.\n// - getString()\n//\t\treturns the ABC text that is currently displayed.\n// - setString(str)\n//\t\tsets the ABC text that is currently displayed, and resets the initialText variable\n// - getElem()\n//\t\treturns the textarea element\n// - string initialText\n//\t\tContains the starting text. This can be compared against the current text to see if anything changed.\n//\n\n// Polyfill for CustomEvent for old IE versions\ntry {\n\tif (typeof window.CustomEvent !== \"function\") {\n\t\tvar CustomEvent = function (event, params) {\n\t\t\tparams = params || {bubbles: false, cancelable: false, detail: undefined};\n\t\t\tvar evt = document.createEvent('CustomEvent');\n\t\t\tevt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);\n\t\t\treturn evt;\n\t\t};\n\t\tCustomEvent.prototype = window.Event.prototype;\n\t\twindow.CustomEvent = CustomEvent;\n\t}\n} catch (e) {\n\t// if we aren't in a browser, this code will crash, but it is not needed then either.\n}\n\nvar EditArea = function(textareaid) {\n if (typeof textareaid === \"string\")\n this.textarea = document.getElementById(textareaid);\n else\n this.textarea = textareaid;\n this.initialText = this.textarea.value;\n this.isDragging = false;\n}\n\nEditArea.prototype.addSelectionListener = function(listener) {\n this.textarea.onmousemove = function(ev) {\n\t if (this.isDragging)\n\t listener.fireSelectionChanged();\n };\n};\n\nEditArea.prototype.addChangeListener = function(listener) {\n this.changelistener = listener;\n this.textarea.onkeyup = function() {\n listener.fireChanged();\n };\n this.textarea.onmousedown = function() {\n\tthis.isDragging = true;\n listener.fireSelectionChanged();\n };\n this.textarea.onmouseup = function() {\n\tthis.isDragging = false;\n listener.fireChanged();\n };\n this.textarea.onchange = function() {\n listener.fireChanged();\n };\n};\n\n//TODO won't work under IE?\nEditArea.prototype.getSelection = function() {\n return {start: this.textarea.selectionStart, end: this.textarea.selectionEnd};\n};\n\nEditArea.prototype.setSelection = function(start, end) {\n\tif(this.textarea.setSelectionRange)\n\t this.textarea.setSelectionRange(start, end);\n\telse if(this.textarea.createTextRange) {\n\t\t// For IE8\n\t var e = this.textarea.createTextRange();\n\t e.collapse(true);\n\t e.moveEnd('character', end);\n\t e.moveStart('character', start);\n\t e.select();\n\t}\n this.textarea.focus();\n};\n\nEditArea.prototype.getString = function() {\n return this.textarea.value;\n};\n\nEditArea.prototype.setString = function(str) {\n this.textarea.value = str;\n this.initialText = this.getString();\n if (this.changelistener) {\n this.changelistener.fireChanged();\n }\n};\n\nEditArea.prototype.getElem = function() {\n return this.textarea;\n};\n\nmodule.exports = EditArea;\n","// window.ABCJS.Editor:\n//\n// constructor(editarea, params)\n//\t\tif editarea is a string, then it is an HTML id of a textarea control.\n//\t\tOtherwise, it should be an instantiation of an object that expresses the EditArea interface.\n//\n//\t\tparams is a hash of:\n//\t\tcanvas_id: or paper_id: HTML id to draw in. If not present, then the drawing happens just below the editor.\n//\t\tgenerate_midi: if present, then midi is generated.\n//\t\tmidi_id: if present, the HTML id to place the midi control. Otherwise it is placed in the same div as the paper.\n//\t\tmidi_download_id: if present, the HTML id to place the midi download link. Otherwise it is placed in the same div as the paper.\n//\t\tgenerate_warnings: if present, then parser warnings are displayed on the page.\n//\t\twarnings_id: if present, the HTML id to place the warnings. Otherwise they are placed in the same div as the paper.\n//\t\tonchange: if present, the callback function to call whenever there has been a change.\n//\t\tgui: if present, the paper can send changes back to the editor (presumably because the user changed something directly.)\n//\t\tparser_options: options to send to the parser engine.\n//\t\tmidi_options: options to send to the midi engine.\n//\t\trender_options: options to send to the render engine.\n//\t\tindicate_changed: the dirty flag is set if this is true.\n//\n// - setReadOnly(bool)\n//\t\tadds or removes the class abc_textarea_readonly, and adds or removes the attribute readonly=yes\n// - setDirtyStyle(bool)\n//\t\tadds or removes the class abc_textarea_dirty\n// - modelChanged()\n//\t\tCalled when the model has been changed to trigger re-rendering\n// - parseABC()\n//\t\tCalled internally by fireChanged()\n//\t\treturns true if there has been a change since last call.\n// - updateSelection()\n//\t\tCalled when the user has changed the selection. This calls the engraver to show the selection.\n// - fireSelectionChanged()\n//\t\tCalled by the textarea object when the user has changed the selection.\n// - paramChanged(engraverparams)\n//\t\tCalled to signal that the engraver params have changed, so re-rendering should occur.\n// - fireChanged()\n//\t\tCalled by the textarea object when the user has changed something.\n// - setNotDirty()\n//\t\tCalled by the client app to reset the dirty flag\n// - isDirty()\n//\t\tReturns true or false, whether the textarea contains the same text that it started with.\n// - highlight(abcelem)\n//\t\tCalled by the engraver to highlight an area.\n// - pause(bool)\n//\t\tStops the automatic rendering when the user is typing.\n//\nvar parseCommon = require('../parse/abc_common');\nvar SynthController = require('../synth/synth-controller');\nvar supportsAudio = require('../synth/supports-audio');\nvar renderAbc = require('../api/abc_tunebook_svg');\nvar EditArea = require('./abc_editarea');\n\nfunction gatherAbcParams(params) {\n\t// There used to be a bunch of ways parameters can be passed in. This just simplifies it.\n\tvar abcjsParams = {};\n\tvar key;\n\tif (params.abcjsParams) {\n\t\tfor (key in params.abcjsParams) {\n\t\t\tif (params.abcjsParams.hasOwnProperty(key)) {\n\t\t\t\tabcjsParams[key] = params.abcjsParams[key];\n\t\t\t}\n\t\t}\n\t}\n\tif (params.midi_options) {\n\t\tfor (key in params.midi_options) {\n\t\t\tif (params.midi_options.hasOwnProperty(key)) {\n\t\t\t\tabcjsParams[key] = params.midi_options[key];\n\t\t\t}\n\t\t}\n\t}\n\tif (params.parser_options) {\n\t\tfor (key in params.parser_options) {\n\t\t\tif (params.parser_options.hasOwnProperty(key)) {\n\t\t\t\tabcjsParams[key] = params.parser_options[key];\n\t\t\t}\n\t\t}\n\t}\n\tif (params.render_options) {\n\t\tfor (key in params.render_options) {\n\t\t\tif (params.render_options.hasOwnProperty(key)) {\n\t\t\t\tabcjsParams[key] = params.render_options[key];\n\t\t\t}\n\t\t}\n\t}\n\t/*\n\tif (params.tablature_options) {\n\t\tabcjsParams['tablatures'] = params.tablature_options;\n\t}\n\t*/\n\tif (abcjsParams.tablature) {\n\t\tif (params.warnings_id) {\n\t\t\t// store for plugin error handling\n\t\t\tabcjsParams.tablature.warnings_id = params.warnings_id;\n\t\t}\n\t}\n\treturn abcjsParams;\n}\n\nvar Editor = function(editarea, params) {\n\t// Copy all the options that will be passed through\n\tthis.abcjsParams = gatherAbcParams(params);\n\n\tif (params.indicate_changed)\n\t\tthis.indicate_changed = true;\n if (typeof editarea === \"string\") {\n this.editarea = new EditArea(editarea);\n } else {\n this.editarea = editarea;\n }\n this.editarea.addSelectionListener(this);\n this.editarea.addChangeListener(this);\n\n if (params.canvas_id) {\n this.div = params.canvas_id;\n } else if (params.paper_id) {\n this.div = params.paper_id;\n } else {\n this.div = document.createElement(\"DIV\");\n this.editarea.getElem().parentNode.insertBefore(this.div, this.editarea.getElem());\n }\n if (typeof this.div === 'string')\n\t this.div = document.getElementById(this.div);\n\n if (params.selectionChangeCallback) {\n \tthis.selectionChangeCallback = params.selectionChangeCallback;\n }\n\n this.clientClickListener = this.abcjsParams.clickListener;\n this.abcjsParams.clickListener = this.highlight.bind(this);\n\n if (params.synth) {\n \tif (supportsAudio()) {\n\t this.synth = {\n\t\t el: params.synth.el,\n\t\t cursorControl: params.synth.cursorControl,\n\t\t options: params.synth.options\n\t };\n }\n }\n\t// If the user wants midi, then store the elements that it will be written to. The element could either be passed in as an id,\n\t// an element, or nothing. If nothing is passed in, then just put the midi on top of the generated music.\n\tif (params.generate_midi) {\n\t \tthis.generate_midi = params.generate_midi;\n\t\tif (this.abcjsParams.generateDownload) {\n\t\t\tif (typeof params.midi_download_id === 'string')\n\t\t\t\tthis.downloadMidi = document.getElementById(params.midi_download_id);\n\t\t\telse if (params.midi_download_id) // assume, if the var is not a string it is an element. If not, it will crash soon enough.\n\t\t\t\tthis.downloadMidi = params.midi_download_id;\n\t\t}\n\t\tif (this.abcjsParams.generateInline !== false) { // The default for this is true, so undefined is also true.\n\t\t\tif (typeof params.midi_id === 'string')\n\t\t\t\tthis.inlineMidi = document.getElementById(params.midi_id);\n\t\t\telse if (params.midi_id) // assume, if the var is not a string it is an element. If not, it will crash soon enough.\n\t\t\t\tthis.inlineMidi = params.midi_id;\n\t\t}\n\t}\n\n if (params.warnings_id) {\n \tif (typeof(params.warnings_id) === \"string\")\n this.warningsdiv = document.getElementById(params.warnings_id);\n \telse\n\t\tthis.warningsdiv = params.warnings_id;\n } else if (params.generate_warnings) {\n\t this.warningsdiv = document.createElement(\"div\");\n\t this.div.parentNode.insertBefore(this.warningsdiv, this.div);\n }\n\n this.onchangeCallback = params.onchange;\n\n this.currentAbc = \"\";\n this.tunes = [];\n this.bReentry = false;\n this.parseABC();\n this.modelChanged();\n\n this.addClassName = function(element, className) {\n var hasClassName = function(element, className) {\n var elementClassName = element.className;\n return (elementClassName.length > 0 && (elementClassName === className ||\n new RegExp(\"(^|\\\\s)\" + className + \"(\\\\s|$)\").test(elementClassName)));\n };\n\n if (!hasClassName(element, className))\n element.className += (element.className ? ' ' : '') + className;\n return element;\n };\n\n this.removeClassName = function(element, className) {\n element.className = parseCommon.strip(element.className.replace(\n new RegExp(\"(^|\\\\s+)\" + className + \"(\\\\s+|$)\"), ' '));\n return element;\n };\n\n this.setReadOnly = function(readOnly) {\n\t var readonlyClass = 'abc_textarea_readonly';\n\t var el = this.editarea.getElem();\n if (readOnly) {\n el.setAttribute('readonly', 'yes');\n\t this.addClassName(el, readonlyClass);\n\t} else {\n el.removeAttribute('readonly');\n\t this.removeClassName(el, readonlyClass);\n }\n };\n};\n\nEditor.prototype.redrawMidi = function() {\n\tif (this.generate_midi && !this.midiPause) {\n\t\tvar event = new window.CustomEvent(\"generateMidi\", {\n\t\t\tdetail: {\n\t\t\t\ttunes: this.tunes,\n\t\t\t\tabcjsParams: this.abcjsParams,\n\t\t\t\tdownloadMidiEl: this.downloadMidi,\n\t\t\t\tinlineMidiEl: this.inlineMidi,\n\t\t\t\tengravingEl: this.div\n\t\t\t}\n\t\t});\n\t\twindow.dispatchEvent(event);\n\t}\n\tif (this.synth) {\n\t\tvar userAction = this.synth.synthControl; // Can't really tell if there was a user action before drawing, but we assume that if the synthControl was created already there was a user action.\n\t\tif (!this.synth.synthControl) {\n\t\t\tthis.synth.synthControl = new SynthController();\n\t\t\tthis.synth.synthControl.load(this.synth.el, this.synth.cursorControl, this.synth.options);\n\t\t}\n\t\tthis.synth.synthControl.setTune(this.tunes[0], userAction, this.synth.options);\n\t}\n};\n\nEditor.prototype.modelChanged = function() {\n if (this.bReentry)\n return; // TODO is this likely? maybe, if we rewrite abc immediately w/ abc2abc\n\tthis.bReentry = true;\n\ttry {\n\t\tthis.timerId = null;\n\t\tif (this.synth && this.synth.synthControl)\n\t\t\tthis.synth.synthControl.disable(true);\n\n\t\tthis.tunes = renderAbc(this.div, this.currentAbc, this.abcjsParams);\n\t\tif (this.tunes.length > 0) {\n\t\t\tthis.warnings = this.tunes[0].warnings;\n\t\t}\n\t\tthis.redrawMidi();\n\t} catch(error) {\n\t\tconsole.error(\"ABCJS error: \", error);\n\t\tif (!this.warnings)\n\t\t\tthis.warnings = [];\n\t\tthis.warnings.push(error.message);\n\t}\n\n if (this.warningsdiv) {\n this.warningsdiv.innerHTML = (this.warnings) ? this.warnings.join(\"<br />\") : \"No errors\";\n }\n this.updateSelection();\n this.bReentry = false;\n};\n\n// Call this to reparse in response to the client changing the parameters on the fly\nEditor.prototype.paramChanged = function(engraverParams) {\n\tif (engraverParams) {\n\t\tfor (var key in engraverParams) {\n\t\t\tif (engraverParams.hasOwnProperty(key)) {\n\t\t\t\tthis.abcjsParams[key] = engraverParams[key];\n\t\t\t}\n\t\t}\n\t}\n\tthis.currentAbc = \"\";\n\tthis.fireChanged();\n};\n\nEditor.prototype.synthParamChanged = function(options) {\n\tif (!this.synth)\n\t\treturn;\n\tthis.synth.options = {};\n\tif (options) {\n\t\tfor (var key in options) {\n\t\t\tif (options.hasOwnProperty(key)) {\n\t\t\t\tthis.synth.options[key] = options[key];\n\t\t\t}\n\t\t}\n\t}\n\tthis.currentAbc = \"\";\n\tthis.fireChanged();\n};\n\n// return true if the model has changed\nEditor.prototype.parseABC = function() {\n var t = this.editarea.getString();\n if (t===this.currentAbc) {\n this.updateSelection();\n return false;\n }\n\n this.currentAbc = t;\n return true;\n};\n\nEditor.prototype.updateSelection = function() {\n var selection = this.editarea.getSelection();\n try {\n \tif (this.tunes.length > 0 && this.tunes[0].engraver)\n\t this.tunes[0].engraver.rangeHighlight(selection.start, selection.end);\n } catch (e) {} // maybe printer isn't defined yet?\n\tif (this.selectionChangeCallback)\n\t\tthis.selectionChangeCallback(selection.start, selection.end);\n};\n\n// Called when the textarea's selection is in the process of changing (after mouse down, dragging, or keyboard arrows)\nEditor.prototype.fireSelectionChanged = function() {\n this.updateSelection();\n};\n\nEditor.prototype.setDirtyStyle = function(isDirty) {\n\tif (this.indicate_changed === undefined)\n\t\treturn;\n var addClassName = function(element, className) {\n var hasClassName = function(element, className) {\n var elementClassName = element.className;\n return (elementClassName.length > 0 && (elementClassName === className ||\n new RegExp(\"(^|\\\\s)\" + className + \"(\\\\s|$)\").test(elementClassName)));\n };\n\n if (!hasClassName(element, className))\n element.className += (element.className ? ' ' : '') + className;\n return element;\n };\n\n var removeClassName = function(element, className) {\n element.className = parseCommon.strip(element.className.replace(\n new RegExp(\"(^|\\\\s+)\" + className + \"(\\\\s+|$)\"), ' '));\n return element;\n };\n\n\tvar readonlyClass = 'abc_textarea_dirty';\n\tvar el = this.editarea.getElem();\n\tif (isDirty) {\n\t\taddClassName(el, readonlyClass);\n\t} else {\n\t\tremoveClassName(el, readonlyClass);\n }\n};\n\n// call when the textarea alerts us that the abc text is changed and needs re-parsing\nEditor.prototype.fireChanged = function() {\n if (this.bIsPaused)\n return;\n if (this.parseABC()) {\n var self = this;\n if (this.timerId)\t// If the user is still typing, cancel the update\n clearTimeout(this.timerId);\n this.timerId = setTimeout(function () {\n self.modelChanged();\n }, 300);\t// Is this a good compromise between responsiveness and not redrawing too much?\n\t var isDirty = this.isDirty();\n\t if (this.wasDirty !== isDirty) {\n\t\t this.wasDirty = isDirty;\n\t\t this.setDirtyStyle(isDirty);\n\t }\n\t if (this.onchangeCallback)\n\t\t this.onchangeCallback(this);\n\t }\n};\n\nEditor.prototype.setNotDirty = function() {\n\tthis.editarea.initialText = this.editarea.getString();\n\tthis.wasDirty = false;\n\tthis.setDirtyStyle(false);\n};\n\nEditor.prototype.isDirty = function() {\n\tif (this.indicate_changed === undefined)\n\t\treturn false;\n\treturn this.editarea.initialText !== this.editarea.getString();\n};\n\nEditor.prototype.highlight = function(abcelem, tuneNumber, classes, analysis, drag, mouseEvent) {\n\t// TODO-PER: The marker appears to get off by one for each tune parsed. I'm not sure why, but adding the tuneNumber in corrects it for the time being.\n//\tvar offset = (tuneNumber !== undefined) ? this.startPos[tuneNumber] + tuneNumber : 0;\n\n this.editarea.setSelection(abcelem.startChar, abcelem.endChar);\n\tif (this.selectionChangeCallback)\n\t\tthis.selectionChangeCallback(abcelem.startChar, abcelem.endChar);\n\tif (this.clientClickListener)\n\t\tthis.clientClickListener(abcelem, tuneNumber, classes, analysis, drag, mouseEvent);\n};\n\nEditor.prototype.pause = function(shouldPause) {\n\tthis.bIsPaused = shouldPause;\n\tif (!shouldPause)\n\t\tthis.fireChanged();\n};\n\nEditor.prototype.millisecondsPerMeasure = function() {\n\tif (!this.synth || !this.synth.synthControl || !this.synth.synthControl.visualObj)\n\t\treturn 0;\n\treturn this.synth.synthControl.visualObj.millisecondsPerMeasure();\n};\n\nEditor.prototype.pauseMidi = function(shouldPause) {\n\tthis.midiPause = shouldPause;\n\tif (!shouldPause)\n\t\tthis.redrawMidi();\n};\n\nmodule.exports = Editor;\n","/**!\nCopyright (c) 2009-2024 Paul Rosen and Gregory Dyke\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n **This text is from: http://opensource.org/licenses/MIT**\n!**/\nvar version = require('./version');\nvar animation = require('./src/api/abc_animation');\nvar tuneBook = require('./src/api/abc_tunebook');\nvar sequence = require('./src/synth/abc_midi_sequencer');\nvar strTranspose = require('./src/str/output');\n\nvar abcjs = {};\n\nabcjs.signature = \"abcjs-basic v\" + version;\n\nObject.keys(animation).forEach(function (key) {\n\tabcjs[key] = animation[key];\n});\n\nObject.keys(tuneBook).forEach(function (key) {\n\tabcjs[key] = tuneBook[key];\n});\n\nabcjs.renderAbc = require('./src/api/abc_tunebook_svg');\nabcjs.tuneMetrics = require('./src/api/tune-metrics');\nabcjs.TimingCallbacks = require('./src/api/abc_timing_callbacks');\n\nvar glyphs = require('./src/write/creation/glyphs');\nabcjs.setGlyph = glyphs.setSymbol;\nabcjs.strTranspose = strTranspose;\n\nvar CreateSynth = require('./src/synth/create-synth');\nvar instrumentIndexToName = require('./src/synth/instrument-index-to-name');\nvar pitchToNoteName = require('./src/synth/pitch-to-note-name');\nvar SynthSequence = require('./src/synth/synth-sequence');\nvar CreateSynthControl = require('./src/synth/create-synth-control');\nvar registerAudioContext = require('./src/synth/register-audio-context');\nvar activeAudioContext = require('./src/synth/active-audio-context');\nvar supportsAudio = require('./src/synth/supports-audio');\nvar playEvent = require('./src/synth/play-event');\nvar SynthController = require('./src/synth/synth-controller');\nvar getMidiFile = require('./src/synth/get-midi-file');\nvar midiRenderer = require('./src/synth/abc_midi_renderer');\n\nabcjs.synth = {\n\tCreateSynth: CreateSynth,\n\tinstrumentIndexToName: instrumentIndexToName,\n\tpitchToNoteName: pitchToNoteName,\n\tSynthController: SynthController,\n\tSynthSequence: SynthSequence,\n\tCreateSynthControl: CreateSynthControl,\n\tregisterAudioContext: registerAudioContext,\n\tactiveAudioContext: activeAudioContext,\n\tsupportsAudio: supportsAudio,\n\tplayEvent: playEvent,\n\tgetMidiFile: getMidiFile,\n\tsequence: sequence,\n\tmidiRenderer: midiRenderer,\n};\n\nabcjs['Editor'] = require('./src/edit/abc_editor');\nabcjs['EditArea'] = require('./src/edit/abc_editarea');\n\nmodule.exports = abcjs;\n","<template>\n <div id=\"abc\"></div>\n</template>\n\n<script lang=\"ts\">\nimport abc from 'abcjs';\nimport { defineComponent } from 'vue';\n\nexport default defineComponent({\n name: 'MusicScoreRenderer',\n\n props: {\n abcString: {\n type: String,\n required: true\n }\n },\n\n mounted() {\n abc.renderAbc('abc', this.abcString);\n }\n});\n</script>\n\n<style>\n#abc {\n width: 100%;\n height: 100%;\n}\n</style>\n","<template>\n <div id=\"abc\"></div>\n</template>\n\n<script lang=\"ts\">\nimport abc from 'abcjs';\nimport { defineComponent } from 'vue';\n\nexport default defineComponent({\n name: 'MusicScoreRenderer',\n\n props: {\n abcString: {\n type: String,\n required: true\n }\n },\n\n mounted() {\n abc.renderAbc('abc', this.abcString);\n }\n});\n</script>\n\n<style>\n#abc {\n width: 100%;\n height: 100%;\n}\n</style>\n","<template>\n <div data-viewable=\"IdentifyKeyView\">\n <template v-if=\"question\">\n <MusicScoreRenderer :key-signature=\"`X:1\\nK:${question.key}\\n||`\" abc-string=\"''\" />\n This signature is for the major key: _____\n <RadioMultipleChoice :choice-list=\"choices\" />\n </template>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, ref, computed, PropType } from 'vue';\nimport MusicScoreRenderer from '@courseware/components/MusicScoreRender.vue';\nimport { RadioMultipleChoice, useViewable, useQuestionView } from '@vue-skuilder/common-ui';\nimport { ViewData } from '@vue-skuilder/common';\nimport { IdentifyKeyQuestion, keys } from './index';\n\nfunction fiveRandomKeys() {\n const randomKeys = [];\n for (let i = 0; i < 5; i++) {\n randomKeys.push(keys[Math.floor(Math.random() * keys.length)]);\n }\n return randomKeys;\n}\n\nexport default defineComponent({\n name: 'IdentifyKeyView',\n\n components: {\n RadioMultipleChoice,\n MusicScoreRenderer,\n },\n\n props: {\n data: {\n type: Array as PropType<ViewData[]>,\n required: true,\n },\n modifyDifficulty: {\n type: Number,\n required: false,\n default: 0,\n },\n },\n\n setup(props, { emit }) {\n const viewableUtils = useViewable(props, emit, 'IdentifyKeyView');\n const questionUtils = useQuestionView<IdentifyKeyQuestion>(viewableUtils);\n\n const answer = ref('');\n\n // Initialize question immediately\n questionUtils.question.value = new IdentifyKeyQuestion(props.data);\n\n // Expose the question directly for template access\n const question = computed(() => questionUtils.question.value);\n\n const choices = computed(() => {\n const ch = fiveRandomKeys();\n if (ch.includes(question.value?.key || '')) {\n return ch;\n } else {\n ch[Math.floor(Math.random() * ch.length)] = question.value?.key || '';\n return ch;\n }\n });\n\n const submit = () => {};\n\n return {\n ...viewableUtils,\n ...questionUtils,\n answer,\n question,\n choices,\n submit,\n };\n },\n});\n</script>\n","<template>\n <div data-viewable=\"IdentifyKeyView\">\n <template v-if=\"question\">\n <MusicScoreRenderer :key-signature=\"`X:1\\nK:${question.key}\\n||`\" abc-string=\"''\" />\n This signature is for the major key: _____\n <RadioMultipleChoice :choice-list=\"choices\" />\n </template>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, ref, computed, PropType } from 'vue';\nimport MusicScoreRenderer from '@courseware/components/MusicScoreRender.vue';\nimport { RadioMultipleChoice, useViewable, useQuestionView } from '@vue-skuilder/common-ui';\nimport { ViewData } from '@vue-skuilder/common';\nimport { IdentifyKeyQuestion, keys } from './index';\n\nfunction fiveRandomKeys() {\n const randomKeys = [];\n for (let i = 0; i < 5; i++) {\n randomKeys.push(keys[Math.floor(Math.random() * keys.length)]);\n }\n return randomKeys;\n}\n\nexport default defineComponent({\n name: 'IdentifyKeyView',\n\n components: {\n RadioMultipleChoice,\n MusicScoreRenderer,\n },\n\n props: {\n data: {\n type: Array as PropType<ViewData[]>,\n required: true,\n },\n modifyDifficulty: {\n type: Number,\n required: false,\n default: 0,\n },\n },\n\n setup(props, { emit }) {\n const viewableUtils = useViewable(props, emit, 'IdentifyKeyView');\n const questionUtils = useQuestionView<IdentifyKeyQuestion>(viewableUtils);\n\n const answer = ref('');\n\n // Initialize question immediately\n questionUtils.question.value = new IdentifyKeyQuestion(props.data);\n\n // Expose the question directly for template access\n const question = computed(() => questionUtils.question.value);\n\n const choices = computed(() => {\n const ch = fiveRandomKeys();\n if (ch.includes(question.value?.key || '')) {\n return ch;\n } else {\n ch[Math.floor(Math.random() * ch.length)] = question.value?.key || '';\n return ch;\n }\n });\n\n const submit = () => {};\n\n return {\n ...viewableUtils,\n ...questionUtils,\n answer,\n question,\n choices,\n submit,\n };\n },\n});\n</script>\n","import { Question } from '@vue-skuilder/common-ui';\nimport {\n ViewData,\n DataShapeName,\n FieldType,\n Status,\n RadioMultipleChoiceAnswer,\n} from '@vue-skuilder/common';\nimport IdentifyKeyView from './IdentifyKey.vue';\n\n/**\n * The 15 sane keys in music theory.\n */\nexport const keys = [\n 'C',\n 'G',\n 'D',\n 'A',\n 'E',\n 'B',\n 'F#',\n 'C#',\n 'F',\n 'Bb',\n 'Eb',\n 'Ab',\n 'Db',\n 'Gb',\n 'Cb',\n];\n\nexport class IdentifyKeyQuestion extends Question {\n public static dataShapes = [\n {\n name: DataShapeName.SIGHTSING_IdentifyKey,\n fields: [\n {\n name: 'key',\n type: FieldType.NUMBER,\n validator: {\n test: (value: string) => {\n const num = parseInt(value);\n return num >= 0 && num <= keys.length\n ? {\n msg: '',\n status: Status.ok,\n }\n : {\n msg: 'Please enter a number between 0 and 11',\n status: Status.error,\n };\n },\n },\n },\n ],\n },\n ];\n public static views = [IdentifyKeyView];\n public key: string;\n\n static getKey(value: number): string {\n return keys[value];\n }\n\n constructor(data: ViewData[]) {\n super(data);\n this.key = IdentifyKeyQuestion.getKey(data[0].key as number);\n }\n\n public isCorrect(answer: RadioMultipleChoiceAnswer): boolean {\n console.log(`answer: ${JSON.stringify(answer)}, key: ${this.key}`);\n return this.key === answer.choiceList[answer.selection];\n }\n\n public dataShapes() {\n return IdentifyKeyQuestion.dataShapes;\n }\n public views() {\n return IdentifyKeyQuestion.views;\n }\n}\n","import { CourseWare } from '../CourseWare';\nimport { IdentifyKeyQuestion } from './questions/IdentifyKey';\n// import { SpellingQuestion } from './questions/spelling';\n\nconst sightSing: CourseWare = new CourseWare('sightSing', [IdentifyKeyQuestion]);\n\nexport default sightSing;\n"],"x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146],"mappings":"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"}
|