midi-audio-player 1.1.1 → 1.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -84,10 +84,3 @@ Maxime Larrivée-Roy
84
84
 
85
85
  [https://github.com/ZmotriN/midi-audio-player](https://github.com/ZmotriN/midi-audio-player)
86
86
 
87
-
88
- ## Changelog
89
-
90
- ### Version 1.1.0
91
- * Complete refactor
92
- * Optimized WebAudioFont handling
93
- * Change instrument option to preset
package/dist/index.js CHANGED
@@ -7,8 +7,8 @@
7
7
  ██████╔╝██║██║ ██║██║ ╚═╝ ██║███████╗ ██║ ██║ ██║██║╚██████╗██║ ██╗
8
8
  ╚═════╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝ ╚═╝ ╚═╝ ╚═╝╚═╝ ╚═════╝╚═╝ ╚═╝
9
9
 
10
- Version: 1.1.0
11
- Généré: 2026-05-09 19:05:06
10
+ Version: 1.1.2
11
+ Généré: 2026-05-10 00:19:40
12
12
  Auteur: Maxime Larrivée-Roy <mlarriveeroy@gmail.com>
13
13
  Github: https://github.com/ZmotriN/midi-audio-player/
14
14
  Website: https://zmotrin.github.io/midi-audio-player/
@@ -1539,8 +1539,13 @@ var MidiAudioPlayer = class extends index.Player {
1539
1539
  await this.#endOfFile();
1540
1540
  });
1541
1541
  }
1542
+ async load(content) {
1543
+ if (this.isPlaying()) this.stop();
1544
+ this.#clearActiveNotes();
1545
+ await this.loadArrayBuffer(content);
1546
+ }
1542
1547
  async play(content = null) {
1543
- if (content) await this.#load(content);
1548
+ if (content) await this.load(content);
1544
1549
  await this.#audioCtx.resume();
1545
1550
  await super.play();
1546
1551
  }
@@ -1593,11 +1598,6 @@ var MidiAudioPlayer = class extends index.Player {
1593
1598
  this.#activeNotes.clear();
1594
1599
  }
1595
1600
  }
1596
- async #load(content) {
1597
- if (this.isPlaying()) this.stop();
1598
- this.#clearActiveNotes();
1599
- await this.loadArrayBuffer(content);
1600
- }
1601
1601
  };
1602
1602
 
1603
1603
  // index.js
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../node_modules/midi-player-js/build/index.browser.js", "../src/webaudiofontplayer.js", "../src/presets/defaultpreset.json", "../src/midiaudioplayer.js", "../index.js"],
4
- "sourcesContent": ["function _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 Object.defineProperty(Constructor, \"prototype\", {\n writable: false\n });\n return Constructor;\n}\n\n/**\n * Constants used in player.\n */\nvar Constants = {\n VERSION: '2.0.17',\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 = 0; i < this.events.length; i++) {\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 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 // Process all events that have passed to avoid falling behind on dense MIDI files.\n var events = [];\n\n while (this.events[this.eventIndex] && this.events[this.eventIndex].tick <= currentTick) {\n if (this.enabled) events.push(this.events[this.eventIndex]);\n this.eventIndex++;\n }\n\n if (events.length > 0) return events;\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 eventJson.string = this.getStringData(eventStartIndex);\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); // sf byte is signed (-7 to 7), but Uint8Array gives unsigned values\n\n var sf = eventJson.data[0] > 127 ? eventJson.data[0] - 256 : eventJson.data[0];\n\n if (sf >= 0) {\n eventJson.keySignature = Constants.CIRCLE_OF_FIFTHS[sf];\n } else {\n eventJson.keySignature = Constants.CIRCLE_OF_FOURTHS[Math.abs(sf)];\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 + 2 + varIntLength + 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]];\n eventJson.pressure = this.data[eventStartIndex + 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];\n eventJson.value = this.data[eventStartIndex + 1];\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 + 1] & 0x7f) << 7 | this.data[eventStartIndex] & 0x7f;\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 = this.data[eventStartIndex + 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 eventJson.value = (this.data[eventStartIndex + 2] & 0x7f) << 7 | this.data[eventStartIndex + 1] & 0x7f;\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.setTimeoutId = false;\n this.scheduledTime = 0;\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.tempoMap = [];\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 this.defaultTempo = 120;\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.stop();\n this.triggerPlayerEvent('endOfFile');\n } else {\n var result = track.handleEvent(this.tick, dryRun);\n\n if (dryRun && result) {\n if (result.hasOwnProperty('name') && result.name === 'Set Tempo') {\n // Grab tempo if available.\n this.setTempo(result.data);\n }\n\n if (result.hasOwnProperty('name') && result.name === 'Program Change') {\n if (!this.instruments.includes(result.value)) {\n this.instruments.push(result.value);\n }\n }\n } else if (result) {\n // result is an array of events during playback\n var events = Array.isArray(result) ? result : [result];\n events.forEach(function (event) {\n if (event.hasOwnProperty('name') && event.name === 'Set Tempo') {\n // Grab tempo if available.\n this.setTempo(event.data);\n }\n\n this.emitEvent(event);\n }, this);\n }\n }\n }, this);\n if (!dryRun && this.isPlaying()) 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 using drift-correcting setTimeout\n\n this.scheduledTime = Date.now();\n this.schedulePlayLoop(this.sampleRate);\n return this;\n }\n /**\n * Schedules the next play loop iteration, correcting for timer drift.\n * @param {number} delay - Delay in milliseconds before next iteration.\n * @return {undefined}\n */\n\n }, {\n key: \"schedulePlayLoop\",\n value: function schedulePlayLoop(delay) {\n var _this = this;\n\n this.setTimeoutId = setTimeout(function () {\n _this.playLoop();\n\n if (_this.setTimeoutId !== false) {\n _this.scheduledTime += _this.sampleRate;\n\n var drift = Date.now() - _this.scheduledTime;\n\n _this.schedulePlayLoop(Math.max(0, _this.sampleRate - drift));\n }\n }, delay);\n }\n /**\n * Pauses playback if playing.\n * @return {Player}\n */\n\n }, {\n key: \"pause\",\n value: function pause() {\n clearTimeout(this.setTimeoutId);\n this.setTimeoutId = false;\n this.scheduledTime = 0;\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 clearTimeout(this.setTimeoutId);\n this.setTimeoutId = false;\n this.scheduledTime = 0;\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; // Set tempo to the value that applies at the target tick\n\n for (var i = this.tempoMap.length - 1; i >= 0; i--) {\n if (this.tempoMap[i].tick <= tick) {\n this.setTempo(this.tempoMap[i].tempo);\n break;\n }\n } // Emit intermediate state-changing events so the consumer's synth is in the correct state\n\n\n this.collectStateAtTick(tick).forEach(function (event) {\n this.emitEvent(event);\n }, this); // 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 * Collects the last state-changing MIDI events (Program Change, Controller Change, Pitch Bend)\n * before the specified tick across all tracks.\n * @param {number} tick - Target tick to collect state up to.\n * @return {array} - Array of state events representing the MIDI state at the target tick.\n */\n\n }, {\n key: \"collectStateAtTick\",\n value: function collectStateAtTick(tick) {\n var dominated = {};\n this.events.forEach(function (trackEvents) {\n trackEvents.forEach(function (event) {\n if (event.tick >= tick) return;\n var key;\n\n if (event.name === 'Program Change') {\n key = 'pc:' + event.channel;\n } else if (event.name === 'Controller Change') {\n key = 'cc:' + event.channel + ':' + event.number;\n } else if (event.name === 'Pitch Bend') {\n key = 'pb:' + event.channel;\n }\n\n if (key) {\n dominated[key] = event;\n }\n });\n });\n return Object.keys(dominated).map(function (key) {\n return dominated[key];\n });\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.skipToTick(this.secondsToTicks(seconds));\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.setTimeoutId !== false;\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.buildTempoMap();\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 * Builds a tempo map from all Set Tempo events across all tracks.\n * @return {Player}\n */\n\n }, {\n key: \"buildTempoMap\",\n value: function buildTempoMap() {\n // Collect all Set Tempo events from all tracks\n var tempoEvents = [];\n this.events.forEach(function (trackEvents) {\n trackEvents.forEach(function (event) {\n if (event.name === 'Set Tempo') {\n tempoEvents.push({\n tick: event.tick,\n tempo: event.data\n });\n }\n });\n }); // Sort by tick\n\n tempoEvents.sort(function (a, b) {\n return a.tick - b.tick;\n }); // Build map starting with default tempo\n\n this.tempoMap = [{\n tick: 0,\n tempo: this.defaultTempo\n }];\n tempoEvents.forEach(function (event) {\n var last = this.tempoMap[this.tempoMap.length - 1];\n\n if (event.tick === last.tick) {\n // Same tick: update existing entry\n last.tempo = event.tempo;\n } else {\n this.tempoMap.push({\n tick: event.tick,\n tempo: event.tempo\n });\n }\n }, this);\n return this;\n }\n /**\n * Converts a tick range to seconds using the tempo map.\n * @param {number} startTick\n * @param {number} endTick\n * @return {number}\n */\n\n }, {\n key: \"ticksToSeconds\",\n value: function ticksToSeconds(startTick, endTick) {\n var seconds = 0;\n var currentTick = startTick;\n\n for (var i = 0; i < this.tempoMap.length; i++) {\n var entry = this.tempoMap[i];\n var nextTick = i + 1 < this.tempoMap.length ? this.tempoMap[i + 1].tick : endTick; // Skip entries entirely before our start\n\n if (nextTick <= startTick) continue; // Clamp segment to our range\n\n var segStart = Math.max(entry.tick, startTick);\n var segEnd = Math.min(nextTick, endTick);\n if (segStart >= endTick) break;\n var segmentTicks = segEnd - segStart;\n seconds += segmentTicks / this.division / entry.tempo * 60;\n currentTick = segEnd;\n } // Handle remaining ticks after last tempo change\n\n\n if (currentTick < endTick) {\n var lastEntry = this.tempoMap[this.tempoMap.length - 1];\n seconds += (endTick - currentTick) / this.division / lastEntry.tempo * 60;\n }\n\n return seconds;\n }\n /**\n * Converts seconds to a tick position using the tempo map.\n * @param {number} seconds\n * @return {number}\n */\n\n }, {\n key: \"secondsToTicks\",\n value: function secondsToTicks(seconds) {\n var remainingSeconds = seconds;\n var currentTick = 0;\n\n for (var i = 0; i < this.tempoMap.length; i++) {\n var entry = this.tempoMap[i];\n var nextTick = i + 1 < this.tempoMap.length ? this.tempoMap[i + 1].tick : Infinity;\n var segmentTicks = nextTick - entry.tick;\n var segmentSeconds = segmentTicks / this.division / entry.tempo * 60;\n\n if (remainingSeconds <= segmentSeconds) {\n // Target is within this segment\n currentTick = entry.tick + Math.round(remainingSeconds / 60 * entry.tempo * this.division);\n return currentTick;\n }\n\n remainingSeconds -= segmentSeconds;\n currentTick = nextTick;\n } // Should not reach here, but return totalTicks as fallback\n\n\n return this.totalTicks;\n }\n /**\n * Gets song duration in seconds.\n * @return {number}\n */\n\n }, {\n key: \"getSongTime\",\n value: function getSongTime() {\n return this.ticksToSeconds(0, this.totalTicks);\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.ticksToSeconds(this.getCurrentTick(), this.totalTicks));\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 var elapsedSeconds = (new Date().getTime() - this.startTime) / 1000;\n var startSeconds = this.ticksToSeconds(0, this.startTick);\n return this.secondsToTicks(startSeconds + elapsedSeconds);\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", "export default class WebAudioFontPlayer {\r\n\r\n #audioCtx = null;\r\n #preset = null;\r\n\r\n #envelopes = [];\r\n #afterTime = 0.05;\r\n #nearZero = 0.000001;\r\n\r\n\r\n constructor(audioCtx, preset) {\r\n this.#audioCtx = audioCtx;\r\n this.#preset = preset;\r\n this.#preset.zones.map(zone => this.#adjustZone(zone));\r\n }\r\n\r\n\r\n queueWaveTable(when, pitch, duration, volume, slides) {\r\n if(this.#audioCtx.state === 'suspended') this.#audioCtx.resume().catch(() => { });\r\n\r\n const vol = this.#limitVolume(volume);\r\n const zone = this.#findZone(pitch);\r\n if (!zone?.buffer) return null;\r\n\r\n const baseDetune = zone.originalPitch - 100.0 * zone.coarseTune - zone.fineTune;\r\n const playbackRate = Math.pow(2, (100.0 * pitch - baseDetune) / 1200.0);\r\n const startWhen = Math.max(when, this.#audioCtx.currentTime);\r\n let waveDuration = duration + this.#afterTime;\r\n\r\n const loop = zone.loopStart >= 1 && zone.loopStart < zone.loopEnd;\r\n if (!loop) waveDuration = Math.min(waveDuration, zone.buffer.duration / playbackRate);\r\n\r\n const envelope = this.#findEnvelope();\r\n this.#setupEnvelope(envelope, zone, vol, startWhen, waveDuration, duration);\r\n\r\n const source = this.#audioCtx.createBufferSource();\r\n source.buffer = zone.buffer;\r\n source.playbackRate.setValueAtTime(playbackRate, 0);\r\n\r\n if (slides?.length > 0) {\r\n source.playbackRate.setValueAtTime(playbackRate, startWhen);\r\n slides.forEach(s => {\r\n const newRate = Math.pow(2, (100.0 * (pitch + s.delta) - baseDetune) / 1200.0);\r\n source.playbackRate.linearRampToValueAtTime(newRate, startWhen + s.when);\r\n });\r\n }\r\n\r\n source.loop = loop;\r\n if (loop) {\r\n const d = zone.delay ?? 0;\r\n source.loopStart = zone.loopStart / zone.sampleRate + d;\r\n source.loopEnd = zone.loopEnd / zone.sampleRate + d;\r\n }\r\n\r\n source.connect(envelope);\r\n source.start(startWhen, zone.delay ?? 0);\r\n source.stop(startWhen + waveDuration);\r\n\r\n envelope.audioBufferSourceNode = source;\r\n envelope.when = startWhen;\r\n envelope.duration = waveDuration;\r\n\r\n return envelope;\r\n }\r\n\r\n\r\n queueChord(prst, w, pchs, d, v, s) {\r\n const vol = this.#limitVolume(v);\r\n return pchs.map((p, i) => this.queueWaveTable(this.#audioCtx, this.#audioCtx.destination, prst, w, p, d, vol - Math.random() * 0.01, s?.[i])).filter(Boolean);\r\n }\r\n\r\n\r\n async cancelQueue() {\r\n this.#envelopes.forEach(e => {\r\n e.gain.cancelScheduledValues(0);\r\n e.gain.setValueAtTime(this.#nearZero, this.#audioCtx.currentTime);\r\n e.when = -1;\r\n try { e.audioBufferSourceNode?.disconnect(); } catch (e) { }\r\n });\r\n }\r\n\r\n\r\n #adjustZone(zone) {\r\n if (zone.buffer) return Promise.resolve(zone);\r\n zone.delay = 0;\r\n if (zone.sample) {\r\n const binaryString = atob(zone.sample);\r\n const len = binaryString.length;\r\n const bytes = new Uint8Array(len);\r\n for (let i = 0; i < len; i++) bytes[i] = binaryString.charCodeAt(i);\r\n const int16Samples = new Int16Array(bytes.buffer);\r\n const numSamples = int16Samples.length;\r\n zone.buffer = this.#audioCtx.createBuffer(1, numSamples, zone.sampleRate);\r\n const float32Array = zone.buffer.getChannelData(0);\r\n for (let i = 0; i < numSamples; i++) float32Array[i] = int16Samples[i] / 32768.0;\r\n this.#applyZoneParameters(zone);\r\n return zone;\r\n } else if (zone.file) {\r\n const decoded = atob(zone.file);\r\n const uint8Array = new Uint8Array(decoded.length);\r\n for (let i = 0; i < decoded.length; i++) uint8Array[i] = decoded.charCodeAt(i);\r\n this.#audioCtx.decodeAudioData(\r\n uint8Array.buffer,\r\n audioBuffer => {\r\n zone.buffer = audioBuffer;\r\n this.#applyZoneParameters(zone);\r\n return zone;\r\n },\r\n error => {\r\n console.error(\"Audio decoding error:\", error);\r\n return false;\r\n }\r\n );\r\n } else {\r\n this.#applyZoneParameters(zone);\r\n return zone;\r\n }\r\n };\r\n\r\n\r\n #applyZoneParameters(zone) {\r\n zone.loopStart = this.#numValue(zone.loopStart, 0);\r\n zone.loopEnd = this.#numValue(zone.loopEnd, 0);\r\n zone.coarseTune = this.#numValue(zone.coarseTune, 0);\r\n zone.fineTune = this.#numValue(zone.fineTune, 0);\r\n zone.originalPitch = this.#numValue(zone.originalPitch, 6000);\r\n zone.sampleRate = this.#numValue(zone.sampleRate, 44100);\r\n };\r\n\r\n\r\n #setupEnvelope(envelope, zone, volume, when, sampleDuration, noteDuration) {\r\n envelope.gain.setValueAtTime(this.#noZeroVolume(0), this.#audioCtx.currentTime);\r\n\r\n const duration = Math.min(noteDuration, sampleDuration - this.#afterTime);\r\n const ahdsr = (zone.ahdsr && zone.ahdsr.length > 0) ? zone.ahdsr : [\r\n { duration: 0, volume: 1 },\r\n { duration: duration, volume: 1 }\r\n ];\r\n\r\n envelope.gain.cancelScheduledValues(when);\r\n const initialVol = (ahdsr[0]?.volume ?? 1) * volume;\r\n envelope.gain.setValueAtTime(this.#noZeroVolume(initialVol), when);\r\n\r\n let lastTime = 0;\r\n let lastVolume = ahdsr[0]?.volume ?? 1;\r\n\r\n for (const stage of ahdsr) {\r\n const { duration: stageDuration, volume: stageVolume } = stage;\r\n if (stageDuration <= 0) continue;\r\n const remainingTime = duration - lastTime;\r\n if (stageDuration > remainingTime) {\r\n const ratio = remainingTime / stageDuration;\r\n const interpolatedVolume = lastVolume + ratio * (stageVolume - lastVolume);\r\n envelope.gain.linearRampToValueAtTime(\r\n this.#noZeroVolume(volume * interpolatedVolume),\r\n when + duration\r\n );\r\n break;\r\n }\r\n lastTime += stageDuration;\r\n lastVolume = stageVolume;\r\n envelope.gain.linearRampToValueAtTime(\r\n this.#noZeroVolume(volume * lastVolume),\r\n when + lastTime\r\n );\r\n }\r\n\r\n envelope.gain.linearRampToValueAtTime(this.#noZeroVolume(0), when + duration + this.#afterTime);\r\n }\r\n\r\n\r\n #findEnvelope() {\r\n let envelope = this.#envelopes.find(e => e.target === this.#audioCtx.destination && this.#audioCtx.currentTime > e.when + e.duration + 0.001);\r\n if (envelope) {\r\n if (envelope.audioBufferSourceNode) {\r\n try {\r\n envelope.audioBufferSourceNode.stop(0);\r\n envelope.audioBufferSourceNode.disconnect();\r\n } catch (e) { }\r\n envelope.audioBufferSourceNode = null;\r\n }\r\n } else {\r\n envelope = this.#audioCtx.createGain();\r\n envelope.gain.value = 0;\r\n envelope.target = this.#audioCtx.destination;\r\n envelope.connect(this.#audioCtx.destination);\r\n envelope.cancel = () => {\r\n if (envelope.when + envelope.duration > this.#audioCtx.currentTime) {\r\n envelope.gain.cancelScheduledValues(0);\r\n envelope.gain.setTargetAtTime(this.#nearZero, this.#audioCtx.currentTime, 0.1);\r\n envelope.when = this.#audioCtx.currentTime + 0.00001;\r\n envelope.duration = 0;\r\n }\r\n };\r\n this.#envelopes.push(envelope);\r\n }\r\n return envelope;\r\n }\r\n\r\n\r\n #findZone(pitch) {\r\n const zone = this.#preset.zones.findLast(z => pitch >= z.keyRangeLow && pitch <= z.keyRangeHigh + 1);\r\n if (zone) this.#adjustZone(zone);\r\n return zone;\r\n };\r\n\r\n \r\n #limitVolume(v) {\r\n const requestedVolume = v ? 1.0 * v : 0.5;\r\n return Math.min(requestedVolume, 0.8);\r\n };\r\n\r\n\r\n #noZeroVolume(n) {\r\n return n > this.#nearZero ? n : this.#nearZero;\r\n }\r\n\r\n\r\n #numValue(a, b) {\r\n return typeof a === \"number\" ? a : b;\r\n }\r\n\r\n}\r\n\r\n\r\nclass WebAudioFontChannel {\r\n\r\n #input = null;\r\n #output = null;\r\n #audioCtx = null;\r\n #limiter = null;\r\n\r\n constructor(audioCtx) {\r\n this.#audioCtx = audioCtx;\r\n this.#input = this.#audioCtx.createGain();\r\n\r\n let lastNode = this.#input;\r\n [32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384].forEach(freq => {\r\n lastNode = this.#bandEqualizer(lastNode, freq);\r\n this[`band${freq < 1000 ? freq : (freq / 1024) + 'k'}`] = lastNode;\r\n });\r\n\r\n this.#limiter = this.#audioCtx.createDynamicsCompressor();\r\n this.#limiter.threshold.setValueAtTime(-3.0, this.#audioCtx.currentTime);\r\n this.#limiter.ratio.setValueAtTime(40, this.#audioCtx.currentTime);\r\n this.#limiter.attack.setValueAtTime(0.000, this.#audioCtx.currentTime);\r\n this.#limiter.release.setValueAtTime(0.25, this.#audioCtx.currentTime);\r\n this.#output = this.#audioCtx.createGain();\r\n lastNode.connect(this.#limiter);\r\n this.#limiter.connect(this.#output);\r\n }\r\n\r\n\r\n #bandEqualizer(from, frequency) {\r\n const filter = this.#audioCtx.createBiquadFilter();\r\n filter.frequency.setTargetAtTime(frequency, 0, 0.0001);\r\n filter.type = \"peaking\";\r\n filter.gain.setTargetAtTime(0, 0, 0.0001);\r\n filter.Q.setTargetAtTime(1.0, 0, 0.0001);\r\n from.connect(filter);\r\n return filter;\r\n }\r\n\r\n}", "{\n \"zones\": [\n {\n \"midi\": 81,\n \"originalPitch\": 4200,\n \"keyRangeLow\": 0,\n \"keyRangeHigh\": 43,\n \"loopStart\": 256,\n \"loopEnd\": 768,\n \"coarseTune\": 0,\n \"fineTune\": 0,\n \"sampleRate\": 48000,\n \"ahdsr\": false,\n \"file\": \"SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU3LjcyLjEwMQAAAAAAAAAAAAAA//tUwAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAACAAAGAACgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg//////////////////////////////////////////////////////////////////8AAAAATGF2YzU3Ljk2AAAAAAAAAAAAAAAAJALAAAAAAAAABgA5CeiPAAAAAAAAAAAAAAAAAAAA//vUxAAAB+gfQ1TwACTywCx/NYAJAABZOW7fg6F8L8A3AOwb5L2e7x5R5EoCADB8HwfPxACAYrB8H8oCDsHw/lAQdlwPqDHh/UCEp4fhiU8/ynv6BAGOZS1NzNUNm83W5HHJGz4Kk0TfzwzSZu8CgJ3TZ11pu3hi1hoxY8qMFcPAcBX40CM1RcwUo9EFQgiY2VPldy90c24GUwVQROZnA0ZXohQyMsyIBlAWEQK/zrsHfSBGmF4i+yiKKKNrP5FDrYJM+8XdeIRR1FaEwk0mLq5Upl0G35bBliJz8DxCcgSVtAYMpU27BVbW0tSXOzHsLU+88MTkCQ3PwO05aTrtqwF1G2YFHc7M1hamc5RYnJXbn6S9OU7L2apytcaEpk5bQVbXIszWrUzuzNatW5HKL05K+z9Jyip+vcyqG3yZTDELa1DcIazEIXV3jW1lV3jW1lV7h/M/7h/M/7h/9/+f/f/n/3/58qr2JTUtyqvYlNy3TXbFLct012xS3Kemu0lLWp6arSexu7G62Ja2Ja2Ja0QsKrWx13Wb36/a/7/ew5kMjLhQNcmAxqICUIjQsMqB4zeSzGokEALDBOxI2OrTTJJMLBUwcCQYAVMDdlQ0A6Zkis4q5jIAQzknMdGQMBLAltWVxZrJm4ma0hGaGCmrpKmfS87RrhMci3muq5p4+b4wKbPCqVlsBQHbcmCKhmxoZcGGmnZmJeZOEmiGS7nGjrWX5mn+j92HZJcMqKDIgYz0vMnJTHwUzYoMiIGdQNMuTIbj/U13dLc1aMqCjSTkzEvMpCTQjQy4qMkBjPTGR3X9pMI1N9q1aWtWpqtUyspMhBTOCwyYkMeAjNSsyUjMdATMCYyIgpZJZygGm+AqXGzWrWqtWzWrWjGgAy0lMhHwEXmVERjw4AigycfMdGwMVmSDhjQwCiSU1solVxiNamhqlpYZx3jllljvHLWWLlv/F3cfyKO+/8vfx/JY/7/y9/H8lj/v/Pv5Dk5D8bn4xGJyNxuf1llvHHWWW8cdZZbx//u0xLeAL2H/Z7nNkIFVkCR3sMAFx1llvHHWVbHGrllWAbmu1l2+wACIJmablgZJEkGiBRmRmRKSQMOakoAW1jywyxmXRDkBISlWnK1b7K0xdxcdLomjI+e1lat9latrlly7rLnrbVat8FFQgpgKeCmxTcgrgVVMQU1FMy45OS41VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV\",\n \"anchor\": 0.00533333\n },\n {\n \"midi\": 81,\n \"originalPitch\": 5400,\n \"keyRangeLow\": 44,\n \"keyRangeHigh\": 55,\n \"loopStart\": 128,\n \"loopEnd\": 384,\n \"coarseTune\": 0,\n \"fineTune\": 0,\n \"sampleRate\": 48000,\n \"ahdsr\": false,\n \"file\": \"SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU3LjcyLjEwMQAAAAAAAAAAAAAA//tUwAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAACAAAEsADMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzM//////////////////////////////////////////////////////////////////8AAAAATGF2YzU3Ljk2AAAAAAAAAAAAAAAAJATAAAAAAAAABLAMEvhQAAAAAAAAAAAAAAAAAAAA//vUxAAACSwNaVQwACRXSC6/NYAIAAa9txyS8qHAwMDPlz5QEIIROfLn1AhBBy3lz/BCt5c/wQz5c/RBCXPlw/EEEHLPlz9EEOt8QQQcs+XPykQVh8uH4gcIHLD6w+JgcGkGbGakSCqjColKJDEMCR4mYQ8kQZ1UAiwCAIbAc4b1maEch6LAEVzMhwxuYQGCgLBWbmQSPi+kAzkOM6i/Ei2XrGgFiMbisXednEOO7NP9KJdLKedbxd7vvezh3pl/YdmreFqxnZjEgf+NyN/I1TXaWzqnqWqTOzTyyihuX0cMUlNa3S81TYWrGd63q/RRuno4xSUUbt3YzSYU1fuH8z/uH8zp6OMUlFK6e/KKTG5zKZy+ax/+4fzP+4fzP70rp78opL1PXv0lSzVy+tjjVyyrY41e4fzf91/N/3X83/dfzf91/N/3X5/3D+b/uv5v+6/m/7r/3/6/9/+sst446yy3jVyyrY41csq2ONXLKtjjVyyrKiLXdbW5JI24SEB1CQjhFAAXAIxdxbUKO0ekXEuKphJ5DkSgYKJVFFxQVwUwFDcRcUFcFcCjsTYoK4K4FHYmxQXwrgUdibFBfCvCjsTcRXhXhT8TcRXhXhT8TcRXhXhT8TcRXhXhT8TcakxBTUUzLjk5LjWqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//tkxMWDzQgxS7zzACgAADSAAAAEqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\",\n \"anchor\": 0.00266667\n },\n {\n \"midi\": 81,\n \"originalPitch\": 6600,\n \"keyRangeLow\": 56,\n \"keyRangeHigh\": 67,\n \"loopStart\": 64,\n \"loopEnd\": 192,\n \"coarseTune\": 0,\n \"fineTune\": 0,\n \"sampleRate\": 48000,\n \"ahdsr\": false,\n \"file\": \"SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU3LjcyLjEwMQAAAAAAAAAAAAAA//tUwAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAACAAAE4ADs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs//////////////////////////////////////////////////////////////////8AAAAATGF2YzU3Ljk2AAAAAAAAAAAAAAAAJAXAAAAAAAAABODQyktQAAAAAAAAAAAAAAAAAAAA//vkxAAABywBgbQAACYVyC6/P9AwKAASUcckkt4YWD4fLn1AhBCJz5c+oEFghy5/ghy5+cghy7+GKZd/DHLn1HIYk5d/DHL+6H5d5TOdLnbLTLKrBqyq+vlkqeD4lCzTAngBgvMYACAAGg+NZZoFwogYAGAZCwCsDgBJsJhRJLyYvYUvg4BLFAA9AKpqYxQCumE3hMhEBIkBkBLuNR5oOGzUbs0Jk7jR1yTFgpzGY2TMgWV8qtT4fmaf4xDKgxlNgzTGRZScSFbPVQxarGZbWMLiNMUC1MshXMJx+MRSeaZHnuceOvbGrV2ls6MOQUMAAnMDAzMMgRMAQkMCQufiahT9zMJfim7ul5rIDBEFgJBgHgoHQuBANAwFA1WkUbqzssyns944flv09UjUcU9kjkkk9UjZfjOyzKep8Z2kxucyq9+ax9JFNJNJNZNFNFNVNJNJNbKRRvGQxjKejfJ2Udq/9bf1darY41U0U0U1U0k0k+k0U0U+U0k0k+k0e5/zD+5/zD+5/zX93/Nf3f81/d////////7/9f+//X/v/1/7/9Jop8ppJpJ9Jop6qwppJ7KxJGp6qwpHKrKxI2qqqwo3KrKxI2qqq9RuVWV8jaqqr1G5TEFNRTMuOTkuNVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy45OS41VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sUxNoDwAAB/hwAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV\",\n \"anchor\": 0.00133333\n },\n {\n \"midi\": 81,\n \"originalPitch\": 7800,\n \"keyRangeLow\": 68,\n \"keyRangeHigh\": 79,\n \"loopStart\": 32,\n \"loopEnd\": 96,\n \"coarseTune\": 0,\n \"fineTune\": 0,\n \"sampleRate\": 48000,\n \"ahdsr\": false,\n \"file\": \"SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU3LjcyLjEwMQAAAAAAAAAAAAAA//tUwAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAACAAADwADm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm//////////////////////////////////////////////////////////////////8AAAAATGF2YzU3Ljk2AAAAAAAAAAAAAAAAJAZAAAAAAAAAA8CsVDBMAAAAAAAAAAAAAAAAAAAA//vExAAABmQBjaAAACGQBa9497AdtbAkWdckklxRyjhQ5BBYYqOFHRAXDHKHOGOUOcMco7nOJHawxynnOU5cMcHOXOcHOl3NXGMqsiEAqoMI8QsSUcIsgeiQgJISFCg5ABAyw+VQaiK8yY18FNiuxBUorwU0FdiC4ivimgrsQXEV4KaCuxBcTfBXAv4isTfiuBf6KxN+L4r8RUU3wXoL+JsU3wXoL+JsV3gvRSpMQU1FMy45OS41qqqqqqqqqqqqqqqqqqqqqqqq6goZoAABEOiCXDs8P3G8oicJAhZjVVVBlsStNFVVUT8StNVMQU1FMy45OS41VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sUxOuDxEQnByYExigAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV\",\n \"anchor\": 0.00066667\n },\n {\n \"midi\": 81,\n \"originalPitch\": 9000,\n \"keyRangeLow\": 80,\n \"keyRangeHigh\": 91,\n \"loopStart\": 16,\n \"loopEnd\": 48,\n \"coarseTune\": 0,\n \"fineTune\": 0,\n \"sampleRate\": 48000,\n \"ahdsr\": false,\n \"file\": \"SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU3LjcyLjEwMQAAAAAAAAAAAAAA//tUwAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAACAAADwADm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm//////////////////////////////////////////////////////////////////8AAAAATGF2YzU3Ljk2AAAAAAAAAAAAAAAAJAaAAAAAAAAAA8ChXkahAAAAAAAAAAAAAAAAAAAA//vExAAABkQDh+AAACGUhq9895iZZVlzMgFEYk0nBACCLQfD6gTB8/qBDBwMflC4f/gQMfqBMH/4OHP4Df+XBw5+UBN/6wJu1fapqZhlttyF2FyUYQ0W0QkFSJiRIro4TAYk8aQCAQCAKjiRIkSr+xQUFOBQUV/5BQU4KChv+CgoL4KCu/4QUN8KCn/8UFN8FFf/wgp/hQ3/8FBXYgoL/+FBX5BQ3/8FBfigopVMQU1FMy45OS41VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy45OS41VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sUxNoDwAAB/gAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV\",\n \"anchor\": 0.00033333\n },\n {\n \"midi\": 81,\n \"originalPitch\": 10200,\n \"keyRangeLow\": 92,\n \"keyRangeHigh\": 103,\n \"loopStart\": 8,\n \"loopEnd\": 56,\n \"coarseTune\": 0,\n \"fineTune\": 0,\n \"sampleRate\": 48000,\n \"ahdsr\": false,\n \"file\": \"SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU3LjcyLjEwMQAAAAAAAAAAAAAA//tUwAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAACAAADwADm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm//////////////////////////////////////////////////////////////////8AAAAATGF2YzU3Ljk2AAAAAAAAAAAAAAAAJAaAAAAAAAAAA8AljJJeAAAAAAAAAAAAAAAAAAAA//vExAAABmgDh+AAACG7Cq649JmAh3unfGYwJRhSgQBBEXB8PjogBDn8EwfP6gQdicP/g4GOXB/lHfgmH905/UclwcOf/8oA/2r/qekIFM1D+AxK8OEgo9IhpLSJFdJaehzC3CbBom0GChJpEiRn/tRxIkSJT6OJJB3BUFXSwNB3BUFQVgqCoaqBoGsqd4iBo8oGgaTWCoaxEDR6VBUFTpUFQV//BoGoiBoO//rxKCv//iIGv/+WTEFNRTMuOTkuNVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy45OS41VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sUxNoDwAAB/gAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV\",\n \"anchor\": 0.00016667\n },\n {\n \"midi\": 81,\n \"originalPitch\": 11400,\n \"keyRangeLow\": 104,\n \"keyRangeHigh\": 115,\n \"loopStart\": 12,\n \"loopEnd\": 52,\n \"coarseTune\": 0,\n \"fineTune\": 0,\n \"sampleRate\": 48000,\n \"ahdsr\": false,\n \"file\": \"SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU3LjcyLjEwMQAAAAAAAAAAAAAA//tUwAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAACAAADwADm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm//////////////////////////////////////////////////////////////////8AAAAATGF2YzU3Ljk2AAAAAAAAAAAAAAAAJAaAAAAAAAAAA8CNr1v4AAAAAAAAAAAAAAAAAAAA//vExAAAB1SVheCEbeI4SC349ApomIy4jYiPtA6x5AACs4xjvkAAPmMY/wAXzGMf4AL/X+IgG4PvwQOfIQQOZcH//wQlwfBA5/1h/iB2sP/17/1GMvIAEJ8BiUYMEW0NSAKQjJWj5HCbB/EGHqQ5m2plUuYL1WvVqeGZmb/VVVf9mZr/1VVX9hYGwKgFgbB9TCwNgbB8BG6lKUreYxjfKUrfQxvylK3oYxjeUKAgICJYoCAgICUvoYxvylL9DGN9SlL9P+UrfMYxjOoYCAgIUb6lL////////qUpSzASTEFNRTMuOTkuNaqqqqpMQU1FMy45OS41qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//sUxNoDwAAB/gAAACAAADSAAAAEqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\",\n \"anchor\": 0.00008333\n },\n {\n \"midi\": 81,\n \"originalPitch\": 12600,\n \"keyRangeLow\": 116,\n \"keyRangeHigh\": 127,\n \"loopStart\": 6,\n \"loopEnd\": 42,\n \"coarseTune\": 0,\n \"fineTune\": 0,\n \"sampleRate\": 48000,\n \"ahdsr\": false,\n \"file\": \"SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU3LjcyLjEwMQAAAAAAAAAAAAAA//tUwAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAACAAAEIADo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo//////////////////////////////////////////////////////////////////8AAAAATGF2YzU3Ljk2AAAAAAAAAAAAAAAAJAaQAAAAAAAABCDWHfeqAAAAAAAAAAAAAAAAAAAA//vUxAAACUUrfeCE1eMLSCx88a54l3jMh4t/trUApEAAAUAGYxja+WMYx/yAAH+MY/+AYx/4AAX8xjH/7/8AF//zHyAMdoIAgAAADAYWTt4IA/Kc5/////////y4Pg/v3FZropQkAAAEiDVBBhkjdBSk5JyDlHqDmWi+kJRsJiOZ69eva6x+zAQEBCm/9VVVb/9mVVL/9mZmP/6qqqn/8ZlVV/6zMzM3/VCgICanXX+5I2JRJHaana+SSNwIQEQAwAQAQEw6j5KBCASACACAKAmBGHcdr5RNR2jtJRsed/DkTU1NTra/3Oc5znf+1rWuc7/3Na1ra/9znOc7/9rWtc7/9zWta3/4c5znO/9rTU1NXOvbW4lDtDyHkPI7TqQIQAxMQU1FMy45OS41qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpMQU1FMy45OS41qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//sUxNoDwAABpAAAACAAADSAAAAEqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\",\n \"anchor\": 0.00004167\n }\n ]\n}", "import MidiPlayer from 'midi-player-js';\r\nimport WebAudioFontPlayer from \"./webaudiofontplayer\";\r\nimport DefaultPreset from \"./presets/defaultpreset.json\";\r\n\r\n\r\n\r\nexport default class MidiAudioPlayer extends MidiPlayer.Player {\r\n\r\n\t#audioCtx = null;\r\n\t#audioPlayer = null;\r\n\t#activeNotes = null;\r\n\r\n\t#opts = {\r\n\t\tpreset: DefaultPreset,\r\n volume: 0.012,\r\n\t\tonEndFile: null\r\n\t};\r\n\r\n\r\n\tconstructor(opts = {}) {\r\n super(event => this.#handleMidiPipeline(event));\r\n\t\tthis.#opts = { ...this.#opts, ...opts };\r\n this.#activeNotes = new Map();\r\n\t\tthis.#audioCtx = new (window.AudioContext || window.webkitAudioContext)();\r\n\t\tthis.#audioPlayer = new WebAudioFontPlayer(this.#audioCtx, this.#opts.preset);\r\n this.on('endOfFile', async () => {\r\n\t\t\tawait new Promise(resolve => requestAnimationFrame(() => setTimeout(resolve, 1)));\r\n\t\t\tawait this.#endOfFile();\r\n });\r\n\t}\r\n\r\n\r\n\tasync play(content = null) {\r\n\t\tif(content) await this.#load(content);\r\n await this.#audioCtx.resume();\r\n\t\tawait super.play();\r\n\t}\r\n \r\n\r\n\tasync pause() {\r\n await super.pause();\r\n await this.#clearActiveNotes();\r\n await this.#audioPlayer.cancelQueue();\r\n\t}\r\n\r\n\t\r\n async stop() {\r\n await super.stop();\r\n await this.#clearActiveNotes();\r\n await this.#audioPlayer.cancelQueue();\r\n\t}\r\n\r\n\r\n\tasync #endOfFile() {\r\n\t\tif(typeof this.#opts.onEndFile == 'function') await this.#opts.onEndFile();\r\n\t}\r\n\r\n\r\n async #handleMidiPipeline(event) {\r\n if (event.name !== 'Note on' && event.name !== 'Note off') return;\r\n if (!this.isPlaying()) return;\r\n if (event.noteNumber === undefined) return;\r\n\r\n const now = this.#audioCtx.currentTime;\r\n\r\n switch (event.name) {\r\n case 'Note on':\r\n if (event.velocity > 0 && event.velocity <= 127) {\r\n this.#stopNotePipe(event.noteNumber);\r\n const vol = (event.velocity / 127) * this.#opts.volume;\r\n const envelope = this.#audioPlayer.queueWaveTable(0, event.noteNumber, 2, vol);\r\n this.#activeNotes.set(event.noteNumber, envelope);\r\n } else {\r\n this.#stopNotePipe(event.noteNumber);\r\n }\r\n break;\r\n\r\n case 'Note off':\r\n this.#stopNotePipe(event.noteNumber);\r\n break;\r\n }\r\n }\r\n\r\n\r\n #stopNotePipe(noteNumber) {\r\n const envelope = this.#activeNotes.get(noteNumber);\r\n if (envelope) {\r\n envelope.cancel();\r\n this.#activeNotes.delete(noteNumber);\r\n }\r\n }\r\n\r\n\r\n #clearActiveNotes() {\r\n if (this.#activeNotes) {\r\n this.#activeNotes.forEach((envelope, note) => { if (envelope && envelope.cancel) envelope.cancel(); });\r\n this.#activeNotes.clear();\r\n }\r\n }\r\n\r\n\r\n\tasync #load(content) {\r\n\t\tif(this.isPlaying()) this.stop();\r\n\t\tthis.#clearActiveNotes();\r\n\t\tawait this.loadArrayBuffer(content);\r\n\t}\r\n\r\n}\r\n\r\n// export { MidiAudioPlayer };", "import MidiAudioPlayer from './src/midiaudioplayer.js';\r\n\r\nif (typeof window !== 'undefined') window.MidiAudioPlayer = MidiAudioPlayer;\r\n\r\nexport { MidiAudioPlayer };\r\nexport default MidiAudioPlayer;"],
5
- "mappings": "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",
4
+ "sourcesContent": ["function _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 Object.defineProperty(Constructor, \"prototype\", {\n writable: false\n });\n return Constructor;\n}\n\n/**\n * Constants used in player.\n */\nvar Constants = {\n VERSION: '2.0.17',\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 = 0; i < this.events.length; i++) {\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 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 // Process all events that have passed to avoid falling behind on dense MIDI files.\n var events = [];\n\n while (this.events[this.eventIndex] && this.events[this.eventIndex].tick <= currentTick) {\n if (this.enabled) events.push(this.events[this.eventIndex]);\n this.eventIndex++;\n }\n\n if (events.length > 0) return events;\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 eventJson.string = this.getStringData(eventStartIndex);\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); // sf byte is signed (-7 to 7), but Uint8Array gives unsigned values\n\n var sf = eventJson.data[0] > 127 ? eventJson.data[0] - 256 : eventJson.data[0];\n\n if (sf >= 0) {\n eventJson.keySignature = Constants.CIRCLE_OF_FIFTHS[sf];\n } else {\n eventJson.keySignature = Constants.CIRCLE_OF_FOURTHS[Math.abs(sf)];\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 + 2 + varIntLength + 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]];\n eventJson.pressure = this.data[eventStartIndex + 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];\n eventJson.value = this.data[eventStartIndex + 1];\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 + 1] & 0x7f) << 7 | this.data[eventStartIndex] & 0x7f;\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 = this.data[eventStartIndex + 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 eventJson.value = (this.data[eventStartIndex + 2] & 0x7f) << 7 | this.data[eventStartIndex + 1] & 0x7f;\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.setTimeoutId = false;\n this.scheduledTime = 0;\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.tempoMap = [];\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 this.defaultTempo = 120;\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.stop();\n this.triggerPlayerEvent('endOfFile');\n } else {\n var result = track.handleEvent(this.tick, dryRun);\n\n if (dryRun && result) {\n if (result.hasOwnProperty('name') && result.name === 'Set Tempo') {\n // Grab tempo if available.\n this.setTempo(result.data);\n }\n\n if (result.hasOwnProperty('name') && result.name === 'Program Change') {\n if (!this.instruments.includes(result.value)) {\n this.instruments.push(result.value);\n }\n }\n } else if (result) {\n // result is an array of events during playback\n var events = Array.isArray(result) ? result : [result];\n events.forEach(function (event) {\n if (event.hasOwnProperty('name') && event.name === 'Set Tempo') {\n // Grab tempo if available.\n this.setTempo(event.data);\n }\n\n this.emitEvent(event);\n }, this);\n }\n }\n }, this);\n if (!dryRun && this.isPlaying()) 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 using drift-correcting setTimeout\n\n this.scheduledTime = Date.now();\n this.schedulePlayLoop(this.sampleRate);\n return this;\n }\n /**\n * Schedules the next play loop iteration, correcting for timer drift.\n * @param {number} delay - Delay in milliseconds before next iteration.\n * @return {undefined}\n */\n\n }, {\n key: \"schedulePlayLoop\",\n value: function schedulePlayLoop(delay) {\n var _this = this;\n\n this.setTimeoutId = setTimeout(function () {\n _this.playLoop();\n\n if (_this.setTimeoutId !== false) {\n _this.scheduledTime += _this.sampleRate;\n\n var drift = Date.now() - _this.scheduledTime;\n\n _this.schedulePlayLoop(Math.max(0, _this.sampleRate - drift));\n }\n }, delay);\n }\n /**\n * Pauses playback if playing.\n * @return {Player}\n */\n\n }, {\n key: \"pause\",\n value: function pause() {\n clearTimeout(this.setTimeoutId);\n this.setTimeoutId = false;\n this.scheduledTime = 0;\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 clearTimeout(this.setTimeoutId);\n this.setTimeoutId = false;\n this.scheduledTime = 0;\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; // Set tempo to the value that applies at the target tick\n\n for (var i = this.tempoMap.length - 1; i >= 0; i--) {\n if (this.tempoMap[i].tick <= tick) {\n this.setTempo(this.tempoMap[i].tempo);\n break;\n }\n } // Emit intermediate state-changing events so the consumer's synth is in the correct state\n\n\n this.collectStateAtTick(tick).forEach(function (event) {\n this.emitEvent(event);\n }, this); // 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 * Collects the last state-changing MIDI events (Program Change, Controller Change, Pitch Bend)\n * before the specified tick across all tracks.\n * @param {number} tick - Target tick to collect state up to.\n * @return {array} - Array of state events representing the MIDI state at the target tick.\n */\n\n }, {\n key: \"collectStateAtTick\",\n value: function collectStateAtTick(tick) {\n var dominated = {};\n this.events.forEach(function (trackEvents) {\n trackEvents.forEach(function (event) {\n if (event.tick >= tick) return;\n var key;\n\n if (event.name === 'Program Change') {\n key = 'pc:' + event.channel;\n } else if (event.name === 'Controller Change') {\n key = 'cc:' + event.channel + ':' + event.number;\n } else if (event.name === 'Pitch Bend') {\n key = 'pb:' + event.channel;\n }\n\n if (key) {\n dominated[key] = event;\n }\n });\n });\n return Object.keys(dominated).map(function (key) {\n return dominated[key];\n });\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.skipToTick(this.secondsToTicks(seconds));\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.setTimeoutId !== false;\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.buildTempoMap();\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 * Builds a tempo map from all Set Tempo events across all tracks.\n * @return {Player}\n */\n\n }, {\n key: \"buildTempoMap\",\n value: function buildTempoMap() {\n // Collect all Set Tempo events from all tracks\n var tempoEvents = [];\n this.events.forEach(function (trackEvents) {\n trackEvents.forEach(function (event) {\n if (event.name === 'Set Tempo') {\n tempoEvents.push({\n tick: event.tick,\n tempo: event.data\n });\n }\n });\n }); // Sort by tick\n\n tempoEvents.sort(function (a, b) {\n return a.tick - b.tick;\n }); // Build map starting with default tempo\n\n this.tempoMap = [{\n tick: 0,\n tempo: this.defaultTempo\n }];\n tempoEvents.forEach(function (event) {\n var last = this.tempoMap[this.tempoMap.length - 1];\n\n if (event.tick === last.tick) {\n // Same tick: update existing entry\n last.tempo = event.tempo;\n } else {\n this.tempoMap.push({\n tick: event.tick,\n tempo: event.tempo\n });\n }\n }, this);\n return this;\n }\n /**\n * Converts a tick range to seconds using the tempo map.\n * @param {number} startTick\n * @param {number} endTick\n * @return {number}\n */\n\n }, {\n key: \"ticksToSeconds\",\n value: function ticksToSeconds(startTick, endTick) {\n var seconds = 0;\n var currentTick = startTick;\n\n for (var i = 0; i < this.tempoMap.length; i++) {\n var entry = this.tempoMap[i];\n var nextTick = i + 1 < this.tempoMap.length ? this.tempoMap[i + 1].tick : endTick; // Skip entries entirely before our start\n\n if (nextTick <= startTick) continue; // Clamp segment to our range\n\n var segStart = Math.max(entry.tick, startTick);\n var segEnd = Math.min(nextTick, endTick);\n if (segStart >= endTick) break;\n var segmentTicks = segEnd - segStart;\n seconds += segmentTicks / this.division / entry.tempo * 60;\n currentTick = segEnd;\n } // Handle remaining ticks after last tempo change\n\n\n if (currentTick < endTick) {\n var lastEntry = this.tempoMap[this.tempoMap.length - 1];\n seconds += (endTick - currentTick) / this.division / lastEntry.tempo * 60;\n }\n\n return seconds;\n }\n /**\n * Converts seconds to a tick position using the tempo map.\n * @param {number} seconds\n * @return {number}\n */\n\n }, {\n key: \"secondsToTicks\",\n value: function secondsToTicks(seconds) {\n var remainingSeconds = seconds;\n var currentTick = 0;\n\n for (var i = 0; i < this.tempoMap.length; i++) {\n var entry = this.tempoMap[i];\n var nextTick = i + 1 < this.tempoMap.length ? this.tempoMap[i + 1].tick : Infinity;\n var segmentTicks = nextTick - entry.tick;\n var segmentSeconds = segmentTicks / this.division / entry.tempo * 60;\n\n if (remainingSeconds <= segmentSeconds) {\n // Target is within this segment\n currentTick = entry.tick + Math.round(remainingSeconds / 60 * entry.tempo * this.division);\n return currentTick;\n }\n\n remainingSeconds -= segmentSeconds;\n currentTick = nextTick;\n } // Should not reach here, but return totalTicks as fallback\n\n\n return this.totalTicks;\n }\n /**\n * Gets song duration in seconds.\n * @return {number}\n */\n\n }, {\n key: \"getSongTime\",\n value: function getSongTime() {\n return this.ticksToSeconds(0, this.totalTicks);\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.ticksToSeconds(this.getCurrentTick(), this.totalTicks));\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 var elapsedSeconds = (new Date().getTime() - this.startTime) / 1000;\n var startSeconds = this.ticksToSeconds(0, this.startTick);\n return this.secondsToTicks(startSeconds + elapsedSeconds);\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", "export default class WebAudioFontPlayer {\r\n\r\n #audioCtx = null;\r\n #preset = null;\r\n\r\n #envelopes = [];\r\n #afterTime = 0.05;\r\n #nearZero = 0.000001;\r\n\r\n\r\n constructor(audioCtx, preset) {\r\n this.#audioCtx = audioCtx;\r\n this.#preset = preset;\r\n this.#preset.zones.map(zone => this.#adjustZone(zone));\r\n }\r\n\r\n\r\n queueWaveTable(when, pitch, duration, volume, slides) {\r\n if(this.#audioCtx.state === 'suspended') this.#audioCtx.resume().catch(() => { });\r\n\r\n const vol = this.#limitVolume(volume);\r\n const zone = this.#findZone(pitch);\r\n if (!zone?.buffer) return null;\r\n\r\n const baseDetune = zone.originalPitch - 100.0 * zone.coarseTune - zone.fineTune;\r\n const playbackRate = Math.pow(2, (100.0 * pitch - baseDetune) / 1200.0);\r\n const startWhen = Math.max(when, this.#audioCtx.currentTime);\r\n let waveDuration = duration + this.#afterTime;\r\n\r\n const loop = zone.loopStart >= 1 && zone.loopStart < zone.loopEnd;\r\n if (!loop) waveDuration = Math.min(waveDuration, zone.buffer.duration / playbackRate);\r\n\r\n const envelope = this.#findEnvelope();\r\n this.#setupEnvelope(envelope, zone, vol, startWhen, waveDuration, duration);\r\n\r\n const source = this.#audioCtx.createBufferSource();\r\n source.buffer = zone.buffer;\r\n source.playbackRate.setValueAtTime(playbackRate, 0);\r\n\r\n if (slides?.length > 0) {\r\n source.playbackRate.setValueAtTime(playbackRate, startWhen);\r\n slides.forEach(s => {\r\n const newRate = Math.pow(2, (100.0 * (pitch + s.delta) - baseDetune) / 1200.0);\r\n source.playbackRate.linearRampToValueAtTime(newRate, startWhen + s.when);\r\n });\r\n }\r\n\r\n source.loop = loop;\r\n if (loop) {\r\n const d = zone.delay ?? 0;\r\n source.loopStart = zone.loopStart / zone.sampleRate + d;\r\n source.loopEnd = zone.loopEnd / zone.sampleRate + d;\r\n }\r\n\r\n source.connect(envelope);\r\n source.start(startWhen, zone.delay ?? 0);\r\n source.stop(startWhen + waveDuration);\r\n\r\n envelope.audioBufferSourceNode = source;\r\n envelope.when = startWhen;\r\n envelope.duration = waveDuration;\r\n\r\n return envelope;\r\n }\r\n\r\n\r\n queueChord(prst, w, pchs, d, v, s) {\r\n const vol = this.#limitVolume(v);\r\n return pchs.map((p, i) => this.queueWaveTable(this.#audioCtx, this.#audioCtx.destination, prst, w, p, d, vol - Math.random() * 0.01, s?.[i])).filter(Boolean);\r\n }\r\n\r\n\r\n async cancelQueue() {\r\n this.#envelopes.forEach(e => {\r\n e.gain.cancelScheduledValues(0);\r\n e.gain.setValueAtTime(this.#nearZero, this.#audioCtx.currentTime);\r\n e.when = -1;\r\n try { e.audioBufferSourceNode?.disconnect(); } catch (e) { }\r\n });\r\n }\r\n\r\n\r\n #adjustZone(zone) {\r\n if (zone.buffer) return Promise.resolve(zone);\r\n zone.delay = 0;\r\n if (zone.sample) {\r\n const binaryString = atob(zone.sample);\r\n const len = binaryString.length;\r\n const bytes = new Uint8Array(len);\r\n for (let i = 0; i < len; i++) bytes[i] = binaryString.charCodeAt(i);\r\n const int16Samples = new Int16Array(bytes.buffer);\r\n const numSamples = int16Samples.length;\r\n zone.buffer = this.#audioCtx.createBuffer(1, numSamples, zone.sampleRate);\r\n const float32Array = zone.buffer.getChannelData(0);\r\n for (let i = 0; i < numSamples; i++) float32Array[i] = int16Samples[i] / 32768.0;\r\n this.#applyZoneParameters(zone);\r\n return zone;\r\n } else if (zone.file) {\r\n const decoded = atob(zone.file);\r\n const uint8Array = new Uint8Array(decoded.length);\r\n for (let i = 0; i < decoded.length; i++) uint8Array[i] = decoded.charCodeAt(i);\r\n this.#audioCtx.decodeAudioData(\r\n uint8Array.buffer,\r\n audioBuffer => {\r\n zone.buffer = audioBuffer;\r\n this.#applyZoneParameters(zone);\r\n return zone;\r\n },\r\n error => {\r\n console.error(\"Audio decoding error:\", error);\r\n return false;\r\n }\r\n );\r\n } else {\r\n this.#applyZoneParameters(zone);\r\n return zone;\r\n }\r\n };\r\n\r\n\r\n #applyZoneParameters(zone) {\r\n zone.loopStart = this.#numValue(zone.loopStart, 0);\r\n zone.loopEnd = this.#numValue(zone.loopEnd, 0);\r\n zone.coarseTune = this.#numValue(zone.coarseTune, 0);\r\n zone.fineTune = this.#numValue(zone.fineTune, 0);\r\n zone.originalPitch = this.#numValue(zone.originalPitch, 6000);\r\n zone.sampleRate = this.#numValue(zone.sampleRate, 44100);\r\n };\r\n\r\n\r\n #setupEnvelope(envelope, zone, volume, when, sampleDuration, noteDuration) {\r\n envelope.gain.setValueAtTime(this.#noZeroVolume(0), this.#audioCtx.currentTime);\r\n\r\n const duration = Math.min(noteDuration, sampleDuration - this.#afterTime);\r\n const ahdsr = (zone.ahdsr && zone.ahdsr.length > 0) ? zone.ahdsr : [\r\n { duration: 0, volume: 1 },\r\n { duration: duration, volume: 1 }\r\n ];\r\n\r\n envelope.gain.cancelScheduledValues(when);\r\n const initialVol = (ahdsr[0]?.volume ?? 1) * volume;\r\n envelope.gain.setValueAtTime(this.#noZeroVolume(initialVol), when);\r\n\r\n let lastTime = 0;\r\n let lastVolume = ahdsr[0]?.volume ?? 1;\r\n\r\n for (const stage of ahdsr) {\r\n const { duration: stageDuration, volume: stageVolume } = stage;\r\n if (stageDuration <= 0) continue;\r\n const remainingTime = duration - lastTime;\r\n if (stageDuration > remainingTime) {\r\n const ratio = remainingTime / stageDuration;\r\n const interpolatedVolume = lastVolume + ratio * (stageVolume - lastVolume);\r\n envelope.gain.linearRampToValueAtTime(\r\n this.#noZeroVolume(volume * interpolatedVolume),\r\n when + duration\r\n );\r\n break;\r\n }\r\n lastTime += stageDuration;\r\n lastVolume = stageVolume;\r\n envelope.gain.linearRampToValueAtTime(\r\n this.#noZeroVolume(volume * lastVolume),\r\n when + lastTime\r\n );\r\n }\r\n\r\n envelope.gain.linearRampToValueAtTime(this.#noZeroVolume(0), when + duration + this.#afterTime);\r\n }\r\n\r\n\r\n #findEnvelope() {\r\n let envelope = this.#envelopes.find(e => e.target === this.#audioCtx.destination && this.#audioCtx.currentTime > e.when + e.duration + 0.001);\r\n if (envelope) {\r\n if (envelope.audioBufferSourceNode) {\r\n try {\r\n envelope.audioBufferSourceNode.stop(0);\r\n envelope.audioBufferSourceNode.disconnect();\r\n } catch (e) { }\r\n envelope.audioBufferSourceNode = null;\r\n }\r\n } else {\r\n envelope = this.#audioCtx.createGain();\r\n envelope.gain.value = 0;\r\n envelope.target = this.#audioCtx.destination;\r\n envelope.connect(this.#audioCtx.destination);\r\n envelope.cancel = () => {\r\n if (envelope.when + envelope.duration > this.#audioCtx.currentTime) {\r\n envelope.gain.cancelScheduledValues(0);\r\n envelope.gain.setTargetAtTime(this.#nearZero, this.#audioCtx.currentTime, 0.1);\r\n envelope.when = this.#audioCtx.currentTime + 0.00001;\r\n envelope.duration = 0;\r\n }\r\n };\r\n this.#envelopes.push(envelope);\r\n }\r\n return envelope;\r\n }\r\n\r\n\r\n #findZone(pitch) {\r\n const zone = this.#preset.zones.findLast(z => pitch >= z.keyRangeLow && pitch <= z.keyRangeHigh + 1);\r\n if (zone) this.#adjustZone(zone);\r\n return zone;\r\n };\r\n\r\n \r\n #limitVolume(v) {\r\n const requestedVolume = v ? 1.0 * v : 0.5;\r\n return Math.min(requestedVolume, 0.8);\r\n };\r\n\r\n\r\n #noZeroVolume(n) {\r\n return n > this.#nearZero ? n : this.#nearZero;\r\n }\r\n\r\n\r\n #numValue(a, b) {\r\n return typeof a === \"number\" ? a : b;\r\n }\r\n\r\n}\r\n\r\n\r\nclass WebAudioFontChannel {\r\n\r\n #input = null;\r\n #output = null;\r\n #audioCtx = null;\r\n #limiter = null;\r\n\r\n constructor(audioCtx) {\r\n this.#audioCtx = audioCtx;\r\n this.#input = this.#audioCtx.createGain();\r\n\r\n let lastNode = this.#input;\r\n [32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384].forEach(freq => {\r\n lastNode = this.#bandEqualizer(lastNode, freq);\r\n this[`band${freq < 1000 ? freq : (freq / 1024) + 'k'}`] = lastNode;\r\n });\r\n\r\n this.#limiter = this.#audioCtx.createDynamicsCompressor();\r\n this.#limiter.threshold.setValueAtTime(-3.0, this.#audioCtx.currentTime);\r\n this.#limiter.ratio.setValueAtTime(40, this.#audioCtx.currentTime);\r\n this.#limiter.attack.setValueAtTime(0.000, this.#audioCtx.currentTime);\r\n this.#limiter.release.setValueAtTime(0.25, this.#audioCtx.currentTime);\r\n this.#output = this.#audioCtx.createGain();\r\n lastNode.connect(this.#limiter);\r\n this.#limiter.connect(this.#output);\r\n }\r\n\r\n\r\n #bandEqualizer(from, frequency) {\r\n const filter = this.#audioCtx.createBiquadFilter();\r\n filter.frequency.setTargetAtTime(frequency, 0, 0.0001);\r\n filter.type = \"peaking\";\r\n filter.gain.setTargetAtTime(0, 0, 0.0001);\r\n filter.Q.setTargetAtTime(1.0, 0, 0.0001);\r\n from.connect(filter);\r\n return filter;\r\n }\r\n\r\n}", "{\n \"zones\": [\n {\n \"midi\": 81,\n \"originalPitch\": 4200,\n \"keyRangeLow\": 0,\n \"keyRangeHigh\": 43,\n \"loopStart\": 256,\n \"loopEnd\": 768,\n \"coarseTune\": 0,\n \"fineTune\": 0,\n \"sampleRate\": 48000,\n \"ahdsr\": false,\n \"file\": \"SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU3LjcyLjEwMQAAAAAAAAAAAAAA//tUwAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAACAAAGAACgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg//////////////////////////////////////////////////////////////////8AAAAATGF2YzU3Ljk2AAAAAAAAAAAAAAAAJALAAAAAAAAABgA5CeiPAAAAAAAAAAAAAAAAAAAA//vUxAAAB+gfQ1TwACTywCx/NYAJAABZOW7fg6F8L8A3AOwb5L2e7x5R5EoCADB8HwfPxACAYrB8H8oCDsHw/lAQdlwPqDHh/UCEp4fhiU8/ynv6BAGOZS1NzNUNm83W5HHJGz4Kk0TfzwzSZu8CgJ3TZ11pu3hi1hoxY8qMFcPAcBX40CM1RcwUo9EFQgiY2VPldy90c24GUwVQROZnA0ZXohQyMsyIBlAWEQK/zrsHfSBGmF4i+yiKKKNrP5FDrYJM+8XdeIRR1FaEwk0mLq5Upl0G35bBliJz8DxCcgSVtAYMpU27BVbW0tSXOzHsLU+88MTkCQ3PwO05aTrtqwF1G2YFHc7M1hamc5RYnJXbn6S9OU7L2apytcaEpk5bQVbXIszWrUzuzNatW5HKL05K+z9Jyip+vcyqG3yZTDELa1DcIazEIXV3jW1lV3jW1lV7h/M/7h/M/7h/9/+f/f/n/3/58qr2JTUtyqvYlNy3TXbFLct012xS3Kemu0lLWp6arSexu7G62Ja2Ja2Ja0QsKrWx13Wb36/a/7/ew5kMjLhQNcmAxqICUIjQsMqB4zeSzGokEALDBOxI2OrTTJJMLBUwcCQYAVMDdlQ0A6Zkis4q5jIAQzknMdGQMBLAltWVxZrJm4ma0hGaGCmrpKmfS87RrhMci3muq5p4+b4wKbPCqVlsBQHbcmCKhmxoZcGGmnZmJeZOEmiGS7nGjrWX5mn+j92HZJcMqKDIgYz0vMnJTHwUzYoMiIGdQNMuTIbj/U13dLc1aMqCjSTkzEvMpCTQjQy4qMkBjPTGR3X9pMI1N9q1aWtWpqtUyspMhBTOCwyYkMeAjNSsyUjMdATMCYyIgpZJZygGm+AqXGzWrWqtWzWrWjGgAy0lMhHwEXmVERjw4AigycfMdGwMVmSDhjQwCiSU1solVxiNamhqlpYZx3jllljvHLWWLlv/F3cfyKO+/8vfx/JY/7/y9/H8lj/v/Pv5Dk5D8bn4xGJyNxuf1llvHHWWW8cdZZbx//u0xLeAL2H/Z7nNkIFVkCR3sMAFx1llvHHWVbHGrllWAbmu1l2+wACIJmablgZJEkGiBRmRmRKSQMOakoAW1jywyxmXRDkBISlWnK1b7K0xdxcdLomjI+e1lat9latrlly7rLnrbVat8FFQgpgKeCmxTcgrgVVMQU1FMy45OS41VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV\",\n \"anchor\": 0.00533333\n },\n {\n \"midi\": 81,\n \"originalPitch\": 5400,\n \"keyRangeLow\": 44,\n \"keyRangeHigh\": 55,\n \"loopStart\": 128,\n \"loopEnd\": 384,\n \"coarseTune\": 0,\n \"fineTune\": 0,\n \"sampleRate\": 48000,\n \"ahdsr\": false,\n \"file\": \"SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU3LjcyLjEwMQAAAAAAAAAAAAAA//tUwAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAACAAAEsADMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzM//////////////////////////////////////////////////////////////////8AAAAATGF2YzU3Ljk2AAAAAAAAAAAAAAAAJATAAAAAAAAABLAMEvhQAAAAAAAAAAAAAAAAAAAA//vUxAAACSwNaVQwACRXSC6/NYAIAAa9txyS8qHAwMDPlz5QEIIROfLn1AhBBy3lz/BCt5c/wQz5c/RBCXPlw/EEEHLPlz9EEOt8QQQcs+XPykQVh8uH4gcIHLD6w+JgcGkGbGakSCqjColKJDEMCR4mYQ8kQZ1UAiwCAIbAc4b1maEch6LAEVzMhwxuYQGCgLBWbmQSPi+kAzkOM6i/Ei2XrGgFiMbisXednEOO7NP9KJdLKedbxd7vvezh3pl/YdmreFqxnZjEgf+NyN/I1TXaWzqnqWqTOzTyyihuX0cMUlNa3S81TYWrGd63q/RRuno4xSUUbt3YzSYU1fuH8z/uH8zp6OMUlFK6e/KKTG5zKZy+ax/+4fzP+4fzP70rp78opL1PXv0lSzVy+tjjVyyrY41e4fzf91/N/3X83/dfzf91/N/3X5/3D+b/uv5v+6/m/7r/3/6/9/+sst446yy3jVyyrY41csq2ONXLKtjjVyyrKiLXdbW5JI24SEB1CQjhFAAXAIxdxbUKO0ekXEuKphJ5DkSgYKJVFFxQVwUwFDcRcUFcFcCjsTYoK4K4FHYmxQXwrgUdibFBfCvCjsTcRXhXhT8TcRXhXhT8TcRXhXhT8TcRXhXhT8TcakxBTUUzLjk5LjWqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//tkxMWDzQgxS7zzACgAADSAAAAEqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\",\n \"anchor\": 0.00266667\n },\n {\n \"midi\": 81,\n \"originalPitch\": 6600,\n \"keyRangeLow\": 56,\n \"keyRangeHigh\": 67,\n \"loopStart\": 64,\n \"loopEnd\": 192,\n \"coarseTune\": 0,\n \"fineTune\": 0,\n \"sampleRate\": 48000,\n \"ahdsr\": false,\n \"file\": \"SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU3LjcyLjEwMQAAAAAAAAAAAAAA//tUwAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAACAAAE4ADs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs//////////////////////////////////////////////////////////////////8AAAAATGF2YzU3Ljk2AAAAAAAAAAAAAAAAJAXAAAAAAAAABODQyktQAAAAAAAAAAAAAAAAAAAA//vkxAAABywBgbQAACYVyC6/P9AwKAASUcckkt4YWD4fLn1AhBCJz5c+oEFghy5/ghy5+cghy7+GKZd/DHLn1HIYk5d/DHL+6H5d5TOdLnbLTLKrBqyq+vlkqeD4lCzTAngBgvMYACAAGg+NZZoFwogYAGAZCwCsDgBJsJhRJLyYvYUvg4BLFAA9AKpqYxQCumE3hMhEBIkBkBLuNR5oOGzUbs0Jk7jR1yTFgpzGY2TMgWV8qtT4fmaf4xDKgxlNgzTGRZScSFbPVQxarGZbWMLiNMUC1MshXMJx+MRSeaZHnuceOvbGrV2ls6MOQUMAAnMDAzMMgRMAQkMCQufiahT9zMJfim7ul5rIDBEFgJBgHgoHQuBANAwFA1WkUbqzssyns944flv09UjUcU9kjkkk9UjZfjOyzKep8Z2kxucyq9+ax9JFNJNJNZNFNFNVNJNJNbKRRvGQxjKejfJ2Udq/9bf1darY41U0U0U1U0k0k+k0U0U+U0k0k+k0e5/zD+5/zD+5/zX93/Nf3f81/d////////7/9f+//X/v/1/7/9Jop8ppJpJ9Jop6qwppJ7KxJGp6qwpHKrKxI2qqqwo3KrKxI2qqq9RuVWV8jaqqr1G5TEFNRTMuOTkuNVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy45OS41VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sUxNoDwAAB/hwAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV\",\n \"anchor\": 0.00133333\n },\n {\n \"midi\": 81,\n \"originalPitch\": 7800,\n \"keyRangeLow\": 68,\n \"keyRangeHigh\": 79,\n \"loopStart\": 32,\n \"loopEnd\": 96,\n \"coarseTune\": 0,\n \"fineTune\": 0,\n \"sampleRate\": 48000,\n \"ahdsr\": false,\n \"file\": \"SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU3LjcyLjEwMQAAAAAAAAAAAAAA//tUwAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAACAAADwADm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm//////////////////////////////////////////////////////////////////8AAAAATGF2YzU3Ljk2AAAAAAAAAAAAAAAAJAZAAAAAAAAAA8CsVDBMAAAAAAAAAAAAAAAAAAAA//vExAAABmQBjaAAACGQBa9497AdtbAkWdckklxRyjhQ5BBYYqOFHRAXDHKHOGOUOcMco7nOJHawxynnOU5cMcHOXOcHOl3NXGMqsiEAqoMI8QsSUcIsgeiQgJISFCg5ABAyw+VQaiK8yY18FNiuxBUorwU0FdiC4ivimgrsQXEV4KaCuxBcTfBXAv4isTfiuBf6KxN+L4r8RUU3wXoL+JsU3wXoL+JsV3gvRSpMQU1FMy45OS41qqqqqqqqqqqqqqqqqqqqqqqq6goZoAABEOiCXDs8P3G8oicJAhZjVVVBlsStNFVVUT8StNVMQU1FMy45OS41VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sUxOuDxEQnByYExigAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV\",\n \"anchor\": 0.00066667\n },\n {\n \"midi\": 81,\n \"originalPitch\": 9000,\n \"keyRangeLow\": 80,\n \"keyRangeHigh\": 91,\n \"loopStart\": 16,\n \"loopEnd\": 48,\n \"coarseTune\": 0,\n \"fineTune\": 0,\n \"sampleRate\": 48000,\n \"ahdsr\": false,\n \"file\": \"SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU3LjcyLjEwMQAAAAAAAAAAAAAA//tUwAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAACAAADwADm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm//////////////////////////////////////////////////////////////////8AAAAATGF2YzU3Ljk2AAAAAAAAAAAAAAAAJAaAAAAAAAAAA8ChXkahAAAAAAAAAAAAAAAAAAAA//vExAAABkQDh+AAACGUhq9895iZZVlzMgFEYk0nBACCLQfD6gTB8/qBDBwMflC4f/gQMfqBMH/4OHP4Df+XBw5+UBN/6wJu1fapqZhlttyF2FyUYQ0W0QkFSJiRIro4TAYk8aQCAQCAKjiRIkSr+xQUFOBQUV/5BQU4KChv+CgoL4KCu/4QUN8KCn/8UFN8FFf/wgp/hQ3/8FBXYgoL/+FBX5BQ3/8FBfigopVMQU1FMy45OS41VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy45OS41VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sUxNoDwAAB/gAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV\",\n \"anchor\": 0.00033333\n },\n {\n \"midi\": 81,\n \"originalPitch\": 10200,\n \"keyRangeLow\": 92,\n \"keyRangeHigh\": 103,\n \"loopStart\": 8,\n \"loopEnd\": 56,\n \"coarseTune\": 0,\n \"fineTune\": 0,\n \"sampleRate\": 48000,\n \"ahdsr\": false,\n \"file\": \"SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU3LjcyLjEwMQAAAAAAAAAAAAAA//tUwAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAACAAADwADm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm//////////////////////////////////////////////////////////////////8AAAAATGF2YzU3Ljk2AAAAAAAAAAAAAAAAJAaAAAAAAAAAA8AljJJeAAAAAAAAAAAAAAAAAAAA//vExAAABmgDh+AAACG7Cq649JmAh3unfGYwJRhSgQBBEXB8PjogBDn8EwfP6gQdicP/g4GOXB/lHfgmH905/UclwcOf/8oA/2r/qekIFM1D+AxK8OEgo9IhpLSJFdJaehzC3CbBom0GChJpEiRn/tRxIkSJT6OJJB3BUFXSwNB3BUFQVgqCoaqBoGsqd4iBo8oGgaTWCoaxEDR6VBUFTpUFQV//BoGoiBoO//rxKCv//iIGv/+WTEFNRTMuOTkuNVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy45OS41VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sUxNoDwAAB/gAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV\",\n \"anchor\": 0.00016667\n },\n {\n \"midi\": 81,\n \"originalPitch\": 11400,\n \"keyRangeLow\": 104,\n \"keyRangeHigh\": 115,\n \"loopStart\": 12,\n \"loopEnd\": 52,\n \"coarseTune\": 0,\n \"fineTune\": 0,\n \"sampleRate\": 48000,\n \"ahdsr\": false,\n \"file\": \"SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU3LjcyLjEwMQAAAAAAAAAAAAAA//tUwAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAACAAADwADm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm//////////////////////////////////////////////////////////////////8AAAAATGF2YzU3Ljk2AAAAAAAAAAAAAAAAJAaAAAAAAAAAA8CNr1v4AAAAAAAAAAAAAAAAAAAA//vExAAAB1SVheCEbeI4SC349ApomIy4jYiPtA6x5AACs4xjvkAAPmMY/wAXzGMf4AL/X+IgG4PvwQOfIQQOZcH//wQlwfBA5/1h/iB2sP/17/1GMvIAEJ8BiUYMEW0NSAKQjJWj5HCbB/EGHqQ5m2plUuYL1WvVqeGZmb/VVVf9mZr/1VVX9hYGwKgFgbB9TCwNgbB8BG6lKUreYxjfKUrfQxvylK3oYxjeUKAgICJYoCAgICUvoYxvylL9DGN9SlL9P+UrfMYxjOoYCAgIUb6lL////////qUpSzASTEFNRTMuOTkuNaqqqqpMQU1FMy45OS41qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//sUxNoDwAAB/gAAACAAADSAAAAEqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\",\n \"anchor\": 0.00008333\n },\n {\n \"midi\": 81,\n \"originalPitch\": 12600,\n \"keyRangeLow\": 116,\n \"keyRangeHigh\": 127,\n \"loopStart\": 6,\n \"loopEnd\": 42,\n \"coarseTune\": 0,\n \"fineTune\": 0,\n \"sampleRate\": 48000,\n \"ahdsr\": false,\n \"file\": \"SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU3LjcyLjEwMQAAAAAAAAAAAAAA//tUwAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAACAAAEIADo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo//////////////////////////////////////////////////////////////////8AAAAATGF2YzU3Ljk2AAAAAAAAAAAAAAAAJAaQAAAAAAAABCDWHfeqAAAAAAAAAAAAAAAAAAAA//vUxAAACUUrfeCE1eMLSCx88a54l3jMh4t/trUApEAAAUAGYxja+WMYx/yAAH+MY/+AYx/4AAX8xjH/7/8AF//zHyAMdoIAgAAADAYWTt4IA/Kc5/////////y4Pg/v3FZropQkAAAEiDVBBhkjdBSk5JyDlHqDmWi+kJRsJiOZ69eva6x+zAQEBCm/9VVVb/9mVVL/9mZmP/6qqqn/8ZlVV/6zMzM3/VCgICanXX+5I2JRJHaana+SSNwIQEQAwAQAQEw6j5KBCASACACAKAmBGHcdr5RNR2jtJRsed/DkTU1NTra/3Oc5znf+1rWuc7/3Na1ra/9znOc7/9rWtc7/9zWta3/4c5znO/9rTU1NXOvbW4lDtDyHkPI7TqQIQAxMQU1FMy45OS41qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpMQU1FMy45OS41qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//sUxNoDwAABpAAAACAAADSAAAAEqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\",\n \"anchor\": 0.00004167\n }\n ]\n}", "import MidiPlayer from 'midi-player-js';\r\nimport WebAudioFontPlayer from \"./webaudiofontplayer\";\r\nimport DefaultPreset from \"./presets/defaultpreset.json\";\r\n\r\n\r\n\r\nexport default class MidiAudioPlayer extends MidiPlayer.Player {\r\n\r\n\t#audioCtx = null;\r\n\t#audioPlayer = null;\r\n\t#activeNotes = null;\r\n\r\n\t#opts = {\r\n\t\tpreset: DefaultPreset,\r\n volume: 0.012,\r\n\t\tonEndFile: null\r\n\t};\r\n\r\n\r\n\tconstructor(opts = {}) {\r\n super(event => this.#handleMidiPipeline(event));\r\n\t\tthis.#opts = { ...this.#opts, ...opts };\r\n this.#activeNotes = new Map();\r\n\t\tthis.#audioCtx = new (window.AudioContext || window.webkitAudioContext)();\r\n\t\tthis.#audioPlayer = new WebAudioFontPlayer(this.#audioCtx, this.#opts.preset);\r\n this.on('endOfFile', async () => {\r\n\t\t\tawait new Promise(resolve => requestAnimationFrame(() => setTimeout(resolve, 1)));\r\n\t\t\tawait this.#endOfFile();\r\n });\r\n\t}\r\n\r\n async load(content) {\r\n\t\tif(this.isPlaying()) this.stop();\r\n\t\tthis.#clearActiveNotes();\r\n\t\tawait this.loadArrayBuffer(content);\r\n\t}\r\n \r\n\r\n\tasync play(content = null) {\r\n\t\tif(content) await this.load(content);\r\n await this.#audioCtx.resume();\r\n\t\tawait super.play();\r\n\t}\r\n \r\n\r\n\tasync pause() {\r\n await super.pause();\r\n await this.#clearActiveNotes();\r\n await this.#audioPlayer.cancelQueue();\r\n\t}\r\n\r\n\t\r\n async stop() {\r\n await super.stop();\r\n await this.#clearActiveNotes();\r\n await this.#audioPlayer.cancelQueue();\r\n\t}\r\n\r\n\r\n\tasync #endOfFile() {\r\n\t\tif(typeof this.#opts.onEndFile == 'function') await this.#opts.onEndFile();\r\n\t}\r\n\r\n\r\n async #handleMidiPipeline(event) {\r\n if (event.name !== 'Note on' && event.name !== 'Note off') return;\r\n if (!this.isPlaying()) return;\r\n if (event.noteNumber === undefined) return;\r\n\r\n const now = this.#audioCtx.currentTime;\r\n\r\n switch (event.name) {\r\n case 'Note on':\r\n if (event.velocity > 0 && event.velocity <= 127) {\r\n this.#stopNotePipe(event.noteNumber);\r\n const vol = (event.velocity / 127) * this.#opts.volume;\r\n const envelope = this.#audioPlayer.queueWaveTable(0, event.noteNumber, 2, vol);\r\n this.#activeNotes.set(event.noteNumber, envelope);\r\n } else {\r\n this.#stopNotePipe(event.noteNumber);\r\n }\r\n break;\r\n\r\n case 'Note off':\r\n this.#stopNotePipe(event.noteNumber);\r\n break;\r\n }\r\n }\r\n\r\n\r\n #stopNotePipe(noteNumber) {\r\n const envelope = this.#activeNotes.get(noteNumber);\r\n if (envelope) {\r\n envelope.cancel();\r\n this.#activeNotes.delete(noteNumber);\r\n }\r\n }\r\n\r\n\r\n #clearActiveNotes() {\r\n if (this.#activeNotes) {\r\n this.#activeNotes.forEach((envelope, note) => { if (envelope && envelope.cancel) envelope.cancel(); });\r\n this.#activeNotes.clear();\r\n }\r\n }\r\n\r\n}\r\n\r\n// export { MidiAudioPlayer };", "import MidiAudioPlayer from './src/midiaudioplayer.js';\r\n\r\nif (typeof window !== 'undefined') window.MidiAudioPlayer = MidiAudioPlayer;\r\n\r\n\r\nexport { MidiAudioPlayer };\r\nexport default MidiAudioPlayer;"],
5
+ "mappings": "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",
6
6
  "names": ["_loop", "Utils", "atob", "Track", "index", "Player", "e"]
7
7
  }