scribbletune 5.1.2 → 5.4.0

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.
@@ -1 +1 @@
1
- {"version":3,"file":"browser.js","mappings":"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","sources":["webpack://scribbletune/./node_modules/harmonics/dist/index.js","webpack://scribbletune/./node_modules/jsmidgen/lib/jsmidgen.js","webpack://scribbletune/./src/arp.ts","webpack://scribbletune/./src/browser-clip.ts","webpack://scribbletune/./src/browser-index.ts","webpack://scribbletune/./src/channel.ts","webpack://scribbletune/./src/midi.ts","webpack://scribbletune/./src/progression.ts","webpack://scribbletune/./src/session.ts","webpack://scribbletune/./src/types/index.ts","webpack://scribbletune/./src/utils.ts","webpack://scribbletune/external commonjs \"fs\"","webpack://scribbletune/webpack/bootstrap","webpack://scribbletune/webpack/runtime/node module decorator","webpack://scribbletune/webpack/startup"],"sourcesContent":["\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __export = (target, all) => {\n for (var name in all)\n __defProp(target, name, { get: all[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (let key of __getOwnPropNames(from))\n if (!__hasOwnProp.call(to, key) && key !== except)\n __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n }\n return to;\n};\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n// src/index.ts\nvar index_exports = {};\n__export(index_exports, {\n chord: () => chord,\n chords: () => chords,\n getIndicesFromScale: () => getIndicesFromScale,\n inlineChord: () => inlineChord,\n scale: () => scale,\n scales: () => scales\n});\nmodule.exports = __toCommonJS(index_exports);\n\n// src/gen/scaleMaps.json\nvar scaleMaps_default = {\n \"major pentatonic\": \"101010010100\",\n \"ionian pentatonic\": \"100011010001\",\n \"mixolydian pentatonic\": \"100011010010\",\n ritusen: \"101001010100\",\n egyptian: \"101001010010\",\n \"neopolitan major pentatonic\": \"100011100010\",\n \"vietnamese 1\": \"100101011000\",\n pelog: \"110100011000\",\n kumoijoshi: \"110001011000\",\n hirajoshi: \"101100011000\",\n iwato: \"110001100010\",\n \"in-sen\": \"110001010010\",\n \"lydian pentatonic\": \"100010110001\",\n \"malkos raga\": \"100101001010\",\n \"locrian pentatonic\": \"100101100010\",\n \"minor pentatonic\": \"100101010010\",\n \"minor six pentatonic\": \"100101010100\",\n \"flat three pentatonic\": \"101100010100\",\n \"flat six pentatonic\": \"101010011000\",\n scriabin: \"110010010100\",\n \"whole tone pentatonic\": \"100010101010\",\n \"lydian #5P pentatonic\": \"100010101001\",\n \"lydian dominant pentatonic\": \"100010110010\",\n \"minor #7M pentatonic\": \"100101010001\",\n \"super locrian pentatonic\": \"100110100010\",\n \"minor hexatonic\": \"101101010001\",\n augmented: \"100110011001\",\n \"major blues\": \"101110010100\",\n piongio: \"101001010110\",\n \"prometheus neopolitan\": \"110010100110\",\n prometheus: \"101010100110\",\n \"mystery #1\": \"110010101010\",\n \"six tone symmetric\": \"110011001100\",\n \"whole tone\": \"101010101010\",\n \"messiaen's mode #5\": \"110001110001\",\n \"minor blues\": \"100101110010\",\n \"locrian major\": \"101011101010\",\n \"double harmonic lydian\": \"110010111001\",\n \"harmonic minor\": \"101101011001\",\n altered: \"110110101010\",\n \"locrian #2\": \"101101101010\",\n \"mixolydian b6\": \"101011011010\",\n \"lydian dominant\": \"101010110110\",\n lydian: \"101010110101\",\n \"lydian augmented\": \"101010101101\",\n \"dorian b2\": \"110101010110\",\n \"melodic minor\": \"101101010101\",\n locrian: \"110101101010\",\n ultralocrian: \"110110101100\",\n \"locrian 6\": \"110101100110\",\n \"augmented heptatonic\": \"100111011001\",\n \"romanian minor\": \"101100110110\",\n \"dorian #4\": \"101100110110\",\n \"lydian diminished\": \"101100110101\",\n phrygian: \"110101011010\",\n \"leading whole tone\": \"101010101011\",\n \"lydian minor\": \"101010111010\",\n \"phrygian dominant\": \"110011011010\",\n balinese: \"110101011001\",\n \"neopolitan major\": \"110101010101\",\n aeolian: \"101101011010\",\n \"harmonic major\": \"101011011001\",\n \"double harmonic major\": \"110011011001\",\n dorian: \"101101010110\",\n \"hungarian minor\": \"101100111001\",\n \"hungarian major\": \"100110110110\",\n oriental: \"110011100110\",\n flamenco: \"110110110010\",\n \"todi raga\": \"110100111001\",\n mixolydian: \"101011010110\",\n persian: \"110011101001\",\n major: \"101011010101\",\n enigmatic: \"110010101011\",\n \"major augmented\": \"101011001101\",\n \"lydian #9\": \"100110110101\",\n \"messiaen's mode #4\": \"111001111001\",\n \"purvi raga\": \"110011111001\",\n \"spanish heptatonic\": \"110111011010\",\n bebop: \"101011010111\",\n \"bebop minor\": \"101111010110\",\n \"bebop major\": \"101011011101\",\n \"bebop locrian\": \"110101111010\",\n \"minor bebop\": \"101101011011\",\n diminished: \"101101101101\",\n ichikosucho: \"101011110101\",\n \"minor six diminished\": \"101101011101\",\n \"half-whole diminished\": \"110110110110\",\n \"kafi raga\": \"100111010111\",\n \"messiaen's mode #6\": \"101011101011\",\n \"composite blues\": \"101111110110\",\n \"messiaen's mode #3\": \"101110111011\",\n \"messiaen's mode #7\": \"111101111101\",\n chromatic: \"111111111111\",\n ionian: \"101011010101\",\n minor: \"101101011010\",\n Kanakangi: \"111001011100\",\n Ratnangi: \"111001011010\",\n Ganamurti: \"111001011001\",\n Vanaspati: \"111001010110\",\n Manavati: \"111001010101\",\n Tanarupi: \"111001010011\",\n Senavati: \"110101011100\",\n Hanumatodi: \"110101011010\",\n Dhenuka: \"110101011001\",\n Natakapriya: \"110101010110\",\n Kokilapriya: \"110101010101\",\n Rupavati: \"110101010011\",\n Gayakapriya: \"110011011100\",\n Vakulabharanam: \"110011011010\",\n Mayamalavagowla: \"110011011001\",\n Chakravakam: \"110011010110\",\n Suryakantam: \"110011010101\",\n Hatakambari: \"110011010011\",\n Jhankaradhwani: \"101101011100\",\n Natabhairavi: \"101101011010\",\n Keeravani: \"101101011001\",\n Kharaharapriya: \"101101010110\",\n Gourimanohari: \"101101010101\",\n Varunapriya: \"101101010011\",\n Mararanjani: \"101011011100\",\n Charukesi: \"101011011010\",\n Sarasangi: \"101011011001\",\n Harikambhoji: \"101011010110\",\n Dheerasankarabaranam: \"101011010101\",\n Naganandini: \"101011010011\",\n Yagapriya: \"100111011100\",\n Ragavardhini: \"100111011010\",\n Gangeyabhushani: \"100111011001\",\n Vagadheeswari: \"100111010110\",\n Shulini: \"100111010101\",\n Chalanata: \"100111010011\",\n Salagam: \"111000111100\",\n Jalarnavam: \"111000111010\",\n Jhalavarali: \"111000111001\",\n Navaneetam: \"111000110110\",\n Pavani: \"111000110101\",\n Raghupriya: \"111000110011\",\n Gavambhodi: \"110100111100\",\n Bhavapriya: \"110100111010\",\n Shubhapantuvarali: \"110100111001\",\n Shadvidamargini: \"110100110110\",\n Suvarnangi: \"110100110101\",\n Divyamani: \"110100110011\",\n Dhavalambari: \"110010111100\",\n Namanarayani: \"110010111010\",\n Kamavardhini: \"110010111001\",\n Ramapriya: \"110010110110\",\n Gamanashrama: \"110010110101\",\n Vishwambari: \"110010110011\",\n Shamalangi: \"101100111100\",\n Shanmukhapriya: \"101100111010\",\n Simhendramadhyamam: \"101100111001\",\n Hemavati: \"101100110110\",\n Dharmavati: \"101100110101\",\n Neetimati: \"101100110011\",\n Kantamani: \"101010111100\",\n Rishabhapriya: \"101010111010\",\n Latangi: \"101010111001\",\n Vachaspati: \"101010110110\",\n Mechakalyani: \"101010110101\",\n Chitrambari: \"101010110011\",\n Sucharitra: \"100110111100\",\n \"Jyoti swarupini\": \"100110111010\",\n Dhatuvardani: \"100110111001\",\n Nasikabhushini: \"100110110110\",\n Kosalam: \"100110110101\",\n Rasikapriya: \"100110110011\"\n};\n\n// src/gen/chordMaps.json\nvar chordMaps_default = {\n \"5th\": \"100000010000\",\n \"M7#5sus4\": \"100001001001\",\n \"7#5sus4\": \"100001001010\",\n sus4: \"100001010000\",\n M7sus4: \"100001010001\",\n \"7sus4\": \"100001010010\",\n \"7no5\": \"100010000010\",\n aug: \"100010001000\",\n M7b6: \"100010001001\",\n \"maj7#5\": \"100010001001\",\n \"7#5\": \"100010001010\",\n \"7b13\": \"100010001010\",\n M: \"100010010000\",\n maj7: \"100010010001\",\n \"7th\": \"100010010010\",\n \"6th\": \"100010010100\",\n \"7add6\": \"100010010110\",\n \"7b6\": \"100010011010\",\n Mb5: \"100010100000\",\n M7b5: \"100010100001\",\n \"7b5\": \"100010100010\",\n \"maj#4\": \"100010110001\",\n \"7#11\": \"100010110010\",\n \"M6#11\": \"100010110100\",\n \"7#11b13\": \"100010111010\",\n \"m#5\": \"100100001000\",\n mb6M7: \"100100001001\",\n \"m7#5\": \"100100001010\",\n m: \"100100010000\",\n \"m/ma7\": \"100100010001\",\n m7: \"100100010010\",\n m6: \"100100010100\",\n mMaj7b6: \"100100011001\",\n dim: \"100100100000\",\n oM7: \"100100100001\",\n m7b5: \"100100100010\",\n dim7: \"100100100100\",\n o7M7: \"100100100101\",\n \"4th\": \"100101000010\",\n madd4: \"100101010000\",\n m7add11: \"100101010010\",\n \"+add#9\": \"100110001000\",\n \"7#5#9\": \"100110001010\",\n \"7#9\": \"100110010010\",\n \"13#9\": \"100110010110\",\n \"7#9b13\": \"100110011010\",\n \"maj7#9#11\": \"100110110001\",\n \"7#9#11\": \"100110110010\",\n \"13#9#11\": \"100110110110\",\n \"7#9#11b13\": \"100110111010\",\n sus2: \"101000010000\",\n \"M9#5sus4\": \"101001001001\",\n sus24: \"101001010000\",\n M9sus4: \"101001010001\",\n \"11th\": \"101001010010\",\n \"9sus4\": \"101001010010\",\n \"13sus4\": \"101001010110\",\n \"9no5\": \"101010000010\",\n \"13no5\": \"101010000110\",\n \"M#5add9\": \"101010001000\",\n \"maj9#5\": \"101010001001\",\n \"9#5\": \"101010001010\",\n \"9b13\": \"101010001010\",\n Madd9: \"101010010000\",\n maj9: \"101010010001\",\n \"9th\": \"101010010010\",\n \"6/9\": \"101010010100\",\n maj13: \"101010010101\",\n M7add13: \"101010010101\",\n \"13th\": \"101010010110\",\n M9b5: \"101010100001\",\n \"9b5\": \"101010100010\",\n \"13b5\": \"101010100110\",\n \"9#5#11\": \"101010101010\",\n \"maj9#11\": \"101010110001\",\n \"9#11\": \"101010110010\",\n \"69#11\": \"101010110100\",\n \"M13#11\": \"101010110101\",\n \"13#11\": \"101010110110\",\n \"9#11b13\": \"101010111010\",\n \"m9#5\": \"101100001010\",\n madd9: \"101100010000\",\n mM9: \"101100010001\",\n m9: \"101100010010\",\n m69: \"101100010100\",\n m13: \"101100010110\",\n mMaj9b6: \"101100011001\",\n m9b5: \"101100100010\",\n m11A: \"101101001010\",\n m11: \"101101010010\",\n b9sus: \"110001010010\",\n \"11b9\": \"110001010010\",\n \"7sus4b9b13\": \"110001011010\",\n alt7: \"110010000010\",\n \"7#5b9\": \"110010001010\",\n Maddb9: \"110010010000\",\n M7b9: \"110010010001\",\n \"7b9\": \"110010010010\",\n \"13b9\": \"110010010110\",\n \"7b9b13\": \"110010011010\",\n \"7#5b9#11\": \"110010101010\",\n \"7b9#11\": \"110010110010\",\n \"13b9#11\": \"110010110110\",\n \"7b9b13#11\": \"110010111010\",\n mb6b9: \"110100001000\",\n \"7b9#9\": \"110110010010\"\n};\n\n// src/scalesAndChords.ts\nvar DEFAULT_OCTAVE = 4;\nvar sharpToFlatMap = {\n \"C#\": \"Db\",\n \"D#\": \"Eb\",\n \"F#\": \"Gb\",\n \"G#\": \"Ab\",\n \"A#\": \"Bb\",\n \"CB\": \"B\",\n \"FB\": \"E\",\n \"E#\": \"F\",\n \"B#\": \"C\"\n};\nfunction sharpToFlat(root) {\n return sharpToFlatMap[root.toUpperCase()] || root.charAt(0).toUpperCase() + root.slice(1);\n}\nvar CHROMATIC = [\n \"C\",\n \"Db\",\n \"D\",\n \"Eb\",\n \"E\",\n \"F\",\n \"Gb\",\n \"G\",\n \"Ab\",\n \"A\",\n \"Bb\",\n \"B\"\n];\nfunction getChromatic(root, octave) {\n const index = CHROMATIC.indexOf(root);\n if (index === -1) {\n throw new Error(`${root} is not a valid root note`);\n }\n const o1 = CHROMATIC.map((n) => n + octave);\n const o2 = CHROMATIC.map((n) => n + (octave + 1));\n const c = o1.concat(o2);\n return c.slice(index);\n}\nvar scaleMap = scaleMaps_default;\nvar chordMap = chordMaps_default;\nfunction _getNotesForScaleOrChord({ scale: scale2, chord: chord2 }) {\n const input = scale2 || chord2;\n const SCALE_OR_CHORD = scale2 ? \"scale\" : \"chord\";\n if (typeof input !== \"string\") {\n throw new Error(`${input} is not a valid input for ${SCALE_OR_CHORD}`);\n }\n const rootOctaveScale = input.trim();\n const indexOfFirstSpace = rootOctaveScale.indexOf(\" \");\n let scaleOrChord;\n let rootOctave;\n if (indexOfFirstSpace === -1) {\n scaleOrChord = rootOctaveScale.slice(1);\n rootOctave = rootOctaveScale[0];\n if (rootOctaveScale[1] === \"b\" || rootOctaveScale[1] === \"#\") {\n scaleOrChord = rootOctaveScale.slice(2);\n rootOctave += rootOctaveScale[1];\n }\n } else {\n scaleOrChord = rootOctaveScale.slice(indexOfFirstSpace === -1 ? 1 : indexOfFirstSpace + 1);\n rootOctave = rootOctaveScale.slice(0, indexOfFirstSpace);\n }\n const root = sharpToFlat(rootOctave.replace(/\\d/g, \"\"));\n const octaveNumber = rootOctave.replace(/\\D/g, \"\");\n const octave = octaveNumber !== \"\" ? +rootOctave.replace(/\\D/g, \"\") : DEFAULT_OCTAVE;\n if (isNaN(octave)) {\n throw new Error(`${rootOctave[0]} does not have a valid octave`);\n }\n if (!scaleMap[scaleOrChord] && !chordMap[scaleOrChord]) {\n throw new Error(`${rootOctaveScale} is not a valid ${SCALE_OR_CHORD}`);\n }\n const chroma = getChromatic(root, octave);\n const acc = [];\n let p1 = 0, p2 = 0;\n const map = scale2 ? scaleMap : chordMap;\n while (p1 < map[scaleOrChord].length) {\n if (map[scaleOrChord][p1] === \"1\") {\n acc.push(chroma[p2]);\n }\n p1++;\n p2++;\n }\n return acc;\n}\nfunction inlineChord(rootChord_Oct) {\n const B9SUS = \"b9sus\";\n let root, chord2, octave = DEFAULT_OCTAVE;\n if (rootChord_Oct.includes(B9SUS)) {\n chord2 = B9SUS;\n root = rootChord_Oct.slice(0, rootChord_Oct.indexOf(B9SUS));\n } else {\n root = rootChord_Oct[0];\n chord2 = rootChord_Oct.slice(1);\n if (rootChord_Oct[1] === \"b\" || rootChord_Oct[1] === \"#\") {\n root += rootChord_Oct[1];\n chord2 = rootChord_Oct.slice(2);\n }\n }\n if (rootChord_Oct.includes(\"_\")) {\n octave = +rootChord_Oct.split(\"_\")[1];\n chord2 = chord2.slice(0, chord2.indexOf(\"_\"));\n }\n return _getNotesForScaleOrChord({ chord: root + octave + \" \" + chord2 });\n}\nfunction chords() {\n return Object.keys(chordMap);\n}\nfunction scales() {\n return Object.keys(scaleMap);\n}\nfunction chord(chord2) {\n return _getNotesForScaleOrChord({ chord: chord2 });\n}\nfunction scale(scale2) {\n return _getNotesForScaleOrChord({ scale: scale2 });\n}\nfunction getIndicesFromScale(scaleOrBitmap) {\n const str = scaleMap[scaleOrBitmap] || scaleOrBitmap;\n const intervals = [];\n for (let i = 0; i < str.length; i++) {\n if (str[i] === \"1\") {\n intervals.push(i);\n }\n }\n intervals.push(12);\n return intervals;\n}\n// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n chord,\n chords,\n getIndicesFromScale,\n inlineChord,\n scale,\n scales\n});\n","var Midi = {};\n\n(function(exported) {\n\n\tvar DEFAULT_VOLUME = exported.DEFAULT_VOLUME = 90;\n\tvar DEFAULT_DURATION = exported.DEFAULT_DURATION = 128;\n\tvar DEFAULT_CHANNEL = exported.DEFAULT_CHANNEL = 0;\n\n\t/* ******************************************************************\n\t * Utility functions\n\t ****************************************************************** */\n\n\tvar Util = {\n\n\t\tmidi_letter_pitches: { a:21, b:23, c:12, d:14, e:16, f:17, g:19 },\n\n\t\t/**\n\t\t * Convert a symbolic note name (e.g. \"c4\") to a numeric MIDI pitch (e.g.\n\t\t * 60, middle C).\n\t\t *\n\t\t * @param {string} n - The symbolic note name to parse.\n\t\t * @returns {number} The MIDI pitch that corresponds to the symbolic note\n\t\t * name.\n\t\t */\n\t\tmidiPitchFromNote: function(n) {\n\t\t\tvar matches = /([a-g])(#+|b+)?([0-9]+)$/i.exec(n);\n\t\t\tvar note = matches[1].toLowerCase(), accidental = matches[2] || '', octave = parseInt(matches[3], 10);\n\t\t\treturn (12 * octave) + Util.midi_letter_pitches[note] + (accidental.substr(0,1)=='#'?1:-1) * accidental.length;\n\t\t},\n\n\t\t/**\n\t\t * Ensure that the given argument is converted to a MIDI pitch. Note that\n\t\t * it may already be one (including a purely numeric string).\n\t\t *\n\t\t * @param {string|number} p - The pitch to convert.\n\t\t * @returns {number} The resulting numeric MIDI pitch.\n\t\t */\n\t\tensureMidiPitch: function(p) {\n\t\t\tif (typeof p == 'number' || !/[^0-9]/.test(p)) {\n\t\t\t\t// numeric pitch\n\t\t\t\treturn parseInt(p, 10);\n\t\t\t} else {\n\t\t\t\t// assume it's a note name\n\t\t\t\treturn Util.midiPitchFromNote(p);\n\t\t\t}\n\t\t},\n\n\t\tmidi_pitches_letter: { '12':'c', '13':'c#', '14':'d', '15':'d#', '16':'e', '17':'f', '18':'f#', '19':'g', '20':'g#', '21':'a', '22':'a#', '23':'b' },\n\t\tmidi_flattened_notes: { 'a#':'bb', 'c#':'db', 'd#':'eb', 'f#':'gb', 'g#':'ab' },\n\n\t\t/**\n\t\t * Convert a numeric MIDI pitch value (e.g. 60) to a symbolic note name\n\t\t * (e.g. \"c4\").\n\t\t *\n\t\t * @param {number} n - The numeric MIDI pitch value to convert.\n\t\t * @param {boolean} [returnFlattened=false] - Whether to prefer flattened\n\t\t * notes to sharpened ones. Optional, default false.\n\t\t * @returns {string} The resulting symbolic note name.\n\t\t */\n\t\tnoteFromMidiPitch: function(n, returnFlattened) {\n\t\t\tvar octave = 0, noteNum = n, noteName, returnFlattened = returnFlattened || false;\n\t\t\tif (n > 23) {\n\t\t\t\t// noteNum is on octave 1 or more\n\t\t\t\toctave = Math.floor(n/12) - 1;\n\t\t\t\t// subtract number of octaves from noteNum\n\t\t\t\tnoteNum = n - octave * 12;\n\t\t\t}\n\n\t\t\t// get note name (c#, d, f# etc)\n\t\t\tnoteName = Util.midi_pitches_letter[noteNum];\n\t\t\t// Use flattened notes if requested (e.g. f# should be output as gb)\n\t\t\tif (returnFlattened && noteName.indexOf('#') > 0) {\n\t\t\t\tnoteName = Util.midi_flattened_notes[noteName];\n\t\t\t}\n\t\t\treturn noteName + octave;\n\t\t},\n\n\t\t/**\n\t\t * Convert beats per minute (BPM) to microseconds per quarter note (MPQN).\n\t\t *\n\t\t * @param {number} bpm - A number in beats per minute.\n\t\t * @returns {number} The number of microseconds per quarter note.\n\t\t */\n\t\tmpqnFromBpm: function(bpm) {\n\t\t\tvar mpqn = Math.floor(60000000 / bpm);\n\t\t\tvar ret=[];\n\t\t\tdo {\n\t\t\t\tret.unshift(mpqn & 0xFF);\n\t\t\t\tmpqn >>= 8;\n\t\t\t} while (mpqn);\n\t\t\twhile (ret.length < 3) {\n\t\t\t\tret.push(0);\n\t\t\t}\n\t\t\treturn ret;\n\t\t},\n\n\t\t/**\n\t\t * Convert microseconds per quarter note (MPQN) to beats per minute (BPM).\n\t\t *\n\t\t * @param {number} mpqn - The number of microseconds per quarter note.\n\t\t * @returns {number} A number in beats per minute.\n\t\t */\n\t\tbpmFromMpqn: function(mpqn) {\n\t\t\tvar m = mpqn;\n\t\t\tif (typeof mpqn[0] != 'undefined') {\n\t\t\t\tm = 0;\n\t\t\t\tfor (var i=0, l=mpqn.length-1; l >= 0; ++i, --l) {\n\t\t\t\t\tm |= mpqn[i] << l;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn Math.floor(60000000 / mpqn);\n\t\t},\n\n\t\t/**\n\t\t * Converts an array of bytes to a string of hexadecimal characters. Prepares\n\t\t * it to be converted into a base64 string.\n\t\t *\n\t\t * @param {Array} byteArray - Array of bytes to be converted.\n\t\t * @returns {string} Hexadecimal string, e.g. \"097B8A\".\n\t\t */\n\t\tcodes2Str: function(byteArray) {\n\t\t\treturn String.fromCharCode.apply(null, byteArray);\n\t\t},\n\n\t\t/**\n\t\t * Converts a string of hexadecimal values to an array of bytes. It can also\n\t\t * add remaining \"0\" nibbles in order to have enough bytes in the array as the\n\t\t * `finalBytes` parameter.\n\t\t *\n\t\t * @param {string} str - string of hexadecimal values e.g. \"097B8A\"\n\t\t * @param {number} [finalBytes] - Optional. The desired number of bytes\n\t\t * (not nibbles) that the returned array should contain.\n\t\t * @returns {Array} An array of nibbles.\n\t\t */\n\t\tstr2Bytes: function (str, finalBytes) {\n\t\t\tif (finalBytes) {\n\t\t\t\twhile ((str.length / 2) < finalBytes) { str = \"0\" + str; }\n\t\t\t}\n\n\t\t\tvar bytes = [];\n\t\t\tfor (var i=str.length-1; i>=0; i = i-2) {\n\t\t\t\tvar chars = i === 0 ? str[i] : str[i-1] + str[i];\n\t\t\t\tbytes.unshift(parseInt(chars, 16));\n\t\t\t}\n\n\t\t\treturn bytes;\n\t\t},\n\n\t\t/**\n\t\t * Translates number of ticks to MIDI timestamp format, returning an array\n\t\t * of bytes with the time values. MIDI has a very particular way to express\n\t\t * time; take a good look at the spec before ever touching this function.\n\t\t *\n\t\t * @param {number} ticks - Number of ticks to be translated.\n\t\t * @returns {number} Array of bytes that form the MIDI time value.\n\t\t */\n\t\ttranslateTickTime: function(ticks) {\n\t\t\tvar buffer = ticks & 0x7F;\n\n\t\t\twhile (ticks = ticks >> 7) {\n\t\t\t\tbuffer <<= 8;\n\t\t\t\tbuffer |= ((ticks & 0x7F) | 0x80);\n\t\t\t}\n\n\t\t\tvar bList = [];\n\t\t\twhile (true) {\n\t\t\t\tbList.push(buffer & 0xff);\n\n\t\t\t\tif (buffer & 0x80) { buffer >>= 8; }\n\t\t\t\telse { break; }\n\t\t\t}\n\t\t\treturn bList;\n\t\t},\n\n\t};\n\n\t/* ******************************************************************\n\t * Event class\n\t ****************************************************************** */\n\n\t/**\n\t * Construct a MIDI event.\n\t *\n\t * Parameters include:\n\t * - time [optional number] - Ticks since previous event.\n\t * - type [required number] - Type of event.\n\t * - channel [required number] - Channel for the event.\n\t * - param1 [required number] - First event parameter.\n\t * - param2 [optional number] - Second event parameter.\n\t */\n\tvar MidiEvent = function(params) {\n\t\tif (!this) return new MidiEvent(params);\n\t\tif (params &&\n\t\t\t\t(params.type !== null || params.type !== undefined) &&\n\t\t\t\t(params.channel !== null || params.channel !== undefined) &&\n\t\t\t\t(params.param1 !== null || params.param1 !== undefined)) {\n\t\t\tthis.setTime(params.time);\n\t\t\tthis.setType(params.type);\n\t\t\tthis.setChannel(params.channel);\n\t\t\tthis.setParam1(params.param1);\n\t\t\tthis.setParam2(params.param2);\n\t\t}\n\t};\n\n\t// event codes\n\tMidiEvent.NOTE_OFF = 0x80;\n\tMidiEvent.NOTE_ON = 0x90;\n\tMidiEvent.AFTER_TOUCH = 0xA0;\n\tMidiEvent.CONTROLLER = 0xB0;\n\tMidiEvent.PROGRAM_CHANGE = 0xC0;\n\tMidiEvent.CHANNEL_AFTERTOUCH = 0xD0;\n\tMidiEvent.PITCH_BEND = 0xE0;\n\n\n\t/**\n\t * Set the time for the event in ticks since the previous event.\n\t *\n\t * @param {number} ticks - The number of ticks since the previous event. May\n\t * be zero.\n\t */\n\tMidiEvent.prototype.setTime = function(ticks) {\n\t\tthis.time = Util.translateTickTime(ticks || 0);\n\t};\n\n\t/**\n\t * Set the type of the event. Must be one of the event codes on MidiEvent.\n\t *\n\t * @param {number} type - Event type.\n\t */\n\tMidiEvent.prototype.setType = function(type) {\n\t\tif (type < MidiEvent.NOTE_OFF || type > MidiEvent.PITCH_BEND) {\n\t\t\tthrow new Error(\"Trying to set an unknown event: \" + type);\n\t\t}\n\n\t\tthis.type = type;\n\t};\n\n\t/**\n\t * Set the channel for the event. Must be between 0 and 15, inclusive.\n\t *\n\t * @param {number} channel - The event channel.\n\t */\n\tMidiEvent.prototype.setChannel = function(channel) {\n\t\tif (channel < 0 || channel > 15) {\n\t\t\tthrow new Error(\"Channel is out of bounds.\");\n\t\t}\n\n\t\tthis.channel = channel;\n\t};\n\n\t/**\n\t * Set the first parameter for the event. Must be between 0 and 255,\n\t * inclusive.\n\t *\n\t * @param {number} p - The first event parameter value.\n\t */\n\tMidiEvent.prototype.setParam1 = function(p) {\n\t\tthis.param1 = p;\n\t};\n\n\t/**\n\t * Set the second parameter for the event. Must be between 0 and 255,\n\t * inclusive.\n\t *\n\t * @param {number} p - The second event parameter value.\n\t */\n\tMidiEvent.prototype.setParam2 = function(p) {\n\t\tthis.param2 = p;\n\t};\n\n\t/**\n\t * Serialize the event to an array of bytes.\n\t *\n\t * @returns {Array} The array of serialized bytes.\n\t */\n\tMidiEvent.prototype.toBytes = function() {\n\t\tvar byteArray = [];\n\n\t\tvar typeChannelByte = this.type | (this.channel & 0xF);\n\n\t\tbyteArray.push.apply(byteArray, this.time);\n\t\tbyteArray.push(typeChannelByte);\n\t\tbyteArray.push(this.param1);\n\n\t\t// Some events don't have a second parameter\n\t\tif (this.param2 !== undefined && this.param2 !== null) {\n\t\t\tbyteArray.push(this.param2);\n\t\t}\n\t\treturn byteArray;\n\t};\n\n\t/* ******************************************************************\n\t * MetaEvent class\n\t ****************************************************************** */\n\n\t/**\n\t * Construct a meta event.\n\t *\n\t * Parameters include:\n\t * - time [optional number] - Ticks since previous event.\n\t * - type [required number] - Type of event.\n\t * - data [optional array|string] - Event data.\n\t */\n\tvar MetaEvent = function(params) {\n\t\tif (!this) return new MetaEvent(params);\n\t\tvar p = params || {};\n\t\tthis.setTime(params.time);\n\t\tthis.setType(params.type);\n\t\tthis.setData(params.data);\n\t};\n\n\tMetaEvent.SEQUENCE = 0x00;\n\tMetaEvent.TEXT = 0x01;\n\tMetaEvent.COPYRIGHT = 0x02;\n\tMetaEvent.TRACK_NAME = 0x03;\n\tMetaEvent.INSTRUMENT = 0x04;\n\tMetaEvent.LYRIC = 0x05;\n\tMetaEvent.MARKER = 0x06;\n\tMetaEvent.CUE_POINT = 0x07;\n\tMetaEvent.CHANNEL_PREFIX = 0x20;\n\tMetaEvent.END_OF_TRACK = 0x2f;\n\tMetaEvent.TEMPO = 0x51;\n\tMetaEvent.SMPTE = 0x54;\n\tMetaEvent.TIME_SIG = 0x58;\n\tMetaEvent.KEY_SIG = 0x59;\n\tMetaEvent.SEQ_EVENT = 0x7f;\n\n\t/**\n\t * Set the time for the event in ticks since the previous event.\n\t *\n\t * @param {number} ticks - The number of ticks since the previous event. May\n\t * be zero.\n\t */\n\tMetaEvent.prototype.setTime = function(ticks) {\n\t\tthis.time = Util.translateTickTime(ticks || 0);\n\t};\n\n\t/**\n\t * Set the type of the event. Must be one of the event codes on MetaEvent.\n\t *\n\t * @param {number} t - Event type.\n\t */\n\tMetaEvent.prototype.setType = function(t) {\n\t\tthis.type = t;\n\t};\n\n\t/**\n\t * Set the data associated with the event. May be a string or array of byte\n\t * values.\n\t *\n\t * @param {string|Array} d - Event data.\n\t */\n\tMetaEvent.prototype.setData = function(d) {\n\t\tthis.data = d;\n\t};\n\n\t/**\n\t * Serialize the event to an array of bytes.\n\t *\n\t * @returns {Array} The array of serialized bytes.\n\t */\n\tMetaEvent.prototype.toBytes = function() {\n\t\tif (!this.type) {\n\t\t\tthrow new Error(\"Type for meta-event not specified.\");\n\t\t}\n\n\t\tvar byteArray = [];\n\t\tbyteArray.push.apply(byteArray, this.time);\n\t\tbyteArray.push(0xFF, this.type);\n\n\t\t// If data is an array, we assume that it contains several bytes. We\n\t\t// apend them to byteArray.\n\t\tif (Array.isArray(this.data)) {\n\t\t\tbyteArray.push(this.data.length);\n\t\t\tbyteArray.push.apply(byteArray, this.data);\n\t\t} else if (typeof this.data == 'number') {\n\t\t\tbyteArray.push(1, this.data);\n\t\t} else if (this.data !== null && this.data !== undefined) {\n\t\t\t// assume string; may be a bad assumption\n\t\t\tbyteArray.push(this.data.length);\n\t\t\tvar dataBytes = this.data.split('').map(function(x){ return x.charCodeAt(0) });\n\t\t\tbyteArray.push.apply(byteArray, dataBytes);\n\t\t} else {\n\t\t\tbyteArray.push(0);\n\t\t}\n\n\t\treturn byteArray;\n\t};\n\n\t/* ******************************************************************\n\t * Track class\n\t ****************************************************************** */\n\n\t/**\n\t * Construct a MIDI track.\n\t *\n\t * Parameters include:\n\t * - events [optional array] - Array of events for the track.\n\t */\n\tvar Track = function(config) {\n\t\tif (!this) return new Track(config);\n\t\tvar c = config || {};\n\t\tthis.events = c.events || [];\n\t};\n\n\tTrack.START_BYTES = [0x4d, 0x54, 0x72, 0x6b];\n\tTrack.END_BYTES = [0x00, 0xFF, 0x2F, 0x00];\n\n\t/**\n\t * Add an event to the track.\n\t *\n\t * @param {MidiEvent|MetaEvent} event - The event to add.\n\t * @returns {Track} The current track.\n\t */\n\tTrack.prototype.addEvent = function(event) {\n\t\tthis.events.push(event);\n\t\treturn this;\n\t};\n\n\t/**\n\t * Add a note-on event to the track.\n\t *\n\t * @param {number} channel - The channel to add the event to.\n\t * @param {number|string} pitch - The pitch of the note, either numeric or\n\t * symbolic.\n\t * @param {number} [time=0] - The number of ticks since the previous event,\n\t * defaults to 0.\n\t * @param {number} [velocity=90] - The volume for the note, defaults to\n\t * DEFAULT_VOLUME.\n\t * @returns {Track} The current track.\n\t */\n\tTrack.prototype.addNoteOn = Track.prototype.noteOn = function(channel, pitch, time, velocity) {\n\t\tthis.events.push(new MidiEvent({\n\t\t\ttype: MidiEvent.NOTE_ON,\n\t\t\tchannel: channel,\n\t\t\tparam1: Util.ensureMidiPitch(pitch),\n\t\t\tparam2: velocity || DEFAULT_VOLUME,\n\t\t\ttime: time || 0,\n\t\t}));\n\t\treturn this;\n\t};\n\n\t/**\n\t * Add a note-off event to the track.\n\t *\n\t * @param {number} channel - The channel to add the event to.\n\t * @param {number|string} pitch - The pitch of the note, either numeric or\n\t * symbolic.\n\t * @param {number} [time=0] - The number of ticks since the previous event,\n\t * defaults to 0.\n\t * @param {number} [velocity=90] - The velocity the note was released,\n\t * defaults to DEFAULT_VOLUME.\n\t * @returns {Track} The current track.\n\t */\n\tTrack.prototype.addNoteOff = Track.prototype.noteOff = function(channel, pitch, time, velocity) {\n\t\tthis.events.push(new MidiEvent({\n\t\t\ttype: MidiEvent.NOTE_OFF,\n\t\t\tchannel: channel,\n\t\t\tparam1: Util.ensureMidiPitch(pitch),\n\t\t\tparam2: velocity || DEFAULT_VOLUME,\n\t\t\ttime: time || 0,\n\t\t}));\n\t\treturn this;\n\t};\n\n\t/**\n\t * Add a note-on and -off event to the track.\n\t *\n\t * @param {number} channel - The channel to add the event to.\n\t * @param {number|string} pitch - The pitch of the note, either numeric or\n\t * symbolic.\n\t * @param {number} dur - The duration of the note, in ticks.\n\t * @param {number} [time=0] - The number of ticks since the previous event,\n\t * defaults to 0.\n\t * @param {number} [velocity=90] - The velocity the note was released,\n\t * defaults to DEFAULT_VOLUME.\n\t * @returns {Track} The current track.\n\t */\n\tTrack.prototype.addNote = Track.prototype.note = function(channel, pitch, dur, time, velocity) {\n\t\tthis.noteOn(channel, pitch, time, velocity);\n\t\tif (dur) {\n\t\t\tthis.noteOff(channel, pitch, dur, velocity);\n\t\t}\n\t\treturn this;\n\t};\n\n\t/**\n\t * Add a note-on and -off event to the track for each pitch in an array of pitches.\n\t *\n\t * @param {number} channel - The channel to add the event to.\n\t * @param {array} chord - An array of pitches, either numeric or\n\t * symbolic.\n\t * @param {number} dur - The duration of the chord, in ticks.\n\t * @param {number} [velocity=90] - The velocity of the chord,\n\t * defaults to DEFAULT_VOLUME.\n\t * @returns {Track} The current track.\n\t */\n\tTrack.prototype.addChord = Track.prototype.chord = function(channel, chord, dur, velocity) {\n\t\tif (!Array.isArray(chord) && !chord.length) {\n\t\t\tthrow new Error('Chord must be an array of pitches');\n\t\t}\n\t\tchord.forEach(function(note) {\n\t\t\tthis.noteOn(channel, note, 0, velocity);\n\t\t}, this);\n\t\tchord.forEach(function(note, index) {\n\t\t\tif (index === 0) {\n\t\t\t\tthis.noteOff(channel, note, dur);\n\t\t\t} else {\n\t\t\t\tthis.noteOff(channel, note);\n\t\t\t}\n\t\t}, this);\n\t\treturn this;\n\t};\n\n\t/**\n\t * Set instrument for the track.\n\t *\n\t * @param {number} channel - The channel to set the instrument on.\n\t * @param {number} instrument - The instrument to set it to.\n\t * @param {number} [time=0] - The number of ticks since the previous event,\n\t * defaults to 0.\n\t * @returns {Track} The current track.\n\t */\n\tTrack.prototype.setInstrument = Track.prototype.instrument = function(channel, instrument, time) {\n\t\tthis.events.push(new MidiEvent({\n\t\t\ttype: MidiEvent.PROGRAM_CHANGE,\n\t\t\tchannel: channel,\n\t\t\tparam1: instrument,\n\t\t\ttime: time || 0,\n\t\t}));\n\t\treturn this;\n\t};\n\n\t/**\n\t * Set the tempo for the track.\n\t *\n\t * @param {number} bpm - The new number of beats per minute.\n\t * @param {number} [time=0] - The number of ticks since the previous event,\n\t * defaults to 0.\n\t * @returns {Track} The current track.\n\t */\n\tTrack.prototype.setTempo = Track.prototype.tempo = function(bpm, time) {\n\t\tthis.events.push(new MetaEvent({\n\t\t\ttype: MetaEvent.TEMPO,\n\t\t\tdata: Util.mpqnFromBpm(bpm),\n\t\t\ttime: time || 0,\n\t\t}));\n\t\treturn this;\n\t};\n\n\t/**\n\t * Serialize the track to an array of bytes.\n\t *\n\t * @returns {Array} The array of serialized bytes.\n\t */\n\tTrack.prototype.toBytes = function() {\n\t\tvar trackLength = 0;\n\t\tvar eventBytes = [];\n\t\tvar startBytes = Track.START_BYTES;\n\t\tvar endBytes = Track.END_BYTES;\n\n\t\tvar addEventBytes = function(event) {\n\t\t\tvar bytes = event.toBytes();\n\t\t\ttrackLength += bytes.length;\n\t\t\teventBytes.push.apply(eventBytes, bytes);\n\t\t};\n\n\t\tthis.events.forEach(addEventBytes);\n\n\t\t// Add the end-of-track bytes to the sum of bytes for the track, since\n\t\t// they are counted (unlike the start-of-track ones).\n\t\ttrackLength += endBytes.length;\n\n\t\t// Makes sure that track length will fill up 4 bytes with 0s in case\n\t\t// the length is less than that (the usual case).\n\t\tvar lengthBytes = Util.str2Bytes(trackLength.toString(16), 4);\n\n\t\treturn startBytes.concat(lengthBytes, eventBytes, endBytes);\n\t};\n\n\t/* ******************************************************************\n\t * File class\n\t ****************************************************************** */\n\n\t/**\n\t * Construct a file object.\n\t *\n\t * Parameters include:\n\t * - ticks [optional number] - Number of ticks per beat, defaults to 128.\n\t * Must be 1-32767.\n\t * - tracks [optional array] - Track data.\n\t */\n\tvar File = function(config){\n\t\tif (!this) return new File(config);\n\n\t\tvar c = config || {};\n\t\tif (c.ticks) {\n\t\t\tif (typeof c.ticks !== 'number') {\n\t\t\t\tthrow new Error('Ticks per beat must be a number!');\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (c.ticks <= 0 || c.ticks >= (1 << 15) || c.ticks % 1 !== 0) {\n\t\t\t\tthrow new Error('Ticks per beat must be an integer between 1 and 32767!');\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tthis.ticks = c.ticks || 128;\n\t\tthis.tracks = c.tracks || [];\n\t};\n\n\tFile.HDR_CHUNKID = \"MThd\"; // File magic cookie\n\tFile.HDR_CHUNK_SIZE = \"\\x00\\x00\\x00\\x06\"; // Header length for SMF\n\tFile.HDR_TYPE0 = \"\\x00\\x00\"; // Midi Type 0 id\n\tFile.HDR_TYPE1 = \"\\x00\\x01\"; // Midi Type 1 id\n\n\t/**\n\t * Add a track to the file.\n\t *\n\t * @param {Track} track - The track to add.\n\t */\n\tFile.prototype.addTrack = function(track) {\n\t\tif (track) {\n\t\t\tthis.tracks.push(track);\n\t\t\treturn this;\n\t\t} else {\n\t\t\ttrack = new Track();\n\t\t\tthis.tracks.push(track);\n\t\t\treturn track;\n\t\t}\n\t};\n\n\t/**\n\t * Serialize the MIDI file to an array of bytes.\n\t *\n\t * @returns {Array} The array of serialized bytes.\n\t */\n\tFile.prototype.toBytes = function() {\n\t\tvar trackCount = this.tracks.length.toString(16);\n\n\t\t// prepare the file header\n\t\tvar bytes = File.HDR_CHUNKID + File.HDR_CHUNK_SIZE;\n\n\t\t// set Midi type based on number of tracks\n\t\tif (parseInt(trackCount, 16) > 1) {\n\t\t\tbytes += File.HDR_TYPE1;\n\t\t} else {\n\t\t\tbytes += File.HDR_TYPE0;\n\t\t}\n\n\t\t// add the number of tracks (2 bytes)\n\t\tbytes += Util.codes2Str(Util.str2Bytes(trackCount, 2));\n\t\t// add the number of ticks per beat (currently hardcoded)\n\t\tbytes += String.fromCharCode((this.ticks/256), this.ticks%256);;\n\n\t\t// iterate over the tracks, converting to bytes too\n\t\tthis.tracks.forEach(function(track) {\n\t\t\tbytes += Util.codes2Str(track.toBytes());\n\t\t});\n\n\t\treturn bytes;\n\t};\n\n\t/* ******************************************************************\n\t * Exports\n\t ****************************************************************** */\n\n\texported.Util = Util;\n\texported.File = File;\n\texported.Track = Track;\n\texported.Event = MidiEvent;\n\texported.MetaEvent = MetaEvent;\n\n})( Midi );\n\nif (typeof module != 'undefined' && module !== null) {\n\tmodule.exports = Midi;\n} else if (typeof exports != 'undefined' && exports !== null) {\n\texports = Midi;\n} else {\n\tthis.Midi = Midi;\n}\n","\"use strict\";\nvar __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.arp = void 0;\nvar harmonics_1 = require(\"harmonics\");\nvar utils_1 = require(\"./utils\");\nvar DEFAULT_OCTAVE = 4;\n/**\n * Take an array and fill it with it s own elements in the next octave till it s of the specified `len`\n * @param {Array} arr e.g. ['a4', 'b4']\n * @param {Number} e.g. len 4\n * @return {Array} e.g. ['a4', 'b4', 'a5', 'b5']\n */\nvar fillArr = function (arr, len) {\n var bumpOctave = function (el) {\n if (!el) {\n throw new Error('Empty element');\n }\n var note = el.replace(/\\d/, '');\n var oct = el.replace(/\\D/g, '') || DEFAULT_OCTAVE;\n if (!note) {\n throw new Error('Incorrect note');\n }\n return note + (+oct + 1);\n };\n // Create a couple of chord arrays with bumped octaves\n // so that something like [c3, e3, g4] turns into [c4, e4, g5] and [c5, e5, g6]\n var arr1 = arr.map(bumpOctave);\n var arr2 = arr1.map(bumpOctave);\n var finalArr = __spreadArray(__spreadArray(__spreadArray([], arr, true), arr1, true), arr2, true);\n // Slice and return only as much as required\n return finalArr.slice(0, len);\n};\n/**\n *\n * @param chordsOrParams a string that denotes space (comma?) separated chords to be used or an object with additional properties\n * By default, if this is a string, the count of notes generated is 8 and the order is ascending.\n * For instance arp('CM FM') will result in an array of notes [C4, E4, G4, F4, A4, C4, C5, E5]\n * You can even provide Params as an object.\n * For e.g. arp({count: 8, order: '10325476', chords: 'FM_4 Gm7b5_4 AbM_4 Bbm_4 Cm_5 DbM_5 EbM_5})\n */\nvar arp = function (chordsOrParams) {\n var finalArr = [];\n var params = {\n count: 4,\n order: '0123',\n chords: '',\n };\n if (typeof chordsOrParams === 'string') {\n params.chords = chordsOrParams;\n }\n else {\n if (chordsOrParams.order && chordsOrParams.order.match(/\\D/g)) {\n throw new TypeError('Invalid value for order');\n }\n if (chordsOrParams.count > 8 || chordsOrParams.count < 2) {\n throw new TypeError('Invalid value for count');\n }\n // Provision a order for the notes in case only count was provided\n if (chordsOrParams.count && !chordsOrParams.order) {\n params.order = Array.from(Array(chordsOrParams.count).keys()).join('');\n }\n Object.assign(params, chordsOrParams);\n }\n // Chords can be passed as a string, e.g. 'CM_4 FM_4'\n // or as an array of notes arrays e.g. [['C3', 'E3', 'G3', 'B3'], ['F3', 'A3', 'C4', 'E4']]\n if (typeof params.chords === 'string') {\n var chordsArr = params.chords.split(' ');\n chordsArr.forEach(function (c, i) {\n try {\n var filledArr_1 = fillArr((0, harmonics_1.inlineChord)(c), params.count);\n // reorder the filledArr as per params.order\n var reorderedArr = params.order\n .split('')\n .map(function (idx) { return filledArr_1[idx]; });\n finalArr = __spreadArray(__spreadArray([], finalArr, true), reorderedArr, true);\n }\n catch (e) {\n throw new Error(\"Cannot decode chord \" + (i + 1) + \" \\\"\" + c + \"\\\" in given \\\"\" + params.chords + \"\\\"\");\n }\n });\n }\n else if (Array.isArray(params.chords)) {\n params.chords.forEach(function (c, i) {\n try {\n var filledArr_2 = fillArr(c, params.count);\n // reorder the filledArr as per params.order\n var reorderedArr = params.order\n .split('')\n .map(function (idx) { return filledArr_2[idx]; });\n finalArr = __spreadArray(__spreadArray([], finalArr, true), reorderedArr, true);\n }\n catch (e) {\n throw new Error(((0, utils_1.errorHasMessage)(e) ? e.message : e) + \" in chord \" + (i + 1) + \" \\\"\" + c + \"\\\"\");\n }\n });\n }\n else {\n throw new TypeError('Invalid value for chords');\n }\n return finalArr;\n};\nexports.arp = arp;\n","\"use strict\";\nvar __assign = (this && this.__assign) || function () {\n __assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return __assign.apply(this, arguments);\n};\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar __generator = (this && this.__generator) || function (thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (_) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.clip = exports.renderingDuration = exports.totalPatternDuration = exports.recursivelyApplyPatternToDurations = exports.getDuration = exports.getNote = void 0;\nvar utils_1 = require(\"./utils\");\n// import { window } from './window';\n// if (!(window as any).Tone) {\n// (window as any).Tone = Tone;\n// }\n// const tone = (window as any).Tone;\n// const tone = Tone || (window as any).Tone;\nvar defaultSubdiv = '4n';\nvar defaultDur = '8n';\n/**\n * Get default params for a clip, such as root note, pattern etc\n * @return {Object}\n */\nvar getDefaultParams = function () { return ({\n notes: ['C4'],\n pattern: 'x',\n shuffle: false,\n sizzle: false,\n sizzleReps: 1,\n arpegiate: false,\n subdiv: '4n',\n align: '1m',\n alignOffset: '0',\n amp: 100,\n accentLow: 70,\n randomNotes: null,\n offlineRendering: false,\n}); };\n/* UNUSED *\n * HDR speed is denoted by the number of ticks per note\n * By default this is set to a quarter note (4n) to be in line with Tone.js' default subdivision\n * Technically a bar is 512 ticks long. So it's HDR speed is 512\n * @type {Object}\n * /\nconst hdr: NVP<number> = {\n '1m': 2048,\n '2m': 4096,\n '3m': 6144,\n '4m': 8192,\n '1n': 512,\n '2n': 256,\n '4n': 128,\n '8n': 64,\n '16n': 32,\n};\n/* */\nvar getNote = function (el, params, counter) {\n if (el === 'R' && params.randomNotes && params.randomNotes.length > 0) {\n return params.randomNotes[(0, utils_1.randomInt)(params.randomNotes.length - 1)];\n }\n if (params.notes) {\n return params.notes[counter % (params.notes.length || 1)];\n }\n return '';\n};\nexports.getNote = getNote;\nvar getDuration = function (params, counter) {\n return params.durations\n ? params.durations[counter % params.durations.length]\n : params.dur || params.subdiv || defaultDur;\n};\nexports.getDuration = getDuration;\nvar recursivelyApplyPatternToDurations = function (patternArr, length, durations) {\n if (durations === void 0) { durations = []; }\n patternArr.forEach(function (char) {\n if (typeof char === 'string') {\n if (char === 'x' || char === 'R') {\n durations.push(length);\n }\n if (char === '_' && durations.length) {\n durations[durations.length - 1] += length;\n }\n }\n if (Array.isArray(char)) {\n (0, exports.recursivelyApplyPatternToDurations)(char, length / char.length, durations);\n }\n });\n return durations;\n};\nexports.recursivelyApplyPatternToDurations = recursivelyApplyPatternToDurations;\nvar generateSequence = function (params, channel, context) {\n context = context || Tone.getContext();\n if (!params.pattern) {\n throw new Error('No pattern provided!');\n }\n if (!params.durations && !params.dur) {\n params.durations = (0, exports.recursivelyApplyPatternToDurations)((0, utils_1.expandStr)(params.pattern), Tone.Ticks(params.subdiv || defaultSubdiv).toSeconds());\n }\n return new Tone.Sequence({\n callback: channel.getSeqFn(params),\n events: (0, utils_1.expandStr)(params.pattern),\n subdivision: params.subdiv || defaultSubdiv,\n context: context,\n });\n};\nvar totalPatternDuration = function (pattern, subdivOrLength) {\n return typeof subdivOrLength === 'number'\n ? subdivOrLength * (0, utils_1.expandStr)(pattern).length\n : Tone.Ticks(subdivOrLength).toSeconds() * (0, utils_1.expandStr)(pattern).length;\n};\nexports.totalPatternDuration = totalPatternDuration;\nvar leastCommonMultiple = function (n1, n2) {\n var _a = n1 < n2 ? [n1, n2] : [n2, n1], smallest = _a[0], largest = _a[1];\n var i = largest;\n while (i % smallest !== 0) {\n i += largest;\n }\n return i;\n};\nvar renderingDuration = function (pattern, subdivOrLength, notes, randomNotes) {\n var patternRegularNotesCount = pattern.split('').filter(function (c) {\n return c === 'x';\n }).length;\n var patternRandomNotesCount = pattern.split('').filter(function (c) {\n return c === 'R';\n }).length;\n var patternNotesCount = (randomNotes === null || randomNotes === void 0 ? void 0 : randomNotes.length)\n ? patternRegularNotesCount\n : patternRegularNotesCount + patternRandomNotesCount;\n var notesCount = notes.length || 1;\n return (((0, exports.totalPatternDuration)(pattern, subdivOrLength) / patternNotesCount) *\n leastCommonMultiple(notesCount, patternNotesCount));\n};\nexports.renderingDuration = renderingDuration;\nvar ongoingRenderingCounter = 0;\nvar originalContext;\nvar offlineRenderClip = function (params, duration) {\n if (!originalContext) {\n originalContext = Tone.getContext();\n }\n ongoingRenderingCounter++;\n var player = new Tone.Player({ context: originalContext, loop: true });\n Tone.Offline(function (context) { return __awaiter(void 0, void 0, void 0, function () {\n var sequence;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n sequence = generateSequence(params, context);\n return [4 /*yield*/, Tone.loaded()];\n case 1:\n _a.sent();\n sequence.start();\n context.transport.start();\n return [2 /*return*/];\n }\n });\n }); }, duration).then(function (buffer) {\n var _a;\n player.buffer = buffer;\n ongoingRenderingCounter--;\n if (ongoingRenderingCounter === 0) {\n Tone.setContext(originalContext);\n (_a = params.offlineRenderingCallback) === null || _a === void 0 ? void 0 : _a.call(params);\n }\n });\n player.toDestination();\n player.sync();\n return player;\n};\n/**\n * @param {Object}\n * @return {Tone.js Sequence Object}\n * Take a object literal that may have a Tone.js player OR instrument\n * or simply a sample or synth with a pattern and return a Tone.js sequence\n */\nvar clip = function (params, channel) {\n params = __assign(__assign({}, getDefaultParams()), (params || {}));\n // If notes is a string, split it into an array\n if (typeof params.notes === 'string') {\n // Remove any accidental double spaces\n params.notes = params.notes.replace(/\\s{2,}/g, ' ');\n params.notes = params.notes.split(' ');\n }\n params.notes = params.notes ? params.notes.map(utils_1.convertChordsToNotes) : [];\n if (/[^x\\-_[\\]R]/.test(params.pattern)) {\n throw new TypeError(\"pattern can only comprise x - _ [ ] R, found \" + params.pattern);\n }\n if (params.shuffle) {\n params.notes = (0, utils_1.shuffle)(params.notes);\n }\n if (params.randomNotes && typeof params.randomNotes === 'string') {\n params.randomNotes = params.randomNotes.replace(/\\s{2,}/g, ' ').split(/\\s/);\n }\n if (params.randomNotes) {\n params.randomNotes = params.randomNotes.map(utils_1.convertChordsToNotes);\n }\n if (params.offlineRendering) {\n return offlineRenderClip(params, (0, exports.renderingDuration)(params.pattern, params.subdiv || defaultSubdiv, params.notes, params.randomNotes));\n }\n return generateSequence(params, channel, originalContext);\n};\nexports.clip = clip;\n","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Session = exports.midi = exports.arp = exports.progression = exports.getChordsByProgression = exports.getChordDegrees = exports.clip = exports.chords = exports.chord = exports.modes = exports.scales = exports.mode = exports.scale = void 0;\nvar harmonics_1 = require(\"harmonics\");\nObject.defineProperty(exports, \"scales\", { enumerable: true, get: function () { return harmonics_1.scales; } });\nObject.defineProperty(exports, \"modes\", { enumerable: true, get: function () { return harmonics_1.scales; } });\nObject.defineProperty(exports, \"chords\", { enumerable: true, get: function () { return harmonics_1.chords; } });\nObject.defineProperty(exports, \"scale\", { enumerable: true, get: function () { return harmonics_1.scale; } });\nObject.defineProperty(exports, \"mode\", { enumerable: true, get: function () { return harmonics_1.scale; } });\nObject.defineProperty(exports, \"chord\", { enumerable: true, get: function () { return harmonics_1.chord; } });\nvar browser_clip_1 = require(\"./browser-clip\");\nObject.defineProperty(exports, \"clip\", { enumerable: true, get: function () { return browser_clip_1.clip; } });\nvar progression_1 = require(\"./progression\");\nObject.defineProperty(exports, \"getChordDegrees\", { enumerable: true, get: function () { return progression_1.getChordDegrees; } });\nObject.defineProperty(exports, \"getChordsByProgression\", { enumerable: true, get: function () { return progression_1.getChordsByProgression; } });\nObject.defineProperty(exports, \"progression\", { enumerable: true, get: function () { return progression_1.progression; } });\nvar arp_1 = require(\"./arp\");\nObject.defineProperty(exports, \"arp\", { enumerable: true, get: function () { return arp_1.arp; } });\nvar midi_1 = require(\"./midi\");\nObject.defineProperty(exports, \"midi\", { enumerable: true, get: function () { return midi_1.midi; } });\nvar session_1 = require(\"./session\");\nObject.defineProperty(exports, \"Session\", { enumerable: true, get: function () { return session_1.Session; } });\n__exportStar(require(\"./types\"), exports);\n","\"use strict\";\nvar __assign = (this && this.__assign) || function () {\n __assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return __assign.apply(this, arguments);\n};\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Channel = void 0;\nvar browser_clip_1 = require(\"./browser-clip\");\nvar utils_1 = require(\"./utils\");\n/**\n * Get the next logical position to play in the session\n * Tone has a build-in method `Tone.Transport.nextSubdivision('4n')`\n * but I think it s better to round off as follows for live performance\n */\nvar getNextPos = function (clip) {\n // TODO: (soon) convert to using transportPosTicks (fewer computations)\n var arr = Tone.Transport.position.split(':');\n // If we are still around 0:0:0x, then set start position to 0\n if (arr[0] === '0' && arr[1] === '0') {\n return 0;\n }\n // Else set it to the next bar\n var transportPosTicks = Tone.Transport.ticks;\n var align = (clip === null || clip === void 0 ? void 0 : clip.align) || '1m';\n var alignOffset = (clip === null || clip === void 0 ? void 0 : clip.alignOffset) || '0';\n var alignTicks = Tone.Ticks(align).toTicks();\n var alignOffsetTicks = Tone.Ticks(alignOffset).toTicks();\n var nextPosTicks = Tone.Ticks(Math.floor(transportPosTicks / alignTicks + 1) * alignTicks +\n alignOffsetTicks);\n // const nextPosBBS = nextPosTicks.toBarsBeatsSixteenths();\n // return nextPosBBS; // Extraneous computations\n return nextPosTicks;\n};\n/**\n * Channel\n * A channel is made up of a Tone.js Player/Instrument, one or more\n * Tone.js sequences (known as clips in Scribbletune)\n * & optionally a set of effects (with or without presets)\n *\n * API:\n * clips -> Get all clips for this channel\n * addClip -> Add a new clip to the channel\n * startClip -> Start a clip at the provided index\n * stopClip -> Stop a clip at the provided index\n * activeClipIdx -> Get the clip that is currently playing\n */\nvar Channel = /** @class */ (function () {\n function Channel(params) {\n var _this = this;\n this.idx = params.idx || 0;\n this.name = params.name || 'ch ' + params.idx;\n this.activePatternIdx = -1;\n this.channelClips = [];\n this.clipNoteCount = 0;\n // Filter out unrequired params and create clip params object\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var clips = params.clips, samples = params.samples, sample = params.sample, synth = params.synth, params1 = __rest(params, [\"clips\", \"samples\", \"sample\", \"synth\"]);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var external = params1.external, sampler = params1.sampler, buffer = params1.buffer, params2 = __rest(params1, [\"external\", \"sampler\", \"buffer\"]);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var player = params2.player, instrument = params2.instrument, volume = params2.volume, params3 = __rest(params2, [\"player\", \"instrument\", \"volume\"]);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var eventCb = params3.eventCb, playerCb = params3.playerCb, effects = params3.effects, params4 = __rest(params3, [\"eventCb\", \"playerCb\", \"effects\"]);\n var _a = params4.context, context = _a === void 0 ? Tone.getContext() : _a, originalParamsFiltered = __rest(params4, [\"context\"]);\n this.eventCbFn = eventCb;\n this.playerCbFn = playerCb;\n // Async section\n this.hasLoaded = false;\n this.hasFailed = false;\n this.initializerTask = this.initOutputProducer(context, params).then(function () {\n return _this.initInstrument(context, params).then(function () {\n return _this.adjustInstrument(context, params).then(function () {\n return _this.initEffects(context, params);\n });\n });\n });\n // End Async section\n // Sync section\n var clipsFailed = false;\n try {\n params.clips.forEach(function (c, i) {\n try {\n _this.addClip(__assign(__assign({}, c), originalParamsFiltered));\n }\n catch (e) {\n // Annotate the error with Clip info\n throw new Error(((0, utils_1.errorHasMessage)(e) ? e.message : e) + \" in clip \" + (i + 1));\n }\n }, this);\n }\n catch (e) {\n clipsFailed = e; // Stash the error\n }\n // End Sync section\n // Reconcile sync section with async section\n this.initializerTask\n .then(function () {\n if (clipsFailed) {\n throw clipsFailed;\n }\n _this.hasLoaded = true;\n _this.eventCb('loaded', {}); // Report async load completion.\n })\n .catch(function (e) {\n _this.hasFailed = e;\n _this.eventCb('error', { e: e }); // Report async errors.\n });\n }\n Channel.setTransportTempo = function (valueBpm) {\n Tone.Transport.bpm.value = valueBpm;\n };\n Channel.startTransport = function () {\n Tone.start();\n Tone.Transport.start();\n };\n Channel.stopTransport = function (deleteEvents) {\n if (deleteEvents === void 0) { deleteEvents = true; }\n Tone.Transport.stop();\n if (deleteEvents) {\n // Delete all events in the Tone.Transport\n Tone.Transport.cancel();\n }\n };\n Channel.prototype.setVolume = function (volume) {\n // ? this.volume = volume;\n var _a, _b;\n // Change volume of the player\n // if (this.player) {\n // this.player.volume.value = volume;\n // }\n // Change volume of the sampler\n // if (this.sampler) {\n // this.sampler.volume.value = volume;\n // }\n // Change volume of the instrument\n if (this.instrument) {\n this.instrument.volume.value = volume;\n }\n // Change volume of the external\n if (this.external) {\n (_b = (_a = this.external).setVolume) === null || _b === void 0 ? void 0 : _b.call(_a, volume);\n }\n };\n Channel.prototype.startClip = function (idx, position) {\n var _this = this;\n var clip = this.channelClips[idx];\n position = position || (position === 0 ? 0 : getNextPos(clip));\n // Stop any other currently running clip\n if (this.activePatternIdx > -1 && this.activePatternIdx !== idx) {\n this.stopClip(this.activePatternIdx, position);\n }\n if (clip && clip.state !== 'started') {\n // We need to schedule that for just before when clip?.start(position) events start coming.\n this.counterResetTask = Tone.Transport.scheduleOnce(function ( /* time: Tone.Seconds */) {\n _this.clipNoteCount = 0;\n }, position);\n this.activePatternIdx = idx;\n // clip?.stop(position); // DEBUG: trying to clear out start/stop events\n // clip?.clear(position); // DEBUG: trying to clear out events\n clip === null || clip === void 0 ? void 0 : clip.start(position);\n }\n };\n Channel.prototype.stopClip = function (idx, position) {\n var clip = this.channelClips[idx];\n position = position || (position === 0 ? 0 : getNextPos(clip));\n clip === null || clip === void 0 ? void 0 : clip.stop(position);\n if (idx === this.activePatternIdx) {\n this.activePatternIdx = -1;\n }\n };\n Channel.prototype.addClip = function (clipParams, idx) {\n var _this = this;\n idx = idx || this.channelClips.length;\n if (clipParams.pattern) {\n this.channelClips[idx] = (0, browser_clip_1.clip)(__assign({}, clipParams), this);\n // Pass certain clipParams into getNextPos()\n ['align', 'alignOffset'].forEach(function (key) {\n if (clipParams[key]) {\n _this.channelClips[idx][key] = clipParams[key];\n }\n });\n }\n else {\n // Allow creation of empty clips\n this.channelClips[idx] = null;\n }\n };\n /**\n * @param {Object} ClipParams clip parameters\n * @return {Function} function that can be used as the callback in Tone.Sequence https://tonejs.github.io/docs/Sequence\n */\n Channel.prototype.getSeqFn = function (params) {\n var _this = this;\n if (this.external) {\n return function (time, el) {\n var _a, _b;\n if (el === 'x' || el === 'R') {\n var counter = _this.clipNoteCount;\n if (_this.hasLoaded) {\n var note = (0, browser_clip_1.getNote)(el, params, counter)[0];\n var duration = (0, browser_clip_1.getDuration)(params, counter);\n var durSeconds = Tone.Time(duration).toSeconds();\n _this.playerCb({ note: note, duration: duration, time: time, counter: counter });\n try {\n (_b = (_a = _this.external).triggerAttackRelease) === null || _b === void 0 ? void 0 : _b.call(_a, note, durSeconds, time);\n }\n catch (e) {\n _this.eventCb('error', { e: e }); // Report play errors.\n }\n }\n _this.clipNoteCount++;\n }\n };\n }\n else if (this.instrument instanceof Tone.Player) {\n return function (time, el) {\n if (el === 'x' || el === 'R') {\n var counter = _this.clipNoteCount;\n if (_this.hasLoaded) {\n _this.playerCb({ note: '', duration: '', time: time, counter: counter });\n try {\n _this.instrument.start(time);\n }\n catch (e) {\n _this.eventCb('error', { e: e }); // Report play errors.\n }\n }\n _this.clipNoteCount++;\n }\n };\n }\n else if (this.instrument instanceof Tone.PolySynth ||\n this.instrument instanceof Tone.Sampler) {\n return function (time, el) {\n if (el === 'x' || el === 'R') {\n var counter = _this.clipNoteCount;\n if (_this.hasLoaded) {\n var note = (0, browser_clip_1.getNote)(el, params, counter);\n var duration = (0, browser_clip_1.getDuration)(params, counter);\n _this.playerCb({ note: note, duration: duration, time: time, counter: counter });\n try {\n _this.instrument.triggerAttackRelease(note, duration, time);\n }\n catch (e) {\n _this.eventCb('error', { e: e }); // Report play errors.\n }\n }\n _this.clipNoteCount++;\n }\n };\n }\n else if (this.instrument instanceof Tone.NoiseSynth) {\n return function (time, el) {\n if (el === 'x' || el === 'R') {\n var counter = _this.clipNoteCount;\n if (_this.hasLoaded) {\n var duration = (0, browser_clip_1.getDuration)(params, counter);\n _this.playerCb({ note: '', duration: duration, time: time, counter: counter });\n try {\n _this.instrument.triggerAttackRelease(duration, time);\n }\n catch (e) {\n _this.eventCb('error', { e: e }); // Report play errors.\n }\n }\n _this.clipNoteCount++;\n }\n };\n }\n else {\n return function (time, el) {\n if (el === 'x' || el === 'R') {\n var counter = _this.clipNoteCount;\n if (_this.hasLoaded) {\n var note = (0, browser_clip_1.getNote)(el, params, counter)[0];\n var duration = (0, browser_clip_1.getDuration)(params, counter);\n _this.playerCb({ note: note, duration: duration, time: time, counter: counter });\n try {\n _this.instrument.triggerAttackRelease(note, duration, time);\n }\n catch (e) {\n _this.eventCb('error', { e: e }); // Report play errors.\n }\n }\n _this.clipNoteCount++;\n }\n };\n }\n };\n Channel.prototype.eventCb = function (event, params) {\n if (typeof this.eventCbFn === 'function') {\n params.channel = this;\n this.eventCbFn(event, params);\n }\n };\n Channel.prototype.playerCb = function (params) {\n if (typeof this.playerCbFn === 'function') {\n params.channel = this;\n this.playerCbFn(params);\n }\n };\n /**\n * Check Tone.js object loaded state and either invoke `resolve` right away, or attach to and wait using Tone onload cb.\n * It's an ugly hack that reaches into Tone's internal ._buffers or ._buffer to insert itself into .onload() callback.\n * Tone has different ways to pull the onload callback from within to the API, so this implementation is very brittle.\n * The sole reason for its existence is to handle async loaded state of Tone instruments that we allow to pass in from outside.\n * If that option is eliminated, then this hacky function can be killed (or re-implemented via public onload API)\n * @param toneObject Tone.js object (will work with non-Tone objects that have same loaded/onload properties)\n * @param resolve onload callback\n */\n Channel.prototype.checkToneObjLoaded = function (toneObject, resolve) {\n var _this = this;\n var skipRecursion = toneObject instanceof Tone.Sampler; // Sampler has a Map of ToneAudioBuffer, and our method to find inner .onload() does not work since there is no single one.\n // eslint-disable-next-line no-prototype-builtins\n if ('loaded' in toneObject) {\n if (toneObject.loaded) {\n resolve();\n return;\n }\n if (skipRecursion) {\n return;\n }\n // Try Recursion into inner objects:\n var handled_1 = false;\n ['buffer', '_buffer', '_buffers'].forEach(function (key) {\n if (key in toneObject) {\n _this.checkToneObjLoaded(toneObject[key], resolve);\n handled_1 = true;\n }\n });\n if (handled_1) {\n return;\n }\n }\n // Check object type if it has load/onload (and _buffers or _buffer), then call resolve()\n // The list was created for Tone@14.8.0 by grepping and reviewing the source code.\n // Known objecs to have:\n var hasOnload = toneObject instanceof Tone.ToneAudioBuffer ||\n toneObject instanceof Tone.ToneBufferSource ||\n // Falback for \"future\" objects\n ('loaded' in toneObject && 'onload' in toneObject);\n if (!hasOnload) {\n // console.log('resolve() for ch \"%o\" idx %o onload NOT FOUND', this.name, this.idx);\n // This is not a good assumption. E.g. it does not work for Tone.ToneAudioBuffers\n resolve();\n }\n else {\n var oldOnLoad_1 = toneObject.onload;\n toneObject.onload = function () {\n if (oldOnLoad_1 && typeof oldOnLoad_1 === 'function') {\n toneObject.onload = oldOnLoad_1;\n oldOnLoad_1();\n }\n // console.log('resolve() for ch \"%o\" idx %o', this.name, this.idx);\n resolve();\n };\n }\n };\n Channel.prototype.recreateToneObjectInContext = function (toneObject, // Tone.PolySynth | Tone.Player | Tone.Sampler | Tone['' | '']\n context) {\n var _this = this;\n context = context || Tone.getContext();\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n return new Promise(function (resolve, reject) {\n // Tone.PolySynth | Tone.Player | Tone.Sampler | Tone['' | '']\n if (toneObject instanceof Tone.PolySynth) {\n var newObj_1 = Tone.PolySynth(Tone[toneObject._dummyVoice.name], __assign(__assign({}, toneObject.get()), { context: context }));\n _this.checkToneObjLoaded(newObj_1, function () { return resolve(newObj_1); });\n }\n else if (toneObject instanceof Tone.Player) {\n var newObj_2 = Tone.Player({\n url: toneObject._buffer,\n context: context,\n onload: function () { return _this.checkToneObjLoaded(newObj_2, function () { return resolve(newObj_2); }); },\n });\n }\n else if (toneObject instanceof Tone.Sampler) {\n var _a = toneObject.get(), attack = _a.attack, curve = _a.curve, release = _a.release, volume = _a.volume;\n var paramsFromSampler = {\n attack: attack,\n curve: curve,\n release: release,\n volume: volume,\n };\n var paramsFromBuffers = {\n baseUrl: toneObject._buffers.baseUrl,\n urls: Object.fromEntries(toneObject._buffers._buffers.entries()),\n };\n var newObj_3 = Tone.Sampler(__assign(__assign(__assign({}, paramsFromSampler), paramsFromBuffers), { context: context, onload: function () { return _this.checkToneObjLoaded(newObj_3, function () { return resolve(newObj_3); }); } }));\n }\n else {\n var newObj_4 = Tone[toneObject.name](__assign(__assign({}, toneObject.get()), { context: context, onload: function () { return _this.checkToneObjLoaded(newObj_4, function () { return resolve(newObj_4); }); } }));\n _this.checkToneObjLoaded(newObj_4, function () { return resolve(newObj_4); });\n }\n });\n };\n Channel.prototype.initOutputProducer = function (context, params) {\n var _this = this;\n context = context || Tone.getContext();\n return new Promise(function (resolve, reject) {\n /*\n * 1. The params object can be used to pass a sample (sound source) OR a synth(Synth/FMSynth/AMSynth etc) or samples.\n * Scribbletune will then create a Tone.js Player or Tone.js Instrument or Tone.js Sampler respectively\n * 2. It can also be used to pass a Tone.js Player object or instrument that was created elsewhere\n * (mostly by Scribbletune itself in the channel creation method)\n **/\n if (params.synth) {\n if (params.instrument) {\n throw new Error('Either synth or instrument can be provided, but not both.');\n }\n if (params.synth.synth) {\n var synthName = params.synth.synth;\n // const presetName = (params.synth as SynthParams).presetName; // Unused here\n var preset = params.synth.preset || {};\n _this.instrument = new Tone[synthName](__assign(__assign({}, preset), { context: context, \n // Use onload for cases when synthName calls out Tone.Sample/Player/Sampler.\n // It could be a universal way to load Tone.js instruments.\n onload: function () { return _this.checkToneObjLoaded(_this.instrument, resolve); } }));\n _this.checkToneObjLoaded(_this.instrument, resolve);\n }\n else {\n _this.instrument = params.synth; // TODO: This is dangerous by-reference assignment.\n console.warn('The \"synth\" parameter with instrument will be deprecated in the future. Please use the \"instrument\" parameter instead.');\n // params.synth describing the Tone[params.synth.synth] is allowed.\n _this.checkToneObjLoaded(_this.instrument, resolve);\n }\n }\n else if (typeof params.instrument === 'string') {\n _this.instrument = new Tone[params.instrument]({ context: context });\n _this.checkToneObjLoaded(_this.instrument, resolve);\n }\n else if (params.instrument) {\n _this.instrument = params.instrument; // TODO: This is dangerous by-reference assignment. Tone.instrument has context that holds all other instruments. Client side params get polluted with circular references. If params come from e.g. react-ApolloClient data, Apollo tools crash on circular references.\n _this.checkToneObjLoaded(_this.instrument, resolve);\n }\n else if (params.sample || params.buffer) {\n _this.instrument = new Tone.Player({\n url: params.sample || params.buffer,\n context: context,\n onload: function () { return _this.checkToneObjLoaded(_this.instrument, resolve); },\n });\n }\n else if (params.samples) {\n _this.instrument = new Tone.Sampler({\n urls: params.samples,\n context: context,\n onload: function () { return _this.checkToneObjLoaded(_this.instrument, resolve); },\n });\n }\n else if (params.sampler) {\n _this.instrument = params.sampler; // TODO: This is dangerous by-reference assignment.\n _this.checkToneObjLoaded(_this.instrument, resolve);\n }\n else if (params.player) {\n _this.instrument = params.player; // TODO: This is dangerous by-reference assignment.\n _this.checkToneObjLoaded(_this.instrument, resolve);\n }\n else if (params.external) {\n _this.external = __assign({}, params.external); // Sanitize object by shallow clone\n _this.instrument = {\n context: context,\n volume: { value: 0 },\n };\n // Do not call! this.checkToneObjLoaded(this.instrument, resolve);\n if (params.external.init) {\n return params.external\n .init(context.rawContext)\n .then(function () {\n resolve();\n })\n .catch(function (e) {\n var _a;\n reject(new Error(e.message + \" loading external output module of channel idx \" + _this.idx + \", \" + ((_a = _this.name) !== null && _a !== void 0 ? _a : '(no name)')));\n });\n }\n else {\n resolve();\n }\n }\n else {\n throw new Error('One of required synth|instrument|sample|sampler|samples|buffer|player|external is not provided!');\n }\n if (!_this.instrument) {\n throw new Error('Failed instantiating instrument from given params.');\n }\n });\n };\n Channel.prototype.initInstrument = function (context, params) {\n var _this = this;\n var _a;\n context = context || Tone.getContext();\n if (!params.external && ((_a = this.instrument) === null || _a === void 0 ? void 0 : _a.context) !== context) {\n return this.recreateToneObjectInContext(this.instrument, context).then(function (newObj) {\n _this.instrument = newObj;\n });\n }\n else {\n // Nothing to do\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n return new Promise(function (resolve, reject) {\n resolve();\n });\n }\n };\n Channel.prototype.adjustInstrument = function (context, params) {\n var _this = this;\n context = context || Tone.getContext();\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n return new Promise(function (resolve, reject) {\n if (params.volume) {\n // this.instrument.volume.value = params.volume;\n _this.setVolume(params.volume);\n }\n resolve();\n });\n };\n Channel.prototype.initEffects = function (context, params) {\n var _this = this;\n context = context || Tone.getContext();\n var createEffect = function (effect) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n return new Promise(function (resolve, reject) {\n if (typeof effect === 'string') {\n resolve(new Tone[effect]({ context: context }));\n }\n else if (effect.context !== context) {\n return _this.recreateToneObjectInContext(effect, context);\n }\n else {\n resolve(effect);\n }\n }).then(function (effectOut) {\n return effectOut.toDestination();\n });\n };\n var startEffect = function (eff) {\n return typeof eff.start === 'function' ? eff.start() : eff;\n };\n var toArray = function (someVal) {\n if (!someVal) {\n return [];\n }\n if (Array.isArray(someVal)) {\n return someVal;\n }\n return [someVal];\n };\n var effectsIn = toArray(params.effects);\n if (params.external) {\n if (effectsIn.length !== 0) {\n throw new Error('Effects cannot be used with external output');\n }\n return Promise.resolve();\n }\n // effects = params.effects.map(createEffect).map(startEffect);\n return Promise.all(effectsIn.map(createEffect))\n .then(function (results) { return results.map(startEffect); })\n .then(function (effects) {\n var _a;\n (_a = _this.instrument).chain.apply(_a, effects).toDestination();\n });\n };\n Object.defineProperty(Channel.prototype, \"clips\", {\n get: function () {\n return this.channelClips;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Channel.prototype, \"activeClipIdx\", {\n get: function () {\n return this.activePatternIdx;\n },\n enumerable: false,\n configurable: true\n });\n return Channel;\n}());\nexports.Channel = Channel;\n","\"use strict\";\n// global LiveAPI:true\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.midi = void 0;\nvar fs_1 = __importDefault(require(\"fs\"));\nvar jsmidgen = __importStar(require(\"jsmidgen\"));\n/**\n * Take an array of note objects to generate a MIDI file in the same location as this method is called\n * @param {NoteObject[]} notes Notes are in the format: {note: ['c3'], level: 127, length: 64}\n * @param {String | null} fileName If a filename is not provided, then `music.mid` is used by default\n * If `null` is passed for `fileName`, bytes are returned instead of creating a file\n * If this method is called from a browser then it will return a HTML link that you can append in your page\n * This link will enable the generated MIDI as a downloadable file.\n * @param {Number | null} bpm If a value is provided, the generated midi file will be set to this bpm value.\n */\nvar midi = function (notes, fileName, bpm) {\n if (fileName === void 0) { fileName = 'music.mid'; }\n var file = createFileFromNotes(notes, bpm);\n var bytes = file.toBytes();\n if (fileName === null) {\n return bytes;\n }\n if (!fileName.endsWith('.mid')) {\n fileName = fileName + '.mid';\n }\n if (typeof window !== 'undefined' &&\n window.URL &&\n window.URL.createObjectURL) {\n return createDownloadLink(bytes, fileName);\n }\n fs_1.default.writeFileSync(fileName, bytes, 'binary');\n console.log(\"MIDI file generated: \" + fileName + \".\");\n};\nexports.midi = midi;\n/**\n * Create a downloadable link\n * @param b\n */\nvar createDownloadLink = function (b, fileName) {\n // Convert bytes to array buffer\n // Accepted answer on https://stackoverflow.com/questions/35038884/download-file-from-bytes-in-javascript\n var bytes = new Uint8Array(b.length);\n for (var i = 0; i < b.length; i++) {\n var ascii = b.charCodeAt(i);\n bytes[i] = ascii;\n }\n // Create a Blob so that we can set it up with the type of file we want (for eg MIDI)\n var blob = new Blob([bytes], { type: 'audio/midi' });\n // Create a link element to be used (you can use an existing link on the page as well)\n var link = document.createElement('a');\n link.href =\n (typeof window !== 'undefined' &&\n typeof window.URL !== 'undefined' &&\n typeof window.URL.createObjectURL !== 'undefined' &&\n window.URL.createObjectURL(blob)) ||\n '';\n // Give the downloadable file a name\n link.download = fileName;\n link.innerText = 'Download MIDI file';\n return link;\n};\nvar createFileFromNotes = function (notes, bpm) {\n var file = new jsmidgen.File();\n var track = new jsmidgen.Track();\n // set the track's bpm if it is provided\n if (typeof bpm === 'number') {\n track.setTempo(bpm);\n }\n file.addTrack(track);\n for (var _i = 0, notes_1 = notes; _i < notes_1.length; _i++) {\n var noteObj = notes_1[_i];\n var level = noteObj.level || 127;\n // While writing chords (multiple notes per tick)\n // only the first noteOn (or noteOff) needs the complete arity of the function call\n // subsequent calls need only the first 2 args (channel and note)\n if (noteObj.note) {\n if (typeof noteObj.note === 'string') {\n track.noteOn(0, noteObj.note, noteObj.length, level); // channel, pitch(note), length, velocity\n track.noteOff(0, noteObj.note, noteObj.length, level);\n }\n else {\n track.addChord(0, noteObj.note, noteObj.length, level);\n }\n }\n else {\n track.noteOff(0, '', noteObj.length);\n }\n }\n return file;\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.progression = exports.getChordsByProgression = exports.getChordDegrees = void 0;\nvar harmonics_1 = require(\"harmonics\");\nvar utils_1 = require(\"./utils\");\n/**\n * Get the chords that go with a given scale/mode\n * This is useful only in case you want to check what chords work with a scale/mode\n * so that you can come up with chord progressions\n * @param {String} mode e.g. major\n * @return {Array} e.g.['I', 'ii', 'iii', 'IV', 'V', 'vi', 'vii°']\n */\nvar getChordDegrees = function (mode) {\n var theRomans = {\n ionian: ['I', 'ii', 'iii', 'IV', 'V', 'vi', 'vii°'],\n dorian: ['i', 'ii', 'III', 'IV', 'v', 'vi°', 'VII'],\n phrygian: ['i', 'II', 'III', 'iv', 'v°', 'VI', 'vii'],\n lydian: ['I', 'II', 'iii', 'iv°', 'V', 'vi', 'vii'],\n mixolydian: ['I', 'ii', 'iii°', 'IV', 'v', 'vi', 'VII'],\n aeolian: ['i', 'ii°', 'III', 'iv', 'v', 'VI', 'VII'],\n locrian: ['i°', 'II', 'iii', 'iv', 'V', 'VI', 'vii'],\n 'melodic minor': ['i', 'ii', 'III+', 'IV', 'V', 'vi°', 'vii°'],\n 'harmonic minor': ['i', 'ii°', 'III+', 'iv', 'V', 'VI', 'vii°'],\n };\n theRomans.major = theRomans.ionian;\n theRomans.minor = theRomans.aeolian;\n return theRomans[mode] || [];\n};\nexports.getChordDegrees = getChordDegrees;\nvar idxByDegree = {\n i: 0,\n ii: 1,\n iii: 2,\n iv: 3,\n v: 4,\n vi: 5,\n vii: 6,\n};\n/**\n * Get a chord name from degree\n * @param {String} roman e.g. ii OR ii° OR V7\n * @return {String} e.g. m OR m7b5 OR Maj7\n */\nvar getChordName = function (roman) {\n // remove any non character\n var str = roman.replace(/\\W/g, '');\n var prefix = 'M';\n // check if it s lowercase\n if (str.toLowerCase() === str) {\n prefix = 'm';\n }\n if (roman.indexOf('°') > -1) {\n return prefix + '7b5';\n }\n if (roman.indexOf('+') > -1) {\n return prefix + '#5';\n }\n if (roman.indexOf('7') > -1) {\n return prefix === 'M' ? 'maj7' : 'm7';\n }\n return prefix;\n};\n/**\n * Take the specified scale and degrees and return the chord names for them\n * These can be used as the value for the `notes` param of the `clip` method\n * @param {String} noteOctaveScale e.g. 'C4 major'\n * @param {String} chordDegress e.g. 'I IV V IV'\n * @return {String} e.g. 'CM FM GM FM'\n */\nvar getChordsByProgression = function (noteOctaveScale, chordDegress) {\n // Set the octave if missing\n // For example if the method was called with `C major` instead of `C4 major`, then add the 4\n var noteOctaveScaleArr = noteOctaveScale.split(' ');\n if (!noteOctaveScaleArr[0].match(/\\d/)) {\n noteOctaveScaleArr[0] += '4';\n noteOctaveScale = noteOctaveScaleArr.join(' ');\n }\n // Get the scale from the given note and scale/mode combination\n var mode = (0, harmonics_1.scale)(noteOctaveScale);\n var chordDegreesArr = chordDegress.replace(/\\s*,+\\s*/g, ' ').split(' ');\n // Now we have something like ['i', 'ii', 'IV']\n // Convert it to a chord family such as ['Cm', 'Dm', 'FM']\n var chordFamily = chordDegreesArr.map(function (roman) {\n var chordName = getChordName(roman); // e.g. m\n // get the index to be used by removing any digit or non alphabet character\n var scaleId = idxByDegree[roman.replace(/\\W|\\d/g, '').toLowerCase()]; // e.g. 0\n // get the note itself\n var note = mode[scaleId]; // e.g. C\n // get the octave of the note;\n var oct = note.replace(/\\D+/, ''); // e.g. 4\n // now get the chord\n return note.replace(/\\d/, '') + chordName + '_' + oct;\n });\n return chordFamily.toString().replace(/,/g, ' ');\n};\nexports.getChordsByProgression = getChordsByProgression;\nvar getProgFactory = function (_a) {\n var T = _a.T, P = _a.P, D = _a.D;\n return function (count) {\n if (count === void 0) { count = 4; }\n var chords = [];\n // Push root/tonic\n chords.push((0, utils_1.pickOne)(T));\n var i = 1;\n // Pick a predominant\n if (i < count - 1) {\n chords.push((0, utils_1.pickOne)(P));\n i++;\n }\n // Try another predominant\n if (i < count - 1 && (0, utils_1.dice)()) {\n chords.push((0, utils_1.pickOne)(P));\n i++;\n }\n // /////// 4 or more//////////\n if (i < count - 1) {\n // Pick a dominant\n chords.push((0, utils_1.pickOne)(D));\n i++;\n }\n if (i < count - 1) {\n // Pick a predominant\n chords.push((0, utils_1.pickOne)(P));\n i++;\n }\n if (i < count - 1) {\n // Pick a dominant\n chords.push((0, utils_1.pickOne)(D));\n i++;\n }\n // Pick a predominant if possible\n if (i < count - 1 && (0, utils_1.dice)()) {\n chords.push((0, utils_1.pickOne)(P));\n i++;\n }\n // //////////////////////////\n // Fill the rest with dominant\n while (i < count) {\n chords.push((0, utils_1.pickOne)(D));\n i++;\n }\n return chords;\n };\n};\nvar M = getProgFactory({ T: ['I', 'vi'], P: ['ii', 'IV'], D: ['V'] });\nvar m = getProgFactory({ T: ['i', 'VI'], P: ['ii', 'iv'], D: ['V'] });\n/**\n * Generate a chord progression based on basic music theory\n * where we follow tonic to optionally predominant and then dominant\n * and then randomly to predominant and continue this till we reach `count`\n * @param scaleType e.g. M (for major chord progression), m (for minor chord progression)\n * @param count e.g. 4\n */\nvar progression = function (scaleType, count) {\n if (count === void 0) { count = 4; }\n if (scaleType === 'major' || scaleType === 'M') {\n return M(count);\n }\n if (scaleType === 'minor' || scaleType === 'm') {\n return m(count);\n }\n return [];\n};\nexports.progression = progression;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Session = void 0;\nvar channel_1 = require(\"./channel\");\nvar Session = /** @class */ (function () {\n function Session(arr) {\n var _this = this;\n arr = arr || [];\n this.sessionChannels = arr.map(function (ch, i) {\n // Make sure ch.idx is not empty and unique in this.sessionChannels\n ch.idx = ch.idx || i;\n ch.idx = _this.uniqueIdx(_this.sessionChannels, ch.idx);\n return new channel_1.Channel(ch);\n });\n }\n // Return unique idx for given channels\n Session.prototype.uniqueIdx = function (channels, idx) {\n if (!channels) {\n return idx || 0;\n }\n // Channel idx's\n var idxs = channels.reduce(function (acc, c) {\n return (!acc.find(function (i) { return i === c.idx; }) && acc.concat(c.idx)) || acc;\n }, []);\n if (!idx || idxs.find(function (i) { return i === idx; })) {\n var newIdx_1 = channels.length;\n while (idxs.find(function (i) { return i === newIdx_1; })) {\n newIdx_1 = newIdx_1 + 1;\n }\n return newIdx_1;\n }\n return idx;\n };\n Session.prototype.createChannel = function (ch) {\n // Make sure ch.idx is unique in this.sessionChannels\n ch.idx = this.uniqueIdx(this.sessionChannels, ch.idx);\n var newChannel = new channel_1.Channel(ch);\n this.sessionChannels.push(newChannel);\n return newChannel;\n };\n Object.defineProperty(Session.prototype, \"channels\", {\n get: function () {\n return this.sessionChannels;\n },\n enumerable: false,\n configurable: true\n });\n Session.prototype.setTransportTempo = function (valueBpm) {\n channel_1.Channel.setTransportTempo(valueBpm);\n };\n Session.prototype.startTransport = function () {\n channel_1.Channel.startTransport();\n };\n Session.prototype.stopTransport = function (deleteEvents) {\n if (deleteEvents === void 0) { deleteEvents = true; }\n channel_1.Channel.stopTransport(deleteEvents);\n };\n // Start the clips at a specific index in all the channels\n Session.prototype.startRow = function (idx) {\n this.sessionChannels.forEach(function (ch) {\n ch.startClip(idx);\n });\n };\n Session.prototype.play = function (params) {\n var _this = this;\n var channelPatterns = params.channelPatterns;\n var clipDuration = params.clipDuration || '4:0:0';\n var clipDurationInSeconds = Tone.Time(clipDuration).toSeconds();\n var stopClips = function (clips, time) {\n clips.forEach(function (c) { return c.stop(time); });\n };\n var startClips = function (channelIdx, clipIdx, time) {\n return clipIdx === '-'\n ? []\n : _this.channels\n .filter(function (c) { return c.idx === channelIdx; })\n .map(function (c) { var _a; return (_a = c.clips[clipIdx]) === null || _a === void 0 ? void 0 : _a.start(time); });\n };\n channelPatterns.forEach(function (_a) {\n var channelIdx = _a.channelIdx, pattern = _a.pattern;\n var clips = [];\n var time = 0;\n var prevClipIdx = '-';\n pattern.split('').forEach(function (clipIdx) {\n if (clipIdx !== prevClipIdx && clipIdx !== '_') {\n stopClips(clips, time);\n clips = startClips(channelIdx, clipIdx, time);\n }\n prevClipIdx = clipIdx;\n time += clipDurationInSeconds;\n });\n stopClips(clips, time);\n });\n };\n return Session;\n}());\nexports.Session = Session;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.randomInt = exports.convertChordsToNotes = exports.convertChordToNotes = exports.errorHasMessage = exports.flat = exports.dice = exports.pickOne = exports.sizzleMap = exports.shuffle = exports.expandStr = exports.isNote = void 0;\nvar harmonics_1 = require(\"harmonics\");\n/**\n * Take a string input and check if it s a note name or not\n * @param {String} str Note name e.g. c4\n * @return {Boolean} Return true for c4 or return false for something like CM\n */\nvar isNote = function (str) {\n return /^[a-gA-G](?:#|b)?\\d$/.test(str);\n};\nexports.isNote = isNote;\n/**\n * Take a String input such as xxx[xx[xx]]\n * and return an Array as ['x', 'x', 'x', ['x', 'x', ['x', 'x']]]\n * @param {String} str\n * @return {Array}\n */\nvar expandStr = function (str) {\n str = JSON.stringify(str.split(''));\n str = str.replace(/,\"\\[\",/g, ', [');\n str = str.replace(/\"\\[\",/g, '[');\n str = str.replace(/,\"\\]\"/g, ']');\n return JSON.parse(str);\n};\nexports.expandStr = expandStr;\n/**\n * Basic Array randomizer\n * @param {Array} arr\n * @param {boolean} fullShuffle Ensure no elements remain in old place\n * @return {Array}\n */\nvar shuffle = function (arr, fullShuffle) {\n if (fullShuffle === void 0) { fullShuffle = true; }\n var lastIndex = arr.length - 1;\n // Shuffle algorithm by Richard Durstenfeld (Donald E. Knuth), also Ronald Fisher and Frank Yates.\n // \"Full Shuffle\" Modification to ensure no elements remain in their original place (by taking each element once\n // and swapping with any remaining elements)\n arr.forEach(function (el, idx) {\n if (idx >= lastIndex) {\n // No shuffling last element\n // One before last is always swapped with last at the end of the loop\n // Since previous swaps can move last element into other places, there is still a random shuffle of last element\n return;\n }\n // Swap el with one of the higher elements randomly\n var rnd = fullShuffle\n ? // Pick random number from idx+1 to lastIndex (Modified algorithm, (N-1)! combinations)\n // Math.random -> [0, 1) -> [0, lastIndex-idx ) --floor-> [0, lastIndex-idx-1]\n // rnd = [0, lastIndex-idx-1] + 1 + idx = [1 + idx, lastIndex]\n // (Original algorithm would pick rnd = [idx, lastIndex], thus any element could arrive back into its slot)\n Math.floor(Math.random() * (lastIndex - idx)) + 1 + idx\n : // Pick random number from idx to lastIndex (Unmodified Richard Durstenfeld, N! combinations)\n Math.floor(Math.random() * (lastIndex + 1 - idx)) + idx;\n arr[idx] = arr[rnd];\n arr[rnd] = el;\n });\n return arr;\n};\nexports.shuffle = shuffle;\n/**\n * Return an array of numbers relative to maxLevel || 127 ordered in a Sine wave format\n * This is used by the `sizzle` param of the `clip` method to add a rudimentary variation to the accent of each note\n * @param {Number} maxLevel A number between not more than 127\n * @return {Array} Example output [63, 90, 110, 127, 110, 90, 63, 0, 63, 90, 110, 127, 110, 90, 63, 0]\n */\nvar sizzleMap = function (maxLevel) {\n if (maxLevel === void 0) { maxLevel = 127; }\n var pi = Math.PI;\n var piArr = [\n pi / 6,\n pi / 4,\n pi / 3,\n pi / 2,\n (2 * pi) / 3,\n (3 * pi) / 4,\n (5 * pi) / 6,\n pi,\n ];\n var piArrRev = [\n 0,\n pi / 6,\n pi / 4,\n pi / 3,\n pi / 2,\n (2 * pi) / 3,\n (3 * pi) / 4,\n (5 * pi) / 6,\n ];\n piArrRev.reverse();\n var arr = piArr.concat(piArrRev);\n return arr.map(function (element) { return Math.round(Math.sin(element) * maxLevel); });\n};\nexports.sizzleMap = sizzleMap;\n/**\n * Pick one item randomly from an array and return it\n * @param arr\n */\nvar pickOne = function (arr) {\n return arr.length > 1 ? arr[Math.round(Math.random())] : arr[0];\n};\nexports.pickOne = pickOne;\n/**\n * Boolean generator\n */\nvar dice = function () { return !!Math.round(Math.random()); };\nexports.dice = dice;\n/**\n * Polyfill for Array.prototype.flat\n */\nvar flat = function (arr) {\n return arr.reduce(function (acc, val) { return acc.concat(val); }, []);\n};\nexports.flat = flat;\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\nvar errorHasMessage = function (x) {\n return typeof x.message === 'string';\n};\nexports.errorHasMessage = errorHasMessage;\n/**\n * 'el' could be an inlineChord() e.g. Cmaj7 or Dbsus2_5\n * or a chord() e.g. 'C3 M'\n */\nvar convertChordToNotes = function (el) {\n // Try both inlineChord() and chord()\n var c1;\n var c2;\n var e1;\n var e2;\n try {\n c1 = (0, harmonics_1.inlineChord)(el);\n }\n catch (e) {\n e1 = e;\n }\n try {\n c2 = (0, harmonics_1.chord)(el.replace(/_/g, ' ')); // chord() is not friendly to underscores\n }\n catch (e) {\n e2 = e;\n }\n if (!e1 && !e2) {\n // Both inlineChord() and chord() have result\n if (c1.toString() !== c2.toString()) {\n throw new Error(\"Chord \" + el + \" cannot decode, guessing \" + c1 + \" or \" + c2);\n }\n return c1;\n } // else\n if (!e1) {\n return c1;\n } // else\n if (!e2) {\n return c2;\n } // else\n // Give up, last try:\n return (0, harmonics_1.chord)(el);\n};\nexports.convertChordToNotes = convertChordToNotes;\nvar convertChordsToNotes = function (el) {\n if (typeof el === 'string' && (0, exports.isNote)(el)) {\n // A note needs to be an array so that it can accomodate chords or single notes with a single interface\n return [el];\n }\n if (Array.isArray(el)) {\n // This could be a chord provided as an array or an array of arrays\n el.forEach(function (n) {\n // This could be a chord provided as an array\n if (Array.isArray(n)) {\n // TODO: Can we convert it to something useful?\n // make sure it uses valid notes\n n.forEach(function (n1) {\n if (typeof n1 !== 'string' || !(0, exports.isNote)(n1)) {\n throw new TypeError('array of arrays must comprise valid notes');\n }\n });\n // throw new TypeError('cannot decode array of arrays');\n }\n else if (typeof n !== 'string' || !(0, exports.isNote)(n)) {\n // make sure it uses valid notes\n throw new TypeError('array must comprise valid notes');\n }\n });\n return el;\n // ? return el as (string | string[])[];\n }\n if (!Array.isArray(el)) {\n var c = (0, exports.convertChordToNotes)(el);\n if (c && c.length) {\n return c;\n }\n }\n throw new Error(\"Chord \" + el + \" not found\");\n};\nexports.convertChordsToNotes = convertChordsToNotes;\nvar randomInt = function (num) {\n if (num === void 0) { num = 1; }\n return Math.round(Math.random() * num);\n};\nexports.randomInt = randomInt;\n","module.exports = require(\"fs\");","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(765);\n"],"names":["mod","__defProp","Object","defineProperty","__getOwnPropDesc","getOwnPropertyDescriptor","__getOwnPropNames","getOwnPropertyNames","__hasOwnProp","prototype","hasOwnProperty","index_exports","target","all","name","get","enumerable","__export","chord","chords","getIndicesFromScale","inlineChord","scale","scales","module","exports","to","from","except","desc","key","call","__copyProps","value","sharpToFlatMap","CHROMATIC","scaleMap","ritusen","egyptian","pelog","kumoijoshi","hirajoshi","iwato","scriabin","augmented","piongio","prometheus","altered","lydian","locrian","ultralocrian","phrygian","balinese","aeolian","dorian","oriental","flamenco","mixolydian","persian","major","enigmatic","bebop","diminished","ichikosucho","chromatic","ionian","minor","Kanakangi","Ratnangi","Ganamurti","Vanaspati","Manavati","Tanarupi","Senavati","Hanumatodi","Dhenuka","Natakapriya","Kokilapriya","Rupavati","Gayakapriya","Vakulabharanam","Mayamalavagowla","Chakravakam","Suryakantam","Hatakambari","Jhankaradhwani","Natabhairavi","Keeravani","Kharaharapriya","Gourimanohari","Varunapriya","Mararanjani","Charukesi","Sarasangi","Harikambhoji","Dheerasankarabaranam","Naganandini","Yagapriya","Ragavardhini","Gangeyabhushani","Vagadheeswari","Shulini","Chalanata","Salagam","Jalarnavam","Jhalavarali","Navaneetam","Pavani","Raghupriya","Gavambhodi","Bhavapriya","Shubhapantuvarali","Shadvidamargini","Suvarnangi","Divyamani","Dhavalambari","Namanarayani","Kamavardhini","Ramapriya","Gamanashrama","Vishwambari","Shamalangi","Shanmukhapriya","Simhendramadhyamam","Hemavati","Dharmavati","Neetimati","Kantamani","Rishabhapriya","Latangi","Vachaspati","Mechakalyani","Chitrambari","Sucharitra","Dhatuvardani","Nasikabhushini","Kosalam","Rasikapriya","chordMap","sus4","M7sus4","aug","M7b6","M","maj7","Mb5","M7b5","mb6M7","m","m7","m6","mMaj7b6","dim","oM7","m7b5","dim7","o7M7","madd4","m7add11","sus2","sus24","M9sus4","Madd9","maj9","maj13","M7add13","M9b5","madd9","mM9","m9","m69","m13","mMaj9b6","m9b5","m11A","m11","b9sus","alt7","Maddb9","M7b9","mb6b9","_getNotesForScaleOrChord","scale2","chord2","input","SCALE_OR_CHORD","Error","rootOctaveScale","trim","indexOfFirstSpace","indexOf","scaleOrChord","rootOctave","slice","root","toUpperCase","charAt","sharpToFlat","replace","octave","isNaN","chroma","index","o1","map","n","o2","concat","getChromatic","acc","p1","p2","length","push","rootChord_Oct","B9SUS","includes","split","keys","scaleOrBitmap","str","intervals","i","Midi","exported","DEFAULT_VOLUME","Util","DEFAULT_DURATION","DEFAULT_CHANNEL","midi_letter_pitches","a","b","c","d","e","f","g","midiPitchFromNote","matches","exec","note","toLowerCase","accidental","parseInt","substr","ensureMidiPitch","p","test","midi_pitches_letter","midi_flattened_notes","noteFromMidiPitch","returnFlattened","noteName","noteNum","Math","floor","mpqnFromBpm","bpm","mpqn","ret","unshift","bpmFromMpqn","l","codes2Str","byteArray","String","fromCharCode","apply","str2Bytes","finalBytes","bytes","chars","translateTickTime","ticks","buffer","bList","MidiEvent","params","this","type","undefined","channel","param1","setTime","time","setType","setChannel","setParam1","setParam2","param2","NOTE_OFF","NOTE_ON","AFTER_TOUCH","CONTROLLER","PROGRAM_CHANGE","CHANNEL_AFTERTOUCH","PITCH_BEND","toBytes","typeChannelByte","MetaEvent","setData","data","SEQUENCE","TEXT","COPYRIGHT","TRACK_NAME","INSTRUMENT","LYRIC","MARKER","CUE_POINT","CHANNEL_PREFIX","END_OF_TRACK","TEMPO","SMPTE","TIME_SIG","KEY_SIG","SEQ_EVENT","t","Array","isArray","dataBytes","x","charCodeAt","Track","config","events","START_BYTES","END_BYTES","addEvent","event","addNoteOn","noteOn","pitch","velocity","addNoteOff","noteOff","addNote","dur","addChord","forEach","setInstrument","instrument","setTempo","tempo","trackLength","eventBytes","startBytes","endBytes","lengthBytes","toString","File","tracks","HDR_CHUNKID","HDR_CHUNK_SIZE","HDR_TYPE0","HDR_TYPE1","addTrack","track","trackCount","Event","__spreadArray","pack","arguments","ar","arp","harmonics_1","utils_1","fillArr","arr","len","bumpOctave","el","oct","arr1","arr2","chordsOrParams","finalArr","count","order","match","TypeError","join","assign","filledArr_1","reorderedArr","idx","filledArr_2","errorHasMessage","message","__assign","s","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","step","next","rejected","result","done","then","__generator","body","y","_","label","sent","trys","ops","verb","Symbol","iterator","v","op","pop","clip","renderingDuration","totalPatternDuration","recursivelyApplyPatternToDurations","getDuration","getNote","defaultSubdiv","counter","randomNotes","randomInt","notes","durations","subdiv","patternArr","char","generateSequence","context","Tone","getContext","pattern","expandStr","Ticks","toSeconds","Sequence","callback","getSeqFn","subdivision","subdivOrLength","patternRegularNotesCount","filter","patternRandomNotesCount","patternNotesCount","notesCount","n1","n2","_a","smallest","largest","leastCommonMultiple","originalContext","ongoingRenderingCounter","shuffle","sizzle","sizzleReps","arpegiate","align","alignOffset","amp","accentLow","offlineRendering","convertChordsToNotes","duration","player","Player","loop","Offline","sequence","loaded","start","transport","setContext","offlineRenderingCallback","toDestination","sync","offlineRenderClip","__createBinding","create","o","k","k2","__exportStar","Session","midi","progression","getChordsByProgression","getChordDegrees","modes","mode","browser_clip_1","progression_1","arp_1","midi_1","session_1","__rest","getOwnPropertySymbols","propertyIsEnumerable","Channel","getNextPos","Transport","position","transportPosTicks","alignTicks","toTicks","alignOffsetTicks","_this","activePatternIdx","channelClips","clipNoteCount","clips","samples","sample","synth","params1","params2","external","sampler","params3","volume","eventCb","playerCb","params4","effects","originalParamsFiltered","eventCbFn","playerCbFn","hasLoaded","hasFailed","initializerTask","initOutputProducer","initInstrument","adjustInstrument","initEffects","clipsFailed","addClip","catch","setTransportTempo","valueBpm","startTransport","stopTransport","deleteEvents","stop","cancel","setVolume","_b","startClip","stopClip","state","counterResetTask","scheduleOnce","clipParams","durSeconds","Time","triggerAttackRelease","PolySynth","Sampler","NoiseSynth","checkToneObjLoaded","toneObject","skipRecursion","handled_1","ToneAudioBuffer","ToneBufferSource","oldOnLoad_1","onload","recreateToneObjectInContext","newObj_1","_dummyVoice","newObj_2","url","_buffer","paramsFromSampler","attack","curve","release","paramsFromBuffers","baseUrl","_buffers","urls","fromEntries","entries","newObj_3","newObj_4","synthName","preset","console","warn","init","rawContext","newObj","someVal","startEffect","eff","effectsIn","effect","effectOut","results","chain","configurable","__setModuleDefault","__importStar","__esModule","__importDefault","fs_1","jsmidgen","fileName","createFileFromNotes","endsWith","window","URL","createObjectURL","createDownloadLink","default","writeFileSync","log","Uint8Array","ascii","blob","Blob","link","document","createElement","href","download","innerText","file","_i","notes_1","noteObj","level","theRomans","idxByDegree","ii","iii","iv","vi","vii","noteOctaveScale","chordDegress","noteOctaveScaleArr","roman","chordName","prefix","getChordName","scaleId","getProgFactory","T","D","pickOne","dice","scaleType","channel_1","sessionChannels","ch","uniqueIdx","channels","idxs","reduce","find","newIdx_1","createChannel","newChannel","startRow","play","channelPatterns","clipDuration","clipDurationInSeconds","stopClips","channelIdx","prevClipIdx","clipIdx","startClips","convertChordToNotes","flat","sizzleMap","isNote","JSON","stringify","parse","fullShuffle","lastIndex","rnd","random","maxLevel","pi","PI","piArr","piArrRev","reverse","element","round","sin","val","c1","c2","e1","e2","num","require","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","id","__webpack_modules__","nmd","paths","children","__webpack_exports__"],"sourceRoot":""}
1
+ {"version":3,"sources":["../src/browser-index.ts","../src/arp.ts","../src/utils.ts","../src/channel/instrument-factory.ts","../src/channel/sequence-builder.ts","../src/clip-utils.ts","../src/browser-clip.ts","../src/midi.ts","../src/progression.ts","../src/channel/effects-chain.ts","../src/channel.ts","../src/session.ts"],"sourcesContent":["import { chord, chords, scale, scales } from 'harmonics';\nimport { arp } from './arp';\nimport { clip } from './browser-clip';\nimport { midi } from './midi';\nimport {\n getChordDegrees,\n getChordsByProgression,\n progression,\n} from './progression';\nimport { Session } from './session';\n\nexport * from './types';\nexport {\n scale,\n scale as mode,\n scales,\n scales as modes,\n chord,\n chords,\n clip,\n getChordDegrees,\n getChordsByProgression,\n progression,\n arp,\n midi,\n Session,\n};\n","import { inlineChord } from 'harmonics';\nimport type { ArpParams } from './types';\nimport { errorHasMessage } from './utils';\n\nconst DEFAULT_OCTAVE = 4;\n\n/**\n * Take an array and fill it with it s own elements in the next octave till it s of the specified `len`\n * @param {Array} arr e.g. ['a4', 'b4']\n * @param {Number} e.g. len 4\n * @return {Array} e.g. ['a4', 'b4', 'a5', 'b5']\n */\nconst fillArr = (arr: string[], len: number): string[] => {\n const bumpOctave = (el: string): string => {\n if (!el) {\n throw new Error('Empty element');\n }\n const note = el.replace(/\\d/, '');\n const oct = el.replace(/\\D/g, '') || DEFAULT_OCTAVE;\n if (!note) {\n throw new Error('Incorrect note');\n }\n return note + (+oct + 1);\n };\n\n // Create a couple of chord arrays with bumped octaves\n // so that something like [c3, e3, g4] turns into [c4, e4, g5] and [c5, e5, g6]\n const arr1 = arr.map(bumpOctave);\n const arr2 = arr1.map(bumpOctave);\n const finalArr = [...arr, ...arr1, ...arr2];\n\n // Slice and return only as much as required\n return finalArr.slice(0, len);\n};\n\n/**\n *\n * @param chordsOrParams a string that denotes space (comma?) separated chords to be used or an object with additional properties\n * By default, if this is a string, the count of notes generated is 8 and the order is ascending.\n * For instance arp('CM FM') will result in an array of notes [C4, E4, G4, F4, A4, C4, C5, E5]\n * You can even provide Params as an object.\n * For e.g. arp({count: 8, order: '10325476', chords: 'FM_4 Gm7b5_4 AbM_4 Bbm_4 Cm_5 DbM_5 EbM_5})\n */\nexport const arp = (chordsOrParams: string | ArpParams): string[] => {\n let finalArr: string[] = [];\n const params: ArpParams = {\n count: 4,\n order: '0123',\n chords: '',\n };\n\n if (typeof chordsOrParams === 'string') {\n params.chords = chordsOrParams;\n } else {\n if (chordsOrParams.order?.match(/\\D/g)) {\n throw new TypeError('Invalid value for order');\n }\n\n if (chordsOrParams.count > 8 || chordsOrParams.count < 2) {\n throw new TypeError('Invalid value for count');\n }\n\n // Provision a order for the notes in case only count was provided\n if (chordsOrParams.count && !chordsOrParams.order) {\n params.order = Array.from(Array(chordsOrParams.count).keys()).join('');\n }\n Object.assign(params, chordsOrParams);\n }\n\n // Chords can be passed as a string, e.g. 'CM_4 FM_4'\n // or as an array of notes arrays e.g. [['C3', 'E3', 'G3', 'B3'], ['F3', 'A3', 'C4', 'E4']]\n if (typeof params.chords === 'string') {\n const chordsArr: string[] = params.chords.split(' ');\n chordsArr.forEach((c, i) => {\n try {\n const filledArr = fillArr(inlineChord(c), params.count);\n // reorder the filledArr as per params.order\n const reorderedArr = (params.order as string)\n .split('')\n .map((idx: string) => filledArr[Number(idx)]);\n finalArr = [...finalArr, ...reorderedArr];\n } catch (_e) {\n throw new Error(\n `Cannot decode chord ${i + 1} \"${c}\" in given \"${params.chords}\"`\n );\n }\n });\n } else if (Array.isArray(params.chords)) {\n params.chords.forEach((c, i) => {\n try {\n const filledArr = fillArr(c as string[], params.count);\n // reorder the filledArr as per params.order\n const reorderedArr = (params.order as string)\n .split('')\n .map((idx: string) => filledArr[Number(idx)]);\n finalArr = [...finalArr, ...reorderedArr];\n } catch (e) {\n throw new Error(\n `${errorHasMessage(e) ? e.message : e} in chord ${i + 1} \"${c}\"`\n );\n }\n });\n } else {\n throw new TypeError('Invalid value for chords');\n }\n\n return finalArr;\n};\n","import { chord, inlineChord } from 'harmonics';\nimport type { PatternElement } from './types';\n\n/**\n * Take a string input and check if it s a note name or not\n * @param {String} str Note name e.g. c4\n * @return {Boolean} Return true for c4 or return false for something like CM\n */\nexport const isNote = (str: string): boolean =>\n /^[a-gA-G](?:#|b)?\\d$/.test(str);\n\n/**\n * Take a String input such as xxx[xx[xx]]\n * and return an Array as ['x', 'x', 'x', ['x', 'x', ['x', 'x']]]\n * @param {String} str\n * @return {Array}\n */\nexport const expandStr = (str: string): PatternElement[] => {\n str = JSON.stringify(str.split(''));\n str = str.replace(/,\"\\[\",/g, ', [');\n str = str.replace(/\"\\[\",/g, '[');\n str = str.replace(/,\"\\]\"/g, ']');\n return JSON.parse(str);\n};\n\n/**\n * Basic Array randomizer\n * @param {Array} arr\n * @param {boolean} fullShuffle Ensure no elements remain in old place\n * @return {Array}\n */\nexport const shuffle = <T>(arr: T[], fullShuffle = true): T[] => {\n const lastIndex: number = arr.length - 1;\n\n // Shuffle algorithm by Richard Durstenfeld (Donald E. Knuth), also Ronald Fisher and Frank Yates.\n // \"Full Shuffle\" Modification to ensure no elements remain in their original place (by taking each element once\n // and swapping with any remaining elements)\n arr.forEach((el, idx: number) => {\n if (idx >= lastIndex) {\n // No shuffling last element\n // One before last is always swapped with last at the end of the loop\n // Since previous swaps can move last element into other places, there is still a random shuffle of last element\n return;\n }\n // Swap el with one of the higher elements randomly\n const rnd = fullShuffle\n ? // Pick random number from idx+1 to lastIndex (Modified algorithm, (N-1)! combinations)\n // Math.random -> [0, 1) -> [0, lastIndex-idx ) --floor-> [0, lastIndex-idx-1]\n // rnd = [0, lastIndex-idx-1] + 1 + idx = [1 + idx, lastIndex]\n // (Original algorithm would pick rnd = [idx, lastIndex], thus any element could arrive back into its slot)\n Math.floor(Math.random() * (lastIndex - idx)) + 1 + idx\n : // Pick random number from idx to lastIndex (Unmodified Richard Durstenfeld, N! combinations)\n Math.floor(Math.random() * (lastIndex + 1 - idx)) + idx;\n arr[idx] = arr[rnd];\n arr[rnd] = el;\n });\n\n return arr;\n};\n\n/**\n * Pick one item randomly from an array and return it\n * @param arr\n */\nexport const pickOne = <T = unknown>(arr: T[]): T =>\n arr[Math.floor(Math.random() * arr.length)];\n\n/**\n * Boolean generator\n */\nexport const dice = (): boolean => !!Math.round(Math.random());\n\n/** Type guard: check if a caught value has a string `message` property. */\nexport const errorHasMessage = (x: unknown): x is { message: string } => {\n return (\n typeof x === 'object' &&\n x !== null &&\n 'message' in x &&\n typeof (x as { message: unknown }).message === 'string'\n );\n};\n\n/**\n * 'el' could be an inlineChord() e.g. Cmaj7 or Dbsus2_5\n * or a chord() e.g. 'C3 M'\n */\nexport const convertChordToNotes = (el: string): string[] => {\n // Try both inlineChord() and chord()\n let c1: string[] | undefined;\n let c2: string[] | undefined;\n let e1: unknown;\n let e2: unknown;\n try {\n c1 = inlineChord(el);\n } catch (e) {\n e1 = e;\n }\n try {\n c2 = chord(el.replace(/_/g, ' ')); // chord() is not friendly to underscores\n } catch (e) {\n e2 = e;\n }\n\n if (!e1 && !e2) {\n // Both inlineChord() and chord() have result\n if (c1!.toString() !== c2!.toString()) {\n throw new Error(`Chord ${el} cannot decode, guessing ${c1} or ${c2}`);\n }\n return c1!;\n } // else\n if (!e1) {\n return c1!;\n } // else\n if (!e2) {\n return c2!;\n } // else\n\n // Give up, last try:\n return chord(el);\n};\n\n/**\n * Normalize a note, chord name, or array of notes into a string array.\n * Single notes become `['C4']`, chord names are expanded via harmonics.\n */\nexport const convertChordsToNotes = (\n el: string | (string | string[])[]\n): string[] => {\n if (typeof el === 'string' && isNote(el as string)) {\n // A note needs to be an array so that it can accomodate chords or single notes with a single interface\n return [el];\n }\n\n if (Array.isArray(el)) {\n // This could be a chord provided as an array or an array of arrays\n el.forEach(n => {\n // This could be a chord provided as an array\n if (Array.isArray(n)) {\n // TODO: Can we convert it to something useful?\n // make sure it uses valid notes\n n.forEach(n1 => {\n if (typeof n1 !== 'string' || !isNote(n1)) {\n throw new TypeError('array of arrays must comprise valid notes');\n }\n });\n // throw new TypeError('cannot decode array of arrays');\n } else if (typeof n !== 'string' || !isNote(n)) {\n // make sure it uses valid notes\n throw new TypeError('array must comprise valid notes');\n }\n });\n\n return el as string[];\n // ? return el as (string | string[])[];\n }\n\n if (!Array.isArray(el)) {\n const c = convertChordToNotes(el);\n if (c?.length) {\n return c;\n }\n }\n\n throw new Error(`Chord ${el} not found`);\n};\n\n/** Return a random integer from 0 to `num` (inclusive). */\nexport const randomInt = (num = 1): number => Math.round(Math.random() * num);\n","import type { ChannelParams, SynthParams } from '../types';\nimport { errorHasMessage } from '../utils';\n\n/**\n * Check Tone.js object loaded state and either invoke `resolve` right away, or attach to and wait using Tone onload cb.\n * It's an ugly hack that reaches into Tone's internal ._buffers or ._buffer to insert itself into .onload() callback.\n * Tone has different ways to pull the onload callback from within to the API, so this implementation is very brittle.\n * The sole reason for its existence is to handle async loaded state of Tone instruments that we allow to pass in from outside.\n * If that option is eliminated, then this hacky function can be killed (or re-implemented via public onload API)\n * @param toneObject Tone.js object (will work with non-Tone objects that have same loaded/onload properties)\n * @param resolve onload callback\n */\nexport function checkToneObjLoaded(\n toneObject: ToneLoadable,\n resolve: () => void\n): void {\n const skipRecursion = toneObject instanceof Tone.Sampler; // Sampler has a Map of ToneAudioBuffer, and our method to find inner .onload() does not work since there is no single one.\n\n if ('loaded' in toneObject) {\n if (toneObject.loaded) {\n resolve();\n return;\n }\n if (skipRecursion) {\n return;\n }\n // Try Recursion into inner objects:\n let handled = false;\n ['buffer', '_buffer', '_buffers'].forEach(key => {\n if (key in toneObject) {\n checkToneObjLoaded(toneObject[key] as ToneLoadable, resolve);\n handled = true;\n }\n });\n if (handled) {\n return;\n }\n }\n\n // Check object type if it has load/onload (and _buffers or _buffer), then call resolve()\n // The list was created for Tone@14.8.0 by grepping and reviewing the source code.\n // Known objecs to have:\n const hasOnload =\n toneObject instanceof Tone.ToneAudioBuffer ||\n toneObject instanceof Tone.ToneBufferSource ||\n // Falback for \"future\" objects\n ('loaded' in toneObject && 'onload' in toneObject);\n\n if (!hasOnload) {\n // This is not a good assumption. E.g. it does not work for Tone.ToneAudioBuffers\n resolve();\n } else {\n const oldOnLoad = toneObject.onload;\n toneObject.onload = () => {\n if (oldOnLoad && typeof oldOnLoad === 'function') {\n toneObject.onload = oldOnLoad;\n oldOnLoad();\n }\n resolve();\n };\n }\n}\n\n/** Clone a Tone instrument into a different audio context, waiting for it to load. */\nexport function recreateToneObjectInContext(\n toneObject: ToneInstrument,\n context: ToneAudioContext\n): Promise<ToneInstrument> {\n context = context || Tone.getContext();\n\n return new Promise<ToneInstrument>((resolve, _reject) => {\n if (toneObject instanceof Tone.PolySynth) {\n const newObj = new (Tone as unknown as ToneDynamic)[\n toneObject._dummyVoice.name\n ]({\n ...toneObject.get(),\n context,\n });\n checkToneObjLoaded(newObj as ToneLoadable, () => resolve(newObj));\n } else if (toneObject instanceof Tone.Player) {\n const newObj = new Tone.Player({\n url: toneObject._buffer,\n context,\n onload: () =>\n checkToneObjLoaded(newObj as ToneLoadable, () => resolve(newObj)),\n } as Record<string, unknown>);\n } else if (toneObject instanceof Tone.Sampler) {\n const { attack, curve, release, volume } = toneObject.get();\n const paramsFromSampler = {\n attack,\n curve,\n release,\n volume,\n };\n const paramsFromBuffers = {\n baseUrl: toneObject._buffers.baseUrl,\n urls: Object.fromEntries(toneObject._buffers._buffers.entries()),\n };\n const newObj = new Tone.Sampler({\n ...paramsFromSampler,\n ...paramsFromBuffers,\n context,\n onload: () =>\n checkToneObjLoaded(newObj as unknown as ToneLoadable, () =>\n resolve(newObj)\n ),\n } as Record<string, unknown>);\n } else {\n const newObj = new (Tone as unknown as ToneDynamic)[toneObject.name]({\n ...toneObject.get(),\n context,\n onload: () =>\n checkToneObjLoaded(newObj as ToneLoadable, () => resolve(newObj)),\n });\n checkToneObjLoaded(newObj as ToneLoadable, () => resolve(newObj));\n }\n });\n}\n\nexport interface InstrumentResult {\n instrument: ToneInstrument;\n external?: ExternalOutput;\n}\n\n/**\n * Create an instrument from channel params. The instrument is available\n * synchronously on the returned object; `initPromise` resolves once the\n * instrument is fully loaded, recreated in the correct context, and\n * volume-adjusted.\n */\nexport function createInstrument(\n context: ToneAudioContext,\n params: ChannelParams,\n channelMeta: { idx: number | string; name: string }\n): {\n instrument: ToneInstrument;\n external?: ExternalOutput;\n initPromise: Promise<ToneInstrument>;\n} {\n let instrument!: ToneInstrument;\n let external: ExternalOutput | undefined;\n\n context = context || Tone.getContext();\n\n const loadPromise = new Promise<void>((resolve, reject) => {\n /*\n * 1. The params object can be used to pass a sample (sound source) OR a synth(Synth/FMSynth/AMSynth etc) or samples.\n * Scribbletune will then create a Tone.js Player or Tone.js Instrument or Tone.js Sampler respectively\n * 2. It can also be used to pass a Tone.js Player object or instrument that was created elsewhere\n * (mostly by Scribbletune itself in the channel creation method)\n **/\n\n if (params.synth) {\n if (params.instrument) {\n throw new Error(\n 'Either synth or instrument can be provided, but not both.'\n );\n }\n if ((params.synth as SynthParams).synth) {\n const synthName = (params.synth as SynthParams).synth;\n const preset = (params.synth as SynthParams).preset || {};\n instrument = new (Tone as unknown as ToneDynamic)[synthName]({\n ...preset,\n context,\n // Use onload for cases when synthName calls out Tone.Sample/Player/Sampler.\n // It could be a universal way to load Tone.js instruments.\n onload: () => checkToneObjLoaded(instrument, resolve),\n // This onload is ignored in all synths. Therefore we call checkToneObjLoaded() again below.\n // It is safe to call resolve() multiple times for Promise<void>\n });\n checkToneObjLoaded(instrument, resolve);\n } else {\n instrument = params.synth as unknown as ToneInstrument; // TODO: This is dangerous by-reference assignment.\n console.warn(\n 'The \"synth\" parameter with instrument will be deprecated in the future. Please use the \"instrument\" parameter instead.'\n );\n // params.synth describing the Tone[params.synth.synth] is allowed.\n checkToneObjLoaded(instrument, resolve);\n }\n } else if (typeof params.instrument === 'string') {\n instrument = new (Tone as unknown as ToneDynamic)[\n params.instrument as string\n ]({ context });\n checkToneObjLoaded(instrument, resolve);\n } else if (params.instrument) {\n instrument = params.instrument; // TODO: This is dangerous by-reference assignment.\n checkToneObjLoaded(instrument, resolve);\n } else if (params.sample || params.buffer) {\n instrument = new Tone.Player({\n url: params.sample || params.buffer,\n context,\n onload: () => checkToneObjLoaded(instrument, resolve),\n });\n } else if (params.samples) {\n instrument = new Tone.Sampler({\n urls: params.samples,\n context,\n onload: () => checkToneObjLoaded(instrument, resolve),\n });\n } else if (params.sampler) {\n instrument = params.sampler; // TODO: This is dangerous by-reference assignment.\n checkToneObjLoaded(instrument, resolve);\n } else if (params.player) {\n instrument = params.player; // TODO: This is dangerous by-reference assignment.\n checkToneObjLoaded(instrument, resolve);\n } else if (params.external) {\n external = { ...params.external }; // Sanitize object by shallow clone\n instrument = {\n context,\n volume: { value: 0 },\n } as unknown as ToneInstrument;\n // Do not call! checkToneObjLoaded(instrument, resolve);\n\n if (params.external.init) {\n return params.external\n .init(context.rawContext)\n .then(() => {\n resolve();\n })\n .catch((e: unknown) => {\n reject(\n new Error(\n `${errorHasMessage(e) ? e.message : e} loading external output module of channel idx ${\n channelMeta.idx\n }, ${channelMeta.name ?? '(no name)'}`\n )\n );\n });\n } else {\n resolve();\n }\n } else {\n throw new Error(\n 'One of required synth|instrument|sample|sampler|samples|buffer|player|external is not provided!'\n );\n }\n\n if (!instrument) {\n throw new Error('Failed instantiating instrument from given params.');\n }\n });\n\n const initPromise = loadPromise\n .then(() => {\n // Recreate instrument in the target context if needed\n if (!external && instrument?.context !== context) {\n return recreateToneObjectInContext(instrument, context).then(newObj => {\n instrument = newObj;\n });\n }\n })\n .then(() => {\n // Adjust volume\n if (params.volume) {\n instrument.volume.value = params.volume;\n external?.setVolume?.(params.volume);\n }\n return instrument;\n });\n\n return { instrument, external, initPromise };\n}\n","import { getDuration, getNote } from '../browser-clip';\nimport type { ClipParams, SeqFn } from '../types';\n\n/** Subset of Channel properties needed by the sequence callback. */\nexport interface SequenceHost {\n instrument: ToneInstrument;\n external?: ExternalOutput;\n hasLoaded: boolean;\n clipNoteCount: number;\n}\n\n/**\n * Build the callback function for a Tone.Sequence based on the instrument type.\n * Returns a function that triggers notes/samples at each step of the sequence.\n */\nexport function buildSequenceCallback(\n params: ClipParams,\n host: SequenceHost,\n playerCb: (params: Record<string, unknown>) => void,\n eventCb: (event: string, params: Record<string, unknown>) => void\n): SeqFn {\n if (host.external) {\n const ext = host.external;\n return (time: string, el: string) => {\n if (el === 'x' || el === 'R') {\n const counter = host.clipNoteCount;\n if (host.hasLoaded) {\n const note = getNote(el, params, counter)[0] as string;\n const duration = getDuration(params, counter);\n const durSeconds = Tone.Time(duration).toSeconds();\n playerCb({ note, duration, time, counter });\n try {\n ext.triggerAttackRelease?.(note, durSeconds, time);\n } catch (e) {\n eventCb('error', { e }); // Report play errors.\n }\n }\n host.clipNoteCount++;\n }\n };\n }\n\n if (host.instrument instanceof Tone.Player) {\n return (time: string, el: string) => {\n if (el === 'x' || el === 'R') {\n const counter = host.clipNoteCount;\n if (host.hasLoaded) {\n playerCb({ note: '', duration: '', time, counter });\n try {\n host.instrument.start(time);\n } catch (e) {\n eventCb('error', { e }); // Report play errors.\n }\n }\n host.clipNoteCount++;\n }\n };\n }\n\n if (\n host.instrument instanceof Tone.PolySynth ||\n host.instrument instanceof Tone.Sampler\n ) {\n return (time: string, el: string) => {\n if (el === 'x' || el === 'R') {\n const counter = host.clipNoteCount;\n if (host.hasLoaded) {\n const note = getNote(el, params, counter) as string | string[];\n const duration = getDuration(params, counter);\n playerCb({ note, duration, time, counter });\n try {\n host.instrument.triggerAttackRelease(note, duration, time);\n } catch (e) {\n eventCb('error', { e }); // Report play errors.\n }\n }\n host.clipNoteCount++;\n }\n };\n }\n\n if (host.instrument instanceof Tone.NoiseSynth) {\n return (time: string, el: string) => {\n if (el === 'x' || el === 'R') {\n const counter = host.clipNoteCount;\n if (host.hasLoaded) {\n const duration = getDuration(params, counter);\n playerCb({ note: '', duration, time, counter });\n try {\n (host.instrument as Tone.NoiseSynth).triggerAttackRelease(\n duration,\n time\n );\n } catch (e) {\n eventCb('error', { e }); // Report play errors.\n }\n }\n host.clipNoteCount++;\n }\n };\n }\n\n return (time: string, el: string) => {\n if (el === 'x' || el === 'R') {\n const counter = host.clipNoteCount;\n if (host.hasLoaded) {\n const note = getNote(el, params, counter)[0] as string;\n const duration = getDuration(params, counter);\n playerCb({ note, duration, time, counter });\n try {\n host.instrument.triggerAttackRelease(note, duration, time);\n } catch (e) {\n eventCb('error', { e }); // Report play errors.\n }\n }\n host.clipNoteCount++;\n }\n };\n}\n","import type { ClipParams } from './types';\nimport { convertChordsToNotes, shuffle } from './utils';\n\nconst defaultParams: ClipParams = {\n notes: ['C4'],\n pattern: 'x',\n shuffle: false,\n sizzle: false,\n sizzleReps: 1,\n arpegiate: false,\n subdiv: '4n',\n amp: 100,\n accentLow: 70,\n randomNotes: null,\n offlineRendering: false,\n};\n\n/** Throw if the pattern string contains characters outside `x - _ [ ] R`. */\nexport const validatePattern = (pattern: string): void => {\n if (/[^x\\-_[\\]R]/.test(pattern)) {\n throw new TypeError(\n `pattern can only comprise x - _ [ ] R, found ${pattern}`\n );\n }\n};\n\n/**\n * Merge defaults into clip params, normalize notes/randomNotes from strings\n * to arrays, validate the pattern, and optionally shuffle notes.\n */\nexport const preprocessClipParams = (\n params: ClipParams,\n extraDefaults?: Partial<ClipParams>\n): ClipParams => {\n params = { ...defaultParams, ...extraDefaults, ...(params || {}) };\n\n // Notes: string → array\n if (typeof params.notes === 'string') {\n params.notes = params.notes.replace(/\\s{2,}/g, ' ').split(' ');\n }\n params.notes = params.notes ? params.notes.map(convertChordsToNotes) : [];\n\n // Pattern validation\n validatePattern(params.pattern);\n\n // Shuffle\n if (params.shuffle) {\n params.notes = shuffle(params.notes);\n }\n\n // Random notes preprocessing\n if (params.randomNotes && typeof params.randomNotes === 'string') {\n params.randomNotes = params.randomNotes.replace(/\\s{2,}/g, ' ').split(/\\s/);\n }\n if (params.randomNotes) {\n params.randomNotes = (params.randomNotes as string[]).map(\n convertChordsToNotes\n );\n }\n\n return params;\n};\n","import type { Channel } from './channel';\nimport { checkToneObjLoaded } from './channel/instrument-factory';\nimport {\n buildSequenceCallback,\n type SequenceHost,\n} from './channel/sequence-builder';\nimport { preprocessClipParams } from './clip-utils';\nimport type { ClipParams, PatternElement, SeqFn } from './types';\nimport { expandStr, randomInt } from './utils';\n\nconst defaultSubdiv = '4n';\nconst defaultDur = '8n';\n\n/** Get the note(s) for the current step, cycling through the notes array. */\nexport const getNote = (\n el: string,\n params: ClipParams,\n counter: number\n): string | (string | string[])[] => {\n if (el === 'R' && params.randomNotes && params.randomNotes.length > 0) {\n return params.randomNotes[randomInt(params.randomNotes.length - 1)];\n }\n if (params.notes) {\n return params.notes[counter % (params.notes.length || 1)];\n }\n return '';\n};\n\n/** Get the duration for the current step, cycling through the durations array. */\nexport const getDuration = (\n params: ClipParams,\n counter: number\n): string | number => {\n return params.durations\n ? params.durations[counter % params.durations.length]\n : params.dur || params.subdiv || defaultDur;\n};\n\n/**\n * Walk a nested pattern array and compute a flat list of note durations (in seconds).\n * Underscores (`_`) extend the previous note's duration.\n */\nexport const recursivelyApplyPatternToDurations = (\n patternArr: PatternElement[],\n length: number,\n durations: number[] = []\n): number[] => {\n patternArr.forEach(char => {\n if (typeof char === 'string') {\n if (char === 'x' || char === 'R') {\n durations.push(length);\n }\n if (char === '_' && durations.length) {\n durations[durations.length - 1] += length;\n }\n }\n if (Array.isArray(char)) {\n recursivelyApplyPatternToDurations(char, length / char.length, durations);\n }\n });\n return durations;\n};\n\n/**\n * Create a Tone.Sequence from clip parameters for live browser playback.\n * When a Channel is provided, uses its instrument. When omitted, creates a\n * standalone Tone.Player from `params.sample`.\n */\nconst generateSequence = (\n params: ClipParams,\n channel?: Channel,\n context?: ToneAudioContext\n): ToneSequence => {\n context = context || Tone.getContext();\n\n if (!params.pattern) {\n throw new Error('No pattern provided!');\n }\n\n if (!params.durations && !params.dur) {\n params.durations = recursivelyApplyPatternToDurations(\n expandStr(params.pattern),\n Tone.Ticks(params.subdiv || defaultSubdiv).toSeconds()\n );\n }\n\n let callback: SeqFn;\n\n if (channel) {\n // Channel-based path (existing behavior)\n callback = channel.getSeqFn(params);\n } else if (params.sample) {\n // Standalone sample-based path\n const player = new Tone.Player({ url: params.sample, context });\n player.toDestination();\n player.sync();\n\n const host: SequenceHost = {\n instrument: player,\n hasLoaded: false,\n clipNoteCount: 0,\n };\n\n checkToneObjLoaded(player as ToneLoadable, () => {\n host.hasLoaded = true;\n });\n\n const noop = () => {};\n callback = buildSequenceCallback(params, host, noop, noop);\n } else {\n throw new Error(\n 'Either a Channel or a sample URL must be provided to create a clip.'\n );\n }\n\n return new Tone.Sequence({\n callback,\n events: expandStr(params.pattern),\n subdivision: params.subdiv || defaultSubdiv,\n context,\n });\n};\n\n/** Calculate total duration (in seconds) of a pattern at the given subdivision. */\nexport const totalPatternDuration = (\n pattern: string,\n subdivOrLength: string | number\n): number => {\n return typeof subdivOrLength === 'number'\n ? subdivOrLength * expandStr(pattern).length\n : Tone.Ticks(subdivOrLength).toSeconds() * expandStr(pattern).length;\n};\n\n/** Compute the least common multiple of two positive integers. */\nconst leastCommonMultiple = (n1: number, n2: number): number => {\n const [smallest, largest] = n1 < n2 ? [n1, n2] : [n2, n1];\n let i = largest;\n while (i % smallest !== 0) {\n i += largest;\n }\n return i;\n};\n\n/**\n * Calculate the minimum duration (in seconds) needed to offline-render a clip\n * so that all notes cycle through completely.\n */\nexport const renderingDuration = (\n pattern: string,\n subdivOrLength: string | number,\n notes: string | (string | string[])[],\n randomNotes: undefined | null | string | (string | string[])[]\n): number => {\n const patternRegularNotesCount = pattern.split('').filter(c => {\n return c === 'x';\n }).length;\n const patternRandomNotesCount = pattern.split('').filter(c => {\n return c === 'R';\n }).length;\n const patternNotesCount = randomNotes?.length\n ? patternRegularNotesCount\n : patternRegularNotesCount + patternRandomNotesCount;\n const notesCount = notes.length || 1;\n return (\n (totalPatternDuration(pattern, subdivOrLength) / patternNotesCount) *\n leastCommonMultiple(notesCount, patternNotesCount)\n );\n};\n\nlet ongoingRenderingCounter = 0;\nlet originalContext: ToneAudioContext | undefined;\n\n/** Render a clip offline into a Tone.Player buffer for later playback. */\nconst offlineRenderClip = (params: ClipParams, duration: number) => {\n if (!originalContext) {\n originalContext = Tone.getContext();\n }\n ongoingRenderingCounter++;\n const player = new Tone.Player({ context: originalContext, loop: true });\n Tone.Offline(async (context: ToneAudioContext): Promise<void> => {\n const sequence = generateSequence(params, context as unknown as Channel);\n await Tone.loaded();\n sequence.start();\n context.transport.start();\n }, duration).then((buffer: ToneLoadable) => {\n player.buffer = buffer;\n ongoingRenderingCounter--;\n if (ongoingRenderingCounter === 0) {\n Tone.setContext(originalContext!);\n params.offlineRenderingCallback?.();\n }\n });\n player.toDestination();\n player.sync();\n return player;\n};\n\n/**\n * @param {Object}\n * @return {Tone.js Sequence Object}\n * Take a object literal that may have a Tone.js player OR instrument\n * or simply a sample or synth with a pattern and return a Tone.js sequence\n */\nexport const clip = (\n params: ClipParams,\n channel?: Channel\n): ToneSequence | ToneInstrument => {\n params = preprocessClipParams(params, { align: '1m', alignOffset: '0' });\n\n if (params.offlineRendering) {\n return offlineRenderClip(\n params,\n renderingDuration(\n params.pattern,\n params.subdiv || defaultSubdiv,\n params.notes || [],\n params.randomNotes\n )\n );\n }\n return generateSequence(params, channel, originalContext);\n};\n","import fs from 'node:fs';\nimport { File, Track } from '@scribbletune/midi';\nimport type { NoteObject } from './types';\n\n/**\n * Take an array of note objects to generate a MIDI file in the same location as this method is called\n * @param {NoteObject[]} notes Notes are in the format: {note: ['c3'], level: 127, length: 64}\n * @param {String | null} fileName If a filename is not provided, then `music.mid` is used by default\n * If `null` is passed for `fileName`, bytes are returned instead of creating a file\n * If this method is called from a browser then it will return a HTML link that you can append in your page\n * This link will enable the generated MIDI as a downloadable file.\n * @param {Number | null} bpm If a value is provided, the generated midi file will be set to this bpm value.\n */\nexport const midi = (\n notes: NoteObject[],\n fileName: string | null = 'music.mid',\n bpm?: number\n): string | HTMLAnchorElement | undefined => {\n const file = createFileFromNotes(notes, bpm);\n const bytes = file.toBytes();\n\n if (fileName === null) {\n return bytes;\n }\n\n if (!fileName.endsWith('.mid')) {\n fileName = `${fileName}.mid`;\n }\n\n if (\n typeof window !== 'undefined' &&\n window.URL &&\n typeof window.URL.createObjectURL === 'function'\n ) {\n return createDownloadLink(bytes, fileName);\n }\n\n fs.writeFileSync(fileName, bytes, 'binary');\n console.log(`MIDI file generated: ${fileName}.`);\n};\n\n/**\n * Create a downloadable link\n * @param b\n */\nconst createDownloadLink = (b: string, fileName: string): HTMLAnchorElement => {\n // Convert bytes to array buffer\n // Accepted answer on https://stackoverflow.com/questions/35038884/download-file-from-bytes-in-javascript\n const bytes = new Uint8Array(b.length);\n for (let i = 0; i < b.length; i++) {\n const ascii = b.charCodeAt(i);\n bytes[i] = ascii;\n }\n\n // Create a Blob so that we can set it up with the type of file we want (for eg MIDI)\n const blob = new Blob([bytes], { type: 'audio/midi' });\n\n // Create a link element to be used (you can use an existing link on the page as well)\n const link = document.createElement('a');\n link.href =\n (typeof window !== 'undefined' &&\n typeof window.URL !== 'undefined' &&\n typeof window.URL.createObjectURL !== 'undefined' &&\n window.URL.createObjectURL(blob)) ||\n '';\n\n // Give the downloadable file a name\n link.download = fileName;\n link.innerText = 'Download MIDI file';\n\n return link;\n};\n\n/** Build a MIDI File with a single track from the given note objects. */\nconst createFileFromNotes = (notes: NoteObject[], bpm?: number) => {\n const file = new File();\n const track = new Track();\n\n // set the track's bpm if it is provided\n if (typeof bpm === 'number') {\n track.setTempo(bpm);\n }\n\n file.addTrack(track);\n\n for (const noteObj of notes) {\n const level = noteObj.level || 127;\n // While writing chords (multiple notes per tick)\n // only the first noteOn (or noteOff) needs the complete arity of the function call\n // subsequent calls need only the first 2 args (channel and note)\n if (noteObj.note) {\n if (typeof noteObj.note === 'string') {\n track.noteOn(0, noteObj.note, noteObj.length, level); // channel, pitch(note), length, velocity\n track.noteOff(0, noteObj.note, noteObj.length, level);\n } else {\n track.addChord(0, noteObj.note, noteObj.length, level);\n }\n } else {\n track.noteOff(0, '', noteObj.length);\n }\n }\n\n return file;\n};\n","import { scale } from 'harmonics';\nimport type { NVP, ProgressionScale, TPD } from './types';\nimport { dice, pickOne } from './utils';\n\n/**\n * Get the chords that go with a given scale/mode\n * This is useful only in case you want to check what chords work with a scale/mode\n * so that you can come up with chord progressions\n * @param {String} mode e.g. major\n * @return {Array} e.g.['I', 'ii', 'iii', 'IV', 'V', 'vi', 'vii°']\n */\nexport const getChordDegrees = (mode: string): string[] => {\n const theRomans: NVP<string[]> = {\n ionian: ['I', 'ii', 'iii', 'IV', 'V', 'vi', 'vii°'],\n dorian: ['i', 'ii', 'III', 'IV', 'v', 'vi°', 'VII'],\n phrygian: ['i', 'II', 'III', 'iv', 'v°', 'VI', 'vii'],\n lydian: ['I', 'II', 'iii', 'iv°', 'V', 'vi', 'vii'],\n mixolydian: ['I', 'ii', 'iii°', 'IV', 'v', 'vi', 'VII'],\n aeolian: ['i', 'ii°', 'III', 'iv', 'v', 'VI', 'VII'],\n locrian: ['i°', 'II', 'iii', 'iv', 'V', 'VI', 'vii'],\n 'melodic minor': ['i', 'ii', 'III+', 'IV', 'V', 'vi°', 'vii°'],\n 'harmonic minor': ['i', 'ii°', 'III+', 'iv', 'V', 'VI', 'vii°'],\n };\n theRomans.major = theRomans.ionian;\n theRomans.minor = theRomans.aeolian;\n\n return theRomans[mode] || [];\n};\n\nconst idxByDegree: NVP<number> = {\n i: 0,\n ii: 1,\n iii: 2,\n iv: 3,\n v: 4,\n vi: 5,\n vii: 6,\n};\n\n/**\n * Get a chord name from degree\n * @param {String} roman e.g. ii OR ii° OR V7\n * @return {String} e.g. m OR m7b5 OR Maj7\n */\nconst getChordName = (roman: string): string => {\n // remove any non character\n const str = roman.replace(/\\W/g, '');\n let prefix = 'M';\n // check if it s lowercase\n if (str.toLowerCase() === str) {\n prefix = 'm';\n }\n if (roman.indexOf('°') > -1) {\n return `${prefix}7b5`;\n }\n if (roman.indexOf('+') > -1) {\n return `${prefix}#5`;\n }\n\n if (roman.indexOf('7') > -1) {\n return prefix === 'M' ? 'maj7' : 'm7';\n }\n\n return prefix;\n};\n\n/**\n * Take the specified scale and degrees and return the chord names for them\n * These can be used as the value for the `notes` param of the `clip` method\n * @param {String} noteOctaveScale e.g. 'C4 major'\n * @param {String} chordDegress e.g. 'I IV V IV'\n * @return {String} e.g. 'CM FM GM FM'\n */\nexport const getChordsByProgression = (\n noteOctaveScale: string,\n chordDegress: string\n): string => {\n // Set the octave if missing\n // For example if the method was called with `C major` instead of `C4 major`, then add the 4\n const noteOctaveScaleArr = noteOctaveScale.split(' ');\n if (!noteOctaveScaleArr[0].match(/\\d/)) {\n noteOctaveScaleArr[0] += '4';\n noteOctaveScale = noteOctaveScaleArr.join(' ');\n }\n\n // Get the scale from the given note and scale/mode combination\n const mode = scale(noteOctaveScale);\n const chordDegreesArr = chordDegress.replace(/\\s*,+\\s*/g, ' ').split(' ');\n // Now we have something like ['i', 'ii', 'IV']\n // Convert it to a chord family such as ['Cm', 'Dm', 'FM']\n const chordFamily = chordDegreesArr.map(roman => {\n const chordName = getChordName(roman); // e.g. m\n // get the index to be used by removing any digit or non alphabet character\n const scaleId = idxByDegree[roman.replace(/\\W|\\d/g, '').toLowerCase()]; // e.g. 0\n // get the note itself\n const note = mode[scaleId]; // e.g. C\n // get the octave of the note;\n const oct = note.replace(/\\D+/, ''); // e.g. 4\n // now get the chord\n return `${note.replace(/\\d/, '') + chordName}_${oct}`;\n });\n\n return chordFamily.toString().replace(/,/g, ' ');\n};\n\n/** Create a progression generator that follows tonic -> predominant -> dominant flow. */\nconst getProgFactory = ({ T, P, D }: TPD) => {\n return (count = 4) => {\n const chords = [];\n\n // Push root/tonic\n chords.push(pickOne(T));\n\n let i = 1;\n\n // Pick a predominant\n if (i < count - 1) {\n chords.push(pickOne(P));\n i++;\n }\n\n // Try another predominant\n if (i < count - 1 && dice()) {\n chords.push(pickOne(P));\n i++;\n }\n\n // /////// 4 or more//////////\n if (i < count - 1) {\n // Pick a dominant\n chords.push(pickOne(D));\n i++;\n }\n\n if (i < count - 1) {\n // Pick a predominant\n chords.push(pickOne(P));\n i++;\n }\n\n if (i < count - 1) {\n // Pick a dominant\n chords.push(pickOne(D));\n i++;\n }\n\n // Pick a predominant if possible\n if (i < count - 1 && dice()) {\n chords.push(pickOne(P));\n i++;\n }\n // //////////////////////////\n\n // Fill the rest with dominant\n while (i < count) {\n chords.push(pickOne(D));\n i++;\n }\n\n return chords;\n };\n};\n\nconst M = getProgFactory({ T: ['I', 'vi'], P: ['ii', 'IV'], D: ['V'] });\nconst m = getProgFactory({ T: ['i', 'VI'], P: ['ii', 'iv'], D: ['V'] });\n\n/**\n * Generate a chord progression based on basic music theory\n * where we follow tonic to optionally predominant and then dominant\n * and then randomly to predominant and continue this till we reach `count`\n * @param scaleType e.g. M (for major chord progression), m (for minor chord progression)\n * @param count e.g. 4\n */\nexport const progression = (\n scaleType: ProgressionScale,\n count = 4\n): string[] => {\n if (scaleType === 'major' || scaleType === 'M') {\n return M(count);\n }\n\n if (scaleType === 'minor' || scaleType === 'm') {\n return m(count);\n }\n\n return [];\n};\n","import type { ChannelParams } from '../types';\nimport { recreateToneObjectInContext } from './instrument-factory';\n\n/** Create effects from channel params and chain them onto the instrument. */\nexport function initEffects(\n instrument: ToneInstrument,\n context: ToneAudioContext,\n params: ChannelParams\n): Promise<void> {\n context = context || Tone.getContext();\n\n const createEffect = (effect: string | ToneNode): Promise<ToneNode> => {\n return new Promise<ToneNode>((resolve, _reject) => {\n if (typeof effect === 'string') {\n resolve(\n new (Tone as unknown as ToneDynamic)[effect]({\n context,\n }) as unknown as ToneNode\n );\n } else if (effect.context !== context) {\n return recreateToneObjectInContext(\n effect as unknown as ToneInstrument,\n context\n );\n } else {\n resolve(effect);\n }\n }).then(effectOut => {\n return effectOut.toDestination();\n });\n };\n\n const startEffect = (eff: ToneNode) => {\n return typeof eff.start === 'function' ? eff.start() : eff;\n };\n\n const toArray = <T>(someVal: T | T[] | undefined): T[] => {\n if (!someVal) {\n return [];\n }\n if (Array.isArray(someVal)) {\n return someVal;\n }\n return [someVal];\n };\n\n const effectsIn = toArray(params.effects);\n if (params.external) {\n if (effectsIn.length !== 0) {\n throw new Error('Effects cannot be used with external output');\n }\n return Promise.resolve();\n }\n\n return Promise.all(effectsIn.map(createEffect))\n .then(results => results.map(startEffect))\n .then(effects => {\n instrument.chain(...effects).toDestination();\n });\n}\n","import { clip } from './browser-clip';\nimport { initEffects } from './channel/effects-chain';\nimport { createInstrument } from './channel/instrument-factory';\nimport { buildSequenceCallback } from './channel/sequence-builder';\nimport type {\n ChannelParams,\n ClipParams,\n EventFn,\n PlayerObserverFn,\n SeqFn,\n} from './types';\nimport { errorHasMessage } from './utils';\n\n/**\n * Get the next logical position to play in the session\n * Tone has a build-in method `Tone.Transport.nextSubdivision('4n')`\n * but I think it s better to round off as follows for live performance\n */\nconst getNextPos = (\n clip: null | { align?: string; alignOffset?: string }\n): number | ToneTicksValue => {\n const transportPosTicks = Tone.Transport.ticks;\n // If we are still in the first beat (bar 0, beat 0), start immediately\n if (transportPosTicks < Tone.Ticks('4n').toTicks()) {\n return 0;\n }\n\n // Else set it to the next aligned position\n const align = clip?.align || '1m';\n const alignOffset = clip?.alignOffset || '0';\n const alignTicks: number = Tone.Ticks(align).toTicks();\n const alignOffsetTicks: number = Tone.Ticks(alignOffset).toTicks();\n const nextPosTicks = Tone.Ticks(\n Math.floor(transportPosTicks / alignTicks + 1) * alignTicks +\n alignOffsetTicks\n );\n return nextPosTicks;\n};\n\n/**\n * Channel\n * A channel is made up of a Tone.js Player/Instrument, one or more\n * Tone.js sequences (known as clips in Scribbletune)\n * & optionally a set of effects (with or without presets)\n *\n * API:\n * clips -> Get all clips for this channel\n * addClip -> Add a new clip to the channel\n * startClip -> Start a clip at the provided index\n * stopClip -> Stop a clip at the provided index\n * activeClipIdx -> Get the clip that is currently playing\n */\nexport class Channel {\n idx: number | string;\n name: string;\n activePatternIdx: number;\n channelClips: (ToneSequence | null)[];\n clipNoteCount: number;\n counterResetTask: number | undefined;\n instrument!: ToneInstrument;\n external: ExternalOutput | undefined;\n initializerTask: Promise<void>;\n hasLoaded: boolean;\n hasFailed: boolean | Error;\n private eventCbFn: EventFn | undefined;\n private playerCbFn: PlayerObserverFn | undefined;\n constructor(params: ChannelParams) {\n this.idx = params.idx || 0;\n this.name = params.name || `ch ${params.idx}`;\n this.activePatternIdx = -1;\n this.channelClips = [];\n this.clipNoteCount = 0;\n\n // Filter out unrequired params and create clip params object\n\n const { clips, samples, sample, synth, ...params1 } = params;\n\n const { external, sampler, buffer, ...params2 } = params1;\n\n const { player, instrument, volume, ...params3 } = params2;\n\n const { eventCb, playerCb, effects, ...params4 } = params3;\n const { context = Tone.getContext(), ...originalParamsFiltered } = params4;\n\n this.eventCbFn = eventCb;\n this.playerCbFn = playerCb;\n\n // Async section\n this.hasLoaded = false;\n this.hasFailed = false;\n const result = createInstrument(context, params, {\n idx: this.idx,\n name: this.name,\n });\n this.instrument = result.instrument;\n this.external = result.external;\n this.initializerTask = result.initPromise.then(finalInstrument => {\n this.instrument = finalInstrument;\n return initEffects(this.instrument, context, params);\n });\n // End Async section\n\n // Sync section\n let clipsFailed: { message: string } | false = false;\n try {\n (params.clips ?? []).forEach((c: ClipParams, i: number) => {\n try {\n this.addClip({\n ...c,\n ...originalParamsFiltered,\n });\n } catch (e) {\n // Annotate the error with Clip info\n throw new Error(\n `${errorHasMessage(e) ? e.message : e} in clip ${i + 1}`\n );\n }\n }, this);\n } catch (e) {\n clipsFailed = e as { message: string }; // Stash the error\n }\n // End Sync section\n\n // Reconcile sync section with async section\n this.initializerTask\n .then(() => {\n if (clipsFailed) {\n throw clipsFailed;\n }\n this.hasLoaded = true;\n this.eventCb('loaded', {}); // Report async load completion.\n })\n .catch(e => {\n this.hasFailed = e;\n this.eventCb('error', { e }); // Report async errors.\n });\n }\n\n /** Set the global transport tempo in BPM. */\n static setTransportTempo(valueBpm: number): void {\n Tone.Transport.bpm.value = valueBpm;\n }\n\n /** Resume the audio context and start the global transport. */\n static startTransport(): void {\n Tone.start();\n Tone.Transport.start();\n }\n\n /**\n * Stop the global transport.\n * @param deleteEvents - If true (default), cancels all scheduled transport events.\n */\n static stopTransport(deleteEvents = true): void {\n Tone.Transport.stop();\n if (deleteEvents) {\n // Delete all events in the Tone.Transport\n Tone.Transport.cancel();\n }\n }\n\n /** Set the volume (in dB) of this channel's instrument and external output. */\n setVolume(volume: number): void {\n if (this.instrument) {\n this.instrument.volume.value = volume;\n }\n\n if (this.external) {\n this.external.setVolume?.(volume);\n }\n }\n\n /**\n * Start the clip at the given index, stopping any other active clip first.\n * @param idx - Clip index in this channel\n * @param position - Transport time to start at; defaults to the next aligned position\n */\n startClip(idx: number, position?: number | string | ToneTicksValue): void {\n const clip = this.channelClips[idx];\n position = position || (position === 0 ? 0 : getNextPos(clip));\n // Stop any other currently running clip\n if (this.activePatternIdx > -1 && this.activePatternIdx !== idx) {\n this.stopClip(this.activePatternIdx, position);\n }\n\n if (clip && clip.state !== 'started') {\n // We need to schedule that for just before when clip?.start(position) events start coming.\n this.counterResetTask = Tone.Transport.scheduleOnce(\n (/* time: Tone.Seconds */) => {\n this.clipNoteCount = 0;\n },\n position\n );\n\n this.activePatternIdx = idx;\n clip?.start(position);\n }\n }\n\n /**\n * Stop the clip at the given index.\n * @param idx - Clip index in this channel\n * @param position - Transport time to stop at; defaults to the next aligned position\n */\n stopClip(idx: number, position?: number | string | ToneTicksValue): void {\n const clip = this.channelClips[idx];\n position = position || (position === 0 ? 0 : getNextPos(clip));\n clip?.stop(position);\n if (idx === this.activePatternIdx) {\n this.activePatternIdx = -1;\n }\n }\n\n /**\n * Add a clip to this channel. If the clip has a pattern, a Tone.Sequence is\n * created; otherwise an empty (null) slot is reserved.\n * @param clipParams - Clip configuration\n * @param idx - Slot index; defaults to the next available position\n */\n addClip(clipParams: ClipParams, idx?: number): void {\n idx = idx || this.channelClips.length;\n if (clipParams.pattern) {\n this.channelClips[idx as number] = clip(\n {\n ...clipParams,\n },\n this\n ) as ToneSequence;\n // Pass certain clipParams into getNextPos()\n const seq = this.channelClips[idx as number];\n if (seq && clipParams.align) seq.align = clipParams.align;\n if (seq && clipParams.alignOffset)\n seq.alignOffset = clipParams.alignOffset;\n } else {\n // Allow creation of empty clips\n this.channelClips[idx as number] = null;\n }\n }\n\n /**\n * @param {Object} ClipParams clip parameters\n * @return {Function} function that can be used as the callback in Tone.Sequence https://tonejs.github.io/docs/Sequence\n */\n getSeqFn(params: ClipParams): SeqFn {\n return buildSequenceCallback(\n params,\n this,\n p => this.playerCb(p),\n (e, p) => this.eventCb(e, p)\n );\n }\n\n /** Invoke the user-provided event callback, if set. */\n private eventCb(event: string, params: Record<string, unknown>): void {\n if (typeof this.eventCbFn === 'function') {\n params.channel = this;\n this.eventCbFn(event, params);\n }\n }\n\n /** Invoke the user-provided player observer callback, if set. */\n private playerCb(params: Record<string, unknown>): void {\n if (typeof this.playerCbFn === 'function') {\n params.channel = this;\n this.playerCbFn(params);\n }\n }\n\n /** All clips (sequences) belonging to this channel. */\n get clips(): (ToneSequence | null)[] {\n return this.channelClips;\n }\n\n /** Index of the currently playing clip, or -1 if none. */\n get activeClipIdx(): number {\n return this.activePatternIdx;\n }\n}\n","import { Channel } from './channel';\nimport type { ChannelParams, ChannelPattern, PlayParams } from './types';\n\n/**\n * A Session manages multiple Channels and coordinates clip playback\n * across them, similar to a scene/row in a DAW.\n */\nexport class Session {\n sessionChannels: Channel[];\n\n /** Create a session, optionally pre-populated with channels. */\n constructor(arr: ChannelParams[]) {\n arr = arr || [];\n this.sessionChannels = arr.map((ch: ChannelParams, i: number) => {\n // Make sure ch.idx is not empty and unique in this.sessionChannels\n ch.idx = ch.idx || i;\n ch.idx = this.uniqueIdx(this.sessionChannels, ch.idx);\n return new Channel(ch);\n });\n }\n\n /** Return a unique channel index, generating a new one if `idx` is taken or missing. */\n uniqueIdx(channels: Channel[], idx?: string | number): string | number {\n if (!channels) {\n return idx || 0;\n }\n // Channel idx's\n const idxs = channels.reduce((acc: (string | number)[], c) => {\n return (!acc.find(i => i === c.idx) && acc.concat(c.idx)) || acc;\n }, []);\n\n if (!idx || idxs.find(i => i === idx)) {\n let newIdx = channels.length;\n while (idxs.find(i => i === newIdx)) {\n newIdx = newIdx + 1;\n }\n return newIdx;\n }\n\n return idx;\n }\n\n /** Create a new channel with a unique index and add it to the session. */\n createChannel(ch: ChannelParams): Channel {\n // Make sure ch.idx is unique in this.sessionChannels\n ch.idx = this.uniqueIdx(this.sessionChannels, ch.idx);\n const newChannel = new Channel(ch);\n this.sessionChannels.push(newChannel);\n return newChannel;\n }\n\n /** All channels in this session. */\n get channels(): Channel[] {\n return this.sessionChannels;\n }\n\n /** Set the global transport tempo in BPM. */\n setTransportTempo(valueBpm: number): void {\n Channel.setTransportTempo(valueBpm);\n }\n\n /** Resume the audio context and start the global transport. */\n startTransport(): void {\n Channel.startTransport();\n }\n\n /**\n * Stop the global transport.\n * @param deleteEvents - If true (default), cancels all scheduled transport events.\n */\n stopTransport(deleteEvents = true): void {\n Channel.stopTransport(deleteEvents);\n }\n\n /** Start the clip at the given index across all channels simultaneously. */\n startRow(idx: number): void {\n this.sessionChannels.forEach((ch: Channel) => {\n ch.startClip(idx);\n });\n }\n\n /**\n * Schedule clip playback across channels using a song-structure pattern.\n * Each channel pattern is a string where each character is a clip index\n * (or `-` for silence, `_` to sustain the previous clip).\n */\n play(params: PlayParams): void {\n const channelPatterns = params.channelPatterns;\n const clipDuration = params.clipDuration || '4:0:0';\n const clipDurationInSeconds: number = Tone.Time(clipDuration).toSeconds();\n\n const stopClips = (clips: ToneSequence[], time: number) => {\n clips.forEach(c => {\n c.stop(time);\n });\n };\n\n const startClips = (\n channelIdx: string | number,\n clipIdx: string,\n time: number\n ): ToneSequence[] => {\n if (clipIdx === '-') return [];\n const clips = this.channels\n .filter(c => c.idx === channelIdx)\n .map(c => c.clips[Number(clipIdx)])\n .filter((c): c is ToneSequence => c != null);\n for (const c of clips) c.start(time);\n return clips;\n };\n\n channelPatterns.forEach(({ channelIdx, pattern }: ChannelPattern) => {\n let clips: ToneSequence[] = [];\n let time = 0;\n let prevClipIdx = '-';\n pattern.split('').forEach((clipIdx: string) => {\n if (clipIdx !== prevClipIdx && clipIdx !== '_') {\n stopClips(clips, time);\n clips = startClips(channelIdx, clipIdx, time);\n }\n prevClipIdx = clipIdx;\n time += clipDurationInSeconds;\n });\n stopClips(clips, time);\n });\n }\n}\n"],"mappings":"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","names":["chord","scale","inlineChord","inlineChord","chords","clip"]}