@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/package.json
CHANGED
package/script/midy-GM1.d.ts
CHANGED
|
@@ -93,7 +93,7 @@ export class MidyGM1 {
|
|
|
93
93
|
seekTo(second: any): void;
|
|
94
94
|
calcTotalTime(): number;
|
|
95
95
|
currentTime(): number;
|
|
96
|
-
processScheduledNotes(channel: any,
|
|
96
|
+
processScheduledNotes(channel: any, callback: any): void;
|
|
97
97
|
getActiveNotes(channel: any, scheduleTime: any): SparseMap;
|
|
98
98
|
getActiveNote(noteList: any, scheduleTime: any): any;
|
|
99
99
|
cbToRatio(cb: any): number;
|
|
@@ -115,7 +115,7 @@ export class MidyGM1 {
|
|
|
115
115
|
stopNote(endTime: any, stopTime: any, scheduledNotes: any, index: any): Promise<any>;
|
|
116
116
|
scheduleNoteOff(channelNumber: any, noteNumber: any, _velocity: any, endTime: any, force: any): Promise<any> | undefined;
|
|
117
117
|
noteOff(channelNumber: any, noteNumber: any, velocity: any, scheduleTime: any): Promise<any> | undefined;
|
|
118
|
-
releaseSustainPedal(channelNumber: any, halfVelocity: any, scheduleTime: any): any[];
|
|
118
|
+
releaseSustainPedal(channelNumber: any, halfVelocity: any, scheduleTime: any): (Promise<any> | undefined)[];
|
|
119
119
|
handleMIDIMessage(statusByte: any, data1: any, data2: any, scheduleTime: any): void | Promise<any>;
|
|
120
120
|
handleProgramChange(channelNumber: any, program: any, _scheduleTime: any): void;
|
|
121
121
|
handlePitchBendMessage(channelNumber: any, lsb: any, msb: any, scheduleTime: any): void;
|
|
@@ -174,10 +174,10 @@ export class MidyGM1 {
|
|
|
174
174
|
dataEntryMSB(channelNumber: any, value: any, scheduleTime: any): void;
|
|
175
175
|
handlePitchBendRangeRPN(channelNumber: any, scheduleTime: any): void;
|
|
176
176
|
setPitchBendRange(channelNumber: any, value: any, scheduleTime: any): void;
|
|
177
|
-
handleFineTuningRPN(channelNumber: any): void;
|
|
178
|
-
setFineTuning(channelNumber: any, value: any): void;
|
|
179
|
-
handleCoarseTuningRPN(channelNumber: any): void;
|
|
180
|
-
setCoarseTuning(channelNumber: any, value: any): void;
|
|
177
|
+
handleFineTuningRPN(channelNumber: any, scheduleTime: any): void;
|
|
178
|
+
setFineTuning(channelNumber: any, value: any, scheduleTime: any): void;
|
|
179
|
+
handleCoarseTuningRPN(channelNumber: any, scheduleTime: any): void;
|
|
180
|
+
setCoarseTuning(channelNumber: any, value: any, scheduleTime: any): void;
|
|
181
181
|
allSoundOff(channelNumber: any, _value: any, scheduleTime: any): Promise<any[]>;
|
|
182
182
|
resetAllControllers(channelNumber: any): void;
|
|
183
183
|
allNotesOff(channelNumber: any, _value: any, scheduleTime: any): Promise<any[]>;
|
package/script/midy-GM1.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"midy-GM1.d.ts","sourceRoot":"","sources":["../src/midy-GM1.js"],"names":[],"mappings":"AAiJA;IAsBE;;;;;;;;;;;;MAYE;IAEF,+BAQC;IA3CD,qBAAmB;IACnB,kBAAc;IACd,0BAAwB;IACxB,kBAAc;IACd,mBAAiB;IACjB,kBAAc;IACd,mBAAe;IACf,kBAAgB;IAChB,sBAA2C;IAC3C,kCAA+B;IAC/B,gCAA6B;IAC7B,mBAAkB;IAClB,mBAAkB;IAClB,kBAAiB;IACjB,oBAAmB;IACnB,mBAAkB;IAClB,gBAAc;IACd,mBAAiB;IACjB,oBAAkB;IAClB,6BAAuC;IAiBrC,kBAAgC;IAChC,kBAA8C;IAC9C;;;;;;;;;;;MAA2D;IAC3D;;;;;;;;;;;;;MAA+D;IAC/D,gBAAiD;IAKnD,4BAMC;IAED,mCAWC;IAED,gDAMC;IAED,sCASC;IAED;;;;MAeC;IAED,
|
|
1
|
+
{"version":3,"file":"midy-GM1.d.ts","sourceRoot":"","sources":["../src/midy-GM1.js"],"names":[],"mappings":"AAiJA;IAsBE;;;;;;;;;;;;MAYE;IAEF,+BAQC;IA3CD,qBAAmB;IACnB,kBAAc;IACd,0BAAwB;IACxB,kBAAc;IACd,mBAAiB;IACjB,kBAAc;IACd,mBAAe;IACf,kBAAgB;IAChB,sBAA2C;IAC3C,kCAA+B;IAC/B,gCAA6B;IAC7B,mBAAkB;IAClB,mBAAkB;IAClB,kBAAiB;IACjB,oBAAmB;IACnB,mBAAkB;IAClB,gBAAc;IACd,mBAAiB;IACjB,oBAAkB;IAClB,6BAAuC;IAiBrC,kBAAgC;IAChC,kBAA8C;IAC9C;;;;;;;;;;;MAA2D;IAC3D;;;;;;;;;;;;;MAA+D;IAC/D,gBAAiD;IAKnD,4BAMC;IAED,mCAWC;IAED,gDAMC;IAED,sCASC;IAED;;;;MAeC;IAED,yCAWC;IAED,6DA2BC;IAED,8DASC;IAED,2EAsDC;IAED,mCAOC;IAED,0BAoDC;IAED,uDAEC;IAED,wDAEC;IAED,6EAEC;IAED;;;MA4EC;IAED,mGAgBC;IAED,wEAMC;IAED,uBAKC;IAED,aAGC;IAED,cAKC;IAED,wBAIC;IAED,0BAKC;IAED,wBAOC;IAED,sBAGC;IAED,yDAQC;IAED,2DASC;IAED,qDAQC;IAED,2BAEC;IAED,8BAEC;IAED,8BAEC;IAED,4BAEC;IAED,qCAMC;IAED,2DAIC;IAED,+DAIC;IAED,sDAeC;IAED,qDAoBC;IAED,6CAIC;IAED,sDAsBC;IAED,kEAoBC;IAED,yGAgBC;IAED,gHAwCC;IAED,kGAkDC;IAED,6FAQC;IAED,qFAwBC;IAED,yHAuBC;IAED,yGASC;IAED,4GAeC;IAED,mGA2BC;IAED,gFAGC;IAED,wFAGC;IAED,sEAUC;IAED,mEAQC;IAED,wDAKC;IAED,sDAOC;IAED,mDAMC;IAED,kDAKC;IAED;;;;;;;;;;;MA2BC;IAED,oFAMC;IAED,6EA2CC;IAED;;;;;;;;;;;;;MAeC;IAED,kGAWC;IAED,wDAUC;IAED,iFAKC;IAED,oEAKC;IAED;;;MAMC;IAED,8DAKC;IAED,4EAKC;IAED,sEAGC;IAED,2DAUC;IAED,yEAWC;IAED,kFAeC;IAED,2DAMC;IAED,uDAkBC;IAED,gDAEC;IAED,gDAEC;IAED,sEAGC;IAED,qEAKC;IAED,2EAUC;IAED,iEAKC;IAED,uEAQC;IAED,mEAKC;IAED,yEAQC;IAED,gFAGC;IAED,8CAqBC;IAED,gFAGC;IAED,gFAgBC;IAED,oBAMC;IAED,4EAaC;IAED,4DAGC;IAED,sDASC;IAED,gDAYC;IAED,6DAUC;CACF;AAr6CD;IACE,uBAGC;IAFC,YAA2B;IAC3B,qBAAuB;IAGzB,gCAKC;IAED,mBAEC;IAED,0BAUC;IAED,uBAEC;IAED,mBAEC;IAED,cAMC;IASD,6BAKC;IAZD,qDAKC;CAQF;AAED;IASE,0FAMC;IAdD,kBAAa;IACb,gBAAW;IACX,iBAAY;IACZ,wBAAmB;IACnB,iBAAY;IACZ,mBAAc;IACd,qBAAgB;IAGd,gBAA4B;IAC5B,cAAwB;IACxB,eAA0B;IAC1B,WAAkB;IAClB,iBAA8B;CAEjC"}
|
package/script/midy-GM1.js
CHANGED
|
@@ -358,6 +358,7 @@ class MidyGM1 {
|
|
|
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 MidyGM1 {
|
|
|
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 MidyGM1 {
|
|
|
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 MidyGM1 {
|
|
|
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
|
});
|
|
@@ -696,7 +690,7 @@ class MidyGM1 {
|
|
|
696
690
|
return tuning + pitch;
|
|
697
691
|
}
|
|
698
692
|
updateChannelDetune(channel, scheduleTime) {
|
|
699
|
-
this.processScheduledNotes(channel,
|
|
693
|
+
this.processScheduledNotes(channel, (note) => {
|
|
700
694
|
this.updateDetune(channel, note, scheduleTime);
|
|
701
695
|
});
|
|
702
696
|
}
|
|
@@ -845,6 +839,9 @@ class MidyGM1 {
|
|
|
845
839
|
const note = await this.createNote(channel, voice, noteNumber, velocity, startTime, isSF3);
|
|
846
840
|
note.volumeEnvelopeNode.connect(channel.gainL);
|
|
847
841
|
note.volumeEnvelopeNode.connect(channel.gainR);
|
|
842
|
+
if (0.5 <= channel.state.sustainPedal) {
|
|
843
|
+
channel.sustainNotes.push(note);
|
|
844
|
+
}
|
|
848
845
|
const exclusiveClass = note.voiceParams.exclusiveClass;
|
|
849
846
|
if (exclusiveClass !== 0) {
|
|
850
847
|
if (this.exclusiveClassMap.has(exclusiveClass)) {
|
|
@@ -852,8 +849,7 @@ class MidyGM1 {
|
|
|
852
849
|
const [prevNote, prevChannelNumber] = prevEntry;
|
|
853
850
|
if (!prevNote.ending) {
|
|
854
851
|
this.scheduleNoteOff(prevChannelNumber, prevNote.noteNumber, 0, // velocity,
|
|
855
|
-
startTime,
|
|
856
|
-
true);
|
|
852
|
+
startTime, true);
|
|
857
853
|
}
|
|
858
854
|
}
|
|
859
855
|
this.exclusiveClassMap.set(exclusiveClass, [note, channelNumber]);
|
|
@@ -897,7 +893,7 @@ class MidyGM1 {
|
|
|
897
893
|
}
|
|
898
894
|
scheduleNoteOff(channelNumber, noteNumber, _velocity, endTime, force) {
|
|
899
895
|
const channel = this.channels[channelNumber];
|
|
900
|
-
if (!force && 0.5
|
|
896
|
+
if (!force && 0.5 <= channel.state.sustainPedal)
|
|
901
897
|
return;
|
|
902
898
|
if (!channel.scheduledNotes.has(noteNumber))
|
|
903
899
|
return;
|
|
@@ -925,11 +921,11 @@ class MidyGM1 {
|
|
|
925
921
|
const velocity = halfVelocity * 2;
|
|
926
922
|
const channel = this.channels[channelNumber];
|
|
927
923
|
const promises = [];
|
|
928
|
-
|
|
929
|
-
const
|
|
930
|
-
const promise = this.noteOff(channelNumber, noteNumber, velocity);
|
|
924
|
+
for (let i = 0; i < channel.sustainNotes.length; i++) {
|
|
925
|
+
const promise = this.noteOff(channelNumber, channel.sustainNotes[i].noteNumber, velocity, scheduleTime);
|
|
931
926
|
promises.push(promise);
|
|
932
|
-
}
|
|
927
|
+
}
|
|
928
|
+
channel.sustainNotes = [];
|
|
933
929
|
return promises;
|
|
934
930
|
}
|
|
935
931
|
handleMIDIMessage(statusByte, data1, data2, scheduleTime) {
|
|
@@ -1040,48 +1036,43 @@ class MidyGM1 {
|
|
|
1040
1036
|
return state;
|
|
1041
1037
|
}
|
|
1042
1038
|
applyVoiceParams(channel, controllerType, scheduleTime) {
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1039
|
+
this.processScheduledNotes(channel, (note) => {
|
|
1040
|
+
const controllerState = this.getControllerState(channel, note.noteNumber, note.velocity);
|
|
1041
|
+
const voiceParams = note.voice.getParams(controllerType, controllerState);
|
|
1042
|
+
let appliedFilterEnvelope = false;
|
|
1043
|
+
let appliedVolumeEnvelope = false;
|
|
1044
|
+
for (const [key, value] of Object.entries(voiceParams)) {
|
|
1045
|
+
const prevValue = note.voiceParams[key];
|
|
1046
|
+
if (value === prevValue)
|
|
1047
1047
|
continue;
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
if (value === prevValue)
|
|
1048
|
+
note.voiceParams[key] = value;
|
|
1049
|
+
if (key in this.voiceParamsHandlers) {
|
|
1050
|
+
this.voiceParamsHandlers[key](channel, note, prevValue, scheduleTime);
|
|
1051
|
+
}
|
|
1052
|
+
else if (filterEnvelopeKeySet.has(key)) {
|
|
1053
|
+
if (appliedFilterEnvelope)
|
|
1055
1054
|
continue;
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
continue;
|
|
1063
|
-
appliedFilterEnvelope = true;
|
|
1064
|
-
const noteVoiceParams = note.voiceParams;
|
|
1065
|
-
for (let i = 0; i < filterEnvelopeKeys.length; i++) {
|
|
1066
|
-
const key = filterEnvelopeKeys[i];
|
|
1067
|
-
if (key in voiceParams)
|
|
1068
|
-
noteVoiceParams[key] = voiceParams[key];
|
|
1069
|
-
}
|
|
1070
|
-
this.setFilterEnvelope(note, scheduleTime);
|
|
1071
|
-
this.setPitchEnvelope(note, scheduleTime);
|
|
1055
|
+
appliedFilterEnvelope = true;
|
|
1056
|
+
const noteVoiceParams = note.voiceParams;
|
|
1057
|
+
for (let i = 0; i < filterEnvelopeKeys.length; i++) {
|
|
1058
|
+
const key = filterEnvelopeKeys[i];
|
|
1059
|
+
if (key in voiceParams)
|
|
1060
|
+
noteVoiceParams[key] = voiceParams[key];
|
|
1072
1061
|
}
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1062
|
+
this.setFilterEnvelope(note, scheduleTime);
|
|
1063
|
+
this.setPitchEnvelope(note, scheduleTime);
|
|
1064
|
+
}
|
|
1065
|
+
else if (volumeEnvelopeKeySet.has(key)) {
|
|
1066
|
+
if (appliedVolumeEnvelope)
|
|
1067
|
+
continue;
|
|
1068
|
+
appliedVolumeEnvelope = true;
|
|
1069
|
+
const noteVoiceParams = note.voiceParams;
|
|
1070
|
+
for (let i = 0; i < volumeEnvelopeKeys.length; i++) {
|
|
1071
|
+
const key = volumeEnvelopeKeys[i];
|
|
1072
|
+
if (key in voiceParams)
|
|
1073
|
+
noteVoiceParams[key] = voiceParams[key];
|
|
1084
1074
|
}
|
|
1075
|
+
this.setVolumeEnvelope(note, scheduleTime);
|
|
1085
1076
|
}
|
|
1086
1077
|
}
|
|
1087
1078
|
});
|
|
@@ -1114,9 +1105,8 @@ class MidyGM1 {
|
|
|
1114
1105
|
}
|
|
1115
1106
|
}
|
|
1116
1107
|
updateModulation(channel, scheduleTime) {
|
|
1117
|
-
scheduleTime ??= this.audioContext.currentTime;
|
|
1118
1108
|
const depth = channel.state.modulationDepth * channel.modulationDepthRange;
|
|
1119
|
-
this.processScheduledNotes(channel,
|
|
1109
|
+
this.processScheduledNotes(channel, (note) => {
|
|
1120
1110
|
if (note.modulationDepth) {
|
|
1121
1111
|
note.modulationDepth.gain.setValueAtTime(depth, scheduleTime);
|
|
1122
1112
|
}
|
|
@@ -1127,11 +1117,13 @@ class MidyGM1 {
|
|
|
1127
1117
|
});
|
|
1128
1118
|
}
|
|
1129
1119
|
setModulationDepth(channelNumber, modulation, scheduleTime) {
|
|
1120
|
+
scheduleTime ??= this.audioContext.currentTime;
|
|
1130
1121
|
const channel = this.channels[channelNumber];
|
|
1131
1122
|
channel.state.modulationDepth = modulation / 127;
|
|
1132
1123
|
this.updateModulation(channel, scheduleTime);
|
|
1133
1124
|
}
|
|
1134
1125
|
setVolume(channelNumber, volume, scheduleTime) {
|
|
1126
|
+
scheduleTime ??= this.audioContext.currentTime;
|
|
1135
1127
|
const channel = this.channels[channelNumber];
|
|
1136
1128
|
channel.state.volume = volume / 127;
|
|
1137
1129
|
this.updateChannelVolume(channel, scheduleTime);
|
|
@@ -1144,11 +1136,13 @@ class MidyGM1 {
|
|
|
1144
1136
|
};
|
|
1145
1137
|
}
|
|
1146
1138
|
setPan(channelNumber, pan, scheduleTime) {
|
|
1139
|
+
scheduleTime ??= this.audioContext.currentTime;
|
|
1147
1140
|
const channel = this.channels[channelNumber];
|
|
1148
1141
|
channel.state.pan = pan / 127;
|
|
1149
1142
|
this.updateChannelVolume(channel, scheduleTime);
|
|
1150
1143
|
}
|
|
1151
1144
|
setExpression(channelNumber, expression, scheduleTime) {
|
|
1145
|
+
scheduleTime ??= this.audioContext.currentTime;
|
|
1152
1146
|
const channel = this.channels[channelNumber];
|
|
1153
1147
|
channel.state.expression = expression / 127;
|
|
1154
1148
|
this.updateChannelVolume(channel, scheduleTime);
|
|
@@ -1170,8 +1164,14 @@ class MidyGM1 {
|
|
|
1170
1164
|
}
|
|
1171
1165
|
setSustainPedal(channelNumber, value, scheduleTime) {
|
|
1172
1166
|
scheduleTime ??= this.audioContext.currentTime;
|
|
1173
|
-
this.channels[channelNumber]
|
|
1174
|
-
|
|
1167
|
+
const channel = this.channels[channelNumber];
|
|
1168
|
+
channel.state.sustainPedal = value / 127;
|
|
1169
|
+
if (64 <= value) {
|
|
1170
|
+
this.processScheduledNotes(channel, (note) => {
|
|
1171
|
+
channel.sustainNotes.push(note);
|
|
1172
|
+
});
|
|
1173
|
+
}
|
|
1174
|
+
else {
|
|
1175
1175
|
this.releaseSustainPedal(channelNumber, value, scheduleTime);
|
|
1176
1176
|
}
|
|
1177
1177
|
}
|
|
@@ -1209,10 +1209,10 @@ class MidyGM1 {
|
|
|
1209
1209
|
this.handlePitchBendRangeRPN(channelNumber, scheduleTime);
|
|
1210
1210
|
break;
|
|
1211
1211
|
case 1:
|
|
1212
|
-
this.handleFineTuningRPN(channelNumber);
|
|
1212
|
+
this.handleFineTuningRPN(channelNumber, scheduleTime);
|
|
1213
1213
|
break;
|
|
1214
1214
|
case 2:
|
|
1215
|
-
this.handleCoarseTuningRPN(channelNumber);
|
|
1215
|
+
this.handleCoarseTuningRPN(channelNumber, scheduleTime);
|
|
1216
1216
|
break;
|
|
1217
1217
|
default:
|
|
1218
1218
|
console.warn(`Channel ${channelNumber}: Unsupported RPN MSB=${channel.rpnMSB} LSB=${channel.rpnLSB}`);
|
|
@@ -1245,33 +1245,35 @@ class MidyGM1 {
|
|
|
1245
1245
|
this.updateChannelDetune(channel, scheduleTime);
|
|
1246
1246
|
this.applyVoiceParams(channel, 16, scheduleTime);
|
|
1247
1247
|
}
|
|
1248
|
-
handleFineTuningRPN(channelNumber) {
|
|
1248
|
+
handleFineTuningRPN(channelNumber, scheduleTime) {
|
|
1249
1249
|
const channel = this.channels[channelNumber];
|
|
1250
1250
|
this.limitData(channel, 0, 127, 0, 127);
|
|
1251
1251
|
const fineTuning = channel.dataMSB * 128 + channel.dataLSB;
|
|
1252
|
-
this.setFineTuning(channelNumber, fineTuning);
|
|
1252
|
+
this.setFineTuning(channelNumber, fineTuning, scheduleTime);
|
|
1253
1253
|
}
|
|
1254
|
-
setFineTuning(channelNumber, value) {
|
|
1254
|
+
setFineTuning(channelNumber, value, scheduleTime) {
|
|
1255
|
+
scheduleTime ??= this.audioContext.currentTime;
|
|
1255
1256
|
const channel = this.channels[channelNumber];
|
|
1256
1257
|
const prev = channel.fineTuning;
|
|
1257
1258
|
const next = (value - 8192) / 8.192; // cent
|
|
1258
1259
|
channel.fineTuning = next;
|
|
1259
1260
|
channel.detune += next - prev;
|
|
1260
|
-
this.updateChannelDetune(channel);
|
|
1261
|
+
this.updateChannelDetune(channel, scheduleTime);
|
|
1261
1262
|
}
|
|
1262
|
-
handleCoarseTuningRPN(channelNumber) {
|
|
1263
|
+
handleCoarseTuningRPN(channelNumber, scheduleTime) {
|
|
1263
1264
|
const channel = this.channels[channelNumber];
|
|
1264
1265
|
this.limitDataMSB(channel, 0, 127);
|
|
1265
1266
|
const coarseTuning = channel.dataMSB;
|
|
1266
|
-
this.setCoarseTuning(channelNumber, coarseTuning);
|
|
1267
|
+
this.setCoarseTuning(channelNumber, coarseTuning, scheduleTime);
|
|
1267
1268
|
}
|
|
1268
|
-
setCoarseTuning(channelNumber, value) {
|
|
1269
|
+
setCoarseTuning(channelNumber, value, scheduleTime) {
|
|
1270
|
+
scheduleTime ??= this.audioContext.currentTime;
|
|
1269
1271
|
const channel = this.channels[channelNumber];
|
|
1270
1272
|
const prev = channel.coarseTuning;
|
|
1271
1273
|
const next = (value - 64) * 100; // cent
|
|
1272
1274
|
channel.coarseTuning = next;
|
|
1273
1275
|
channel.detune += next - prev;
|
|
1274
|
-
this.updateChannelDetune(channel);
|
|
1276
|
+
this.updateChannelDetune(channel, scheduleTime);
|
|
1275
1277
|
}
|
|
1276
1278
|
allSoundOff(channelNumber, _value, scheduleTime) {
|
|
1277
1279
|
scheduleTime ??= this.audioContext.currentTime;
|
package/script/midy-GM2.d.ts
CHANGED
|
@@ -10,6 +10,7 @@ export class MidyGM2 {
|
|
|
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 MidyGM2 {
|
|
|
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;
|
|
@@ -102,10 +101,10 @@ export class MidyGM2 {
|
|
|
102
101
|
120: (channelNumber: any, _value: any, scheduleTime: any) => Promise<any[]>;
|
|
103
102
|
121: (channelNumber: any) => void;
|
|
104
103
|
123: (channelNumber: any, _value: any, scheduleTime: any) => Promise<any[]>;
|
|
105
|
-
124: () => void;
|
|
106
|
-
125: () => void;
|
|
107
|
-
126: () => void;
|
|
108
|
-
127: () => void;
|
|
104
|
+
124: (channelNumber: any, value: any, scheduleTime: any) => void;
|
|
105
|
+
125: (channelNumber: any, value: any, scheduleTime: any) => void;
|
|
106
|
+
126: (channelNumber: any, value: any, scheduleTime: any) => void;
|
|
107
|
+
127: (channelNumber: any, value: any, scheduleTime: any) => void;
|
|
109
108
|
};
|
|
110
109
|
channels: any[];
|
|
111
110
|
reverbEffect: {
|
|
@@ -153,7 +152,7 @@ export class MidyGM2 {
|
|
|
153
152
|
seekTo(second: any): void;
|
|
154
153
|
calcTotalTime(): number;
|
|
155
154
|
currentTime(): number;
|
|
156
|
-
processScheduledNotes(channel: any,
|
|
155
|
+
processScheduledNotes(channel: any, callback: any): void;
|
|
157
156
|
getActiveNotes(channel: any, scheduleTime: any): SparseMap;
|
|
158
157
|
getActiveNote(noteList: any, scheduleTime: any): any;
|
|
159
158
|
createConvolutionReverbImpulse(audioContext: any, decay: any, preDecay: any): any;
|
|
@@ -203,8 +202,8 @@ export class MidyGM2 {
|
|
|
203
202
|
stopNote(endTime: any, stopTime: any, scheduledNotes: any, index: any): Promise<any>;
|
|
204
203
|
scheduleNoteOff(channelNumber: any, noteNumber: any, _velocity: any, endTime: any, force: any, portamentoNoteNumber: any): Promise<any> | undefined;
|
|
205
204
|
noteOff(channelNumber: any, noteNumber: any, velocity: any, scheduleTime: any): Promise<any> | undefined;
|
|
206
|
-
releaseSustainPedal(channelNumber: any, halfVelocity: any, scheduleTime: any): any[];
|
|
207
|
-
releaseSostenutoPedal(channelNumber: any, halfVelocity: any): any[];
|
|
205
|
+
releaseSustainPedal(channelNumber: any, halfVelocity: any, scheduleTime: any): (Promise<any> | undefined)[];
|
|
206
|
+
releaseSostenutoPedal(channelNumber: any, halfVelocity: any, scheduleTime: any): any[];
|
|
208
207
|
handleMIDIMessage(statusByte: any, data1: any, data2: any, scheduleTime: any): void | Promise<any>;
|
|
209
208
|
handleProgramChange(channelNumber: any, program: any, _scheduleTime: any): void;
|
|
210
209
|
handleChannelPressure(channelNumber: any, value: any, scheduleTime: any): void;
|
|
@@ -254,10 +253,10 @@ export class MidyGM2 {
|
|
|
254
253
|
120: (channelNumber: any, _value: any, scheduleTime: any) => Promise<any[]>;
|
|
255
254
|
121: (channelNumber: any) => void;
|
|
256
255
|
123: (channelNumber: any, _value: any, scheduleTime: any) => Promise<any[]>;
|
|
257
|
-
124: () => void;
|
|
258
|
-
125: () => void;
|
|
259
|
-
126: () => void;
|
|
260
|
-
127: () => void;
|
|
256
|
+
124: (channelNumber: any, value: any, scheduleTime: any) => void;
|
|
257
|
+
125: (channelNumber: any, value: any, scheduleTime: any) => void;
|
|
258
|
+
126: (channelNumber: any, value: any, scheduleTime: any) => void;
|
|
259
|
+
127: (channelNumber: any, value: any, scheduleTime: any) => void;
|
|
261
260
|
};
|
|
262
261
|
handleControlChange(channelNumber: any, controllerType: any, value: any, scheduleTime: any): void;
|
|
263
262
|
setBankMSB(channelNumber: any, msb: any): void;
|
|
@@ -290,19 +289,19 @@ export class MidyGM2 {
|
|
|
290
289
|
dataEntryMSB(channelNumber: any, value: any, scheduleTime: any): void;
|
|
291
290
|
handlePitchBendRangeRPN(channelNumber: any, scheduleTime: any): void;
|
|
292
291
|
setPitchBendRange(channelNumber: any, value: any, scheduleTime: any): void;
|
|
293
|
-
handleFineTuningRPN(channelNumber: any): void;
|
|
294
|
-
setFineTuning(channelNumber: any, value: any): void;
|
|
295
|
-
handleCoarseTuningRPN(channelNumber: any): void;
|
|
296
|
-
setCoarseTuning(channelNumber: any, value: any): void;
|
|
297
|
-
handleModulationDepthRangeRPN(channelNumber: any): void;
|
|
298
|
-
setModulationDepthRange(channelNumber: any, modulationDepthRange: any): void;
|
|
292
|
+
handleFineTuningRPN(channelNumber: any, scheduleTime: any): void;
|
|
293
|
+
setFineTuning(channelNumber: any, value: any, scheduleTime: any): void;
|
|
294
|
+
handleCoarseTuningRPN(channelNumber: any, scheduleTime: any): void;
|
|
295
|
+
setCoarseTuning(channelNumber: any, value: any, scheduleTime: any): void;
|
|
296
|
+
handleModulationDepthRangeRPN(channelNumber: any, scheduleTime: any): void;
|
|
297
|
+
setModulationDepthRange(channelNumber: any, modulationDepthRange: any, scheduleTime: any): void;
|
|
299
298
|
allSoundOff(channelNumber: any, _value: any, scheduleTime: any): Promise<any[]>;
|
|
300
299
|
resetAllControllers(channelNumber: any): void;
|
|
301
300
|
allNotesOff(channelNumber: any, _value: any, scheduleTime: any): Promise<any[]>;
|
|
302
|
-
omniOff(): void;
|
|
303
|
-
omniOn(): void;
|
|
304
|
-
monoOn(): void;
|
|
305
|
-
polyOn(): void;
|
|
301
|
+
omniOff(channelNumber: any, value: any, scheduleTime: any): void;
|
|
302
|
+
omniOn(channelNumber: any, value: any, scheduleTime: any): void;
|
|
303
|
+
monoOn(channelNumber: any, value: any, scheduleTime: any): void;
|
|
304
|
+
polyOn(channelNumber: any, value: any, scheduleTime: any): void;
|
|
306
305
|
handleUniversalNonRealTimeExclusiveMessage(data: any, scheduleTime: any): void;
|
|
307
306
|
GM1SystemOn(): void;
|
|
308
307
|
GM2SystemOn(): void;
|
package/script/midy-GM2.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"midy-GM2.d.ts","sourceRoot":"","sources":["../src/midy-GM2.js"],"names":[],"mappings":"AA8KA;
|
|
1
|
+
{"version":3,"file":"midy-GM2.d.ts","sourceRoot":"","sources":["../src/midy-GM2.js"],"names":[],"mappings":"AA8KA;IAmCE;;;;;;;;;;;;;;;MAeE;IAgCF;;;;;OAaC;IA9FD,qBAAmB;IACnB,kBAAc;IACd,yBAAqB;IACrB,2BAAuB;IACvB;;;MAGE;IACF;;;;;;MAME;IACF,0BAAwB;IACxB,kBAAc;IACd,mBAAiB;IACjB,kBAAc;IACd,mBAAe;IACf,kBAAgB;IAChB,sBAA2C;IAC3C,kCAA+B;IAC/B,gCAA6B;IAC7B,mBAAkB;IAClB,mBAAkB;IAClB,kBAAiB;IACjB,oBAAmB;IACnB,mBAAkB;IAClB,gBAAc;IACd,mBAAiB;IACjB,oBAAkB;IAClB,6BAAuC;IAmBvC;;;;;MA4BE;IAGA,kBAAgC;IAChC;;;;;MAAqD;IACrD,kBAA8C;IAC9C;;;;;;;;;;;MAA2D;IAC3D;;;;;;;;;;;;;;;;;;;;;;;;;MAA+D;IAC/D,gBAAiD;IACjD;;;MAA8D;IAC9D;;;;;;;;MAAyD;IAO3D,4BAMC;IAED,mCAWC;IAED,gDAMC;IAED,sCASC;IAED;;;;MAeC;IAED,yCAgBC;IAED,6DA2BC;IAED,8DASC;IAED,2CAcC;IAED,2EA6DC;IAED,mCAOC;IAED,0BAoDC;IAED,uDAEC;IAED,wDAEC;IAED,6EAEC;IAED;;;MAgHC;IAED,mGAiBC;IAED,wEAMC;IAED,uBAKC;IAED,aAGC;IAED,cAKC;IAED,wBAIC;IAED,0BAKC;IAED,wBAOC;IAED,sBAGC;IAED,yDAQC;IAED,2DASC;IAED,qDAQC;IAED,kFAuBC;IAED;;;;MAWC;IAED,gFAUC;IAED,mFAYC;IAED,sGAcC;IAID;;;MA8BC;IAED;;;;;;;;MA0CC;IAED,2BAEC;IAED,8BAEC;IAED,8BAEC;IAED,4BAEC;IAED,qCAUC;IAED,6CAEC;IAED,2DAIC;IAED,+DAMC;IAED,wCAIC;IAED,mFAUC;IAED,oEAgBC;IAED,qDAoBC;IAED,6CAIC;IAED,mFAqBC;IAED,oEA0BC;IAED,kEAoBC;IAED,+DAaC;IAED,yGAgBC;IAED,iIAqEC;IAED,gDAQC;IAED,mHA0DC;IAED,6FASC;IAED,qFAqCC;IAED,oJAuCC;IAED,yGAUC;IAED,4GAeC;IAED,uFAgBC;IAED,mGA6BC;IAED,gFAIC;IAED,+EAcC;IAED,wFAGC;IAED,sEAUC;IAED,mEAQC;IAED,mEAQC;IAED,sEAMC;IAED,oEAQC;IAED,uFA0BC;IAED,uFA0BC;IAED,mDAMC;IAED,kDAKC;IAED,gEAKC;IAED;;;;;;;;;;;MAiDC;IAED,oFAMC;IAED,6EAmDC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;MA2BC;IAED,kGAYC;IAED,+CAEC;IAED,wDAUC;IAED,iFAKC;IAED,iEAIC;IAED,yDAaC;IAED,oEAMC;IAED;;;MAMC;IAED,sDAiBC;IAED,8DAMC;IAED,4EAKC;IAED,+CAEC;IAED,sEAGC;IAED,2DAUC;IAED,yEAWC;IAED,oDAEC;IAED,2EASC;IAED,2EAGC;IAED,sFA4BC;IAED,sFA4BC;IAED,kFAeC;IAED,2DAMC;IAED,uDAqBC;IAED,gDAEC;IAED,gDAEC;IAED,sEAGC;IAED,qEAKC;IAED,2EAUC;IAED,iEAKC;IAED,uEAQC;IAED,mEAKC;IAED,yEAQC;IAED,2EASC;IAED,gGAKC;IAED,gFAGC;IAED,8CAyBC;IAED,gFAGC;IAED,iEAEC;IAED,gEAEC;IAED,gEAIC;IAED,gEAIC;IAED,+EAgCC;IAED,oBASC;IAED,oBASC;IAED,4EAwCC;IAED,4DAGC;IAED,sDASC;IAED,gEAGC;IAED,yDAMC;IAED,kEAGC;IAED,2DAMC;IAED,sEAeC;IAED,4CAOC;IAED,+BAKC;IAED,qDAiBC;IAED,gCAIC;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,2FAeC;IAED,6CAIC;IAED,0CAIC;IAED,uCAIC;IAED,wCAIC;IAED,2CAIC;IAED,mEASC;IAED,qDAQC;IAED,4CAUC;IAED,2DAOC;IAED,0CASC;IAED,6FAIC;IAED,yEAeC;IAED,gDAYC;IAED,6DAUC;CACF;AAxlFD;IACE,uBAGC;IAFC,YAA2B;IAC3B,qBAAuB;IAGzB,gCAKC;IAED,mBAEC;IAED,0BAUC;IAED,uBAEC;IAED,mBAEC;IAED,cAMC;IASD,6BAKC;IAZD,qDAKC;CAQF;AAED;IAiBE,0FAMC;IAtBD,kBAAa;IACb,gBAAW;IACX,iBAAY;IACZ,wBAAmB;IACnB,iBAAY;IACZ,gBAAW;IACX,WAAM;IACN,WAAM;IACN,mBAAc;IACd,qBAAgB;IAChB,gBAAW;IACX,kBAAa;IACb,uBAAkB;IAClB,uBAAkB;IAClB,gBAAW;IAGT,gBAA4B;IAC5B,cAAwB;IACxB,eAA0B;IAC1B,WAAkB;IAClB,iBAA8B;CAEjC"}
|