@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.
package/esm/midy-GM1.d.ts CHANGED
@@ -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"}
package/esm/midy-GM1.js CHANGED
@@ -66,37 +66,31 @@ class Note {
66
66
  writable: true,
67
67
  value: void 0
68
68
  });
69
- Object.defineProperty(this, "volumeEnvelopeNode", {
70
- enumerable: true,
71
- configurable: true,
72
- writable: true,
73
- value: void 0
74
- });
75
- Object.defineProperty(this, "volumeDepth", {
69
+ Object.defineProperty(this, "filterDepth", {
76
70
  enumerable: true,
77
71
  configurable: true,
78
72
  writable: true,
79
73
  value: void 0
80
74
  });
81
- Object.defineProperty(this, "modulationLFO", {
75
+ Object.defineProperty(this, "volumeEnvelopeNode", {
82
76
  enumerable: true,
83
77
  configurable: true,
84
78
  writable: true,
85
79
  value: void 0
86
80
  });
87
- Object.defineProperty(this, "modulationDepth", {
81
+ Object.defineProperty(this, "volumeDepth", {
88
82
  enumerable: true,
89
83
  configurable: true,
90
84
  writable: true,
91
85
  value: void 0
92
86
  });
93
- Object.defineProperty(this, "vibratoLFO", {
87
+ Object.defineProperty(this, "modulationLFO", {
94
88
  enumerable: true,
95
89
  configurable: true,
96
90
  writable: true,
97
91
  value: void 0
98
92
  });
99
- Object.defineProperty(this, "vibratoDepth", {
93
+ Object.defineProperty(this, "modulationDepth", {
100
94
  enumerable: true,
101
95
  configurable: true,
102
96
  writable: true,
@@ -409,31 +403,32 @@ export class MidyGM1 {
409
403
  const event = this.timeline[queueIndex];
410
404
  if (event.startTime > t + this.lookAhead)
411
405
  break;
406
+ const startTime = event.startTime + this.startDelay - offset;
412
407
  switch (event.type) {
413
408
  case "noteOn":
414
409
  if (event.velocity !== 0) {
415
- await this.scheduleNoteOn(event.channel, event.noteNumber, event.velocity, event.startTime + this.startDelay - offset);
410
+ await this.scheduleNoteOn(event.channel, event.noteNumber, event.velocity, startTime);
416
411
  break;
417
412
  }
418
413
  /* falls through */
419
414
  case "noteOff": {
420
- const notePromise = this.scheduleNoteRelease(event.channel, event.noteNumber, event.velocity, event.startTime + this.startDelay - offset);
415
+ const notePromise = this.scheduleNoteRelease(event.channel, event.noteNumber, event.velocity, startTime);
421
416
  if (notePromise) {
422
417
  this.notePromises.push(notePromise);
423
418
  }
424
419
  break;
425
420
  }
426
421
  case "controller":
427
- this.handleControlChange(event.channel, event.controllerType, event.value);
422
+ this.handleControlChange(event.channel, event.controllerType, event.value, startTime);
428
423
  break;
429
424
  case "programChange":
430
- this.handleProgramChange(event.channel, event.programNumber);
425
+ this.handleProgramChange(event.channel, event.programNumber, startTime);
431
426
  break;
432
427
  case "pitchBend":
433
- this.setPitchBend(event.channel, event.value + 8192);
428
+ this.setPitchBend(event.channel, event.value + 8192, startTime);
434
429
  break;
435
430
  case "sysEx":
436
- this.handleSysEx(event.data);
431
+ this.handleSysEx(event.data, startTime);
437
432
  }
438
433
  queueIndex++;
439
434
  }
@@ -643,6 +638,18 @@ export class MidyGM1 {
643
638
  const now = this.audioContext.currentTime;
644
639
  return this.resumeTime + now - this.startTime - this.startDelay;
645
640
  }
641
+ processScheduledNotes(channel, scheduleTime, callback) {
642
+ channel.scheduledNotes.forEach((noteList) => {
643
+ for (let i = 0; i < noteList.length; i++) {
644
+ const note = noteList[i];
645
+ if (!note)
646
+ continue;
647
+ if (scheduleTime < note.startTime)
648
+ continue;
649
+ callback(note);
650
+ }
651
+ });
652
+ }
646
653
  getActiveNotes(channel, time) {
647
654
  const activeNotes = new SparseMap(128);
648
655
  channel.scheduledNotes.forEach((noteList) => {
@@ -716,20 +723,20 @@ export class MidyGM1 {
716
723
  .setValueAtTime(attackVolume, volHold)
717
724
  .linearRampToValueAtTime(sustainVolume, volDecay);
718
725
  }
719
- setPitchEnvelope(note) {
720
- const now = this.audioContext.currentTime;
726
+ setPitchEnvelope(note, scheduleTime) {
727
+ scheduleTime ??= this.audioContext.currentTime;
721
728
  const { voiceParams } = note;
722
729
  const baseRate = voiceParams.playbackRate;
723
730
  note.bufferSource.playbackRate
724
- .cancelScheduledValues(now)
725
- .setValueAtTime(baseRate, now);
731
+ .cancelScheduledValues(scheduleTime)
732
+ .setValueAtTime(baseRate, scheduleTime);
726
733
  const modEnvToPitch = voiceParams.modEnvToPitch;
727
734
  if (modEnvToPitch === 0)
728
735
  return;
729
736
  const basePitch = this.rateToCent(baseRate);
730
737
  const peekPitch = basePitch + modEnvToPitch;
731
738
  const peekRate = this.centToRate(peekPitch);
732
- const modDelay = startTime + voiceParams.modDelay;
739
+ const modDelay = note.startTime + voiceParams.modDelay;
733
740
  const modAttack = modDelay + voiceParams.modAttack;
734
741
  const modHold = modAttack + voiceParams.modHold;
735
742
  const modDecay = modHold + voiceParams.modDecay;
@@ -886,10 +893,6 @@ export class MidyGM1 {
886
893
  note.modulationDepth.disconnect();
887
894
  note.modulationLFO.stop();
888
895
  }
889
- if (note.vibratoDepth) {
890
- note.vibratoDepth.disconnect();
891
- note.vibratoLFO.stop();
892
- }
893
896
  resolve();
894
897
  };
895
898
  note.bufferSource.stop(stopTime);
@@ -984,16 +987,6 @@ export class MidyGM1 {
984
987
  .cancelScheduledValues(now)
985
988
  .setValueAtTime(modulationDepth, now);
986
989
  }
987
- setVibLfoToPitch(channel, note) {
988
- const now = this.audioContext.currentTime;
989
- const vibLfoToPitch = note.voiceParams.vibLfoToPitch;
990
- const vibratoDepth = Math.abs(vibLfoToPitch) * channel.state.vibratoDepth *
991
- 2;
992
- const vibratoDepthSign = 0 < vibLfoToPitch;
993
- note.vibratoDepth.gain
994
- .cancelScheduledValues(now)
995
- .setValueAtTime(vibratoDepth * vibratoDepthSign, now);
996
- }
997
990
  setModLfoToFilterFc(note) {
998
991
  const now = this.audioContext.currentTime;
999
992
  const modLfoToFilterFc = note.voiceParams.modLfoToFilterFc;
@@ -1033,11 +1026,7 @@ export class MidyGM1 {
1033
1026
  this.setModLfoToPitch(channel, note);
1034
1027
  }
1035
1028
  },
1036
- vibLfoToPitch: (channel, note, _prevValue) => {
1037
- if (0 < channel.state.vibratoDepth) {
1038
- this.setVibLfoToPitch(channel, note);
1039
- }
1040
- },
1029
+ vibLfoToPitch: (_channel, _note, _prevValue) => { },
1041
1030
  modLfoToFilterFc: (channel, note, _prevValue) => {
1042
1031
  if (0 < channel.state.modulationDepth)
1043
1032
  this.setModLfoToFilterFc(note);
@@ -1050,28 +1039,8 @@ export class MidyGM1 {
1050
1039
  reverbEffectsSend: (_channel, _note, _prevValue) => { },
1051
1040
  delayModLFO: (_channel, note, _prevValue) => this.setDelayModLFO(note),
1052
1041
  freqModLFO: (_channel, note, _prevValue) => this.setFreqModLFO(note),
1053
- delayVibLFO: (channel, note, prevValue) => {
1054
- if (0 < channel.state.vibratoDepth) {
1055
- const now = this.audioContext.currentTime;
1056
- const vibratoDelay = channel.state.vibratoDelay * 2;
1057
- const prevStartTime = note.startTime + prevValue * vibratoDelay;
1058
- if (now < prevStartTime)
1059
- return;
1060
- const value = note.voiceParams.delayVibLFO;
1061
- const startTime = note.startTime + value * vibratoDelay;
1062
- note.vibratoLFO.stop(now);
1063
- note.vibratoLFO.start(startTime);
1064
- }
1065
- },
1066
- freqVibLFO: (channel, note, _prevValue) => {
1067
- if (0 < channel.state.vibratoDepth) {
1068
- const now = this.audioContext.currentTime;
1069
- const freqVibLFO = note.voiceParams.freqVibLFO;
1070
- note.vibratoLFO.frequency
1071
- .cancelScheduledValues(now)
1072
- .setValueAtTime(freqVibLFO * channel.state.vibratoRate * 2, now);
1073
- }
1074
- },
1042
+ delayVibLFO: (_channel, _note, _prevValue) => { },
1043
+ freqVibLFO: (_channel, _note, _prevValue) => { },
1075
1044
  };
1076
1045
  }
1077
1046
  getControllerState(channel, noteNumber, velocity) {
@@ -1144,10 +1113,10 @@ export class MidyGM1 {
1144
1113
  123: this.allNotesOff,
1145
1114
  };
1146
1115
  }
1147
- handleControlChange(channelNumber, controllerType, value) {
1116
+ handleControlChange(channelNumber, controllerType, value, startTime) {
1148
1117
  const handler = this.controlChangeHandlers[controllerType];
1149
1118
  if (handler) {
1150
- handler.call(this, channelNumber, value);
1119
+ handler.call(this, channelNumber, value, startTime);
1151
1120
  const channel = this.channels[channelNumber];
1152
1121
  this.applyVoiceParams(channel, controllerType + 128);
1153
1122
  }
@@ -1155,33 +1124,28 @@ export class MidyGM1 {
1155
1124
  console.warn(`Unsupported Control change: controllerType=${controllerType} value=${value}`);
1156
1125
  }
1157
1126
  }
1158
- updateModulation(channel) {
1159
- const now = this.audioContext.currentTime;
1127
+ updateModulation(channel, scheduleTime) {
1128
+ scheduleTime ??= this.audioContext.currentTime;
1160
1129
  const depth = channel.state.modulationDepth * channel.modulationDepthRange;
1161
- channel.scheduledNotes.forEach((noteList) => {
1162
- for (let i = 0; i < noteList.length; i++) {
1163
- const note = noteList[i];
1164
- if (!note)
1165
- continue;
1166
- if (note.modulationDepth) {
1167
- note.modulationDepth.gain.setValueAtTime(depth, now);
1168
- }
1169
- else {
1170
- this.setPitchEnvelope(note);
1171
- this.startModulation(channel, note, now);
1172
- }
1130
+ this.processScheduledNotes(channel, scheduleTime, (note) => {
1131
+ if (note.modulationDepth) {
1132
+ note.modulationDepth.gain.setValueAtTime(depth, scheduleTime);
1133
+ }
1134
+ else {
1135
+ this.setPitchEnvelope(note, scheduleTime);
1136
+ this.startModulation(channel, note, scheduleTime);
1173
1137
  }
1174
1138
  });
1175
1139
  }
1176
- setModulationDepth(channelNumber, modulation) {
1140
+ setModulationDepth(channelNumber, modulation, scheduleTime) {
1177
1141
  const channel = this.channels[channelNumber];
1178
1142
  channel.state.modulationDepth = modulation / 127;
1179
- this.updateModulation(channel);
1143
+ this.updateModulation(channel, scheduleTime);
1180
1144
  }
1181
- setVolume(channelNumber, volume) {
1145
+ setVolume(channelNumber, volume, scheduleTime) {
1182
1146
  const channel = this.channels[channelNumber];
1183
1147
  channel.state.volume = volume / 127;
1184
- this.updateChannelVolume(channel);
1148
+ this.updateChannelVolume(channel, scheduleTime);
1185
1149
  }
1186
1150
  panToGain(pan) {
1187
1151
  const theta = Math.PI / 2 * Math.max(0, pan * 127 - 1) / 126;
@@ -1190,31 +1154,31 @@ export class MidyGM1 {
1190
1154
  gainRight: Math.sin(theta),
1191
1155
  };
1192
1156
  }
1193
- setPan(channelNumber, pan) {
1157
+ setPan(channelNumber, pan, scheduleTime) {
1194
1158
  const channel = this.channels[channelNumber];
1195
1159
  channel.state.pan = pan / 127;
1196
- this.updateChannelVolume(channel);
1160
+ this.updateChannelVolume(channel, scheduleTime);
1197
1161
  }
1198
- setExpression(channelNumber, expression) {
1162
+ setExpression(channelNumber, expression, scheduleTime) {
1199
1163
  const channel = this.channels[channelNumber];
1200
1164
  channel.state.expression = expression / 127;
1201
- this.updateChannelVolume(channel);
1165
+ this.updateChannelVolume(channel, scheduleTime);
1202
1166
  }
1203
1167
  dataEntryLSB(channelNumber, value) {
1204
1168
  this.channels[channelNumber].dataLSB = value;
1205
1169
  this.handleRPN(channelNumber, 0);
1206
1170
  }
1207
- updateChannelVolume(channel) {
1208
- const now = this.audioContext.currentTime;
1171
+ updateChannelVolume(channel, scheduleTime) {
1172
+ scheduleTime ??= this.audioContext.currentTime;
1209
1173
  const state = channel.state;
1210
1174
  const volume = state.volume * state.expression;
1211
1175
  const { gainLeft, gainRight } = this.panToGain(state.pan);
1212
1176
  channel.gainL.gain
1213
1177
  .cancelScheduledValues(now)
1214
- .setValueAtTime(volume * gainLeft, now);
1178
+ .setValueAtTime(volume * gainLeft, scheduleTime);
1215
1179
  channel.gainR.gain
1216
1180
  .cancelScheduledValues(now)
1217
- .setValueAtTime(volume * gainRight, now);
1181
+ .setValueAtTime(volume * gainRight, scheduleTime);
1218
1182
  }
1219
1183
  setSustainPedal(channelNumber, value) {
1220
1184
  this.channels[channelNumber].state.sustainPedal = value / 127;
package/esm/midy-GM2.d.ts CHANGED
@@ -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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"}