@marmooo/midy 0.2.5 → 0.2.6

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.
@@ -37,22 +37,22 @@ export class MidyGM1 {
37
37
  masterVolume: any;
38
38
  voiceParamsHandlers: {
39
39
  modLfoToPitch: (channel: any, note: any, _prevValue: any) => void;
40
- vibLfoToPitch: (channel: any, note: any, _prevValue: any) => void;
40
+ vibLfoToPitch: (_channel: any, _note: any, _prevValue: any) => void;
41
41
  modLfoToFilterFc: (channel: any, note: any, _prevValue: any) => void;
42
42
  modLfoToVolume: (channel: any, note: any, _prevValue: any) => void;
43
43
  chorusEffectsSend: (_channel: any, _note: any, _prevValue: any) => void;
44
44
  reverbEffectsSend: (_channel: any, _note: any, _prevValue: any) => void;
45
45
  delayModLFO: (_channel: any, note: any, _prevValue: any) => void;
46
46
  freqModLFO: (_channel: any, note: any, _prevValue: any) => void;
47
- delayVibLFO: (channel: any, note: any, prevValue: any) => void;
48
- freqVibLFO: (channel: any, note: any, _prevValue: any) => void;
47
+ delayVibLFO: (_channel: any, _note: any, _prevValue: any) => void;
48
+ freqVibLFO: (_channel: any, _note: any, _prevValue: any) => void;
49
49
  };
50
50
  controlChangeHandlers: {
51
- 1: (channelNumber: any, modulation: any) => void;
51
+ 1: (channelNumber: any, modulation: any, scheduleTime: any) => void;
52
52
  6: (channelNumber: any, value: any) => void;
53
- 7: (channelNumber: any, volume: any) => void;
54
- 10: (channelNumber: any, pan: any) => void;
55
- 11: (channelNumber: any, expression: any) => void;
53
+ 7: (channelNumber: any, volume: any, scheduleTime: any) => void;
54
+ 10: (channelNumber: any, pan: any, scheduleTime: any) => void;
55
+ 11: (channelNumber: any, expression: any, scheduleTime: any) => void;
56
56
  38: (channelNumber: any, value: any) => void;
57
57
  64: (channelNumber: any, value: any) => void;
58
58
  100: (channelNumber: any, value: any) => void;
@@ -93,6 +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
97
  getActiveNotes(channel: any, time: any): SparseMap;
97
98
  getActiveNote(noteList: any, time: any): any;
98
99
  cbToRatio(cb: any): number;
@@ -103,7 +104,7 @@ export class MidyGM1 {
103
104
  updateChannelDetune(channel: any): void;
104
105
  updateDetune(channel: any, note: any): void;
105
106
  setVolumeEnvelope(note: any): void;
106
- setPitchEnvelope(note: any): void;
107
+ setPitchEnvelope(note: any, scheduleTime: any): void;
107
108
  clampCutoffFrequency(frequency: any): number;
108
109
  setFilterEnvelope(note: any): void;
109
110
  startModulation(channel: any, note: any, startTime: any): void;
@@ -120,31 +121,30 @@ export class MidyGM1 {
120
121
  handlePitchBendMessage(channelNumber: any, lsb: any, msb: any): void;
121
122
  setPitchBend(channelNumber: any, value: any): void;
122
123
  setModLfoToPitch(channel: any, note: any): void;
123
- setVibLfoToPitch(channel: any, note: any): void;
124
124
  setModLfoToFilterFc(note: any): void;
125
125
  setModLfoToVolume(note: any): void;
126
126
  setDelayModLFO(note: any): void;
127
127
  setFreqModLFO(note: any): void;
128
128
  createVoiceParamsHandlers(): {
129
129
  modLfoToPitch: (channel: any, note: any, _prevValue: any) => void;
130
- vibLfoToPitch: (channel: any, note: any, _prevValue: any) => void;
130
+ vibLfoToPitch: (_channel: any, _note: any, _prevValue: any) => void;
131
131
  modLfoToFilterFc: (channel: any, note: any, _prevValue: any) => void;
132
132
  modLfoToVolume: (channel: any, note: any, _prevValue: any) => void;
133
133
  chorusEffectsSend: (_channel: any, _note: any, _prevValue: any) => void;
134
134
  reverbEffectsSend: (_channel: any, _note: any, _prevValue: any) => void;
135
135
  delayModLFO: (_channel: any, note: any, _prevValue: any) => void;
136
136
  freqModLFO: (_channel: any, note: any, _prevValue: any) => void;
137
- delayVibLFO: (channel: any, note: any, prevValue: any) => void;
138
- freqVibLFO: (channel: any, note: any, _prevValue: any) => void;
137
+ delayVibLFO: (_channel: any, _note: any, _prevValue: any) => void;
138
+ freqVibLFO: (_channel: any, _note: any, _prevValue: any) => void;
139
139
  };
140
140
  getControllerState(channel: any, noteNumber: any, velocity: any): Float32Array<any>;
141
141
  applyVoiceParams(channel: any, controllerType: any): void;
142
142
  createControlChangeHandlers(): {
143
- 1: (channelNumber: any, modulation: any) => void;
143
+ 1: (channelNumber: any, modulation: any, scheduleTime: any) => void;
144
144
  6: (channelNumber: any, value: any) => void;
145
- 7: (channelNumber: any, volume: any) => void;
146
- 10: (channelNumber: any, pan: any) => void;
147
- 11: (channelNumber: any, expression: any) => void;
145
+ 7: (channelNumber: any, volume: any, scheduleTime: any) => void;
146
+ 10: (channelNumber: any, pan: any, scheduleTime: any) => void;
147
+ 11: (channelNumber: any, expression: any, scheduleTime: any) => void;
148
148
  38: (channelNumber: any, value: any) => void;
149
149
  64: (channelNumber: any, value: any) => void;
150
150
  100: (channelNumber: any, value: any) => void;
@@ -153,18 +153,18 @@ export class MidyGM1 {
153
153
  121: (channelNumber: any) => void;
154
154
  123: (channelNumber: any) => Promise<void>;
155
155
  };
156
- handleControlChange(channelNumber: any, controllerType: any, value: any): void;
157
- updateModulation(channel: any): void;
158
- setModulationDepth(channelNumber: any, modulation: any): void;
159
- setVolume(channelNumber: any, volume: any): void;
156
+ handleControlChange(channelNumber: any, controllerType: any, value: any, startTime: any): void;
157
+ updateModulation(channel: any, scheduleTime: any): void;
158
+ setModulationDepth(channelNumber: any, modulation: any, scheduleTime: any): void;
159
+ setVolume(channelNumber: any, volume: any, scheduleTime: any): void;
160
160
  panToGain(pan: any): {
161
161
  gainLeft: number;
162
162
  gainRight: number;
163
163
  };
164
- setPan(channelNumber: any, pan: any): void;
165
- setExpression(channelNumber: any, expression: any): void;
164
+ setPan(channelNumber: any, pan: any, scheduleTime: any): void;
165
+ setExpression(channelNumber: any, expression: any, scheduleTime: any): void;
166
166
  dataEntryLSB(channelNumber: any, value: any): void;
167
- updateChannelVolume(channel: any): void;
167
+ updateChannelVolume(channel: any, scheduleTime: any): void;
168
168
  setSustainPedal(channelNumber: any, value: any): void;
169
169
  limitData(channel: any, minMSB: any, maxMSB: any, minLSB: any, maxLSB: any): void;
170
170
  limitDataMSB(channel: any, minMSB: any, maxMSB: any): void;
@@ -207,12 +207,11 @@ declare class Note {
207
207
  constructor(noteNumber: any, velocity: any, startTime: any, voice: any, voiceParams: any);
208
208
  bufferSource: any;
209
209
  filterNode: any;
210
+ filterDepth: any;
210
211
  volumeEnvelopeNode: any;
211
212
  volumeDepth: any;
212
213
  modulationLFO: any;
213
214
  modulationDepth: any;
214
- vibratoLFO: any;
215
- vibratoDepth: any;
216
215
  noteNumber: any;
217
216
  velocity: any;
218
217
  startTime: any;
@@ -1 +1 @@
1
- {"version":3,"file":"midy-GM1.d.ts","sourceRoot":"","sources":["../src/midy-GM1.js"],"names":[],"mappings":"AAkJA;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,2EA+CC;IAED,mCAOC;IAED,0BAoDC;IAED,uDAEC;IAED,wDAEC;IAED,6EAEC;IAED;;;MA4EC;IAED,+EAmBC;IAED,qDAKC;IAED,uBAKC;IAED,aAGC;IAED,cAKC;IAED,wBAIC;IAED,0BAKC;IAED,wBAOC;IAED,sBAGC;IAED,mDASC;IAED,6CAQC;IAED,2BAEC;IAED,8BAEC;IAED,8BAEC;IAED,4BAEC;IAED,qCAMC;IAED,wCAQC;IAED,4CAKC;IAED,mCAgBC;IAED,kCAqBC;IAED,6CAIC;IAED,mCAuBC;IAED,+DAoBC;IAED,yGAgBC;IAED,gHAuCC;IAED,kGAgDC;IAED,0EAGC;IAED,qFA4BC;IAED,6HAuBC;IAED,0FAGC;IAED,kEAeC;IAED,gFAiBC;IAED,4DAGC;IAED,qEAGC;IAED,mDASC;IAED,gDASC;IAED,gDASC;IAED,qCAMC;IAED,mCAQC;IAED,gCAOC;IAED,+BAMC;IAED;;;;;;;;;;;MA4CC;IAED,oFAMC;IAED,0DA6CC;IAED;;;;;;;;;;;;;MAeC;IAED,+EAWC;IAED,qCAeC;IAED,8DAIC;IACD,iDAIC;IAED;;;MAMC;IAED,2CAIC;IAED,yDAIC;IAED,mDAGC;IAED,wCAWC;IAED,sDAKC;IAED,kFAeC;IAED,2DAMC;IAED,oCAkBC;IAED,gDAEC;IAED,gDAEC;IAED,mDAGC;IAED,kDAKC;IAED,wDASC;IAED,8CAKC;IAED,oDAOC;IAED,gDAKC;IAED,sDAOC;IAED,+CAEC;IAED,8CAqBC;IAED,+CAEC;IAED,4DAgBC;IAED,oBAMC;IAED,yDAaC;IAED,yCAGC;IAED,mCAQC;IAED,wCAEC;IAED,6BASC;IAED,0DAUC;CACF;AAl6CD;IACE,uBAGC;IAFC,YAA2B;IAC3B,qBAAuB;IAGzB,gCAKC;IAED,mBAEC;IAED,0BAUC;IAED,uBAEC;IAED,mBAEC;IAED,cAMC;IASD,6BAKC;IAZD,qDAKC;CAQF;AAED;IAUE,0FAMC;IAfD,kBAAa;IACb,gBAAW;IACX,wBAAmB;IACnB,iBAAY;IACZ,mBAAc;IACd,qBAAgB;IAChB,gBAAW;IACX,kBAAa;IAGX,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,yCAUC;IAED,6DA2BC;IAED,8DASC;IAED,2EAqDC;IAED,mCAOC;IAED,0BAoDC;IAED,uDAEC;IAED,wDAEC;IAED,6EAEC;IAED;;;MA4EC;IAED,+EAmBC;IAED,qDAKC;IAED,uBAKC;IAED,aAGC;IAED,cAKC;IAED,wBAIC;IAED,0BAKC;IAED,wBAOC;IAED,sBAGC;IAED,4EASC;IAED,mDASC;IAED,6CAQC;IAED,2BAEC;IAED,8BAEC;IAED,8BAEC;IAED,4BAEC;IAED,qCAMC;IAED,wCAQC;IAED,4CAKC;IAED,mCAgBC;IAED,qDAqBC;IAED,6CAIC;IAED,mCAuBC;IAED,+DAoBC;IAED,yGAgBC;IAED,gHAuCC;IAED,kGAgDC;IAED,0EAGC;IAED,qFAwBC;IAED,6HAuBC;IAED,0FAGC;IAED,kEAeC;IAED,gFAiBC;IAED,4DAGC;IAED,qEAGC;IAED,mDASC;IAED,gDASC;IAED,qCAMC;IAED,mCAQC;IAED,gCAOC;IAED,+BAMC;IAED;;;;;;;;;;;MAqBC;IAED,oFAMC;IAED,0DA6CC;IAED;;;;;;;;;;;;;MAeC;IAED,+FAWC;IAED,wDAWC;IAED,iFAIC;IAED,oEAIC;IAED;;;MAMC;IAED,8DAIC;IAED,4EAIC;IAED,mDAGC;IAED,2DAWC;IAED,sDAKC;IAED,kFAeC;IAED,2DAMC;IAED,oCAkBC;IAED,gDAEC;IAED,gDAEC;IAED,mDAGC;IAED,kDAKC;IAED,wDASC;IAED,8CAKC;IAED,oDAOC;IAED,gDAKC;IAED,sDAOC;IAED,+CAEC;IAED,8CAqBC;IAED,+CAEC;IAED,4DAgBC;IAED,oBAMC;IAED,yDAaC;IAED,yCAGC;IAED,mCAQC;IAED,wCAEC;IAED,6BASC;IAED,0DAUC;CACF;AAz4CD;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"}
@@ -69,37 +69,31 @@ class Note {
69
69
  writable: true,
70
70
  value: void 0
71
71
  });
72
- Object.defineProperty(this, "volumeEnvelopeNode", {
73
- enumerable: true,
74
- configurable: true,
75
- writable: true,
76
- value: void 0
77
- });
78
- Object.defineProperty(this, "volumeDepth", {
72
+ Object.defineProperty(this, "filterDepth", {
79
73
  enumerable: true,
80
74
  configurable: true,
81
75
  writable: true,
82
76
  value: void 0
83
77
  });
84
- Object.defineProperty(this, "modulationLFO", {
78
+ Object.defineProperty(this, "volumeEnvelopeNode", {
85
79
  enumerable: true,
86
80
  configurable: true,
87
81
  writable: true,
88
82
  value: void 0
89
83
  });
90
- Object.defineProperty(this, "modulationDepth", {
84
+ Object.defineProperty(this, "volumeDepth", {
91
85
  enumerable: true,
92
86
  configurable: true,
93
87
  writable: true,
94
88
  value: void 0
95
89
  });
96
- Object.defineProperty(this, "vibratoLFO", {
90
+ Object.defineProperty(this, "modulationLFO", {
97
91
  enumerable: true,
98
92
  configurable: true,
99
93
  writable: true,
100
94
  value: void 0
101
95
  });
102
- Object.defineProperty(this, "vibratoDepth", {
96
+ Object.defineProperty(this, "modulationDepth", {
103
97
  enumerable: true,
104
98
  configurable: true,
105
99
  writable: true,
@@ -412,31 +406,32 @@ class MidyGM1 {
412
406
  const event = this.timeline[queueIndex];
413
407
  if (event.startTime > t + this.lookAhead)
414
408
  break;
409
+ const startTime = event.startTime + this.startDelay - offset;
415
410
  switch (event.type) {
416
411
  case "noteOn":
417
412
  if (event.velocity !== 0) {
418
- await this.scheduleNoteOn(event.channel, event.noteNumber, event.velocity, event.startTime + this.startDelay - offset);
413
+ await this.scheduleNoteOn(event.channel, event.noteNumber, event.velocity, startTime);
419
414
  break;
420
415
  }
421
416
  /* falls through */
422
417
  case "noteOff": {
423
- const notePromise = this.scheduleNoteRelease(event.channel, event.noteNumber, event.velocity, event.startTime + this.startDelay - offset);
418
+ const notePromise = this.scheduleNoteRelease(event.channel, event.noteNumber, event.velocity, startTime);
424
419
  if (notePromise) {
425
420
  this.notePromises.push(notePromise);
426
421
  }
427
422
  break;
428
423
  }
429
424
  case "controller":
430
- this.handleControlChange(event.channel, event.controllerType, event.value);
425
+ this.handleControlChange(event.channel, event.controllerType, event.value, startTime);
431
426
  break;
432
427
  case "programChange":
433
- this.handleProgramChange(event.channel, event.programNumber);
428
+ this.handleProgramChange(event.channel, event.programNumber, startTime);
434
429
  break;
435
430
  case "pitchBend":
436
- this.setPitchBend(event.channel, event.value + 8192);
431
+ this.setPitchBend(event.channel, event.value + 8192, startTime);
437
432
  break;
438
433
  case "sysEx":
439
- this.handleSysEx(event.data);
434
+ this.handleSysEx(event.data, startTime);
440
435
  }
441
436
  queueIndex++;
442
437
  }
@@ -646,6 +641,18 @@ class MidyGM1 {
646
641
  const now = this.audioContext.currentTime;
647
642
  return this.resumeTime + now - this.startTime - this.startDelay;
648
643
  }
644
+ processScheduledNotes(channel, scheduleTime, callback) {
645
+ channel.scheduledNotes.forEach((noteList) => {
646
+ for (let i = 0; i < noteList.length; i++) {
647
+ const note = noteList[i];
648
+ if (!note)
649
+ continue;
650
+ if (scheduleTime < note.startTime)
651
+ continue;
652
+ callback(note);
653
+ }
654
+ });
655
+ }
649
656
  getActiveNotes(channel, time) {
650
657
  const activeNotes = new SparseMap(128);
651
658
  channel.scheduledNotes.forEach((noteList) => {
@@ -719,20 +726,20 @@ class MidyGM1 {
719
726
  .setValueAtTime(attackVolume, volHold)
720
727
  .linearRampToValueAtTime(sustainVolume, volDecay);
721
728
  }
722
- setPitchEnvelope(note) {
723
- const now = this.audioContext.currentTime;
729
+ setPitchEnvelope(note, scheduleTime) {
730
+ scheduleTime ??= this.audioContext.currentTime;
724
731
  const { voiceParams } = note;
725
732
  const baseRate = voiceParams.playbackRate;
726
733
  note.bufferSource.playbackRate
727
- .cancelScheduledValues(now)
728
- .setValueAtTime(baseRate, now);
734
+ .cancelScheduledValues(scheduleTime)
735
+ .setValueAtTime(baseRate, scheduleTime);
729
736
  const modEnvToPitch = voiceParams.modEnvToPitch;
730
737
  if (modEnvToPitch === 0)
731
738
  return;
732
739
  const basePitch = this.rateToCent(baseRate);
733
740
  const peekPitch = basePitch + modEnvToPitch;
734
741
  const peekRate = this.centToRate(peekPitch);
735
- const modDelay = startTime + voiceParams.modDelay;
742
+ const modDelay = note.startTime + voiceParams.modDelay;
736
743
  const modAttack = modDelay + voiceParams.modAttack;
737
744
  const modHold = modAttack + voiceParams.modHold;
738
745
  const modDecay = modHold + voiceParams.modDecay;
@@ -889,10 +896,6 @@ class MidyGM1 {
889
896
  note.modulationDepth.disconnect();
890
897
  note.modulationLFO.stop();
891
898
  }
892
- if (note.vibratoDepth) {
893
- note.vibratoDepth.disconnect();
894
- note.vibratoLFO.stop();
895
- }
896
899
  resolve();
897
900
  };
898
901
  note.bufferSource.stop(stopTime);
@@ -987,16 +990,6 @@ class MidyGM1 {
987
990
  .cancelScheduledValues(now)
988
991
  .setValueAtTime(modulationDepth, now);
989
992
  }
990
- setVibLfoToPitch(channel, note) {
991
- const now = this.audioContext.currentTime;
992
- const vibLfoToPitch = note.voiceParams.vibLfoToPitch;
993
- const vibratoDepth = Math.abs(vibLfoToPitch) * channel.state.vibratoDepth *
994
- 2;
995
- const vibratoDepthSign = 0 < vibLfoToPitch;
996
- note.vibratoDepth.gain
997
- .cancelScheduledValues(now)
998
- .setValueAtTime(vibratoDepth * vibratoDepthSign, now);
999
- }
1000
993
  setModLfoToFilterFc(note) {
1001
994
  const now = this.audioContext.currentTime;
1002
995
  const modLfoToFilterFc = note.voiceParams.modLfoToFilterFc;
@@ -1036,11 +1029,7 @@ class MidyGM1 {
1036
1029
  this.setModLfoToPitch(channel, note);
1037
1030
  }
1038
1031
  },
1039
- vibLfoToPitch: (channel, note, _prevValue) => {
1040
- if (0 < channel.state.vibratoDepth) {
1041
- this.setVibLfoToPitch(channel, note);
1042
- }
1043
- },
1032
+ vibLfoToPitch: (_channel, _note, _prevValue) => { },
1044
1033
  modLfoToFilterFc: (channel, note, _prevValue) => {
1045
1034
  if (0 < channel.state.modulationDepth)
1046
1035
  this.setModLfoToFilterFc(note);
@@ -1053,28 +1042,8 @@ class MidyGM1 {
1053
1042
  reverbEffectsSend: (_channel, _note, _prevValue) => { },
1054
1043
  delayModLFO: (_channel, note, _prevValue) => this.setDelayModLFO(note),
1055
1044
  freqModLFO: (_channel, note, _prevValue) => this.setFreqModLFO(note),
1056
- delayVibLFO: (channel, note, prevValue) => {
1057
- if (0 < channel.state.vibratoDepth) {
1058
- const now = this.audioContext.currentTime;
1059
- const vibratoDelay = channel.state.vibratoDelay * 2;
1060
- const prevStartTime = note.startTime + prevValue * vibratoDelay;
1061
- if (now < prevStartTime)
1062
- return;
1063
- const value = note.voiceParams.delayVibLFO;
1064
- const startTime = note.startTime + value * vibratoDelay;
1065
- note.vibratoLFO.stop(now);
1066
- note.vibratoLFO.start(startTime);
1067
- }
1068
- },
1069
- freqVibLFO: (channel, note, _prevValue) => {
1070
- if (0 < channel.state.vibratoDepth) {
1071
- const now = this.audioContext.currentTime;
1072
- const freqVibLFO = note.voiceParams.freqVibLFO;
1073
- note.vibratoLFO.frequency
1074
- .cancelScheduledValues(now)
1075
- .setValueAtTime(freqVibLFO * channel.state.vibratoRate * 2, now);
1076
- }
1077
- },
1045
+ delayVibLFO: (_channel, _note, _prevValue) => { },
1046
+ freqVibLFO: (_channel, _note, _prevValue) => { },
1078
1047
  };
1079
1048
  }
1080
1049
  getControllerState(channel, noteNumber, velocity) {
@@ -1147,10 +1116,10 @@ class MidyGM1 {
1147
1116
  123: this.allNotesOff,
1148
1117
  };
1149
1118
  }
1150
- handleControlChange(channelNumber, controllerType, value) {
1119
+ handleControlChange(channelNumber, controllerType, value, startTime) {
1151
1120
  const handler = this.controlChangeHandlers[controllerType];
1152
1121
  if (handler) {
1153
- handler.call(this, channelNumber, value);
1122
+ handler.call(this, channelNumber, value, startTime);
1154
1123
  const channel = this.channels[channelNumber];
1155
1124
  this.applyVoiceParams(channel, controllerType + 128);
1156
1125
  }
@@ -1158,33 +1127,28 @@ class MidyGM1 {
1158
1127
  console.warn(`Unsupported Control change: controllerType=${controllerType} value=${value}`);
1159
1128
  }
1160
1129
  }
1161
- updateModulation(channel) {
1162
- const now = this.audioContext.currentTime;
1130
+ updateModulation(channel, scheduleTime) {
1131
+ scheduleTime ??= this.audioContext.currentTime;
1163
1132
  const depth = channel.state.modulationDepth * channel.modulationDepthRange;
1164
- channel.scheduledNotes.forEach((noteList) => {
1165
- for (let i = 0; i < noteList.length; i++) {
1166
- const note = noteList[i];
1167
- if (!note)
1168
- continue;
1169
- if (note.modulationDepth) {
1170
- note.modulationDepth.gain.setValueAtTime(depth, now);
1171
- }
1172
- else {
1173
- this.setPitchEnvelope(note);
1174
- this.startModulation(channel, note, now);
1175
- }
1133
+ this.processScheduledNotes(channel, scheduleTime, (note) => {
1134
+ if (note.modulationDepth) {
1135
+ note.modulationDepth.gain.setValueAtTime(depth, scheduleTime);
1136
+ }
1137
+ else {
1138
+ this.setPitchEnvelope(note, scheduleTime);
1139
+ this.startModulation(channel, note, scheduleTime);
1176
1140
  }
1177
1141
  });
1178
1142
  }
1179
- setModulationDepth(channelNumber, modulation) {
1143
+ setModulationDepth(channelNumber, modulation, scheduleTime) {
1180
1144
  const channel = this.channels[channelNumber];
1181
1145
  channel.state.modulationDepth = modulation / 127;
1182
- this.updateModulation(channel);
1146
+ this.updateModulation(channel, scheduleTime);
1183
1147
  }
1184
- setVolume(channelNumber, volume) {
1148
+ setVolume(channelNumber, volume, scheduleTime) {
1185
1149
  const channel = this.channels[channelNumber];
1186
1150
  channel.state.volume = volume / 127;
1187
- this.updateChannelVolume(channel);
1151
+ this.updateChannelVolume(channel, scheduleTime);
1188
1152
  }
1189
1153
  panToGain(pan) {
1190
1154
  const theta = Math.PI / 2 * Math.max(0, pan * 127 - 1) / 126;
@@ -1193,31 +1157,31 @@ class MidyGM1 {
1193
1157
  gainRight: Math.sin(theta),
1194
1158
  };
1195
1159
  }
1196
- setPan(channelNumber, pan) {
1160
+ setPan(channelNumber, pan, scheduleTime) {
1197
1161
  const channel = this.channels[channelNumber];
1198
1162
  channel.state.pan = pan / 127;
1199
- this.updateChannelVolume(channel);
1163
+ this.updateChannelVolume(channel, scheduleTime);
1200
1164
  }
1201
- setExpression(channelNumber, expression) {
1165
+ setExpression(channelNumber, expression, scheduleTime) {
1202
1166
  const channel = this.channels[channelNumber];
1203
1167
  channel.state.expression = expression / 127;
1204
- this.updateChannelVolume(channel);
1168
+ this.updateChannelVolume(channel, scheduleTime);
1205
1169
  }
1206
1170
  dataEntryLSB(channelNumber, value) {
1207
1171
  this.channels[channelNumber].dataLSB = value;
1208
1172
  this.handleRPN(channelNumber, 0);
1209
1173
  }
1210
- updateChannelVolume(channel) {
1211
- const now = this.audioContext.currentTime;
1174
+ updateChannelVolume(channel, scheduleTime) {
1175
+ scheduleTime ??= this.audioContext.currentTime;
1212
1176
  const state = channel.state;
1213
1177
  const volume = state.volume * state.expression;
1214
1178
  const { gainLeft, gainRight } = this.panToGain(state.pan);
1215
1179
  channel.gainL.gain
1216
1180
  .cancelScheduledValues(now)
1217
- .setValueAtTime(volume * gainLeft, now);
1181
+ .setValueAtTime(volume * gainLeft, scheduleTime);
1218
1182
  channel.gainR.gain
1219
1183
  .cancelScheduledValues(now)
1220
- .setValueAtTime(volume * gainRight, now);
1184
+ .setValueAtTime(volume * gainRight, scheduleTime);
1221
1185
  }
1222
1186
  setSustainPedal(channelNumber, value) {
1223
1187
  this.channels[channelNumber].state.sustainPedal = value / 127;
@@ -2,9 +2,6 @@ export class MidyGM2 {
2
2
  static channelSettings: {
3
3
  currentBufferSource: null;
4
4
  detune: number;
5
- scaleOctaveTuningTable: Int8Array<ArrayBuffer>;
6
- channelPressureTable: Uint8Array<ArrayBuffer>;
7
- keyBasedInstrumentControlTable: Int8Array<ArrayBuffer>;
8
5
  program: number;
9
6
  bank: number;
10
7
  bankMSB: number;
@@ -86,12 +83,12 @@ export class MidyGM2 {
86
83
  };
87
84
  controlChangeHandlers: {
88
85
  0: (channelNumber: any, msb: any) => void;
89
- 1: (channelNumber: any, modulation: any) => void;
86
+ 1: (channelNumber: any, modulation: any, scheduleTime: any) => void;
90
87
  5: (channelNumber: any, portamentoTime: any) => void;
91
88
  6: (channelNumber: any, value: any) => void;
92
- 7: (channelNumber: any, volume: any) => void;
93
- 10: (channelNumber: any, pan: any) => void;
94
- 11: (channelNumber: any, expression: any) => void;
89
+ 7: (channelNumber: any, volume: any, scheduleTime: any) => void;
90
+ 10: (channelNumber: any, pan: any, scheduleTime: any) => void;
91
+ 11: (channelNumber: any, expression: any, scheduleTime: any) => void;
95
92
  32: (channelNumber: any, lsb: any) => void;
96
93
  38: (channelNumber: any, value: any) => void;
97
94
  64: (channelNumber: any, value: any) => void;
@@ -156,6 +153,7 @@ export class MidyGM2 {
156
153
  seekTo(second: any): void;
157
154
  calcTotalTime(): number;
158
155
  currentTime(): number;
156
+ processScheduledNotes(channel: any, scheduleTime: any, callback: any): void;
159
157
  getActiveNotes(channel: any, time: any): SparseMap;
160
158
  getActiveNote(noteList: any, time: any): any;
161
159
  createConvolutionReverbImpulse(audioContext: any, decay: any, preDecay: any): any;
@@ -187,14 +185,14 @@ export class MidyGM2 {
187
185
  calcChannelDetune(channel: any): any;
188
186
  calcNoteDetune(channel: any, note: any): any;
189
187
  updateChannelDetune(channel: any): void;
190
- updateDetune(channel: any, note: any, pressure: any): void;
188
+ updateDetune(channel: any, note: any): void;
191
189
  getPortamentoTime(channel: any): number;
192
190
  setPortamentoStartVolumeEnvelope(channel: any, note: any): void;
193
- setVolumeEnvelope(note: any, pressure: any): void;
194
- setPitchEnvelope(note: any): void;
191
+ setVolumeEnvelope(channel: any, note: any): void;
192
+ setPitchEnvelope(note: any, scheduleTime: any): void;
195
193
  clampCutoffFrequency(frequency: any): number;
196
194
  setPortamentoStartFilterEnvelope(channel: any, note: any): void;
197
- setFilterEnvelope(channel: any, note: any, pressure: any): void;
195
+ setFilterEnvelope(channel: any, note: any): void;
198
196
  startModulation(channel: any, note: any, startTime: any): void;
199
197
  startVibrato(channel: any, note: any, startTime: any): void;
200
198
  getAudioBuffer(program: any, noteNumber: any, velocity: any, voiceParams: any, isSF3: any): Promise<any>;
@@ -209,13 +207,13 @@ export class MidyGM2 {
209
207
  releaseSostenutoPedal(channelNumber: any, halfVelocity: any): any[];
210
208
  handleMIDIMessage(statusByte: any, data1: any, data2: any): void | Promise<any>;
211
209
  handleProgramChange(channelNumber: any, program: any): void;
212
- handleChannelPressure(channelNumber: any, value: any): void;
210
+ handleChannelPressure(channelNumber: any, value: any, startTime: any): void;
213
211
  handlePitchBendMessage(channelNumber: any, lsb: any, msb: any): void;
214
212
  setPitchBend(channelNumber: any, value: any): void;
215
- setModLfoToPitch(channel: any, note: any, pressure: any): void;
213
+ setModLfoToPitch(channel: any, note: any): void;
216
214
  setVibLfoToPitch(channel: any, note: any): void;
217
- setModLfoToFilterFc(note: any, pressure: any): void;
218
- setModLfoToVolume(note: any, pressure: any): void;
215
+ setModLfoToFilterFc(channel: any, note: any): void;
216
+ setModLfoToVolume(channel: any, note: any): void;
219
217
  setReverbEffectsSend(channel: any, note: any, prevValue: any): void;
220
218
  setChorusEffectsSend(channel: any, note: any, prevValue: any): void;
221
219
  setDelayModLFO(note: any): void;
@@ -237,12 +235,12 @@ export class MidyGM2 {
237
235
  applyVoiceParams(channel: any, controllerType: any): void;
238
236
  createControlChangeHandlers(): {
239
237
  0: (channelNumber: any, msb: any) => void;
240
- 1: (channelNumber: any, modulation: any) => void;
238
+ 1: (channelNumber: any, modulation: any, scheduleTime: any) => void;
241
239
  5: (channelNumber: any, portamentoTime: any) => void;
242
240
  6: (channelNumber: any, value: any) => void;
243
- 7: (channelNumber: any, volume: any) => void;
244
- 10: (channelNumber: any, pan: any) => void;
245
- 11: (channelNumber: any, expression: any) => void;
241
+ 7: (channelNumber: any, volume: any, scheduleTime: any) => void;
242
+ 10: (channelNumber: any, pan: any, scheduleTime: any) => void;
243
+ 11: (channelNumber: any, expression: any, scheduleTime: any) => void;
246
244
  32: (channelNumber: any, lsb: any) => void;
247
245
  38: (channelNumber: any, value: any) => void;
248
246
  64: (channelNumber: any, value: any) => void;
@@ -261,20 +259,20 @@ export class MidyGM2 {
261
259
  126: () => void;
262
260
  127: () => void;
263
261
  };
264
- handleControlChange(channelNumber: any, controllerType: any, value: any): void;
262
+ handleControlChange(channelNumber: any, controllerType: any, value: any, startTime: any): void;
265
263
  setBankMSB(channelNumber: any, msb: any): void;
266
- updateModulation(channel: any): void;
267
- setModulationDepth(channelNumber: any, modulation: any): void;
264
+ updateModulation(channel: any, scheduleTime: any): void;
265
+ setModulationDepth(channelNumber: any, modulation: any, scheduleTime: any): void;
268
266
  setPortamentoTime(channelNumber: any, portamentoTime: any): void;
269
- setKeyBasedVolume(channel: any): void;
270
- setVolume(channelNumber: any, volume: any): void;
267
+ setKeyBasedVolume(channel: any, scheduleTime: any): void;
268
+ setVolume(channelNumber: any, volume: any, scheduleTime: any): void;
271
269
  panToGain(pan: any): {
272
270
  gainLeft: number;
273
271
  gainRight: number;
274
272
  };
275
- setKeyBasedPan(channel: any): void;
276
- setPan(channelNumber: any, pan: any): void;
277
- setExpression(channelNumber: any, expression: any): void;
273
+ setKeyBasedPan(channel: any, scheduleTime: any): void;
274
+ setPan(channelNumber: any, pan: any, scheduleTime: any): void;
275
+ setExpression(channelNumber: any, expression: any, scheduleTime: any): void;
278
276
  setBankLSB(channelNumber: any, lsb: any): void;
279
277
  dataEntryLSB(channelNumber: any, value: any): void;
280
278
  updateChannelVolume(channel: any): void;
@@ -335,7 +333,12 @@ export class MidyGM2 {
335
333
  getChorusSendToReverb(value: any): number;
336
334
  getChannelBitmap(data: any): any[];
337
335
  handleScaleOctaveTuning1ByteFormatSysEx(data: any, realtime: any): void;
338
- applyDestinationSettings(channel: any, note: any, table: any): void;
336
+ getFilterCutoffControl(channel: any): number;
337
+ getAmplitudeControl(channel: any): number;
338
+ getLFOPitchDepth(channel: any): number;
339
+ getLFOFilterDepth(channel: any): number;
340
+ getLFOAmplitudeDepth(channel: any): number;
341
+ setControllerParameters(channel: any, note: any, table: any): void;
339
342
  handleChannelPressureSysEx(data: any, tableName: any): void;
340
343
  initControlTable(): Uint8Array<ArrayBuffer>;
341
344
  applyControlTable(channel: any, controllerType: any): void;
@@ -363,11 +366,12 @@ declare class Note {
363
366
  constructor(noteNumber: any, velocity: any, startTime: any, voice: any, voiceParams: any);
364
367
  bufferSource: any;
365
368
  filterNode: any;
369
+ filterDepth: any;
366
370
  volumeEnvelopeNode: any;
371
+ volumeDepth: any;
367
372
  volumeNode: any;
368
373
  gainL: any;
369
374
  gainR: any;
370
- volumeDepth: any;
371
375
  modulationLFO: any;
372
376
  modulationDepth: any;
373
377
  vibratoLFO: any;
@@ -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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"}