@marmooo/midy 0.2.2 → 0.2.4
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 +3 -5
- package/esm/midy-GM1.d.ts +5 -4
- package/esm/midy-GM1.d.ts.map +1 -1
- package/esm/midy-GM1.js +31 -25
- package/esm/midy-GM2.d.ts +19 -22
- package/esm/midy-GM2.d.ts.map +1 -1
- package/esm/midy-GM2.js +148 -119
- package/esm/midy-GMLite.d.ts +6 -5
- package/esm/midy-GMLite.d.ts.map +1 -1
- package/esm/midy-GMLite.js +28 -21
- package/esm/midy.d.ts +21 -22
- package/esm/midy.d.ts.map +1 -1
- package/esm/midy.js +229 -139
- package/package.json +1 -1
- package/script/midy-GM1.d.ts +5 -4
- package/script/midy-GM1.d.ts.map +1 -1
- package/script/midy-GM1.js +31 -25
- package/script/midy-GM2.d.ts +19 -22
- package/script/midy-GM2.d.ts.map +1 -1
- package/script/midy-GM2.js +148 -119
- package/script/midy-GMLite.d.ts +6 -5
- package/script/midy-GMLite.d.ts.map +1 -1
- package/script/midy-GMLite.js +28 -21
- package/script/midy.d.ts +21 -22
- package/script/midy.d.ts.map +1 -1
- package/script/midy.js +229 -139
package/script/midy-GMLite.js
CHANGED
|
@@ -224,11 +224,11 @@ class MidyGMLite {
|
|
|
224
224
|
value: new Map()
|
|
225
225
|
});
|
|
226
226
|
this.audioContext = audioContext;
|
|
227
|
-
this.
|
|
227
|
+
this.masterVolume = new GainNode(audioContext);
|
|
228
228
|
this.voiceParamsHandlers = this.createVoiceParamsHandlers();
|
|
229
229
|
this.controlChangeHandlers = this.createControlChangeHandlers();
|
|
230
230
|
this.channels = this.createChannels(audioContext);
|
|
231
|
-
this.
|
|
231
|
+
this.masterVolume.connect(audioContext.destination);
|
|
232
232
|
this.GM1SystemOn();
|
|
233
233
|
}
|
|
234
234
|
initSoundFontTable() {
|
|
@@ -274,7 +274,7 @@ class MidyGMLite {
|
|
|
274
274
|
const merger = new ChannelMergerNode(audioContext, { numberOfInputs: 2 });
|
|
275
275
|
gainL.connect(merger, 0, 0);
|
|
276
276
|
gainR.connect(merger, 0, 1);
|
|
277
|
-
merger.connect(this.
|
|
277
|
+
merger.connect(this.masterVolume);
|
|
278
278
|
return {
|
|
279
279
|
gainL,
|
|
280
280
|
gainR,
|
|
@@ -598,19 +598,22 @@ class MidyGMLite {
|
|
|
598
598
|
const pitchWheelSensitivity = channel.state.pitchWheelSensitivity * 12800;
|
|
599
599
|
return pitchWheel * pitchWheelSensitivity;
|
|
600
600
|
}
|
|
601
|
-
|
|
602
|
-
const now = this.audioContext.currentTime;
|
|
601
|
+
updateChannelDetune(channel) {
|
|
603
602
|
channel.scheduledNotes.forEach((noteList) => {
|
|
604
603
|
for (let i = 0; i < noteList.length; i++) {
|
|
605
604
|
const note = noteList[i];
|
|
606
605
|
if (!note)
|
|
607
606
|
continue;
|
|
608
|
-
note
|
|
609
|
-
.cancelScheduledValues(now)
|
|
610
|
-
.setValueAtTime(channel.detune, now);
|
|
607
|
+
this.updateDetune(channel, note);
|
|
611
608
|
}
|
|
612
609
|
});
|
|
613
610
|
}
|
|
611
|
+
updateDetune(channel, note) {
|
|
612
|
+
const now = this.audioContext.currentTime;
|
|
613
|
+
note.bufferSource.detune
|
|
614
|
+
.cancelScheduledValues(now)
|
|
615
|
+
.setValueAtTime(channel.detune, now);
|
|
616
|
+
}
|
|
614
617
|
setVolumeEnvelope(note) {
|
|
615
618
|
const now = this.audioContext.currentTime;
|
|
616
619
|
const { voiceParams, startTime } = note;
|
|
@@ -859,7 +862,7 @@ class MidyGMLite {
|
|
|
859
862
|
const next = (value - 8192) / 8192;
|
|
860
863
|
state.pitchWheel = value / 16383;
|
|
861
864
|
channel.detune += (next - prev) * state.pitchWheelSensitivity * 12800;
|
|
862
|
-
this.
|
|
865
|
+
this.updateChannelDetune(channel);
|
|
863
866
|
this.applyVoiceParams(channel, 14);
|
|
864
867
|
}
|
|
865
868
|
setModLfoToPitch(channel, note) {
|
|
@@ -916,7 +919,7 @@ class MidyGMLite {
|
|
|
916
919
|
if (0 < channel.state.modulationDepth)
|
|
917
920
|
this.setModLfoToFilterFc(note);
|
|
918
921
|
},
|
|
919
|
-
modLfoToVolume: (channel, note) => {
|
|
922
|
+
modLfoToVolume: (channel, note, _prevValue) => {
|
|
920
923
|
if (0 < channel.state.modulationDepth)
|
|
921
924
|
this.setModLfoToVolume(note);
|
|
922
925
|
},
|
|
@@ -963,7 +966,7 @@ class MidyGMLite {
|
|
|
963
966
|
if (key in voiceParams)
|
|
964
967
|
noteVoiceParams[key] = voiceParams[key];
|
|
965
968
|
}
|
|
966
|
-
this.setFilterEnvelope(
|
|
969
|
+
this.setFilterEnvelope(note);
|
|
967
970
|
this.setPitchEnvelope(note);
|
|
968
971
|
}
|
|
969
972
|
else if (volumeEnvelopeKeySet.has(key)) {
|
|
@@ -1002,6 +1005,8 @@ class MidyGMLite {
|
|
|
1002
1005
|
const handler = this.controlChangeHandlers[controllerType];
|
|
1003
1006
|
if (handler) {
|
|
1004
1007
|
handler.call(this, channelNumber, value);
|
|
1008
|
+
const channel = this.channels[channelNumber];
|
|
1009
|
+
this.applyVoiceParams(channel, controllerType + 128);
|
|
1005
1010
|
}
|
|
1006
1011
|
else {
|
|
1007
1012
|
console.warn(`Unsupported Control change: controllerType=${controllerType} value=${value}`);
|
|
@@ -1009,13 +1014,14 @@ class MidyGMLite {
|
|
|
1009
1014
|
}
|
|
1010
1015
|
updateModulation(channel) {
|
|
1011
1016
|
const now = this.audioContext.currentTime;
|
|
1017
|
+
const depth = channel.state.modulationDepth * channel.modulationDepthRange;
|
|
1012
1018
|
channel.scheduledNotes.forEach((noteList) => {
|
|
1013
1019
|
for (let i = 0; i < noteList.length; i++) {
|
|
1014
1020
|
const note = noteList[i];
|
|
1015
1021
|
if (!note)
|
|
1016
1022
|
continue;
|
|
1017
1023
|
if (note.modulationDepth) {
|
|
1018
|
-
note.modulationDepth.gain.setValueAtTime(
|
|
1024
|
+
note.modulationDepth.gain.setValueAtTime(depth, now);
|
|
1019
1025
|
}
|
|
1020
1026
|
else {
|
|
1021
1027
|
this.setPitchEnvelope(note);
|
|
@@ -1026,8 +1032,7 @@ class MidyGMLite {
|
|
|
1026
1032
|
}
|
|
1027
1033
|
setModulationDepth(channelNumber, modulation) {
|
|
1028
1034
|
const channel = this.channels[channelNumber];
|
|
1029
|
-
channel.state.modulationDepth =
|
|
1030
|
-
channel.modulationDepthRange;
|
|
1035
|
+
channel.state.modulationDepth = modulation / 127;
|
|
1031
1036
|
this.updateModulation(channel);
|
|
1032
1037
|
}
|
|
1033
1038
|
setVolume(channelNumber, volume) {
|
|
@@ -1119,12 +1124,14 @@ class MidyGMLite {
|
|
|
1119
1124
|
const pitchBendRange = channel.dataMSB + channel.dataLSB / 100;
|
|
1120
1125
|
this.setPitchBendRange(channelNumber, pitchBendRange);
|
|
1121
1126
|
}
|
|
1122
|
-
setPitchBendRange(channelNumber,
|
|
1127
|
+
setPitchBendRange(channelNumber, value) {
|
|
1123
1128
|
const channel = this.channels[channelNumber];
|
|
1124
1129
|
const state = channel.state;
|
|
1125
|
-
|
|
1126
|
-
const
|
|
1127
|
-
|
|
1130
|
+
const prev = state.pitchWheelSensitivity;
|
|
1131
|
+
const next = value / 128;
|
|
1132
|
+
state.pitchWheelSensitivity = next;
|
|
1133
|
+
channel.detune += (state.pitchWheel * 2 - 1) * (next - prev) * 12800;
|
|
1134
|
+
this.updateChannelDetune(channel);
|
|
1128
1135
|
this.applyVoiceParams(channel, 16);
|
|
1129
1136
|
}
|
|
1130
1137
|
allSoundOff(channelNumber) {
|
|
@@ -1141,7 +1148,7 @@ class MidyGMLite {
|
|
|
1141
1148
|
const state = channel.state;
|
|
1142
1149
|
for (let i = 0; i < stateTypes.length; i++) {
|
|
1143
1150
|
const type = stateTypes[i];
|
|
1144
|
-
state[type] = defaultControllerState[type];
|
|
1151
|
+
state[type] = defaultControllerState[type].defaultValue;
|
|
1145
1152
|
}
|
|
1146
1153
|
const settingTypes = [
|
|
1147
1154
|
"rpnMSB",
|
|
@@ -1203,8 +1210,8 @@ class MidyGMLite {
|
|
|
1203
1210
|
}
|
|
1204
1211
|
else {
|
|
1205
1212
|
const now = this.audioContext.currentTime;
|
|
1206
|
-
this.
|
|
1207
|
-
this.
|
|
1213
|
+
this.masterVolume.gain.cancelScheduledValues(now);
|
|
1214
|
+
this.masterVolume.gain.setValueAtTime(volume * volume, now);
|
|
1208
1215
|
}
|
|
1209
1216
|
}
|
|
1210
1217
|
handleExclusiveMessage(data) {
|
package/script/midy.d.ts
CHANGED
|
@@ -3,7 +3,8 @@ export class Midy {
|
|
|
3
3
|
currentBufferSource: null;
|
|
4
4
|
detune: number;
|
|
5
5
|
scaleOctaveTuningTable: any[];
|
|
6
|
-
|
|
6
|
+
channelPressureTable: Uint8Array<ArrayBuffer>;
|
|
7
|
+
polyphonicKeyPressureTable: Uint8Array<ArrayBuffer>;
|
|
7
8
|
keyBasedInstrumentControlTable: Int8Array<ArrayBuffer>;
|
|
8
9
|
program: number;
|
|
9
10
|
bank: number;
|
|
@@ -17,14 +18,6 @@ export class Midy {
|
|
|
17
18
|
coarseTuning: number;
|
|
18
19
|
modulationDepthRange: number;
|
|
19
20
|
};
|
|
20
|
-
static controllerDestinationSettings: {
|
|
21
|
-
pitchControl: number;
|
|
22
|
-
filterCutoffControl: number;
|
|
23
|
-
amplitudeControl: number;
|
|
24
|
-
lfoPitchDepth: number;
|
|
25
|
-
lfoFilterDepth: number;
|
|
26
|
-
lfoAmplitudeDepth: number;
|
|
27
|
-
};
|
|
28
21
|
constructor(audioContext: any, options?: {
|
|
29
22
|
reverbAlgorithm: (audioContext: any) => {
|
|
30
23
|
input: any;
|
|
@@ -77,12 +70,12 @@ export class Midy {
|
|
|
77
70
|
output: any;
|
|
78
71
|
};
|
|
79
72
|
};
|
|
80
|
-
|
|
73
|
+
masterVolume: any;
|
|
81
74
|
voiceParamsHandlers: {
|
|
82
75
|
modLfoToPitch: (channel: any, note: any, _prevValue: any) => void;
|
|
83
76
|
vibLfoToPitch: (channel: any, note: any, _prevValue: any) => void;
|
|
84
77
|
modLfoToFilterFc: (channel: any, note: any, _prevValue: any) => void;
|
|
85
|
-
modLfoToVolume: (channel: any, note: any) => void;
|
|
78
|
+
modLfoToVolume: (channel: any, note: any, _prevValue: any) => void;
|
|
86
79
|
chorusEffectsSend: (channel: any, note: any, prevValue: any) => void;
|
|
87
80
|
reverbEffectsSend: (channel: any, note: any, prevValue: any) => void;
|
|
88
81
|
delayModLFO: (_channel: any, note: any, _prevValue: any) => void;
|
|
@@ -201,14 +194,15 @@ export class Midy {
|
|
|
201
194
|
centToHz(cent: any): number;
|
|
202
195
|
calcChannelDetune(channel: any): any;
|
|
203
196
|
calcNoteDetune(channel: any, note: any): any;
|
|
204
|
-
|
|
197
|
+
updateChannelDetune(channel: any): void;
|
|
198
|
+
updateDetune(channel: any, note: any, pressure: any): void;
|
|
205
199
|
getPortamentoTime(channel: any): number;
|
|
206
200
|
setPortamentoStartVolumeEnvelope(channel: any, note: any): void;
|
|
207
|
-
setVolumeEnvelope(channel: any, note: any): void;
|
|
201
|
+
setVolumeEnvelope(channel: any, note: any, pressure: any): void;
|
|
208
202
|
setPitchEnvelope(note: any): void;
|
|
209
203
|
clampCutoffFrequency(frequency: any): number;
|
|
210
204
|
setPortamentoStartFilterEnvelope(channel: any, note: any): void;
|
|
211
|
-
setFilterEnvelope(channel: any, note: any): void;
|
|
205
|
+
setFilterEnvelope(channel: any, note: any, pressure: any): void;
|
|
212
206
|
startModulation(channel: any, note: any, startTime: any): void;
|
|
213
207
|
startVibrato(channel: any, note: any, startTime: any): void;
|
|
214
208
|
createNote(channel: any, voice: any, noteNumber: any, velocity: any, startTime: any, portamento: any, isSF3: any): Promise<Note>;
|
|
@@ -224,22 +218,22 @@ export class Midy {
|
|
|
224
218
|
handlePolyphonicKeyPressure(channelNumber: any, noteNumber: any, pressure: any): void;
|
|
225
219
|
handleProgramChange(channelNumber: any, program: any): void;
|
|
226
220
|
handleChannelPressure(channelNumber: any, value: any): void;
|
|
227
|
-
setChannelPressure(channel: any, note: any): void;
|
|
228
221
|
handlePitchBendMessage(channelNumber: any, lsb: any, msb: any): void;
|
|
229
222
|
setPitchBend(channelNumber: any, value: any): void;
|
|
230
|
-
setModLfoToPitch(channel: any, note: any): void;
|
|
223
|
+
setModLfoToPitch(channel: any, note: any, pressure: any): void;
|
|
231
224
|
setVibLfoToPitch(channel: any, note: any): void;
|
|
232
|
-
setModLfoToFilterFc(
|
|
233
|
-
setModLfoToVolume(
|
|
225
|
+
setModLfoToFilterFc(note: any, pressure: any): void;
|
|
226
|
+
setModLfoToVolume(note: any, pressure: any): void;
|
|
234
227
|
setReverbEffectsSend(channel: any, note: any, prevValue: any): void;
|
|
235
228
|
setChorusEffectsSend(channel: any, note: any, prevValue: any): void;
|
|
236
229
|
setDelayModLFO(note: any): void;
|
|
237
230
|
setFreqModLFO(note: any): void;
|
|
231
|
+
setFreqVibLFO(channel: any, note: any): void;
|
|
238
232
|
createVoiceParamsHandlers(): {
|
|
239
233
|
modLfoToPitch: (channel: any, note: any, _prevValue: any) => void;
|
|
240
234
|
vibLfoToPitch: (channel: any, note: any, _prevValue: any) => void;
|
|
241
235
|
modLfoToFilterFc: (channel: any, note: any, _prevValue: any) => void;
|
|
242
|
-
modLfoToVolume: (channel: any, note: any) => void;
|
|
236
|
+
modLfoToVolume: (channel: any, note: any, _prevValue: any) => void;
|
|
243
237
|
chorusEffectsSend: (channel: any, note: any, prevValue: any) => void;
|
|
244
238
|
reverbEffectsSend: (channel: any, note: any, prevValue: any) => void;
|
|
245
239
|
delayModLFO: (_channel: any, note: any, _prevValue: any) => void;
|
|
@@ -342,7 +336,7 @@ export class Midy {
|
|
|
342
336
|
handleUniversalNonRealTimeExclusiveMessage(data: any): void;
|
|
343
337
|
GM1SystemOn(): void;
|
|
344
338
|
GM2SystemOn(): void;
|
|
345
|
-
handleUniversalRealTimeExclusiveMessage(data: any):
|
|
339
|
+
handleUniversalRealTimeExclusiveMessage(data: any): any;
|
|
346
340
|
handleMasterVolumeSysEx(data: any): void;
|
|
347
341
|
setMasterVolume(volume: any): void;
|
|
348
342
|
handleMasterFineTuningSysEx(data: any): void;
|
|
@@ -369,11 +363,15 @@ export class Midy {
|
|
|
369
363
|
getChorusSendToReverb(value: any): number;
|
|
370
364
|
getChannelBitmap(data: any): any[];
|
|
371
365
|
handleScaleOctaveTuning1ByteFormatSysEx(data: any): void;
|
|
372
|
-
|
|
366
|
+
applyDestinationSettings(channel: any, note: any, table: any): void;
|
|
367
|
+
handleChannelPressureSysEx(data: any, tableName: any): void;
|
|
368
|
+
initControlTable(): Uint8Array<ArrayBuffer>;
|
|
369
|
+
applyControlTable(channel: any, controllerType: any): void;
|
|
370
|
+
handleControlChangeSysEx(data: any): void;
|
|
373
371
|
getKeyBasedInstrumentControlValue(channel: any, keyNumber: any, controllerType: any): number;
|
|
374
372
|
handleKeyBasedInstrumentControlSysEx(data: any): void;
|
|
375
373
|
handleExclusiveMessage(data: any): void;
|
|
376
|
-
handleSysEx(data: any):
|
|
374
|
+
handleSysEx(data: any): any;
|
|
377
375
|
scheduleTask(callback: any, startTime: any): Promise<any>;
|
|
378
376
|
}
|
|
379
377
|
declare class Note {
|
|
@@ -392,6 +390,7 @@ declare class Note {
|
|
|
392
390
|
reverbEffectsSend: any;
|
|
393
391
|
chorusEffectsSend: any;
|
|
394
392
|
portamento: any;
|
|
393
|
+
pressure: number;
|
|
395
394
|
noteNumber: any;
|
|
396
395
|
velocity: any;
|
|
397
396
|
startTime: any;
|
package/script/midy.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"midy.d.ts","sourceRoot":"","sources":["../src/midy.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"midy.d.ts","sourceRoot":"","sources":["../src/midy.js"],"names":[],"mappings":"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"}
|