libadlmidi-js 1.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 (86) hide show
  1. package/LICENSE +165 -0
  2. package/README.md +126 -0
  3. package/dist/core.d.ts +276 -0
  4. package/dist/fm_banks/ail/MonopolyDeluxe.wopl +0 -0
  5. package/dist/fm_banks/ail/master_of_magic.wopl +0 -0
  6. package/dist/fm_banks/manifest.json +60 -0
  7. package/dist/fm_banks/wopl/Apogee-IMF-90.wopl +0 -0
  8. package/dist/fm_banks/wopl/DMXOPL3-by-sneakernets-GS.wopl +0 -0
  9. package/dist/fm_banks/wopl/GM-By-J.A.Nguyen-and-Wohlstand.wopl +0 -0
  10. package/dist/fm_banks/wopl/Wohlstand's-modded-FatMan.wopl +0 -0
  11. package/dist/fm_banks/wopl/fatman-2op.wopl +0 -0
  12. package/dist/fm_banks/wopl/fatman-4op.wopl +0 -0
  13. package/dist/fm_banks/wopl/msadlib.wopl +0 -0
  14. package/dist/libadlmidi.d.ts +453 -0
  15. package/dist/libadlmidi.dosbox.browser.js +2 -0
  16. package/dist/libadlmidi.dosbox.browser.wasm +0 -0
  17. package/dist/libadlmidi.dosbox.core.js +2 -0
  18. package/dist/libadlmidi.dosbox.core.wasm +0 -0
  19. package/dist/libadlmidi.dosbox.js +0 -0
  20. package/dist/libadlmidi.dosbox.processor.js +3226 -0
  21. package/dist/libadlmidi.dosbox.slim.browser.js +2 -0
  22. package/dist/libadlmidi.dosbox.slim.browser.wasm +0 -0
  23. package/dist/libadlmidi.dosbox.slim.core.js +2 -0
  24. package/dist/libadlmidi.dosbox.slim.core.wasm +0 -0
  25. package/dist/libadlmidi.dosbox.slim.js +0 -0
  26. package/dist/libadlmidi.dosbox.slim.processor.js +3226 -0
  27. package/dist/libadlmidi.full.browser.js +2 -0
  28. package/dist/libadlmidi.full.browser.wasm +0 -0
  29. package/dist/libadlmidi.full.core.js +2 -0
  30. package/dist/libadlmidi.full.core.wasm +0 -0
  31. package/dist/libadlmidi.full.js +0 -0
  32. package/dist/libadlmidi.full.processor.js +3226 -0
  33. package/dist/libadlmidi.full.slim.browser.js +2 -0
  34. package/dist/libadlmidi.full.slim.browser.wasm +0 -0
  35. package/dist/libadlmidi.full.slim.core.js +2 -0
  36. package/dist/libadlmidi.full.slim.core.wasm +0 -0
  37. package/dist/libadlmidi.full.slim.js +0 -0
  38. package/dist/libadlmidi.full.slim.processor.js +3226 -0
  39. package/dist/libadlmidi.js +445 -0
  40. package/dist/libadlmidi.js.map +7 -0
  41. package/dist/libadlmidi.light.browser.js +2 -0
  42. package/dist/libadlmidi.light.browser.wasm +0 -0
  43. package/dist/libadlmidi.light.core.js +2 -0
  44. package/dist/libadlmidi.light.core.wasm +0 -0
  45. package/dist/libadlmidi.light.js +0 -0
  46. package/dist/libadlmidi.light.processor.js +3226 -0
  47. package/dist/libadlmidi.light.slim.browser.js +2 -0
  48. package/dist/libadlmidi.light.slim.browser.wasm +0 -0
  49. package/dist/libadlmidi.light.slim.core.js +2 -0
  50. package/dist/libadlmidi.light.slim.core.wasm +0 -0
  51. package/dist/libadlmidi.light.slim.js +0 -0
  52. package/dist/libadlmidi.light.slim.processor.js +3226 -0
  53. package/dist/libadlmidi.nuked.browser.js +2 -0
  54. package/dist/libadlmidi.nuked.browser.wasm +0 -0
  55. package/dist/libadlmidi.nuked.core.js +2 -0
  56. package/dist/libadlmidi.nuked.core.wasm +0 -0
  57. package/dist/libadlmidi.nuked.js +0 -0
  58. package/dist/libadlmidi.nuked.processor.js +3226 -0
  59. package/dist/libadlmidi.nuked.slim.browser.js +2 -0
  60. package/dist/libadlmidi.nuked.slim.browser.wasm +0 -0
  61. package/dist/libadlmidi.nuked.slim.core.js +2 -0
  62. package/dist/libadlmidi.nuked.slim.core.wasm +0 -0
  63. package/dist/libadlmidi.nuked.slim.js +0 -0
  64. package/dist/libadlmidi.nuked.slim.processor.js +3226 -0
  65. package/dist/profiles/dosbox.d.ts +49 -0
  66. package/dist/profiles/dosbox.slim.d.ts +49 -0
  67. package/dist/profiles/full.d.ts +49 -0
  68. package/dist/profiles/full.slim.d.ts +49 -0
  69. package/dist/profiles/light.d.ts +49 -0
  70. package/dist/profiles/light.slim.d.ts +49 -0
  71. package/dist/profiles/nuked.d.ts +49 -0
  72. package/dist/profiles/nuked.slim.d.ts +49 -0
  73. package/dist/utils/struct.d.ts +209 -0
  74. package/package.json +103 -0
  75. package/src/core.js +591 -0
  76. package/src/libadlmidi.js +524 -0
  77. package/src/processor.js +517 -0
  78. package/src/profiles/dosbox.js +82 -0
  79. package/src/profiles/dosbox.slim.js +82 -0
  80. package/src/profiles/full.js +82 -0
  81. package/src/profiles/full.slim.js +82 -0
  82. package/src/profiles/light.js +82 -0
  83. package/src/profiles/light.slim.js +82 -0
  84. package/src/profiles/nuked.js +82 -0
  85. package/src/profiles/nuked.slim.js +82 -0
  86. package/src/utils/struct.js +288 -0
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Pre-configured AdlMidi for dosbox profile.
3
+ *
4
+ * @example
5
+ * ```javascript
6
+ * import { AdlMidi } from 'libadlmidi-js/dosbox';
7
+ *
8
+ * const synth = new AdlMidi();
9
+ * await synth.init(); // No paths needed!
10
+ * synth.noteOn(0, 60, 100);
11
+ * ```
12
+ */
13
+ export class AdlMidi extends BaseAdlMidi {
14
+ /**
15
+ * Initialize the synthesizer with this profile's WASM.
16
+ *
17
+ * @param {string} [processorUrl] - Override processor URL (optional)
18
+ * @param {string} [wasmUrl] - Override WASM URL (optional)
19
+ * @returns {Promise<void>}
20
+ */
21
+ init(processorUrl?: string, wasmUrl?: string): Promise<void>;
22
+ }
23
+ /**
24
+ * Pre-configured AdlMidiCore for dosbox profile.
25
+ *
26
+ * @example
27
+ * ```javascript
28
+ * import { AdlMidiCore } from 'libadlmidi-js/dosbox/core';
29
+ *
30
+ * const synth = await AdlMidiCore.create(); // No paths needed!
31
+ * synth.init(44100);
32
+ * synth.noteOn(0, 60, 100);
33
+ * const samples = synth.generate(4096);
34
+ * ```
35
+ */
36
+ export class AdlMidiCore {
37
+ /**
38
+ * Create a new AdlMidiCore instance with this profile's WASM.
39
+ *
40
+ * @param {{corePath?: string}} [options] - Options (corePath is pre-configured)
41
+ * @returns {Promise<BaseAdlMidiCore>}
42
+ */
43
+ static create(options?: {
44
+ corePath?: string;
45
+ }): Promise<BaseAdlMidiCore>;
46
+ }
47
+ import { AdlMidi as BaseAdlMidi } from '../libadlmidi.js';
48
+ import { AdlMidiCore as BaseAdlMidiCore } from '../core.js';
49
+ export { encodeInstrument, decodeInstrument, defaultInstrument, encodeOperator, decodeOperator, defaultOperator } from "../utils/struct.js";
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Pre-configured AdlMidi for dosbox slim profile.
3
+ *
4
+ * @example
5
+ * ```javascript
6
+ * import { AdlMidi } from 'libadlmidi-js/dosbox.slim';
7
+ *
8
+ * const synth = new AdlMidi();
9
+ * await synth.init(); // No paths needed!
10
+ * synth.noteOn(0, 60, 100);
11
+ * ```
12
+ */
13
+ export class AdlMidi extends BaseAdlMidi {
14
+ /**
15
+ * Initialize the synthesizer with this profile's WASM.
16
+ *
17
+ * @param {string} [processorUrl] - Override processor URL (optional)
18
+ * @param {string} [wasmUrl] - Override WASM URL (optional)
19
+ * @returns {Promise<void>}
20
+ */
21
+ init(processorUrl?: string, wasmUrl?: string): Promise<void>;
22
+ }
23
+ /**
24
+ * Pre-configured AdlMidiCore for dosbox slim profile.
25
+ *
26
+ * @example
27
+ * ```javascript
28
+ * import { AdlMidiCore } from 'libadlmidi-js/dosbox.slim/core';
29
+ *
30
+ * const synth = await AdlMidiCore.create(); // No paths needed!
31
+ * synth.init(44100);
32
+ * synth.noteOn(0, 60, 100);
33
+ * const samples = synth.generate(4096);
34
+ * ```
35
+ */
36
+ export class AdlMidiCore {
37
+ /**
38
+ * Create a new AdlMidiCore instance with this profile's WASM.
39
+ *
40
+ * @param {{corePath?: string}} [options] - Options (corePath is pre-configured)
41
+ * @returns {Promise<BaseAdlMidiCore>}
42
+ */
43
+ static create(options?: {
44
+ corePath?: string;
45
+ }): Promise<BaseAdlMidiCore>;
46
+ }
47
+ import { AdlMidi as BaseAdlMidi } from '../libadlmidi.js';
48
+ import { AdlMidiCore as BaseAdlMidiCore } from '../core.js';
49
+ export { encodeInstrument, decodeInstrument, defaultInstrument, encodeOperator, decodeOperator, defaultOperator } from "../utils/struct.js";
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Pre-configured AdlMidi for full profile.
3
+ *
4
+ * @example
5
+ * ```javascript
6
+ * import { AdlMidi } from 'libadlmidi-js/full';
7
+ *
8
+ * const synth = new AdlMidi();
9
+ * await synth.init(); // No paths needed!
10
+ * synth.noteOn(0, 60, 100);
11
+ * ```
12
+ */
13
+ export class AdlMidi extends BaseAdlMidi {
14
+ /**
15
+ * Initialize the synthesizer with this profile's WASM.
16
+ *
17
+ * @param {string} [processorUrl] - Override processor URL (optional)
18
+ * @param {string} [wasmUrl] - Override WASM URL (optional)
19
+ * @returns {Promise<void>}
20
+ */
21
+ init(processorUrl?: string, wasmUrl?: string): Promise<void>;
22
+ }
23
+ /**
24
+ * Pre-configured AdlMidiCore for full profile.
25
+ *
26
+ * @example
27
+ * ```javascript
28
+ * import { AdlMidiCore } from 'libadlmidi-js/full/core';
29
+ *
30
+ * const synth = await AdlMidiCore.create(); // No paths needed!
31
+ * synth.init(44100);
32
+ * synth.noteOn(0, 60, 100);
33
+ * const samples = synth.generate(4096);
34
+ * ```
35
+ */
36
+ export class AdlMidiCore {
37
+ /**
38
+ * Create a new AdlMidiCore instance with this profile's WASM.
39
+ *
40
+ * @param {{corePath?: string}} [options] - Options (corePath is pre-configured)
41
+ * @returns {Promise<BaseAdlMidiCore>}
42
+ */
43
+ static create(options?: {
44
+ corePath?: string;
45
+ }): Promise<BaseAdlMidiCore>;
46
+ }
47
+ import { AdlMidi as BaseAdlMidi } from '../libadlmidi.js';
48
+ import { AdlMidiCore as BaseAdlMidiCore } from '../core.js';
49
+ export { encodeInstrument, decodeInstrument, defaultInstrument, encodeOperator, decodeOperator, defaultOperator } from "../utils/struct.js";
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Pre-configured AdlMidi for full slim profile.
3
+ *
4
+ * @example
5
+ * ```javascript
6
+ * import { AdlMidi } from 'libadlmidi-js/full.slim';
7
+ *
8
+ * const synth = new AdlMidi();
9
+ * await synth.init(); // No paths needed!
10
+ * synth.noteOn(0, 60, 100);
11
+ * ```
12
+ */
13
+ export class AdlMidi extends BaseAdlMidi {
14
+ /**
15
+ * Initialize the synthesizer with this profile's WASM.
16
+ *
17
+ * @param {string} [processorUrl] - Override processor URL (optional)
18
+ * @param {string} [wasmUrl] - Override WASM URL (optional)
19
+ * @returns {Promise<void>}
20
+ */
21
+ init(processorUrl?: string, wasmUrl?: string): Promise<void>;
22
+ }
23
+ /**
24
+ * Pre-configured AdlMidiCore for full slim profile.
25
+ *
26
+ * @example
27
+ * ```javascript
28
+ * import { AdlMidiCore } from 'libadlmidi-js/full.slim/core';
29
+ *
30
+ * const synth = await AdlMidiCore.create(); // No paths needed!
31
+ * synth.init(44100);
32
+ * synth.noteOn(0, 60, 100);
33
+ * const samples = synth.generate(4096);
34
+ * ```
35
+ */
36
+ export class AdlMidiCore {
37
+ /**
38
+ * Create a new AdlMidiCore instance with this profile's WASM.
39
+ *
40
+ * @param {{corePath?: string}} [options] - Options (corePath is pre-configured)
41
+ * @returns {Promise<BaseAdlMidiCore>}
42
+ */
43
+ static create(options?: {
44
+ corePath?: string;
45
+ }): Promise<BaseAdlMidiCore>;
46
+ }
47
+ import { AdlMidi as BaseAdlMidi } from '../libadlmidi.js';
48
+ import { AdlMidiCore as BaseAdlMidiCore } from '../core.js';
49
+ export { encodeInstrument, decodeInstrument, defaultInstrument, encodeOperator, decodeOperator, defaultOperator } from "../utils/struct.js";
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Pre-configured AdlMidi for light profile.
3
+ *
4
+ * @example
5
+ * ```javascript
6
+ * import { AdlMidi } from 'libadlmidi-js/light';
7
+ *
8
+ * const synth = new AdlMidi();
9
+ * await synth.init(); // No paths needed!
10
+ * synth.noteOn(0, 60, 100);
11
+ * ```
12
+ */
13
+ export class AdlMidi extends BaseAdlMidi {
14
+ /**
15
+ * Initialize the synthesizer with this profile's WASM.
16
+ *
17
+ * @param {string} [processorUrl] - Override processor URL (optional)
18
+ * @param {string} [wasmUrl] - Override WASM URL (optional)
19
+ * @returns {Promise<void>}
20
+ */
21
+ init(processorUrl?: string, wasmUrl?: string): Promise<void>;
22
+ }
23
+ /**
24
+ * Pre-configured AdlMidiCore for light profile.
25
+ *
26
+ * @example
27
+ * ```javascript
28
+ * import { AdlMidiCore } from 'libadlmidi-js/light/core';
29
+ *
30
+ * const synth = await AdlMidiCore.create(); // No paths needed!
31
+ * synth.init(44100);
32
+ * synth.noteOn(0, 60, 100);
33
+ * const samples = synth.generate(4096);
34
+ * ```
35
+ */
36
+ export class AdlMidiCore {
37
+ /**
38
+ * Create a new AdlMidiCore instance with this profile's WASM.
39
+ *
40
+ * @param {{corePath?: string}} [options] - Options (corePath is pre-configured)
41
+ * @returns {Promise<BaseAdlMidiCore>}
42
+ */
43
+ static create(options?: {
44
+ corePath?: string;
45
+ }): Promise<BaseAdlMidiCore>;
46
+ }
47
+ import { AdlMidi as BaseAdlMidi } from '../libadlmidi.js';
48
+ import { AdlMidiCore as BaseAdlMidiCore } from '../core.js';
49
+ export { encodeInstrument, decodeInstrument, defaultInstrument, encodeOperator, decodeOperator, defaultOperator } from "../utils/struct.js";
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Pre-configured AdlMidi for light slim profile.
3
+ *
4
+ * @example
5
+ * ```javascript
6
+ * import { AdlMidi } from 'libadlmidi-js/light.slim';
7
+ *
8
+ * const synth = new AdlMidi();
9
+ * await synth.init(); // No paths needed!
10
+ * synth.noteOn(0, 60, 100);
11
+ * ```
12
+ */
13
+ export class AdlMidi extends BaseAdlMidi {
14
+ /**
15
+ * Initialize the synthesizer with this profile's WASM.
16
+ *
17
+ * @param {string} [processorUrl] - Override processor URL (optional)
18
+ * @param {string} [wasmUrl] - Override WASM URL (optional)
19
+ * @returns {Promise<void>}
20
+ */
21
+ init(processorUrl?: string, wasmUrl?: string): Promise<void>;
22
+ }
23
+ /**
24
+ * Pre-configured AdlMidiCore for light slim profile.
25
+ *
26
+ * @example
27
+ * ```javascript
28
+ * import { AdlMidiCore } from 'libadlmidi-js/light.slim/core';
29
+ *
30
+ * const synth = await AdlMidiCore.create(); // No paths needed!
31
+ * synth.init(44100);
32
+ * synth.noteOn(0, 60, 100);
33
+ * const samples = synth.generate(4096);
34
+ * ```
35
+ */
36
+ export class AdlMidiCore {
37
+ /**
38
+ * Create a new AdlMidiCore instance with this profile's WASM.
39
+ *
40
+ * @param {{corePath?: string}} [options] - Options (corePath is pre-configured)
41
+ * @returns {Promise<BaseAdlMidiCore>}
42
+ */
43
+ static create(options?: {
44
+ corePath?: string;
45
+ }): Promise<BaseAdlMidiCore>;
46
+ }
47
+ import { AdlMidi as BaseAdlMidi } from '../libadlmidi.js';
48
+ import { AdlMidiCore as BaseAdlMidiCore } from '../core.js';
49
+ export { encodeInstrument, decodeInstrument, defaultInstrument, encodeOperator, decodeOperator, defaultOperator } from "../utils/struct.js";
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Pre-configured AdlMidi for nuked profile.
3
+ *
4
+ * @example
5
+ * ```javascript
6
+ * import { AdlMidi } from 'libadlmidi-js/nuked';
7
+ *
8
+ * const synth = new AdlMidi();
9
+ * await synth.init(); // No paths needed!
10
+ * synth.noteOn(0, 60, 100);
11
+ * ```
12
+ */
13
+ export class AdlMidi extends BaseAdlMidi {
14
+ /**
15
+ * Initialize the synthesizer with this profile's WASM.
16
+ *
17
+ * @param {string} [processorUrl] - Override processor URL (optional)
18
+ * @param {string} [wasmUrl] - Override WASM URL (optional)
19
+ * @returns {Promise<void>}
20
+ */
21
+ init(processorUrl?: string, wasmUrl?: string): Promise<void>;
22
+ }
23
+ /**
24
+ * Pre-configured AdlMidiCore for nuked profile.
25
+ *
26
+ * @example
27
+ * ```javascript
28
+ * import { AdlMidiCore } from 'libadlmidi-js/nuked/core';
29
+ *
30
+ * const synth = await AdlMidiCore.create(); // No paths needed!
31
+ * synth.init(44100);
32
+ * synth.noteOn(0, 60, 100);
33
+ * const samples = synth.generate(4096);
34
+ * ```
35
+ */
36
+ export class AdlMidiCore {
37
+ /**
38
+ * Create a new AdlMidiCore instance with this profile's WASM.
39
+ *
40
+ * @param {{corePath?: string}} [options] - Options (corePath is pre-configured)
41
+ * @returns {Promise<BaseAdlMidiCore>}
42
+ */
43
+ static create(options?: {
44
+ corePath?: string;
45
+ }): Promise<BaseAdlMidiCore>;
46
+ }
47
+ import { AdlMidi as BaseAdlMidi } from '../libadlmidi.js';
48
+ import { AdlMidiCore as BaseAdlMidiCore } from '../core.js';
49
+ export { encodeInstrument, decodeInstrument, defaultInstrument, encodeOperator, decodeOperator, defaultOperator } from "../utils/struct.js";
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Pre-configured AdlMidi for nuked slim profile.
3
+ *
4
+ * @example
5
+ * ```javascript
6
+ * import { AdlMidi } from 'libadlmidi-js/nuked.slim';
7
+ *
8
+ * const synth = new AdlMidi();
9
+ * await synth.init(); // No paths needed!
10
+ * synth.noteOn(0, 60, 100);
11
+ * ```
12
+ */
13
+ export class AdlMidi extends BaseAdlMidi {
14
+ /**
15
+ * Initialize the synthesizer with this profile's WASM.
16
+ *
17
+ * @param {string} [processorUrl] - Override processor URL (optional)
18
+ * @param {string} [wasmUrl] - Override WASM URL (optional)
19
+ * @returns {Promise<void>}
20
+ */
21
+ init(processorUrl?: string, wasmUrl?: string): Promise<void>;
22
+ }
23
+ /**
24
+ * Pre-configured AdlMidiCore for nuked slim profile.
25
+ *
26
+ * @example
27
+ * ```javascript
28
+ * import { AdlMidiCore } from 'libadlmidi-js/nuked.slim/core';
29
+ *
30
+ * const synth = await AdlMidiCore.create(); // No paths needed!
31
+ * synth.init(44100);
32
+ * synth.noteOn(0, 60, 100);
33
+ * const samples = synth.generate(4096);
34
+ * ```
35
+ */
36
+ export class AdlMidiCore {
37
+ /**
38
+ * Create a new AdlMidiCore instance with this profile's WASM.
39
+ *
40
+ * @param {{corePath?: string}} [options] - Options (corePath is pre-configured)
41
+ * @returns {Promise<BaseAdlMidiCore>}
42
+ */
43
+ static create(options?: {
44
+ corePath?: string;
45
+ }): Promise<BaseAdlMidiCore>;
46
+ }
47
+ import { AdlMidi as BaseAdlMidi } from '../libadlmidi.js';
48
+ import { AdlMidiCore as BaseAdlMidiCore } from '../core.js';
49
+ export { encodeInstrument, decodeInstrument, defaultInstrument, encodeOperator, decodeOperator, defaultOperator } from "../utils/struct.js";
@@ -0,0 +1,209 @@
1
+ /**
2
+ * @typedef {Object} Operator
3
+ * @property {boolean} am - Amplitude modulation (tremolo)
4
+ * @property {boolean} vibrato - Vibrato (frequency modulation)
5
+ * @property {boolean} sustaining - Sustaining (EG type)
6
+ * @property {boolean} ksr - Key scale rate
7
+ * @property {number} freqMult - Frequency multiplier (0-15)
8
+ * @property {number} keyScaleLevel - Key scale level (0-3)
9
+ * @property {number} totalLevel - Total level / attenuation (0-63, 0 = loudest)
10
+ * @property {number} attack - Attack rate (0-15)
11
+ * @property {number} decay - Decay rate (0-15)
12
+ * @property {number} sustain - Sustain level (0-15, 0 = loudest)
13
+ * @property {number} release - Release rate (0-15)
14
+ * @property {number} waveform - Waveform select (0-7)
15
+ */
16
+ /**
17
+ * Decode an OPL3 operator from raw register bytes to named properties
18
+ * @param {Uint8Array | number[]} bytes - 5 bytes of operator register data
19
+ * @returns {Operator} Decoded operator with named properties
20
+ */
21
+ export function decodeOperator(bytes: Uint8Array | number[]): Operator;
22
+ /**
23
+ * Encode named operator properties to raw register bytes
24
+ * @param {Operator} op - Operator with named properties
25
+ * @returns {Uint8Array} 5 bytes of operator register data
26
+ */
27
+ export function encodeOperator(op: Operator): Uint8Array;
28
+ /**
29
+ * Default operator values (silent)
30
+ * @returns {Operator} A silent operator configuration
31
+ */
32
+ export function defaultOperator(): Operator;
33
+ /**
34
+ * Complete OPL3 instrument definition
35
+ * @typedef {Object} Instrument
36
+ * @property {number} [version] - Instrument version
37
+ * @property {number} [noteOffset1] - Note offset for voice 1
38
+ * @property {number} [noteOffset2] - Note offset for voice 2
39
+ * @property {number} [velocityOffset] - MIDI velocity offset
40
+ * @property {number} [secondVoiceDetune] - Detune for second voice
41
+ * @property {number} [percussionKey] - Percussion key number
42
+ * @property {boolean} [is4op] - 4-operator mode enabled
43
+ * @property {boolean} [isPseudo4op] - Pseudo 4-op (two 2-op voices)
44
+ * @property {boolean} [isBlank] - Blank/unused instrument
45
+ * @property {number} [rhythmMode] - Rhythm mode (0-7)
46
+ * @property {number} [feedback1] - Feedback for voice 1 (0-7)
47
+ * @property {number} [connection1] - Connection type for voice 1 (0-1)
48
+ * @property {number} [feedback2] - Feedback for voice 2 (0-7)
49
+ * @property {number} [connection2] - Connection type for voice 2 (0-1)
50
+ * @property {[Operator, Operator, Operator, Operator]} operators - Four operators
51
+ * @property {number} [delayOnMs] - Delay before note-on (ms)
52
+ * @property {number} [delayOffMs] - Delay before note-off (ms)
53
+ */
54
+ /**
55
+ * Decode an ADL_Instrument from raw bytes to JS object
56
+ * @param {Uint8Array} bytes - 40 bytes of instrument data
57
+ * @returns {Instrument} Decoded instrument with named properties
58
+ */
59
+ export function decodeInstrument(bytes: Uint8Array): Instrument;
60
+ /**
61
+ * Encode a JS instrument object to raw bytes
62
+ * @param {Instrument} inst - Instrument with named properties
63
+ * @returns {Uint8Array} 40 bytes of instrument data
64
+ */
65
+ export function encodeInstrument(inst: Instrument): Uint8Array;
66
+ /**
67
+ * Default instrument values (blank/silent)
68
+ * @returns {Instrument} A blank instrument configuration
69
+ */
70
+ export function defaultInstrument(): Instrument;
71
+ /**
72
+ * OPL3 struct serialization utilities
73
+ * Shared between processor and tests
74
+ *
75
+ * @module utils/struct
76
+ */
77
+ /** Size of ADL_Operator struct (5 register bytes) */
78
+ export const SIZEOF_ADL_OPERATOR: 5;
79
+ /** Size of ADL_Instrument struct */
80
+ export const SIZEOF_ADL_INSTRUMENT: 40;
81
+ /** Size of ADL_Bank struct (3 pointers × 4 bytes in 32-bit WASM) */
82
+ export const SIZEOF_ADL_BANK: 12;
83
+ /** Size of ADL_BankId struct (3 bytes + padding) */
84
+ export const SIZEOF_ADL_BANK_ID: 4;
85
+ /** Offset where operators start within ADL_Instrument */
86
+ export const OPERATOR_OFFSET: 14;
87
+ export type Operator = {
88
+ /**
89
+ * - Amplitude modulation (tremolo)
90
+ */
91
+ am: boolean;
92
+ /**
93
+ * - Vibrato (frequency modulation)
94
+ */
95
+ vibrato: boolean;
96
+ /**
97
+ * - Sustaining (EG type)
98
+ */
99
+ sustaining: boolean;
100
+ /**
101
+ * - Key scale rate
102
+ */
103
+ ksr: boolean;
104
+ /**
105
+ * - Frequency multiplier (0-15)
106
+ */
107
+ freqMult: number;
108
+ /**
109
+ * - Key scale level (0-3)
110
+ */
111
+ keyScaleLevel: number;
112
+ /**
113
+ * - Total level / attenuation (0-63, 0 = loudest)
114
+ */
115
+ totalLevel: number;
116
+ /**
117
+ * - Attack rate (0-15)
118
+ */
119
+ attack: number;
120
+ /**
121
+ * - Decay rate (0-15)
122
+ */
123
+ decay: number;
124
+ /**
125
+ * - Sustain level (0-15, 0 = loudest)
126
+ */
127
+ sustain: number;
128
+ /**
129
+ * - Release rate (0-15)
130
+ */
131
+ release: number;
132
+ /**
133
+ * - Waveform select (0-7)
134
+ */
135
+ waveform: number;
136
+ };
137
+ /**
138
+ * Complete OPL3 instrument definition
139
+ */
140
+ export type Instrument = {
141
+ /**
142
+ * - Instrument version
143
+ */
144
+ version?: number | undefined;
145
+ /**
146
+ * - Note offset for voice 1
147
+ */
148
+ noteOffset1?: number | undefined;
149
+ /**
150
+ * - Note offset for voice 2
151
+ */
152
+ noteOffset2?: number | undefined;
153
+ /**
154
+ * - MIDI velocity offset
155
+ */
156
+ velocityOffset?: number | undefined;
157
+ /**
158
+ * - Detune for second voice
159
+ */
160
+ secondVoiceDetune?: number | undefined;
161
+ /**
162
+ * - Percussion key number
163
+ */
164
+ percussionKey?: number | undefined;
165
+ /**
166
+ * - 4-operator mode enabled
167
+ */
168
+ is4op?: boolean | undefined;
169
+ /**
170
+ * - Pseudo 4-op (two 2-op voices)
171
+ */
172
+ isPseudo4op?: boolean | undefined;
173
+ /**
174
+ * - Blank/unused instrument
175
+ */
176
+ isBlank?: boolean | undefined;
177
+ /**
178
+ * - Rhythm mode (0-7)
179
+ */
180
+ rhythmMode?: number | undefined;
181
+ /**
182
+ * - Feedback for voice 1 (0-7)
183
+ */
184
+ feedback1?: number | undefined;
185
+ /**
186
+ * - Connection type for voice 1 (0-1)
187
+ */
188
+ connection1?: number | undefined;
189
+ /**
190
+ * - Feedback for voice 2 (0-7)
191
+ */
192
+ feedback2?: number | undefined;
193
+ /**
194
+ * - Connection type for voice 2 (0-1)
195
+ */
196
+ connection2?: number | undefined;
197
+ /**
198
+ * - Four operators
199
+ */
200
+ operators: [Operator, Operator, Operator, Operator];
201
+ /**
202
+ * - Delay before note-on (ms)
203
+ */
204
+ delayOnMs?: number | undefined;
205
+ /**
206
+ * - Delay before note-off (ms)
207
+ */
208
+ delayOffMs?: number | undefined;
209
+ };