@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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@marmooo/midy",
3
- "version": "0.2.7",
3
+ "version": "0.2.8",
4
4
  "description": "A MIDI player/synthesizer written in JavaScript that supports GM-Lite/GM1 and SF2/SF3.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -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"}
@@ -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
- channel.scheduledNotes.forEach((noteList) => {
583
- for (let i = 0; i < noteList.length; i++) {
584
- const note = noteList[i];
585
- if (!note)
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, scheduleTime, callback) {
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, scheduleTime, (note) => {
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, undefined, // portamentoNoteNumber
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 < channel.state.sustainPedal)
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
- this.processScheduledNotes(channel, scheduleTime, (note) => {
929
- const { noteNumber } = note;
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
- channel.scheduledNotes.forEach((noteList) => {
1044
- for (let i = 0; i < noteList.length; i++) {
1045
- const note = noteList[i];
1046
- if (!note)
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
- const controllerState = this.getControllerState(channel, note.noteNumber, note.velocity);
1049
- const voiceParams = note.voice.getParams(controllerType, controllerState);
1050
- let appliedFilterEnvelope = false;
1051
- let appliedVolumeEnvelope = false;
1052
- for (const [key, value] of Object.entries(voiceParams)) {
1053
- const prevValue = note.voiceParams[key];
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
- note.voiceParams[key] = value;
1057
- if (key in this.voiceParamsHandlers) {
1058
- this.voiceParamsHandlers[key](channel, note, prevValue, scheduleTime);
1059
- }
1060
- else if (filterEnvelopeKeySet.has(key)) {
1061
- if (appliedFilterEnvelope)
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
- else if (volumeEnvelopeKeySet.has(key)) {
1074
- if (appliedVolumeEnvelope)
1075
- continue;
1076
- appliedVolumeEnvelope = true;
1077
- const noteVoiceParams = note.voiceParams;
1078
- for (let i = 0; i < volumeEnvelopeKeys.length; i++) {
1079
- const key = volumeEnvelopeKeys[i];
1080
- if (key in voiceParams)
1081
- noteVoiceParams[key] = voiceParams[key];
1082
- }
1083
- this.setVolumeEnvelope(channel, note, scheduleTime);
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, scheduleTime, (note) => {
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].state.sustainPedal = value / 127;
1174
- if (value < 64) {
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;
@@ -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":"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"}