@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/README.md
CHANGED
|
@@ -77,8 +77,8 @@ There are functions that handle SysEx data as is, as well as simplified
|
|
|
77
77
|
functions.
|
|
78
78
|
|
|
79
79
|
```js
|
|
80
|
-
midy.handleSysEx(data); // [F0 F6 04 01 xx xx F7] data
|
|
81
|
-
midy.handleMasterVolumeSysEx(data); // [F0 F6 04 01 xx xx F7] data
|
|
80
|
+
midy.handleSysEx(data, scheduleTime); // [F0 F6 04 01 xx xx F7] data
|
|
81
|
+
midy.handleMasterVolumeSysEx(data, scheduleTime); // [F0 F6 04 01 xx xx F7] data
|
|
82
82
|
midy.setMasterVolume(volume); // [0-1] volume
|
|
83
83
|
```
|
|
84
84
|
|
package/esm/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/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":"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/esm/midy-GM1.js
CHANGED
|
@@ -355,6 +355,7 @@ export class MidyGM1 {
|
|
|
355
355
|
state: new ControllerState(),
|
|
356
356
|
...this.setChannelAudioNodes(audioContext),
|
|
357
357
|
scheduledNotes: new SparseMap(128),
|
|
358
|
+
sustainNotes: [],
|
|
358
359
|
};
|
|
359
360
|
});
|
|
360
361
|
return channels;
|
|
@@ -412,7 +413,7 @@ export class MidyGM1 {
|
|
|
412
413
|
}
|
|
413
414
|
/* falls through */
|
|
414
415
|
case "noteOff": {
|
|
415
|
-
const notePromise = this.scheduleNoteOff(event.channel, event.noteNumber, event.velocity, startTime);
|
|
416
|
+
const notePromise = this.scheduleNoteOff(event.channel, event.noteNumber, event.velocity, startTime, false);
|
|
416
417
|
if (notePromise) {
|
|
417
418
|
this.notePromises.push(notePromise);
|
|
418
419
|
}
|
|
@@ -576,15 +577,10 @@ export class MidyGM1 {
|
|
|
576
577
|
stopChannelNotes(channelNumber, velocity, force, scheduleTime) {
|
|
577
578
|
const channel = this.channels[channelNumber];
|
|
578
579
|
const promises = [];
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
continue;
|
|
584
|
-
const promise = this.scheduleNoteOff(channelNumber, note.noteNumber, velocity, scheduleTime, force);
|
|
585
|
-
this.notePromises.push(promise);
|
|
586
|
-
promises.push(promise);
|
|
587
|
-
}
|
|
580
|
+
this.processScheduledNotes(channel, (note) => {
|
|
581
|
+
const promise = this.scheduleNoteOff(channelNumber, note.noteNumber, velocity, scheduleTime, force);
|
|
582
|
+
this.notePromises.push(promise);
|
|
583
|
+
promises.push(promise);
|
|
588
584
|
});
|
|
589
585
|
channel.scheduledNotes.clear();
|
|
590
586
|
return Promise.all(promises);
|
|
@@ -640,14 +636,12 @@ export class MidyGM1 {
|
|
|
640
636
|
const now = this.audioContext.currentTime;
|
|
641
637
|
return this.resumeTime + now - this.startTime - this.startDelay;
|
|
642
638
|
}
|
|
643
|
-
processScheduledNotes(channel,
|
|
639
|
+
processScheduledNotes(channel, callback) {
|
|
644
640
|
channel.scheduledNotes.forEach((noteList) => {
|
|
645
641
|
for (let i = 0; i < noteList.length; i++) {
|
|
646
642
|
const note = noteList[i];
|
|
647
643
|
if (!note)
|
|
648
644
|
continue;
|
|
649
|
-
if (scheduleTime < note.startTime)
|
|
650
|
-
continue;
|
|
651
645
|
callback(note);
|
|
652
646
|
}
|
|
653
647
|
});
|
|
@@ -693,7 +687,7 @@ export class MidyGM1 {
|
|
|
693
687
|
return tuning + pitch;
|
|
694
688
|
}
|
|
695
689
|
updateChannelDetune(channel, scheduleTime) {
|
|
696
|
-
this.processScheduledNotes(channel,
|
|
690
|
+
this.processScheduledNotes(channel, (note) => {
|
|
697
691
|
this.updateDetune(channel, note, scheduleTime);
|
|
698
692
|
});
|
|
699
693
|
}
|
|
@@ -842,6 +836,9 @@ export class MidyGM1 {
|
|
|
842
836
|
const note = await this.createNote(channel, voice, noteNumber, velocity, startTime, isSF3);
|
|
843
837
|
note.volumeEnvelopeNode.connect(channel.gainL);
|
|
844
838
|
note.volumeEnvelopeNode.connect(channel.gainR);
|
|
839
|
+
if (0.5 <= channel.state.sustainPedal) {
|
|
840
|
+
channel.sustainNotes.push(note);
|
|
841
|
+
}
|
|
845
842
|
const exclusiveClass = note.voiceParams.exclusiveClass;
|
|
846
843
|
if (exclusiveClass !== 0) {
|
|
847
844
|
if (this.exclusiveClassMap.has(exclusiveClass)) {
|
|
@@ -849,8 +846,7 @@ export class MidyGM1 {
|
|
|
849
846
|
const [prevNote, prevChannelNumber] = prevEntry;
|
|
850
847
|
if (!prevNote.ending) {
|
|
851
848
|
this.scheduleNoteOff(prevChannelNumber, prevNote.noteNumber, 0, // velocity,
|
|
852
|
-
startTime,
|
|
853
|
-
true);
|
|
849
|
+
startTime, true);
|
|
854
850
|
}
|
|
855
851
|
}
|
|
856
852
|
this.exclusiveClassMap.set(exclusiveClass, [note, channelNumber]);
|
|
@@ -894,7 +890,7 @@ export class MidyGM1 {
|
|
|
894
890
|
}
|
|
895
891
|
scheduleNoteOff(channelNumber, noteNumber, _velocity, endTime, force) {
|
|
896
892
|
const channel = this.channels[channelNumber];
|
|
897
|
-
if (!force && 0.5
|
|
893
|
+
if (!force && 0.5 <= channel.state.sustainPedal)
|
|
898
894
|
return;
|
|
899
895
|
if (!channel.scheduledNotes.has(noteNumber))
|
|
900
896
|
return;
|
|
@@ -922,11 +918,11 @@ export class MidyGM1 {
|
|
|
922
918
|
const velocity = halfVelocity * 2;
|
|
923
919
|
const channel = this.channels[channelNumber];
|
|
924
920
|
const promises = [];
|
|
925
|
-
|
|
926
|
-
const
|
|
927
|
-
const promise = this.noteOff(channelNumber, noteNumber, velocity);
|
|
921
|
+
for (let i = 0; i < channel.sustainNotes.length; i++) {
|
|
922
|
+
const promise = this.noteOff(channelNumber, channel.sustainNotes[i].noteNumber, velocity, scheduleTime);
|
|
928
923
|
promises.push(promise);
|
|
929
|
-
}
|
|
924
|
+
}
|
|
925
|
+
channel.sustainNotes = [];
|
|
930
926
|
return promises;
|
|
931
927
|
}
|
|
932
928
|
handleMIDIMessage(statusByte, data1, data2, scheduleTime) {
|
|
@@ -1037,48 +1033,43 @@ export class MidyGM1 {
|
|
|
1037
1033
|
return state;
|
|
1038
1034
|
}
|
|
1039
1035
|
applyVoiceParams(channel, controllerType, scheduleTime) {
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1036
|
+
this.processScheduledNotes(channel, (note) => {
|
|
1037
|
+
const controllerState = this.getControllerState(channel, note.noteNumber, note.velocity);
|
|
1038
|
+
const voiceParams = note.voice.getParams(controllerType, controllerState);
|
|
1039
|
+
let appliedFilterEnvelope = false;
|
|
1040
|
+
let appliedVolumeEnvelope = false;
|
|
1041
|
+
for (const [key, value] of Object.entries(voiceParams)) {
|
|
1042
|
+
const prevValue = note.voiceParams[key];
|
|
1043
|
+
if (value === prevValue)
|
|
1044
1044
|
continue;
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
if (value === prevValue)
|
|
1045
|
+
note.voiceParams[key] = value;
|
|
1046
|
+
if (key in this.voiceParamsHandlers) {
|
|
1047
|
+
this.voiceParamsHandlers[key](channel, note, prevValue, scheduleTime);
|
|
1048
|
+
}
|
|
1049
|
+
else if (filterEnvelopeKeySet.has(key)) {
|
|
1050
|
+
if (appliedFilterEnvelope)
|
|
1052
1051
|
continue;
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
continue;
|
|
1060
|
-
appliedFilterEnvelope = true;
|
|
1061
|
-
const noteVoiceParams = note.voiceParams;
|
|
1062
|
-
for (let i = 0; i < filterEnvelopeKeys.length; i++) {
|
|
1063
|
-
const key = filterEnvelopeKeys[i];
|
|
1064
|
-
if (key in voiceParams)
|
|
1065
|
-
noteVoiceParams[key] = voiceParams[key];
|
|
1066
|
-
}
|
|
1067
|
-
this.setFilterEnvelope(note, scheduleTime);
|
|
1068
|
-
this.setPitchEnvelope(note, scheduleTime);
|
|
1052
|
+
appliedFilterEnvelope = true;
|
|
1053
|
+
const noteVoiceParams = note.voiceParams;
|
|
1054
|
+
for (let i = 0; i < filterEnvelopeKeys.length; i++) {
|
|
1055
|
+
const key = filterEnvelopeKeys[i];
|
|
1056
|
+
if (key in voiceParams)
|
|
1057
|
+
noteVoiceParams[key] = voiceParams[key];
|
|
1069
1058
|
}
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1059
|
+
this.setFilterEnvelope(note, scheduleTime);
|
|
1060
|
+
this.setPitchEnvelope(note, scheduleTime);
|
|
1061
|
+
}
|
|
1062
|
+
else if (volumeEnvelopeKeySet.has(key)) {
|
|
1063
|
+
if (appliedVolumeEnvelope)
|
|
1064
|
+
continue;
|
|
1065
|
+
appliedVolumeEnvelope = true;
|
|
1066
|
+
const noteVoiceParams = note.voiceParams;
|
|
1067
|
+
for (let i = 0; i < volumeEnvelopeKeys.length; i++) {
|
|
1068
|
+
const key = volumeEnvelopeKeys[i];
|
|
1069
|
+
if (key in voiceParams)
|
|
1070
|
+
noteVoiceParams[key] = voiceParams[key];
|
|
1081
1071
|
}
|
|
1072
|
+
this.setVolumeEnvelope(note, scheduleTime);
|
|
1082
1073
|
}
|
|
1083
1074
|
}
|
|
1084
1075
|
});
|
|
@@ -1111,9 +1102,8 @@ export class MidyGM1 {
|
|
|
1111
1102
|
}
|
|
1112
1103
|
}
|
|
1113
1104
|
updateModulation(channel, scheduleTime) {
|
|
1114
|
-
scheduleTime ??= this.audioContext.currentTime;
|
|
1115
1105
|
const depth = channel.state.modulationDepth * channel.modulationDepthRange;
|
|
1116
|
-
this.processScheduledNotes(channel,
|
|
1106
|
+
this.processScheduledNotes(channel, (note) => {
|
|
1117
1107
|
if (note.modulationDepth) {
|
|
1118
1108
|
note.modulationDepth.gain.setValueAtTime(depth, scheduleTime);
|
|
1119
1109
|
}
|
|
@@ -1124,11 +1114,13 @@ export class MidyGM1 {
|
|
|
1124
1114
|
});
|
|
1125
1115
|
}
|
|
1126
1116
|
setModulationDepth(channelNumber, modulation, scheduleTime) {
|
|
1117
|
+
scheduleTime ??= this.audioContext.currentTime;
|
|
1127
1118
|
const channel = this.channels[channelNumber];
|
|
1128
1119
|
channel.state.modulationDepth = modulation / 127;
|
|
1129
1120
|
this.updateModulation(channel, scheduleTime);
|
|
1130
1121
|
}
|
|
1131
1122
|
setVolume(channelNumber, volume, scheduleTime) {
|
|
1123
|
+
scheduleTime ??= this.audioContext.currentTime;
|
|
1132
1124
|
const channel = this.channels[channelNumber];
|
|
1133
1125
|
channel.state.volume = volume / 127;
|
|
1134
1126
|
this.updateChannelVolume(channel, scheduleTime);
|
|
@@ -1141,11 +1133,13 @@ export class MidyGM1 {
|
|
|
1141
1133
|
};
|
|
1142
1134
|
}
|
|
1143
1135
|
setPan(channelNumber, pan, scheduleTime) {
|
|
1136
|
+
scheduleTime ??= this.audioContext.currentTime;
|
|
1144
1137
|
const channel = this.channels[channelNumber];
|
|
1145
1138
|
channel.state.pan = pan / 127;
|
|
1146
1139
|
this.updateChannelVolume(channel, scheduleTime);
|
|
1147
1140
|
}
|
|
1148
1141
|
setExpression(channelNumber, expression, scheduleTime) {
|
|
1142
|
+
scheduleTime ??= this.audioContext.currentTime;
|
|
1149
1143
|
const channel = this.channels[channelNumber];
|
|
1150
1144
|
channel.state.expression = expression / 127;
|
|
1151
1145
|
this.updateChannelVolume(channel, scheduleTime);
|
|
@@ -1167,8 +1161,14 @@ export class MidyGM1 {
|
|
|
1167
1161
|
}
|
|
1168
1162
|
setSustainPedal(channelNumber, value, scheduleTime) {
|
|
1169
1163
|
scheduleTime ??= this.audioContext.currentTime;
|
|
1170
|
-
this.channels[channelNumber]
|
|
1171
|
-
|
|
1164
|
+
const channel = this.channels[channelNumber];
|
|
1165
|
+
channel.state.sustainPedal = value / 127;
|
|
1166
|
+
if (64 <= value) {
|
|
1167
|
+
this.processScheduledNotes(channel, (note) => {
|
|
1168
|
+
channel.sustainNotes.push(note);
|
|
1169
|
+
});
|
|
1170
|
+
}
|
|
1171
|
+
else {
|
|
1172
1172
|
this.releaseSustainPedal(channelNumber, value, scheduleTime);
|
|
1173
1173
|
}
|
|
1174
1174
|
}
|
|
@@ -1206,10 +1206,10 @@ export class MidyGM1 {
|
|
|
1206
1206
|
this.handlePitchBendRangeRPN(channelNumber, scheduleTime);
|
|
1207
1207
|
break;
|
|
1208
1208
|
case 1:
|
|
1209
|
-
this.handleFineTuningRPN(channelNumber);
|
|
1209
|
+
this.handleFineTuningRPN(channelNumber, scheduleTime);
|
|
1210
1210
|
break;
|
|
1211
1211
|
case 2:
|
|
1212
|
-
this.handleCoarseTuningRPN(channelNumber);
|
|
1212
|
+
this.handleCoarseTuningRPN(channelNumber, scheduleTime);
|
|
1213
1213
|
break;
|
|
1214
1214
|
default:
|
|
1215
1215
|
console.warn(`Channel ${channelNumber}: Unsupported RPN MSB=${channel.rpnMSB} LSB=${channel.rpnLSB}`);
|
|
@@ -1242,33 +1242,35 @@ export class MidyGM1 {
|
|
|
1242
1242
|
this.updateChannelDetune(channel, scheduleTime);
|
|
1243
1243
|
this.applyVoiceParams(channel, 16, scheduleTime);
|
|
1244
1244
|
}
|
|
1245
|
-
handleFineTuningRPN(channelNumber) {
|
|
1245
|
+
handleFineTuningRPN(channelNumber, scheduleTime) {
|
|
1246
1246
|
const channel = this.channels[channelNumber];
|
|
1247
1247
|
this.limitData(channel, 0, 127, 0, 127);
|
|
1248
1248
|
const fineTuning = channel.dataMSB * 128 + channel.dataLSB;
|
|
1249
|
-
this.setFineTuning(channelNumber, fineTuning);
|
|
1249
|
+
this.setFineTuning(channelNumber, fineTuning, scheduleTime);
|
|
1250
1250
|
}
|
|
1251
|
-
setFineTuning(channelNumber, value) {
|
|
1251
|
+
setFineTuning(channelNumber, value, scheduleTime) {
|
|
1252
|
+
scheduleTime ??= this.audioContext.currentTime;
|
|
1252
1253
|
const channel = this.channels[channelNumber];
|
|
1253
1254
|
const prev = channel.fineTuning;
|
|
1254
1255
|
const next = (value - 8192) / 8.192; // cent
|
|
1255
1256
|
channel.fineTuning = next;
|
|
1256
1257
|
channel.detune += next - prev;
|
|
1257
|
-
this.updateChannelDetune(channel);
|
|
1258
|
+
this.updateChannelDetune(channel, scheduleTime);
|
|
1258
1259
|
}
|
|
1259
|
-
handleCoarseTuningRPN(channelNumber) {
|
|
1260
|
+
handleCoarseTuningRPN(channelNumber, scheduleTime) {
|
|
1260
1261
|
const channel = this.channels[channelNumber];
|
|
1261
1262
|
this.limitDataMSB(channel, 0, 127);
|
|
1262
1263
|
const coarseTuning = channel.dataMSB;
|
|
1263
|
-
this.setCoarseTuning(channelNumber, coarseTuning);
|
|
1264
|
+
this.setCoarseTuning(channelNumber, coarseTuning, scheduleTime);
|
|
1264
1265
|
}
|
|
1265
|
-
setCoarseTuning(channelNumber, value) {
|
|
1266
|
+
setCoarseTuning(channelNumber, value, scheduleTime) {
|
|
1267
|
+
scheduleTime ??= this.audioContext.currentTime;
|
|
1266
1268
|
const channel = this.channels[channelNumber];
|
|
1267
1269
|
const prev = channel.coarseTuning;
|
|
1268
1270
|
const next = (value - 64) * 100; // cent
|
|
1269
1271
|
channel.coarseTuning = next;
|
|
1270
1272
|
channel.detune += next - prev;
|
|
1271
|
-
this.updateChannelDetune(channel);
|
|
1273
|
+
this.updateChannelDetune(channel, scheduleTime);
|
|
1272
1274
|
}
|
|
1273
1275
|
allSoundOff(channelNumber, _value, scheduleTime) {
|
|
1274
1276
|
scheduleTime ??= this.audioContext.currentTime;
|
package/esm/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/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":"AA8KA;
|
|
1
|
+
{"version":3,"file":"midy-GM2.d.ts","sourceRoot":"","sources":["../src/midy-GM2.js"],"names":[],"mappings":"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"}
|