@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 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, scheduleTime: any, callback: any): void;
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[]>;
@@ -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,yCAUC;IAED,6DA2BC;IAED,8DASC;IAED,2EAqDC;IAED,mCAOC;IAED,0BAoDC;IAED,uDAEC;IAED,wDAEC;IAED,6EAEC;IAED;;;MA4EC;IAED,mGAoBC;IAED,wEAMC;IAED,uBAKC;IAED,aAGC;IAED,cAKC;IAED,wBAIC;IAED,0BAKC;IAED,wBAOC;IAED,sBAGC;IAED,4EASC;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,kGAgDC;IAED,6FAQC;IAED,qFAwBC;IAED,yHAuBC;IAED,yGASC;IAED,qFAUC;IAED,mGA2BC;IAED,gFAGC;IAED,wFAGC;IAED,sEAUC;IAED,mEAQC;IAED,wDAKC;IAED,sDAOC;IAED,mDAMC;IAED,kDAKC;IAED;;;;;;;;;;;MA2BC;IAED,oFAMC;IAED,6EAkDC;IAED;;;;;;;;;;;;;MAeC;IAED,kGAWC;IAED,wDAWC;IAED,iFAIC;IAED,oEAIC;IAED;;;MAMC;IAED,8DAIC;IAED,4EAIC;IAED,sEAGC;IAED,2DAUC;IAED,yEAMC;IAED,kFAeC;IAED,2DAMC;IAED,uDAkBC;IAED,gDAEC;IAED,gDAEC;IAED,sEAGC;IAED,qEAKC;IAED,2EAUC;IAED,8CAKC;IAED,oDAOC;IAED,gDAKC;IAED,sDAOC;IAED,gFAGC;IAED,8CAqBC;IAED,gFAGC;IAED,gFAgBC;IAED,oBAMC;IAED,4EAaC;IAED,4DAGC;IAED,sDASC;IAED,gDAYC;IAED,6DAUC;CACF;AA95CD;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"}
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
- channel.scheduledNotes.forEach((noteList) => {
580
- for (let i = 0; i < noteList.length; i++) {
581
- const note = noteList[i];
582
- if (!note)
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, scheduleTime, callback) {
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, scheduleTime, (note) => {
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, undefined, // portamentoNoteNumber
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 < channel.state.sustainPedal)
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
- this.processScheduledNotes(channel, scheduleTime, (note) => {
926
- const { noteNumber } = note;
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
- channel.scheduledNotes.forEach((noteList) => {
1041
- for (let i = 0; i < noteList.length; i++) {
1042
- const note = noteList[i];
1043
- if (!note)
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
- const controllerState = this.getControllerState(channel, note.noteNumber, note.velocity);
1046
- const voiceParams = note.voice.getParams(controllerType, controllerState);
1047
- let appliedFilterEnvelope = false;
1048
- let appliedVolumeEnvelope = false;
1049
- for (const [key, value] of Object.entries(voiceParams)) {
1050
- const prevValue = note.voiceParams[key];
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
- note.voiceParams[key] = value;
1054
- if (key in this.voiceParamsHandlers) {
1055
- this.voiceParamsHandlers[key](channel, note, prevValue, scheduleTime);
1056
- }
1057
- else if (filterEnvelopeKeySet.has(key)) {
1058
- if (appliedFilterEnvelope)
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
- else if (volumeEnvelopeKeySet.has(key)) {
1071
- if (appliedVolumeEnvelope)
1072
- continue;
1073
- appliedVolumeEnvelope = true;
1074
- const noteVoiceParams = note.voiceParams;
1075
- for (let i = 0; i < volumeEnvelopeKeys.length; i++) {
1076
- const key = volumeEnvelopeKeys[i];
1077
- if (key in voiceParams)
1078
- noteVoiceParams[key] = voiceParams[key];
1079
- }
1080
- this.setVolumeEnvelope(channel, note, scheduleTime);
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, scheduleTime, (note) => {
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].state.sustainPedal = value / 127;
1171
- if (value < 64) {
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, scheduleTime: any, callback: any): void;
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;
@@ -1 +1 @@
1
- {"version":3,"file":"midy-GM2.d.ts","sourceRoot":"","sources":["../src/midy-GM2.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"midy-GM2.d.ts","sourceRoot":"","sources":["../src/midy-GM2.js"],"names":[],"mappings":"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"}