@marmooo/midy 0.4.7 → 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 +6 -2
- package/esm/midy-GM1.d.ts +25 -2
- package/esm/midy-GM1.d.ts.map +1 -1
- package/esm/midy-GM1.js +97 -16
- package/esm/midy-GM2.d.ts +39 -3
- package/esm/midy-GM2.d.ts.map +1 -1
- package/esm/midy-GM2.js +176 -39
- package/esm/midy-GMLite.d.ts +23 -2
- package/esm/midy-GMLite.d.ts.map +1 -1
- package/esm/midy-GMLite.js +85 -15
- package/esm/midy.d.ts +41 -3
- package/esm/midy.d.ts.map +1 -1
- package/esm/midy.js +212 -51
- package/package.json +1 -1
- package/script/midy-GM1.d.ts +25 -2
- package/script/midy-GM1.d.ts.map +1 -1
- package/script/midy-GM1.js +97 -16
- package/script/midy-GM2.d.ts +39 -3
- package/script/midy-GM2.d.ts.map +1 -1
- package/script/midy-GM2.js +176 -39
- package/script/midy-GMLite.d.ts +23 -2
- package/script/midy-GMLite.d.ts.map +1 -1
- package/script/midy-GMLite.js +85 -15
- package/script/midy.d.ts +41 -3
- package/script/midy.d.ts.map +1 -1
- package/script/midy.js +212 -51
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
|
|
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:
|
|
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):
|
|
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
|
package/esm/midy-GM1.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"midy-GM1.d.ts","sourceRoot":"","sources":["../src/midy-GM1.js"],"names":[],"mappings":"
|
|
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
|
|
486
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
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;
|
|
@@ -237,6 +236,7 @@ export class MidyGM2 extends EventTarget {
|
|
|
237
236
|
updatePortamento(channel: any, scheduleTime: any): void;
|
|
238
237
|
setPortamentoTime(channelNumber: any, value: any, scheduleTime: any): void;
|
|
239
238
|
setVolume(channelNumber: any, value: any, scheduleTime: any): void;
|
|
239
|
+
applyVolume(channel: any, scheduleTime: any): void;
|
|
240
240
|
panToGain(pan: any): {
|
|
241
241
|
gainLeft: number;
|
|
242
242
|
gainRight: number;
|
|
@@ -320,7 +320,9 @@ export class MidyGM2 extends EventTarget {
|
|
|
320
320
|
getLFOAmplitudeDepth(channel: any): number;
|
|
321
321
|
createEffectHandlers(): any[];
|
|
322
322
|
setControlChangeEffects(channel: any, note: any, scheduleTime: any): void;
|
|
323
|
+
setChannelPressureEffects(channel: any, note: any, scheduleTime: any): void;
|
|
323
324
|
setPressureEffects(channel: any, note: any, tableName: any, scheduleTime: any): void;
|
|
325
|
+
handleChannelPressureSysEx(data: any, scheduleTime: any): void;
|
|
324
326
|
handlePressureSysEx(data: any, tableName: any, scheduleTime: any): void;
|
|
325
327
|
handleControlChangeSysEx(data: any, scheduleTime: any): void;
|
|
326
328
|
getKeyBasedValue(channel: any, keyNumber: any, controllerType: any): any;
|
|
@@ -329,4 +331,38 @@ export class MidyGM2 extends EventTarget {
|
|
|
329
331
|
handleSysEx(data: any, scheduleTime: any): void;
|
|
330
332
|
scheduleTask(callback: any, scheduleTime: any): Promise<any>;
|
|
331
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 {};
|
|
332
368
|
//# sourceMappingURL=midy-GM2.d.ts.map
|
package/esm/midy-GM2.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"midy-GM2.d.ts","sourceRoot":"","sources":["../src/midy-GM2.js"],"names":[],"mappings":"
|
|
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
|
|
644
|
-
|
|
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 () => {
|
|
@@ -1857,7 +1994,7 @@ export class MidyGM2 extends EventTarget {
|
|
|
1857
1994
|
const next = this.calcChannelPressureEffectValue(channel, 0);
|
|
1858
1995
|
channel.detune += next - prev;
|
|
1859
1996
|
this.processActiveNotes(channel, scheduleTime, (note) => {
|
|
1860
|
-
this.
|
|
1997
|
+
this.setChannelPressureEffects(channel, note, scheduleTime);
|
|
1861
1998
|
});
|
|
1862
1999
|
this.applyVoiceParams(channel, 13, scheduleTime);
|
|
1863
2000
|
}
|
|
@@ -2213,6 +2350,9 @@ export class MidyGM2 extends EventTarget {
|
|
|
2213
2350
|
scheduleTime = this.audioContext.currentTime;
|
|
2214
2351
|
const channel = this.channels[channelNumber];
|
|
2215
2352
|
channel.state.volumeMSB = value / 127;
|
|
2353
|
+
this.applyVolume(channel, scheduleTime);
|
|
2354
|
+
}
|
|
2355
|
+
applyVolume(channel, scheduleTime) {
|
|
2216
2356
|
if (channel.isDrum) {
|
|
2217
2357
|
for (let i = 0; i < 128; i++) {
|
|
2218
2358
|
this.updateKeyBasedVolume(channel, i, scheduleTime);
|
|
@@ -2527,10 +2667,8 @@ export class MidyGM2 extends EventTarget {
|
|
|
2527
2667
|
state[key] = defaultValue;
|
|
2528
2668
|
}
|
|
2529
2669
|
}
|
|
2530
|
-
|
|
2531
|
-
|
|
2532
|
-
}
|
|
2533
|
-
this.resetChannelTable(channel);
|
|
2670
|
+
channel.reset(this.constructor.channelSettings);
|
|
2671
|
+
channel.resetTable();
|
|
2534
2672
|
this.mode = "GM2";
|
|
2535
2673
|
this.masterFineTuning = 0; // cent
|
|
2536
2674
|
this.masterCoarseTuning = 0; // cent
|
|
@@ -2668,7 +2806,7 @@ export class MidyGM2 extends EventTarget {
|
|
|
2668
2806
|
case 9:
|
|
2669
2807
|
switch (data[3]) {
|
|
2670
2808
|
case 1: // https://amei.or.jp/midistandardcommittee/Recommended_Practice/e/ca22.pdf
|
|
2671
|
-
return this.
|
|
2809
|
+
return this.handleChannelPressureSysEx(data, scheduelTime);
|
|
2672
2810
|
case 3: // https://amei.or.jp/midistandardcommittee/Recommended_Practice/e/ca22.pdf
|
|
2673
2811
|
return this.handleControlChangeSysEx(data, scheduleTime);
|
|
2674
2812
|
default:
|
|
@@ -3020,14 +3158,7 @@ export class MidyGM2 extends EventTarget {
|
|
|
3020
3158
|
this.setFilterEnvelope(channel, note, scheduleTime);
|
|
3021
3159
|
}
|
|
3022
3160
|
};
|
|
3023
|
-
handlers[2] = (channel, note, scheduleTime) =>
|
|
3024
|
-
if (0.5 <= channel.state.portamemento && 0 <= note.portamentoNoteNumber) {
|
|
3025
|
-
this.setPortamentoVolumeEnvelope(channel, note, scheduleTime);
|
|
3026
|
-
}
|
|
3027
|
-
else {
|
|
3028
|
-
this.setVolumeEnvelope(channel, note, scheduleTime);
|
|
3029
|
-
}
|
|
3030
|
-
};
|
|
3161
|
+
handlers[2] = (channel, note, scheduleTime) => this.applyVolume(channel, note, scheduleTime);
|
|
3031
3162
|
handlers[3] = (channel, note, scheduleTime) => this.setModLfoToPitch(channel, note, scheduleTime);
|
|
3032
3163
|
handlers[4] = (channel, note, scheduleTime) => this.setModLfoToFilterFc(channel, note, scheduleTime);
|
|
3033
3164
|
handlers[5] = (channel, note, scheduleTime) => this.setModLfoToVolume(channel, note, scheduleTime);
|
|
@@ -3043,6 +3174,9 @@ export class MidyGM2 extends EventTarget {
|
|
|
3043
3174
|
handlers[i](channel, note, scheduleTime);
|
|
3044
3175
|
}
|
|
3045
3176
|
}
|
|
3177
|
+
setChannelPressureEffects(channel, note, scheduleTime) {
|
|
3178
|
+
this.setPressureEffects(channel, note, "channelPressureTable", scheduleTime);
|
|
3179
|
+
}
|
|
3046
3180
|
setPressureEffects(channel, note, tableName, scheduleTime) {
|
|
3047
3181
|
const handlers = this.effectHandlers;
|
|
3048
3182
|
const table = channel[tableName];
|
|
@@ -3054,6 +3188,9 @@ export class MidyGM2 extends EventTarget {
|
|
|
3054
3188
|
handlers[i](channel, note, scheduleTime);
|
|
3055
3189
|
}
|
|
3056
3190
|
}
|
|
3191
|
+
handleChannelPressureSysEx(data, scheduleTime) {
|
|
3192
|
+
this.handlePressureSysEx(data, "channelPressureTable", scheduleTime);
|
|
3193
|
+
}
|
|
3057
3194
|
handlePressureSysEx(data, tableName, scheduleTime) {
|
|
3058
3195
|
const channelNumber = data[4];
|
|
3059
3196
|
const channel = this.channels[channelNumber];
|
package/esm/midy-GMLite.d.ts
CHANGED
|
@@ -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:
|
|
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):
|
|
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
|
package/esm/midy-GMLite.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"midy-GMLite.d.ts","sourceRoot":"","sources":["../src/midy-GMLite.js"],"names":[],"mappings":"
|
|
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"}
|