{"version":3,"mappings":"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","names":["useFullScreenStore","defineStore","elementRef","fullScreenEnabled","ref","useI18n","manualFullScreenEnabled","mockFullScreenElement","mockFullScreenEnabledParent","mockFullScreenEnabledNextSibling","onFullScreenChange","fullscreenElement","watch","setElement","element","exitFullScreen","exitMockFullScreen","err","escape","useMagicKeys","watchEscapeHandle","enterMockFullScreen","e","enterFullScreen","wrapper","fs","store","useSongStore","beta","useBetaStore","newMidiControls","computed","onMounted","props","__props","iconClasses","classes","_a","dropdown","__expose","emit","__emit","onClick","textDiv","_typeof","obj","_classCallCheck","instance","Constructor","_defineProperties","target","i","descriptor","_createClass","protoProps","staticProps","Constants","allNotes","counter","_loop","noteGroup","note","Utils","_byte","byteArray","hex","_byte2","hexString","letters","_byte3","dec","currentByte","byteCount","result","number","b","_atob","atob","_x","string","Track","index","data","lastThreeBytes","tick","currentTick","dryRun","elapsedTicks","delta","eventReady","_event","eventStartIndex","varIntLength","varIntValue","eventJson","deltaByteCount","length","varQuantityByteLength","varQuantityByteValue","_varQuantityByteLength","_varQuantityByteValue","Player","eventHandler","buffer","path","arrayBuffer","dataUri","byteString","ia","trackOffset","trackLength","trackChunksByteLength","track","trackNumber","event","tempo","startTime","percent","seconds","songTime","a","playerEvent","fn","__defProp","__defProps","__getOwnPropDescs","__getOwnPropSymbols","__hasOwnProp","__propIsEnum","__defNormalProp","key","value","__spreadValues","prop","__spreadProps","__accessCheck","member","msg","__privateGet","getter","__privateAdd","__privateSet","setter","__privateMethod","method","__async","__this","__arguments","generator","resolve","reject","fulfilled","step","rejected","x","connectSerial","nodes","_nodes","left","right","createControl","initialValue","current","listeners","subscribe","listener","set","get","createTrigger","trigger","unsubscribeAll","unsubscribe","done","cb","midiVelToGain","vel","_volume","_sends","_inserts","_disconnect","_unsubscribe","_config","_disconnected","Channel","context","options","_b","_c","volume","volume2","effect","name","mixValue","mix","input","disconnect","send","send2","_items","SortedQueue","compare","item","len","mid","predicate","compose","getConfig","config","_config2","_queue","_intervalId","QueuedPlayer","player","sample","now","startAt","lookAhead","nextTick","sample2","time","stopId","_config3","_disconnected2","_stop","SamplePlayer","_d","_e","_f","_g","_h","_i","_j","_k","_l","_m","_n","source","cents","lpfCutoffHz","lpf","velocity","decayTime","decay","startDecay","createDecayEnvelope","stop","stopAt","gainCompensation","cleanup","_a2","duration","envelopeTime","envelope","start","envelopeAt","DefaultPlayer","channel","loadAudioBuffer","url","storage","response","audioData","error","findFirstSupportedFormat","formats","audio","format","canPlay","canPlay2","HttpStorage","noteNameToMidi","m","letter","acc","alt","oct","toMidi","BASE_URL2","_sampleToMidi","sampleToMidi_fn","SplendidGrandPiano","loader","splendidGrandPianoLoader","sampleOrNote","found","midi","layerIdx","LAYERS","layer2","layer","findNearestMidiInLayer","prefix","buffers","baseUrl","notesToLoad","layers","samples","_0","useMidiStore","instrument","debug","useDebug","mediaStore","useMediaPlayerStore","defaultBpm","ready","bpm","bpmFactor","timemap","playing","progressTime","autoScroll","fullMidiController","route","useRoute","rawMidi","progressPercent","formattedDuration","formatSeconds","formattedProgressTime","lastTick","loadInstrument","ac","init","MidiPlayer","setBpm","removeHighlights","updateVisualAtTick","qstampStart","qstampEnd","notesFound","t","n","drawRedLine","highlightNotes","unhighlightNotes","redLine","measureId","rect","lastPlayingPageElement","elementIds","ids","id","elements","system","page","scrollTop","systemRect","scrollPosition","pageRect","wrapperRect","pause","play","loadSong","togglePlay","skipToSeconds","preloadDataForPlayback","midiData","_timemap","_defaultBpm","clearSong","noteclick","noteId","entryIndex","restartSong","toggleAutoScroll","setAutoScroll","v","setFullMidiController","_bpm","wasPlaying","modals","useModalStore","songStore","midiStore","supportsShare","chordProNotAuthorized","chordProExists","onEmail","checkProductAuth","removeTooltip","onDownload","product","onPrint","onCopy","showCopied","asyncWait","onShare","action","productAuth","permissions","NoAuthReason","toggleFullScreen","copybtn","_cache","_openBlock","_createElementBlock","_hoisted_1","downloadFile","text","filename","saveAs","__vitePreload","blob","downloadUrl","downloadTextFile","sanitizeFilename","pattern"],"ignoreList":[6,7],"sources":["../../Vue/src/stores/FullScreenStore.ts","../../Vue/src/components/Common/FullScreenWrapper.vue","../../Vue/src/components/SheetMusic/Toolbar/ToolbarButtonGroup.vue","../../Vue/src/components/SheetMusic/Toolbar/ToolbarButtonDropdown.vue","../../Vue/src/components/SheetMusic/Toolbar/ToolbarButtonDropdownItem.vue","../../Vue/src/components/SheetMusic/Toolbar/ToolbarButton.vue","../../Vue/node_modules/midi-player-js/build/index.browser.js","../../Vue/node_modules/smplr/dist/index.mjs","../../Vue/src/stores/MidiStore.ts","../../Vue/src/components/SheetMusic/Toolbar/ToolbarActionBarControls.vue","../../Vue/src/components/SheetMusic/Toolbar/ToolbarButtonDropdownHeader.vue","../../Vue/src/functions/download.ts"],"sourcesContent":["import { WatchHandle } from \"vue\";\r\n\r\nexport const useFullScreenStore = defineStore(\"full-screen\", () => {\r\n let elementRef: Element | null = null;\r\n const fullScreenEnabled = ref(false);\r\n const { t } = useI18n();\r\n const manualFullScreenEnabled = ref(false);\r\n const mockFullScreenElement = ref(null);\r\n let mockFullScreenEnabledParent: HTMLElement | null = null;\r\n let mockFullScreenEnabledNextSibling: HTMLElement | null = null;\r\n\r\n function onFullScreenChange() {\r\n const fullscreenElement =\r\n document.fullscreenElement ||\r\n (document as any).mozFullScreenElement ||\r\n (document as any).webkitFullscreenElement ||\r\n (document as any).msFullscreenElement ||\r\n manualFullScreenEnabled.value ||\r\n mockFullScreenElement.value ||\r\n null;\r\n\r\n fullScreenEnabled.value = fullscreenElement != null;\r\n }\r\n\r\n document.addEventListener(\"fullscreenchange\", onFullScreenChange);\r\n document.addEventListener(\"webkitfullscreenchange\", onFullScreenChange);\r\n watch(mockFullScreenElement, onFullScreenChange);\r\n\r\n async function setElement(element: Element) {\r\n elementRef = element;\r\n }\r\n\r\n async function exitFullScreen() {\r\n if (mockFullScreenElement.value) {\r\n exitMockFullScreen();\r\n return;\r\n }\r\n try {\r\n if (document.exitFullscreen) {\r\n await document.exitFullscreen();\r\n } else if ((document as any).webkitExitFullscreen) {\r\n await (document as any).webkitExitFullscreen();\r\n } else {\r\n manualFullScreenEnabled.value = false;\r\n fullScreenEnabled.value = false;\r\n }\r\n } catch (err) {\r\n if (\r\n !(err as Error).message\r\n .toLowerCase()\r\n .includes(\"pending operation cancelled by\")\r\n ) {\r\n throw err;\r\n }\r\n }\r\n }\r\n\r\n const { escape } = useMagicKeys();\r\n let watchEscapeHandle: WatchHandle | null = null;\r\n\r\n function enterMockFullScreen(e: HTMLElement) {\r\n mockFullScreenElement.value = e;\r\n mockFullScreenEnabledParent = e.parentElement;\r\n mockFullScreenEnabledNextSibling = (e.nextSibling as HTMLElement) || null;\r\n document.body.appendChild(e);\r\n e.classList.add(\"mock-full-screen\");\r\n\r\n watchEscapeHandle = watch(escape, exitMockFullScreen);\r\n }\r\n\r\n function exitMockFullScreen() {\r\n if (!mockFullScreenElement.value) {\r\n return;\r\n }\r\n if (watchEscapeHandle) {\r\n watchEscapeHandle();\r\n watchEscapeHandle = null;\r\n }\r\n mockFullScreenElement.value.classList.remove(\"mock-full-screen\");\r\n mockFullScreenElement.value = null;\r\n if (mockFullScreenEnabledParent && mockFullScreenEnabledNextSibling) {\r\n mockFullScreenEnabledParent.insertBefore(\r\n elementRef as HTMLElement,\r\n mockFullScreenEnabledNextSibling,\r\n );\r\n } else if (mockFullScreenEnabledParent) {\r\n mockFullScreenEnabledParent.appendChild(elementRef as HTMLElement);\r\n }\r\n }\r\n\r\n async function enterFullScreen(e: Event) {\r\n if (!elementRef) {\r\n return;\r\n }\r\n\r\n try {\r\n if (elementRef.requestFullscreen) {\r\n await elementRef.requestFullscreen();\r\n } else if ((elementRef as any).webkitRequestFullscreen) {\r\n /* Safari */\r\n await (elementRef as any).webkitRequestFullscreen();\r\n } else if ((elementRef as any).msRequestFullscreen) {\r\n /* IE11 */\r\n await (elementRef as any)?.msRequestFullscreen();\r\n } else {\r\n enterMockFullScreen(elementRef as HTMLElement);\r\n // throw new Error(\"Error in going to full screen\");\r\n }\r\n } catch (e) {\r\n //toast.errorToast(t(\"SV.MES_FullScreenError\"));\r\n console.error(\"Error in going to full screen\", e);\r\n enterMockFullScreen(elementRef as HTMLElement);\r\n //throw e;\r\n }\r\n }\r\n\r\n return {\r\n fullScreenEnabled,\r\n enterFullScreen,\r\n exitFullScreen,\r\n setElement,\r\n manualFullScreenEnabled,\r\n };\r\n});\r\n","\r\n\r\n\r\n\r\n\r\n","\r\n\r\n\r\n\r\n\r\n","\r\n\r\n\r\n\r\n\r\n","\r\n\r\n\r\n\r\n\r\n","\r\n\r\n\r\n\r\n\r\n","function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function (obj) {\n return typeof obj;\n };\n } else {\n _typeof = function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n\n return _typeof(obj);\n}\n\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\n/**\n * Constants used in player.\n */\nvar Constants = {\n VERSION: '2.0.16',\n NOTES: [],\n HEADER_CHUNK_LENGTH: 14,\n CIRCLE_OF_FOURTHS: ['C', 'F', 'Bb', 'Eb', 'Ab', 'Db', 'Gb', 'Cb', 'Fb', 'Bbb', 'Ebb', 'Abb'],\n CIRCLE_OF_FIFTHS: ['C', 'G', 'D', 'A', 'E', 'B', 'F#', 'C#', 'G#', 'D#', 'A#', 'E#']\n}; // Builds notes object for reference against binary values.\n\nvar allNotes = [['C'], ['C#', 'Db'], ['D'], ['D#', 'Eb'], ['E'], ['F'], ['F#', 'Gb'], ['G'], ['G#', 'Ab'], ['A'], ['A#', 'Bb'], ['B']];\nvar counter = 0; // All available octaves.\n\nvar _loop = function _loop(i) {\n allNotes.forEach(function (noteGroup) {\n noteGroup.forEach(function (note) {\n return Constants.NOTES[counter] = note + i;\n });\n counter++;\n });\n};\n\nfor (var i = -1; i <= 9; i++) {\n _loop(i);\n}\n\n/**\n * Contains misc static utility methods.\n */\nvar Utils = /*#__PURE__*/function () {\n function Utils() {\n _classCallCheck(this, Utils);\n }\n\n _createClass(Utils, null, [{\n key: \"byteToHex\",\n value:\n /**\n * Converts a single byte to a hex string.\n * @param {number} byte\n * @return {string}\n */\n function byteToHex(_byte) {\n // Ensure hex string always has two chars\n return ('0' + _byte.toString(16)).slice(-2);\n }\n /**\n * Converts an array of bytes to a hex string.\n * @param {array} byteArray\n * @return {string}\n */\n\n }, {\n key: \"bytesToHex\",\n value: function bytesToHex(byteArray) {\n var hex = [];\n byteArray.forEach(function (_byte2) {\n return hex.push(Utils.byteToHex(_byte2));\n });\n return hex.join('');\n }\n /**\n * Converts a hex string to a number.\n * @param {string} hexString\n * @return {number}\n */\n\n }, {\n key: \"hexToNumber\",\n value: function hexToNumber(hexString) {\n return parseInt(hexString, 16);\n }\n /**\n * Converts an array of bytes to a number.\n * @param {array} byteArray\n * @return {number}\n */\n\n }, {\n key: \"bytesToNumber\",\n value: function bytesToNumber(byteArray) {\n return Utils.hexToNumber(Utils.bytesToHex(byteArray));\n }\n /**\n * Converts an array of bytes to letters.\n * @param {array} byteArray\n * @return {string}\n */\n\n }, {\n key: \"bytesToLetters\",\n value: function bytesToLetters(byteArray) {\n var letters = [];\n byteArray.forEach(function (_byte3) {\n return letters.push(String.fromCharCode(_byte3));\n });\n return letters.join('');\n }\n /**\n * Converts a decimal to it's binary representation.\n * @param {number} dec\n * @return {string}\n */\n\n }, {\n key: \"decToBinary\",\n value: function decToBinary(dec) {\n return (dec >>> 0).toString(2);\n }\n /**\n * Determines the length in bytes of a variable length quaantity. The first byte in given range is assumed to be beginning of var length quantity.\n * @param {array} byteArray\n * @return {number}\n */\n\n }, {\n key: \"getVarIntLength\",\n value: function getVarIntLength(byteArray) {\n // Get byte count of delta VLV\n // http://www.ccarh.org/courses/253/handout/vlv/\n // If byte is greater or equal to 80h (128 decimal) then the next byte\n // is also part of the VLV,\n // else byte is the last byte in a VLV.\n var currentByte = byteArray[0];\n var byteCount = 1;\n\n while (currentByte >= 128) {\n currentByte = byteArray[byteCount];\n byteCount++;\n }\n\n return byteCount;\n }\n /**\n * Reads a variable length value.\n * @param {array} byteArray\n * @return {number}\n */\n\n }, {\n key: \"readVarInt\",\n value: function readVarInt(byteArray) {\n var result = 0;\n byteArray.forEach(function (number) {\n var b = number;\n\n if (b & 0x80) {\n result += b & 0x7f;\n result <<= 7;\n } else {\n /* b is the last byte */\n result += b;\n }\n });\n return result;\n }\n /**\n * Decodes base-64 encoded string\n * @param {string} string\n * @return {string}\n */\n\n }, {\n key: \"atob\",\n value: function (_atob) {\n function atob(_x) {\n return _atob.apply(this, arguments);\n }\n\n atob.toString = function () {\n return _atob.toString();\n };\n\n return atob;\n }(function (string) {\n if (typeof atob === 'function') return atob(string);\n return Buffer.from(string, 'base64').toString('binary');\n })\n }]);\n\n return Utils;\n}();\n\n/**\n * Class representing a track. Contains methods for parsing events and keeping track of pointer.\n */\n\nvar Track = /*#__PURE__*/function () {\n function Track(index, data) {\n _classCallCheck(this, Track);\n\n this.enabled = true;\n this.eventIndex = 0;\n this.pointer = 0;\n this.lastTick = 0;\n this.lastStatus = null;\n this.index = index;\n this.data = data;\n this.delta = 0;\n this.runningDelta = 0;\n this.events = []; // Ensure last 3 bytes of track are End of Track event\n\n var lastThreeBytes = this.data.subarray(this.data.length - 3, this.data.length);\n\n if (!(lastThreeBytes[0] === 0xff && lastThreeBytes[1] === 0x2f && lastThreeBytes[2] === 0x00)) {\n throw 'Invalid MIDI file; Last three bytes of track ' + this.index + 'must be FF 2F 00 to mark end of track';\n }\n }\n /**\n * Resets all stateful track informaion used during playback.\n * @return {Track}\n */\n\n\n _createClass(Track, [{\n key: \"reset\",\n value: function reset() {\n this.enabled = true;\n this.eventIndex = 0;\n this.pointer = 0;\n this.lastTick = 0;\n this.lastStatus = null;\n this.delta = 0;\n this.runningDelta = 0;\n return this;\n }\n /**\n * Sets this track to be enabled during playback.\n * @return {Track}\n */\n\n }, {\n key: \"enable\",\n value: function enable() {\n this.enabled = true;\n return this;\n }\n /**\n * Sets this track to be disabled during playback.\n * @return {Track}\n */\n\n }, {\n key: \"disable\",\n value: function disable() {\n this.enabled = false;\n return this;\n }\n /**\n * Sets the track event index to the nearest event to the given tick.\n * @param {number} tick\n * @return {Track}\n */\n\n }, {\n key: \"setEventIndexByTick\",\n value: function setEventIndexByTick(tick) {\n tick = tick || 0;\n\n for (var i in this.events) {\n if (this.events[i].tick >= tick) {\n this.eventIndex = i;\n return this;\n }\n }\n }\n /**\n * Gets byte located at pointer position.\n * @return {number}\n */\n\n }, {\n key: \"getCurrentByte\",\n value: function getCurrentByte() {\n return this.data[this.pointer];\n }\n /**\n * Gets count of delta bytes and current pointer position.\n * @return {number}\n */\n\n }, {\n key: \"getDeltaByteCount\",\n value: function getDeltaByteCount() {\n return Utils.getVarIntLength(this.data.subarray(this.pointer));\n }\n /**\n * Get delta value at current pointer position.\n * @return {number}\n */\n\n }, {\n key: \"getDelta\",\n value: function getDelta() {\n return Utils.readVarInt(this.data.subarray(this.pointer, this.pointer + this.getDeltaByteCount()));\n }\n /**\n * Handles event within a given track starting at specified index\n * @param {number} currentTick\n * @param {boolean} dryRun - If true events will be parsed and returned regardless of time.\n */\n\n }, {\n key: \"handleEvent\",\n value: function handleEvent(currentTick, dryRun) {\n dryRun = dryRun || false;\n\n if (dryRun) {\n var elapsedTicks = currentTick - this.lastTick;\n var delta = this.getDelta();\n var eventReady = elapsedTicks >= delta;\n\n if (this.pointer < this.data.length && (dryRun || eventReady)) {\n var _event = this.parseEvent();\n\n if (this.enabled) return _event; // Recursively call this function for each event ahead that has 0 delta time?\n }\n } else {\n // Let's actually play the MIDI from the generated JSON events created by the dry run.\n if (this.events[this.eventIndex] && this.events[this.eventIndex].tick <= currentTick) {\n this.eventIndex++;\n if (this.enabled) return this.events[this.eventIndex - 1];\n }\n }\n\n return null;\n }\n /**\n * Get string data from event.\n * @param {number} eventStartIndex\n * @return {string}\n */\n\n }, {\n key: \"getStringData\",\n value: function getStringData(eventStartIndex) {\n var varIntLength = Utils.getVarIntLength(this.data.subarray(eventStartIndex + 2));\n var varIntValue = Utils.readVarInt(this.data.subarray(eventStartIndex + 2, eventStartIndex + 2 + varIntLength));\n var letters = Utils.bytesToLetters(this.data.subarray(eventStartIndex + 2 + varIntLength, eventStartIndex + 2 + varIntLength + varIntValue));\n return letters;\n }\n /**\n * Parses event into JSON and advances pointer for the track\n * @return {object}\n */\n\n }, {\n key: \"parseEvent\",\n value: function parseEvent() {\n var eventStartIndex = this.pointer + this.getDeltaByteCount();\n var eventJson = {};\n var deltaByteCount = this.getDeltaByteCount();\n eventJson.track = this.index + 1;\n eventJson.delta = this.getDelta();\n this.lastTick = this.lastTick + eventJson.delta;\n this.runningDelta += eventJson.delta;\n eventJson.tick = this.runningDelta;\n eventJson.byteIndex = this.pointer; //eventJson.raw = event;\n\n if (this.data[eventStartIndex] == 0xff) {\n // Meta Event\n // If this is a meta event we should emit the data and immediately move to the next event\n // otherwise if we let it run through the next cycle a slight delay will accumulate if multiple tracks\n // are being played simultaneously\n switch (this.data[eventStartIndex + 1]) {\n case 0x00:\n // Sequence Number\n eventJson.name = 'Sequence Number';\n break;\n\n case 0x01:\n // Text Event\n eventJson.name = 'Text Event';\n eventJson.string = this.getStringData(eventStartIndex);\n break;\n\n case 0x02:\n // Copyright Notice\n eventJson.name = 'Copyright Notice';\n break;\n\n case 0x03:\n // Sequence/Track Name\n eventJson.name = 'Sequence/Track Name';\n eventJson.string = this.getStringData(eventStartIndex);\n break;\n\n case 0x04:\n // Instrument Name\n eventJson.name = 'Instrument Name';\n eventJson.string = this.getStringData(eventStartIndex);\n break;\n\n case 0x05:\n // Lyric\n eventJson.name = 'Lyric';\n eventJson.string = this.getStringData(eventStartIndex);\n break;\n\n case 0x06:\n // Marker\n eventJson.name = 'Marker';\n break;\n\n case 0x07:\n // Cue Point\n eventJson.name = 'Cue Point';\n eventJson.string = this.getStringData(eventStartIndex);\n break;\n\n case 0x09:\n // Device Name\n eventJson.name = 'Device Name';\n eventJson.string = this.getStringData(eventStartIndex);\n break;\n\n case 0x20:\n // MIDI Channel Prefix\n eventJson.name = 'MIDI Channel Prefix';\n break;\n\n case 0x21:\n // MIDI Port\n eventJson.name = 'MIDI Port';\n eventJson.data = Utils.bytesToNumber([this.data[eventStartIndex + 3]]);\n break;\n\n case 0x2F:\n // End of Track\n eventJson.name = 'End of Track';\n break;\n\n case 0x51:\n // Set Tempo\n eventJson.name = 'Set Tempo';\n eventJson.data = Math.round(60000000 / Utils.bytesToNumber(this.data.subarray(eventStartIndex + 3, eventStartIndex + 6)));\n this.tempo = eventJson.data;\n break;\n\n case 0x54:\n // SMTPE Offset\n eventJson.name = 'SMTPE Offset';\n break;\n\n case 0x58:\n // Time Signature\n // FF 58 04 nn dd cc bb\n eventJson.name = 'Time Signature';\n eventJson.data = this.data.subarray(eventStartIndex + 3, eventStartIndex + 7);\n eventJson.timeSignature = \"\" + eventJson.data[0] + \"/\" + Math.pow(2, eventJson.data[1]);\n break;\n\n case 0x59:\n // Key Signature\n // FF 59 02 sf mi\n eventJson.name = 'Key Signature';\n eventJson.data = this.data.subarray(eventStartIndex + 3, eventStartIndex + 5);\n\n if (eventJson.data[0] >= 0) {\n eventJson.keySignature = Constants.CIRCLE_OF_FIFTHS[eventJson.data[0]];\n } else if (eventJson.data[0] < 0) {\n eventJson.keySignature = Constants.CIRCLE_OF_FOURTHS[Math.abs(eventJson.data[0])];\n }\n\n if (eventJson.data[1] == 0) {\n eventJson.keySignature += \" Major\";\n } else if (eventJson.data[1] == 1) {\n eventJson.keySignature += \" Minor\";\n }\n\n break;\n\n case 0x7F:\n // Sequencer-Specific Meta-event\n eventJson.name = 'Sequencer-Specific Meta-event';\n break;\n\n default:\n eventJson.name = 'Unknown: ' + this.data[eventStartIndex + 1].toString(16);\n break;\n }\n\n var varIntLength = Utils.getVarIntLength(this.data.subarray(eventStartIndex + 2));\n var length = Utils.readVarInt(this.data.subarray(eventStartIndex + 2, eventStartIndex + 2 + varIntLength)); //console.log(eventJson);\n\n this.pointer += deltaByteCount + 3 + length; //console.log(eventJson);\n } else if (this.data[eventStartIndex] === 0xf0) {\n // Sysex\n eventJson.name = 'Sysex';\n var varQuantityByteLength = Utils.getVarIntLength(this.data.subarray(eventStartIndex + 1));\n var varQuantityByteValue = Utils.readVarInt(this.data.subarray(eventStartIndex + 1, eventStartIndex + 1 + varQuantityByteLength));\n eventJson.data = this.data.subarray(eventStartIndex + 1 + varQuantityByteLength, eventStartIndex + 1 + varQuantityByteLength + varQuantityByteValue);\n this.pointer += deltaByteCount + 1 + varQuantityByteLength + varQuantityByteValue;\n } else if (this.data[eventStartIndex] === 0xf7) {\n // Sysex (escape)\n // http://www.somascape.org/midi/tech/mfile.html#sysex\n eventJson.name = 'Sysex (escape)';\n\n var _varQuantityByteLength = Utils.getVarIntLength(this.data.subarray(eventStartIndex + 1));\n\n var _varQuantityByteValue = Utils.readVarInt(this.data.subarray(eventStartIndex + 1, eventStartIndex + 1 + _varQuantityByteLength));\n\n eventJson.data = this.data.subarray(eventStartIndex + 1 + _varQuantityByteLength, eventStartIndex + 1 + _varQuantityByteLength + _varQuantityByteValue);\n this.pointer += deltaByteCount + 1 + _varQuantityByteLength + _varQuantityByteValue;\n } else {\n // Voice event\n if (this.data[eventStartIndex] < 0x80) {\n // Running status\n eventJson.running = true;\n eventJson.noteNumber = this.data[eventStartIndex];\n eventJson.noteName = Constants.NOTES[this.data[eventStartIndex]];\n eventJson.velocity = this.data[eventStartIndex + 1];\n\n if (this.lastStatus <= 0x8f) {\n eventJson.name = 'Note off';\n eventJson.channel = this.lastStatus - 0x80 + 1;\n this.pointer += deltaByteCount + 2;\n } else if (this.lastStatus <= 0x9f) {\n eventJson.name = 'Note on';\n eventJson.channel = this.lastStatus - 0x90 + 1;\n this.pointer += deltaByteCount + 2;\n } else if (this.lastStatus <= 0xaf) {\n // Polyphonic Key Pressure\n eventJson.name = 'Polyphonic Key Pressure';\n eventJson.channel = this.lastStatus - 0xa0 + 1;\n eventJson.note = Constants.NOTES[this.data[eventStartIndex + 1]];\n eventJson.pressure = event[1];\n this.pointer += deltaByteCount + 2;\n } else if (this.lastStatus <= 0xbf) {\n // Controller Change\n eventJson.name = 'Controller Change';\n eventJson.channel = this.lastStatus - 0xb0 + 1;\n eventJson.number = this.data[eventStartIndex + 1];\n eventJson.value = this.data[eventStartIndex + 2];\n this.pointer += deltaByteCount + 2;\n } else if (this.lastStatus <= 0xcf) {\n // Program Change\n eventJson.name = 'Program Change';\n eventJson.channel = this.lastStatus - 0xc0 + 1;\n eventJson.value = this.data[eventStartIndex + 1];\n this.pointer += deltaByteCount + 1;\n } else if (this.lastStatus <= 0xdf) {\n // Channel Key Pressure\n eventJson.name = 'Channel Key Pressure';\n eventJson.channel = this.lastStatus - 0xd0 + 1;\n this.pointer += deltaByteCount + 1;\n } else if (this.lastStatus <= 0xef) {\n // Pitch Bend\n eventJson.name = 'Pitch Bend';\n eventJson.channel = this.lastStatus - 0xe0 + 1;\n eventJson.value = this.data[eventStartIndex + 2];\n this.pointer += deltaByteCount + 2;\n } else {\n throw \"Unknown event (running): \".concat(this.lastStatus);\n }\n } else {\n this.lastStatus = this.data[eventStartIndex];\n\n if (this.data[eventStartIndex] <= 0x8f) {\n // Note off\n eventJson.name = 'Note off';\n eventJson.channel = this.lastStatus - 0x80 + 1;\n eventJson.noteNumber = this.data[eventStartIndex + 1];\n eventJson.noteName = Constants.NOTES[this.data[eventStartIndex + 1]];\n eventJson.velocity = Math.round(this.data[eventStartIndex + 2] / 127 * 100);\n this.pointer += deltaByteCount + 3;\n } else if (this.data[eventStartIndex] <= 0x9f) {\n // Note on\n eventJson.name = 'Note on';\n eventJson.channel = this.lastStatus - 0x90 + 1;\n eventJson.noteNumber = this.data[eventStartIndex + 1];\n eventJson.noteName = Constants.NOTES[this.data[eventStartIndex + 1]];\n eventJson.velocity = Math.round(this.data[eventStartIndex + 2] / 127 * 100);\n this.pointer += deltaByteCount + 3;\n } else if (this.data[eventStartIndex] <= 0xaf) {\n // Polyphonic Key Pressure\n eventJson.name = 'Polyphonic Key Pressure';\n eventJson.channel = this.lastStatus - 0xa0 + 1;\n eventJson.note = Constants.NOTES[this.data[eventStartIndex + 1]];\n eventJson.pressure = event[2];\n this.pointer += deltaByteCount + 3;\n } else if (this.data[eventStartIndex] <= 0xbf) {\n // Controller Change\n eventJson.name = 'Controller Change';\n eventJson.channel = this.lastStatus - 0xb0 + 1;\n eventJson.number = this.data[eventStartIndex + 1];\n eventJson.value = this.data[eventStartIndex + 2];\n this.pointer += deltaByteCount + 3;\n } else if (this.data[eventStartIndex] <= 0xcf) {\n // Program Change\n eventJson.name = 'Program Change';\n eventJson.channel = this.lastStatus - 0xc0 + 1;\n eventJson.value = this.data[eventStartIndex + 1];\n this.pointer += deltaByteCount + 2;\n } else if (this.data[eventStartIndex] <= 0xdf) {\n // Channel Key Pressure\n eventJson.name = 'Channel Key Pressure';\n eventJson.channel = this.lastStatus - 0xd0 + 1;\n this.pointer += deltaByteCount + 2;\n } else if (this.data[eventStartIndex] <= 0xef) {\n // Pitch Bend\n eventJson.name = 'Pitch Bend';\n eventJson.channel = this.lastStatus - 0xe0 + 1;\n this.pointer += deltaByteCount + 3;\n } else {\n throw \"Unknown event: \".concat(this.data[eventStartIndex]); //eventJson.name = `Unknown. Pointer: ${this.pointer.toString()}, ${eventStartIndex.toString()}, ${this.data[eventStartIndex]}, ${this.data.length}`;\n }\n }\n }\n\n this.delta += eventJson.delta;\n this.events.push(eventJson);\n return eventJson;\n }\n /**\n * Returns true if pointer has reached the end of the track.\n * @param {boolean}\n */\n\n }, {\n key: \"endOfTrack\",\n value: function endOfTrack() {\n if (this.data[this.pointer + 1] == 0xff && this.data[this.pointer + 2] == 0x2f && this.data[this.pointer + 3] == 0x00) {\n return true;\n }\n\n return false;\n }\n }]);\n\n return Track;\n}();\n\nif (!Uint8Array.prototype.forEach) {\n Object.defineProperty(Uint8Array.prototype, 'forEach', {\n value: Array.prototype.forEach\n });\n}\n/**\n * Main player class. Contains methods to load files, start, stop.\n * @param {function} - Callback to fire for each MIDI event. Can also be added with on('midiEvent', fn)\n * @param {array} - Array buffer of MIDI file (optional).\n */\n\n\nvar Player = /*#__PURE__*/function () {\n function Player(eventHandler, buffer) {\n _classCallCheck(this, Player);\n\n this.sampleRate = 5; // milliseconds\n\n this.startTime = 0;\n this.buffer = buffer || null;\n this.midiChunksByteLength = null;\n this.division;\n this.format;\n this.setIntervalId = false;\n this.tracks = [];\n this.instruments = [];\n this.defaultTempo = 120;\n this.tempo = null;\n this.startTick = 0;\n this.tick = 0;\n this.lastTick = null;\n this.inLoop = false;\n this.totalTicks = 0;\n this.events = [];\n this.totalEvents = 0;\n this.eventListeners = {};\n if (typeof eventHandler === 'function') this.on('midiEvent', eventHandler);\n }\n /**\n * Load a file into the player (Node.js only).\n * @param {string} path - Path of file.\n * @return {Player}\n */\n\n\n _createClass(Player, [{\n key: \"loadFile\",\n value: function loadFile(path) {\n {\n throw 'loadFile is only supported on Node.js';\n }\n }\n /**\n * Load an array buffer into the player.\n * @param {array} arrayBuffer - Array buffer of file to be loaded.\n * @return {Player}\n */\n\n }, {\n key: \"loadArrayBuffer\",\n value: function loadArrayBuffer(arrayBuffer) {\n this.buffer = new Uint8Array(arrayBuffer);\n return this.fileLoaded();\n }\n /**\n * Load a data URI into the player.\n * @param {string} dataUri - Data URI to be loaded.\n * @return {Player}\n */\n\n }, {\n key: \"loadDataUri\",\n value: function loadDataUri(dataUri) {\n // convert base64 to raw binary data held in a string.\n // doesn't handle URLEncoded DataURIs - see SO answer #6850276 for code that does this\n var byteString = Utils.atob(dataUri.split(',')[1]); // write the bytes of the string to an ArrayBuffer\n\n var ia = new Uint8Array(byteString.length);\n\n for (var i = 0; i < byteString.length; i++) {\n ia[i] = byteString.charCodeAt(i);\n }\n\n this.buffer = ia;\n return this.fileLoaded();\n }\n /**\n * Get filesize of loaded file in number of bytes.\n * @return {number} - The filesize.\n */\n\n }, {\n key: \"getFilesize\",\n value: function getFilesize() {\n return this.buffer ? this.buffer.length : 0;\n }\n /**\n * Sets default tempo, parses file for necessary information, and does a dry run to calculate total length.\n * Populates this.events & this.totalTicks.\n * @return {Player}\n */\n\n }, {\n key: \"fileLoaded\",\n value: function fileLoaded() {\n if (!this.validate()) throw 'Invalid MIDI file; should start with MThd';\n return this.setTempo(this.defaultTempo).getDivision().getFormat().getTracks().dryRun();\n }\n /**\n * Validates file using simple means - first four bytes should == MThd.\n * @return {boolean}\n */\n\n }, {\n key: \"validate\",\n value: function validate() {\n //console.log((this.buffer.subarray(0, 15)));\n return Utils.bytesToLetters(this.buffer.subarray(0, 4)) === 'MThd';\n }\n /**\n * Gets MIDI file format for loaded file.\n * @return {Player}\n */\n\n }, {\n key: \"getFormat\",\n value: function getFormat() {\n /*\n MIDI files come in 3 variations:\n Format 0 which contain a single track\n Format 1 which contain one or more simultaneous tracks\n (ie all tracks are to be played simultaneously).\n Format 2 which contain one or more independant tracks\n (ie each track is to be played independantly of the others).\n return Utils.bytesToNumber(this.buffer.subarray(8, 10));\n */\n this.format = Utils.bytesToNumber(this.buffer.subarray(8, 10));\n return this;\n }\n /**\n * Parses out tracks, places them in this.tracks and initializes this.pointers\n * @return {Player}\n */\n\n }, {\n key: \"getTracks\",\n value: function getTracks() {\n this.tracks = [];\n var trackOffset = 0;\n\n while (trackOffset < this.buffer.length) {\n if (Utils.bytesToLetters(this.buffer.subarray(trackOffset, trackOffset + 4)) == 'MTrk') {\n var trackLength = Utils.bytesToNumber(this.buffer.subarray(trackOffset + 4, trackOffset + 8));\n this.tracks.push(new Track(this.tracks.length, this.buffer.subarray(trackOffset + 8, trackOffset + 8 + trackLength)));\n }\n\n trackOffset += Utils.bytesToNumber(this.buffer.subarray(trackOffset + 4, trackOffset + 8)) + 8;\n } // Get sum of all MIDI chunks here while we're at it\n\n\n var trackChunksByteLength = 0;\n this.tracks.forEach(function (track) {\n trackChunksByteLength += 8 + track.data.length;\n });\n this.midiChunksByteLength = Constants.HEADER_CHUNK_LENGTH + trackChunksByteLength;\n return this;\n }\n /**\n * Enables a track for playing.\n * @param {number} trackNumber - Track number\n * @return {Player}\n */\n\n }, {\n key: \"enableTrack\",\n value: function enableTrack(trackNumber) {\n this.tracks[trackNumber - 1].enable();\n return this;\n }\n /**\n * Disables a track for playing.\n * @param {number} - Track number\n * @return {Player}\n */\n\n }, {\n key: \"disableTrack\",\n value: function disableTrack(trackNumber) {\n this.tracks[trackNumber - 1].disable();\n return this;\n }\n /**\n * Gets quarter note division of loaded MIDI file.\n * @return {Player}\n */\n\n }, {\n key: \"getDivision\",\n value: function getDivision() {\n this.division = Utils.bytesToNumber(this.buffer.subarray(12, Constants.HEADER_CHUNK_LENGTH));\n return this;\n }\n /**\n * The main play loop.\n * @param {boolean} - Indicates whether or not this is being called simply for parsing purposes. Disregards timing if so.\n * @return {undefined}\n */\n\n }, {\n key: \"playLoop\",\n value: function playLoop(dryRun) {\n if (!this.inLoop) {\n this.inLoop = true;\n this.tick = this.getCurrentTick();\n this.tracks.forEach(function (track, index) {\n // Handle next event\n if (!dryRun && this.endOfFile()) {\n //console.log('end of file')\n this.triggerPlayerEvent('endOfFile');\n this.stop();\n } else {\n var event = track.handleEvent(this.tick, dryRun);\n\n if (dryRun && event) {\n if (event.hasOwnProperty('name') && event.name === 'Set Tempo') {\n // Grab tempo if available.\n this.defaultTempo = event.data;\n this.setTempo(event.data);\n }\n\n if (event.hasOwnProperty('name') && event.name === 'Program Change') {\n if (!this.instruments.includes(event.value)) {\n this.instruments.push(event.value);\n }\n }\n } else if (event) {\n if (event.hasOwnProperty('name') && event.name === 'Set Tempo') {\n // Grab tempo if available.\n this.setTempo(event.data);\n\n if (this.isPlaying()) {\n this.pause().play();\n }\n }\n\n this.emitEvent(event);\n }\n }\n }, this);\n if (!dryRun) this.triggerPlayerEvent('playing', {\n tick: this.tick\n });\n this.inLoop = false;\n }\n }\n /**\n * Setter for tempo.\n * @param {number} - Tempo in bpm (defaults to 120)\n */\n\n }, {\n key: \"setTempo\",\n value: function setTempo(tempo) {\n this.tempo = tempo;\n return this;\n }\n /**\n * Setter for startTime.\n * @param {number} - UTC timestamp\n * @return {Player}\n */\n\n }, {\n key: \"setStartTime\",\n value: function setStartTime(startTime) {\n this.startTime = startTime;\n return this;\n }\n /**\n * Start playing loaded MIDI file if not already playing.\n * @return {Player}\n */\n\n }, {\n key: \"play\",\n value: function play() {\n if (this.isPlaying()) throw 'Already playing...'; // Initialize\n\n if (!this.startTime) this.startTime = new Date().getTime(); // Start play loop\n //window.requestAnimationFrame(this.playLoop.bind(this));\n\n this.setIntervalId = setInterval(this.playLoop.bind(this), this.sampleRate); //this.setIntervalId = this.loop();\n\n return this;\n }\n }, {\n key: \"loop\",\n value: function loop() {\n setTimeout(function () {\n // Do Something Here\n this.playLoop(); // Then recall the parent function to\n // create a recursive loop.\n\n this.loop();\n }.bind(this), this.sampleRate);\n }\n /**\n * Pauses playback if playing.\n * @return {Player}\n */\n\n }, {\n key: \"pause\",\n value: function pause() {\n clearInterval(this.setIntervalId);\n this.setIntervalId = false;\n this.startTick = this.tick;\n this.startTime = 0;\n return this;\n }\n /**\n * Stops playback if playing.\n * @return {Player}\n */\n\n }, {\n key: \"stop\",\n value: function stop() {\n clearInterval(this.setIntervalId);\n this.setIntervalId = false;\n this.startTick = 0;\n this.startTime = 0;\n this.resetTracks();\n return this;\n }\n /**\n * Skips player pointer to specified tick.\n * @param {number} - Tick to skip to.\n * @return {Player}\n */\n\n }, {\n key: \"skipToTick\",\n value: function skipToTick(tick) {\n this.stop();\n this.startTick = tick; // Need to set track event indexes to the nearest possible event to the specified tick.\n\n this.tracks.forEach(function (track) {\n track.setEventIndexByTick(tick);\n });\n return this;\n }\n /**\n * Skips player pointer to specified percentage.\n * @param {number} - Percent value in integer format.\n * @return {Player}\n */\n\n }, {\n key: \"skipToPercent\",\n value: function skipToPercent(percent) {\n if (percent < 0 || percent > 100) throw \"Percent must be number between 1 and 100.\";\n this.skipToTick(Math.round(percent / 100 * this.totalTicks));\n return this;\n }\n /**\n * Skips player pointer to specified seconds.\n * @param {number} - Seconds to skip to.\n * @return {Player}\n */\n\n }, {\n key: \"skipToSeconds\",\n value: function skipToSeconds(seconds) {\n var songTime = this.getSongTime();\n if (seconds < 0 || seconds > songTime) throw seconds + \" seconds not within song time of \" + songTime;\n this.skipToPercent(seconds / songTime * 100);\n return this;\n }\n /**\n * Checks if player is playing\n * @return {boolean}\n */\n\n }, {\n key: \"isPlaying\",\n value: function isPlaying() {\n return this.setIntervalId > 0 || _typeof(this.setIntervalId) === 'object';\n }\n /**\n * Plays the loaded MIDI file without regard for timing and saves events in this.events. Essentially used as a parser.\n * @return {Player}\n */\n\n }, {\n key: \"dryRun\",\n value: function dryRun() {\n // Reset tracks first\n this.resetTracks();\n\n while (!this.endOfFile()) {\n this.playLoop(true); //console.log(this.bytesProcessed(), this.midiChunksByteLength);\n }\n\n this.events = this.getEvents();\n this.totalEvents = this.getTotalEvents();\n this.totalTicks = this.getTotalTicks();\n this.startTick = 0;\n this.startTime = 0; // Leave tracks in pristine condish\n\n this.resetTracks(); //console.log('Song time: ' + this.getSongTime() + ' seconds / ' + this.totalTicks + ' ticks.');\n\n this.triggerPlayerEvent('fileLoaded', this);\n return this;\n }\n /**\n * Resets play pointers for all tracks.\n * @return {Player}\n */\n\n }, {\n key: \"resetTracks\",\n value: function resetTracks() {\n this.tracks.forEach(function (track) {\n return track.reset();\n });\n return this;\n }\n /**\n * Gets an array of events grouped by track.\n * @return {array}\n */\n\n }, {\n key: \"getEvents\",\n value: function getEvents() {\n return this.tracks.map(function (track) {\n return track.events;\n });\n }\n /**\n * Gets total number of ticks in the loaded MIDI file.\n * @return {number}\n */\n\n }, {\n key: \"getTotalTicks\",\n value: function getTotalTicks() {\n return Math.max.apply(null, this.tracks.map(function (track) {\n return track.delta;\n }));\n }\n /**\n * Gets total number of events in the loaded MIDI file.\n * @return {number}\n */\n\n }, {\n key: \"getTotalEvents\",\n value: function getTotalEvents() {\n return this.tracks.reduce(function (a, b) {\n return {\n events: {\n length: a.events.length + b.events.length\n }\n };\n }, {\n events: {\n length: 0\n }\n }).events.length;\n }\n /**\n * Gets song duration in seconds.\n * @return {number}\n */\n\n }, {\n key: \"getSongTime\",\n value: function getSongTime() {\n return this.totalTicks / this.division / this.tempo * 60;\n }\n /**\n * Gets remaining number of seconds in playback.\n * @return {number}\n */\n\n }, {\n key: \"getSongTimeRemaining\",\n value: function getSongTimeRemaining() {\n return Math.round((this.totalTicks - this.getCurrentTick()) / this.division / this.tempo * 60);\n }\n /**\n * Gets remaining percent of playback.\n * @return {number}\n */\n\n }, {\n key: \"getSongPercentRemaining\",\n value: function getSongPercentRemaining() {\n return Math.round(this.getSongTimeRemaining() / this.getSongTime() * 100);\n }\n /**\n * Number of bytes processed in the loaded MIDI file.\n * @return {number}\n */\n\n }, {\n key: \"bytesProcessed\",\n value: function bytesProcessed() {\n return Constants.HEADER_CHUNK_LENGTH + this.tracks.length * 8 + this.tracks.reduce(function (a, b) {\n return {\n pointer: a.pointer + b.pointer\n };\n }, {\n pointer: 0\n }).pointer;\n }\n /**\n * Number of events played up to this point.\n * @return {number}\n */\n\n }, {\n key: \"eventsPlayed\",\n value: function eventsPlayed() {\n return this.tracks.reduce(function (a, b) {\n return {\n eventIndex: a.eventIndex + b.eventIndex\n };\n }, {\n eventIndex: 0\n }).eventIndex;\n }\n /**\n * Determines if the player pointer has reached the end of the loaded MIDI file.\n * Used in two ways:\n * 1. If playing result is based on loaded JSON events.\n * 2. If parsing (dryRun) it's based on the actual buffer length vs bytes processed.\n * @return {boolean}\n */\n\n }, {\n key: \"endOfFile\",\n value: function endOfFile() {\n if (this.isPlaying()) {\n return this.totalTicks - this.tick <= 0;\n }\n\n return this.bytesProcessed() >= this.midiChunksByteLength; //this.buffer.length;\n }\n /**\n * Gets the current tick number in playback.\n * @return {number}\n */\n\n }, {\n key: \"getCurrentTick\",\n value: function getCurrentTick() {\n if (!this.startTime) return this.startTick;\n return Math.round((new Date().getTime() - this.startTime) / 1000 * (this.division * (this.tempo / 60))) + this.startTick;\n }\n /**\n * Sends MIDI event out to listener.\n * @param {object}\n * @return {Player}\n */\n\n }, {\n key: \"emitEvent\",\n value: function emitEvent(event) {\n this.triggerPlayerEvent('midiEvent', event);\n return this;\n }\n /**\n * Subscribes events to listeners\n * @param {string} - Name of event to subscribe to.\n * @param {function} - Callback to fire when event is broadcast.\n * @return {Player}\n */\n\n }, {\n key: \"on\",\n value: function on(playerEvent, fn) {\n if (!this.eventListeners.hasOwnProperty(playerEvent)) this.eventListeners[playerEvent] = [];\n this.eventListeners[playerEvent].push(fn);\n return this;\n }\n /**\n * Broadcasts event to trigger subscribed callbacks.\n * @param {string} - Name of event.\n * @param {object} - Data to be passed to subscriber callback.\n * @return {Player}\n */\n\n }, {\n key: \"triggerPlayerEvent\",\n value: function triggerPlayerEvent(playerEvent, data) {\n if (this.eventListeners.hasOwnProperty(playerEvent)) this.eventListeners[playerEvent].forEach(function (fn) {\n return fn(data || {});\n });\n return this;\n }\n }]);\n\n return Player;\n}();\n\nvar index = {\n Player: Player,\n Utils: Utils,\n Constants: Constants\n};\n\nexport { index as default };\n","var __defProp = Object.defineProperty;\nvar __defProps = Object.defineProperties;\nvar __getOwnPropDescs = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols = Object.getOwnPropertySymbols;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __propIsEnum = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n if (__getOwnPropSymbols)\n for (var prop of __getOwnPropSymbols(b)) {\n if (__propIsEnum.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));\nvar __accessCheck = (obj, member, msg) => {\n if (!member.has(obj))\n throw TypeError(\"Cannot \" + msg);\n};\nvar __privateGet = (obj, member, getter) => {\n __accessCheck(obj, member, \"read from private field\");\n return getter ? getter.call(obj) : member.get(obj);\n};\nvar __privateAdd = (obj, member, value) => {\n if (member.has(obj))\n throw TypeError(\"Cannot add the same private member more than once\");\n member instanceof WeakSet ? member.add(obj) : member.set(obj, value);\n};\nvar __privateSet = (obj, member, value, setter) => {\n __accessCheck(obj, member, \"write to private field\");\n setter ? setter.call(obj, value) : member.set(obj, value);\n return value;\n};\nvar __privateMethod = (obj, member, method) => {\n __accessCheck(obj, member, \"access private method\");\n return method;\n};\nvar __async = (__this, __arguments, generator) => {\n return new Promise((resolve, reject) => {\n var fulfilled = (value) => {\n try {\n step(generator.next(value));\n } catch (e) {\n reject(e);\n }\n };\n var rejected = (value) => {\n try {\n step(generator.throw(value));\n } catch (e) {\n reject(e);\n }\n };\n var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);\n step((generator = generator.apply(__this, __arguments)).next());\n });\n};\n\n// src/player/connect.ts\nfunction connectSerial(nodes) {\n const _nodes = nodes.filter((x) => !!x);\n _nodes.reduce((a, b) => {\n const left = \"output\" in a ? a.output : a;\n const right = \"input\" in b ? b.input : b;\n left.connect(right);\n return b;\n });\n return () => {\n _nodes.reduce((a, b) => {\n const left = \"output\" in a ? a.output : a;\n const right = \"input\" in b ? b.input : b;\n left.disconnect(right);\n return b;\n });\n };\n}\n\n// src/player/signals.ts\nfunction createControl(initialValue) {\n let current = initialValue;\n const listeners = /* @__PURE__ */ new Set();\n function subscribe(listener) {\n listeners.add(listener);\n listener(current);\n return () => {\n listeners.delete(listener);\n };\n }\n function set(value) {\n current = value;\n listeners.forEach((listener) => listener(current));\n }\n function get() {\n return current;\n }\n return { subscribe, set, get };\n}\nfunction createTrigger() {\n const listeners = /* @__PURE__ */ new Set();\n function subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n }\n function trigger(value) {\n listeners.forEach((listener) => listener(value));\n }\n return { subscribe, trigger };\n}\nfunction unsubscribeAll(unsubscribe) {\n let done = false;\n return () => {\n if (done)\n return;\n done = true;\n unsubscribe.forEach((cb) => cb == null ? void 0 : cb());\n };\n}\n\n// src/player/volume.ts\nfunction midiVelToGain(vel) {\n return vel * vel / 16129;\n}\nfunction dbToGain(decibels) {\n return Math.pow(10, decibels / 20);\n}\n\n// src/player/channel.ts\nvar _volume, _sends, _inserts, _disconnect, _unsubscribe, _config, _disconnected;\nvar Channel = class {\n constructor(context, options) {\n this.context = context;\n __privateAdd(this, _volume, void 0);\n __privateAdd(this, _sends, void 0);\n __privateAdd(this, _inserts, void 0);\n __privateAdd(this, _disconnect, void 0);\n __privateAdd(this, _unsubscribe, void 0);\n __privateAdd(this, _config, void 0);\n __privateAdd(this, _disconnected, false);\n var _a, _b, _c;\n __privateSet(this, _config, {\n destination: (_a = options == null ? void 0 : options.destination) != null ? _a : context.destination,\n volume: (_b = options == null ? void 0 : options.volume) != null ? _b : 100,\n volumeToGain: (_c = options == null ? void 0 : options.volumeToGain) != null ? _c : midiVelToGain\n });\n this.input = context.createGain();\n __privateSet(this, _volume, context.createGain());\n __privateSet(this, _disconnect, connectSerial([\n this.input,\n __privateGet(this, _volume),\n __privateGet(this, _config).destination\n ]));\n const volume = createControl(__privateGet(this, _config).volume);\n this.setVolume = volume.set;\n __privateSet(this, _unsubscribe, volume.subscribe((volume2) => {\n __privateGet(this, _volume).gain.value = __privateGet(this, _config).volumeToGain(volume2);\n }));\n }\n addInsert(effect) {\n var _a;\n if (__privateGet(this, _disconnected)) {\n throw Error(\"Can't add insert to disconnected channel\");\n }\n (_a = __privateGet(this, _inserts)) != null ? _a : __privateSet(this, _inserts, []);\n __privateGet(this, _inserts).push(effect);\n __privateGet(this, _disconnect).call(this);\n __privateSet(this, _disconnect, connectSerial([\n this.input,\n ...__privateGet(this, _inserts),\n __privateGet(this, _volume),\n __privateGet(this, _config).destination\n ]));\n }\n addEffect(name, effect, mixValue) {\n var _a;\n if (__privateGet(this, _disconnected)) {\n throw Error(\"Can't add effect to disconnected channel\");\n }\n const mix = this.context.createGain();\n mix.gain.value = mixValue;\n const input = \"input\" in effect ? effect.input : effect;\n const disconnect = connectSerial([__privateGet(this, _volume), mix, input]);\n (_a = __privateGet(this, _sends)) != null ? _a : __privateSet(this, _sends, []);\n __privateGet(this, _sends).push({ name, mix, disconnect });\n }\n sendEffect(name, mix) {\n var _a;\n if (__privateGet(this, _disconnected)) {\n throw Error(\"Can't send effect to disconnected channel\");\n }\n const send = (_a = __privateGet(this, _sends)) == null ? void 0 : _a.find((send2) => send2.name === name);\n if (send) {\n send.mix.gain.value = mix;\n } else {\n console.warn(\"Send bus not found: \" + name);\n }\n }\n disconnect() {\n var _a;\n if (__privateGet(this, _disconnected))\n return;\n __privateSet(this, _disconnected, true);\n __privateGet(this, _disconnect).call(this);\n __privateGet(this, _unsubscribe).call(this);\n (_a = __privateGet(this, _sends)) == null ? void 0 : _a.forEach((send) => send.disconnect());\n __privateSet(this, _sends, void 0);\n }\n};\n_volume = new WeakMap();\n_sends = new WeakMap();\n_inserts = new WeakMap();\n_disconnect = new WeakMap();\n_unsubscribe = new WeakMap();\n_config = new WeakMap();\n_disconnected = new WeakMap();\n\n// src/player/sorted-queue.ts\nvar _items;\nvar SortedQueue = class {\n constructor(compare) {\n this.compare = compare;\n __privateAdd(this, _items, []);\n }\n push(item) {\n const len = __privateGet(this, _items).length;\n let left = 0;\n let right = len - 1;\n let index = len;\n while (left <= right) {\n const mid = Math.floor((left + right) / 2);\n if (this.compare(item, __privateGet(this, _items)[mid]) < 0) {\n index = mid;\n right = mid - 1;\n } else {\n left = mid + 1;\n }\n }\n __privateGet(this, _items).splice(index, 0, item);\n }\n pop() {\n return __privateGet(this, _items).shift();\n }\n peek() {\n return __privateGet(this, _items)[0];\n }\n removeAll(predicate) {\n const len = __privateGet(this, _items).length;\n __privateSet(this, _items, __privateGet(this, _items).filter((item) => !predicate(item)));\n return __privateGet(this, _items).length !== len;\n }\n clear() {\n __privateSet(this, _items, []);\n }\n size() {\n return __privateGet(this, _items).length;\n }\n};\n_items = new WeakMap();\n\n// src/player/queued-player.ts\nfunction compose(a, b) {\n return a && b ? (x) => {\n a(x);\n b(x);\n } : a != null ? a : b;\n}\nfunction getConfig(options) {\n var _a, _b, _c;\n const config = {\n disableScheduler: (_a = options.disableScheduler) != null ? _a : false,\n scheduleLookaheadMs: (_b = options.scheduleLookaheadMs) != null ? _b : 200,\n scheduleIntervalMs: (_c = options.scheduleIntervalMs) != null ? _c : 50,\n onStart: options.onStart,\n onEnded: options.onEnded\n };\n if (config.scheduleLookaheadMs < 1) {\n throw Error(\"scheduleLookaheadMs must be greater than 0\");\n }\n if (config.scheduleIntervalMs < 1) {\n throw Error(\"scheduleIntervalMs must be greater than 0\");\n }\n if (config.scheduleLookaheadMs < config.scheduleIntervalMs) {\n throw Error(\"scheduleLookaheadMs must be greater than scheduleIntervalMs\");\n }\n return config;\n}\nvar _config2, _queue, _intervalId;\nvar QueuedPlayer = class {\n constructor(player, options = {}) {\n __privateAdd(this, _config2, void 0);\n __privateAdd(this, _queue, void 0);\n __privateAdd(this, _intervalId, void 0);\n __privateSet(this, _config2, getConfig(options));\n __privateSet(this, _queue, new SortedQueue(\n (a, b) => a.time - b.time\n ));\n this.player = player;\n }\n get context() {\n return this.player.context;\n }\n get buffers() {\n return this.player.buffers;\n }\n get isRunning() {\n return __privateGet(this, _intervalId) !== void 0;\n }\n start(sample) {\n var _a;\n if (__privateGet(this, _config2).disableScheduler) {\n return this.player.start(sample);\n }\n const context = this.player.context;\n const now = context.currentTime;\n const startAt = (_a = sample.time) != null ? _a : now;\n const lookAhead = __privateGet(this, _config2).scheduleLookaheadMs / 1e3;\n sample.onStart = compose(sample.onStart, __privateGet(this, _config2).onStart);\n sample.onEnded = compose(sample.onEnded, __privateGet(this, _config2).onEnded);\n if (startAt < now + lookAhead) {\n return this.player.start(sample);\n }\n __privateGet(this, _queue).push(__spreadProps(__spreadValues({}, sample), { time: startAt }));\n if (!__privateGet(this, _intervalId)) {\n __privateSet(this, _intervalId, setInterval(() => {\n const nextTick = context.currentTime + lookAhead;\n while (__privateGet(this, _queue).size() && __privateGet(this, _queue).peek().time <= nextTick) {\n const sample2 = __privateGet(this, _queue).pop();\n if (sample2) {\n this.player.start(sample2);\n }\n }\n if (!__privateGet(this, _queue).size()) {\n clearInterval(__privateGet(this, _intervalId));\n __privateSet(this, _intervalId, void 0);\n }\n }, __privateGet(this, _config2).scheduleIntervalMs));\n }\n return (time) => {\n if (!time || time < startAt) {\n if (!__privateGet(this, _queue).removeAll((item) => item === sample)) {\n this.player.stop(__spreadProps(__spreadValues({}, sample), { time }));\n }\n } else {\n this.player.stop(__spreadProps(__spreadValues({}, sample), { time }));\n }\n };\n }\n stop(sample) {\n var _a;\n if (__privateGet(this, _config2).disableScheduler) {\n return this.player.stop(sample);\n }\n this.player.stop(sample);\n if (!sample) {\n __privateGet(this, _queue).clear();\n return;\n }\n const time = (_a = sample == null ? void 0 : sample.time) != null ? _a : 0;\n const stopId = sample == null ? void 0 : sample.stopId;\n if (stopId) {\n __privateGet(this, _queue).removeAll(\n (item) => item.time >= time && item.stopId ? item.stopId === stopId : item.note === stopId\n );\n } else {\n __privateGet(this, _queue).removeAll((item) => item.time >= time);\n }\n }\n disconnect() {\n this.player.disconnect();\n }\n};\n_config2 = new WeakMap();\n_queue = new WeakMap();\n_intervalId = new WeakMap();\n\n// src/player/sample-player.ts\nvar _config3, _disconnected2, _stop;\nvar SamplePlayer = class {\n constructor(context, options) {\n this.context = context;\n this.options = options;\n __privateAdd(this, _config3, void 0);\n __privateAdd(this, _disconnected2, false);\n __privateAdd(this, _stop, void 0);\n var _a, _b;\n __privateSet(this, _config3, {\n velocityToGain: (_a = options.velocityToGain) != null ? _a : midiVelToGain,\n destination: (_b = options.destination) != null ? _b : context.destination\n });\n this.buffers = {};\n __privateSet(this, _stop, createTrigger());\n }\n start(sample) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n;\n if (__privateGet(this, _disconnected2)) {\n throw new Error(\"Can't start a sample on disconnected player\");\n }\n const context = this.context;\n const buffer = sample.name && this.buffers[sample.name] || this.buffers[sample.note];\n if (!buffer) {\n console.warn(`Sample not found: '${sample.note}'`);\n return () => void 0;\n }\n const source = context.createBufferSource();\n source.buffer = buffer;\n const cents = (_b = (_a = sample.detune) != null ? _a : this.options.detune) != null ? _b : 0;\n if (source.detune) {\n source.detune.value = cents;\n } else if (source.playbackRate) {\n source.playbackRate.value = Math.pow(2, cents / 1200);\n }\n const lpfCutoffHz = (_c = sample.lpfCutoffHz) != null ? _c : this.options.lpfCutoffHz;\n const lpf = lpfCutoffHz ? context.createBiquadFilter() : void 0;\n if (lpfCutoffHz && lpf) {\n lpf.type = \"lowpass\";\n lpf.frequency.value = lpfCutoffHz;\n }\n const volume = context.createGain();\n const velocity = (_e = (_d = sample.velocity) != null ? _d : this.options.velocity) != null ? _e : 100;\n volume.gain.value = __privateGet(this, _config3).velocityToGain(velocity);\n const loop = (_f = sample.loop) != null ? _f : this.options.loop;\n if (loop) {\n source.loop = true;\n source.loopStart = (_g = sample.loopStart) != null ? _g : 0;\n source.loopEnd = (_h = sample.loopEnd) != null ? _h : buffer.duration;\n }\n const decayTime = (_i = sample.decayTime) != null ? _i : this.options.decayTime;\n const [decay, startDecay] = createDecayEnvelope(context, decayTime);\n function stop(time) {\n time != null ? time : time = context.currentTime;\n if (time <= startAt) {\n source.stop(time);\n } else {\n const stopAt = startDecay(time);\n source.stop(stopAt);\n }\n }\n const gainCompensation = sample.gainOffset ? context.createGain() : void 0;\n if (gainCompensation && sample.gainOffset) {\n gainCompensation.gain.value = sample.gainOffset;\n }\n const stopId = (_j = sample.stopId) != null ? _j : sample.note;\n const cleanup = unsubscribeAll([\n connectSerial([\n source,\n lpf,\n volume,\n decay,\n gainCompensation,\n __privateGet(this, _config3).destination\n ]),\n (_k = sample.stop) == null ? void 0 : _k.call(sample, stop),\n __privateGet(this, _stop).subscribe((event) => {\n if (!event || event.stopId === void 0 || event.stopId === stopId) {\n stop(event == null ? void 0 : event.time);\n }\n })\n ]);\n source.onended = () => {\n var _a2;\n cleanup();\n (_a2 = sample.onEnded) == null ? void 0 : _a2.call(sample, sample);\n };\n (_l = sample.onStart) == null ? void 0 : _l.call(sample, sample);\n const startAt = Math.max((_m = sample.time) != null ? _m : 0, context.currentTime);\n source.start(sample.time);\n let duration = (_n = sample.duration) != null ? _n : buffer.duration;\n if (typeof sample.duration == \"number\") {\n stop(startAt + duration);\n }\n return stop;\n }\n stop(sample) {\n __privateGet(this, _stop).trigger(sample);\n }\n disconnect() {\n if (__privateGet(this, _disconnected2))\n return;\n __privateSet(this, _disconnected2, true);\n this.stop();\n Object.keys(this.buffers).forEach((key) => {\n delete this.buffers[key];\n });\n }\n get connected() {\n return !__privateGet(this, _disconnected2);\n }\n};\n_config3 = new WeakMap();\n_disconnected2 = new WeakMap();\n_stop = new WeakMap();\nfunction createDecayEnvelope(context, envelopeTime = 0.2) {\n let stopAt = 0;\n const envelope = context.createGain();\n envelope.gain.value = 1;\n function start(time) {\n if (stopAt)\n return stopAt;\n envelope.gain.cancelScheduledValues(time);\n const envelopeAt = time || context.currentTime;\n stopAt = envelopeAt + envelopeTime;\n envelope.gain.setValueAtTime(1, envelopeAt);\n envelope.gain.linearRampToValueAtTime(0, stopAt);\n return stopAt;\n }\n return [envelope, start];\n}\n\n// src/player/default-player.ts\nvar DefaultPlayer = class {\n constructor(context, options) {\n this.context = context;\n const channel = new Channel(context, options);\n this.player = new QueuedPlayer(\n new SamplePlayer(context, __spreadProps(__spreadValues({}, options), { destination: channel.input })),\n options\n );\n this.output = channel;\n }\n get buffers() {\n return this.player.buffers;\n }\n start(sample) {\n return this.player.start(sample);\n }\n stop(sample) {\n this.player.stop(\n typeof sample === \"object\" ? sample : sample !== void 0 ? { stopId: sample } : void 0\n );\n }\n disconnect() {\n this.output.disconnect();\n this.player.disconnect();\n }\n};\n\n// src/player/load-audio.ts\nfunction loadAudioBuffer(context, url, storage) {\n return __async(this, null, function* () {\n url = url.replace(/#/g, \"%23\").replace(/([^:]\\/)\\/+/g, \"$1\");\n const response = yield storage.fetch(url);\n if (response.status !== 200) {\n console.warn(\n \"Error loading buffer. Invalid status: \",\n response.status,\n url\n );\n return;\n }\n try {\n const audioData = yield response.arrayBuffer();\n const buffer = yield context.decodeAudioData(audioData);\n return buffer;\n } catch (error) {\n console.warn(\"Error loading buffer\", error, url);\n }\n });\n}\nfunction findFirstSupportedFormat(formats) {\n if (typeof document === \"undefined\")\n return null;\n const audio = document.createElement(\"audio\");\n for (let i = 0; i < formats.length; i++) {\n const format = formats[i];\n const canPlay = audio.canPlayType(`audio/${format}`);\n if (canPlay === \"probably\" || canPlay === \"maybe\") {\n return format;\n }\n if (format === \"m4a\") {\n const canPlay2 = audio.canPlayType(`audio/aac`);\n if (canPlay2 === \"probably\" || canPlay2 === \"maybe\") {\n return format;\n }\n }\n }\n return null;\n}\nfunction getPreferredAudioExtension() {\n var _a;\n const format = (_a = findFirstSupportedFormat([\"ogg\", \"m4a\"])) != null ? _a : \"ogg\";\n return \".\" + format;\n}\n\n// src/storage.ts\nvar HttpStorage = {\n fetch(url) {\n return fetch(url);\n }\n};\nvar _cache, _tryFromCache, tryFromCache_fn, _saveResponse, saveResponse_fn;\nvar CacheStorage = class {\n constructor(name = \"smplr\") {\n __privateAdd(this, _tryFromCache);\n __privateAdd(this, _saveResponse);\n __privateAdd(this, _cache, void 0);\n if (typeof window === \"undefined\" || !(\"caches\" in window)) {\n __privateSet(this, _cache, Promise.reject(\"CacheStorage not supported\"));\n } else {\n __privateSet(this, _cache, caches.open(name));\n }\n }\n fetch(url) {\n return __async(this, null, function* () {\n const request = new Request(url);\n try {\n return yield __privateMethod(this, _tryFromCache, tryFromCache_fn).call(this, request);\n } catch (err) {\n const response = yield fetch(request);\n yield __privateMethod(this, _saveResponse, saveResponse_fn).call(this, request, response);\n return response;\n }\n });\n }\n};\n_cache = new WeakMap();\n_tryFromCache = new WeakSet();\ntryFromCache_fn = function(request) {\n return __async(this, null, function* () {\n const cache = yield __privateGet(this, _cache);\n const response = yield cache.match(request);\n if (response)\n return response;\n else\n throw Error(\"Not found\");\n });\n};\n_saveResponse = new WeakSet();\nsaveResponse_fn = function(request, response) {\n return __async(this, null, function* () {\n try {\n const cache = yield __privateGet(this, _cache);\n yield cache.put(request, response.clone());\n } catch (err) {\n }\n });\n};\n\n// src/drum-machine/dm-instrument.ts\nfunction isDrumMachineInstrument(instrument) {\n return typeof instrument === \"object\" && typeof instrument.baseUrl === \"string\" && typeof instrument.name === \"string\" && Array.isArray(instrument.samples) && Array.isArray(instrument.sampleNames) && typeof instrument.nameToSample === \"object\" && typeof instrument.sampleNameVariations === \"object\";\n}\nvar EMPTY_INSTRUMENT = {\n baseUrl: \"\",\n name: \"\",\n samples: [],\n sampleNames: [],\n nameToSample: {},\n sampleNameVariations: {}\n};\nfunction fetchDrumMachineInstrument(url, storage) {\n return __async(this, null, function* () {\n var _a, _b, _c, _d;\n const res = yield storage.fetch(url);\n const json = yield res.json();\n json.baseUrl = url.replace(\"/dm.json\", \"\");\n json.sampleNames = [];\n json.nameToSample = {};\n json.sampleNameVariations = {};\n for (const sampleSrc of json.samples) {\n const sample = sampleSrc.indexOf(\"/\") !== -1 ? sampleSrc : sampleSrc.replace(\"-\", \"/\");\n json.nameToSample[sample] = sample;\n const [base, variation] = sample.split(\"/\");\n if (!json.sampleNames.includes(base)) {\n json.sampleNames.push(base);\n }\n (_b = (_a = json.nameToSample)[base]) != null ? _b : _a[base] = sample;\n (_d = (_c = json.sampleNameVariations)[base]) != null ? _d : _c[base] = [];\n if (variation) {\n json.sampleNameVariations[base].push(`${base}/${variation}`);\n }\n }\n return json;\n });\n}\n\n// src/drum-machine/drum-machine.ts\nfunction getDrumMachineNames() {\n return Object.keys(INSTRUMENTS);\n}\nvar INSTRUMENTS = {\n \"TR-808\": \"https://smpldsnds.github.io/drum-machines/TR-808/dm.json\",\n \"Casio-RZ1\": \"https://smpldsnds.github.io/drum-machines/Casio-RZ1/dm.json\",\n \"LM-2\": \"https://smpldsnds.github.io/drum-machines/LM-2/dm.json\",\n \"MFB-512\": \"https://smpldsnds.github.io/drum-machines/MFB-512/dm.json\",\n \"Roland CR-8000\": \"https://smpldsnds.github.io/drum-machines/Roland-CR-8000/dm.json\"\n};\nfunction getConfig2(options) {\n var _a, _b, _c;\n const config = {\n instrument: (_a = options == null ? void 0 : options.instrument) != null ? _a : \"TR-808\",\n storage: (_b = options == null ? void 0 : options.storage) != null ? _b : HttpStorage,\n url: (_c = options == null ? void 0 : options.url) != null ? _c : \"\"\n };\n if (typeof config.instrument === \"string\") {\n config.url || (config.url = INSTRUMENTS[config.instrument]);\n if (!config.url)\n throw new Error(\"Invalid instrument: \" + config.instrument);\n } else if (!isDrumMachineInstrument(config.instrument)) {\n throw new Error(\"Invalid instrument: \" + config.instrument);\n }\n return config;\n}\nvar _instrument;\nvar DrumMachine = class {\n constructor(context, options) {\n __privateAdd(this, _instrument, EMPTY_INSTRUMENT);\n const config = getConfig2(options);\n const instrument = isDrumMachineInstrument(config.instrument) ? Promise.resolve(config.instrument) : fetchDrumMachineInstrument(config.url, config.storage);\n this.player = new DefaultPlayer(context, options);\n this.output = this.player.output;\n this.load = drumMachineLoader(\n context,\n this.player.buffers,\n instrument,\n config.storage\n ).then(() => this);\n instrument.then((instrument2) => {\n __privateSet(this, _instrument, instrument2);\n });\n }\n loaded() {\n return __async(this, null, function* () {\n console.warn(\"deprecated: use load instead\");\n return this.load;\n });\n }\n get sampleNames() {\n return __privateGet(this, _instrument).sampleNames;\n }\n getVariations(name) {\n var _a;\n return (_a = __privateGet(this, _instrument).sampleNameVariations[name]) != null ? _a : [];\n }\n start(sample) {\n var _a;\n const sampleName = __privateGet(this, _instrument).nameToSample[sample.note];\n return this.player.start(__spreadProps(__spreadValues({}, sample), {\n note: sampleName ? sampleName : sample.note,\n stopId: (_a = sample.stopId) != null ? _a : sample.note\n }));\n }\n stop(sample) {\n return this.player.stop(sample);\n }\n};\n_instrument = new WeakMap();\nfunction drumMachineLoader(context, buffers, instrument, storage) {\n var _a;\n const format = (_a = findFirstSupportedFormat([\"ogg\", \"m4a\"])) != null ? _a : \"ogg\";\n return instrument.then(\n (data) => Promise.all(\n data.samples.map((sample) => __async(this, null, function* () {\n const url = `${data.baseUrl}/${sample}.${format}`;\n const sampleName = sample.indexOf(\"/\") !== -1 ? sample : sample.replace(\"-\", \"/\");\n const buffer = yield loadAudioBuffer(context, url, storage);\n if (buffer)\n buffers[sampleName] = buffer;\n }))\n )\n );\n}\n\n// src/player/midi.ts\nfunction noteNameToMidi(note) {\n const REGEX = /^([a-gA-G]?)(#{1,}|b{1,}|)(-?\\d+)$/;\n const m = REGEX.exec(note);\n if (!m)\n return;\n const letter = m[1].toUpperCase();\n if (!letter)\n return;\n const acc = m[2];\n const alt = acc[0] === \"b\" ? -acc.length : acc.length;\n const oct = m[3] ? +m[3] : 4;\n const step = (letter.charCodeAt(0) + 3) % 7;\n return [0, 2, 4, 5, 7, 9, 11][step] + alt + 12 * (oct + 1);\n}\nfunction toMidi(note) {\n return note === void 0 ? void 0 : typeof note === \"number\" ? note : noteNameToMidi(note);\n}\n\n// src/sfz/sfz-load.ts\nfunction loadSfzBuffers(context, buffers, websfz, storage) {\n return __async(this, null, function* () {\n websfz.groups.forEach((group) => {\n const urls = getWebsfzGroupUrls(websfz, group);\n return loadAudioBuffers(context, buffers, urls, storage);\n });\n });\n}\nfunction SfzInstrumentLoader(instrument, storage) {\n return __async(this, null, function* () {\n var _a;\n const isWebsfz = (inst) => \"global\" in inst;\n const isSfzInstrument = (inst) => \"websfzUrl\" in inst;\n if (typeof instrument === \"string\") {\n return fetchWebSfz(instrument, storage);\n } else if (isWebsfz(instrument)) {\n return instrument;\n } else if (isSfzInstrument(instrument)) {\n const websfz = yield fetchWebSfz(instrument.websfzUrl, storage);\n (_a = websfz.meta) != null ? _a : websfz.meta = {};\n if (instrument.name)\n websfz.meta.name = instrument.name;\n if (instrument.baseUrl)\n websfz.meta.baseUrl = instrument.baseUrl;\n if (instrument.formats)\n websfz.meta.formats = instrument.formats;\n return websfz;\n } else {\n throw new Error(\"Invalid instrument: \" + JSON.stringify(instrument));\n }\n });\n}\nfunction loadAudioBuffers(context, buffers, urls, storage) {\n return __async(this, null, function* () {\n yield Promise.all(\n Object.keys(urls).map((sampleId) => __async(this, null, function* () {\n if (buffers[sampleId])\n return;\n const buffer = yield loadAudioBuffer(context, urls[sampleId], storage);\n if (buffer)\n buffers[sampleId] = buffer;\n return buffers;\n }))\n );\n });\n}\nfunction fetchWebSfz(url, storage) {\n return __async(this, null, function* () {\n try {\n const response = yield fetch(url);\n const json = yield response.json();\n return json;\n } catch (error) {\n console.warn(`Can't load SFZ file ${url}`, error);\n throw new Error(`Can't load SFZ file ${url}`);\n }\n });\n}\nfunction getWebsfzGroupUrls(websfz, group) {\n var _a, _b, _c, _d;\n const urls = {};\n const baseUrl = (_a = websfz.meta.baseUrl) != null ? _a : \"\";\n const format = (_c = findFirstSupportedFormat((_b = websfz.meta.formats) != null ? _b : [])) != null ? _c : \"ogg\";\n const prefix = (_d = websfz.global[\"default_path\"]) != null ? _d : \"\";\n if (!group)\n return urls;\n return group.regions.reduce((urls2, region) => {\n if (region.sample) {\n urls2[region.sample] = `${baseUrl}/${prefix}${region.sample}.${format}`;\n }\n return urls2;\n }, urls);\n}\n\n// src/sfz/sfz-regions.ts\nfunction checkRange(value, low, hi) {\n const isAboveLow = low === void 0 || value !== void 0 && value >= low;\n const isBelowHi = hi === void 0 || value !== void 0 && value <= hi;\n return isAboveLow && isBelowHi;\n}\nfunction findRegions(websfz, note) {\n const regions = [];\n for (const group of websfz.groups) {\n if (checkRange(note.midi, group.lokey, group.hikey) && checkRange(note.velocity, group.lovel, group.hivel) && checkRange(note.cc64, group.locc64, group.hicc64)) {\n for (const region of group.regions) {\n if (checkRange(note.midi, region.lokey, region.hikey) && checkRange(note.velocity, region.lovel, region.hivel) && checkRange(note.cc64, group.locc64, group.hicc64)) {\n regions.push([group, region]);\n }\n }\n }\n }\n return regions;\n}\n\n// src/sfz/sfz-sampler.ts\nvar EMPTY_WEBSFZ = Object.freeze({\n meta: {},\n global: {},\n groups: []\n});\nvar _websfz, _startLayers, startLayers_fn;\nvar SfzSampler = class {\n constructor(context, options) {\n this.context = context;\n __privateAdd(this, _startLayers);\n __privateAdd(this, _websfz, void 0);\n this.options = Object.freeze(\n Object.assign(\n {\n volume: 100,\n velocity: 100,\n storage: HttpStorage,\n detune: 0,\n destination: context.destination\n },\n options\n )\n );\n this.player = new DefaultPlayer(context, options);\n __privateSet(this, _websfz, EMPTY_WEBSFZ);\n this.load = SfzInstrumentLoader(options.instrument, this.options.storage).then((result) => {\n __privateSet(this, _websfz, Object.freeze(result));\n return loadSfzBuffers(\n context,\n this.player.buffers,\n __privateGet(this, _websfz),\n this.options.storage\n );\n }).then(() => this);\n }\n get output() {\n return this.player.output;\n }\n loaded() {\n return __async(this, null, function* () {\n console.warn(\"deprecated: use load instead\");\n return this.load;\n });\n }\n start(sample) {\n __privateMethod(this, _startLayers, startLayers_fn).call(this, typeof sample === \"object\" ? sample : { note: sample });\n }\n stop(sample) {\n this.player.stop(sample);\n }\n disconnect() {\n this.player.disconnect();\n }\n};\n_websfz = new WeakMap();\n_startLayers = new WeakSet();\nstartLayers_fn = function(sample) {\n var _a;\n const midi = toMidi(sample.note);\n if (midi === void 0)\n return () => void 0;\n const velocity = (_a = sample.velocity) != null ? _a : this.options.velocity;\n const regions = findRegions(__privateGet(this, _websfz), { midi, velocity });\n const onEnded = () => {\n var _a2;\n (_a2 = sample.onEnded) == null ? void 0 : _a2.call(sample, sample);\n };\n const stopAll = regions.map(([group, region]) => {\n var _a2, _b, _c;\n let target = (_b = (_a2 = region.pitch_keycenter) != null ? _a2 : region.key) != null ? _b : midi;\n const detune = (midi - target) * 100;\n return this.player.start(__spreadProps(__spreadValues({}, sample), {\n note: region.sample,\n decayTime: sample.decayTime,\n detune: detune + ((_c = sample.detune) != null ? _c : this.options.detune),\n onEnded,\n stopId: midi\n }));\n });\n switch (stopAll.length) {\n case 0:\n return () => void 0;\n case 1:\n return stopAll[0];\n default:\n return (time) => stopAll.forEach((stop) => stop(time));\n }\n};\n\n// src/tremolo.ts\nfunction createTremolo(context, depth) {\n const input = context.createGain();\n const output = context.createGain();\n input.channelCount = 2;\n input.channelCountMode = \"explicit\";\n const splitter = context.createChannelSplitter(2);\n const ampL = context.createGain();\n const ampR = context.createGain();\n const merger = context.createChannelMerger(2);\n const lfoL = context.createOscillator();\n lfoL.type = \"sine\";\n lfoL.frequency.value = 1;\n lfoL.start();\n const lfoLAmp = context.createGain();\n const lfoR = context.createOscillator();\n lfoR.type = \"sine\";\n lfoR.frequency.value = 1.1;\n lfoR.start();\n const lfoRAmp = context.createGain();\n input.connect(splitter);\n splitter.connect(ampL, 0);\n splitter.connect(ampR, 1);\n ampL.connect(merger, 0, 0);\n ampR.connect(merger, 0, 1);\n lfoL.connect(lfoLAmp);\n lfoLAmp.connect(ampL.gain);\n lfoR.connect(lfoRAmp);\n lfoRAmp.connect(ampR.gain);\n merger.connect(output);\n const unsubscribe = depth((depth2) => {\n lfoLAmp.gain.value = depth2;\n lfoRAmp.gain.value = depth2;\n });\n input.disconnect = () => {\n unsubscribe();\n lfoL.stop();\n lfoR.stop();\n input.disconnect(splitter);\n splitter.disconnect(ampL, 0);\n splitter.disconnect(ampR, 1);\n ampL.disconnect(merger, 0, 0);\n ampR.disconnect(merger, 0, 1);\n lfoL.disconnect(ampL);\n lfoR.disconnect(ampR);\n merger.disconnect(output);\n };\n return { input, output };\n}\n\n// src/electric-piano.ts\nfunction getElectricPianoNames() {\n return Object.keys(INSTRUMENTS2);\n}\nvar INSTRUMENTS2 = {\n CP80: \"https://danigb.github.io/samples/gs-e-pianos/CP80/cp80.websfz.json\",\n PianetT: \"https://danigb.github.io/samples/gs-e-pianos/Pianet T/pianet-t.websfz.json\",\n WurlitzerEP200: \"https://danigb.github.io/samples/gs-e-pianos/Wurlitzer EP200/wurlitzer-ep200.websfz.json\",\n TX81Z: \"https://danigb.github.io/samples/vcsl/TX81Z/tx81z-fm-piano.websfz.json\"\n};\nvar ElectricPiano = class extends SfzSampler {\n constructor(context, options) {\n var _a;\n super(context, __spreadProps(__spreadValues({}, options), {\n instrument: (_a = INSTRUMENTS2[options.instrument]) != null ? _a : options.instrument\n }));\n const depth = createControl(0);\n this.tremolo = {\n level: (level) => depth.set(midiVelToGain(level))\n };\n const tremolo = createTremolo(context, depth.subscribe);\n this.output.addInsert(tremolo);\n }\n};\n\n// src/player/layers.ts\nfunction createEmptySamplerInstrument(options = {}) {\n return { groups: [], options };\n}\nfunction createEmptyRegionGroup() {\n return { regions: [] };\n}\nfunction findSamplesInRegions(group, sample, seqNumber, options) {\n const results = [];\n const midi = toMidi(sample.note);\n if (midi === void 0)\n return results;\n for (const region of group.regions) {\n const found = findSampleInRegion(\n midi,\n seqNumber != null ? seqNumber : 0,\n sample,\n region,\n options\n );\n if (found)\n results.push(found);\n }\n return results;\n}\nfunction findFirstSampleInRegions(group, sample, seqNumber, options) {\n const midi = toMidi(sample.note);\n if (midi === void 0)\n return void 0;\n for (const region of group.regions) {\n const found = findSampleInRegion(\n midi,\n seqNumber != null ? seqNumber : 0,\n sample,\n region,\n options\n );\n if (found)\n return found;\n }\n return void 0;\n}\nfunction findSampleInRegion(midi, seqNum, sample, region, defaults) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _A, _B;\n const matchMidi = midi >= ((_a = region.midiLow) != null ? _a : 0) && midi < ((_b = region.midiHigh) != null ? _b : 127) + 1;\n if (!matchMidi)\n return void 0;\n const matchVelocity = sample.velocity === void 0 || sample.velocity >= ((_c = region.velLow) != null ? _c : 0) && sample.velocity <= ((_d = region.velHigh) != null ? _d : 127);\n if (!matchVelocity)\n return void 0;\n if (region.seqLength) {\n const currentSeq = seqNum % region.seqLength;\n const regionIndex = ((_e = region.seqPosition) != null ? _e : 1) - 1;\n if (currentSeq !== regionIndex)\n return void 0;\n }\n const semitones = midi - region.midiPitch;\n const velocity = (_f = sample.velocity) != null ? _f : defaults == null ? void 0 : defaults.velocity;\n const regionGainOffset = region.volume ? dbToGain(region.volume) : 0;\n const sampleGainOffset = (_h = (_g = sample.gainOffset) != null ? _g : defaults == null ? void 0 : defaults.gainOffset) != null ? _h : 0;\n const sampleDetune = (_i = sample.detune) != null ? _i : 0;\n return {\n decayTime: (_l = (_k = sample == null ? void 0 : sample.decayTime) != null ? _k : (_j = region.sample) == null ? void 0 : _j.decayTime) != null ? _l : defaults == null ? void 0 : defaults.decayTime,\n detune: 100 * (semitones + ((_m = region.tune) != null ? _m : 0)) + sampleDetune,\n duration: (_p = (_o = sample == null ? void 0 : sample.duration) != null ? _o : (_n = region.sample) == null ? void 0 : _n.duration) != null ? _p : defaults == null ? void 0 : defaults.duration,\n gainOffset: sampleGainOffset + regionGainOffset || void 0,\n loop: (_s = (_r = sample == null ? void 0 : sample.loop) != null ? _r : (_q = region.sample) == null ? void 0 : _q.loop) != null ? _s : defaults == null ? void 0 : defaults.loop,\n loopEnd: (_v = (_u = sample == null ? void 0 : sample.loopEnd) != null ? _u : (_t = region.sample) == null ? void 0 : _t.loopEnd) != null ? _v : defaults == null ? void 0 : defaults.loopEnd,\n loopStart: (_y = (_x = sample == null ? void 0 : sample.loopStart) != null ? _x : (_w = region.sample) == null ? void 0 : _w.loopStart) != null ? _y : defaults == null ? void 0 : defaults.loopStart,\n lpfCutoffHz: (_B = (_A = sample == null ? void 0 : sample.lpfCutoffHz) != null ? _A : (_z = region.sample) == null ? void 0 : _z.lpfCutoffHz) != null ? _B : defaults == null ? void 0 : defaults.lpfCutoffHz,\n name: region.sampleName,\n note: midi,\n onEnded: sample.onEnded,\n onStart: sample.onStart,\n stopId: sample.name,\n time: sample.time,\n velocity: velocity == void 0 ? void 0 : velocity\n };\n}\nfunction spreadRegions(regions) {\n if (regions.length === 0)\n return [];\n regions.sort((a, b) => a.midiPitch - b.midiPitch);\n regions[0].midiLow = 0;\n regions[0].midiHigh = 127;\n if (regions.length === 1)\n return regions;\n for (let i = 1; i < regions.length; i++) {\n const prev = regions[i - 1];\n const curr = regions[i];\n const mid = Math.floor((prev.midiPitch + curr.midiPitch) / 2);\n prev.midiHigh = mid;\n curr.midiLow = mid + 1;\n }\n regions[regions.length - 1].midiHigh = 127;\n return regions;\n}\n\n// src/player/region-player.ts\nvar RegionPlayer = class {\n constructor(context, options) {\n this.context = context;\n this.seqNum = 0;\n const channel = new Channel(context, options);\n this.instrument = createEmptySamplerInstrument(options);\n this.player = new QueuedPlayer(\n new SamplePlayer(context, __spreadProps(__spreadValues({}, options), { destination: channel.input })),\n options\n );\n this.output = channel;\n }\n get buffers() {\n return this.player.buffers;\n }\n start(sample) {\n const stopAll = [];\n const sampleStart = typeof sample === \"object\" ? sample : { note: sample };\n for (const group of this.instrument.groups) {\n const found = findSamplesInRegions(group, sampleStart, this.seqNum);\n this.seqNum++;\n for (const sample2 of found) {\n let stop = this.player.start(sample2);\n stopAll.push(stop);\n }\n }\n return (time) => stopAll.forEach((stop) => stop(time));\n }\n stop(sample) {\n if (sample == void 0) {\n this.player.stop();\n return;\n }\n const toStop = typeof sample === \"object\" ? sample : { stopId: sample };\n const midi = toMidi(toStop.stopId);\n if (!midi)\n return;\n toStop.stopId = midi;\n this.player.stop(toStop);\n }\n disconnect() {\n this.output.disconnect();\n this.player.disconnect();\n }\n};\n\n// src/sfz2.ts\nfunction SfzInstrumentLoader2(url, config) {\n const audioExt = getPreferredAudioExtension();\n return (context, storage) => __async(this, null, function* () {\n const sfz = yield fetch(url).then((res) => res.text());\n const errors = sfzToLayer(sfz, config.group);\n if (errors.length) {\n console.warn(\"Problems converting sfz\", errors);\n }\n const sampleNames = /* @__PURE__ */ new Set();\n config.group.regions.forEach((r) => sampleNames.add(r.sampleName));\n return Promise.all(\n Array.from(sampleNames).map((sampleName) => __async(this, null, function* () {\n const sampleUrl = config.urlFromSampleName(sampleName, audioExt);\n const buffer = yield loadAudioBuffer(context, sampleUrl, storage);\n config.buffers[sampleName] = buffer;\n }))\n ).then(() => config.group);\n });\n}\nfunction sfzToLayer(sfz, group) {\n let mode = \"global\";\n const tokens = sfz.split(\"\\n\").map(parseToken).filter((x) => !!x);\n const scope = new Scope();\n let errors = [];\n for (const token of tokens) {\n switch (token.type) {\n case \"mode\":\n errors.push(scope.closeScope(mode, group));\n mode = token.value;\n break;\n case \"prop:num\":\n case \"prop:str\":\n case \"prop:num_arr\":\n scope.push(token.key, token.value);\n break;\n case \"unknown\":\n console.warn(\"Unknown SFZ token\", token.value);\n break;\n }\n }\n closeScope(mode, scope, group);\n return errors.filter((x) => !!x);\n function closeScope(mode2, scope2, group2) {\n }\n}\nvar MODE_REGEX = /^<([^>]+)>$/;\nvar PROP_NUM_REGEX = /^([^=]+)=([-\\.\\d]+)$/;\nvar PROP_STR_REGEX = /^([^=]+)=(.+)$/;\nvar PROP_NUM_ARR_REGEX = /^([^=]+)_(\\d+)=(\\d+)$/;\nfunction parseToken(line) {\n line = line.trim();\n if (line === \"\")\n return void 0;\n if (line.startsWith(\"//\"))\n return void 0;\n const modeMatch = line.match(MODE_REGEX);\n if (modeMatch)\n return { type: \"mode\", value: modeMatch[1] };\n const propNumArrMatch = line.match(PROP_NUM_ARR_REGEX);\n if (propNumArrMatch)\n return {\n type: \"prop:num_arr\",\n key: propNumArrMatch[1],\n value: [Number(propNumArrMatch[2]), Number(propNumArrMatch[3])]\n };\n const propNumMatch = line.match(PROP_NUM_REGEX);\n if (propNumMatch)\n return {\n type: \"prop:num\",\n key: propNumMatch[1],\n value: Number(propNumMatch[2])\n };\n const propStrMatch = line.match(PROP_STR_REGEX);\n if (propStrMatch)\n return {\n type: \"prop:str\",\n key: propStrMatch[1],\n value: propStrMatch[2]\n };\n return { type: \"unknown\", value: line };\n}\nvar _closeRegion, closeRegion_fn;\nvar Scope = class {\n constructor() {\n __privateAdd(this, _closeRegion);\n this.values = {};\n this.global = {};\n this.group = {};\n }\n closeScope(mode, group) {\n if (mode === \"global\") {\n __privateMethod(this, _closeRegion, closeRegion_fn).call(this, this.global);\n } else if (mode === \"group\") {\n this.group = __privateMethod(this, _closeRegion, closeRegion_fn).call(this, {});\n } else if (mode === \"region\") {\n const region = __privateMethod(this, _closeRegion, closeRegion_fn).call(this, __spreadValues(__spreadValues({\n sampleName: \"\",\n midiPitch: -1\n }, this.global), this.group));\n if (region.sampleName === \"\") {\n return \"Missing sample name\";\n }\n if (region.midiPitch === -1) {\n if (region.midiLow !== void 0) {\n region.midiPitch = region.midiLow;\n } else {\n return \"Missing pitch_keycenter\";\n }\n }\n if (region.seqLength && region.seqPosition === void 0) {\n region.seqPosition = 1;\n }\n if (region.ampRelease) {\n region.sample = { decayTime: region.ampRelease };\n delete region.ampRelease;\n }\n group.regions.push(region);\n }\n }\n get empty() {\n return Object.keys(this.values).length === 0;\n }\n get keys() {\n return Object.keys(this.values);\n }\n push(key, value) {\n this.values[key] = value;\n }\n popNum(key, dest, destKey) {\n if (typeof this.values[key] !== \"number\")\n return false;\n dest[destKey] = this.values[key];\n delete this.values[key];\n return true;\n }\n popStr(key, dest, destKey) {\n if (typeof this.values[key] !== \"string\")\n return false;\n dest[destKey] = this.values[key];\n delete this.values[key];\n return true;\n }\n popNumArr(key, dest, destKey) {\n if (!Array.isArray(this.values[key]))\n return false;\n dest[destKey] = this.values[key];\n delete this.values[key];\n return true;\n }\n};\n_closeRegion = new WeakSet();\ncloseRegion_fn = function(region) {\n this.popStr(\"sample\", region, \"sampleName\");\n this.popNum(\"pitch_keycenter\", region, \"midiPitch\");\n this.popNum(\"ampeg_attack\", region, \"ampAttack\");\n this.popNum(\"ampeg_release\", region, \"ampRelease\");\n this.popNum(\"bend_down\", region, \"bendDown\");\n this.popNum(\"bend_up\", region, \"bendUp\");\n this.popNum(\"group\", region, \"group\");\n this.popNum(\"hikey\", region, \"midiHigh\");\n this.popNum(\"hivel\", region, \"velHigh\");\n this.popNum(\"lokey\", region, \"midiLow\");\n this.popNum(\"offset\", region, \"offset\");\n this.popNum(\"lovel\", region, \"velLow\");\n this.popNum(\"off_by\", region, \"groupOffBy\");\n this.popNum(\"pitch_keytrack\", region, \"ignore\");\n this.popNum(\"seq_length\", region, \"seqLength\");\n this.popNum(\"seq_position\", region, \"seqPosition\");\n this.popNum(\"tune\", region, \"tune\");\n this.popNum(\"volume\", region, \"volume\");\n this.popNumArr(\"amp_velcurve\", region, \"ampVelCurve\");\n this.values = {};\n return region;\n};\n\n// src/versilian.ts\nvar instruments = [];\nvar BASE_URL = \"https://smpldsnds.github.io/sgossner-vcsl/\";\nfunction getVersilianInstruments() {\n return __async(this, null, function* () {\n if (instruments.length)\n return instruments;\n instruments = yield fetch(BASE_URL + \"sfz_files.json\").then(\n (res) => res.json()\n );\n return instruments;\n });\n}\nfunction getVcslInstrumentSfzUrl(instrument) {\n return BASE_URL + instrument + \".sfz\";\n}\nfunction VcslInstrumentLoader(instrument, buffers) {\n const url = getVcslInstrumentSfzUrl(instrument);\n const base = instrument.slice(0, instrument.lastIndexOf(\"/\") + 1);\n const sampleBase = `https://smpldsnds.github.io/sgossner-vcsl/${base}`;\n const group = createEmptyRegionGroup();\n return SfzInstrumentLoader2(url, {\n buffers,\n group,\n urlFromSampleName: (sampleName, audioExt) => {\n return sampleBase + \"/\" + sampleName.replace(\".wav\", audioExt);\n }\n });\n}\nvar Versilian = class {\n constructor(context, options = {}) {\n var _a, _b;\n this.config = {\n instrument: (_a = options.instrument) != null ? _a : \"Arco\",\n storage: (_b = options.storage) != null ? _b : HttpStorage\n };\n this.player = new RegionPlayer(context, options);\n const loader = VcslInstrumentLoader(\n this.config.instrument,\n this.player.buffers\n );\n this.load = loader(context, this.config.storage).then((group) => {\n this.player.instrument.groups.push(group);\n return this;\n });\n }\n get output() {\n return this.player.output;\n }\n get buffers() {\n return this.player.buffers;\n }\n get context() {\n return this.player.context;\n }\n start(sample) {\n return this.player.start(sample);\n }\n stop(sample) {\n return this.player.stop(sample);\n }\n disconnect() {\n this.player.disconnect();\n }\n};\n\n// src/mallet.ts\nfunction getMalletNames() {\n return Object.keys(NAME_TO_PATH);\n}\nvar Mallet = class extends Versilian {\n constructor(context, options) {\n var _a;\n super(context, __spreadProps(__spreadValues({}, options), {\n instrument: NAME_TO_PATH[(_a = options.instrument) != null ? _a : \"\"]\n }));\n }\n};\nvar NAME_TO_PATH = {\n \"Balafon - Hard Mallet\": \"Idiophones/Struck Idiophones/Balafon - Hard Mallet\",\n \"Balafon - Keyswitch\": \"Idiophones/Struck Idiophones/Balafon - Keyswitch\",\n \"Balafon - Soft Mallet\": \"Idiophones/Struck Idiophones/Balafon - Soft Mallet\",\n \"Balafon - Traditional Mallet\": \"Idiophones/Struck Idiophones/Balafon - Traditional Mallet\",\n \"Tubular Bells 1\": \"Idiophones/Struck Idiophones/Tubular Bells 1\",\n \"Tubular Bells 2\": \"Idiophones/Struck Idiophones/Tubular Bells 2\",\n \"Vibraphone - Bowed\": \"Idiophones/Struck Idiophones/Vibraphone - Bowed\",\n \"Vibraphone - Hard Mallets\": \"Idiophones/Struck Idiophones/Vibraphone - Hard Mallets\",\n \"Vibraphone - Keyswitch\": \"Idiophones/Struck Idiophones/Vibraphone - Keyswitch\",\n \"Vibraphone - Soft Mallets\": \"Idiophones/Struck Idiophones/Vibraphone - Soft Mallets\",\n \"Xylophone - Hard Mallets\": \"Idiophones/Struck Idiophones/Xylophone - Hard Mallets\",\n \"Xylophone - Keyswitch\": \"Idiophones/Struck Idiophones/Xylophone - Keyswitch\",\n \"Xylophone - Medium Mallets\": \"Idiophones/Struck Idiophones/Xylophone - Medium Mallets\",\n \"Xylophone - Soft Mallets\": \"Idiophones/Struck Idiophones/Xylophone - Soft Mallets\"\n};\n\n// src/mellotron.ts\nvar INSTRUMENT_VARIATIONS = {\n \"300 STRINGS CELLO\": [\"300 STRINGS\", \"CELL\"],\n \"300 STRINGS VIOLA\": [\"300 STRINGS\", \"VIOL\"]\n};\nfunction getMellotronNames() {\n return [\n \"300 STRINGS CELLO\",\n \"300 STRINGS VIOLA\",\n \"8VOICE CHOIR\",\n \"BASSA+STRNGS\",\n \"BOYS CHOIR\",\n \"CHA CHA FLT\",\n \"CHM CLARINET\",\n \"CHMB 3 VLNS\",\n \"CHMB ALTOSAX\",\n \"CHMB FEMALE\",\n \"CHMB MALE VC\",\n \"CHMB TNR SAX\",\n \"CHMB TRMBONE\",\n \"CHMB TRUMPET\",\n \"CHMBLN CELLO\",\n \"CHMBLN FLUTE\",\n \"CHMBLN OBOE\",\n \"DIXIE+TRMBN\",\n \"FOXTROT+SAX\",\n \"HALFSP.BRASS\",\n \"MIXED STRGS\",\n \"MKII BRASS\",\n \"MKII GUITAR\",\n \"MKII ORGAN\",\n \"MKII SAX\",\n \"MKII VIBES\",\n \"MKII VIOLINS\",\n \"MOVE BS+STGS\",\n \"STRGS+BRASS\",\n \"TROMB+TRMPT\",\n \"TRON 16VLNS\",\n \"TRON CELLO\",\n \"TRON FLUTE\",\n \"TRON VIOLA\"\n ];\n}\nvar Mellotron = class {\n constructor(context, options) {\n this.context = context;\n this.options = options;\n this.config = getMellotronConfig(options);\n this.player = new DefaultPlayer(context, options);\n this.group = createEmptyRegionGroup();\n const loader = loadMellotronInstrument(\n this.config.instrument,\n this.player.buffers,\n this.group\n );\n this.load = loader(context, this.config.storage).then(() => this);\n }\n get buffers() {\n return this.player.buffers;\n }\n get output() {\n return this.player.output;\n }\n start(sample) {\n const found = findFirstSampleInRegions(\n this.group,\n typeof sample === \"object\" ? sample : { note: sample },\n void 0,\n this.options\n );\n if (!found)\n return () => void 0;\n return this.player.start(found);\n }\n stop(sample) {\n this.player.stop(sample);\n }\n disconnect() {\n this.player.disconnect();\n }\n};\nfunction getMellotronConfig(options) {\n var _a, _b;\n return {\n instrument: (_a = options.instrument) != null ? _a : \"MKII VIOLINS\",\n storage: (_b = options.storage) != null ? _b : HttpStorage\n };\n}\nfunction loadMellotronInstrument(instrument, buffers, group) {\n let variation = INSTRUMENT_VARIATIONS[instrument];\n if (variation)\n instrument = variation[0];\n return (context, storage) => {\n const baseUrl = `https://smpldsnds.github.io/archiveorg-mellotron/${instrument}/`;\n const audioExt = getPreferredAudioExtension();\n return fetch(baseUrl + \"files.json\").then((res) => res.json()).then(\n (sampleNames) => Promise.all(\n sampleNames.map((sampleName) => {\n var _a;\n if (variation && !sampleName.includes(variation[1]))\n return;\n const midi = toMidi((_a = sampleName.split(\" \")[0]) != null ? _a : \"\");\n if (!midi)\n return;\n const sampleUrl = baseUrl + sampleName + audioExt;\n loadAudioBuffer(context, sampleUrl, storage).then((audioBuffer) => {\n var _a2;\n buffers[sampleName] = audioBuffer;\n const duration = (_a2 = audioBuffer == null ? void 0 : audioBuffer.duration) != null ? _a2 : 0;\n group.regions.push({\n sampleName,\n midiPitch: midi,\n sample: {\n loop: true,\n loopStart: duration / 10,\n loopEnd: duration - duration / 10\n }\n });\n });\n })\n )\n ).then(() => {\n spreadRegions(group.regions);\n });\n };\n}\n\n// src/reverb/processor.min.ts\nvar PROCESSOR = `\"use strict\";(()=>{var f=class extends AudioWorkletProcessor{_pDLength;_preDelay;_pDWrite;_lp1;_lp2;_lp3;_excPhase;_taps;_Delays;sampleRate;static get parameterDescriptors(){return[[\"preDelay\",0,0,sampleRate-1,\"k-rate\"],[\"bandwidth\",.9999,0,1,\"k-rate\"],[\"inputDiffusion1\",.75,0,1,\"k-rate\"],[\"inputDiffusion2\",.625,0,1,\"k-rate\"],[\"decay\",.5,0,1,\"k-rate\"],[\"decayDiffusion1\",.7,0,.999999,\"k-rate\"],[\"decayDiffusion2\",.5,0,.999999,\"k-rate\"],[\"damping\",.005,0,1,\"k-rate\"],[\"excursionRate\",.5,0,2,\"k-rate\"],[\"excursionDepth\",.7,0,2,\"k-rate\"],[\"wet\",1,0,1,\"k-rate\"],[\"dry\",0,0,1,\"k-rate\"]].map(e=>new Object({name:e[0],defaultValue:e[1],minValue:e[2],maxValue:e[3],automationRate:e[4]}))}constructor(e){super(),this.sampleRate=sampleRate,this._Delays=[],this._pDLength=sampleRate+(128-sampleRate%128),this._preDelay=new Float32Array(this._pDLength),this._pDWrite=0,this._lp1=0,this._lp2=0,this._lp3=0,this._excPhase=0,[.004771345,.003595309,.012734787,.009307483,.022579886,.149625349,.060481839,.1249958,.030509727,.141695508,.089244313,.106280031].forEach(a=>this.makeDelay(a,sampleRate)),this._taps=Int16Array.from([.008937872,.099929438,.064278754,.067067639,.066866033,.006283391,.035818689,.011861161,.121870905,.041262054,.08981553,.070931756,.011256342,.004065724],a=>Math.round(a*sampleRate))}makeDelay(e,a){let t=Math.round(e*a),s=2**Math.ceil(Math.log2(t));this._Delays.push([new Float32Array(s),t-1,0,s-1])}writeDelay(e,a){return this._Delays[e][0][this._Delays[e][1]]=a}readDelay(e){return this._Delays[e][0][this._Delays[e][2]]}readDelayAt(e,a){let t=this._Delays[e];return t[0][t[2]+a&t[3]]}readDelayCAt(e,a){let t=this._Delays[e],s=a-~~a,d=~~a+t[2]-1,r=t[3],D=t[0][d++&r],l=t[0][d++&r],h=t[0][d++&r],y=t[0][d&r],u=(3*(l-h)-D+y)/2,m=2*h+D-(5*l+y)/2,c=(h-D)/2;return((u*s+m)*s+c)*s+l}process(e,a,t){let s=~~t.preDelay[0],d=t.bandwidth[0],r=t.inputDiffusion1[0],D=t.inputDiffusion2[0],l=t.decay[0],h=t.decayDiffusion1[0],y=t.decayDiffusion2[0],u=1-t.damping[0],m=t.excursionRate[0]/sampleRate,c=t.excursionDepth[0]*sampleRate/1e3,w=t.wet[0]*.6,A=t.dry[0];if(e[0].length==2)for(let i=127;i>=0;i--)this._preDelay[this._pDWrite+i]=(e[0][0][i]+e[0][1][i])*.5,a[0][0][i]=e[0][0][i]*A,a[0][1][i]=e[0][1][i]*A;else if(e[0].length>0){this._preDelay.set(e[0][0],this._pDWrite);for(let i=127;i>=0;i--)a[0][0][i]=a[0][1][i]=e[0][0][i]*A}else this._preDelay.set(new Float32Array(128),this._pDWrite);let o=0;for(;o<128;){let i=0,b=0;this._lp1+=d*(this._preDelay[(this._pDLength+this._pDWrite-s+o)%this._pDLength]-this._lp1);let p=this.writeDelay(0,this._lp1-r*this.readDelay(0));p=this.writeDelay(1,r*(p-this.readDelay(1))+this.readDelay(0)),p=this.writeDelay(2,r*p+this.readDelay(1)-D*this.readDelay(2)),p=this.writeDelay(3,D*(p-this.readDelay(3))+this.readDelay(2));let k=D*p+this.readDelay(3),g=c*(1+Math.cos(this._excPhase*6.28)),x=c*(1+Math.sin(this._excPhase*6.2847)),_=this.writeDelay(4,k+l*this.readDelay(11)+h*this.readDelayCAt(4,g));this.writeDelay(5,this.readDelayCAt(4,g)-h*_),this._lp2+=u*(this.readDelay(5)-this._lp2),_=this.writeDelay(6,l*this._lp2-y*this.readDelay(6)),this.writeDelay(7,this.readDelay(6)+y*_),_=this.writeDelay(8,k+l*this.readDelay(7)+h*this.readDelayCAt(8,x)),this.writeDelay(9,this.readDelayCAt(8,x)-h*_),this._lp3+=u*(this.readDelay(9)-this._lp3),_=this.writeDelay(10,l*this._lp3-y*this.readDelay(10)),this.writeDelay(11,this.readDelay(10)+y*_),i=this.readDelayAt(9,this._taps[0])+this.readDelayAt(9,this._taps[1])-this.readDelayAt(10,this._taps[2])+this.readDelayAt(11,this._taps[3])-this.readDelayAt(5,this._taps[4])-this.readDelayAt(6,this._taps[5])-this.readDelayAt(7,this._taps[6]),b=this.readDelayAt(5,this._taps[7])+this.readDelayAt(5,this._taps[8])-this.readDelayAt(6,this._taps[9])+this.readDelayAt(7,this._taps[10])-this.readDelayAt(9,this._taps[11])-this.readDelayAt(10,this._taps[12])-this.readDelayAt(11,this._taps[13]),a[0][0][o]+=i*w,a[0][1][o]+=b*w,this._excPhase+=m,o++;for(let R=0,n=this._Delays[0];R {\n this.input.connect(reverb);\n reverb.connect(__privateGet(this, _output));\n __privateSet(this, _effect, reverb);\n return this;\n }));\n }\n get paramNames() {\n return PARAMS;\n }\n getParam(name) {\n var _a;\n return (_a = __privateGet(this, _effect)) == null ? void 0 : _a.parameters.get(\"preDelay\");\n }\n get isReady() {\n return __privateGet(this, _effect) !== void 0;\n }\n ready() {\n return __privateGet(this, _ready);\n }\n connect(output) {\n if (__privateGet(this, _effect)) {\n __privateGet(this, _effect).disconnect(__privateGet(this, _output));\n __privateGet(this, _effect).connect(output);\n }\n __privateSet(this, _output, output);\n }\n};\n_effect = new WeakMap();\n_ready = new WeakMap();\n_output = new WeakMap();\n\n// src/sampler.ts\nvar _options;\nvar Sampler = class {\n constructor(context, options = {}) {\n this.context = context;\n __privateAdd(this, _options, void 0);\n var _a, _b, _c, _d, _e, _f;\n __privateSet(this, _options, {\n destination: (_a = options.destination) != null ? _a : context.destination,\n detune: 0,\n volume: (_b = options.volume) != null ? _b : 100,\n velocity: (_c = options.velocity) != null ? _c : 100,\n buffers: (_d = options.buffers) != null ? _d : {},\n volumeToGain: (_e = options.volumeToGain) != null ? _e : midiVelToGain\n });\n this.player = new DefaultPlayer(context, __privateGet(this, _options));\n const storage = (_f = options.storage) != null ? _f : HttpStorage;\n const loader = typeof __privateGet(this, _options).buffers === \"function\" ? __privateGet(this, _options).buffers : createAudioBuffersLoader(__privateGet(this, _options).buffers, storage);\n this.load = loader(context, this.player.buffers).then(() => this);\n }\n loaded() {\n return __async(this, null, function* () {\n console.warn(\"deprecated: use load instead\");\n return this.load;\n });\n }\n get output() {\n return this.player.output;\n }\n start(sample) {\n return this.player.start(\n typeof sample === \"object\" ? sample : { note: sample }\n );\n }\n stop(sample) {\n return this.player.stop(\n typeof sample === \"object\" ? sample : sample === void 0 ? void 0 : { stopId: sample }\n );\n }\n disconnect() {\n return this.player.disconnect();\n }\n};\n_options = new WeakMap();\nfunction createAudioBuffersLoader(source, storage) {\n return (context, buffers) => __async(this, null, function* () {\n yield Promise.all([\n Object.keys(source).map((key) => __async(this, null, function* () {\n const value = source[key];\n if (value instanceof AudioBuffer) {\n buffers[key] = value;\n } else if (typeof value === \"string\") {\n const buffer = yield loadAudioBuffer(context, value, storage);\n if (buffer)\n buffers[key] = buffer;\n }\n }))\n ]);\n });\n}\n\n// src/smolken.ts\nfunction getSmolkenNames() {\n return [\"Pizzicato\", \"Arco\", \"Switched\"];\n}\nfunction getSmolkenUrl(instrument) {\n const FILES = {\n Arco: \"arco\",\n Pizzicato: \"pizz\",\n Switched: \"switched\"\n };\n return `https://smpldsnds.github.io/sfzinstruments-dsmolken-double-bass/d_smolken_rubner_bass_${FILES[instrument]}.sfz`;\n}\nvar Smolken = class {\n constructor(context, options = {}) {\n this.seqNum = 0;\n var _a, _b;\n this.config = {\n instrument: (_a = options.instrument) != null ? _a : \"Arco\",\n storage: (_b = options.storage) != null ? _b : HttpStorage\n };\n this.player = new DefaultPlayer(context, options);\n this.group = createEmptyRegionGroup();\n const url = getSmolkenUrl(this.config.instrument);\n const loader = SfzInstrumentLoader2(url, {\n buffers: this.player.buffers,\n group: this.group,\n urlFromSampleName: (sampleName, audioExt) => {\n const samplePath = sampleName.replace(\"\\\\\", \"/\").replace(\".wav\", audioExt);\n return `https://smpldsnds.github.io/sfzinstruments-dsmolken-double-bass/${samplePath}`;\n }\n });\n this.load = loader(context, this.config.storage).then(() => this);\n }\n get output() {\n return this.player.output;\n }\n get buffers() {\n return this.player.buffers;\n }\n get context() {\n return this.player.context;\n }\n start(sample) {\n const found = findSamplesInRegions(\n this.group,\n typeof sample === \"object\" ? sample : { note: sample },\n this.seqNum\n );\n this.seqNum++;\n const stopAll = found.map((sample2) => this.player.start(sample2));\n return (time) => stopAll.forEach((stop) => stop(time));\n }\n stop(sample) {\n if (sample == void 0) {\n this.player.stop();\n return;\n }\n const toStop = typeof sample === \"object\" ? sample : { stopId: sample };\n const midi = toMidi(toStop.stopId);\n if (!midi)\n return;\n toStop.stopId = midi;\n this.player.stop(toStop);\n }\n disconnect() {\n this.player.disconnect();\n }\n};\n\n// src/soundfont/soundfont-instrument.ts\nfunction gleitzKitUrl(name, kit) {\n var _a;\n const format = (_a = findFirstSupportedFormat([\"ogg\", \"mp3\"])) != null ? _a : \"mp3\";\n return `https://gleitz.github.io/midi-js-soundfonts/${kit}/${name}-${format}.js`;\n}\nfunction soundfontInstrumentLoader(url, buffers, group) {\n return (context, storage) => __async(this, null, function* () {\n const sourceFile = yield (yield storage.fetch(url)).text();\n const json = midiJsToJson(sourceFile);\n const noteNames = Object.keys(json);\n yield Promise.all(\n noteNames.map((noteName) => __async(this, null, function* () {\n const midi = toMidi(noteName);\n if (!midi)\n return;\n const audioData = base64ToArrayBuffer(\n removeBase64Prefix(json[noteName])\n );\n const buffer = yield context.decodeAudioData(audioData);\n buffers[noteName] = buffer;\n group.regions.push({\n sampleName: noteName,\n midiPitch: midi\n });\n }))\n );\n spreadRegions(group.regions);\n });\n}\nfunction midiJsToJson(source) {\n const header = source.indexOf(\"MIDI.Soundfont.\");\n if (header < 0)\n throw Error(\"Invalid MIDI.js Soundfont format\");\n const start = source.indexOf(\"=\", header) + 2;\n const end = source.lastIndexOf(\",\");\n return JSON.parse(source.slice(start, end) + \"}\");\n}\nfunction removeBase64Prefix(audioBase64) {\n return audioBase64.slice(audioBase64.indexOf(\",\") + 1);\n}\nfunction base64ToArrayBuffer(base64) {\n const decoded = window.atob(base64);\n const len = decoded.length;\n const bytes = new Uint8Array(len);\n for (let i = 0; i < len; i++) {\n bytes[i] = decoded.charCodeAt(i);\n }\n return bytes.buffer;\n}\nvar SOUNDFONT_KITS = [\"MusyngKite\", \"FluidR3_GM\"];\nvar SOUNDFONT_INSTRUMENTS = [\n \"accordion\",\n \"acoustic_bass\",\n \"acoustic_grand_piano\",\n \"acoustic_guitar_nylon\",\n \"acoustic_guitar_steel\",\n \"agogo\",\n \"alto_sax\",\n \"applause\",\n \"bagpipe\",\n \"banjo\",\n \"baritone_sax\",\n \"bassoon\",\n \"bird_tweet\",\n \"blown_bottle\",\n \"brass_section\",\n \"breath_noise\",\n \"bright_acoustic_piano\",\n \"celesta\",\n \"cello\",\n \"choir_aahs\",\n \"church_organ\",\n \"clarinet\",\n \"clavinet\",\n \"contrabass\",\n \"distortion_guitar\",\n \"drawbar_organ\",\n \"dulcimer\",\n \"electric_bass_finger\",\n \"electric_bass_pick\",\n \"electric_grand_piano\",\n \"electric_guitar_clean\",\n \"electric_guitar_jazz\",\n \"electric_guitar_muted\",\n \"electric_piano_1\",\n \"electric_piano_2\",\n \"english_horn\",\n \"fiddle\",\n \"flute\",\n \"french_horn\",\n \"fretless_bass\",\n \"fx_1_rain\",\n \"fx_2_soundtrack\",\n \"fx_3_crystal\",\n \"fx_4_atmosphere\",\n \"fx_5_brightness\",\n \"fx_6_goblins\",\n \"fx_7_echoes\",\n \"fx_8_scifi\",\n \"glockenspiel\",\n \"guitar_fret_noise\",\n \"guitar_harmonics\",\n \"gunshot\",\n \"harmonica\",\n \"harpsichord\",\n \"helicopter\",\n \"honkytonk_piano\",\n \"kalimba\",\n \"koto\",\n \"lead_1_square\",\n \"lead_2_sawtooth\",\n \"lead_3_calliope\",\n \"lead_4_chiff\",\n \"lead_5_charang\",\n \"lead_6_voice\",\n \"lead_7_fifths\",\n \"lead_8_bass__lead\",\n \"marimba\",\n \"melodic_tom\",\n \"music_box\",\n \"muted_trumpet\",\n \"oboe\",\n \"ocarina\",\n \"orchestra_hit\",\n \"orchestral_harp\",\n \"overdriven_guitar\",\n \"pad_1_new_age\",\n \"pad_2_warm\",\n \"pad_3_polysynth\",\n \"pad_4_choir\",\n \"pad_5_bowed\",\n \"pad_6_metallic\",\n \"pad_7_halo\",\n \"pad_8_sweep\",\n \"pan_flute\",\n \"percussive_organ\",\n \"piccolo\",\n \"pizzicato_strings\",\n \"recorder\",\n \"reed_organ\",\n \"reverse_cymbal\",\n \"rock_organ\",\n \"seashore\",\n \"shakuhachi\",\n \"shamisen\",\n \"shanai\",\n \"sitar\",\n \"slap_bass_1\",\n \"slap_bass_2\",\n \"soprano_sax\",\n \"steel_drums\",\n \"string_ensemble_1\",\n \"string_ensemble_2\",\n \"synth_bass_1\",\n \"synth_bass_2\",\n \"synth_brass_1\",\n \"synth_brass_2\",\n \"synth_choir\",\n \"synth_drum\",\n \"synth_strings_1\",\n \"synth_strings_2\",\n \"taiko_drum\",\n \"tango_accordion\",\n \"telephone_ring\",\n \"tenor_sax\",\n \"timpani\",\n \"tinkle_bell\",\n \"tremolo_strings\",\n \"trombone\",\n \"trumpet\",\n \"tuba\",\n \"tubular_bells\",\n \"vibraphone\",\n \"viola\",\n \"violin\",\n \"voice_oohs\",\n \"whistle\",\n \"woodblock\",\n \"xylophone\"\n];\n\n// src/soundfont/soundfont-loops.ts\nfunction getGoldstSoundfontLoopsUrl(instrument, kit) {\n if (instrument.startsWith(\"http\"))\n return void 0;\n return `https://goldst.dev/midi-js-soundfonts/${kit}/${instrument}-loop.json`;\n}\nfunction fetchSoundfontLoopData(url, sampleRate = 44100) {\n return __async(this, null, function* () {\n if (!url)\n return void 0;\n try {\n const req = yield fetch(url);\n if (req.status !== 200)\n return;\n const raw = yield req.json();\n const loopData = {};\n Object.keys(raw).forEach((key) => {\n const midi = toMidi(key);\n if (midi) {\n const offsets = raw[key];\n loopData[midi] = [offsets[0] / sampleRate, offsets[1] / sampleRate];\n }\n });\n return loopData;\n } catch (err) {\n return void 0;\n }\n });\n}\n\n// src/soundfont/soundfont.ts\nfunction getSoundfontKits() {\n return SOUNDFONT_KITS;\n}\nfunction getSoundfontNames() {\n return SOUNDFONT_INSTRUMENTS;\n}\nvar _hasLoops;\nvar Soundfont = class {\n constructor(context, options) {\n this.context = context;\n __privateAdd(this, _hasLoops, void 0);\n this.config = getSoundfontConfig(options);\n this.player = new DefaultPlayer(context, options);\n this.group = createEmptyRegionGroup();\n __privateSet(this, _hasLoops, false);\n const loader = soundfontLoader(\n this.config.instrumentUrl,\n this.config.loopDataUrl,\n this.player.buffers,\n this.group\n );\n this.load = loader(context, this.config.storage).then((hasLoops) => {\n __privateSet(this, _hasLoops, hasLoops);\n return this;\n });\n const gain = context.createGain();\n gain.gain.value = this.config.extraGain;\n this.player.output.addInsert(gain);\n }\n get output() {\n return this.player.output;\n }\n get hasLoops() {\n return __privateGet(this, _hasLoops);\n }\n loaded() {\n return __async(this, null, function* () {\n console.warn(\"deprecated: use load instead\");\n return this.load;\n });\n }\n disconnect() {\n this.player.disconnect();\n }\n start(sample) {\n const found = findFirstSampleInRegions(\n this.group,\n typeof sample === \"object\" ? sample : { note: sample }\n );\n if (!found)\n return () => void 0;\n return this.player.start(found);\n }\n stop(sample) {\n return this.player.stop(sample);\n }\n};\n_hasLoops = new WeakMap();\nfunction soundfontLoader(url, loopsUrl, buffers, group) {\n const loadInstrument = soundfontInstrumentLoader(url, buffers, group);\n return (context, storage) => __async(this, null, function* () {\n const [_, loops] = yield Promise.all([\n loadInstrument(context, storage),\n fetchSoundfontLoopData(loopsUrl)\n ]);\n if (loops) {\n group.regions.forEach((region) => {\n var _a;\n const loop = loops[region.midiPitch];\n if (loop) {\n (_a = region.sample) != null ? _a : region.sample = {};\n region.sample.loop = true;\n region.sample.loopStart = loop[0];\n region.sample.loopEnd = loop[1];\n }\n });\n }\n return !!loops;\n });\n}\nfunction getSoundfontConfig(options) {\n var _a, _b, _c, _d;\n if (!options.instrument && !options.instrumentUrl) {\n throw Error(\"Soundfont: instrument or instrumentUrl is required\");\n }\n const config = {\n kit: \"MusyngKite\",\n instrument: options.instrument,\n storage: (_a = options.storage) != null ? _a : HttpStorage,\n // This is to compensate the low volume of the original samples\n extraGain: (_b = options.extraGain) != null ? _b : 5,\n loadLoopData: (_c = options.loadLoopData) != null ? _c : false,\n loopDataUrl: options.loopDataUrl,\n instrumentUrl: (_d = options.instrumentUrl) != null ? _d : \"\"\n };\n if (config.instrument && config.instrument.startsWith(\"http\")) {\n console.warn(\n \"Use 'instrumentUrl' instead of 'instrument' to load from a URL\"\n );\n config.instrumentUrl = config.instrument;\n config.instrument = void 0;\n }\n if (config.instrument && !config.instrumentUrl) {\n config.instrumentUrl = gleitzKitUrl(config.instrument, config.kit);\n }\n if (config.loadLoopData && config.instrument && !config.loopDataUrl) {\n config.loopDataUrl = getGoldstSoundfontLoopsUrl(\n config.instrument,\n config.kit\n );\n }\n return config;\n}\n\n// src/soundfont2.ts\nvar _instrumentNames;\nvar Soundfont2Sampler = class {\n constructor(context, options) {\n this.context = context;\n this.options = options;\n __privateAdd(this, _instrumentNames, []);\n this.player = new RegionPlayer(context, options);\n this.load = loadSoundfont(options).then((soundfont) => {\n this.soundfont = soundfont;\n __privateSet(this, _instrumentNames, soundfont.instruments.map(\n (instrument) => instrument.header.name\n ));\n }).then(() => this);\n }\n get instrumentNames() {\n return __privateGet(this, _instrumentNames);\n }\n loadInstrument(instrumentName) {\n var _a, _b, _c;\n const sf2instrument = (_a = this.soundfont) == null ? void 0 : _a.instruments.find(\n (inst) => inst.header.name === instrumentName\n );\n if (!sf2instrument)\n return;\n const buffers = this.player.buffers;\n const group = {\n regions: []\n };\n for (const zone of sf2instrument.zones) {\n const sample = zone.sample;\n const header = sample.header;\n const buffer = getAudioBufferFromSample(this.context, sample);\n let region = {\n sampleName: sample.header.name,\n midiPitch: sample.header.originalPitch,\n midiLow: (_b = zone.keyRange) == null ? void 0 : _b.lo,\n midiHigh: (_c = zone.keyRange) == null ? void 0 : _c.hi,\n sample: {\n loop: header.startLoop >= 0 && header.endLoop > header.startLoop,\n loopStart: header.startLoop / header.sampleRate,\n loopEnd: header.endLoop / header.sampleRate\n }\n };\n group.regions.push(region);\n buffers[region.sampleName] = buffer;\n }\n const instrument = {\n groups: [group],\n options: this.options\n };\n this.player.instrument = instrument;\n return [instrument, buffers];\n }\n get output() {\n return this.player.output;\n }\n start(sample) {\n return this.player.start(sample);\n }\n stop(sample) {\n return this.player.stop(sample);\n }\n disconnect() {\n this.player.disconnect();\n }\n};\n_instrumentNames = new WeakMap();\nfunction getAudioBufferFromSample(context, sample) {\n const { header, data: int16 } = sample;\n const float32 = new Float32Array(int16.length);\n for (let i = 0; i < int16.length; i++) {\n float32[i] = int16[i] / 32768;\n }\n const audioBuffer = context.createBuffer(\n 1,\n float32.length,\n header.sampleRate\n );\n const channelData = audioBuffer.getChannelData(0);\n channelData.set(float32);\n return audioBuffer;\n}\nfunction loadSoundfont(options) {\n return __async(this, null, function* () {\n const buffer = yield fetch(options.url).then((res) => res.arrayBuffer());\n const data = new Uint8Array(buffer);\n return options.createSoundfont(data);\n });\n}\n\n// src/splendid-grand-piano.ts\nvar BASE_URL2 = \"https://danigb.github.io/samples/splendid-grand-piano\";\nvar _sampleToMidi, sampleToMidi_fn;\nvar SplendidGrandPiano = class {\n constructor(context, options) {\n this.context = context;\n __privateAdd(this, _sampleToMidi);\n this.options = Object.assign(\n {\n baseUrl: BASE_URL2,\n storage: HttpStorage,\n detune: 0,\n volume: 100,\n velocity: 100,\n decayTime: 0.5\n },\n options\n );\n this.player = new DefaultPlayer(context, this.options);\n const loader = splendidGrandPianoLoader(\n this.options.baseUrl,\n this.options.storage,\n this.options.notesToLoad\n );\n this.load = loader(context, this.player.buffers).then(() => this);\n }\n get output() {\n return this.player.output;\n }\n get buffers() {\n return this.player.buffers;\n }\n loaded() {\n return __async(this, null, function* () {\n console.warn(\"deprecated: use load instead\");\n return this.load;\n });\n }\n start(sampleOrNote) {\n var _a, _b;\n const sample = typeof sampleOrNote === \"object\" ? __spreadValues({}, sampleOrNote) : { note: sampleOrNote };\n const found = __privateMethod(this, _sampleToMidi, sampleToMidi_fn).call(this, sample);\n if (!found)\n return () => void 0;\n sample.note = found[0];\n sample.stopId = (_a = sample.stopId) != null ? _a : found[1];\n sample.detune = found[2] + ((_b = sample.detune) != null ? _b : this.options.detune);\n return this.player.start(sample);\n }\n stop(sample) {\n return this.player.stop(sample);\n }\n};\n_sampleToMidi = new WeakSet();\nsampleToMidi_fn = function(sample) {\n var _a;\n const midi = toMidi(sample.note);\n if (!midi)\n return;\n const vel = (_a = sample.velocity) != null ? _a : this.options.velocity;\n const layerIdx = LAYERS.findIndex(\n (layer2) => vel >= layer2.vel_range[0] && vel <= layer2.vel_range[1]\n );\n const layer = LAYERS[layerIdx];\n if (!layer)\n return;\n return findNearestMidiInLayer(layer.name, midi, this.player.buffers);\n};\nfunction findNearestMidiInLayer(prefix, midi, buffers) {\n let i = 0;\n while (buffers[prefix + (midi + i)] === void 0 && i < 128) {\n if (i > 0)\n i = -i;\n else\n i = -i + 1;\n }\n return i === 127 ? [prefix + midi, midi, 0] : [prefix + (midi + i), midi, -i * 100];\n}\nfunction splendidGrandPianoLoader(baseUrl, storage, notesToLoad) {\n var _a;\n const format = (_a = findFirstSupportedFormat([\"ogg\", \"m4a\"])) != null ? _a : \"ogg\";\n let layers = notesToLoad ? LAYERS.filter(\n (layer) => layer.vel_range[0] <= notesToLoad.velocityRange[1] && layer.vel_range[1] >= notesToLoad.velocityRange[0]\n ) : LAYERS;\n return (context, buffers) => __async(this, null, function* () {\n for (const layer of layers) {\n const samples = notesToLoad ? layer.samples.filter((sample) => notesToLoad.notes.includes(sample[0])) : layer.samples;\n yield Promise.all(\n samples.map((_0) => __async(this, [_0], function* ([midi, name]) {\n const url = `${baseUrl}/${name}.${format}`;\n const buffer = yield loadAudioBuffer(context, url, storage);\n if (buffer)\n buffers[layer.name + midi] = buffer;\n }))\n );\n }\n });\n}\nvar LAYERS = [\n {\n name: \"PPP\",\n vel_range: [1, 40],\n cutoff: 1e3,\n samples: [\n [23, \"PP-B-1\"],\n [27, \"PP-D#0\"],\n [29, \"PP-F0\"],\n [31, \"PP-G0\"],\n [33, \"PP-A0\"],\n [35, \"PP-B0\"],\n [37, \"PP-C#1\"],\n [38, \"PP-D1\"],\n [40, \"PP-E1\"],\n [41, \"PP-F1\"],\n [43, \"PP-G1\"],\n [45, \"PP-A1\"],\n [47, \"PP-B1\"],\n [48, \"PP-C2\"],\n [50, \"PP-D2\"],\n [52, \"PP-E2\"],\n [53, \"PP-F2\"],\n [55, \"PP-G2\"],\n [56, \"PP-G#2\"],\n [57, \"PP-A2\"],\n [58, \"PP-A#2\"],\n [59, \"PP-B2\"],\n [60, \"PP-C3\"],\n [62, \"PP-D3\"],\n [64, \"PP-E3\"],\n [65, \"PP-F3\"],\n [67, \"PP-G3\"],\n [69, \"PP-A3\"],\n [71, \"PP-B3\"],\n [72, \"PP-C4\"],\n [74, \"PP-D4\"],\n [76, \"PP-E4\"],\n [77, \"PP-F4\"],\n [79, \"PP-G4\"],\n [80, \"PP-G#4\"],\n [81, \"PP-A4\"],\n [82, \"PP-A#4\"],\n [83, \"PP-B4\"],\n [85, \"PP-C#5\"],\n [86, \"PP-D5\"],\n [87, \"PP-D#5\"],\n [89, \"PP-F5\"],\n [90, \"PP-F#5\"],\n [91, \"PP-G5\"],\n [92, \"PP-G#5\"],\n [93, \"PP-A5\"],\n [94, \"PP-A#5\"],\n [95, \"PP-B5\"],\n [96, \"PP-C6\"],\n [97, \"PP-C#6\"],\n [98, \"PP-D6\"],\n [99, \"PP-D#6\"],\n [100, \"PP-E6\"],\n [101, \"PP-F6\"],\n [102, \"PP-F#6\"],\n [103, \"PP-G6\"],\n [104, \"PP-G#6\"],\n [105, \"PP-A6\"],\n [106, \"PP-A#6\"],\n [107, \"PP-B6\"],\n [108, \"PP-C7\"]\n ]\n },\n {\n name: \"PP\",\n vel_range: [41, 67],\n samples: [\n [23, \"PP-B-1\"],\n [27, \"PP-D#0\"],\n [29, \"PP-F0\"],\n [31, \"PP-G0\"],\n [33, \"PP-A0\"],\n [35, \"PP-B0\"],\n [37, \"PP-C#1\"],\n [38, \"PP-D1\"],\n [40, \"PP-E1\"],\n [41, \"PP-F1\"],\n [43, \"PP-G1\"],\n [45, \"PP-A1\"],\n [47, \"PP-B1\"],\n [48, \"PP-C2\"],\n [50, \"PP-D2\"],\n [52, \"PP-E2\"],\n [53, \"PP-F2\"],\n [55, \"PP-G2\"],\n [56, \"PP-G#2\"],\n [57, \"PP-A2\"],\n [58, \"PP-A#2\"],\n [59, \"PP-B2\"],\n [60, \"PP-C3\"],\n [62, \"PP-D3\"],\n [64, \"PP-E3\"],\n [65, \"PP-F3\"],\n [67, \"PP-G3\"],\n [69, \"PP-A3\"],\n [71, \"PP-B3\"],\n [72, \"PP-C4\"],\n [74, \"PP-D4\"],\n [76, \"PP-E4\"],\n [77, \"PP-F4\"],\n [79, \"PP-G4\"],\n [80, \"PP-G#4\"],\n [81, \"PP-A4\"],\n [82, \"PP-A#4\"],\n [83, \"PP-B4\"],\n [85, \"PP-C#5\"],\n [86, \"PP-D5\"],\n [87, \"PP-D#5\"],\n [89, \"PP-F5\"],\n [90, \"PP-F#5\"],\n [91, \"PP-G5\"],\n [92, \"PP-G#5\"],\n [93, \"PP-A5\"],\n [94, \"PP-A#5\"],\n [95, \"PP-B5\"],\n [96, \"PP-C6\"],\n [97, \"PP-C#6\"],\n [98, \"PP-D6\"],\n [99, \"PP-D#6\"],\n [100, \"PP-E6\"],\n [101, \"PP-F6\"],\n [102, \"PP-F#6\"],\n [103, \"PP-G6\"],\n [104, \"PP-G#6\"],\n [105, \"PP-A6\"],\n [106, \"PP-A#6\"],\n [107, \"PP-B6\"],\n [108, \"PP-C7\"]\n ]\n },\n {\n name: \"MP\",\n vel_range: [68, 84],\n samples: [\n [23, \"Mp-B-1\"],\n [27, \"Mp-D#0\"],\n [29, \"Mp-F0\"],\n [31, \"Mp-G0\"],\n [33, \"Mp-A0\"],\n [35, \"Mp-B0\"],\n [37, \"Mp-C#1\"],\n [38, \"Mp-D1\"],\n [40, \"Mp-E1\"],\n [41, \"Mp-F1\"],\n [43, \"Mp-G1\"],\n [45, \"Mp-A1\"],\n [47, \"Mp-B1\"],\n [48, \"Mp-C2\"],\n [50, \"Mp-D2\"],\n [52, \"Mp-E2\"],\n [53, \"Mp-F2\"],\n [55, \"Mp-G2\"],\n [56, \"Mp-G#2\"],\n [57, \"Mp-A2\"],\n [58, \"Mp-A#2\"],\n [59, \"Mp-B2\"],\n [60, \"Mp-C3\"],\n [62, \"Mp-D3\"],\n [64, \"Mp-E3\"],\n [65, \"Mp-F3\"],\n [67, \"Mp-G3\"],\n [69, \"Mp-A3\"],\n [71, \"Mp-B3\"],\n [72, \"Mp-C4\"],\n [74, \"Mp-D4\"],\n [76, \"Mp-E4\"],\n [77, \"Mp-F4\"],\n [79, \"Mp-G4\"],\n [80, \"Mp-G#4\"],\n [81, \"Mp-A4\"],\n [82, \"Mp-A#4\"],\n [83, \"Mp-B4\"],\n [85, \"Mp-C#5\"],\n [86, \"Mp-D5\"],\n [87, \"Mp-D#5\"],\n [88, \"Mp-E5\"],\n [89, \"Mp-F5\"],\n [90, \"Mp-F#5\"],\n [91, \"Mp-G5\"],\n [92, \"Mp-G#5\"],\n [93, \"Mp-A5\"],\n [94, \"Mp-A#5\"],\n [95, \"Mp-B5\"],\n [96, \"Mp-C6\"],\n [97, \"Mp-C#6\"],\n [98, \"Mp-D6\"],\n [99, \"Mp-D#6\"],\n [100, \"PP-E6\"],\n [101, \"Mp-F6\"],\n [102, \"Mp-F#6\"],\n [103, \"Mp-G6\"],\n [104, \"Mp-G#6\"],\n [105, \"Mp-A6\"],\n [106, \"Mp-A#6\"],\n [107, \"PP-B6\"],\n [108, \"PP-C7\"]\n ]\n },\n {\n name: \"MF\",\n vel_range: [85, 100],\n samples: [\n [23, \"Mf-B-1\"],\n [27, \"Mf-D#0\"],\n [29, \"Mf-F0\"],\n [31, \"Mf-G0\"],\n [33, \"Mf-A0\"],\n [35, \"Mf-B0\"],\n [37, \"Mf-C#1\"],\n [38, \"Mf-D1\"],\n [40, \"Mf-E1\"],\n [41, \"Mf-F1\"],\n [43, \"Mf-G1\"],\n [45, \"Mf-A1\"],\n [47, \"Mf-B1\"],\n [48, \"Mf-C2\"],\n [50, \"Mf-D2\"],\n [52, \"Mf-E2\"],\n [53, \"Mf-F2\"],\n [55, \"Mf-G2\"],\n [56, \"Mf-G#2\"],\n [57, \"Mf-A2\"],\n [58, \"Mf-A#2\"],\n [59, \"Mf-B2\"],\n [60, \"Mf-C3\"],\n [62, \"Mf-D3\"],\n [64, \"Mf-E3\"],\n [65, \"Mf-F3\"],\n [67, \"Mf-G3\"],\n [69, \"Mf-A3\"],\n [71, \"Mf-B3\"],\n [72, \"Mf-C4\"],\n [74, \"Mf-D4\"],\n [76, \"Mf-E4\"],\n [77, \"Mf-F4\"],\n [79, \"Mf-G4\"],\n [80, \"Mf-G#4\"],\n [81, \"Mf-A4\"],\n [82, \"Mf-A#4\"],\n [83, \"Mf-B4\"],\n [85, \"Mf-C#5\"],\n [86, \"Mf-D5\"],\n [87, \"Mf-D#5\"],\n [88, \"Mf-E5\"],\n [89, \"Mf-F5\"],\n [90, \"Mf-F#5\"],\n [91, \"Mf-G5\"],\n [92, \"Mf-G#5\"],\n [93, \"Mf-A5\"],\n [94, \"Mf-A#5\"],\n [95, \"Mf-B5\"],\n [96, \"Mf-C6\"],\n [97, \"Mf-C#6\"],\n [98, \"Mf-D6\"],\n [99, \"Mf-D#6\"],\n [100, \"Mf-E6\"],\n [101, \"Mf-F6\"],\n [102, \"Mf-F#6\"],\n [103, \"Mf-G6\"],\n [104, \"Mf-G#6\"],\n [105, \"Mf-A6\"],\n [106, \"Mf-A#6\"],\n [107, \"Mf-B6\"],\n [108, \"PP-C7\"]\n ]\n },\n {\n name: \"FF\",\n vel_range: [101, 127],\n samples: [\n [23, \"FF-B-1\"],\n [27, \"FF-D#0\"],\n [29, \"FF-F0\"],\n [31, \"FF-G0\"],\n [33, \"FF-A0\"],\n [35, \"FF-B0\"],\n [37, \"FF-C#1\"],\n [38, \"FF-D1\"],\n [40, \"FF-E1\"],\n [41, \"FF-F1\"],\n [43, \"FF-G1\"],\n [45, \"FF-A1\"],\n [47, \"FF-B1\"],\n [48, \"FF-C2\"],\n [50, \"FF-D2\"],\n [52, \"FF-E2\"],\n [53, \"FF-F2\"],\n [55, \"FF-G2\"],\n [56, \"FF-G#2\"],\n [57, \"FF-A2\"],\n [58, \"FF-A#2\"],\n [59, \"FF-B2\"],\n [60, \"FF-C3\"],\n [62, \"FF-D3\"],\n [64, \"FF-E3\"],\n [65, \"FF-F3\"],\n [67, \"FF-G3\"],\n [69, \"FF-A3\"],\n [71, \"FF-B3\"],\n [72, \"FF-C4\"],\n [74, \"FF-D4\"],\n [76, \"FF-E4\"],\n [77, \"FF-F4\"],\n [79, \"FF-G4\"],\n [80, \"FF-G#4\"],\n [81, \"FF-A4\"],\n [82, \"FF-A#4\"],\n [83, \"FF-B4\"],\n [85, \"FF-C#5\"],\n [86, \"FF-D5\"],\n [88, \"FF-E5\"],\n [89, \"FF-F5\"],\n [91, \"FF-G5\"],\n [93, \"FF-A5\"],\n [95, \"Mf-B5\"],\n [96, \"Mf-C6\"],\n [97, \"Mf-C#6\"],\n [98, \"Mf-D6\"],\n [99, \"Mf-D#6\"],\n [100, \"Mf-E6\"],\n [102, \"Mf-F#6\"],\n [103, \"Mf-G6\"],\n [104, \"Mf-G#6\"],\n [105, \"Mf-A6\"],\n [106, \"Mf-A#6\"],\n [107, \"Mf-B6\"],\n [108, \"Mf-C7\"]\n ]\n }\n];\nexport {\n CacheStorage,\n DrumMachine,\n ElectricPiano,\n HttpStorage,\n LAYERS,\n Mallet,\n Mellotron,\n NAME_TO_PATH,\n Reverb,\n Sampler,\n Smolken,\n Soundfont,\n Soundfont2Sampler,\n SplendidGrandPiano,\n VcslInstrumentLoader,\n Versilian,\n getDrumMachineNames,\n getElectricPianoNames,\n getMalletNames,\n getMellotronNames,\n getSmolkenNames,\n getSoundfontKits,\n getSoundfontNames,\n getVersilianInstruments\n};\n//# sourceMappingURL=index.mjs.map","import MidiPlayer from \"midi-player-js\";\r\nimport { TimeMapEntry } from \"@/models/TimeMapEntry\";\r\nimport { SplendidGrandPiano } from \"smplr\";\r\n\r\ndeclare global {\r\n interface Window {\r\n webkitAudioContext: typeof AudioContext;\r\n }\r\n}\r\n\r\nexport const useMidiStore = defineStore(\"midi\", () => {\r\n let player: MidiPlayer.Player | null = null;\r\n let instrument: SplendidGrandPiano | null = null;\r\n\r\n const debug = useDebug();\r\n const mediaStore = useMediaPlayerStore();\r\n const fs = useFullScreenStore();\r\n const defaultBpm = ref(0);\r\n const ready = ref(false);\r\n const bpm = ref(0);\r\n const bpmFactor = ref(1);\r\n let timemap: any[] = [];\r\n const playing = ref(false);\r\n const duration = ref(0);\r\n const progressTime = ref(0);\r\n const autoScroll = ref(false);\r\n const fullMidiController = ref(false);\r\n const route = useRoute();\r\n let rawMidi: string = \"\";\r\n const progressPercent = computed(\r\n () => `${(progressTime.value / duration.value) * 100}%`,\r\n );\r\n const formattedDuration = computed(() => formatSeconds(duration.value));\r\n const formattedProgressTime = computed(() =>\r\n formatSeconds(progressTime.value),\r\n );\r\n let initTick = 0;\r\n let lastTick = -1;\r\n\r\n function formatSeconds(seconds: number) {\r\n return new Date(seconds * 1000).toISOString().substr(14, 5);\r\n }\r\n\r\n async function loadInstrument() {\r\n if (instrument) {\r\n return;\r\n }\r\n\r\n //instrument = await Soundfont.instrument(ac, \"acoustic_grand_piano\");\r\n if (!window.AudioContext) {\r\n window.AudioContext = window.webkitAudioContext;\r\n }\r\n const ac = new window.AudioContext();\r\n instrument = new SplendidGrandPiano(ac, { decayTime: 1 });\r\n (window as any).instrument = instrument;\r\n }\r\n\r\n async function init() {\r\n if (player) {\r\n return;\r\n }\r\n\r\n if (!instrument) {\r\n throw new Error(\"instrument not found in init\");\r\n }\r\n\r\n await instrument.loaded();\r\n\r\n player = new MidiPlayer.Player(async (e: any) => {\r\n if (!player) {\r\n throw new Error(\"player not found\");\r\n }\r\n if (!instrument) {\r\n throw new Error(\"instrument not available\");\r\n }\r\n\r\n if (playing.value) {\r\n progressTime.value = duration.value - player.getSongTimeRemaining();\r\n }\r\n\r\n if (e.name === \"Note on\" && e.velocity !== 0) {\r\n debug.log(\"playing note\", e, instrument);\r\n instrument.start({\r\n note: e.noteName,\r\n velocity: e.velocity,\r\n duration: 2,\r\n });\r\n }\r\n\r\n if (bpm.value !== player.tempo) {\r\n setBpm(bpm.value);\r\n }\r\n });\r\n\r\n player.on(\"endOfFile\", async (e: any) => {\r\n lastTick = -1;\r\n // app.currentPage = 1;\r\n removeHighlights();\r\n await nextTick();\r\n playing.value = false;\r\n progressTime.value = 0;\r\n });\r\n\r\n player.on(\"fileLoaded\", (e: any) => {\r\n initTick = e.startTick;\r\n });\r\n\r\n player.on(\"playing\", (e: any) => {\r\n updateVisualAtTick(e.tick);\r\n });\r\n\r\n (window as any).player = player;\r\n }\r\n\r\n function updateVisualAtTick(tick: number) {\r\n if (!player) {\r\n return;\r\n }\r\n\r\n const qstampStart = lastTick / player.division;\r\n const qstampEnd = tick / player.division;\r\n\r\n const notesFound = timemap.filter(\r\n (t) => t.qstamp > qstampStart && t.qstamp <= qstampEnd,\r\n );\r\n\r\n if (notesFound.length) {\r\n removeHighlights();\r\n notesFound.forEach((n) => {\r\n if (n.measureOn) {\r\n drawRedLine(n.measureOn);\r\n }\r\n if (n.on) {\r\n highlightNotes(n.on);\r\n }\r\n if (n.off) {\r\n unhighlightNotes(n.off);\r\n }\r\n if (n.restsOn) {\r\n highlightNotes(n.restsOn);\r\n }\r\n if (n.restsOff) {\r\n unhighlightNotes(n.restsOff);\r\n }\r\n });\r\n }\r\n lastTick = tick;\r\n }\r\n\r\n const redLine = document.createElement(\"div\");\r\n redLine.style.background = \"red\";\r\n redLine.style.width = \"2px\";\r\n redLine.style.position = \"fixed\";\r\n redLine.style.zIndex = \"10\";\r\n redLine.style.transition = \"0.1s all ease\";\r\n redLine.style.left = \"10px\";\r\n redLine.style.top = \"10px\";\r\n redLine.style.height = \"100px\";\r\n redLine.style.display = \"none\";\r\n\r\n document.body.appendChild(redLine);\r\n\r\n function drawRedLine(measureId: string) {\r\n const element = document.querySelector(`#${measureId}`);\r\n if (!element) {\r\n return;\r\n }\r\n const rect = element.getBoundingClientRect();\r\n redLine.style.height = rect.height + \"px\";\r\n redLine.style.top = rect.y + \"px\";\r\n redLine.style.left = rect.x + \"px\";\r\n }\r\n\r\n let lastPlayingPageElement: null | Element = null;\r\n\r\n function highlightNotes(elementIds: string[]) {\r\n if(fs.fullScreenEnabled){\r\n const ids = elementIds.map((id: string) => `#${id}`).join(\",\");\r\n const elements = document.querySelectorAll(ids);\r\n if (elements && elements.length) {\r\n elements.forEach((e) => {\r\n e.classList.add(\"highlight-active\");\r\n const system = e.closest(\".system\");\r\n if (autoScroll.value) {\r\n system?.scrollIntoView({\r\n behavior: \"smooth\",\r\n block: \"center\",\r\n });\r\n }\r\n \r\n const page = e.closest(\".musicpage\");\r\n \r\n if (\r\n lastPlayingPageElement === null ||\r\n lastPlayingPageElement !== page\r\n ) {\r\n const wrapper = e.closest(\".wrapper\");\r\n \r\n if (page && wrapper) {\r\n const scrollTop =\r\n (page as HTMLDivElement).offsetTop -\r\n (wrapper as HTMLDivElement).offsetTop;\r\n wrapper.scrollTo({ top: scrollTop, behavior: \"smooth\" });\r\n }\r\n \r\n lastPlayingPageElement = page;\r\n }\r\n });\r\n }\r\n } else {\r\n elementIds.forEach((id: string) => {\r\n const element = document.getElementById(id);\r\n if (element) {\r\n element.classList.add(\"highlight-active\");\r\n \r\n const system = element.closest(\".system\") as HTMLElement | null;\r\n if (autoScroll.value && system) {\r\n const systemRect = system.getBoundingClientRect();\r\n const scrollPosition = window.scrollY + systemRect.top - (window.innerHeight - systemRect.height) / 2;\r\n \r\n window.scrollTo({\r\n top: scrollPosition,\r\n behavior: \"smooth\",\r\n });\r\n }\r\n \r\n const page = element.closest(\".musicpage\") as HTMLElement | null;\r\n \r\n if (\r\n lastPlayingPageElement === null ||\r\n lastPlayingPageElement !== page\r\n ) {\r\n const wrapper = element.closest(\".wrapper\") as HTMLElement | null;\r\n \r\n if (page && wrapper) {\r\n const pageRect = page.getBoundingClientRect();\r\n const wrapperRect = wrapper.getBoundingClientRect();\r\n const scrollTop = wrapper.scrollTop + pageRect.top - wrapperRect.top;\r\n \r\n wrapper.scrollTo({ top: scrollTop, behavior: \"smooth\" });\r\n }\r\n \r\n lastPlayingPageElement = page;\r\n }\r\n }\r\n });\r\n }\r\n }\r\n \r\n function unhighlightNotes(elementIds: string[]) {\r\n const ids = elementIds.map((id: string) => `#${id}`).join(\",\");\r\n const elements = document.querySelectorAll(ids);\r\n if (elements && elements.length) {\r\n elements.forEach((e) => e.classList.remove(\"highlight-active\"));\r\n }\r\n }\r\n\r\n function removeHighlights() {\r\n document\r\n .querySelectorAll(\"svg .highlight-active\")\r\n .forEach((e) => e.classList.remove(\"highlight-active\"));\r\n }\r\n\r\n function pause() {\r\n removeHighlights();\r\n player?.pause();\r\n instrument?.stop();\r\n lastPlayingPageElement = null;\r\n }\r\n\r\n function play() {\r\n instrument?.context.resume();\r\n if (!ready.value) {\r\n loadSong();\r\n return;\r\n }\r\n player?.play();\r\n mediaStore.pause();\r\n playing.value = true;\r\n lastPlayingPageElement = null;\r\n }\r\n\r\n function stop() {\r\n removeHighlights();\r\n instrument?.stop();\r\n player?.stop();\r\n playing.value = false;\r\n lastPlayingPageElement = null;\r\n }\r\n\r\n async function togglePlay() {\r\n instrument?.context.resume();\r\n\r\n if (!ready.value) {\r\n await loadSong();\r\n return;\r\n }\r\n\r\n playing.value = !playing.value;\r\n if (playing.value) {\r\n mediaStore.pause();\r\n player?.play();\r\n } else {\r\n instrument?.stop();\r\n player?.pause();\r\n }\r\n }\r\n\r\n function skipToSeconds(seconds: number) {\r\n if (!player) {\r\n return;\r\n }\r\n player.skipToSeconds(seconds);\r\n play();\r\n }\r\n\r\n // should be called before loading song\r\n async function preloadDataForPlayback(\r\n midiData: string,\r\n _timemap: TimeMapEntry[],\r\n _defaultBpm: number | null,\r\n ) {\r\n clearSong();\r\n rawMidi = midiData;\r\n timemap = _timemap;\r\n defaultBpm.value = _defaultBpm || 120;\r\n bpm.value = defaultBpm.value || 120;\r\n\r\n if (timemap[0].tempo) {\r\n bpmFactor.value = defaultBpm.value / parseInt(timemap[0].tempo);\r\n } else {\r\n bpmFactor.value = 1;\r\n }\r\n }\r\n\r\n async function loadSong() {\r\n lastPlayingPageElement = null;\r\n if (!rawMidi) {\r\n throw new Error(\"no midi found\");\r\n }\r\n if (!timemap) {\r\n throw new Error(\"no timemap file found\");\r\n }\r\n if (!defaultBpm.value) {\r\n defaultBpm.value = 120;\r\n }\r\n\r\n await init();\r\n\r\n if (!player) {\r\n throw new Error(\"Midi player not initialized\");\r\n }\r\n\r\n ready.value = false;\r\n lastTick = -1;\r\n player.loadDataUri(\"data:audio/midi;base64,\" + rawMidi);\r\n\r\n duration.value = player.getSongTime() || 0;\r\n progressTime.value = 0;\r\n ready.value = true;\r\n await play();\r\n player.tempo = Math.round(bpm.value / bpmFactor.value);\r\n }\r\n\r\n //for now just assume this is clicked during playback.\r\n async function noteclick(noteId: string) {\r\n const entryIndex = timemap.findIndex(\r\n (i: any) => i.on && i.on.includes(noteId),\r\n );\r\n\r\n if (entryIndex < 0) {\r\n throw new Error(\"cannot find noteId in timemap\");\r\n }\r\n\r\n if (!ready.value) {\r\n await loadSong();\r\n }\r\n if (!player) {\r\n throw new Error(\"Cannot find midi player\");\r\n }\r\n\r\n lastTick = -1;\r\n if (entryIndex >= 1) {\r\n lastTick = timemap[entryIndex - 1].qstamp * player.division;\r\n }\r\n\r\n const qstamp = timemap[entryIndex].qstamp;\r\n const tick = qstamp * player.division;\r\n player.skipToTick(tick);\r\n player.play();\r\n playing.value = true;\r\n }\r\n\r\n function clearSong() {\r\n ready.value = false;\r\n stop();\r\n player = null;\r\n }\r\n\r\n function restartSong() {\r\n stop();\r\n loadSong();\r\n }\r\n\r\n function toggleAutoScroll() {\r\n autoScroll.value = !autoScroll.value;\r\n }\r\n\r\n function setAutoScroll(v: boolean) {\r\n autoScroll.value = v;\r\n }\r\n\r\n function setFullMidiController(v:boolean) {\r\n fullMidiController.value = v;\r\n }\r\n\r\n watch(\r\n () => route.fullPath,\r\n () => {\r\n clearSong();\r\n setFullMidiController(false);\r\n }\r\n );\r\n\r\n async function setBpm(_bpm: number) {\r\n if (!player) {\r\n return;\r\n }\r\n const wasPlaying = player.isPlaying();\r\n if (wasPlaying) {\r\n player.pause();\r\n }\r\n\r\n bpm.value = _bpm;\r\n player.tempo = Math.round(bpm.value / bpmFactor.value);\r\n duration.value = player.getSongTime() || 0;\r\n await nextTick();\r\n\r\n if (wasPlaying) {\r\n player.play();\r\n }\r\n }\r\n\r\n return {\r\n ready,\r\n bpm,\r\n playing,\r\n duration,\r\n progressTime,\r\n pause,\r\n play,\r\n skipToSeconds,\r\n init,\r\n stop,\r\n togglePlay,\r\n setBpm,\r\n loadSong,\r\n noteclick,\r\n clearSong,\r\n restartSong,\r\n autoScroll,\r\n toggleAutoScroll,\r\n setAutoScroll,\r\n fullMidiController,\r\n setFullMidiController,\r\n progressPercent,\r\n formattedDuration,\r\n formattedProgressTime,\r\n timemap,\r\n preloadDataForPlayback,\r\n loadInstrument,\r\n };\r\n});\r\n","\r\n\r\n\r\n\r\n\r\n","\r\n\r\n\r\n\r\n\r\n","export async function downloadFile(text: string, filename: string) {\r\n const saveAs = (await import(\"file-saver\")).saveAs;\r\n const blob = new Blob([text], { type: \"text/plain;charset=utf-8\" });\r\n saveAs(blob, filename);\r\n}\r\n\r\nexport async function downloadUrl(url: string, filename: string) {\r\n const saveAs = (await import(\"file-saver\")).saveAs;\r\n const response = await fetch(url);\r\n const blob = await response.blob();\r\n saveAs(blob, filename);\r\n}\r\n\r\nexport async function downloadTextFile(text: string, filename: string) {\r\n await downloadFile(text, filename + \".txt\");\r\n}\r\n\r\nexport function sanitizeFilename(filename: string) {\r\n // Define the regex pattern for unallowable characters\r\n const pattern = /[<>:\"/\\\\|?*]/g;\r\n // Replace unallowable characters with an empty string\r\n const sanitizedFilename = filename.replace(pattern, \"\");\r\n return sanitizedFilename;\r\n}\r\n"],"file":"assets/download-CuqNBbPR.js"}