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/src/processor.js CHANGED
@@ -333,8 +333,8 @@ class AdlMidiProcessor extends AudioWorkletProcessor {
333
333
  this.port.postMessage({ type: 'configured' });
334
334
  break;
335
335
 
336
- case 'loadBank':
337
- this.loadBank(msg.data);
336
+ case 'loadBankData':
337
+ this.loadBankData(msg.data);
338
338
  break;
339
339
 
340
340
  case 'setBank': {
@@ -367,6 +367,10 @@ class AdlMidiProcessor extends AudioWorkletProcessor {
367
367
  this.port.postMessage({ type: 'numFourOpChannels', channels: this.adl._adl_getNumFourOpsChn(this.midi) });
368
368
  break;
369
369
 
370
+ case 'getNumFourOpChannelsObtained':
371
+ this.port.postMessage({ type: 'numFourOpChannelsObtained', channels: this.adl._adl_getNumFourOpsChnObtained(this.midi) });
372
+ break;
373
+
370
374
  case 'setScaleModulators':
371
375
  this.adl._adl_setScaleModulators(this.midi, msg.enabled ? 1 : 0);
372
376
  break;
@@ -391,22 +395,30 @@ class AdlMidiProcessor extends AudioWorkletProcessor {
391
395
  this.port.postMessage({ type: 'channelAllocMode', mode: this.adl._adl_getChannelAllocMode(this.midi) });
392
396
  break;
393
397
 
394
- case 'setVolumeModel':
398
+ case 'setVolumeRangeModel':
395
399
  this.adl._adl_setVolumeRangeModel(this.midi, msg.model);
396
400
  break;
397
401
 
398
- case 'setPercMode':
399
- this.adl._adl_setPercMode(this.midi, msg.enabled ? 1 : 0);
402
+ case 'setDeepVibrato':
403
+ this.adl._adl_setHVibrato(this.midi, msg.enabled ? 1 : 0);
400
404
  break;
401
405
 
402
- case 'setVibrato':
403
- this.adl._adl_setHVibrato(this.midi, msg.enabled ? 1 : 0);
406
+ case 'getDeepVibrato':
407
+ this.port.postMessage({ type: 'deepVibrato', enabled: this.adl._adl_getHVibrato(this.midi) !== 0 });
404
408
  break;
405
409
 
406
- case 'setTremolo':
410
+ case 'setDeepTremolo':
407
411
  this.adl._adl_setHTremolo(this.midi, msg.enabled ? 1 : 0);
408
412
  break;
409
413
 
414
+ case 'getDeepTremolo':
415
+ this.port.postMessage({ type: 'deepTremolo', enabled: this.adl._adl_getHTremolo(this.midi) !== 0 });
416
+ break;
417
+
418
+ case 'setSoftPanEnabled':
419
+ this.adl._adl_setSoftPanEnabled(this.midi, msg.enabled ? 1 : 0);
420
+ break;
421
+
410
422
  case 'setRunAtPcmRate':
411
423
  this.adl._adl_setRunAtPcmRate(this.midi, msg.enabled ? 1 : 0);
412
424
  break;
@@ -425,6 +437,13 @@ class AdlMidiProcessor extends AudioWorkletProcessor {
425
437
  break;
426
438
  }
427
439
 
440
+ case 'getErrorInfo': {
441
+ const ptr = this.adl._adl_errorInfo(this.midi);
442
+ const info = ptr ? this.adl.UTF8ToString(ptr) : '';
443
+ this.port.postMessage({ type: 'errorInfo', info });
444
+ break;
445
+ }
446
+
428
447
  case 'getLibraryVersion': {
429
448
  const ptr = this.adl._adl_linkedLibraryVersion();
430
449
  const version = ptr ? this.adl.UTF8ToString(ptr) : 'Unknown';
@@ -451,8 +470,8 @@ class AdlMidiProcessor extends AudioWorkletProcessor {
451
470
  this.port.postMessage({ type: 'numChipsObtained', chips: this.adl._adl_getNumChipsObtained(this.midi) });
452
471
  break;
453
472
 
454
- case 'getVolumeModel':
455
- this.port.postMessage({ type: 'volumeModel', model: this.adl._adl_getVolumeRangeModel(this.midi) });
473
+ case 'getVolumeRangeModel':
474
+ this.port.postMessage({ type: 'volumeRangeModel', model: this.adl._adl_getVolumeRangeModel(this.midi) });
456
475
  break;
457
476
 
458
477
  case 'getEmbeddedBanks': {
@@ -480,6 +499,21 @@ class AdlMidiProcessor extends AudioWorkletProcessor {
480
499
  break;
481
500
  }
482
501
 
502
+ case 'getTrackTitleCount':
503
+ this.port.postMessage({ type: 'trackTitleCount', count: this.adl._adl_metaTrackTitleCount(this.midi) });
504
+ break;
505
+
506
+ case 'getTrackTitle': {
507
+ const ptr = this.adl._adl_metaTrackTitle(this.midi, msg.index);
508
+ const title = ptr ? this.adl.UTF8ToString(ptr) : '';
509
+ this.port.postMessage({ type: 'trackTitle', title, index: msg.index, reqId: msg.reqId });
510
+ break;
511
+ }
512
+
513
+ case 'getMarkerCount':
514
+ this.port.postMessage({ type: 'markerCount', count: this.adl._adl_metaMarkerCount(this.midi) });
515
+ break;
516
+
483
517
  case 'play':
484
518
  // If at end, rewind first so play works as expected
485
519
  if (this.adl._adl_atEnd(this.midi) !== 0) {
@@ -498,10 +532,50 @@ class AdlMidiProcessor extends AudioWorkletProcessor {
498
532
  this.adl._adl_positionSeek(this.midi, msg.position);
499
533
  break;
500
534
 
501
- case 'setLoop':
535
+ case 'setLoopEnabled':
502
536
  this.adl._adl_setLoopEnabled(this.midi, msg.enabled ? 1 : 0);
503
537
  break;
504
538
 
539
+ case 'setLoopCount':
540
+ this.adl._adl_setLoopCount(this.midi, msg.count);
541
+ break;
542
+
543
+ case 'setLoopHooksOnly':
544
+ this.adl._adl_setLoopHooksOnly(this.midi, msg.enabled ? 1 : 0);
545
+ break;
546
+
547
+ case 'getLoopStartTime':
548
+ this.port.postMessage({ type: 'loopStartTime', time: this.adl._adl_loopStartTime(this.midi) });
549
+ break;
550
+
551
+ case 'getLoopEndTime':
552
+ this.port.postMessage({ type: 'loopEndTime', time: this.adl._adl_loopEndTime(this.midi) });
553
+ break;
554
+
555
+ case 'selectSongNum':
556
+ this.adl._adl_selectSongNum(this.midi, msg.num);
557
+ break;
558
+
559
+ case 'getSongsCount':
560
+ this.port.postMessage({ type: 'songsCount', count: this.adl._adl_getSongsCount(this.midi) });
561
+ break;
562
+
563
+ case 'getTrackCount':
564
+ this.port.postMessage({ type: 'trackCount', count: this.adl._adl_trackCount(this.midi) });
565
+ break;
566
+
567
+ case 'setTrackOptions': {
568
+ const result = this.adl._adl_setTrackOptions(this.midi, msg.track, msg.options);
569
+ this.port.postMessage({ type: 'trackOptionsSet', success: result === 0, track: msg.track, reqId: msg.reqId });
570
+ break;
571
+ }
572
+
573
+ case 'setChannelEnabled': {
574
+ const result = this.adl._adl_setChannelEnabled(this.midi, msg.channel, msg.enabled ? 1 : 0);
575
+ this.port.postMessage({ type: 'channelEnabledSet', success: result === 0, channel: msg.channel, reqId: msg.reqId });
576
+ break;
577
+ }
578
+
505
579
  case 'setTempo':
506
580
  this.adl._adl_setTempo(this.midi, msg.tempo);
507
581
  break;
@@ -520,6 +594,124 @@ class AdlMidiProcessor extends AudioWorkletProcessor {
520
594
  this.adl._adl_reset(this.midi);
521
595
  this.playMode = 'realtime';
522
596
  break;
597
+
598
+ // ================== Bank Management ==================
599
+
600
+ case 'reserveBanks': {
601
+ // adl_reserveBanks returns the resulting capacity (>= 0), not 0 on success
602
+ const result = this.adl._adl_reserveBanks(this.midi, msg.count);
603
+ this.port.postMessage({ type: 'banksReserved', success: result >= 0, reqId: msg.reqId });
604
+ break;
605
+ }
606
+
607
+ case 'getBankId': {
608
+ const bankIdPtr = this.adl._malloc(AdlMidiProcessor.SIZEOF_ADL_BANK_ID);
609
+ this.adl.HEAPU8[bankIdPtr] = msg.bankId.percussive ? 1 : 0;
610
+ this.adl.HEAPU8[bankIdPtr + 1] = msg.bankId.msb || 0;
611
+ this.adl.HEAPU8[bankIdPtr + 2] = msg.bankId.lsb || 0;
612
+
613
+ const bankPtr = this.adl._malloc(AdlMidiProcessor.SIZEOF_ADL_BANK);
614
+ const bankResult = this.adl._adl_getBank(this.midi, bankIdPtr, 0, bankPtr);
615
+
616
+ let id = null;
617
+ if (bankResult === 0) {
618
+ const outIdPtr = this.adl._malloc(AdlMidiProcessor.SIZEOF_ADL_BANK_ID);
619
+ const idResult = this.adl._adl_getBankId(this.midi, bankPtr, outIdPtr);
620
+ if (idResult === 0) {
621
+ id = {
622
+ percussive: this.adl.HEAPU8[outIdPtr],
623
+ msb: this.adl.HEAPU8[outIdPtr + 1],
624
+ lsb: this.adl.HEAPU8[outIdPtr + 2],
625
+ };
626
+ }
627
+ this.adl._free(outIdPtr);
628
+ }
629
+ this.adl._free(bankIdPtr);
630
+ this.adl._free(bankPtr);
631
+ // Echo bankId for concurrent request correlation
632
+ this.port.postMessage({ type: 'bankId', id, bankId: msg.bankId, reqId: msg.reqId });
633
+ break;
634
+ }
635
+
636
+ case 'removeBank': {
637
+ const bankIdPtr = this.adl._malloc(AdlMidiProcessor.SIZEOF_ADL_BANK_ID);
638
+ this.adl.HEAPU8[bankIdPtr] = msg.bankId.percussive ? 1 : 0;
639
+ this.adl.HEAPU8[bankIdPtr + 1] = msg.bankId.msb || 0;
640
+ this.adl.HEAPU8[bankIdPtr + 2] = msg.bankId.lsb || 0;
641
+
642
+ const bankPtr = this.adl._malloc(AdlMidiProcessor.SIZEOF_ADL_BANK);
643
+ const bankResult = this.adl._adl_getBank(this.midi, bankIdPtr, 0, bankPtr);
644
+
645
+ let success = false;
646
+ if (bankResult === 0) {
647
+ success = this.adl._adl_removeBank(this.midi, bankPtr) === 0;
648
+ }
649
+
650
+ this.adl._free(bankIdPtr);
651
+ this.adl._free(bankPtr);
652
+ // Echo bankId for concurrent request correlation
653
+ this.port.postMessage({ type: 'bankRemoved', success, bankId: msg.bankId, reqId: msg.reqId });
654
+ break;
655
+ }
656
+
657
+ case 'loadEmbeddedBank': {
658
+ const bankIdPtr = this.adl._malloc(AdlMidiProcessor.SIZEOF_ADL_BANK_ID);
659
+ this.adl.HEAPU8[bankIdPtr] = msg.bankId.percussive ? 1 : 0;
660
+ this.adl.HEAPU8[bankIdPtr + 1] = msg.bankId.msb || 0;
661
+ this.adl.HEAPU8[bankIdPtr + 2] = msg.bankId.lsb || 0;
662
+
663
+ const bankPtr = this.adl._malloc(AdlMidiProcessor.SIZEOF_ADL_BANK);
664
+
665
+ // Check if bank already exists before creating
666
+ const existed = this.adl._adl_getBank(this.midi, bankIdPtr, 0, bankPtr) === 0;
667
+ const bankResult = existed ? 0 : this.adl._adl_getBank(this.midi, bankIdPtr, 1, bankPtr);
668
+
669
+ let success = false;
670
+ if (bankResult === 0) {
671
+ success = this.adl._adl_loadEmbeddedBank(this.midi, bankPtr, msg.num) === 0;
672
+ // Clean up: if we created a new slot but load failed, remove it
673
+ if (!success && !existed) {
674
+ this.adl._adl_removeBank(this.midi, bankPtr);
675
+ }
676
+ }
677
+
678
+ this.adl._free(bankIdPtr);
679
+ this.adl._free(bankPtr);
680
+ // Echo bankId for concurrent request correlation
681
+ this.port.postMessage({ type: 'embeddedBankLoaded', success, bankId: msg.bankId, reqId: msg.reqId });
682
+ break;
683
+ }
684
+
685
+ // ================== SysEx ==================
686
+
687
+ case 'systemExclusive': {
688
+ const bytes = new Uint8Array(msg.data);
689
+ const ptr = this.adl._malloc(bytes.length);
690
+ this.adl.HEAPU8.set(bytes, ptr);
691
+ const result = this.adl._adl_rt_systemExclusive(this.midi, ptr, bytes.length);
692
+ this.adl._free(ptr);
693
+ // adl_rt_systemExclusive returns 1 when processed, 0 when rejected
694
+ this.port.postMessage({ type: 'systemExclusiveSent', success: result !== 0, reqId: msg.reqId });
695
+ break;
696
+ }
697
+
698
+ // ================== Debug / Diagnostics ==================
699
+
700
+ case 'describeChannels': {
701
+ // Size buffers based on actual chip count (~23 channels per OPL3 chip)
702
+ const numChips = this.adl._adl_getNumChipsObtained(this.midi);
703
+ const size = Math.max(256, (numChips + 1) * 23);
704
+ const textPtr = this.adl._malloc(size);
705
+ const attrPtr = this.adl._malloc(size);
706
+ this.adl._adl_describeChannels(this.midi, textPtr, attrPtr, size);
707
+ const text = this.adl.UTF8ToString(textPtr);
708
+ // attr contains raw per-channel bytes; one byte per channel char in text
709
+ const attr = Array.from(this.adl.HEAPU8.slice(attrPtr, attrPtr + text.length));
710
+ this.adl._free(textPtr);
711
+ this.adl._free(attrPtr);
712
+ this.port.postMessage({ type: 'channelsDescribed', text, attr, reqId: msg.reqId });
713
+ break;
714
+ }
523
715
  }
524
716
  }
525
717
 
@@ -575,7 +767,7 @@ class AdlMidiProcessor extends AudioWorkletProcessor {
575
767
  return banks;
576
768
  }
577
769
 
578
- loadBank(arrayBuffer) {
770
+ loadBankData(arrayBuffer) {
579
771
  try {
580
772
  const data = new Uint8Array(arrayBuffer);
581
773
  const dataPtr = this.adl._malloc(data.length);
@@ -72,11 +72,14 @@ export class AdlMidiCore {
72
72
  }
73
73
 
74
74
  // Re-export struct utilities for convenience
75
- export {
76
- encodeInstrument,
77
- decodeInstrument,
75
+ export {
76
+ encodeInstrument,
77
+ decodeInstrument,
78
78
  defaultInstrument,
79
79
  encodeOperator,
80
80
  decodeOperator,
81
- defaultOperator
81
+ defaultOperator
82
82
  } from '../utils/struct.js';
83
+
84
+ // Re-export enums
85
+ export { Emulator, TrackOption } from '../utils/constants.js';
@@ -72,11 +72,14 @@ export class AdlMidiCore {
72
72
  }
73
73
 
74
74
  // Re-export struct utilities for convenience
75
- export {
76
- encodeInstrument,
77
- decodeInstrument,
75
+ export {
76
+ encodeInstrument,
77
+ decodeInstrument,
78
78
  defaultInstrument,
79
79
  encodeOperator,
80
80
  decodeOperator,
81
- defaultOperator
81
+ defaultOperator
82
82
  } from '../utils/struct.js';
83
+
84
+ // Re-export enums
85
+ export { Emulator, TrackOption } from '../utils/constants.js';
@@ -72,11 +72,14 @@ export class AdlMidiCore {
72
72
  }
73
73
 
74
74
  // Re-export struct utilities for convenience
75
- export {
76
- encodeInstrument,
77
- decodeInstrument,
75
+ export {
76
+ encodeInstrument,
77
+ decodeInstrument,
78
78
  defaultInstrument,
79
79
  encodeOperator,
80
80
  decodeOperator,
81
- defaultOperator
81
+ defaultOperator
82
82
  } from '../utils/struct.js';
83
+
84
+ // Re-export enums
85
+ export { Emulator, TrackOption } from '../utils/constants.js';
@@ -72,11 +72,14 @@ export class AdlMidiCore {
72
72
  }
73
73
 
74
74
  // Re-export struct utilities for convenience
75
- export {
76
- encodeInstrument,
77
- decodeInstrument,
75
+ export {
76
+ encodeInstrument,
77
+ decodeInstrument,
78
78
  defaultInstrument,
79
79
  encodeOperator,
80
80
  decodeOperator,
81
- defaultOperator
81
+ defaultOperator
82
82
  } from '../utils/struct.js';
83
+
84
+ // Re-export enums
85
+ export { Emulator, TrackOption } from '../utils/constants.js';
@@ -72,11 +72,14 @@ export class AdlMidiCore {
72
72
  }
73
73
 
74
74
  // Re-export struct utilities for convenience
75
- export {
76
- encodeInstrument,
77
- decodeInstrument,
75
+ export {
76
+ encodeInstrument,
77
+ decodeInstrument,
78
78
  defaultInstrument,
79
79
  encodeOperator,
80
80
  decodeOperator,
81
- defaultOperator
81
+ defaultOperator
82
82
  } from '../utils/struct.js';
83
+
84
+ // Re-export enums
85
+ export { Emulator, TrackOption } from '../utils/constants.js';
@@ -72,11 +72,14 @@ export class AdlMidiCore {
72
72
  }
73
73
 
74
74
  // Re-export struct utilities for convenience
75
- export {
76
- encodeInstrument,
77
- decodeInstrument,
75
+ export {
76
+ encodeInstrument,
77
+ decodeInstrument,
78
78
  defaultInstrument,
79
79
  encodeOperator,
80
80
  decodeOperator,
81
- defaultOperator
81
+ defaultOperator
82
82
  } from '../utils/struct.js';
83
+
84
+ // Re-export enums
85
+ export { Emulator, TrackOption } from '../utils/constants.js';
@@ -72,11 +72,14 @@ export class AdlMidiCore {
72
72
  }
73
73
 
74
74
  // Re-export struct utilities for convenience
75
- export {
76
- encodeInstrument,
77
- decodeInstrument,
75
+ export {
76
+ encodeInstrument,
77
+ decodeInstrument,
78
78
  defaultInstrument,
79
79
  encodeOperator,
80
80
  decodeOperator,
81
- defaultOperator
81
+ defaultOperator
82
82
  } from '../utils/struct.js';
83
+
84
+ // Re-export enums
85
+ export { Emulator, TrackOption } from '../utils/constants.js';
@@ -72,11 +72,14 @@ export class AdlMidiCore {
72
72
  }
73
73
 
74
74
  // Re-export struct utilities for convenience
75
- export {
76
- encodeInstrument,
77
- decodeInstrument,
75
+ export {
76
+ encodeInstrument,
77
+ decodeInstrument,
78
78
  defaultInstrument,
79
79
  encodeOperator,
80
80
  decodeOperator,
81
- defaultOperator
81
+ defaultOperator
82
82
  } from '../utils/struct.js';
83
+
84
+ // Re-export enums
85
+ export { Emulator, TrackOption } from '../utils/constants.js';
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Shared constants for libADLMIDI-JS
3
+ */
4
+
5
+ /**
6
+ * Available OPL2/OPL3 emulator cores.
7
+ * Use with switchEmulator() to change the synthesis engine at runtime.
8
+ * Note: Only emulators compiled into the current profile are available.
9
+ * @readonly
10
+ * @enum {number}
11
+ */
12
+ export const Emulator = Object.freeze({
13
+ /** Nuked OPL3 v1.8 - Most accurate, higher CPU usage */
14
+ NUKED: 0,
15
+ /** Nuked OPL3 v1.7.4 - Slightly older version */
16
+ NUKED_174: 1,
17
+ /** DosBox OPL3 - Good accuracy, lower CPU usage */
18
+ DOSBOX: 2,
19
+ /** Opal - Reality Adlib Tracker emulator */
20
+ OPAL: 3,
21
+ /** Java OPL3 - Port of emu8950 */
22
+ JAVA: 4,
23
+ /** ESFMu - ESFM chip emulator */
24
+ ESFMu: 5,
25
+ /** MAME OPL2 */
26
+ MAME_OPL2: 6,
27
+ /** YMFM OPL2 */
28
+ YMFM_OPL2: 7,
29
+ /** YMFM OPL3 */
30
+ YMFM_OPL3: 8,
31
+ /** Nuked OPL2 LLE - Transistor-level emulation */
32
+ NUKED_OPL2_LLE: 9,
33
+ /** Nuked OPL3 LLE - Transistor-level emulation */
34
+ NUKED_OPL3_LLE: 10,
35
+ /** Nuked OPL2 Lite - Lightweight OPL2 emulation for AdLib-era music */
36
+ NUKED_OPL2_LITE: 11,
37
+ });
38
+
39
+ /**
40
+ * Track option flags for use with setTrackOptions().
41
+ * @readonly
42
+ * @enum {number}
43
+ */
44
+ export const TrackOption = Object.freeze({
45
+ /** Enable the track (default state) */
46
+ ON: 1,
47
+ /** Mute/disable the track */
48
+ OFF: 2,
49
+ /** Solo the track (mute all others) */
50
+ SOLO: 3,
51
+ });