@marmooo/midy 0.2.7 → 0.2.8
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 +2 -2
- package/esm/midy-GM1.d.ts +6 -6
- package/esm/midy-GM1.d.ts.map +1 -1
- package/esm/midy-GM1.js +75 -73
- package/esm/midy-GM2.d.ts +22 -23
- package/esm/midy-GM2.d.ts.map +1 -1
- package/esm/midy-GM2.js +122 -153
- package/esm/midy-GMLite.d.ts +2 -2
- package/esm/midy-GMLite.d.ts.map +1 -1
- package/esm/midy-GMLite.js +63 -62
- package/esm/midy.d.ts +22 -23
- package/esm/midy.d.ts.map +1 -1
- package/esm/midy.js +153 -216
- package/package.json +1 -1
- package/script/midy-GM1.d.ts +6 -6
- package/script/midy-GM1.d.ts.map +1 -1
- package/script/midy-GM1.js +75 -73
- package/script/midy-GM2.d.ts +22 -23
- package/script/midy-GM2.d.ts.map +1 -1
- package/script/midy-GM2.js +122 -153
- package/script/midy-GMLite.d.ts +2 -2
- package/script/midy-GMLite.d.ts.map +1 -1
- package/script/midy-GMLite.js +63 -62
- package/script/midy.d.ts +22 -23
- package/script/midy.d.ts.map +1 -1
- package/script/midy.js +153 -216
package/script/midy-GMLite.js
CHANGED
|
@@ -358,6 +358,7 @@ class MidyGMLite {
|
|
|
358
358
|
state: new ControllerState(),
|
|
359
359
|
...this.setChannelAudioNodes(audioContext),
|
|
360
360
|
scheduledNotes: new SparseMap(128),
|
|
361
|
+
sustainNotes: [],
|
|
361
362
|
};
|
|
362
363
|
});
|
|
363
364
|
return channels;
|
|
@@ -415,7 +416,7 @@ class MidyGMLite {
|
|
|
415
416
|
}
|
|
416
417
|
/* falls through */
|
|
417
418
|
case "noteOff": {
|
|
418
|
-
const notePromise = this.scheduleNoteOff(event.channel, event.noteNumber, event.velocity, startTime);
|
|
419
|
+
const notePromise = this.scheduleNoteOff(event.channel, event.noteNumber, event.velocity, startTime, false);
|
|
419
420
|
if (notePromise) {
|
|
420
421
|
this.notePromises.push(notePromise);
|
|
421
422
|
}
|
|
@@ -579,15 +580,10 @@ class MidyGMLite {
|
|
|
579
580
|
stopChannelNotes(channelNumber, velocity, force, scheduleTime) {
|
|
580
581
|
const channel = this.channels[channelNumber];
|
|
581
582
|
const promises = [];
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
continue;
|
|
587
|
-
const promise = this.scheduleNoteOff(channelNumber, note.noteNumber, velocity, scheduleTime, force);
|
|
588
|
-
this.notePromises.push(promise);
|
|
589
|
-
promises.push(promise);
|
|
590
|
-
}
|
|
583
|
+
this.processScheduledNotes(channel, (note) => {
|
|
584
|
+
const promise = this.scheduleNoteOff(channelNumber, note.noteNumber, velocity, scheduleTime, force);
|
|
585
|
+
this.notePromises.push(promise);
|
|
586
|
+
promises.push(promise);
|
|
591
587
|
});
|
|
592
588
|
channel.scheduledNotes.clear();
|
|
593
589
|
return Promise.all(promises);
|
|
@@ -643,14 +639,12 @@ class MidyGMLite {
|
|
|
643
639
|
const now = this.audioContext.currentTime;
|
|
644
640
|
return this.resumeTime + now - this.startTime - this.startDelay;
|
|
645
641
|
}
|
|
646
|
-
processScheduledNotes(channel,
|
|
642
|
+
processScheduledNotes(channel, callback) {
|
|
647
643
|
channel.scheduledNotes.forEach((noteList) => {
|
|
648
644
|
for (let i = 0; i < noteList.length; i++) {
|
|
649
645
|
const note = noteList[i];
|
|
650
646
|
if (!note)
|
|
651
647
|
continue;
|
|
652
|
-
if (scheduleTime < note.startTime)
|
|
653
|
-
continue;
|
|
654
648
|
callback(note);
|
|
655
649
|
}
|
|
656
650
|
});
|
|
@@ -694,7 +688,7 @@ class MidyGMLite {
|
|
|
694
688
|
return pitchWheel * pitchWheelSensitivity;
|
|
695
689
|
}
|
|
696
690
|
updateChannelDetune(channel, scheduleTime) {
|
|
697
|
-
this.processScheduledNotes(channel,
|
|
691
|
+
this.processScheduledNotes(channel, (note) => {
|
|
698
692
|
this.updateDetune(channel, note, scheduleTime);
|
|
699
693
|
});
|
|
700
694
|
}
|
|
@@ -843,6 +837,9 @@ class MidyGMLite {
|
|
|
843
837
|
const note = await this.createNote(channel, voice, noteNumber, velocity, startTime, isSF3);
|
|
844
838
|
note.volumeEnvelopeNode.connect(channel.gainL);
|
|
845
839
|
note.volumeEnvelopeNode.connect(channel.gainR);
|
|
840
|
+
if (0.5 <= channel.state.sustainPedal) {
|
|
841
|
+
channel.sustainNotes.push(note);
|
|
842
|
+
}
|
|
846
843
|
const exclusiveClass = note.voiceParams.exclusiveClass;
|
|
847
844
|
if (exclusiveClass !== 0) {
|
|
848
845
|
if (this.exclusiveClassMap.has(exclusiveClass)) {
|
|
@@ -850,8 +847,7 @@ class MidyGMLite {
|
|
|
850
847
|
const [prevNote, prevChannelNumber] = prevEntry;
|
|
851
848
|
if (!prevNote.ending) {
|
|
852
849
|
this.scheduleNoteOff(prevChannelNumber, prevNote.noteNumber, 0, // velocity,
|
|
853
|
-
startTime,
|
|
854
|
-
true);
|
|
850
|
+
startTime, true);
|
|
855
851
|
}
|
|
856
852
|
}
|
|
857
853
|
this.exclusiveClassMap.set(exclusiveClass, [note, channelNumber]);
|
|
@@ -895,7 +891,7 @@ class MidyGMLite {
|
|
|
895
891
|
}
|
|
896
892
|
scheduleNoteOff(channelNumber, noteNumber, _velocity, endTime, force) {
|
|
897
893
|
const channel = this.channels[channelNumber];
|
|
898
|
-
if (!force && 0.5
|
|
894
|
+
if (!force && 0.5 <= channel.state.sustainPedal)
|
|
899
895
|
return;
|
|
900
896
|
if (!channel.scheduledNotes.has(noteNumber))
|
|
901
897
|
return;
|
|
@@ -923,11 +919,11 @@ class MidyGMLite {
|
|
|
923
919
|
const velocity = halfVelocity * 2;
|
|
924
920
|
const channel = this.channels[channelNumber];
|
|
925
921
|
const promises = [];
|
|
926
|
-
|
|
927
|
-
const
|
|
928
|
-
const promise = this.noteOff(channelNumber, noteNumber, velocity);
|
|
922
|
+
for (let i = 0; i < channel.sustainNotes.length; i++) {
|
|
923
|
+
const promise = this.noteOff(channelNumber, channel.sustainNotes[i].noteNumber, velocity, scheduleTime);
|
|
929
924
|
promises.push(promise);
|
|
930
|
-
}
|
|
925
|
+
}
|
|
926
|
+
channel.sustainNotes = [];
|
|
931
927
|
return promises;
|
|
932
928
|
}
|
|
933
929
|
handleMIDIMessage(statusByte, data1, data2, scheduleTime) {
|
|
@@ -1038,48 +1034,43 @@ class MidyGMLite {
|
|
|
1038
1034
|
return state;
|
|
1039
1035
|
}
|
|
1040
1036
|
applyVoiceParams(channel, controllerType, scheduleTime) {
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1037
|
+
this.processScheduledNotes(channel, (note) => {
|
|
1038
|
+
const controllerState = this.getControllerState(channel, note.noteNumber, note.velocity);
|
|
1039
|
+
const voiceParams = note.voice.getParams(controllerType, controllerState);
|
|
1040
|
+
let appliedFilterEnvelope = false;
|
|
1041
|
+
let appliedVolumeEnvelope = false;
|
|
1042
|
+
for (const [key, value] of Object.entries(voiceParams)) {
|
|
1043
|
+
const prevValue = note.voiceParams[key];
|
|
1044
|
+
if (value === prevValue)
|
|
1045
1045
|
continue;
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
if (value === prevValue)
|
|
1046
|
+
note.voiceParams[key] = value;
|
|
1047
|
+
if (key in this.voiceParamsHandlers) {
|
|
1048
|
+
this.voiceParamsHandlers[key](channel, note, prevValue, scheduleTime);
|
|
1049
|
+
}
|
|
1050
|
+
else if (filterEnvelopeKeySet.has(key)) {
|
|
1051
|
+
if (appliedFilterEnvelope)
|
|
1053
1052
|
continue;
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
continue;
|
|
1061
|
-
appliedFilterEnvelope = true;
|
|
1062
|
-
const noteVoiceParams = note.voiceParams;
|
|
1063
|
-
for (let i = 0; i < filterEnvelopeKeys.length; i++) {
|
|
1064
|
-
const key = filterEnvelopeKeys[i];
|
|
1065
|
-
if (key in voiceParams)
|
|
1066
|
-
noteVoiceParams[key] = voiceParams[key];
|
|
1067
|
-
}
|
|
1068
|
-
this.setFilterEnvelope(note, scheduleTime);
|
|
1069
|
-
this.setPitchEnvelope(note, scheduleTime);
|
|
1053
|
+
appliedFilterEnvelope = true;
|
|
1054
|
+
const noteVoiceParams = note.voiceParams;
|
|
1055
|
+
for (let i = 0; i < filterEnvelopeKeys.length; i++) {
|
|
1056
|
+
const key = filterEnvelopeKeys[i];
|
|
1057
|
+
if (key in voiceParams)
|
|
1058
|
+
noteVoiceParams[key] = voiceParams[key];
|
|
1070
1059
|
}
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1060
|
+
this.setFilterEnvelope(note, scheduleTime);
|
|
1061
|
+
this.setPitchEnvelope(note, scheduleTime);
|
|
1062
|
+
}
|
|
1063
|
+
else if (volumeEnvelopeKeySet.has(key)) {
|
|
1064
|
+
if (appliedVolumeEnvelope)
|
|
1065
|
+
continue;
|
|
1066
|
+
appliedVolumeEnvelope = true;
|
|
1067
|
+
const noteVoiceParams = note.voiceParams;
|
|
1068
|
+
for (let i = 0; i < volumeEnvelopeKeys.length; i++) {
|
|
1069
|
+
const key = volumeEnvelopeKeys[i];
|
|
1070
|
+
if (key in voiceParams)
|
|
1071
|
+
noteVoiceParams[key] = voiceParams[key];
|
|
1082
1072
|
}
|
|
1073
|
+
this.setVolumeEnvelope(note, scheduleTime);
|
|
1083
1074
|
}
|
|
1084
1075
|
}
|
|
1085
1076
|
});
|
|
@@ -1114,7 +1105,7 @@ class MidyGMLite {
|
|
|
1114
1105
|
updateModulation(channel, scheduleTime) {
|
|
1115
1106
|
scheduleTime ??= this.audioContext.currentTime;
|
|
1116
1107
|
const depth = channel.state.modulationDepth * channel.modulationDepthRange;
|
|
1117
|
-
this.processScheduledNotes(channel,
|
|
1108
|
+
this.processScheduledNotes(channel, (note) => {
|
|
1118
1109
|
if (note.modulationDepth) {
|
|
1119
1110
|
note.modulationDepth.gain.setValueAtTime(depth, scheduleTime);
|
|
1120
1111
|
}
|
|
@@ -1125,11 +1116,13 @@ class MidyGMLite {
|
|
|
1125
1116
|
});
|
|
1126
1117
|
}
|
|
1127
1118
|
setModulationDepth(channelNumber, modulation, scheduleTime) {
|
|
1119
|
+
scheduleTime ??= this.audioContext.currentTime;
|
|
1128
1120
|
const channel = this.channels[channelNumber];
|
|
1129
1121
|
channel.state.modulationDepth = modulation / 127;
|
|
1130
1122
|
this.updateModulation(channel, scheduleTime);
|
|
1131
1123
|
}
|
|
1132
1124
|
setVolume(channelNumber, volume, scheduleTime) {
|
|
1125
|
+
scheduleTime ??= this.audioContext.currentTime;
|
|
1133
1126
|
const channel = this.channels[channelNumber];
|
|
1134
1127
|
channel.state.volume = volume / 127;
|
|
1135
1128
|
this.updateChannelVolume(channel, scheduleTime);
|
|
@@ -1142,11 +1135,13 @@ class MidyGMLite {
|
|
|
1142
1135
|
};
|
|
1143
1136
|
}
|
|
1144
1137
|
setPan(channelNumber, pan, scheduleTime) {
|
|
1138
|
+
scheduleTime ??= this.audioContext.currentTime;
|
|
1145
1139
|
const channel = this.channels[channelNumber];
|
|
1146
1140
|
channel.state.pan = pan / 127;
|
|
1147
1141
|
this.updateChannelVolume(channel, scheduleTime);
|
|
1148
1142
|
}
|
|
1149
1143
|
setExpression(channelNumber, expression, scheduleTime) {
|
|
1144
|
+
scheduleTime ??= this.audioContext.currentTime;
|
|
1150
1145
|
const channel = this.channels[channelNumber];
|
|
1151
1146
|
channel.state.expression = expression / 127;
|
|
1152
1147
|
this.updateChannelVolume(channel, scheduleTime);
|
|
@@ -1168,8 +1163,14 @@ class MidyGMLite {
|
|
|
1168
1163
|
}
|
|
1169
1164
|
setSustainPedal(channelNumber, value, scheduleTime) {
|
|
1170
1165
|
scheduleTime ??= this.audioContext.currentTime;
|
|
1171
|
-
this.channels[channelNumber]
|
|
1172
|
-
|
|
1166
|
+
const channel = this.channels[channelNumber];
|
|
1167
|
+
channel.state.sustainPedal = value / 127;
|
|
1168
|
+
if (64 <= value) {
|
|
1169
|
+
this.processScheduledNotes(channel, (note) => {
|
|
1170
|
+
channel.sustainNotes.push(note);
|
|
1171
|
+
});
|
|
1172
|
+
}
|
|
1173
|
+
else {
|
|
1173
1174
|
this.releaseSustainPedal(channelNumber, value, scheduleTime);
|
|
1174
1175
|
}
|
|
1175
1176
|
}
|
package/script/midy.d.ts
CHANGED
|
@@ -10,6 +10,7 @@ export class Midy {
|
|
|
10
10
|
dataLSB: number;
|
|
11
11
|
rpnMSB: number;
|
|
12
12
|
rpnLSB: number;
|
|
13
|
+
mono: boolean;
|
|
13
14
|
fineTuning: number;
|
|
14
15
|
coarseTuning: number;
|
|
15
16
|
modulationDepthRange: number;
|
|
@@ -35,8 +36,6 @@ export class Midy {
|
|
|
35
36
|
sendToReverb: number;
|
|
36
37
|
delayTimes: any[];
|
|
37
38
|
};
|
|
38
|
-
mono: boolean;
|
|
39
|
-
omni: boolean;
|
|
40
39
|
noteCheckInterval: number;
|
|
41
40
|
lookAhead: number;
|
|
42
41
|
startDelay: number;
|
|
@@ -112,10 +111,10 @@ export class Midy {
|
|
|
112
111
|
120: (channelNumber: any, _value: any, scheduleTime: any) => Promise<any[]>;
|
|
113
112
|
121: (channelNumber: any) => void;
|
|
114
113
|
123: (channelNumber: any, _value: any, scheduleTime: any) => Promise<any[]>;
|
|
115
|
-
124: () => void;
|
|
116
|
-
125: () => void;
|
|
117
|
-
126: () => void;
|
|
118
|
-
127: () => void;
|
|
114
|
+
124: (channelNumber: any, value: any, scheduleTime: any) => void;
|
|
115
|
+
125: (channelNumber: any, value: any, scheduleTime: any) => void;
|
|
116
|
+
126: (channelNumber: any, value: any, scheduleTime: any) => void;
|
|
117
|
+
127: (channelNumber: any, value: any, scheduleTime: any) => void;
|
|
119
118
|
};
|
|
120
119
|
channels: any[];
|
|
121
120
|
reverbEffect: {
|
|
@@ -163,7 +162,7 @@ export class Midy {
|
|
|
163
162
|
seekTo(second: any): void;
|
|
164
163
|
calcTotalTime(): number;
|
|
165
164
|
currentTime(): number;
|
|
166
|
-
processScheduledNotes(channel: any,
|
|
165
|
+
processScheduledNotes(channel: any, callback: any): void;
|
|
167
166
|
getActiveNotes(channel: any, scheduleTime: any): SparseMap;
|
|
168
167
|
getActiveNote(noteList: any, scheduleTime: any): any;
|
|
169
168
|
createConvolutionReverbImpulse(audioContext: any, decay: any, preDecay: any): any;
|
|
@@ -213,8 +212,8 @@ export class Midy {
|
|
|
213
212
|
stopNote(endTime: any, stopTime: any, scheduledNotes: any, index: any): Promise<any>;
|
|
214
213
|
scheduleNoteOff(channelNumber: any, noteNumber: any, _velocity: any, endTime: any, force: any, portamentoNoteNumber: any): Promise<any> | undefined;
|
|
215
214
|
noteOff(channelNumber: any, noteNumber: any, velocity: any, scheduleTime: any): Promise<any> | undefined;
|
|
216
|
-
releaseSustainPedal(channelNumber: any, halfVelocity: any, scheduleTime: any): any[];
|
|
217
|
-
releaseSostenutoPedal(channelNumber: any, halfVelocity: any): any[];
|
|
215
|
+
releaseSustainPedal(channelNumber: any, halfVelocity: any, scheduleTime: any): (Promise<any> | undefined)[];
|
|
216
|
+
releaseSostenutoPedal(channelNumber: any, halfVelocity: any, scheduleTime: any): any[];
|
|
218
217
|
handleMIDIMessage(statusByte: any, data1: any, data2: any, scheduleTime: any): void | Promise<any>;
|
|
219
218
|
handlePolyphonicKeyPressure(channelNumber: any, noteNumber: any, pressure: any, scheduleTime: any): void;
|
|
220
219
|
handleProgramChange(channelNumber: any, program: any, _scheduleTime: any): void;
|
|
@@ -275,10 +274,10 @@ export class Midy {
|
|
|
275
274
|
120: (channelNumber: any, _value: any, scheduleTime: any) => Promise<any[]>;
|
|
276
275
|
121: (channelNumber: any) => void;
|
|
277
276
|
123: (channelNumber: any, _value: any, scheduleTime: any) => Promise<any[]>;
|
|
278
|
-
124: () => void;
|
|
279
|
-
125: () => void;
|
|
280
|
-
126: () => void;
|
|
281
|
-
127: () => void;
|
|
277
|
+
124: (channelNumber: any, value: any, scheduleTime: any) => void;
|
|
278
|
+
125: (channelNumber: any, value: any, scheduleTime: any) => void;
|
|
279
|
+
126: (channelNumber: any, value: any, scheduleTime: any) => void;
|
|
280
|
+
127: (channelNumber: any, value: any, scheduleTime: any) => void;
|
|
282
281
|
};
|
|
283
282
|
handleControlChange(channelNumber: any, controllerType: any, value: any, scheduleTime: any): void;
|
|
284
283
|
setBankMSB(channelNumber: any, msb: any): void;
|
|
@@ -321,19 +320,19 @@ export class Midy {
|
|
|
321
320
|
dataEntryMSB(channelNumber: any, value: any, scheduleTime: any): void;
|
|
322
321
|
handlePitchBendRangeRPN(channelNumber: any, scheduleTime: any): void;
|
|
323
322
|
setPitchBendRange(channelNumber: any, value: any, scheduleTime: any): void;
|
|
324
|
-
handleFineTuningRPN(channelNumber: any): void;
|
|
325
|
-
setFineTuning(channelNumber: any, value: any): void;
|
|
326
|
-
handleCoarseTuningRPN(channelNumber: any): void;
|
|
327
|
-
setCoarseTuning(channelNumber: any, value: any): void;
|
|
328
|
-
handleModulationDepthRangeRPN(channelNumber: any): void;
|
|
329
|
-
setModulationDepthRange(channelNumber: any, modulationDepthRange: any): void;
|
|
323
|
+
handleFineTuningRPN(channelNumber: any, scheduleTime: any): void;
|
|
324
|
+
setFineTuning(channelNumber: any, value: any, scheduleTime: any): void;
|
|
325
|
+
handleCoarseTuningRPN(channelNumber: any, scheduleTime: any): void;
|
|
326
|
+
setCoarseTuning(channelNumber: any, value: any, scheduleTime: any): void;
|
|
327
|
+
handleModulationDepthRangeRPN(channelNumber: any, scheduleTime: any): void;
|
|
328
|
+
setModulationDepthRange(channelNumber: any, modulationDepthRange: any, scheduleTime: any): void;
|
|
330
329
|
allSoundOff(channelNumber: any, _value: any, scheduleTime: any): Promise<any[]>;
|
|
331
330
|
resetAllControllers(channelNumber: any): void;
|
|
332
331
|
allNotesOff(channelNumber: any, _value: any, scheduleTime: any): Promise<any[]>;
|
|
333
|
-
omniOff(): void;
|
|
334
|
-
omniOn(): void;
|
|
335
|
-
monoOn(): void;
|
|
336
|
-
polyOn(): void;
|
|
332
|
+
omniOff(channelNumber: any, value: any, scheduleTime: any): void;
|
|
333
|
+
omniOn(channelNumber: any, value: any, scheduleTime: any): void;
|
|
334
|
+
monoOn(channelNumber: any, value: any, scheduleTime: any): void;
|
|
335
|
+
polyOn(channelNumber: any, value: any, scheduleTime: any): void;
|
|
337
336
|
handleUniversalNonRealTimeExclusiveMessage(data: any, scheduleTime: any): void;
|
|
338
337
|
GM1SystemOn(): void;
|
|
339
338
|
GM2SystemOn(): void;
|
package/script/midy.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"midy.d.ts","sourceRoot":"","sources":["../src/midy.js"],"names":[],"mappings":"AAgLA;
|
|
1
|
+
{"version":3,"file":"midy.d.ts","sourceRoot":"","sources":["../src/midy.js"],"names":[],"mappings":"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"}
|