libadlmidi-js 1.2.0 → 2.0.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 (75) hide show
  1. package/dist/core.d.ts +186 -4
  2. package/dist/fm_banks/manifest.json +1 -1
  3. package/dist/libadlmidi.d.ts +143 -65
  4. package/dist/libadlmidi.dosbox.browser.js +1 -1
  5. package/dist/libadlmidi.dosbox.browser.wasm +0 -0
  6. package/dist/libadlmidi.dosbox.core.js +1 -1
  7. package/dist/libadlmidi.dosbox.core.wasm +0 -0
  8. package/dist/libadlmidi.dosbox.js +0 -0
  9. package/dist/libadlmidi.dosbox.processor.js +242 -74
  10. package/dist/libadlmidi.dosbox.slim.browser.js +1 -1
  11. package/dist/libadlmidi.dosbox.slim.browser.wasm +0 -0
  12. package/dist/libadlmidi.dosbox.slim.core.js +1 -1
  13. package/dist/libadlmidi.dosbox.slim.core.wasm +0 -0
  14. package/dist/libadlmidi.dosbox.slim.js +0 -0
  15. package/dist/libadlmidi.dosbox.slim.processor.js +242 -74
  16. package/dist/libadlmidi.full.browser.js +1 -1
  17. package/dist/libadlmidi.full.browser.wasm +0 -0
  18. package/dist/libadlmidi.full.core.js +1 -1
  19. package/dist/libadlmidi.full.core.wasm +0 -0
  20. package/dist/libadlmidi.full.js +0 -0
  21. package/dist/libadlmidi.full.processor.js +242 -74
  22. package/dist/libadlmidi.full.slim.browser.js +1 -1
  23. package/dist/libadlmidi.full.slim.browser.wasm +0 -0
  24. package/dist/libadlmidi.full.slim.core.js +1 -1
  25. package/dist/libadlmidi.full.slim.core.wasm +0 -0
  26. package/dist/libadlmidi.full.slim.js +0 -0
  27. package/dist/libadlmidi.full.slim.processor.js +242 -74
  28. package/dist/libadlmidi.js +465 -21
  29. package/dist/libadlmidi.js.map +3 -3
  30. package/dist/libadlmidi.light.browser.js +1 -1
  31. package/dist/libadlmidi.light.browser.wasm +0 -0
  32. package/dist/libadlmidi.light.core.js +1 -1
  33. package/dist/libadlmidi.light.core.wasm +0 -0
  34. package/dist/libadlmidi.light.js +0 -0
  35. package/dist/libadlmidi.light.processor.js +242 -74
  36. package/dist/libadlmidi.light.slim.browser.js +1 -1
  37. package/dist/libadlmidi.light.slim.browser.wasm +0 -0
  38. package/dist/libadlmidi.light.slim.core.js +1 -1
  39. package/dist/libadlmidi.light.slim.core.wasm +0 -0
  40. package/dist/libadlmidi.light.slim.js +0 -0
  41. package/dist/libadlmidi.light.slim.processor.js +242 -74
  42. package/dist/libadlmidi.nuked.browser.js +1 -1
  43. package/dist/libadlmidi.nuked.browser.wasm +0 -0
  44. package/dist/libadlmidi.nuked.core.js +1 -1
  45. package/dist/libadlmidi.nuked.core.wasm +0 -0
  46. package/dist/libadlmidi.nuked.js +0 -0
  47. package/dist/libadlmidi.nuked.processor.js +242 -74
  48. package/dist/libadlmidi.nuked.slim.browser.js +1 -1
  49. package/dist/libadlmidi.nuked.slim.browser.wasm +0 -0
  50. package/dist/libadlmidi.nuked.slim.core.js +1 -1
  51. package/dist/libadlmidi.nuked.slim.core.wasm +0 -0
  52. package/dist/libadlmidi.nuked.slim.js +0 -0
  53. package/dist/libadlmidi.nuked.slim.processor.js +242 -74
  54. package/dist/profiles/dosbox.d.ts +1 -0
  55. package/dist/profiles/dosbox.slim.d.ts +1 -0
  56. package/dist/profiles/full.d.ts +1 -0
  57. package/dist/profiles/full.slim.d.ts +1 -0
  58. package/dist/profiles/light.d.ts +1 -0
  59. package/dist/profiles/light.slim.d.ts +1 -0
  60. package/dist/profiles/nuked.d.ts +1 -0
  61. package/dist/profiles/nuked.slim.d.ts +1 -0
  62. package/dist/utils/constants.d.ts +59 -0
  63. package/package.json +1 -1
  64. package/src/core.js +352 -4
  65. package/src/libadlmidi.js +374 -56
  66. package/src/processor.js +204 -12
  67. package/src/profiles/dosbox.js +7 -4
  68. package/src/profiles/dosbox.slim.js +7 -4
  69. package/src/profiles/full.js +7 -4
  70. package/src/profiles/full.slim.js +7 -4
  71. package/src/profiles/light.js +7 -4
  72. package/src/profiles/light.slim.js +7 -4
  73. package/src/profiles/nuked.js +7 -4
  74. package/src/profiles/nuked.slim.js +7 -4
  75. package/src/utils/constants.js +51 -0
package/dist/core.d.ts CHANGED
@@ -118,6 +118,12 @@ export class AdlMidiCore {
118
118
  * @returns {number} Count of channels
119
119
  */
120
120
  getNumFourOpChannels(): number;
121
+ /**
122
+ * Get the number of 4-operator channels obtained.
123
+ *
124
+ * @returns {number} Count of channels obtained
125
+ */
126
+ getNumFourOpChannelsObtained(): number;
121
127
  /**
122
128
  * Enable/disable scaling of modulators by volume.
123
129
  *
@@ -159,19 +165,31 @@ export class AdlMidiCore {
159
165
  *
160
166
  * @param {boolean} enabled
161
167
  */
162
- setSoftPan(enabled: boolean): void;
168
+ setSoftPanEnabled(enabled: boolean): void;
163
169
  /**
164
170
  * Enable/disable deep vibrato.
165
171
  *
166
172
  * @param {boolean} enabled
167
173
  */
168
174
  setDeepVibrato(enabled: boolean): void;
175
+ /**
176
+ * Get deep vibrato state.
177
+ *
178
+ * @returns {boolean}
179
+ */
180
+ getDeepVibrato(): boolean;
169
181
  /**
170
182
  * Enable/disable deep tremolo.
171
183
  *
172
184
  * @param {boolean} enabled
173
185
  */
174
186
  setDeepTremolo(enabled: boolean): void;
187
+ /**
188
+ * Get deep tremolo state.
189
+ *
190
+ * @returns {boolean}
191
+ */
192
+ getDeepTremolo(): boolean;
175
193
  /**
176
194
  * Switch OPL3 emulator (if multiple are compiled in).
177
195
  *
@@ -185,6 +203,18 @@ export class AdlMidiCore {
185
203
  * @returns {string} Emulator name
186
204
  */
187
205
  getEmulatorName(): string;
206
+ /**
207
+ * Get the last global error string (static, no player needed).
208
+ *
209
+ * @returns {string} Error string or empty string
210
+ */
211
+ getErrorString(): string;
212
+ /**
213
+ * Get the last error info for this player instance.
214
+ *
215
+ * @returns {string} Error info string or empty string
216
+ */
217
+ getErrorInfo(): string;
188
218
  /**
189
219
  * Get the version string of the linked libADLMIDI library.
190
220
  *
@@ -218,13 +248,13 @@ export class AdlMidiCore {
218
248
  *
219
249
  * @returns {number}
220
250
  */
221
- getVolumeModel(): number;
251
+ getVolumeRangeModel(): number;
222
252
  /**
223
253
  * Set the volume range model.
224
254
  *
225
255
  * @param {number} model - Volume model type
226
256
  */
227
- setVolumeModel(model: number): void;
257
+ setVolumeRangeModel(model: number): void;
228
258
  /**
229
259
  * Run emulator with PCM rate to reduce CPU usage.
230
260
  *
@@ -331,6 +361,25 @@ export class AdlMidiCore {
331
361
  * @returns {string} Copyright or empty string
332
362
  */
333
363
  getMusicCopyright(): string;
364
+ /**
365
+ * Get the number of track titles in the loaded MIDI file.
366
+ *
367
+ * @returns {number} Number of track titles
368
+ */
369
+ getTrackTitleCount(): number;
370
+ /**
371
+ * Get a track title by index.
372
+ *
373
+ * @param {number} index - Track title index
374
+ * @returns {string} Track title or empty string
375
+ */
376
+ getTrackTitle(index: number): string;
377
+ /**
378
+ * Get the number of MIDI markers in the loaded file.
379
+ *
380
+ * @returns {number} Number of markers
381
+ */
382
+ getMarkerCount(): number;
334
383
  /**
335
384
  * Play MIDI file and generate audio.
336
385
  *
@@ -371,13 +420,127 @@ export class AdlMidiCore {
371
420
  *
372
421
  * @param {boolean} enabled
373
422
  */
374
- setLooping(enabled: boolean): void;
423
+ setLoopEnabled(enabled: boolean): void;
424
+ /**
425
+ * Set the number of loop repetitions.
426
+ *
427
+ * @param {number} count - Loop count (-1 = infinite, 0 = no loops, 1+ = number of loops)
428
+ */
429
+ setLoopCount(count: number): void;
430
+ /**
431
+ * Enable/disable loop hooks only mode.
432
+ *
433
+ * @param {boolean} enabled
434
+ */
435
+ setLoopHooksOnly(enabled: boolean): void;
436
+ /**
437
+ * Get the loop start time in seconds.
438
+ *
439
+ * @returns {number} Loop start time in seconds
440
+ */
441
+ getLoopStartTime(): number;
442
+ /**
443
+ * Get the loop end time in seconds.
444
+ *
445
+ * @returns {number} Loop end time in seconds
446
+ */
447
+ getLoopEndTime(): number;
448
+ /**
449
+ * Select a song number for multi-song MIDI files.
450
+ *
451
+ * @param {number} num - Song number (0-based)
452
+ */
453
+ selectSongNum(num: number): void;
454
+ /**
455
+ * Get the number of songs in the loaded MIDI file.
456
+ *
457
+ * @returns {number} Number of songs
458
+ */
459
+ getSongsCount(): number;
460
+ /**
461
+ * Get the number of tracks in the loaded MIDI file.
462
+ *
463
+ * @returns {number} Number of tracks
464
+ */
465
+ getTrackCount(): number;
466
+ /**
467
+ * Set track options (enable, mute, or solo).
468
+ * Use the TrackOption enum: TrackOption.ON (1), TrackOption.OFF (2), TrackOption.SOLO (3).
469
+ * Note: Passing 0 is a silent no-op that returns true without changing state.
470
+ *
471
+ * @param {number} track - Track index
472
+ * @param {number} options - Track option from TrackOption enum
473
+ * @returns {boolean} True if successful
474
+ */
475
+ setTrackOptions(track: number, options: number): boolean;
476
+ /**
477
+ * Enable or disable a MIDI channel.
478
+ *
479
+ * @param {number} channel - MIDI channel (0-15)
480
+ * @param {boolean} enabled - Whether to enable the channel
481
+ * @returns {boolean} True if successful
482
+ */
483
+ setChannelEnabled(channel: number, enabled: boolean): boolean;
375
484
  /**
376
485
  * Set playback tempo multiplier.
377
486
  *
378
487
  * @param {number} tempo - Tempo multiplier (1.0 = normal)
379
488
  */
380
489
  setTempo(tempo: number): void;
490
+ /**
491
+ * Reserve a number of banks.
492
+ *
493
+ * @param {number} count - Number of banks to reserve
494
+ * @returns {boolean} True if successful
495
+ */
496
+ reserveBanks(count: number): boolean;
497
+ /**
498
+ * Get the bank ID for a given bank identifier.
499
+ *
500
+ * @param {Object} bankId - Bank identifier
501
+ * @param {boolean|number} bankId.percussive - True/1 for percussion, false/0 for melodic
502
+ * @param {number} bankId.msb - Bank MSB
503
+ * @param {number} bankId.lsb - Bank LSB
504
+ * @returns {{percussive: number, msb: number, lsb: number}|null} Bank ID or null if not found
505
+ */
506
+ getBankId(bankId: {
507
+ percussive: boolean | number;
508
+ msb: number;
509
+ lsb: number;
510
+ }): {
511
+ percussive: number;
512
+ msb: number;
513
+ lsb: number;
514
+ } | null;
515
+ /**
516
+ * Remove a bank by its identifier.
517
+ *
518
+ * @param {Object} bankId - Bank identifier
519
+ * @param {boolean|number} bankId.percussive - True/1 for percussion, false/0 for melodic
520
+ * @param {number} bankId.msb - Bank MSB
521
+ * @param {number} bankId.lsb - Bank LSB
522
+ * @returns {boolean} True if successfully removed
523
+ */
524
+ removeBank(bankId: {
525
+ percussive: boolean | number;
526
+ msb: number;
527
+ lsb: number;
528
+ }): boolean;
529
+ /**
530
+ * Load an embedded bank into a custom bank slot.
531
+ *
532
+ * @param {Object} bankId - Target bank identifier
533
+ * @param {boolean|number} bankId.percussive - True/1 for percussion, false/0 for melodic
534
+ * @param {number} bankId.msb - Bank MSB
535
+ * @param {number} bankId.lsb - Bank LSB
536
+ * @param {number} num - Embedded bank number to load
537
+ * @returns {boolean} True if successful
538
+ */
539
+ loadEmbeddedBank(bankId: {
540
+ percussive: boolean | number;
541
+ msb: number;
542
+ lsb: number;
543
+ }, num: number): boolean;
381
544
  /**
382
545
  * Get an instrument from a bank.
383
546
  *
@@ -409,6 +572,22 @@ export class AdlMidiCore {
409
572
  msb: number;
410
573
  lsb: number;
411
574
  }, program: number, instrument: import("./utils/struct.js").Instrument): boolean;
575
+ /**
576
+ * Send a System Exclusive (SysEx) message.
577
+ *
578
+ * @param {Uint8Array|ArrayBuffer} data - SysEx message data
579
+ * @returns {boolean} True if successful
580
+ */
581
+ systemExclusive(data: Uint8Array | ArrayBuffer): boolean;
582
+ /**
583
+ * Describe the current state of all channels (debug utility).
584
+ *
585
+ * @returns {{text: string, attr: Uint8Array}} Channel state text and raw per-channel attribute bytes
586
+ */
587
+ describeChannels(): {
588
+ text: string;
589
+ attr: Uint8Array;
590
+ };
412
591
  /**
413
592
  * Get the raw Emscripten module for advanced usage.
414
593
  *
@@ -431,3 +610,6 @@ export class AdlMidiCore {
431
610
  private _ensurePlayer;
432
611
  }
433
612
  export default AdlMidiCore;
613
+ import { Emulator } from './utils/constants.js';
614
+ import { TrackOption } from './utils/constants.js';
615
+ export { Emulator, TrackOption };
@@ -1,5 +1,5 @@
1
1
  {
2
- "generated": "2026-03-17T14:43:16.332Z",
2
+ "generated": "2026-03-21T19:54:46.638Z",
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
@@ -217,7 +162,7 @@ export class AdlMidi {
217
162
  * @param {ArrayBuffer} arrayBuffer - Bank file data
218
163
  * @returns {Promise<void>}
219
164
  */
220
- loadBank(arrayBuffer: ArrayBuffer): Promise<void>;
165
+ loadBankData(arrayBuffer: ArrayBuffer): Promise<void>;
221
166
  /**
222
167
  * Set the embedded bank by number
223
168
  * @param {number} bank - Bank number
@@ -254,6 +199,11 @@ export class AdlMidi {
254
199
  * @returns {Promise<number>}
255
200
  */
256
201
  getNumFourOpChannels(): Promise<number>;
202
+ /**
203
+ * Get the number of 4-operator channels obtained
204
+ * @returns {Promise<number>}
205
+ */
206
+ getNumFourOpChannelsObtained(): Promise<number>;
257
207
  /**
258
208
  * Enable/disable scaling of modulators by volume
259
209
  * @param {boolean} enabled
@@ -285,25 +235,35 @@ export class AdlMidi {
285
235
  */
286
236
  getChannelAllocMode(): Promise<number>;
287
237
  /**
288
- * Set the volume model
238
+ * Set the volume range model
289
239
  * @param {number} model - Volume model number
290
240
  */
291
- setVolumeModel(model: number): void;
241
+ setVolumeRangeModel(model: number): void;
292
242
  /**
293
- * Enable/disable rhythm mode (percussion)
243
+ * Enable/disable soft stereo panning
294
244
  * @param {boolean} enabled
295
245
  */
296
- setPercussionMode(enabled: boolean): void;
246
+ setSoftPanEnabled(enabled: boolean): void;
297
247
  /**
298
248
  * Enable/disable deep vibrato
299
249
  * @param {boolean} enabled
300
250
  */
301
- setVibrato(enabled: boolean): void;
251
+ setDeepVibrato(enabled: boolean): void;
252
+ /**
253
+ * Get deep vibrato state
254
+ * @returns {Promise<boolean>}
255
+ */
256
+ getDeepVibrato(): Promise<boolean>;
302
257
  /**
303
258
  * Enable/disable deep tremolo
304
259
  * @param {boolean} enabled
305
260
  */
306
- setTremolo(enabled: boolean): void;
261
+ setDeepTremolo(enabled: boolean): void;
262
+ /**
263
+ * Get deep tremolo state
264
+ * @returns {Promise<boolean>}
265
+ */
266
+ getDeepTremolo(): Promise<boolean>;
307
267
  /**
308
268
  * Run emulator with PCM rate to reduce CPU usage
309
269
  * @param {boolean} enabled
@@ -316,7 +276,7 @@ export class AdlMidi {
316
276
  * - nuked profile: NUKED only
317
277
  * - dosbox profile: DOSBOX only
318
278
  * - light profile: NUKED, DOSBOX
319
- * - full profile: NUKED, DOSBOX, OPAL, JAVA, ESFMU, YMFM_OPL2, YMFM_OPL3
279
+ * - full profile: NUKED, DOSBOX, OPAL, JAVA, ESFMu, YMFM_OPL2, YMFM_OPL3
320
280
  *
321
281
  * @param {number} emulator - Emulator ID from the Emulator enum
322
282
  * @returns {Promise<void>} Resolves when emulator is switched, rejects if unavailable
@@ -333,6 +293,11 @@ export class AdlMidi {
333
293
  * console.log(`Using: ${name}`);
334
294
  */
335
295
  getEmulatorName(): Promise<string>;
296
+ /**
297
+ * Get the last error info for the player instance
298
+ * @returns {Promise<string>}
299
+ */
300
+ getErrorInfo(): Promise<string>;
336
301
  /**
337
302
  * Get the version string of the linked libADLMIDI library
338
303
  * @returns {Promise<string>}
@@ -361,7 +326,7 @@ export class AdlMidi {
361
326
  * Get the volume range model
362
327
  * @returns {Promise<number>}
363
328
  */
364
- getVolumeModel(): Promise<number>;
329
+ getVolumeRangeModel(): Promise<number>;
365
330
  /**
366
331
  * Get list of embedded banks available in this build
367
332
  * Note: Slim builds have no embedded banks and will return an empty array
@@ -374,6 +339,49 @@ export class AdlMidi {
374
339
  id: number;
375
340
  name: string;
376
341
  }[]>;
342
+ /**
343
+ * Reserve a number of banks
344
+ * @param {number} count - Number of banks to reserve
345
+ * @returns {Promise<void>} Resolves on success, rejects on failure
346
+ */
347
+ reserveBanks(count: number): Promise<void>;
348
+ /**
349
+ * Get the bank ID for a given bank identifier
350
+ * @param {BankId} bankId - Bank identifier
351
+ * @returns {Promise<{percussive: number, msb: number, lsb: number}|null>} Bank ID or null if not found
352
+ */
353
+ getBankId(bankId: BankId): Promise<{
354
+ percussive: number;
355
+ msb: number;
356
+ lsb: number;
357
+ } | null>;
358
+ /**
359
+ * Remove a bank by its identifier
360
+ * @param {BankId} bankId - Bank identifier
361
+ * @returns {Promise<void>} Resolves on success, rejects on failure
362
+ */
363
+ removeBank(bankId: BankId): Promise<void>;
364
+ /**
365
+ * Load an embedded bank into a custom bank slot
366
+ * @param {BankId} bankId - Target bank identifier
367
+ * @param {number} num - Embedded bank number to load
368
+ * @returns {Promise<void>} Resolves on success, rejects on failure
369
+ */
370
+ loadEmbeddedBank(bankId: BankId, num: number): Promise<void>;
371
+ /**
372
+ * Send a System Exclusive (SysEx) message
373
+ * @param {Uint8Array|ArrayBuffer} data - SysEx message data
374
+ * @returns {Promise<void>} Resolves on success, rejects on failure
375
+ */
376
+ systemExclusive(data: Uint8Array | ArrayBuffer): Promise<void>;
377
+ /**
378
+ * Describe the current state of all channels (debug utility)
379
+ * @returns {Promise<{text: string, attr: Uint8Array}>} Channel state text and raw per-channel attribute bytes
380
+ */
381
+ describeChannels(): Promise<{
382
+ text: string;
383
+ attr: Uint8Array;
384
+ }>;
377
385
  /**
378
386
  * Reset the synthesizer
379
387
  * @returns {void}
@@ -397,6 +405,22 @@ export class AdlMidi {
397
405
  * @returns {Promise<string>}
398
406
  */
399
407
  getMusicCopyright(): Promise<string>;
408
+ /**
409
+ * Get the number of track titles in the loaded MIDI file
410
+ * @returns {Promise<number>}
411
+ */
412
+ getTrackTitleCount(): Promise<number>;
413
+ /**
414
+ * Get a track title by index
415
+ * @param {number} index - Track title index
416
+ * @returns {Promise<string>}
417
+ */
418
+ getTrackTitle(index: number): Promise<string>;
419
+ /**
420
+ * Get the number of MIDI markers in the loaded file
421
+ * @returns {Promise<number>}
422
+ */
423
+ getMarkerCount(): Promise<number>;
400
424
  /**
401
425
  * Start or resume MIDI file playback
402
426
  * @returns {void}
@@ -418,7 +442,58 @@ export class AdlMidi {
418
442
  * @param {boolean} enabled - Whether to loop
419
443
  * @returns {void}
420
444
  */
421
- setLoop(enabled: boolean): void;
445
+ setLoopEnabled(enabled: boolean): void;
446
+ /**
447
+ * Set the number of loop repetitions
448
+ * @param {number} count - Loop count (-1 = infinite, 0 = no loops, 1+ = number of loops)
449
+ */
450
+ setLoopCount(count: number): void;
451
+ /**
452
+ * Enable/disable loop hooks only mode
453
+ * @param {boolean} enabled
454
+ */
455
+ setLoopHooksOnly(enabled: boolean): void;
456
+ /**
457
+ * Get the loop start time in seconds
458
+ * @returns {Promise<number>}
459
+ */
460
+ getLoopStartTime(): Promise<number>;
461
+ /**
462
+ * Get the loop end time in seconds
463
+ * @returns {Promise<number>}
464
+ */
465
+ getLoopEndTime(): Promise<number>;
466
+ /**
467
+ * Select a song number for multi-song MIDI files
468
+ * @param {number} num - Song number (0-based)
469
+ */
470
+ selectSongNum(num: number): void;
471
+ /**
472
+ * Get the number of songs in the loaded MIDI file
473
+ * @returns {Promise<number>}
474
+ */
475
+ getSongsCount(): Promise<number>;
476
+ /**
477
+ * Get the number of tracks in the loaded MIDI file
478
+ * @returns {Promise<number>}
479
+ */
480
+ getTrackCount(): Promise<number>;
481
+ /**
482
+ * Set track options (enable, mute, or solo)
483
+ * Use the TrackOption enum: TrackOption.ON (1), TrackOption.OFF (2), TrackOption.SOLO (3).
484
+ * Note: Passing 0 is a silent no-op that resolves without changing state.
485
+ * @param {number} track - Track index
486
+ * @param {number} options - Track option from TrackOption enum
487
+ * @returns {Promise<void>} Resolves on success, rejects on failure
488
+ */
489
+ setTrackOptions(track: number, options: number): Promise<void>;
490
+ /**
491
+ * Enable or disable a MIDI channel
492
+ * @param {number} channel - MIDI channel (0-15)
493
+ * @param {boolean} enabled - Whether to enable the channel
494
+ * @returns {Promise<void>} Resolves on success, rejects on failure
495
+ */
496
+ setChannelEnabled(channel: number, enabled: boolean): Promise<void>;
422
497
  /**
423
498
  * Set the playback tempo multiplier
424
499
  * @param {number} tempo - Tempo multiplier (1.0 = normal speed)
@@ -643,3 +718,6 @@ export type ConfigureSettings = {
643
718
  */
644
719
  deepTremolo?: boolean | undefined;
645
720
  };
721
+ import { Emulator } from './utils/constants.js';
722
+ import { TrackOption } from './utils/constants.js';
723
+ export { Emulator, TrackOption };