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.
- package/README.md +36 -1
- package/dist/core.d.ts +148 -0
- package/dist/fm_banks/manifest.json +1 -1
- package/dist/libadlmidi.d.ts +119 -2
- package/dist/libadlmidi.dosbox.browser.js +1 -1
- package/dist/libadlmidi.dosbox.browser.wasm +0 -0
- package/dist/libadlmidi.dosbox.core.js +1 -1
- package/dist/libadlmidi.dosbox.core.wasm +0 -0
- package/dist/libadlmidi.dosbox.js +0 -0
- package/dist/libadlmidi.dosbox.processor.js +152 -53
- package/dist/libadlmidi.dosbox.slim.browser.js +1 -1
- package/dist/libadlmidi.dosbox.slim.browser.wasm +0 -0
- package/dist/libadlmidi.dosbox.slim.core.js +1 -1
- package/dist/libadlmidi.dosbox.slim.core.wasm +0 -0
- package/dist/libadlmidi.dosbox.slim.js +0 -0
- package/dist/libadlmidi.dosbox.slim.processor.js +152 -53
- package/dist/libadlmidi.full.browser.js +1 -1
- package/dist/libadlmidi.full.browser.wasm +0 -0
- package/dist/libadlmidi.full.core.js +1 -1
- package/dist/libadlmidi.full.core.wasm +0 -0
- package/dist/libadlmidi.full.js +0 -0
- package/dist/libadlmidi.full.processor.js +152 -53
- package/dist/libadlmidi.full.slim.browser.js +1 -1
- package/dist/libadlmidi.full.slim.browser.wasm +0 -0
- package/dist/libadlmidi.full.slim.core.js +1 -1
- package/dist/libadlmidi.full.slim.core.wasm +0 -0
- package/dist/libadlmidi.full.slim.js +0 -0
- package/dist/libadlmidi.full.slim.processor.js +152 -53
- package/dist/libadlmidi.js +258 -4
- package/dist/libadlmidi.js.map +2 -2
- package/dist/libadlmidi.light.browser.js +1 -1
- package/dist/libadlmidi.light.browser.wasm +0 -0
- package/dist/libadlmidi.light.core.js +1 -1
- package/dist/libadlmidi.light.core.wasm +0 -0
- package/dist/libadlmidi.light.js +0 -0
- package/dist/libadlmidi.light.processor.js +152 -53
- package/dist/libadlmidi.light.slim.browser.js +1 -1
- package/dist/libadlmidi.light.slim.browser.wasm +0 -0
- package/dist/libadlmidi.light.slim.core.js +1 -1
- package/dist/libadlmidi.light.slim.core.wasm +0 -0
- package/dist/libadlmidi.light.slim.js +0 -0
- package/dist/libadlmidi.light.slim.processor.js +152 -53
- package/dist/libadlmidi.nuked.browser.js +1 -1
- package/dist/libadlmidi.nuked.browser.wasm +0 -0
- package/dist/libadlmidi.nuked.core.js +1 -1
- package/dist/libadlmidi.nuked.core.wasm +0 -0
- package/dist/libadlmidi.nuked.js +0 -0
- package/dist/libadlmidi.nuked.processor.js +152 -53
- package/dist/libadlmidi.nuked.slim.browser.js +1 -1
- package/dist/libadlmidi.nuked.slim.browser.wasm +0 -0
- package/dist/libadlmidi.nuked.slim.core.js +1 -1
- package/dist/libadlmidi.nuked.slim.core.wasm +0 -0
- package/dist/libadlmidi.nuked.slim.js +0 -0
- package/dist/libadlmidi.nuked.slim.processor.js +152 -53
- package/package.json +6 -5
- package/src/core.js +289 -24
- package/src/libadlmidi.js +229 -4
- 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
|
-
|
|
2614
|
-
|
|
2615
|
-
|
|
2616
|
-
|
|
2617
|
-
|
|
2618
|
-
|
|
2619
|
-
|
|
2620
|
-
|
|
2621
|
-
|
|
2622
|
-
|
|
2623
|
-
|
|
2624
|
-
|
|
2625
|
-
|
|
2626
|
-
|
|
2627
|
-
|
|
2628
|
-
|
|
2629
|
-
|
|
2630
|
-
|
|
2631
|
-
|
|
2632
|
-
|
|
2633
|
-
|
|
2634
|
-
|
|
2635
|
-
|
|
2636
|
-
|
|
2637
|
-
|
|
2638
|
-
|
|
2639
|
-
|
|
2640
|
-
|
|
2641
|
-
|
|
2642
|
-
|
|
2643
|
-
|
|
2644
|
-
|
|
2645
|
-
|
|
2646
|
-
|
|
2647
|
-
|
|
2648
|
-
|
|
2649
|
-
|
|
2650
|
-
|
|
2651
|
-
|
|
2652
|
-
|
|
2653
|
-
|
|
2654
|
-
|
|
2655
|
-
|
|
2656
|
-
|
|
2657
|
-
|
|
2658
|
-
|
|
2659
|
-
|
|
2660
|
-
|
|
2661
|
-
|
|
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.
|
|
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);
|
package/dist/libadlmidi.js
CHANGED
|
@@ -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
|
|
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}
|