@marmooo/midy 0.4.8 → 0.4.9

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.
package/README.md CHANGED
@@ -24,10 +24,14 @@ This library provides several files depending on the implementation level.
24
24
  - [Humidy](https://marmooo.github.io/humidy/) - GM2 MIDI mixer app
25
25
  - [Timidy](https://marmooo.github.io/timidy/) - Timidity++ style MIDI player
26
26
  - [4x4pad](https://marmooo.github.io/4x4pad/) - 4x4 grid MPE MIDI controller
27
- - [Celltone](https://marmooo.github.io/celltone/) - Grid MPE MIDI controller with
28
- Janko-Piano layout
27
+ - [Celltone](https://marmooo.github.io/celltone/) - Grid MPE MIDI controller
28
+ with Janko-Piano layout
29
29
  - [Isotone](https://marmooo.github.io/isotone/) - Grid MPE MIDI controller
30
30
  optimized for chords
31
+ - [Hexatone](https://marmooo.github.io/hexatone/) - Hexagonal MPE MIDI
32
+ controller with Wicki-Hayden layout
33
+ - [Chromatone](https://marmooo.github.io/chromatone/) - Hexagonal MPE MIDI
34
+ controller optimized for glissando
31
35
 
32
36
  ## Support Status
33
37
 
package/esm/midy-GM1.d.ts CHANGED
@@ -61,7 +61,7 @@ export class MidyGM1 extends EventTarget {
61
61
  detune: (channel: any, note: any, scheduleTime: any) => void;
62
62
  };
63
63
  controlChangeHandlers: any[];
64
- channels: any[];
64
+ channels: Channel[];
65
65
  addSoundFont(soundFont: any): void;
66
66
  toUint8Array(input: any): Promise<Uint8Array<ArrayBuffer>>;
67
67
  loadSoundFont(input: any): Promise<void>;
@@ -73,7 +73,7 @@ export class MidyGM1 extends EventTarget {
73
73
  gainR: any;
74
74
  merger: any;
75
75
  };
76
- createChannels(audioContext: any): any[];
76
+ createChannels(audioContext: any): Channel[];
77
77
  decodeOggVorbis(sample: any): Promise<any>;
78
78
  createAudioBuffer(voiceParams: any): Promise<any>;
79
79
  createBufferSource(voiceParams: any, audioBuffer: any): any;
@@ -189,4 +189,27 @@ export class MidyGM1 extends EventTarget {
189
189
  handleSysEx(data: any, scheduleTime: any): void;
190
190
  scheduleTask(callback: any, scheduleTime: any): Promise<any>;
191
191
  }
192
+ declare class Channel {
193
+ constructor(audioNodes: any, settings: any);
194
+ isDrum: boolean;
195
+ programNumber: number;
196
+ scheduleIndex: number;
197
+ detune: number;
198
+ dataMSB: number;
199
+ dataLSB: number;
200
+ rpnMSB: number;
201
+ rpnLSB: number;
202
+ modulationDepthRange: number;
203
+ fineTuning: number;
204
+ coarseTuning: number;
205
+ scheduledNotes: any[];
206
+ sustainNotes: any[];
207
+ currentBufferSource: null;
208
+ state: ControllerState;
209
+ resetSettings(settings: any): void;
210
+ }
211
+ declare class ControllerState {
212
+ array: Float32Array<ArrayBuffer>;
213
+ }
214
+ export {};
192
215
  //# sourceMappingURL=midy-GM1.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"midy-GM1.d.ts","sourceRoot":"","sources":["../src/midy-GM1.js"],"names":[],"mappings":"AAmHA;IAsCE;;;;;;;;;;;MAWE;IAEF,+BAgBC;IA9DD,gCAAgC;IAChC,aAAa;IACb,oBAAiB;IACjB,qBAAmB;IACnB,kBAAc;IACd,0BAAwB;IACxB,kBAAc;IACd,mBAAiB;IACjB,kBAAc;IACd,mBAAe;IACf,kBAAgB;IAChB,0BAAuD;IACvD,4BAAyB;IACzB,0BAAuB;IACvB,kCAA+B;IAC/B,qBAAqC;IACrC,4BAAiC;IACjC,mBAAkB;IAClB,mBAAkB;IAClB,kBAAiB;IACjB,oBAAmB;IACnB,mBAAkB;IAClB,iCAEG;IACH,cAAU;IACV,cAAa;IACb,iBAAY;IACZ,gBAAc;IACd,oBAAkB;IAClB,sBAAwB;IACxB,2BAAqC;IAiBnC,kBAAgC;IAChC,kBAA8C;IAC9C,eAAwD;IACxD,qBAGE;IACF,uBAAmD;IACnD;;;;;;;;;;;;MAA2D;IAC3D,6BAA+D;IAC/D,gBAAiD;IAMnD,mCASC;IAED,2DAYC;IAED,yCAmBC;IAED,oCASC;IAED,sBA6BC;IAED,8DAeC;IAED;;;;MAeC;IAED,yCAaC;IAED,2CAsBC;IAED,kDA6BC;IAED,4DASC;IAED,gEAsDC;IAED,mCASC;IAED,uBAUC;IAED,yDAqCC;IAED,2BA0EC;IAED,uDAEC;IAED,wDAEC;IAED,qCAKC;IAED;;;MAwDC;IAED,kGAeC;IAED,mGAeC;IAED,wEAQC;IAED,uBAMC;IAED,sBAIC;IAED,uBAMC;IAED,wBAIC;IAED,0BAKC;IAED,8BAMC;IAED,wBAYC;IAED,sBAIC;IAED,kEAWC;IAED,kFAYC;IAED,8BAEC;IAED,8BAEC;IAED,4BAEC;IAED,qCAMC;IAED,2DAIC;IAED,6CAEC;IAED,sDAeC;IAED,4DASC;IAED,qDAkBC;IAED,6CAIC;IAED,sDA6BC;IAED,kEAqBC;IAED,4GAkCC;IAED,uEAyCC;IAED,0EAiBC;IAED,oEASC;IAED,0FAwBC;IAED,gCASC;IAED,iEAwBC;IAED,4FAmBC;IAED,6CAUC;IAED,qDAUC;IAED,qFAeC;IAED,+BAmBC;IAED,kDAOC;IAED,sFA2BC;IAED,mFAGC;IAED,wFAGC;IAED,sEAUC;IAED,mEAYC;IAED,wDAKC;IAED,sDAOC;IAED,mDAMC;IAED,kDAKC;IAED;;;;;;;;;;;;MAoCC;IAED,oFAMC;IAED,6EA2BC;IAED,qCAeC;IAED,+FAYC;IAED,wDAUC;IAED,4EAKC;IAED,mEAKC;IAED;;;MAMC;IAED,gEAKC;IAED,uEAKC;IAED,sEAGC;IAED,2DAUC;IAED,yEAWC;IAED,kFAeC;IAED,2DAMC;IAED,uDAoBC;IAED,gDAEC;IAED,gDAEC;IAED,sEAGC;IAED,qEAKC;IAED,2EAUC;IAED,iEAMC;IAED,uEAQC;IAED,mEAKC;IAED,yEAQC;IAED,gFAGC;IAED,6CAqBC;IAGD,8EAgCC;IAED,gFAGC;IAED,+EAgBC;IAED,qCAUC;IAED,4EAaC;IAED,4DAGC;IAED,qDAKC;IAED,gDAYC;IAGD,6DAgBC;CACF"}
1
+ {"version":3,"file":"midy-GM1.d.ts","sourceRoot":"","sources":["../src/midy-GM1.js"],"names":[],"mappings":"AA8IA;IAsCE;;;;;;;;;;;MAWE;IAEF,+BAgBC;IA9DD,gCAAgC;IAChC,aAAa;IACb,oBAAiB;IACjB,qBAAmB;IACnB,kBAAc;IACd,0BAAwB;IACxB,kBAAc;IACd,mBAAiB;IACjB,kBAAc;IACd,mBAAe;IACf,kBAAgB;IAChB,0BAAuD;IACvD,4BAAyB;IACzB,0BAAuB;IACvB,kCAA+B;IAC/B,qBAAqC;IACrC,4BAAiC;IACjC,mBAAkB;IAClB,mBAAkB;IAClB,kBAAiB;IACjB,oBAAmB;IACnB,mBAAkB;IAClB,iCAEG;IACH,cAAU;IACV,cAAa;IACb,iBAAY;IACZ,gBAAc;IACd,oBAAkB;IAClB,sBAAwB;IACxB,2BAAqC;IAiBnC,kBAAgC;IAChC,kBAA8C;IAC9C,eAAwD;IACxD,qBAGE;IACF,uBAAmD;IACnD;;;;;;;;;;;;MAA2D;IAC3D,6BAA+D;IAC/D,oBAAiD;IAMnD,mCASC;IAED,2DAYC;IAED,yCAmBC;IAED,oCASC;IAED,sBA6BC;IAED,8DAeC;IAED;;;;MAeC;IAED,6CAMC;IAED,2CAsBC;IAED,kDA6BC;IAED,4DASC;IAED,gEAsDC;IAED,mCASC;IAED,uBASC;IAED,yDAqCC;IAED,2BA0EC;IAED,uDAEC;IAED,wDAEC;IAED,qCAKC;IAED;;;MAwDC;IAED,kGAeC;IAED,mGAeC;IAED,wEAQC;IAED,uBAMC;IAED,sBAIC;IAED,uBAMC;IAED,wBAIC;IAED,0BAKC;IAED,8BAMC;IAED,wBAYC;IAED,sBAIC;IAED,kEAWC;IAED,kFAYC;IAED,8BAEC;IAED,8BAEC;IAED,4BAEC;IAED,qCAMC;IAED,2DAIC;IAED,6CAEC;IAED,sDAeC;IAED,4DASC;IAED,qDAkBC;IAED,6CAIC;IAED,sDA6BC;IAED,kEAqBC;IAED,4GAkCC;IAED,uEAyCC;IAED,0EAiBC;IAED,oEASC;IAED,0FAwBC;IAED,gCASC;IAED,iEAwBC;IAED,4FAmBC;IAED,6CAUC;IAED,qDAUC;IAED,qFAeC;IAED,+BAmBC;IAED,kDAOC;IAED,sFA2BC;IAED,mFAGC;IAED,wFAGC;IAED,sEAUC;IAED,mEAYC;IAED,wDAKC;IAED,sDAOC;IAED,mDAMC;IAED,kDAKC;IAED;;;;;;;;;;;;MAoCC;IAED,oFAMC;IAED,6EA2BC;IAED,qCAeC;IAED,+FAYC;IAED,wDAUC;IAED,4EAKC;IAED,mEAKC;IAED;;;MAMC;IAED,gEAKC;IAED,uEAKC;IAED,sEAGC;IAED,2DAUC;IAED,yEAWC;IAED,kFAeC;IAED,2DAMC;IAED,uDAoBC;IAED,gDAEC;IAED,gDAEC;IAED,sEAGC;IAED,qEAKC;IAED,2EAUC;IAED,iEAMC;IAED,uEAQC;IAED,mEAKC;IAED,yEAQC;IAED,gFAGC;IAED,6CAmBC;IAGD,8EAgCC;IAED,gFAGC;IAED,+EAgBC;IAED,qCAUC;IAED,4EAaC;IAED,4DAGC;IAED,qDAKC;IAED,gDAYC;IAGD,6DAgBC;CACF;AAvrDD;IAgBE,4CAIC;IAnBD,gBAAe;IACf,sBAAkB;IAClB,sBAAkB;IAClB,eAAW;IACX,gBAAY;IACZ,gBAAY;IACZ,eAAa;IACb,eAAa;IACb,6BAA0B;IAC1B,mBAAe;IACf,qBAAiB;IACjB,sBAAoB;IACpB,oBAAkB;IAClB,0BAA2B;IAKzB,uBAAkC;IAGpC,mCAEC;CACF;AAuBD;IACE,iCAA8B;CAa/B"}
package/esm/midy-GM1.js CHANGED
@@ -92,6 +92,100 @@ class Note {
92
92
  });
93
93
  }
94
94
  }
95
+ class Channel {
96
+ constructor(audioNodes, settings) {
97
+ Object.defineProperty(this, "isDrum", {
98
+ enumerable: true,
99
+ configurable: true,
100
+ writable: true,
101
+ value: false
102
+ });
103
+ Object.defineProperty(this, "programNumber", {
104
+ enumerable: true,
105
+ configurable: true,
106
+ writable: true,
107
+ value: 0
108
+ });
109
+ Object.defineProperty(this, "scheduleIndex", {
110
+ enumerable: true,
111
+ configurable: true,
112
+ writable: true,
113
+ value: 0
114
+ });
115
+ Object.defineProperty(this, "detune", {
116
+ enumerable: true,
117
+ configurable: true,
118
+ writable: true,
119
+ value: 0
120
+ });
121
+ Object.defineProperty(this, "dataMSB", {
122
+ enumerable: true,
123
+ configurable: true,
124
+ writable: true,
125
+ value: 0
126
+ });
127
+ Object.defineProperty(this, "dataLSB", {
128
+ enumerable: true,
129
+ configurable: true,
130
+ writable: true,
131
+ value: 0
132
+ });
133
+ Object.defineProperty(this, "rpnMSB", {
134
+ enumerable: true,
135
+ configurable: true,
136
+ writable: true,
137
+ value: 127
138
+ });
139
+ Object.defineProperty(this, "rpnLSB", {
140
+ enumerable: true,
141
+ configurable: true,
142
+ writable: true,
143
+ value: 127
144
+ });
145
+ Object.defineProperty(this, "modulationDepthRange", {
146
+ enumerable: true,
147
+ configurable: true,
148
+ writable: true,
149
+ value: 50
150
+ }); // cent
151
+ Object.defineProperty(this, "fineTuning", {
152
+ enumerable: true,
153
+ configurable: true,
154
+ writable: true,
155
+ value: 0
156
+ }); // cent
157
+ Object.defineProperty(this, "coarseTuning", {
158
+ enumerable: true,
159
+ configurable: true,
160
+ writable: true,
161
+ value: 0
162
+ }); // cent
163
+ Object.defineProperty(this, "scheduledNotes", {
164
+ enumerable: true,
165
+ configurable: true,
166
+ writable: true,
167
+ value: []
168
+ });
169
+ Object.defineProperty(this, "sustainNotes", {
170
+ enumerable: true,
171
+ configurable: true,
172
+ writable: true,
173
+ value: []
174
+ });
175
+ Object.defineProperty(this, "currentBufferSource", {
176
+ enumerable: true,
177
+ configurable: true,
178
+ writable: true,
179
+ value: null
180
+ });
181
+ Object.assign(this, audioNodes);
182
+ Object.assign(this, settings);
183
+ this.state = new ControllerState();
184
+ }
185
+ resetSettings(settings) {
186
+ Object.assign(this, settings);
187
+ }
188
+ }
95
189
  // normalized to 0-1 for use with the SF2 modulator model
96
190
  const defaultControllerState = {
97
191
  noteOnVelocity: { type: 2, defaultValue: 0 },
@@ -482,18 +576,8 @@ export class MidyGM1 extends EventTarget {
482
576
  };
483
577
  }
484
578
  createChannels(audioContext) {
485
- const channels = Array.from({ length: this.numChannels }, () => {
486
- return {
487
- currentBufferSource: null,
488
- isDrum: false,
489
- state: new ControllerState(),
490
- ...this.constructor.channelSettings,
491
- ...this.createChannelAudioNodes(audioContext),
492
- scheduledNotes: [],
493
- sustainNotes: [],
494
- };
495
- });
496
- return channels;
579
+ const settings = this.constructor.channelSettings;
580
+ return Array.from({ length: this.numChannels }, () => new Channel(this.createChannelAudioNodes(audioContext), settings));
497
581
  }
498
582
  decodeOggVorbis(sample) {
499
583
  const task = decoderQueue.then(async () => {
@@ -605,7 +689,6 @@ export class MidyGM1 extends EventTarget {
605
689
  }
606
690
  resetAllStates() {
607
691
  this.exclusiveClassNotes.fill(undefined);
608
- this.drumExclusiveClassNotes.fill(undefined);
609
692
  this.voiceCache.clear();
610
693
  this.realtimeVoiceCache.clear();
611
694
  const channels = this.channels;
@@ -1626,9 +1709,7 @@ export class MidyGM1 extends EventTarget {
1626
1709
  state[key] = defaultValue;
1627
1710
  }
1628
1711
  }
1629
- for (const key of Object.keys(this.constructor.channelSettings)) {
1630
- channel[key] = this.constructor.channelSettings[key];
1631
- }
1712
+ channel.resetSettings(this.constructor.channelSettings);
1632
1713
  this.mode = "GM1";
1633
1714
  }
1634
1715
  // https://amei.or.jp/midistandardcommittee/Recommended_Practice/e/rp15.pdf
package/esm/midy-GM2.d.ts CHANGED
@@ -82,7 +82,7 @@ export class MidyGM2 extends EventTarget {
82
82
  controlChangeHandlers: any[];
83
83
  keyBasedControllerHandlers: any[];
84
84
  effectHandlers: any[];
85
- channels: any[];
85
+ channels: Channel[];
86
86
  reverbEffect: {
87
87
  input: any;
88
88
  output: any;
@@ -107,8 +107,7 @@ export class MidyGM2 extends EventTarget {
107
107
  gainR: any;
108
108
  merger: any;
109
109
  };
110
- resetChannelTable(channel: any): void;
111
- createChannels(audioContext: any): any[];
110
+ createChannels(audioContext: any): Channel[];
112
111
  decodeOggVorbis(sample: any): Promise<any>;
113
112
  createAudioBuffer(voiceParams: any): Promise<any>;
114
113
  isLoopDrum(channel: any, noteNumber: any): boolean;
@@ -332,4 +331,38 @@ export class MidyGM2 extends EventTarget {
332
331
  handleSysEx(data: any, scheduleTime: any): void;
333
332
  scheduleTask(callback: any, scheduleTime: any): Promise<any>;
334
333
  }
334
+ declare class Channel {
335
+ constructor(audioNodes: any, settings: any);
336
+ isDrum: boolean;
337
+ programNumber: number;
338
+ scheduleIndex: number;
339
+ detune: number;
340
+ bankMSB: number;
341
+ bankLSB: number;
342
+ dataMSB: number;
343
+ dataLSB: number;
344
+ rpnMSB: number;
345
+ rpnLSB: number;
346
+ mono: boolean;
347
+ modulationDepthRange: number;
348
+ fineTuning: number;
349
+ coarseTuning: number;
350
+ scheduledNotes: any[];
351
+ sustainNotes: any[];
352
+ sostenutoNotes: any[];
353
+ controlTable: Int8Array<ArrayBuffer>;
354
+ scaleOctaveTuningTable: Int8Array<ArrayBuffer>;
355
+ channelPressureTable: Int8Array<ArrayBuffer>;
356
+ keyBasedTable: Int8Array<ArrayBuffer>;
357
+ keyBasedGainLs: any[];
358
+ keyBasedGainRs: any[];
359
+ currentBufferSource: null;
360
+ state: ControllerState;
361
+ resetSettings(settings: any): void;
362
+ resetTable(): void;
363
+ }
364
+ declare class ControllerState {
365
+ array: Float32Array<ArrayBuffer>;
366
+ }
367
+ export {};
335
368
  //# sourceMappingURL=midy-GM2.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"midy-GM2.d.ts","sourceRoot":"","sources":["../src/midy-GM2.js"],"names":[],"mappings":"AAwLA;IAwDE;;;;;;;;;;;;;;MAcE;IAEF,+BAsBC;IAzFD,gCAAgC;IAChC,aAAa;IACb,yBAAqB;IACrB,2BAAuB;IACvB;;;;MAIE;IACF;;;;;;MAME;IACF,oBAAiB;IACjB,qBAAmB;IACnB,kBAAc;IACd,0BAAsB;IACtB,+BAA6B;IAC7B,0BAAwB;IACxB,kBAAc;IACd,mBAAiB;IACjB,kBAAc;IACd,mBAAe;IACf,kBAAgB;IAChB,0BAAuD;IACvD,4BAAyB;IACzB,0BAAuB;IACvB,kCAA+B;IAC/B,qBAAqC;IACrC,mBAAkB;IAClB,mBAAkB;IAClB,kBAAiB;IACjB,oBAAmB;IACnB,mBAAkB;IAClB,iCAEG;IACH,cAAU;IACV,cAAa;IACb,iBAAY;IACZ,gBAAc;IACd,oBAAkB;IAClB,sBAAwB;IACxB,2BAAqC;IACrC,+BAEE;IAoBA,kBAAgC;IAChC,kBAA8C;IAC9C,eAAwD;IACxD,qBAGE;IACF,uBAAmD;IACnD;;;;;;;;;;;;MAA2D;IAC3D,6BAA+D;IAC/D,kCAAyE;IACzE,sBAAiD;IACjD,gBAAiD;IACjD;;;kBAAyD;IACzD;;;;;;;;MAAyD;IAQ3D,mCASC;IAED,2DAYC;IAED,yCAmBC;IAED,oCASC;IAED,sBAoCC;IAED,8DAeC;IAED;;;;MAeC;IAED,sCAKC;IAED,yCAqBC;IAED,2CAsBC;IAED,kDA6BC;IAED,mDAIC;IAED,2FAWC;IAED,gEAyDC;IAED,mCASC;IAED,uBAUC;IAED,yDAqCC;IAED,2BAoFC;IAED,uDAEC;IAED,wDAEC;IAED,qCAMC;IAED;;;MAqFC;IAED,kGAeC;IAED,mGAeC;IAED,wEAQC;IAED,uBAMC;IAED,sBAIC;IAED,uBAMC;IAED,wBAIC;IAED,0BAKC;IAED,8BAMC;IAED,wBAYC;IAED,sBAIC;IAED,kEAWC;IAED,kFAYC;IAED,kFAuBC;IAED;;;;MASC;IAED,gFAUC;IAED,mFAYC;IAED,sGAcC;IAID;;;MA8BC;IAED;;;kBA6BC;IAED;;;;;;;;MA0CC;IAED,8BAEC;IAED,8BAEC;IAED,4BAEC;IAED,qCAWC;IAED,2DAQC;IAED,oDAEC;IAED,6CAIC;IAED,mDAIC;IAED,2CAoDC;IAED,8EASC;IAED,oEAgBC;IAED,sEASC;IAED,4DASC;IAED,6EAOC;IAED,qDAkBC;IAED,6CAIC;IAED,8EAmBC;IAED,oEA+BC;IAED,kEAqBC;IAED,+DAeC;IAED,4GAkCC;IAED,uEAkEC;IAED,0EAiBC;IAED,8EAoBC;IAED,oEAuBC;IAED,0FAuBC;IAED,gCAmBC;IAED,iEAwBC;IAED,4FA2BC;IAED,6CAUC;IAED,qDAUC;IAED,qFAeC;IAED,uFAkBC;IAED,+BAuBC;IAED,kDAOC;IAED,sBAEC;IAED,mFAcC;IAED,4EAYC;IAED,wFAGC;IAED,sEAWC;IAED,mEAaC;IAED,mEAYC;IAED,sEAMC;IAED,oEAQC;IAED,gEAyBC;IAED,gEAyBC;IAED,gCAKC;IAED,kDAKC;IAED,8CAOC;IAED,gEAMC;IAED;;;;;;;;;;;;MAwDC;IAED,oFAOC;IAED,6EA+BC;IAED,qCA2BC;IAED,+FAeC;IAED,+CAEC;IAED,wDAUC;IAED,4EAMC;IAED,wDAeC;IAED,2EAMC;IAED,mEAKC;IAED,mDAQC;IAED;;;MAMC;IAED,gEAWC;IAED,uEAKC;IAED,+CAEC;IAED,sEAGC;IAED,2DAWC;IAED,4EAoBC;IAED,yEAYC;IAED,+CAEC;IAED,uEAMC;IAED,2EAcC;IAED,oDAEC;IAED,0EAeC;IAED,sFAQC;IAED,sFAQC;IAED,kFAeC;IAED,2DAMC;IAED,uDAuBC;IAED,gDAEC;IAED,gDAEC;IAED,sEAGC;IAED,qEAKC;IAED,2EAWC;IAED,iEAMC;IAED,uEASC;IAED,mEAKC;IAED,yEASC;IAED,2EAKC;IAED,iFAMC;IAED,gFAGC;IAED,6CAwBC;IAGD,8EAoCC;IAED,gFAGC;IAED,iEAEC;IAED,gEAEC;IAED,gEAIC;IAED,gEAIC;IAED,+EAgCC;IAED,qCAaC;IAED,qCAaC;IAED,4EAwCC;IAED,4DAGC;IAED,qDAKC;IAED,gEAIC;IAED,yDAYC;IAED,kEAGC;IAED,2DAYC;IAED,sEAeC;IAED,4CAOC;IAED,+BAIC;IAED,qDAiBC;IAED,gCAGC;IAED,kCAEC;IA6BD,4CAEC;IAED,+DAaC;IAED,kDAiBC;IAED,2GAKC;IAED,sDAIC;IAED,qCAEC;IAED,uDAMC;IAED,sCAEC;IAED,uDASC;IAED,sCAEC;IAED,2DAqBC;IAED,0CAEC;IAED,mCAeC;IAED,2FAgBC;IAED,wDAEC;IAED,+DAGC;IAED,qEASC;IAED,uEAOC;IAED,6CAEC;IAED,iDAEC;IAED,6CAEC;IAED,iDAEC;IAED,uCAEC;IAED,wCAEC;IAED,2CAEC;IAED,8BAyBC;IAED,0EAQC;IAED,4EAOC;IAED,qFASC;IAED,+DAEC;IAED,wEAcC;IAED,6DAiBC;IAED,yEAIC;IAED,0CAmBC;IAED,yEAcC;IAED,gDAYC;IAGD,6DAgBC;CACF"}
1
+ {"version":3,"file":"midy-GM2.d.ts","sourceRoot":"","sources":["../src/midy-GM2.js"],"names":[],"mappings":"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"}
package/esm/midy-GM2.js CHANGED
@@ -122,6 +122,166 @@ class Note {
122
122
  });
123
123
  }
124
124
  }
125
+ class Channel {
126
+ constructor(audioNodes, settings) {
127
+ Object.defineProperty(this, "isDrum", {
128
+ enumerable: true,
129
+ configurable: true,
130
+ writable: true,
131
+ value: false
132
+ });
133
+ Object.defineProperty(this, "programNumber", {
134
+ enumerable: true,
135
+ configurable: true,
136
+ writable: true,
137
+ value: 0
138
+ });
139
+ Object.defineProperty(this, "scheduleIndex", {
140
+ enumerable: true,
141
+ configurable: true,
142
+ writable: true,
143
+ value: 0
144
+ });
145
+ Object.defineProperty(this, "detune", {
146
+ enumerable: true,
147
+ configurable: true,
148
+ writable: true,
149
+ value: 0
150
+ });
151
+ Object.defineProperty(this, "bankMSB", {
152
+ enumerable: true,
153
+ configurable: true,
154
+ writable: true,
155
+ value: 121
156
+ });
157
+ Object.defineProperty(this, "bankLSB", {
158
+ enumerable: true,
159
+ configurable: true,
160
+ writable: true,
161
+ value: 0
162
+ });
163
+ Object.defineProperty(this, "dataMSB", {
164
+ enumerable: true,
165
+ configurable: true,
166
+ writable: true,
167
+ value: 0
168
+ });
169
+ Object.defineProperty(this, "dataLSB", {
170
+ enumerable: true,
171
+ configurable: true,
172
+ writable: true,
173
+ value: 0
174
+ });
175
+ Object.defineProperty(this, "rpnMSB", {
176
+ enumerable: true,
177
+ configurable: true,
178
+ writable: true,
179
+ value: 127
180
+ });
181
+ Object.defineProperty(this, "rpnLSB", {
182
+ enumerable: true,
183
+ configurable: true,
184
+ writable: true,
185
+ value: 127
186
+ });
187
+ Object.defineProperty(this, "mono", {
188
+ enumerable: true,
189
+ configurable: true,
190
+ writable: true,
191
+ value: false
192
+ }); // CC#124, CC#125
193
+ Object.defineProperty(this, "modulationDepthRange", {
194
+ enumerable: true,
195
+ configurable: true,
196
+ writable: true,
197
+ value: 50
198
+ }); // cent
199
+ Object.defineProperty(this, "fineTuning", {
200
+ enumerable: true,
201
+ configurable: true,
202
+ writable: true,
203
+ value: 0
204
+ }); // cent
205
+ Object.defineProperty(this, "coarseTuning", {
206
+ enumerable: true,
207
+ configurable: true,
208
+ writable: true,
209
+ value: 0
210
+ }); // cent
211
+ Object.defineProperty(this, "scheduledNotes", {
212
+ enumerable: true,
213
+ configurable: true,
214
+ writable: true,
215
+ value: []
216
+ });
217
+ Object.defineProperty(this, "sustainNotes", {
218
+ enumerable: true,
219
+ configurable: true,
220
+ writable: true,
221
+ value: []
222
+ });
223
+ Object.defineProperty(this, "sostenutoNotes", {
224
+ enumerable: true,
225
+ configurable: true,
226
+ writable: true,
227
+ value: []
228
+ });
229
+ Object.defineProperty(this, "controlTable", {
230
+ enumerable: true,
231
+ configurable: true,
232
+ writable: true,
233
+ value: new Int8Array(defaultControlValues)
234
+ });
235
+ Object.defineProperty(this, "scaleOctaveTuningTable", {
236
+ enumerable: true,
237
+ configurable: true,
238
+ writable: true,
239
+ value: new Int8Array(12)
240
+ }); // [-64, 63] cent
241
+ Object.defineProperty(this, "channelPressureTable", {
242
+ enumerable: true,
243
+ configurable: true,
244
+ writable: true,
245
+ value: new Int8Array(defaultPressureValues)
246
+ });
247
+ Object.defineProperty(this, "keyBasedTable", {
248
+ enumerable: true,
249
+ configurable: true,
250
+ writable: true,
251
+ value: new Int8Array(128 * 128).fill(-1)
252
+ });
253
+ Object.defineProperty(this, "keyBasedGainLs", {
254
+ enumerable: true,
255
+ configurable: true,
256
+ writable: true,
257
+ value: new Array(128)
258
+ });
259
+ Object.defineProperty(this, "keyBasedGainRs", {
260
+ enumerable: true,
261
+ configurable: true,
262
+ writable: true,
263
+ value: new Array(128)
264
+ });
265
+ Object.defineProperty(this, "currentBufferSource", {
266
+ enumerable: true,
267
+ configurable: true,
268
+ writable: true,
269
+ value: null
270
+ });
271
+ Object.assign(this, audioNodes);
272
+ Object.assign(this, settings);
273
+ this.state = new ControllerState();
274
+ }
275
+ resetSettings(settings) {
276
+ Object.assign(this, settings);
277
+ }
278
+ resetTable() {
279
+ this.controlTable.set(defaultControlValues);
280
+ this.scaleOctaveTuningTable.fill(0); // [-100, 100] cent
281
+ this.channelPressureTable.set(defaultPressureValues);
282
+ this.keyBasedTable.fill(-1);
283
+ }
284
+ }
125
285
  const drumExclusiveClassesByKit = new Array(57);
126
286
  const drumExclusiveClassCount = 10;
127
287
  const standardSet = new Uint8Array(128);
@@ -633,32 +793,9 @@ export class MidyGM2 extends EventTarget {
633
793
  merger,
634
794
  };
635
795
  }
636
- resetChannelTable(channel) {
637
- channel.controlTable.set(defaultControlValues);
638
- channel.scaleOctaveTuningTable.fill(0); // [-100, 100] cent
639
- channel.channelPressureTable.set(defaultPressureValues);
640
- channel.keyBasedTable.fill(-1);
641
- }
642
796
  createChannels(audioContext) {
643
- const channels = Array.from({ length: this.numChannels }, () => {
644
- return {
645
- currentBufferSource: null,
646
- isDrum: false,
647
- state: new ControllerState(),
648
- ...this.constructor.channelSettings,
649
- ...this.createChannelAudioNodes(audioContext),
650
- scheduledNotes: [],
651
- sustainNotes: [],
652
- sostenutoNotes: [],
653
- controlTable: new Int8Array(defaultControlValues),
654
- scaleOctaveTuningTable: new Int8Array(12), // [-64, 63] cent
655
- channelPressureTable: new Int8Array(defaultPressureValues),
656
- keyBasedTable: new Int8Array(128 * 128).fill(-1),
657
- keyBasedGainLs: new Array(128),
658
- keyBasedGainRs: new Array(128),
659
- };
660
- });
661
- return channels;
797
+ const settings = this.constructor.channelSettings;
798
+ return Array.from({ length: this.numChannels }, () => new Channel(this.createChannelAudioNodes(audioContext), settings));
662
799
  }
663
800
  decodeOggVorbis(sample) {
664
801
  const task = decoderQueue.then(async () => {
@@ -2530,10 +2667,8 @@ export class MidyGM2 extends EventTarget {
2530
2667
  state[key] = defaultValue;
2531
2668
  }
2532
2669
  }
2533
- for (const key of Object.keys(this.constructor.channelSettings)) {
2534
- channel[key] = this.constructor.channelSettings[key];
2535
- }
2536
- this.resetChannelTable(channel);
2670
+ channel.reset(this.constructor.channelSettings);
2671
+ channel.resetTable();
2537
2672
  this.mode = "GM2";
2538
2673
  this.masterFineTuning = 0; // cent
2539
2674
  this.masterCoarseTuning = 0; // cent
@@ -59,7 +59,7 @@ export class MidyGMLite extends EventTarget {
59
59
  detune: (channel: any, note: any, scheduleTime: any) => void;
60
60
  };
61
61
  controlChangeHandlers: any[];
62
- channels: any[];
62
+ channels: Channel[];
63
63
  addSoundFont(soundFont: any): void;
64
64
  toUint8Array(input: any): Promise<Uint8Array<ArrayBuffer>>;
65
65
  loadSoundFont(input: any): Promise<void>;
@@ -71,7 +71,7 @@ export class MidyGMLite extends EventTarget {
71
71
  gainR: any;
72
72
  merger: any;
73
73
  };
74
- createChannels(audioContext: any): any[];
74
+ createChannels(audioContext: any): Channel[];
75
75
  decodeOggVorbis(sample: any): Promise<any>;
76
76
  createAudioBuffer(voiceParams: any): Promise<any>;
77
77
  createBufferSource(channel: any, voiceParams: any, audioBuffer: any): any;
@@ -183,4 +183,25 @@ export class MidyGMLite extends EventTarget {
183
183
  handleSysEx(data: any, scheduleTime: any): void;
184
184
  scheduleTask(callback: any, scheduleTime: any): Promise<any>;
185
185
  }
186
+ declare class Channel {
187
+ constructor(audioNodes: any, settings: any);
188
+ isDrum: boolean;
189
+ programNumber: number;
190
+ scheduleIndex: number;
191
+ detune: number;
192
+ dataMSB: number;
193
+ dataLSB: number;
194
+ rpnMSB: number;
195
+ rpnLSB: number;
196
+ modulationDepthRange: number;
197
+ scheduledNotes: any[];
198
+ sustainNotes: any[];
199
+ currentBufferSource: null;
200
+ state: ControllerState;
201
+ resetSettings(settings: any): void;
202
+ }
203
+ declare class ControllerState {
204
+ array: Float32Array<ArrayBuffer>;
205
+ }
206
+ export {};
186
207
  //# sourceMappingURL=midy-GMLite.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"midy-GMLite.d.ts","sourceRoot":"","sources":["../src/midy-GMLite.js"],"names":[],"mappings":"AAiIA;IAwCE;;;;;;;;;MASE;IAEF,+BAgBC;IA9DD,gCAAgC;IAChC,aAAa;IACb,oBAAiB;IACjB,qBAAmB;IACnB,kBAAc;IACd,0BAAwB;IACxB,kBAAc;IACd,mBAAiB;IACjB,kBAAc;IACd,mBAAe;IACf,kBAAgB;IAChB,0BAAuD;IACvD,4BAAyB;IACzB,0BAAuB;IACvB,kCAA+B;IAC/B,qBAAqC;IACrC,mBAAkB;IAClB,mBAAkB;IAClB,kBAAiB;IACjB,oBAAmB;IACnB,mBAAkB;IAClB,iCAEG;IACH,cAAU;IACV,cAAa;IACb,iBAAY;IACZ,gBAAc;IACd,oBAAkB;IAClB,sBAAwB;IACxB,2BAAqC;IACrC,+BAEE;IAeA,kBAAgC;IAChC,kBAA8C;IAC9C,eAAwD;IACxD,qBAGE;IACF,uBAAmD;IACnD;;;;;;;;;;;;MAA2D;IAC3D,6BAA+D;IAC/D,gBAAiD;IAMnD,mCASC;IAED,2DAYC;IAED,yCAmBC;IAED,oCASC;IAED,sBA6BC;IAED,8DAeC;IAED;;;;MAeC;IAED,yCAaC;IAED,2CAsBC;IAED,kDA6BC;IAED,0EAUC;IAED,gEAsDC;IAED,mCASC;IAED,uBAUC;IAED,yDAqCC;IAED,2BA0EC;IAED,uDAEC;IAED,wDAEC;IAED,qCAKC;IAED;;;MAwDC;IAED,kGAeC;IAED,mGAeC;IAED,wEAQC;IAED,uBAMC;IAED,sBAIC;IAED,uBAMC;IAED,wBAIC;IAED,0BAKC;IAED,8BAMC;IAED,wBAYC;IAED,sBAIC;IAED,kEAWC;IAED,kFAYC;IAED,8BAEC;IAED,8BAEC;IAED,4BAEC;IAED,wCAIC;IAED,2DAIC;IAED,6CAEC;IAED,sDAeC;IAED,4DASC;IAED,qDAkBC;IAED,6CAIC;IAED,sDA6BC;IAED,kEAqBC;IAED,4GAkCC;IAED,uEA6CC;IAED,0EAiBC;IAED,8EAiBC;IAED,oEAUC;IAED,0FAwBC;IAED,gCASC;IAED,iEAwBC;IAED,4FAsBC;IAED,6CAUC;IAED,qDAUC;IAED,qFAeC;IAED,+BAmBC;IAED,kDAOC;IAED,sFA2BC;IAED,mFAGC;IAED,wFAGC;IAED,sEAUC;IAED,mEAYC;IAED,wDAKC;IAED,sDAOC;IAED,mDAMC;IAED,kDAKC;IAED;;;;;;;;;;;;MAoCC;IAED,oFAMC;IAED,6EA2BC;IAED,qCAeC;IAED,+FAYC;IAED,wDAUC;IAED,4EAKC;IAED,mEAKC;IAED;;;MAMC;IAED,gEAKC;IAED,uEAKC;IAED,sEAGC;IAED,2DAUC;IAED,yEAWC;IAED,kFAeC;IAED,uDAcC;IAED,gDAEC;IAED,gDAEC;IAED,sEAGC;IAED,qEAKC;IAED,2EAUC;IAED,gFAGC;IAED,6CAqBC;IAGD,8EAgCC;IAED,gFAGC;IAED,+EAgBC;IAED,qCAUC;IAED,4EAaC;IAED,4DAGC;IAED,qDAKC;IAED,gDAYC;IAGD,6DAgBC;CACF"}
1
+ {"version":3,"file":"midy-GMLite.d.ts","sourceRoot":"","sources":["../src/midy-GMLite.js"],"names":[],"mappings":"AA0JA;IAwCE;;;;;;;;;MASE;IAEF,+BAgBC;IA9DD,gCAAgC;IAChC,aAAa;IACb,oBAAiB;IACjB,qBAAmB;IACnB,kBAAc;IACd,0BAAwB;IACxB,kBAAc;IACd,mBAAiB;IACjB,kBAAc;IACd,mBAAe;IACf,kBAAgB;IAChB,0BAAuD;IACvD,4BAAyB;IACzB,0BAAuB;IACvB,kCAA+B;IAC/B,qBAAqC;IACrC,mBAAkB;IAClB,mBAAkB;IAClB,kBAAiB;IACjB,oBAAmB;IACnB,mBAAkB;IAClB,iCAEG;IACH,cAAU;IACV,cAAa;IACb,iBAAY;IACZ,gBAAc;IACd,oBAAkB;IAClB,sBAAwB;IACxB,2BAAqC;IACrC,+BAEE;IAeA,kBAAgC;IAChC,kBAA8C;IAC9C,eAAwD;IACxD,qBAGE;IACF,uBAAmD;IACnD;;;;;;;;;;;;MAA2D;IAC3D,6BAA+D;IAC/D,oBAAiD;IAMnD,mCASC;IAED,2DAYC;IAED,yCAmBC;IAED,oCASC;IAED,sBA6BC;IAED,8DAeC;IAED;;;;MAeC;IAED,6CAMC;IAED,2CAsBC;IAED,kDA6BC;IAED,0EAUC;IAED,gEAsDC;IAED,mCASC;IAED,uBAUC;IAED,yDAqCC;IAED,2BA0EC;IAED,uDAEC;IAED,wDAEC;IAED,qCAKC;IAED;;;MAwDC;IAED,kGAeC;IAED,mGAeC;IAED,wEAQC;IAED,uBAMC;IAED,sBAIC;IAED,uBAMC;IAED,wBAIC;IAED,0BAKC;IAED,8BAMC;IAED,wBAYC;IAED,sBAIC;IAED,kEAWC;IAED,kFAYC;IAED,8BAEC;IAED,8BAEC;IAED,4BAEC;IAED,wCAIC;IAED,2DAIC;IAED,6CAEC;IAED,sDAeC;IAED,4DASC;IAED,qDAkBC;IAED,6CAIC;IAED,sDA6BC;IAED,kEAqBC;IAED,4GAkCC;IAED,uEA6CC;IAED,0EAiBC;IAED,8EAiBC;IAED,oEAUC;IAED,0FAwBC;IAED,gCASC;IAED,iEAwBC;IAED,4FAsBC;IAED,6CAUC;IAED,qDAUC;IAED,qFAeC;IAED,+BAmBC;IAED,kDAOC;IAED,sFA2BC;IAED,mFAGC;IAED,wFAGC;IAED,sEAUC;IAED,mEAYC;IAED,wDAKC;IAED,sDAOC;IAED,mDAMC;IAED,kDAKC;IAED;;;;;;;;;;;;MAoCC;IAED,oFAMC;IAED,6EA2BC;IAED,qCAeC;IAED,+FAYC;IAED,wDAUC;IAED,4EAKC;IAED,mEAKC;IAED;;;MAMC;IAED,gEAKC;IAED,uEAKC;IAED,sEAGC;IAED,2DAUC;IAED,yEAWC;IAED,kFAeC;IAED,uDAcC;IAED,gDAEC;IAED,gDAEC;IAED,sEAGC;IAED,qEAKC;IAED,2EAUC;IAED,gFAGC;IAED,6CAmBC;IAGD,8EAgCC;IAED,gFAGC;IAED,+EAgBC;IAED,qCAUC;IAED,4EAaC;IAED,4DAGC;IAED,qDAKC;IAED,gDAYC;IAGD,6DAgBC;CACF;AA7qDD;IAcE,4CAIC;IAjBD,gBAAe;IACf,sBAAkB;IAClB,sBAAkB;IAClB,eAAW;IACX,gBAAY;IACZ,gBAAY;IACZ,eAAa;IACb,eAAa;IACb,6BAA0B;IAC1B,sBAAoB;IACpB,oBAAkB;IAClB,0BAA2B;IAKzB,uBAAkC;IAGpC,mCAEC;CACF;AAqCD;IACE,iCAA8B;CAa/B"}
@@ -92,6 +92,88 @@ class Note {
92
92
  });
93
93
  }
94
94
  }
95
+ class Channel {
96
+ constructor(audioNodes, settings) {
97
+ Object.defineProperty(this, "isDrum", {
98
+ enumerable: true,
99
+ configurable: true,
100
+ writable: true,
101
+ value: false
102
+ });
103
+ Object.defineProperty(this, "programNumber", {
104
+ enumerable: true,
105
+ configurable: true,
106
+ writable: true,
107
+ value: 0
108
+ });
109
+ Object.defineProperty(this, "scheduleIndex", {
110
+ enumerable: true,
111
+ configurable: true,
112
+ writable: true,
113
+ value: 0
114
+ });
115
+ Object.defineProperty(this, "detune", {
116
+ enumerable: true,
117
+ configurable: true,
118
+ writable: true,
119
+ value: 0
120
+ });
121
+ Object.defineProperty(this, "dataMSB", {
122
+ enumerable: true,
123
+ configurable: true,
124
+ writable: true,
125
+ value: 0
126
+ });
127
+ Object.defineProperty(this, "dataLSB", {
128
+ enumerable: true,
129
+ configurable: true,
130
+ writable: true,
131
+ value: 0
132
+ });
133
+ Object.defineProperty(this, "rpnMSB", {
134
+ enumerable: true,
135
+ configurable: true,
136
+ writable: true,
137
+ value: 127
138
+ });
139
+ Object.defineProperty(this, "rpnLSB", {
140
+ enumerable: true,
141
+ configurable: true,
142
+ writable: true,
143
+ value: 127
144
+ });
145
+ Object.defineProperty(this, "modulationDepthRange", {
146
+ enumerable: true,
147
+ configurable: true,
148
+ writable: true,
149
+ value: 50
150
+ }); // cent
151
+ Object.defineProperty(this, "scheduledNotes", {
152
+ enumerable: true,
153
+ configurable: true,
154
+ writable: true,
155
+ value: []
156
+ });
157
+ Object.defineProperty(this, "sustainNotes", {
158
+ enumerable: true,
159
+ configurable: true,
160
+ writable: true,
161
+ value: []
162
+ });
163
+ Object.defineProperty(this, "currentBufferSource", {
164
+ enumerable: true,
165
+ configurable: true,
166
+ writable: true,
167
+ value: null
168
+ });
169
+ Object.assign(this, audioNodes);
170
+ Object.assign(this, settings);
171
+ this.state = new ControllerState();
172
+ }
173
+ resetSettings(settings) {
174
+ Object.assign(this, settings);
175
+ }
176
+ }
95
177
  const drumExclusiveClasses = new Uint8Array(128);
96
178
  drumExclusiveClasses[42] = 1;
97
179
  drumExclusiveClasses[44] = 1;
@@ -495,18 +577,8 @@ export class MidyGMLite extends EventTarget {
495
577
  };
496
578
  }
497
579
  createChannels(audioContext) {
498
- const channels = Array.from({ length: this.numChannels }, () => {
499
- return {
500
- currentBufferSource: null,
501
- isDrum: false,
502
- state: new ControllerState(),
503
- ...this.constructor.channelSettings,
504
- ...this.createChannelAudioNodes(audioContext),
505
- scheduledNotes: [],
506
- sustainNotes: [],
507
- };
508
- });
509
- return channels;
580
+ const settings = this.constructor.channelSettings;
581
+ return Array.from({ length: this.numChannels }, () => new Channel(this.createChannelAudioNodes(audioContext), settings));
510
582
  }
511
583
  decodeOggVorbis(sample) {
512
584
  const task = decoderQueue.then(async () => {
@@ -1612,9 +1684,7 @@ export class MidyGMLite extends EventTarget {
1612
1684
  state[key] = defaultValue;
1613
1685
  }
1614
1686
  }
1615
- for (const key of Object.keys(this.constructor.channelSettings)) {
1616
- channel[key] = this.constructor.channelSettings[key];
1617
- }
1687
+ channel.resetSettings(this.constructor.channelSettings);
1618
1688
  this.mode = "GM1";
1619
1689
  }
1620
1690
  // https://amei.or.jp/midistandardcommittee/Recommended_Practice/e/rp15.pdf