libadlmidi-js 1.2.0 → 2.1.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 +8 -5
- package/dist/core.d.ts +191 -4
- package/dist/fm_banks/manifest.json +1 -1
- package/dist/libadlmidi.d.ts +146 -66
- 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 +247 -74
- 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 +247 -74
- 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 +247 -74
- 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 +247 -74
- package/dist/libadlmidi.js +473 -24
- package/dist/libadlmidi.js.map +3 -3
- 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 +247 -74
- 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 +247 -74
- 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 +247 -74
- 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 +247 -74
- package/dist/profiles/dosbox.d.ts +7 -2
- package/dist/profiles/dosbox.slim.d.ts +7 -2
- package/dist/profiles/full.d.ts +7 -2
- package/dist/profiles/full.slim.d.ts +7 -2
- package/dist/profiles/light.d.ts +7 -2
- package/dist/profiles/light.slim.d.ts +7 -2
- package/dist/profiles/nuked.d.ts +7 -2
- package/dist/profiles/nuked.slim.d.ts +7 -2
- package/dist/utils/constants.d.ts +61 -0
- package/package.json +30 -9
- package/src/core.js +361 -4
- package/src/libadlmidi.js +379 -58
- package/src/processor.js +210 -12
- package/src/profiles/dosbox.js +20 -10
- package/src/profiles/dosbox.slim.js +20 -10
- package/src/profiles/full.js +21 -11
- package/src/profiles/full.slim.js +21 -11
- package/src/profiles/light.js +21 -11
- package/src/profiles/light.slim.js +21 -11
- package/src/profiles/nuked.js +21 -11
- package/src/profiles/nuked.slim.js +21 -11
- package/src/utils/constants.js +53 -0
package/README.md
CHANGED
|
@@ -9,6 +9,7 @@ Check out some [examples](https://libadlmidi-js.github.io):
|
|
|
9
9
|
- [patch editor](https://libadlmidi-js.github.io/examples/patch-editor.html)
|
|
10
10
|
- [midi to wav](https://libadlmidi-js.github.io/examples/midi-to-audio.html)
|
|
11
11
|
- [connect any midi controller](https://libadlmidi-js.github.io/examples/webmidi.html)
|
|
12
|
+
- [tr-262 drum machine](https://libadlmidi-js.github.io/examples/tr-262.html)
|
|
12
13
|
|
|
13
14
|
## Features
|
|
14
15
|
|
|
@@ -49,7 +50,7 @@ You can load the library from a CDN to use it right away.
|
|
|
49
50
|
<script type="module">
|
|
50
51
|
import { AdlMidi } from 'https://unpkg.com/libadlmidi-js/src/profiles/light.js';
|
|
51
52
|
// or: https://cdn.jsdelivr.net/npm/libadlmidi-js/src/profiles/light.js
|
|
52
|
-
|
|
53
|
+
|
|
53
54
|
const synth = new AdlMidi();
|
|
54
55
|
await synth.init();
|
|
55
56
|
</script>
|
|
@@ -59,7 +60,7 @@ You can load the library from a CDN to use it right away.
|
|
|
59
60
|
```html
|
|
60
61
|
<script type="module">
|
|
61
62
|
import { AdlMidi } from 'https://esm.sh/libadlmidi-js/src/libadlmidi.js';
|
|
62
|
-
|
|
63
|
+
|
|
63
64
|
const synth = new AdlMidi();
|
|
64
65
|
await synth.init(
|
|
65
66
|
'https://esm.sh/libadlmidi-js/dist/libadlmidi.light.processor.js?raw',
|
|
@@ -138,10 +139,12 @@ const decoded = decodeInstrument(bytes);
|
|
|
138
139
|
|
|
139
140
|
| Profile | Emulator(s) | Usage |
|
|
140
141
|
|---------|-------------|-------|
|
|
141
|
-
| `nuked` | Nuked OPL3 v1.8 | Maximum accuracy
|
|
142
|
+
| `nuked` | Nuked OPL3 v1.8 + Nuked OPL3 Fast | Maximum accuracy. Defaults to Nuked Fast (bit-exact vs Nuked 1.8, faster). |
|
|
142
143
|
| `dosbox` | DosBox OPL3 | Great balance of speed and accuracy. |
|
|
143
|
-
| `light` | Nuked + DosBox | Flexible for varied performance needs. |
|
|
144
|
-
| `full` | All supported | Includes Opal, Java OPL3, ESFMu, etc. |
|
|
144
|
+
| `light` | Nuked + Nuked Fast, DosBox | Flexible for varied performance needs. Defaults to Nuked Fast. |
|
|
145
|
+
| `full` | All supported | Includes Opal, Java OPL3, ESFMu, etc. Defaults to Nuked Fast where available. |
|
|
146
|
+
|
|
147
|
+
To opt back to the original Nuked 1.8, pass `{ emulator: Emulator.NUKED }` as the third argument to `init()`, or call `await synth.switchEmulator(Emulator.NUKED)` after init.
|
|
145
148
|
|
|
146
149
|
## Documentation
|
|
147
150
|
|
package/dist/core.d.ts
CHANGED
|
@@ -30,11 +30,14 @@ export class AdlMidiCore {
|
|
|
30
30
|
* @param {Object} options
|
|
31
31
|
* @param {string} options.corePath - Path to the .core.js WASM loader module
|
|
32
32
|
* @param {ArrayBuffer} [options.wasmBinary] - Pre-loaded WASM binary (optional)
|
|
33
|
+
* @param {number} [options.defaultEmulator] - Emulator to switch to after init.
|
|
34
|
+
* Profile wrappers use this to default to NUKED_FAST.
|
|
33
35
|
* @returns {Promise<AdlMidiCore>}
|
|
34
36
|
*/
|
|
35
37
|
static create(options: {
|
|
36
38
|
corePath: string;
|
|
37
39
|
wasmBinary?: ArrayBuffer | undefined;
|
|
40
|
+
defaultEmulator?: number | undefined;
|
|
38
41
|
}): Promise<AdlMidiCore>;
|
|
39
42
|
/** @private @type {any} */
|
|
40
43
|
private _module;
|
|
@@ -46,6 +49,8 @@ export class AdlMidiCore {
|
|
|
46
49
|
private _audioBuffer;
|
|
47
50
|
/** @private @type {number|null} */
|
|
48
51
|
private _audioBufferPtr;
|
|
52
|
+
/** @private @type {number|undefined} */
|
|
53
|
+
private _defaultEmulator;
|
|
49
54
|
/**
|
|
50
55
|
* Initialize the synthesizer.
|
|
51
56
|
*
|
|
@@ -118,6 +123,12 @@ export class AdlMidiCore {
|
|
|
118
123
|
* @returns {number} Count of channels
|
|
119
124
|
*/
|
|
120
125
|
getNumFourOpChannels(): number;
|
|
126
|
+
/**
|
|
127
|
+
* Get the number of 4-operator channels obtained.
|
|
128
|
+
*
|
|
129
|
+
* @returns {number} Count of channels obtained
|
|
130
|
+
*/
|
|
131
|
+
getNumFourOpChannelsObtained(): number;
|
|
121
132
|
/**
|
|
122
133
|
* Enable/disable scaling of modulators by volume.
|
|
123
134
|
*
|
|
@@ -159,19 +170,31 @@ export class AdlMidiCore {
|
|
|
159
170
|
*
|
|
160
171
|
* @param {boolean} enabled
|
|
161
172
|
*/
|
|
162
|
-
|
|
173
|
+
setSoftPanEnabled(enabled: boolean): void;
|
|
163
174
|
/**
|
|
164
175
|
* Enable/disable deep vibrato.
|
|
165
176
|
*
|
|
166
177
|
* @param {boolean} enabled
|
|
167
178
|
*/
|
|
168
179
|
setDeepVibrato(enabled: boolean): void;
|
|
180
|
+
/**
|
|
181
|
+
* Get deep vibrato state.
|
|
182
|
+
*
|
|
183
|
+
* @returns {boolean}
|
|
184
|
+
*/
|
|
185
|
+
getDeepVibrato(): boolean;
|
|
169
186
|
/**
|
|
170
187
|
* Enable/disable deep tremolo.
|
|
171
188
|
*
|
|
172
189
|
* @param {boolean} enabled
|
|
173
190
|
*/
|
|
174
191
|
setDeepTremolo(enabled: boolean): void;
|
|
192
|
+
/**
|
|
193
|
+
* Get deep tremolo state.
|
|
194
|
+
*
|
|
195
|
+
* @returns {boolean}
|
|
196
|
+
*/
|
|
197
|
+
getDeepTremolo(): boolean;
|
|
175
198
|
/**
|
|
176
199
|
* Switch OPL3 emulator (if multiple are compiled in).
|
|
177
200
|
*
|
|
@@ -185,6 +208,18 @@ export class AdlMidiCore {
|
|
|
185
208
|
* @returns {string} Emulator name
|
|
186
209
|
*/
|
|
187
210
|
getEmulatorName(): string;
|
|
211
|
+
/**
|
|
212
|
+
* Get the last global error string (static, no player needed).
|
|
213
|
+
*
|
|
214
|
+
* @returns {string} Error string or empty string
|
|
215
|
+
*/
|
|
216
|
+
getErrorString(): string;
|
|
217
|
+
/**
|
|
218
|
+
* Get the last error info for this player instance.
|
|
219
|
+
*
|
|
220
|
+
* @returns {string} Error info string or empty string
|
|
221
|
+
*/
|
|
222
|
+
getErrorInfo(): string;
|
|
188
223
|
/**
|
|
189
224
|
* Get the version string of the linked libADLMIDI library.
|
|
190
225
|
*
|
|
@@ -218,13 +253,13 @@ export class AdlMidiCore {
|
|
|
218
253
|
*
|
|
219
254
|
* @returns {number}
|
|
220
255
|
*/
|
|
221
|
-
|
|
256
|
+
getVolumeRangeModel(): number;
|
|
222
257
|
/**
|
|
223
258
|
* Set the volume range model.
|
|
224
259
|
*
|
|
225
260
|
* @param {number} model - Volume model type
|
|
226
261
|
*/
|
|
227
|
-
|
|
262
|
+
setVolumeRangeModel(model: number): void;
|
|
228
263
|
/**
|
|
229
264
|
* Run emulator with PCM rate to reduce CPU usage.
|
|
230
265
|
*
|
|
@@ -331,6 +366,25 @@ export class AdlMidiCore {
|
|
|
331
366
|
* @returns {string} Copyright or empty string
|
|
332
367
|
*/
|
|
333
368
|
getMusicCopyright(): string;
|
|
369
|
+
/**
|
|
370
|
+
* Get the number of track titles in the loaded MIDI file.
|
|
371
|
+
*
|
|
372
|
+
* @returns {number} Number of track titles
|
|
373
|
+
*/
|
|
374
|
+
getTrackTitleCount(): number;
|
|
375
|
+
/**
|
|
376
|
+
* Get a track title by index.
|
|
377
|
+
*
|
|
378
|
+
* @param {number} index - Track title index
|
|
379
|
+
* @returns {string} Track title or empty string
|
|
380
|
+
*/
|
|
381
|
+
getTrackTitle(index: number): string;
|
|
382
|
+
/**
|
|
383
|
+
* Get the number of MIDI markers in the loaded file.
|
|
384
|
+
*
|
|
385
|
+
* @returns {number} Number of markers
|
|
386
|
+
*/
|
|
387
|
+
getMarkerCount(): number;
|
|
334
388
|
/**
|
|
335
389
|
* Play MIDI file and generate audio.
|
|
336
390
|
*
|
|
@@ -371,13 +425,127 @@ export class AdlMidiCore {
|
|
|
371
425
|
*
|
|
372
426
|
* @param {boolean} enabled
|
|
373
427
|
*/
|
|
374
|
-
|
|
428
|
+
setLoopEnabled(enabled: boolean): void;
|
|
429
|
+
/**
|
|
430
|
+
* Set the number of loop repetitions.
|
|
431
|
+
*
|
|
432
|
+
* @param {number} count - Loop count (-1 = infinite, 0 = no loops, 1+ = number of loops)
|
|
433
|
+
*/
|
|
434
|
+
setLoopCount(count: number): void;
|
|
435
|
+
/**
|
|
436
|
+
* Enable/disable loop hooks only mode.
|
|
437
|
+
*
|
|
438
|
+
* @param {boolean} enabled
|
|
439
|
+
*/
|
|
440
|
+
setLoopHooksOnly(enabled: boolean): void;
|
|
441
|
+
/**
|
|
442
|
+
* Get the loop start time in seconds.
|
|
443
|
+
*
|
|
444
|
+
* @returns {number} Loop start time in seconds
|
|
445
|
+
*/
|
|
446
|
+
getLoopStartTime(): number;
|
|
447
|
+
/**
|
|
448
|
+
* Get the loop end time in seconds.
|
|
449
|
+
*
|
|
450
|
+
* @returns {number} Loop end time in seconds
|
|
451
|
+
*/
|
|
452
|
+
getLoopEndTime(): number;
|
|
453
|
+
/**
|
|
454
|
+
* Select a song number for multi-song MIDI files.
|
|
455
|
+
*
|
|
456
|
+
* @param {number} num - Song number (0-based)
|
|
457
|
+
*/
|
|
458
|
+
selectSongNum(num: number): void;
|
|
459
|
+
/**
|
|
460
|
+
* Get the number of songs in the loaded MIDI file.
|
|
461
|
+
*
|
|
462
|
+
* @returns {number} Number of songs
|
|
463
|
+
*/
|
|
464
|
+
getSongsCount(): number;
|
|
465
|
+
/**
|
|
466
|
+
* Get the number of tracks in the loaded MIDI file.
|
|
467
|
+
*
|
|
468
|
+
* @returns {number} Number of tracks
|
|
469
|
+
*/
|
|
470
|
+
getTrackCount(): number;
|
|
471
|
+
/**
|
|
472
|
+
* Set track options (enable, mute, or solo).
|
|
473
|
+
* Use the TrackOption enum: TrackOption.ON (1), TrackOption.OFF (2), TrackOption.SOLO (3).
|
|
474
|
+
* Note: Passing 0 is a silent no-op that returns true without changing state.
|
|
475
|
+
*
|
|
476
|
+
* @param {number} track - Track index
|
|
477
|
+
* @param {number} options - Track option from TrackOption enum
|
|
478
|
+
* @returns {boolean} True if successful
|
|
479
|
+
*/
|
|
480
|
+
setTrackOptions(track: number, options: number): boolean;
|
|
481
|
+
/**
|
|
482
|
+
* Enable or disable a MIDI channel.
|
|
483
|
+
*
|
|
484
|
+
* @param {number} channel - MIDI channel (0-15)
|
|
485
|
+
* @param {boolean} enabled - Whether to enable the channel
|
|
486
|
+
* @returns {boolean} True if successful
|
|
487
|
+
*/
|
|
488
|
+
setChannelEnabled(channel: number, enabled: boolean): boolean;
|
|
375
489
|
/**
|
|
376
490
|
* Set playback tempo multiplier.
|
|
377
491
|
*
|
|
378
492
|
* @param {number} tempo - Tempo multiplier (1.0 = normal)
|
|
379
493
|
*/
|
|
380
494
|
setTempo(tempo: number): void;
|
|
495
|
+
/**
|
|
496
|
+
* Reserve a number of banks.
|
|
497
|
+
*
|
|
498
|
+
* @param {number} count - Number of banks to reserve
|
|
499
|
+
* @returns {boolean} True if successful
|
|
500
|
+
*/
|
|
501
|
+
reserveBanks(count: number): boolean;
|
|
502
|
+
/**
|
|
503
|
+
* Get the bank ID for a given bank identifier.
|
|
504
|
+
*
|
|
505
|
+
* @param {Object} bankId - Bank identifier
|
|
506
|
+
* @param {boolean|number} bankId.percussive - True/1 for percussion, false/0 for melodic
|
|
507
|
+
* @param {number} bankId.msb - Bank MSB
|
|
508
|
+
* @param {number} bankId.lsb - Bank LSB
|
|
509
|
+
* @returns {{percussive: number, msb: number, lsb: number}|null} Bank ID or null if not found
|
|
510
|
+
*/
|
|
511
|
+
getBankId(bankId: {
|
|
512
|
+
percussive: boolean | number;
|
|
513
|
+
msb: number;
|
|
514
|
+
lsb: number;
|
|
515
|
+
}): {
|
|
516
|
+
percussive: number;
|
|
517
|
+
msb: number;
|
|
518
|
+
lsb: number;
|
|
519
|
+
} | null;
|
|
520
|
+
/**
|
|
521
|
+
* Remove a bank by its identifier.
|
|
522
|
+
*
|
|
523
|
+
* @param {Object} bankId - Bank identifier
|
|
524
|
+
* @param {boolean|number} bankId.percussive - True/1 for percussion, false/0 for melodic
|
|
525
|
+
* @param {number} bankId.msb - Bank MSB
|
|
526
|
+
* @param {number} bankId.lsb - Bank LSB
|
|
527
|
+
* @returns {boolean} True if successfully removed
|
|
528
|
+
*/
|
|
529
|
+
removeBank(bankId: {
|
|
530
|
+
percussive: boolean | number;
|
|
531
|
+
msb: number;
|
|
532
|
+
lsb: number;
|
|
533
|
+
}): boolean;
|
|
534
|
+
/**
|
|
535
|
+
* Load an embedded bank into a custom bank slot.
|
|
536
|
+
*
|
|
537
|
+
* @param {Object} bankId - Target bank identifier
|
|
538
|
+
* @param {boolean|number} bankId.percussive - True/1 for percussion, false/0 for melodic
|
|
539
|
+
* @param {number} bankId.msb - Bank MSB
|
|
540
|
+
* @param {number} bankId.lsb - Bank LSB
|
|
541
|
+
* @param {number} num - Embedded bank number to load
|
|
542
|
+
* @returns {boolean} True if successful
|
|
543
|
+
*/
|
|
544
|
+
loadEmbeddedBank(bankId: {
|
|
545
|
+
percussive: boolean | number;
|
|
546
|
+
msb: number;
|
|
547
|
+
lsb: number;
|
|
548
|
+
}, num: number): boolean;
|
|
381
549
|
/**
|
|
382
550
|
* Get an instrument from a bank.
|
|
383
551
|
*
|
|
@@ -409,6 +577,22 @@ export class AdlMidiCore {
|
|
|
409
577
|
msb: number;
|
|
410
578
|
lsb: number;
|
|
411
579
|
}, program: number, instrument: import("./utils/struct.js").Instrument): boolean;
|
|
580
|
+
/**
|
|
581
|
+
* Send a System Exclusive (SysEx) message.
|
|
582
|
+
*
|
|
583
|
+
* @param {Uint8Array|ArrayBuffer} data - SysEx message data
|
|
584
|
+
* @returns {boolean} True if successful
|
|
585
|
+
*/
|
|
586
|
+
systemExclusive(data: Uint8Array | ArrayBuffer): boolean;
|
|
587
|
+
/**
|
|
588
|
+
* Describe the current state of all channels (debug utility).
|
|
589
|
+
*
|
|
590
|
+
* @returns {{text: string, attr: Uint8Array}} Channel state text and raw per-channel attribute bytes
|
|
591
|
+
*/
|
|
592
|
+
describeChannels(): {
|
|
593
|
+
text: string;
|
|
594
|
+
attr: Uint8Array;
|
|
595
|
+
};
|
|
412
596
|
/**
|
|
413
597
|
* Get the raw Emscripten module for advanced usage.
|
|
414
598
|
*
|
|
@@ -431,3 +615,6 @@ export class AdlMidiCore {
|
|
|
431
615
|
private _ensurePlayer;
|
|
432
616
|
}
|
|
433
617
|
export default AdlMidiCore;
|
|
618
|
+
import { Emulator } from './utils/constants.js';
|
|
619
|
+
import { TrackOption } from './utils/constants.js';
|
|
620
|
+
export { Emulator, TrackOption };
|
package/dist/libadlmidi.d.ts
CHANGED
|
@@ -1,25 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Available OPL2/OPL3 emulator cores.
|
|
3
|
-
* Use with switchEmulator() to change the synthesis engine at runtime.
|
|
4
|
-
* Note: Only emulators compiled into the current profile are available.
|
|
5
|
-
*/
|
|
6
|
-
export type Emulator = number;
|
|
7
|
-
/**
|
|
8
|
-
* libADLMIDI-JS - Main Thread Interface
|
|
9
|
-
*
|
|
10
|
-
* High-level API for real-time OPL3 FM synthesis in the browser.
|
|
11
|
-
*
|
|
12
|
-
* @example
|
|
13
|
-
* ```javascript
|
|
14
|
-
* import { AdlMidi } from 'libadlmidi-js';
|
|
15
|
-
*
|
|
16
|
-
* const synth = new AdlMidi();
|
|
17
|
-
* await synth.init('/path/to/processor.js');
|
|
18
|
-
*
|
|
19
|
-
* synth.noteOn(0, 60, 100); // Middle C on channel 0
|
|
20
|
-
* synth.noteOff(0, 60);
|
|
21
|
-
* ```
|
|
22
|
-
*/
|
|
23
1
|
/**
|
|
24
2
|
* Bank identifier for instrument access
|
|
25
3
|
* @typedef {Object} BankId
|
|
@@ -74,39 +52,6 @@ export type Emulator = number;
|
|
|
74
52
|
* @property {boolean} [deepVibrato] - Enable deep vibrato
|
|
75
53
|
* @property {boolean} [deepTremolo] - Enable deep tremolo
|
|
76
54
|
*/
|
|
77
|
-
/**
|
|
78
|
-
* Available OPL2/OPL3 emulator cores.
|
|
79
|
-
* Use with switchEmulator() to change the synthesis engine at runtime.
|
|
80
|
-
* Note: Only emulators compiled into the current profile are available.
|
|
81
|
-
* @readonly
|
|
82
|
-
* @enum {number}
|
|
83
|
-
*/
|
|
84
|
-
export const Emulator: Readonly<{
|
|
85
|
-
/** Nuked OPL3 v1.8 - Most accurate, higher CPU usage */
|
|
86
|
-
NUKED: 0;
|
|
87
|
-
/** Nuked OPL3 v1.7.4 - Slightly older version */
|
|
88
|
-
NUKED_174: 1;
|
|
89
|
-
/** DosBox OPL3 - Good accuracy, lower CPU usage */
|
|
90
|
-
DOSBOX: 2;
|
|
91
|
-
/** Opal - Reality Adlib Tracker emulator */
|
|
92
|
-
OPAL: 3;
|
|
93
|
-
/** Java OPL3 - Port of emu8950 */
|
|
94
|
-
JAVA: 4;
|
|
95
|
-
/** ESFMu - ESFM chip emulator */
|
|
96
|
-
ESFMU: 5;
|
|
97
|
-
/** MAME OPL2 */
|
|
98
|
-
MAME_OPL2: 6;
|
|
99
|
-
/** YMFM OPL2 */
|
|
100
|
-
YMFM_OPL2: 7;
|
|
101
|
-
/** YMFM OPL3 */
|
|
102
|
-
YMFM_OPL3: 8;
|
|
103
|
-
/** Nuked OPL2 LLE - Transistor-level emulation */
|
|
104
|
-
NUKED_OPL2_LLE: 9;
|
|
105
|
-
/** Nuked OPL3 LLE - Transistor-level emulation */
|
|
106
|
-
NUKED_OPL3_LLE: 10;
|
|
107
|
-
/** Nuked OPL2 Lite - Lightweight OPL2 emulation for AdLib-era music */
|
|
108
|
-
NUKED_OPL2_LITE: 11;
|
|
109
|
-
}>;
|
|
110
55
|
export class AdlMidi {
|
|
111
56
|
/**
|
|
112
57
|
* Create a new AdlMidi instance
|
|
@@ -130,9 +75,11 @@ export class AdlMidi {
|
|
|
130
75
|
* @param {string} processorUrl - URL to the bundled processor JavaScript file
|
|
131
76
|
* @param {string | null} [wasmUrl=null] - Optional URL to the .wasm file for split builds.
|
|
132
77
|
* If not provided, assumes bundled version with embedded WASM.
|
|
78
|
+
* @param {object} [defaultSettings={}] - Initial synth settings applied before ready.
|
|
79
|
+
* Profile wrappers use this to set a default emulator.
|
|
133
80
|
* @returns {Promise<void>}
|
|
134
81
|
*/
|
|
135
|
-
init(processorUrl: string, wasmUrl?: string | null): Promise<void>;
|
|
82
|
+
init(processorUrl: string, wasmUrl?: string | null, defaultSettings?: object): Promise<void>;
|
|
136
83
|
/**
|
|
137
84
|
* Play a note
|
|
138
85
|
* @param {number} channel - MIDI channel (0-15)
|
|
@@ -217,7 +164,7 @@ export class AdlMidi {
|
|
|
217
164
|
* @param {ArrayBuffer} arrayBuffer - Bank file data
|
|
218
165
|
* @returns {Promise<void>}
|
|
219
166
|
*/
|
|
220
|
-
|
|
167
|
+
loadBankData(arrayBuffer: ArrayBuffer): Promise<void>;
|
|
221
168
|
/**
|
|
222
169
|
* Set the embedded bank by number
|
|
223
170
|
* @param {number} bank - Bank number
|
|
@@ -254,6 +201,11 @@ export class AdlMidi {
|
|
|
254
201
|
* @returns {Promise<number>}
|
|
255
202
|
*/
|
|
256
203
|
getNumFourOpChannels(): Promise<number>;
|
|
204
|
+
/**
|
|
205
|
+
* Get the number of 4-operator channels obtained
|
|
206
|
+
* @returns {Promise<number>}
|
|
207
|
+
*/
|
|
208
|
+
getNumFourOpChannelsObtained(): Promise<number>;
|
|
257
209
|
/**
|
|
258
210
|
* Enable/disable scaling of modulators by volume
|
|
259
211
|
* @param {boolean} enabled
|
|
@@ -285,25 +237,35 @@ export class AdlMidi {
|
|
|
285
237
|
*/
|
|
286
238
|
getChannelAllocMode(): Promise<number>;
|
|
287
239
|
/**
|
|
288
|
-
* Set the volume model
|
|
240
|
+
* Set the volume range model
|
|
289
241
|
* @param {number} model - Volume model number
|
|
290
242
|
*/
|
|
291
|
-
|
|
243
|
+
setVolumeRangeModel(model: number): void;
|
|
292
244
|
/**
|
|
293
|
-
* Enable/disable
|
|
245
|
+
* Enable/disable soft stereo panning
|
|
294
246
|
* @param {boolean} enabled
|
|
295
247
|
*/
|
|
296
|
-
|
|
248
|
+
setSoftPanEnabled(enabled: boolean): void;
|
|
297
249
|
/**
|
|
298
250
|
* Enable/disable deep vibrato
|
|
299
251
|
* @param {boolean} enabled
|
|
300
252
|
*/
|
|
301
|
-
|
|
253
|
+
setDeepVibrato(enabled: boolean): void;
|
|
254
|
+
/**
|
|
255
|
+
* Get deep vibrato state
|
|
256
|
+
* @returns {Promise<boolean>}
|
|
257
|
+
*/
|
|
258
|
+
getDeepVibrato(): Promise<boolean>;
|
|
302
259
|
/**
|
|
303
260
|
* Enable/disable deep tremolo
|
|
304
261
|
* @param {boolean} enabled
|
|
305
262
|
*/
|
|
306
|
-
|
|
263
|
+
setDeepTremolo(enabled: boolean): void;
|
|
264
|
+
/**
|
|
265
|
+
* Get deep tremolo state
|
|
266
|
+
* @returns {Promise<boolean>}
|
|
267
|
+
*/
|
|
268
|
+
getDeepTremolo(): Promise<boolean>;
|
|
307
269
|
/**
|
|
308
270
|
* Run emulator with PCM rate to reduce CPU usage
|
|
309
271
|
* @param {boolean} enabled
|
|
@@ -316,7 +278,7 @@ export class AdlMidi {
|
|
|
316
278
|
* - nuked profile: NUKED only
|
|
317
279
|
* - dosbox profile: DOSBOX only
|
|
318
280
|
* - light profile: NUKED, DOSBOX
|
|
319
|
-
* - full profile: NUKED, DOSBOX, OPAL, JAVA,
|
|
281
|
+
* - full profile: NUKED, DOSBOX, OPAL, JAVA, ESFMu, YMFM_OPL2, YMFM_OPL3
|
|
320
282
|
*
|
|
321
283
|
* @param {number} emulator - Emulator ID from the Emulator enum
|
|
322
284
|
* @returns {Promise<void>} Resolves when emulator is switched, rejects if unavailable
|
|
@@ -333,6 +295,11 @@ export class AdlMidi {
|
|
|
333
295
|
* console.log(`Using: ${name}`);
|
|
334
296
|
*/
|
|
335
297
|
getEmulatorName(): Promise<string>;
|
|
298
|
+
/**
|
|
299
|
+
* Get the last error info for the player instance
|
|
300
|
+
* @returns {Promise<string>}
|
|
301
|
+
*/
|
|
302
|
+
getErrorInfo(): Promise<string>;
|
|
336
303
|
/**
|
|
337
304
|
* Get the version string of the linked libADLMIDI library
|
|
338
305
|
* @returns {Promise<string>}
|
|
@@ -361,7 +328,7 @@ export class AdlMidi {
|
|
|
361
328
|
* Get the volume range model
|
|
362
329
|
* @returns {Promise<number>}
|
|
363
330
|
*/
|
|
364
|
-
|
|
331
|
+
getVolumeRangeModel(): Promise<number>;
|
|
365
332
|
/**
|
|
366
333
|
* Get list of embedded banks available in this build
|
|
367
334
|
* Note: Slim builds have no embedded banks and will return an empty array
|
|
@@ -374,6 +341,49 @@ export class AdlMidi {
|
|
|
374
341
|
id: number;
|
|
375
342
|
name: string;
|
|
376
343
|
}[]>;
|
|
344
|
+
/**
|
|
345
|
+
* Reserve a number of banks
|
|
346
|
+
* @param {number} count - Number of banks to reserve
|
|
347
|
+
* @returns {Promise<void>} Resolves on success, rejects on failure
|
|
348
|
+
*/
|
|
349
|
+
reserveBanks(count: number): Promise<void>;
|
|
350
|
+
/**
|
|
351
|
+
* Get the bank ID for a given bank identifier
|
|
352
|
+
* @param {BankId} bankId - Bank identifier
|
|
353
|
+
* @returns {Promise<{percussive: number, msb: number, lsb: number}|null>} Bank ID or null if not found
|
|
354
|
+
*/
|
|
355
|
+
getBankId(bankId: BankId): Promise<{
|
|
356
|
+
percussive: number;
|
|
357
|
+
msb: number;
|
|
358
|
+
lsb: number;
|
|
359
|
+
} | null>;
|
|
360
|
+
/**
|
|
361
|
+
* Remove a bank by its identifier
|
|
362
|
+
* @param {BankId} bankId - Bank identifier
|
|
363
|
+
* @returns {Promise<void>} Resolves on success, rejects on failure
|
|
364
|
+
*/
|
|
365
|
+
removeBank(bankId: BankId): Promise<void>;
|
|
366
|
+
/**
|
|
367
|
+
* Load an embedded bank into a custom bank slot
|
|
368
|
+
* @param {BankId} bankId - Target bank identifier
|
|
369
|
+
* @param {number} num - Embedded bank number to load
|
|
370
|
+
* @returns {Promise<void>} Resolves on success, rejects on failure
|
|
371
|
+
*/
|
|
372
|
+
loadEmbeddedBank(bankId: BankId, num: number): Promise<void>;
|
|
373
|
+
/**
|
|
374
|
+
* Send a System Exclusive (SysEx) message
|
|
375
|
+
* @param {Uint8Array|ArrayBuffer} data - SysEx message data
|
|
376
|
+
* @returns {Promise<void>} Resolves on success, rejects on failure
|
|
377
|
+
*/
|
|
378
|
+
systemExclusive(data: Uint8Array | ArrayBuffer): Promise<void>;
|
|
379
|
+
/**
|
|
380
|
+
* Describe the current state of all channels (debug utility)
|
|
381
|
+
* @returns {Promise<{text: string, attr: Uint8Array}>} Channel state text and raw per-channel attribute bytes
|
|
382
|
+
*/
|
|
383
|
+
describeChannels(): Promise<{
|
|
384
|
+
text: string;
|
|
385
|
+
attr: Uint8Array;
|
|
386
|
+
}>;
|
|
377
387
|
/**
|
|
378
388
|
* Reset the synthesizer
|
|
379
389
|
* @returns {void}
|
|
@@ -397,6 +407,22 @@ export class AdlMidi {
|
|
|
397
407
|
* @returns {Promise<string>}
|
|
398
408
|
*/
|
|
399
409
|
getMusicCopyright(): Promise<string>;
|
|
410
|
+
/**
|
|
411
|
+
* Get the number of track titles in the loaded MIDI file
|
|
412
|
+
* @returns {Promise<number>}
|
|
413
|
+
*/
|
|
414
|
+
getTrackTitleCount(): Promise<number>;
|
|
415
|
+
/**
|
|
416
|
+
* Get a track title by index
|
|
417
|
+
* @param {number} index - Track title index
|
|
418
|
+
* @returns {Promise<string>}
|
|
419
|
+
*/
|
|
420
|
+
getTrackTitle(index: number): Promise<string>;
|
|
421
|
+
/**
|
|
422
|
+
* Get the number of MIDI markers in the loaded file
|
|
423
|
+
* @returns {Promise<number>}
|
|
424
|
+
*/
|
|
425
|
+
getMarkerCount(): Promise<number>;
|
|
400
426
|
/**
|
|
401
427
|
* Start or resume MIDI file playback
|
|
402
428
|
* @returns {void}
|
|
@@ -418,7 +444,58 @@ export class AdlMidi {
|
|
|
418
444
|
* @param {boolean} enabled - Whether to loop
|
|
419
445
|
* @returns {void}
|
|
420
446
|
*/
|
|
421
|
-
|
|
447
|
+
setLoopEnabled(enabled: boolean): void;
|
|
448
|
+
/**
|
|
449
|
+
* Set the number of loop repetitions
|
|
450
|
+
* @param {number} count - Loop count (-1 = infinite, 0 = no loops, 1+ = number of loops)
|
|
451
|
+
*/
|
|
452
|
+
setLoopCount(count: number): void;
|
|
453
|
+
/**
|
|
454
|
+
* Enable/disable loop hooks only mode
|
|
455
|
+
* @param {boolean} enabled
|
|
456
|
+
*/
|
|
457
|
+
setLoopHooksOnly(enabled: boolean): void;
|
|
458
|
+
/**
|
|
459
|
+
* Get the loop start time in seconds
|
|
460
|
+
* @returns {Promise<number>}
|
|
461
|
+
*/
|
|
462
|
+
getLoopStartTime(): Promise<number>;
|
|
463
|
+
/**
|
|
464
|
+
* Get the loop end time in seconds
|
|
465
|
+
* @returns {Promise<number>}
|
|
466
|
+
*/
|
|
467
|
+
getLoopEndTime(): Promise<number>;
|
|
468
|
+
/**
|
|
469
|
+
* Select a song number for multi-song MIDI files
|
|
470
|
+
* @param {number} num - Song number (0-based)
|
|
471
|
+
*/
|
|
472
|
+
selectSongNum(num: number): void;
|
|
473
|
+
/**
|
|
474
|
+
* Get the number of songs in the loaded MIDI file
|
|
475
|
+
* @returns {Promise<number>}
|
|
476
|
+
*/
|
|
477
|
+
getSongsCount(): Promise<number>;
|
|
478
|
+
/**
|
|
479
|
+
* Get the number of tracks in the loaded MIDI file
|
|
480
|
+
* @returns {Promise<number>}
|
|
481
|
+
*/
|
|
482
|
+
getTrackCount(): Promise<number>;
|
|
483
|
+
/**
|
|
484
|
+
* Set track options (enable, mute, or solo)
|
|
485
|
+
* Use the TrackOption enum: TrackOption.ON (1), TrackOption.OFF (2), TrackOption.SOLO (3).
|
|
486
|
+
* Note: Passing 0 is a silent no-op that resolves without changing state.
|
|
487
|
+
* @param {number} track - Track index
|
|
488
|
+
* @param {number} options - Track option from TrackOption enum
|
|
489
|
+
* @returns {Promise<void>} Resolves on success, rejects on failure
|
|
490
|
+
*/
|
|
491
|
+
setTrackOptions(track: number, options: number): Promise<void>;
|
|
492
|
+
/**
|
|
493
|
+
* Enable or disable a MIDI channel
|
|
494
|
+
* @param {number} channel - MIDI channel (0-15)
|
|
495
|
+
* @param {boolean} enabled - Whether to enable the channel
|
|
496
|
+
* @returns {Promise<void>} Resolves on success, rejects on failure
|
|
497
|
+
*/
|
|
498
|
+
setChannelEnabled(channel: number, enabled: boolean): Promise<void>;
|
|
422
499
|
/**
|
|
423
500
|
* Set the playback tempo multiplier
|
|
424
501
|
* @param {number} tempo - Tempo multiplier (1.0 = normal speed)
|
|
@@ -643,3 +720,6 @@ export type ConfigureSettings = {
|
|
|
643
720
|
*/
|
|
644
721
|
deepTremolo?: boolean | undefined;
|
|
645
722
|
};
|
|
723
|
+
import { Emulator } from './utils/constants.js';
|
|
724
|
+
import { TrackOption } from './utils/constants.js';
|
|
725
|
+
export { Emulator, TrackOption };
|