libadlmidi-js 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/README.md +36 -1
  2. package/dist/core.d.ts +148 -0
  3. package/dist/fm_banks/manifest.json +1 -1
  4. package/dist/libadlmidi.d.ts +119 -2
  5. package/dist/libadlmidi.dosbox.browser.js +1 -1
  6. package/dist/libadlmidi.dosbox.browser.wasm +0 -0
  7. package/dist/libadlmidi.dosbox.core.js +1 -1
  8. package/dist/libadlmidi.dosbox.core.wasm +0 -0
  9. package/dist/libadlmidi.dosbox.js +0 -0
  10. package/dist/libadlmidi.dosbox.processor.js +152 -53
  11. package/dist/libadlmidi.dosbox.slim.browser.js +1 -1
  12. package/dist/libadlmidi.dosbox.slim.browser.wasm +0 -0
  13. package/dist/libadlmidi.dosbox.slim.core.js +1 -1
  14. package/dist/libadlmidi.dosbox.slim.core.wasm +0 -0
  15. package/dist/libadlmidi.dosbox.slim.js +0 -0
  16. package/dist/libadlmidi.dosbox.slim.processor.js +152 -53
  17. package/dist/libadlmidi.full.browser.js +1 -1
  18. package/dist/libadlmidi.full.browser.wasm +0 -0
  19. package/dist/libadlmidi.full.core.js +1 -1
  20. package/dist/libadlmidi.full.core.wasm +0 -0
  21. package/dist/libadlmidi.full.js +0 -0
  22. package/dist/libadlmidi.full.processor.js +152 -53
  23. package/dist/libadlmidi.full.slim.browser.js +1 -1
  24. package/dist/libadlmidi.full.slim.browser.wasm +0 -0
  25. package/dist/libadlmidi.full.slim.core.js +1 -1
  26. package/dist/libadlmidi.full.slim.core.wasm +0 -0
  27. package/dist/libadlmidi.full.slim.js +0 -0
  28. package/dist/libadlmidi.full.slim.processor.js +152 -53
  29. package/dist/libadlmidi.js +258 -4
  30. package/dist/libadlmidi.js.map +2 -2
  31. package/dist/libadlmidi.light.browser.js +1 -1
  32. package/dist/libadlmidi.light.browser.wasm +0 -0
  33. package/dist/libadlmidi.light.core.js +1 -1
  34. package/dist/libadlmidi.light.core.wasm +0 -0
  35. package/dist/libadlmidi.light.js +0 -0
  36. package/dist/libadlmidi.light.processor.js +152 -53
  37. package/dist/libadlmidi.light.slim.browser.js +1 -1
  38. package/dist/libadlmidi.light.slim.browser.wasm +0 -0
  39. package/dist/libadlmidi.light.slim.core.js +1 -1
  40. package/dist/libadlmidi.light.slim.core.wasm +0 -0
  41. package/dist/libadlmidi.light.slim.js +0 -0
  42. package/dist/libadlmidi.light.slim.processor.js +152 -53
  43. package/dist/libadlmidi.nuked.browser.js +1 -1
  44. package/dist/libadlmidi.nuked.browser.wasm +0 -0
  45. package/dist/libadlmidi.nuked.core.js +1 -1
  46. package/dist/libadlmidi.nuked.core.wasm +0 -0
  47. package/dist/libadlmidi.nuked.js +0 -0
  48. package/dist/libadlmidi.nuked.processor.js +152 -53
  49. package/dist/libadlmidi.nuked.slim.browser.js +1 -1
  50. package/dist/libadlmidi.nuked.slim.browser.wasm +0 -0
  51. package/dist/libadlmidi.nuked.slim.core.js +1 -1
  52. package/dist/libadlmidi.nuked.slim.core.wasm +0 -0
  53. package/dist/libadlmidi.nuked.slim.js +0 -0
  54. package/dist/libadlmidi.nuked.slim.processor.js +152 -53
  55. package/package.json +6 -5
  56. package/src/core.js +289 -24
  57. package/src/libadlmidi.js +229 -4
  58. package/src/processor.js +101 -1
@@ -2385,10 +2385,11 @@ async function createADLMIDI(moduleArg = {}) {
2385
2385
  return;
2386
2386
  }
2387
2387
  try {
2388
- func();
2389
- maybeExit();
2388
+ return func();
2390
2389
  } catch (e) {
2391
2390
  handleException(e);
2391
+ } finally {
2392
+ maybeExit();
2392
2393
  }
2393
2394
  };
2394
2395
  var _emscripten_get_now = () => performance.now();
@@ -2605,60 +2606,79 @@ async function createADLMIDI(moduleArg = {}) {
2605
2606
  Module["setValue"] = setValue;
2606
2607
  Module["getValue"] = getValue;
2607
2608
  Module["UTF8ToString"] = UTF8ToString;
2608
- var _adl_init, _adl_close, _adl_setNumChips, _adl_setBank, _adl_getBanksCount, _adl_getBankNames, _adl_reserveBanks, _adl_getBank, _adl_getInstrument, _adl_setInstrument, _adl_loadEmbeddedBank, _adl_setNumFourOpsChn, _adl_setPercMode, _adl_setHVibrato, _adl_setHTremolo, _adl_setScaleModulators, _adl_setLoopEnabled, _adl_setLoopCount, _adl_setSoftPanEnabled, _adl_setVolumeRangeModel, _adl_openBankFile, _adl_openBankData, _adl_openData, _adl_chipEmulatorName, _adl_switchEmulator, _adl_errorString, _adl_errorInfo, _adl_reset, _adl_totalTimeLength, _adl_positionTell, _adl_positionSeek, _adl_positionRewind, _adl_setTempo, _adl_play, _adl_playFormat, _adl_generate, _adl_generateFormat, _adl_atEnd, _adl_panic, _adl_rt_resetState, _adl_rt_noteOn, _adl_rt_noteOff, _adl_rt_controllerChange, _adl_rt_patchChange, _adl_rt_pitchBend, _adl_rt_pitchBendML, __emscripten_timeout, _malloc, _free, __emscripten_stack_restore, __emscripten_stack_alloc, _emscripten_stack_get_current, memory, __indirect_function_table, wasmMemory;
2609
+ var _adl_init, _adl_close, _adl_setNumChips, _adl_getNumChips, _adl_getNumChipsObtained, _adl_setBank, _adl_getBanksCount, _adl_getBankNames, _adl_reserveBanks, _adl_getBank, _adl_getInstrument, _adl_setInstrument, _adl_loadEmbeddedBank, _adl_setNumFourOpsChn, _adl_getNumFourOpsChn, _adl_setPercMode, _adl_setHVibrato, _adl_setHTremolo, _adl_setScaleModulators, _adl_setFullRangeBrightness, _adl_setAutoArpeggio, _adl_getAutoArpeggio, _adl_setLoopEnabled, _adl_setLoopCount, _adl_setSoftPanEnabled, _adl_setVolumeRangeModel, _adl_getVolumeRangeModel, _adl_setChannelAllocMode, _adl_getChannelAllocMode, _adl_openBankFile, _adl_openBankData, _adl_openData, _adl_chipEmulatorName, _adl_switchEmulator, _adl_setRunAtPcmRate, _adl_linkedLibraryVersion, _adl_linkedVersion, _adl_errorString, _adl_errorInfo, _adl_reset, _adl_totalTimeLength, _adl_positionTell, _adl_positionSeek, _adl_positionRewind, _adl_setTempo, _adl_metaMusicTitle, _adl_metaMusicCopyright, _adl_play, _adl_playFormat, _adl_generate, _adl_generateFormat, _adl_atEnd, _adl_panic, _adl_rt_resetState, _adl_rt_noteOn, _adl_rt_noteOff, _adl_rt_noteAfterTouch, _adl_rt_channelAfterTouch, _adl_rt_controllerChange, _adl_rt_patchChange, _adl_rt_pitchBend, _adl_rt_pitchBendML, _adl_rt_bankChangeLSB, _adl_rt_bankChangeMSB, _adl_rt_bankChange, __emscripten_timeout, _malloc, _free, __emscripten_stack_restore, __emscripten_stack_alloc, _emscripten_stack_get_current, memory, __indirect_function_table, wasmMemory;
2609
2610
  function assignWasmExports(wasmExports2) {
2610
2611
  _adl_init = Module["_adl_init"] = wasmExports2["p"];
2611
2612
  _adl_close = Module["_adl_close"] = wasmExports2["q"];
2612
2613
  _adl_setNumChips = Module["_adl_setNumChips"] = wasmExports2["r"];
2613
- _adl_setBank = Module["_adl_setBank"] = wasmExports2["s"];
2614
- _adl_getBanksCount = Module["_adl_getBanksCount"] = wasmExports2["t"];
2615
- _adl_getBankNames = Module["_adl_getBankNames"] = wasmExports2["u"];
2616
- _adl_reserveBanks = Module["_adl_reserveBanks"] = wasmExports2["v"];
2617
- _adl_getBank = Module["_adl_getBank"] = wasmExports2["w"];
2618
- _adl_getInstrument = Module["_adl_getInstrument"] = wasmExports2["x"];
2619
- _adl_setInstrument = Module["_adl_setInstrument"] = wasmExports2["y"];
2620
- _adl_loadEmbeddedBank = Module["_adl_loadEmbeddedBank"] = wasmExports2["z"];
2621
- _adl_setNumFourOpsChn = Module["_adl_setNumFourOpsChn"] = wasmExports2["A"];
2622
- _adl_setPercMode = Module["_adl_setPercMode"] = wasmExports2["B"];
2623
- _adl_setHVibrato = Module["_adl_setHVibrato"] = wasmExports2["C"];
2624
- _adl_setHTremolo = Module["_adl_setHTremolo"] = wasmExports2["D"];
2625
- _adl_setScaleModulators = Module["_adl_setScaleModulators"] = wasmExports2["E"];
2626
- _adl_setLoopEnabled = Module["_adl_setLoopEnabled"] = wasmExports2["F"];
2627
- _adl_setLoopCount = Module["_adl_setLoopCount"] = wasmExports2["G"];
2628
- _adl_setSoftPanEnabled = Module["_adl_setSoftPanEnabled"] = wasmExports2["H"];
2629
- _adl_setVolumeRangeModel = Module["_adl_setVolumeRangeModel"] = wasmExports2["I"];
2630
- _adl_openBankFile = Module["_adl_openBankFile"] = wasmExports2["J"];
2631
- _adl_openBankData = Module["_adl_openBankData"] = wasmExports2["K"];
2632
- _adl_openData = Module["_adl_openData"] = wasmExports2["L"];
2633
- _adl_chipEmulatorName = Module["_adl_chipEmulatorName"] = wasmExports2["M"];
2634
- _adl_switchEmulator = Module["_adl_switchEmulator"] = wasmExports2["N"];
2635
- _adl_errorString = Module["_adl_errorString"] = wasmExports2["O"];
2636
- _adl_errorInfo = Module["_adl_errorInfo"] = wasmExports2["P"];
2637
- _adl_reset = Module["_adl_reset"] = wasmExports2["Q"];
2638
- _adl_totalTimeLength = Module["_adl_totalTimeLength"] = wasmExports2["R"];
2639
- _adl_positionTell = Module["_adl_positionTell"] = wasmExports2["S"];
2640
- _adl_positionSeek = Module["_adl_positionSeek"] = wasmExports2["T"];
2641
- _adl_positionRewind = Module["_adl_positionRewind"] = wasmExports2["U"];
2642
- _adl_setTempo = Module["_adl_setTempo"] = wasmExports2["V"];
2643
- _adl_play = Module["_adl_play"] = wasmExports2["W"];
2644
- _adl_playFormat = Module["_adl_playFormat"] = wasmExports2["X"];
2645
- _adl_generate = Module["_adl_generate"] = wasmExports2["Y"];
2646
- _adl_generateFormat = Module["_adl_generateFormat"] = wasmExports2["Z"];
2647
- _adl_atEnd = Module["_adl_atEnd"] = wasmExports2["_"];
2648
- _adl_panic = Module["_adl_panic"] = wasmExports2["$"];
2649
- _adl_rt_resetState = Module["_adl_rt_resetState"] = wasmExports2["aa"];
2650
- _adl_rt_noteOn = Module["_adl_rt_noteOn"] = wasmExports2["ba"];
2651
- _adl_rt_noteOff = Module["_adl_rt_noteOff"] = wasmExports2["ca"];
2652
- _adl_rt_controllerChange = Module["_adl_rt_controllerChange"] = wasmExports2["da"];
2653
- _adl_rt_patchChange = Module["_adl_rt_patchChange"] = wasmExports2["ea"];
2654
- _adl_rt_pitchBend = Module["_adl_rt_pitchBend"] = wasmExports2["fa"];
2655
- _adl_rt_pitchBendML = Module["_adl_rt_pitchBendML"] = wasmExports2["ga"];
2656
- __emscripten_timeout = wasmExports2["ha"];
2657
- _malloc = Module["_malloc"] = wasmExports2["ia"];
2658
- _free = Module["_free"] = wasmExports2["ja"];
2659
- __emscripten_stack_restore = wasmExports2["ka"];
2660
- __emscripten_stack_alloc = wasmExports2["la"];
2661
- _emscripten_stack_get_current = wasmExports2["ma"];
2614
+ _adl_getNumChips = Module["_adl_getNumChips"] = wasmExports2["s"];
2615
+ _adl_getNumChipsObtained = Module["_adl_getNumChipsObtained"] = wasmExports2["t"];
2616
+ _adl_setBank = Module["_adl_setBank"] = wasmExports2["u"];
2617
+ _adl_getBanksCount = Module["_adl_getBanksCount"] = wasmExports2["v"];
2618
+ _adl_getBankNames = Module["_adl_getBankNames"] = wasmExports2["w"];
2619
+ _adl_reserveBanks = Module["_adl_reserveBanks"] = wasmExports2["x"];
2620
+ _adl_getBank = Module["_adl_getBank"] = wasmExports2["y"];
2621
+ _adl_getInstrument = Module["_adl_getInstrument"] = wasmExports2["z"];
2622
+ _adl_setInstrument = Module["_adl_setInstrument"] = wasmExports2["A"];
2623
+ _adl_loadEmbeddedBank = Module["_adl_loadEmbeddedBank"] = wasmExports2["B"];
2624
+ _adl_setNumFourOpsChn = Module["_adl_setNumFourOpsChn"] = wasmExports2["C"];
2625
+ _adl_getNumFourOpsChn = Module["_adl_getNumFourOpsChn"] = wasmExports2["D"];
2626
+ _adl_setPercMode = Module["_adl_setPercMode"] = wasmExports2["E"];
2627
+ _adl_setHVibrato = Module["_adl_setHVibrato"] = wasmExports2["F"];
2628
+ _adl_setHTremolo = Module["_adl_setHTremolo"] = wasmExports2["G"];
2629
+ _adl_setScaleModulators = Module["_adl_setScaleModulators"] = wasmExports2["H"];
2630
+ _adl_setFullRangeBrightness = Module["_adl_setFullRangeBrightness"] = wasmExports2["I"];
2631
+ _adl_setAutoArpeggio = Module["_adl_setAutoArpeggio"] = wasmExports2["J"];
2632
+ _adl_getAutoArpeggio = Module["_adl_getAutoArpeggio"] = wasmExports2["K"];
2633
+ _adl_setLoopEnabled = Module["_adl_setLoopEnabled"] = wasmExports2["L"];
2634
+ _adl_setLoopCount = Module["_adl_setLoopCount"] = wasmExports2["M"];
2635
+ _adl_setSoftPanEnabled = Module["_adl_setSoftPanEnabled"] = wasmExports2["N"];
2636
+ _adl_setVolumeRangeModel = Module["_adl_setVolumeRangeModel"] = wasmExports2["O"];
2637
+ _adl_getVolumeRangeModel = Module["_adl_getVolumeRangeModel"] = wasmExports2["P"];
2638
+ _adl_setChannelAllocMode = Module["_adl_setChannelAllocMode"] = wasmExports2["Q"];
2639
+ _adl_getChannelAllocMode = Module["_adl_getChannelAllocMode"] = wasmExports2["R"];
2640
+ _adl_openBankFile = Module["_adl_openBankFile"] = wasmExports2["S"];
2641
+ _adl_openBankData = Module["_adl_openBankData"] = wasmExports2["T"];
2642
+ _adl_openData = Module["_adl_openData"] = wasmExports2["U"];
2643
+ _adl_chipEmulatorName = Module["_adl_chipEmulatorName"] = wasmExports2["V"];
2644
+ _adl_switchEmulator = Module["_adl_switchEmulator"] = wasmExports2["W"];
2645
+ _adl_setRunAtPcmRate = Module["_adl_setRunAtPcmRate"] = wasmExports2["X"];
2646
+ _adl_linkedLibraryVersion = Module["_adl_linkedLibraryVersion"] = wasmExports2["Y"];
2647
+ _adl_linkedVersion = Module["_adl_linkedVersion"] = wasmExports2["Z"];
2648
+ _adl_errorString = Module["_adl_errorString"] = wasmExports2["_"];
2649
+ _adl_errorInfo = Module["_adl_errorInfo"] = wasmExports2["$"];
2650
+ _adl_reset = Module["_adl_reset"] = wasmExports2["aa"];
2651
+ _adl_totalTimeLength = Module["_adl_totalTimeLength"] = wasmExports2["ba"];
2652
+ _adl_positionTell = Module["_adl_positionTell"] = wasmExports2["ca"];
2653
+ _adl_positionSeek = Module["_adl_positionSeek"] = wasmExports2["da"];
2654
+ _adl_positionRewind = Module["_adl_positionRewind"] = wasmExports2["ea"];
2655
+ _adl_setTempo = Module["_adl_setTempo"] = wasmExports2["fa"];
2656
+ _adl_metaMusicTitle = Module["_adl_metaMusicTitle"] = wasmExports2["ga"];
2657
+ _adl_metaMusicCopyright = Module["_adl_metaMusicCopyright"] = wasmExports2["ha"];
2658
+ _adl_play = Module["_adl_play"] = wasmExports2["ia"];
2659
+ _adl_playFormat = Module["_adl_playFormat"] = wasmExports2["ja"];
2660
+ _adl_generate = Module["_adl_generate"] = wasmExports2["ka"];
2661
+ _adl_generateFormat = Module["_adl_generateFormat"] = wasmExports2["la"];
2662
+ _adl_atEnd = Module["_adl_atEnd"] = wasmExports2["ma"];
2663
+ _adl_panic = Module["_adl_panic"] = wasmExports2["na"];
2664
+ _adl_rt_resetState = Module["_adl_rt_resetState"] = wasmExports2["oa"];
2665
+ _adl_rt_noteOn = Module["_adl_rt_noteOn"] = wasmExports2["pa"];
2666
+ _adl_rt_noteOff = Module["_adl_rt_noteOff"] = wasmExports2["qa"];
2667
+ _adl_rt_noteAfterTouch = Module["_adl_rt_noteAfterTouch"] = wasmExports2["ra"];
2668
+ _adl_rt_channelAfterTouch = Module["_adl_rt_channelAfterTouch"] = wasmExports2["sa"];
2669
+ _adl_rt_controllerChange = Module["_adl_rt_controllerChange"] = wasmExports2["ta"];
2670
+ _adl_rt_patchChange = Module["_adl_rt_patchChange"] = wasmExports2["ua"];
2671
+ _adl_rt_pitchBend = Module["_adl_rt_pitchBend"] = wasmExports2["va"];
2672
+ _adl_rt_pitchBendML = Module["_adl_rt_pitchBendML"] = wasmExports2["wa"];
2673
+ _adl_rt_bankChangeLSB = Module["_adl_rt_bankChangeLSB"] = wasmExports2["xa"];
2674
+ _adl_rt_bankChangeMSB = Module["_adl_rt_bankChangeMSB"] = wasmExports2["ya"];
2675
+ _adl_rt_bankChange = Module["_adl_rt_bankChange"] = wasmExports2["za"];
2676
+ __emscripten_timeout = wasmExports2["Aa"];
2677
+ _malloc = Module["_malloc"] = wasmExports2["Ba"];
2678
+ _free = Module["_free"] = wasmExports2["Ca"];
2679
+ __emscripten_stack_restore = wasmExports2["Da"];
2680
+ __emscripten_stack_alloc = wasmExports2["Ea"];
2681
+ _emscripten_stack_get_current = wasmExports2["Fa"];
2662
2682
  memory = wasmMemory = wasmExports2["n"];
2663
2683
  __indirect_function_table = wasmExports2["__indirect_function_table"];
2664
2684
  }
@@ -3036,7 +3056,7 @@ var _AdlMidiProcessor = class _AdlMidiProcessor extends AudioWorkletProcessor {
3036
3056
  this.adl._adl_rt_noteOff(this.midi, msg.channel, msg.note);
3037
3057
  break;
3038
3058
  case "pitchBend":
3039
- this.adl._adl_rt_pitchBendML(this.midi, msg.channel, msg.lsb, msg.msb);
3059
+ this.adl._adl_rt_pitchBendML(this.midi, msg.channel, msg.msb, msg.lsb);
3040
3060
  break;
3041
3061
  case "controlChange":
3042
3062
  this.adl._adl_rt_controllerChange(this.midi, msg.channel, msg.controller, msg.value);
@@ -3044,6 +3064,21 @@ var _AdlMidiProcessor = class _AdlMidiProcessor extends AudioWorkletProcessor {
3044
3064
  case "programChange":
3045
3065
  this.adl._adl_rt_patchChange(this.midi, msg.channel, msg.program);
3046
3066
  break;
3067
+ case "noteAfterTouch":
3068
+ this.adl._adl_rt_noteAfterTouch(this.midi, msg.channel, msg.note, msg.pressure);
3069
+ break;
3070
+ case "channelAfterTouch":
3071
+ this.adl._adl_rt_channelAfterTouch(this.midi, msg.channel, msg.pressure);
3072
+ break;
3073
+ case "bankChange":
3074
+ this.adl._adl_rt_bankChange(this.midi, msg.channel, msg.bank);
3075
+ break;
3076
+ case "bankChangeMSB":
3077
+ this.adl._adl_rt_bankChangeMSB(this.midi, msg.channel, msg.msb);
3078
+ break;
3079
+ case "bankChangeLSB":
3080
+ this.adl._adl_rt_bankChangeLSB(this.midi, msg.channel, msg.lsb);
3081
+ break;
3047
3082
  case "resetState":
3048
3083
  this.adl._adl_rt_resetState(this.midi);
3049
3084
  break;
@@ -3076,6 +3111,30 @@ var _AdlMidiProcessor = class _AdlMidiProcessor extends AudioWorkletProcessor {
3076
3111
  case "setNumChips":
3077
3112
  this.adl._adl_setNumChips(this.midi, msg.chips);
3078
3113
  break;
3114
+ case "setNumFourOpChannels":
3115
+ this.adl._adl_setNumFourOpsChn(this.midi, msg.channels);
3116
+ break;
3117
+ case "getNumFourOpChannels":
3118
+ this.port.postMessage({ type: "numFourOpChannels", channels: this.adl._adl_getNumFourOpsChn(this.midi) });
3119
+ break;
3120
+ case "setScaleModulators":
3121
+ this.adl._adl_setScaleModulators(this.midi, msg.enabled ? 1 : 0);
3122
+ break;
3123
+ case "setFullRangeBrightness":
3124
+ this.adl._adl_setFullRangeBrightness(this.midi, msg.enabled ? 1 : 0);
3125
+ break;
3126
+ case "setAutoArpeggio":
3127
+ this.adl._adl_setAutoArpeggio(this.midi, msg.enabled ? 1 : 0);
3128
+ break;
3129
+ case "getAutoArpeggio":
3130
+ this.port.postMessage({ type: "autoArpeggio", enabled: this.adl._adl_getAutoArpeggio(this.midi) !== 0 });
3131
+ break;
3132
+ case "setChannelAllocMode":
3133
+ this.adl._adl_setChannelAllocMode(this.midi, msg.mode);
3134
+ break;
3135
+ case "getChannelAllocMode":
3136
+ this.port.postMessage({ type: "channelAllocMode", mode: this.adl._adl_getChannelAllocMode(this.midi) });
3137
+ break;
3079
3138
  case "setVolumeModel":
3080
3139
  this.adl._adl_setVolumeRangeModel(this.midi, msg.model);
3081
3140
  break;
@@ -3088,6 +3147,9 @@ var _AdlMidiProcessor = class _AdlMidiProcessor extends AudioWorkletProcessor {
3088
3147
  case "setTremolo":
3089
3148
  this.adl._adl_setHTremolo(this.midi, msg.enabled ? 1 : 0);
3090
3149
  break;
3150
+ case "setRunAtPcmRate":
3151
+ this.adl._adl_setRunAtPcmRate(this.midi, msg.enabled ? 1 : 0);
3152
+ break;
3091
3153
  case "switchEmulator": {
3092
3154
  const result = this.adl._adl_switchEmulator(this.midi, msg.emulator);
3093
3155
  this.port.postMessage({ type: "emulatorSwitched", success: result === 0, emulator: msg.emulator });
@@ -3099,6 +3161,31 @@ var _AdlMidiProcessor = class _AdlMidiProcessor extends AudioWorkletProcessor {
3099
3161
  this.port.postMessage({ type: "emulatorName", name });
3100
3162
  break;
3101
3163
  }
3164
+ case "getLibraryVersion": {
3165
+ const ptr = this.adl._adl_linkedLibraryVersion();
3166
+ const version = ptr ? this.adl.UTF8ToString(ptr) : "Unknown";
3167
+ this.port.postMessage({ type: "libraryVersion", version });
3168
+ break;
3169
+ }
3170
+ case "getVersion": {
3171
+ const ptr = this.adl._adl_linkedVersion();
3172
+ const version = ptr ? {
3173
+ major: this.adl.getValue(ptr, "i16"),
3174
+ minor: this.adl.getValue(ptr + 2, "i16"),
3175
+ patch: this.adl.getValue(ptr + 4, "i16")
3176
+ } : null;
3177
+ this.port.postMessage({ type: "version", version });
3178
+ break;
3179
+ }
3180
+ case "getNumChips":
3181
+ this.port.postMessage({ type: "numChips", chips: this.adl._adl_getNumChips(this.midi) });
3182
+ break;
3183
+ case "getNumChipsObtained":
3184
+ this.port.postMessage({ type: "numChipsObtained", chips: this.adl._adl_getNumChipsObtained(this.midi) });
3185
+ break;
3186
+ case "getVolumeModel":
3187
+ this.port.postMessage({ type: "volumeModel", model: this.adl._adl_getVolumeRangeModel(this.midi) });
3188
+ break;
3102
3189
  case "getEmbeddedBanks": {
3103
3190
  const banks = this.getEmbeddedBankList();
3104
3191
  this.port.postMessage({ type: "embeddedBanks", banks });
@@ -3108,6 +3195,18 @@ var _AdlMidiProcessor = class _AdlMidiProcessor extends AudioWorkletProcessor {
3108
3195
  case "loadMidi":
3109
3196
  this.loadMidiData(msg.data);
3110
3197
  break;
3198
+ case "getMusicTitle": {
3199
+ const ptr = this.adl._adl_metaMusicTitle(this.midi);
3200
+ const title = ptr ? this.adl.UTF8ToString(ptr) : "";
3201
+ this.port.postMessage({ type: "musicTitle", title });
3202
+ break;
3203
+ }
3204
+ case "getMusicCopyright": {
3205
+ const ptr = this.adl._adl_metaMusicCopyright(this.midi);
3206
+ const copyright = ptr ? this.adl.UTF8ToString(ptr) : "";
3207
+ this.port.postMessage({ type: "musicCopyright", copyright });
3208
+ break;
3209
+ }
3111
3210
  case "play":
3112
3211
  if (this.adl._adl_atEnd(this.midi) !== 0) {
3113
3212
  this.adl._adl_positionRewind(this.midi);
@@ -30,7 +30,9 @@ var Emulator = Object.freeze({
30
30
  /** Nuked OPL2 LLE - Transistor-level emulation */
31
31
  NUKED_OPL2_LLE: 9,
32
32
  /** Nuked OPL3 LLE - Transistor-level emulation */
33
- NUKED_OPL3_LLE: 10
33
+ NUKED_OPL3_LLE: 10,
34
+ /** Nuked OPL2 Lite - Lightweight OPL2 emulation for AdLib-era music */
35
+ NUKED_OPL2_LITE: 11
34
36
  });
35
37
  var _ready, _messageHandlers, _AdlMidi_instances, handleMessage_fn, onceMessage_fn, send_fn;
36
38
  var AdlMidi = class {
@@ -75,13 +77,12 @@ var AdlMidi = class {
75
77
  if (this.ctx.state === "suspended") {
76
78
  await this.ctx.resume();
77
79
  }
78
- let wasmBinary = null;
79
80
  const effectiveWasmUrl = wasmUrl || processorUrl.replace(".processor.js", ".core.wasm");
80
81
  const response = await fetch(effectiveWasmUrl);
81
82
  if (!response.ok) {
82
83
  throw new Error(`Failed to fetch WASM: ${response.status}`);
83
84
  }
84
- wasmBinary = await response.arrayBuffer();
85
+ const wasmBinary = await response.arrayBuffer();
85
86
  await this.ctx.audioWorklet.addModule(processorUrl);
86
87
  this.node = new AudioWorkletNode(this.ctx, "adl-midi-processor", {
87
88
  processorOptions: {
@@ -156,6 +157,47 @@ var AdlMidi = class {
156
157
  programChange(channel, program) {
157
158
  __privateMethod(this, _AdlMidi_instances, send_fn).call(this, { type: "programChange", channel, program });
158
159
  }
160
+ /**
161
+ * Send note aftertouch
162
+ * @param {number} channel - MIDI channel (0-15)
163
+ * @param {number} note - Note number (0-127)
164
+ * @param {number} pressure - Pressure (0-127)
165
+ */
166
+ noteAfterTouch(channel, note, pressure) {
167
+ __privateMethod(this, _AdlMidi_instances, send_fn).call(this, { type: "noteAfterTouch", channel, note, pressure });
168
+ }
169
+ /**
170
+ * Send channel aftertouch
171
+ * @param {number} channel - MIDI channel (0-15)
172
+ * @param {number} pressure - Pressure (0-127)
173
+ */
174
+ channelAfterTouch(channel, pressure) {
175
+ __privateMethod(this, _AdlMidi_instances, send_fn).call(this, { type: "channelAfterTouch", channel, pressure });
176
+ }
177
+ /**
178
+ * Change bank (16-bit)
179
+ * @param {number} channel - MIDI channel (0-15)
180
+ * @param {number} bank - Bank number
181
+ */
182
+ bankChange(channel, bank) {
183
+ __privateMethod(this, _AdlMidi_instances, send_fn).call(this, { type: "bankChange", channel, bank });
184
+ }
185
+ /**
186
+ * Change bank MSB
187
+ * @param {number} channel - MIDI channel (0-15)
188
+ * @param {number} msb - Bank MSB (0-127)
189
+ */
190
+ bankChangeMSB(channel, msb) {
191
+ __privateMethod(this, _AdlMidi_instances, send_fn).call(this, { type: "bankChangeMSB", channel, msb });
192
+ }
193
+ /**
194
+ * Change bank LSB
195
+ * @param {number} channel - MIDI channel (0-15)
196
+ * @param {number} lsb - Bank LSB (0-127)
197
+ */
198
+ bankChangeLSB(channel, lsb) {
199
+ __privateMethod(this, _AdlMidi_instances, send_fn).call(this, { type: "bankChangeLSB", channel, lsb });
200
+ }
159
201
  /**
160
202
  * Reset the real-time state (stops all notes, resets controllers)
161
203
  * @returns {void}
@@ -279,6 +321,92 @@ var AdlMidi = class {
279
321
  setNumChips(chips) {
280
322
  __privateMethod(this, _AdlMidi_instances, send_fn).call(this, { type: "setNumChips", chips });
281
323
  }
324
+ /**
325
+ * Set the number of 4-operator channels
326
+ * @param {number} channels - Number of channels (-1 for auto)
327
+ */
328
+ setNumFourOpChannels(channels) {
329
+ __privateMethod(this, _AdlMidi_instances, send_fn).call(this, { type: "setNumFourOpChannels", channels });
330
+ }
331
+ /**
332
+ * Get the number of 4-operator channels
333
+ * @returns {Promise<number>}
334
+ */
335
+ async getNumFourOpChannels() {
336
+ return new Promise((resolve) => {
337
+ __privateMethod(this, _AdlMidi_instances, onceMessage_fn).call(
338
+ this,
339
+ "numFourOpChannels",
340
+ /** @param {{channels: number}} msg */
341
+ (msg) => {
342
+ resolve(msg.channels);
343
+ }
344
+ );
345
+ __privateMethod(this, _AdlMidi_instances, send_fn).call(this, { type: "getNumFourOpChannels" });
346
+ });
347
+ }
348
+ /**
349
+ * Enable/disable scaling of modulators by volume
350
+ * @param {boolean} enabled
351
+ */
352
+ setScaleModulators(enabled) {
353
+ __privateMethod(this, _AdlMidi_instances, send_fn).call(this, { type: "setScaleModulators", enabled });
354
+ }
355
+ /**
356
+ * Enable/disable full-range brightness
357
+ * @param {boolean} enabled
358
+ */
359
+ setFullRangeBrightness(enabled) {
360
+ __privateMethod(this, _AdlMidi_instances, send_fn).call(this, { type: "setFullRangeBrightness", enabled });
361
+ }
362
+ /**
363
+ * Enable/disable automatic arpeggio
364
+ * @param {boolean} enabled
365
+ */
366
+ setAutoArpeggio(enabled) {
367
+ __privateMethod(this, _AdlMidi_instances, send_fn).call(this, { type: "setAutoArpeggio", enabled });
368
+ }
369
+ /**
370
+ * Get automatic arpeggio state
371
+ * @returns {Promise<boolean>}
372
+ */
373
+ async getAutoArpeggio() {
374
+ return new Promise((resolve) => {
375
+ __privateMethod(this, _AdlMidi_instances, onceMessage_fn).call(
376
+ this,
377
+ "autoArpeggio",
378
+ /** @param {{enabled: boolean}} msg */
379
+ (msg) => {
380
+ resolve(msg.enabled);
381
+ }
382
+ );
383
+ __privateMethod(this, _AdlMidi_instances, send_fn).call(this, { type: "getAutoArpeggio" });
384
+ });
385
+ }
386
+ /**
387
+ * Set channel allocation mode
388
+ * @param {number} mode - Mode ID
389
+ */
390
+ setChannelAllocMode(mode) {
391
+ __privateMethod(this, _AdlMidi_instances, send_fn).call(this, { type: "setChannelAllocMode", mode });
392
+ }
393
+ /**
394
+ * Get channel allocation mode
395
+ * @returns {Promise<number>}
396
+ */
397
+ async getChannelAllocMode() {
398
+ return new Promise((resolve) => {
399
+ __privateMethod(this, _AdlMidi_instances, onceMessage_fn).call(
400
+ this,
401
+ "channelAllocMode",
402
+ /** @param {{mode: number}} msg */
403
+ (msg) => {
404
+ resolve(msg.mode);
405
+ }
406
+ );
407
+ __privateMethod(this, _AdlMidi_instances, send_fn).call(this, { type: "getChannelAllocMode" });
408
+ });
409
+ }
282
410
  /**
283
411
  * Set the volume model
284
412
  * @param {number} model - Volume model number
@@ -307,6 +435,13 @@ var AdlMidi = class {
307
435
  setTremolo(enabled) {
308
436
  __privateMethod(this, _AdlMidi_instances, send_fn).call(this, { type: "setTremolo", enabled });
309
437
  }
438
+ /**
439
+ * Run emulator with PCM rate to reduce CPU usage
440
+ * @param {boolean} enabled
441
+ */
442
+ setRunAtPcmRate(enabled) {
443
+ __privateMethod(this, _AdlMidi_instances, send_fn).call(this, { type: "setRunAtPcmRate", enabled });
444
+ }
310
445
  /**
311
446
  * Switch the OPL3 emulator core at runtime
312
447
  *
@@ -359,6 +494,91 @@ var AdlMidi = class {
359
494
  __privateMethod(this, _AdlMidi_instances, send_fn).call(this, { type: "getEmulatorName" });
360
495
  });
361
496
  }
497
+ /**
498
+ * Get the version string of the linked libADLMIDI library
499
+ * @returns {Promise<string>}
500
+ */
501
+ async getLibraryVersion() {
502
+ return new Promise((resolve) => {
503
+ __privateMethod(this, _AdlMidi_instances, onceMessage_fn).call(
504
+ this,
505
+ "libraryVersion",
506
+ /** @param {{version: string}} msg */
507
+ (msg) => {
508
+ resolve(msg.version);
509
+ }
510
+ );
511
+ __privateMethod(this, _AdlMidi_instances, send_fn).call(this, { type: "getLibraryVersion" });
512
+ });
513
+ }
514
+ /**
515
+ * Get the version of the linked libADLMIDI library as an object
516
+ * @returns {Promise<{major: number, minor: number, patch: number}>}
517
+ */
518
+ async getVersion() {
519
+ return new Promise((resolve) => {
520
+ __privateMethod(this, _AdlMidi_instances, onceMessage_fn).call(
521
+ this,
522
+ "version",
523
+ /** @param {{version: {major: number, minor: number, patch: number}}} msg */
524
+ (msg) => {
525
+ resolve(msg.version);
526
+ }
527
+ );
528
+ __privateMethod(this, _AdlMidi_instances, send_fn).call(this, { type: "getVersion" });
529
+ });
530
+ }
531
+ /**
532
+ * Get the number of emulated chips
533
+ * @returns {Promise<number>}
534
+ */
535
+ async getNumChips() {
536
+ return new Promise((resolve) => {
537
+ __privateMethod(this, _AdlMidi_instances, onceMessage_fn).call(
538
+ this,
539
+ "numChips",
540
+ /** @param {{chips: number}} msg */
541
+ (msg) => {
542
+ resolve(msg.chips);
543
+ }
544
+ );
545
+ __privateMethod(this, _AdlMidi_instances, send_fn).call(this, { type: "getNumChips" });
546
+ });
547
+ }
548
+ /**
549
+ * Get the number of emulated chips obtained
550
+ * @returns {Promise<number>}
551
+ */
552
+ async getNumChipsObtained() {
553
+ return new Promise((resolve) => {
554
+ __privateMethod(this, _AdlMidi_instances, onceMessage_fn).call(
555
+ this,
556
+ "numChipsObtained",
557
+ /** @param {{chips: number}} msg */
558
+ (msg) => {
559
+ resolve(msg.chips);
560
+ }
561
+ );
562
+ __privateMethod(this, _AdlMidi_instances, send_fn).call(this, { type: "getNumChipsObtained" });
563
+ });
564
+ }
565
+ /**
566
+ * Get the volume range model
567
+ * @returns {Promise<number>}
568
+ */
569
+ async getVolumeModel() {
570
+ return new Promise((resolve) => {
571
+ __privateMethod(this, _AdlMidi_instances, onceMessage_fn).call(
572
+ this,
573
+ "volumeModel",
574
+ /** @param {{model: number}} msg */
575
+ (msg) => {
576
+ resolve(msg.model);
577
+ }
578
+ );
579
+ __privateMethod(this, _AdlMidi_instances, send_fn).call(this, { type: "getVolumeModel" });
580
+ });
581
+ }
362
582
  /**
363
583
  * Get list of embedded banks available in this build
364
584
  * Note: Slim builds have no embedded banks and will return an empty array
@@ -403,13 +623,47 @@ var AdlMidi = class {
403
623
  if (msg.success) {
404
624
  resolve({ duration: msg.duration });
405
625
  } else {
406
- reject(new Error(msg.error || "Failed to load MIDI data"));
626
+ reject(new Error(msg.error || "Failed to parse MIDI data"));
407
627
  }
408
628
  }
409
629
  );
410
630
  __privateMethod(this, _AdlMidi_instances, send_fn).call(this, { type: "loadMidi", data: arrayBuffer });
411
631
  });
412
632
  }
633
+ /**
634
+ * Get the music title of the loaded MIDI file
635
+ * @returns {Promise<string>}
636
+ */
637
+ async getMusicTitle() {
638
+ return new Promise((resolve) => {
639
+ __privateMethod(this, _AdlMidi_instances, onceMessage_fn).call(
640
+ this,
641
+ "musicTitle",
642
+ /** @param {{title: string}} msg */
643
+ (msg) => {
644
+ resolve(msg.title);
645
+ }
646
+ );
647
+ __privateMethod(this, _AdlMidi_instances, send_fn).call(this, { type: "getMusicTitle" });
648
+ });
649
+ }
650
+ /**
651
+ * Get the copyright notice of the loaded MIDI file
652
+ * @returns {Promise<string>}
653
+ */
654
+ async getMusicCopyright() {
655
+ return new Promise((resolve) => {
656
+ __privateMethod(this, _AdlMidi_instances, onceMessage_fn).call(
657
+ this,
658
+ "musicCopyright",
659
+ /** @param {{copyright: string}} msg */
660
+ (msg) => {
661
+ resolve(msg.copyright);
662
+ }
663
+ );
664
+ __privateMethod(this, _AdlMidi_instances, send_fn).call(this, { type: "getMusicCopyright" });
665
+ });
666
+ }
413
667
  /**
414
668
  * Start or resume MIDI file playback
415
669
  * @returns {void}