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.
Files changed (76) hide show
  1. package/README.md +8 -5
  2. package/dist/core.d.ts +191 -4
  3. package/dist/fm_banks/manifest.json +1 -1
  4. package/dist/libadlmidi.d.ts +146 -66
  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 +247 -74
  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 +247 -74
  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 +247 -74
  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 +247 -74
  29. package/dist/libadlmidi.js +473 -24
  30. package/dist/libadlmidi.js.map +3 -3
  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 +247 -74
  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 +247 -74
  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 +247 -74
  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 +247 -74
  55. package/dist/profiles/dosbox.d.ts +7 -2
  56. package/dist/profiles/dosbox.slim.d.ts +7 -2
  57. package/dist/profiles/full.d.ts +7 -2
  58. package/dist/profiles/full.slim.d.ts +7 -2
  59. package/dist/profiles/light.d.ts +7 -2
  60. package/dist/profiles/light.slim.d.ts +7 -2
  61. package/dist/profiles/nuked.d.ts +7 -2
  62. package/dist/profiles/nuked.slim.d.ts +7 -2
  63. package/dist/utils/constants.d.ts +61 -0
  64. package/package.json +30 -9
  65. package/src/core.js +361 -4
  66. package/src/libadlmidi.js +379 -58
  67. package/src/processor.js +210 -12
  68. package/src/profiles/dosbox.js +20 -10
  69. package/src/profiles/dosbox.slim.js +20 -10
  70. package/src/profiles/full.js +21 -11
  71. package/src/profiles/full.slim.js +21 -11
  72. package/src/profiles/light.js +21 -11
  73. package/src/profiles/light.slim.js +21 -11
  74. package/src/profiles/nuked.js +21 -11
  75. package/src/profiles/nuked.slim.js +21 -11
  76. 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, highest CPU usage. |
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
- setSoftPan(enabled: boolean): void;
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
- getVolumeModel(): number;
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
- setVolumeModel(model: number): void;
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
- setLooping(enabled: boolean): void;
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 };
@@ -1,5 +1,5 @@
1
1
  {
2
- "generated": "2026-03-17T14:43:16.332Z",
2
+ "generated": "2026-05-27T04:19:52.386Z",
3
3
  "categories": {
4
4
  "wopl": {
5
5
  "description": "General WOPL banks",
@@ -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
- loadBank(arrayBuffer: ArrayBuffer): Promise<void>;
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
- setVolumeModel(model: number): void;
243
+ setVolumeRangeModel(model: number): void;
292
244
  /**
293
- * Enable/disable rhythm mode (percussion)
245
+ * Enable/disable soft stereo panning
294
246
  * @param {boolean} enabled
295
247
  */
296
- setPercussionMode(enabled: boolean): void;
248
+ setSoftPanEnabled(enabled: boolean): void;
297
249
  /**
298
250
  * Enable/disable deep vibrato
299
251
  * @param {boolean} enabled
300
252
  */
301
- setVibrato(enabled: boolean): void;
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
- setTremolo(enabled: boolean): void;
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, ESFMU, YMFM_OPL2, YMFM_OPL3
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
- getVolumeModel(): Promise<number>;
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
- setLoop(enabled: boolean): void;
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 };