libadlmidi-js 1.1.1 → 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 -63
  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 +468 -22
  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 -54
  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-17T12:35:20.884Z",
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 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,37 +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 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
- }>;
108
55
  export class AdlMidi {
109
56
  /**
110
57
  * Create a new AdlMidi instance
@@ -215,7 +162,7 @@ export class AdlMidi {
215
162
  * @param {ArrayBuffer} arrayBuffer - Bank file data
216
163
  * @returns {Promise<void>}
217
164
  */
218
- loadBank(arrayBuffer: ArrayBuffer): Promise<void>;
165
+ loadBankData(arrayBuffer: ArrayBuffer): Promise<void>;
219
166
  /**
220
167
  * Set the embedded bank by number
221
168
  * @param {number} bank - Bank number
@@ -252,6 +199,11 @@ export class AdlMidi {
252
199
  * @returns {Promise<number>}
253
200
  */
254
201
  getNumFourOpChannels(): Promise<number>;
202
+ /**
203
+ * Get the number of 4-operator channels obtained
204
+ * @returns {Promise<number>}
205
+ */
206
+ getNumFourOpChannelsObtained(): Promise<number>;
255
207
  /**
256
208
  * Enable/disable scaling of modulators by volume
257
209
  * @param {boolean} enabled
@@ -283,25 +235,35 @@ export class AdlMidi {
283
235
  */
284
236
  getChannelAllocMode(): Promise<number>;
285
237
  /**
286
- * Set the volume model
238
+ * Set the volume range model
287
239
  * @param {number} model - Volume model number
288
240
  */
289
- setVolumeModel(model: number): void;
241
+ setVolumeRangeModel(model: number): void;
290
242
  /**
291
- * Enable/disable rhythm mode (percussion)
243
+ * Enable/disable soft stereo panning
292
244
  * @param {boolean} enabled
293
245
  */
294
- setPercussionMode(enabled: boolean): void;
246
+ setSoftPanEnabled(enabled: boolean): void;
295
247
  /**
296
248
  * Enable/disable deep vibrato
297
249
  * @param {boolean} enabled
298
250
  */
299
- setVibrato(enabled: boolean): void;
251
+ setDeepVibrato(enabled: boolean): void;
252
+ /**
253
+ * Get deep vibrato state
254
+ * @returns {Promise<boolean>}
255
+ */
256
+ getDeepVibrato(): Promise<boolean>;
300
257
  /**
301
258
  * Enable/disable deep tremolo
302
259
  * @param {boolean} enabled
303
260
  */
304
- setTremolo(enabled: boolean): void;
261
+ setDeepTremolo(enabled: boolean): void;
262
+ /**
263
+ * Get deep tremolo state
264
+ * @returns {Promise<boolean>}
265
+ */
266
+ getDeepTremolo(): Promise<boolean>;
305
267
  /**
306
268
  * Run emulator with PCM rate to reduce CPU usage
307
269
  * @param {boolean} enabled
@@ -314,7 +276,7 @@ export class AdlMidi {
314
276
  * - nuked profile: NUKED only
315
277
  * - dosbox profile: DOSBOX only
316
278
  * - light profile: NUKED, DOSBOX
317
- * - full profile: NUKED, DOSBOX, OPAL, JAVA, ESFMU, YMFM_OPL2, YMFM_OPL3
279
+ * - full profile: NUKED, DOSBOX, OPAL, JAVA, ESFMu, YMFM_OPL2, YMFM_OPL3
318
280
  *
319
281
  * @param {number} emulator - Emulator ID from the Emulator enum
320
282
  * @returns {Promise<void>} Resolves when emulator is switched, rejects if unavailable
@@ -331,6 +293,11 @@ export class AdlMidi {
331
293
  * console.log(`Using: ${name}`);
332
294
  */
333
295
  getEmulatorName(): Promise<string>;
296
+ /**
297
+ * Get the last error info for the player instance
298
+ * @returns {Promise<string>}
299
+ */
300
+ getErrorInfo(): Promise<string>;
334
301
  /**
335
302
  * Get the version string of the linked libADLMIDI library
336
303
  * @returns {Promise<string>}
@@ -359,7 +326,7 @@ export class AdlMidi {
359
326
  * Get the volume range model
360
327
  * @returns {Promise<number>}
361
328
  */
362
- getVolumeModel(): Promise<number>;
329
+ getVolumeRangeModel(): Promise<number>;
363
330
  /**
364
331
  * Get list of embedded banks available in this build
365
332
  * Note: Slim builds have no embedded banks and will return an empty array
@@ -372,6 +339,49 @@ export class AdlMidi {
372
339
  id: number;
373
340
  name: string;
374
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
+ }>;
375
385
  /**
376
386
  * Reset the synthesizer
377
387
  * @returns {void}
@@ -395,6 +405,22 @@ export class AdlMidi {
395
405
  * @returns {Promise<string>}
396
406
  */
397
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>;
398
424
  /**
399
425
  * Start or resume MIDI file playback
400
426
  * @returns {void}
@@ -416,7 +442,58 @@ export class AdlMidi {
416
442
  * @param {boolean} enabled - Whether to loop
417
443
  * @returns {void}
418
444
  */
419
- 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>;
420
497
  /**
421
498
  * Set the playback tempo multiplier
422
499
  * @param {number} tempo - Tempo multiplier (1.0 = normal speed)
@@ -641,3 +718,6 @@ export type ConfigureSettings = {
641
718
  */
642
719
  deepTremolo?: boolean | undefined;
643
720
  };
721
+ import { Emulator } from './utils/constants.js';
722
+ import { TrackOption } from './utils/constants.js';
723
+ export { Emulator, TrackOption };