@marmooo/midy 0.4.3 → 0.4.4

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
@@ -72,6 +72,7 @@ await midy.stop();
72
72
  await midy.pause();
73
73
  await midy.resume();
74
74
  midy.seekTo(second);
75
+ midy.tempoChange(tempo);
75
76
  ```
76
77
 
77
78
  ### Events
package/esm/midy-GM1.d.ts CHANGED
@@ -12,6 +12,7 @@ export class MidyGM1 extends EventTarget {
12
12
  coarseTuning: number;
13
13
  };
14
14
  constructor(audioContext: any);
15
+ perceptualSmoothingTime: number;
15
16
  mode: string;
16
17
  numChannels: number;
17
18
  ticksPerBeat: number;
@@ -55,6 +56,7 @@ export class MidyGM1 extends EventTarget {
55
56
  freqModLFO: (_channel: any, note: any, scheduleTime: any) => void;
56
57
  delayVibLFO: (_channel: any, _note: any, _scheduleTime: any) => void;
57
58
  freqVibLFO: (_channel: any, _note: any, _scheduleTime: any) => void;
59
+ detune: (channel: any, note: any, scheduleTime: any) => void;
58
60
  };
59
61
  controlChangeHandlers: any[];
60
62
  channels: any[];
@@ -92,6 +94,7 @@ export class MidyGM1 extends EventTarget {
92
94
  pause(): Promise<void>;
93
95
  resume(): Promise<void>;
94
96
  seekTo(second: any): void;
97
+ tempoChange(tempo: any): void;
95
98
  calcTotalTime(): number;
96
99
  currentTime(): number;
97
100
  processScheduledNotes(channel: any, callback: any): Promise<void>;
@@ -101,8 +104,9 @@ export class MidyGM1 extends EventTarget {
101
104
  centToHz(cent: any): number;
102
105
  calcChannelDetune(channel: any): any;
103
106
  updateChannelDetune(channel: any, scheduleTime: any): void;
104
- updateDetune(channel: any, note: any, scheduleTime: any): void;
107
+ calcNoteDetune(channel: any, note: any): any;
105
108
  setVolumeEnvelope(note: any, scheduleTime: any): void;
109
+ setDetune(channel: any, note: any, scheduleTime: any): void;
106
110
  setPitchEnvelope(note: any, scheduleTime: any): void;
107
111
  clampCutoffFrequency(frequency: any): number;
108
112
  setFilterEnvelope(note: any, scheduleTime: any): void;
@@ -140,20 +144,21 @@ export class MidyGM1 extends EventTarget {
140
144
  freqModLFO: (_channel: any, note: any, scheduleTime: any) => void;
141
145
  delayVibLFO: (_channel: any, _note: any, _scheduleTime: any) => void;
142
146
  freqVibLFO: (_channel: any, _note: any, _scheduleTime: any) => void;
147
+ detune: (channel: any, note: any, scheduleTime: any) => void;
143
148
  };
144
149
  getControllerState(channel: any, noteNumber: any, velocity: any): Float32Array<any>;
145
150
  applyVoiceParams(channel: any, controllerType: any, scheduleTime: any): void;
146
151
  createControlChangeHandlers(): any[];
147
152
  setControlChange(channelNumber: any, controllerType: any, value: any, scheduleTime: any): void;
148
153
  updateModulation(channel: any, scheduleTime: any): void;
149
- setModulationDepth(channelNumber: any, modulation: any, scheduleTime: any): void;
150
- setVolume(channelNumber: any, volume: any, scheduleTime: any): void;
154
+ setModulationDepth(channelNumber: any, value: any, scheduleTime: any): void;
155
+ setVolume(channelNumber: any, value: any, scheduleTime: any): void;
151
156
  panToGain(pan: any): {
152
157
  gainLeft: number;
153
158
  gainRight: number;
154
159
  };
155
- setPan(channelNumber: any, pan: any, scheduleTime: any): void;
156
- setExpression(channelNumber: any, expression: any, scheduleTime: any): void;
160
+ setPan(channelNumber: any, value: any, scheduleTime: any): void;
161
+ setExpression(channelNumber: any, value: any, scheduleTime: any): void;
157
162
  dataEntryLSB(channelNumber: any, value: any, scheduleTime: any): void;
158
163
  updateChannelVolume(channel: any, scheduleTime: any): void;
159
164
  setSustainPedal(channelNumber: any, value: any, scheduleTime: any): void;
@@ -1 +1 @@
1
- {"version":3,"file":"midy-GM1.d.ts","sourceRoot":"","sources":["../src/midy-GM1.js"],"names":[],"mappings":"AAuGA;IA+BE;;;;;;;;;;;MAWE;IAEF,+BAgBC;IA3DD,aAAa;IACb,oBAAiB;IACjB,qBAAmB;IACnB,kBAAc;IACd,0BAAwB;IACxB,kBAAc;IACd,mBAAiB;IACjB,kBAAc;IACd,mBAAe;IACf,kBAAgB;IAChB,0BAAuD;IACvD,4BAAyB;IACzB,0BAAuB;IACvB,kCAA+B;IAC/B,mBAAkB;IAClB,mBAAkB;IAClB,kBAAiB;IACjB,oBAAmB;IACnB,mBAAkB;IAClB,iCAEG;IACH,cAAU;IACV,cAAa;IACb,iBAAY;IACZ,gBAAc;IACd,oBAAkB;IAClB,sBAAwB;IACxB,2BAAqC;IAiBnC,kBAAgC;IAChC,kBAA8C;IAC9C,eAAwD;IACxD,qBAGE;IACF,uBAAmD;IACnD;;;;;;;;;;;MAA2D;IAC3D,6BAA+D;IAC/D,gBAAiD;IAMnD,mCASC;IAED,2DAYC;IAED,yCAmBC;IAED,oCASC;IAED,sBAoCC;IAED,8DAeC;IAED;;;;MAeC;IAED,yCAaC;IAED,kDASC;IAED,4DASC;IAED,gEAsDC;IAED,mCASC;IAED,uBAUC;IAED,yDAqCC;IAED,2BA0EC;IAED,uDAEC;IAED,wDAEC;IAED,qCAKC;IAED;;;MAwDC;IAED,kGAeC;IAED,mGAeC;IAED,wEAQC;IAED,uBAMC;IAED,sBAIC;IAED,uBAMC;IAED,wBAIC;IAED,0BAKC;IAED,wBAYC;IAED,sBAIC;IAED,kEAWC;IAED,kFAYC;IAED,8BAEC;IAED,8BAEC;IAED,4BAEC;IAED,qCAMC;IAED,2DAIC;IAED,+DAIC;IAED,sDAeC;IAED,qDAoBC;IAED,6CAIC;IAED,sDA6BC;IAED,kEAqBC;IAED,4GAkCC;IAED,uEAyCC;IAED,0EAiBC;IAED,oEASC;IAED,0FAwBC;IAED,gCASC;IAED,iEAqBC;IAED,4FAmBC;IAED,6CAUC;IAED,qDAUC;IAED,qFAeC;IAED,+BAmBC;IAED,kDAOC;IAED,sFA2BC;IAED,mFAGC;IAED,wFAGC;IAED,sEAUC;IAED,mEAYC;IAED,wDAKC;IAED,sDAOC;IAED,mDAMC;IAED,kDAKC;IAED;;;;;;;;;;;MAiCC;IAED,oFAMC;IAED,6EA2BC;IAED,qCAeC;IAED,+FAWC;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,iEAMC;IAED,uEAQC;IAED,mEAKC;IAED,yEAQC;IAED,gFAGC;IAED,6CAqBC;IAGD,8EAgCC;IAED,gFAGC;IAED,+EAgBC;IAED,qCAUC;IAED,4EAaC;IAED,4DAGC;IAED,qDAKC;IAED,gDAYC;IAGD,6DAgBC;CACF"}
1
+ {"version":3,"file":"midy-GM1.d.ts","sourceRoot":"","sources":["../src/midy-GM1.js"],"names":[],"mappings":"AAuGA;IAoCE;;;;;;;;;;;MAWE;IAEF,+BAgBC;IA5DD,gCAAgC;IAChC,aAAa;IACb,oBAAiB;IACjB,qBAAmB;IACnB,kBAAc;IACd,0BAAwB;IACxB,kBAAc;IACd,mBAAiB;IACjB,kBAAc;IACd,mBAAe;IACf,kBAAgB;IAChB,0BAAuD;IACvD,4BAAyB;IACzB,0BAAuB;IACvB,kCAA+B;IAC/B,mBAAkB;IAClB,mBAAkB;IAClB,kBAAiB;IACjB,oBAAmB;IACnB,mBAAkB;IAClB,iCAEG;IACH,cAAU;IACV,cAAa;IACb,iBAAY;IACZ,gBAAc;IACd,oBAAkB;IAClB,sBAAwB;IACxB,2BAAqC;IAiBnC,kBAAgC;IAChC,kBAA8C;IAC9C,eAAwD;IACxD,qBAGE;IACF,uBAAmD;IACnD;;;;;;;;;;;;MAA2D;IAC3D,6BAA+D;IAC/D,gBAAiD;IAMnD,mCASC;IAED,2DAYC;IAED,yCAmBC;IAED,oCASC;IAED,sBAoCC;IAED,8DAeC;IAED;;;;MAeC;IAED,yCAaC;IAED,kDASC;IAED,4DASC;IAED,gEAsDC;IAED,mCASC;IAED,uBAUC;IAED,yDAqCC;IAED,2BA0EC;IAED,uDAEC;IAED,wDAEC;IAED,qCAKC;IAED;;;MAwDC;IAED,kGAeC;IAED,mGAeC;IAED,wEAQC;IAED,uBAMC;IAED,sBAIC;IAED,uBAMC;IAED,wBAIC;IAED,0BAKC;IAED,8BAMC;IAED,wBAYC;IAED,sBAIC;IAED,kEAWC;IAED,kFAYC;IAED,8BAEC;IAED,8BAEC;IAED,4BAEC;IAED,qCAMC;IAED,2DAIC;IAED,6CAEC;IAED,sDAeC;IAED,4DASC;IAED,qDAkBC;IAED,6CAIC;IAED,sDA6BC;IAED,kEAqBC;IAED,4GAkCC;IAED,uEAyCC;IAED,0EAiBC;IAED,oEASC;IAED,0FAwBC;IAED,gCASC;IAED,iEAwBC;IAED,4FAmBC;IAED,6CAUC;IAED,qDAUC;IAED,qFAeC;IAED,+BAmBC;IAED,kDAOC;IAED,sFA2BC;IAED,mFAGC;IAED,wFAGC;IAED,sEAUC;IAED,mEAYC;IAED,wDAKC;IAED,sDAOC;IAED,mDAMC;IAED,kDAKC;IAED;;;;;;;;;;;;MAoCC;IAED,oFAMC;IAED,6EA2BC;IAED,qCAeC;IAED,+FAWC;IAED,wDAUC;IAED,4EAKC;IAED,mEAKC;IAED;;;MAMC;IAED,gEAKC;IAED,uEAKC;IAED,sEAGC;IAED,2DAUC;IAED,yEAWC;IAED,kFAeC;IAED,2DAMC;IAED,uDAoBC;IAED,gDAEC;IAED,gDAEC;IAED,sEAGC;IAED,qEAKC;IAED,2EAUC;IAED,iEAMC;IAED,uEAQC;IAED,mEAKC;IAED,yEAQC;IAED,gFAGC;IAED,6CAqBC;IAGD,8EAgCC;IAED,gFAGC;IAED,+EAgBC;IAED,qCAUC;IAED,4EAaC;IAED,4DAGC;IAED,qDAKC;IAED,gDAYC;IAGD,6DAgBC;CACF"}
package/esm/midy-GM1.js CHANGED
@@ -161,6 +161,16 @@ const releaseCurve = 1 / (-Math.log(cbToRatio(-600)));
161
161
  export class MidyGM1 extends EventTarget {
162
162
  constructor(audioContext) {
163
163
  super();
164
+ // https://pmc.ncbi.nlm.nih.gov/articles/PMC4191557/
165
+ // https://pubmed.ncbi.nlm.nih.gov/12488797/
166
+ // Gap detection studies indicate humans detect temporal discontinuities
167
+ // around 2–3 ms. Smoothing over ~4 ms is perceived as continuous.
168
+ Object.defineProperty(this, "perceptualSmoothingTime", {
169
+ enumerable: true,
170
+ configurable: true,
171
+ writable: true,
172
+ value: 0.004
173
+ });
164
174
  Object.defineProperty(this, "mode", {
165
175
  enumerable: true,
166
176
  configurable: true,
@@ -773,6 +783,13 @@ export class MidyGM1 extends EventTarget {
773
783
  this.isSeeking = true;
774
784
  }
775
785
  }
786
+ tempoChange(tempo) {
787
+ const timeScale = this.tempo / tempo;
788
+ this.resumeTime = this.resumeTime * timeScale;
789
+ this.tempo = tempo;
790
+ this.totalTime = this.calcTotalTime();
791
+ this.seekTo(this.currentTime() * timeScale);
792
+ }
776
793
  calcTotalTime() {
777
794
  const totalTimeEventTypes = this.totalTimeEventTypes;
778
795
  const timeline = this.timeline;
@@ -842,13 +859,11 @@ export class MidyGM1 extends EventTarget {
842
859
  }
843
860
  updateChannelDetune(channel, scheduleTime) {
844
861
  this.processScheduledNotes(channel, (note) => {
845
- this.updateDetune(channel, note, scheduleTime);
862
+ this.setDetune(channel, note, scheduleTime);
846
863
  });
847
864
  }
848
- updateDetune(channel, note, scheduleTime) {
849
- note.bufferSource.detune
850
- .cancelScheduledValues(scheduleTime)
851
- .setValueAtTime(channel.detune, scheduleTime);
865
+ calcNoteDetune(channel, note) {
866
+ return channel.detune + note.voiceParams.detune;
852
867
  }
853
868
  setVolumeEnvelope(note, scheduleTime) {
854
869
  const { voiceParams, startTime } = note;
@@ -861,30 +876,38 @@ export class MidyGM1 extends EventTarget {
861
876
  note.volumeEnvelopeNode.gain
862
877
  .cancelScheduledValues(scheduleTime)
863
878
  .setValueAtTime(0, startTime)
864
- .setValueAtTime(0, volDelay)
865
- .linearRampToValueAtTime(attackVolume, volAttack)
879
+ .setValueAtTime(1e-6, volDelay)
880
+ .exponentialRampToValueAtTime(attackVolume, volAttack)
866
881
  .setValueAtTime(attackVolume, volHold)
867
882
  .setTargetAtTime(sustainVolume, volHold, decayDuration * decayCurve);
868
883
  }
884
+ setDetune(channel, note, scheduleTime) {
885
+ const detune = this.calcNoteDetune(channel, note);
886
+ note.bufferSource.detune
887
+ .cancelScheduledValues(scheduleTime)
888
+ .setValueAtTime(detune, scheduleTime);
889
+ const timeConstant = this.perceptualSmoothingTime / 5; // 99.3% (5 * tau)
890
+ note.bufferSource.detune
891
+ .cancelAndHoldAtTime(scheduleTime)
892
+ .setTargetAtTime(detune, scheduleTime, timeConstant);
893
+ }
869
894
  setPitchEnvelope(note, scheduleTime) {
870
- const { voiceParams } = note;
895
+ const { bufferSource, voiceParams } = note;
871
896
  const baseRate = voiceParams.playbackRate;
872
- note.bufferSource.playbackRate
897
+ bufferSource.playbackRate
873
898
  .cancelScheduledValues(scheduleTime)
874
- .setValueAtTime(baseRate, note.startTime);
899
+ .setValueAtTime(baseRate, scheduleTime);
875
900
  const modEnvToPitch = voiceParams.modEnvToPitch;
876
901
  if (modEnvToPitch === 0)
877
902
  return;
878
- const basePitch = this.rateToCent(baseRate);
879
- const peekPitch = basePitch + modEnvToPitch;
880
- const peekRate = this.centToRate(peekPitch);
903
+ const peekRate = baseRate * this.centToRate(modEnvToPitch);
881
904
  const modDelay = note.startTime + voiceParams.modDelay;
882
905
  const modAttack = modDelay + voiceParams.modAttack;
883
906
  const modHold = modAttack + voiceParams.modHold;
884
907
  const decayDuration = voiceParams.modDecay;
885
- note.bufferSource.playbackRate
908
+ bufferSource.playbackRate
886
909
  .setValueAtTime(baseRate, modDelay)
887
- .linearRampToValueAtTime(peekRate, modAttack)
910
+ .exponentialRampToValueAtTime(peekRate, modAttack)
888
911
  .setValueAtTime(peekRate, modHold)
889
912
  .setTargetAtTime(baseRate, modHold, decayDuration * decayCurve);
890
913
  }
@@ -915,7 +938,7 @@ export class MidyGM1 extends EventTarget {
915
938
  .cancelScheduledValues(scheduleTime)
916
939
  .setValueAtTime(adjustedBaseFreq, startTime)
917
940
  .setValueAtTime(adjustedBaseFreq, modDelay)
918
- .linearRampToValueAtTime(adjustedPeekFreq, modAttack)
941
+ .exponentialRampToValueAtTime(adjustedPeekFreq, modAttack)
919
942
  .setValueAtTime(adjustedPeekFreq, modHold)
920
943
  .setTargetAtTime(adjustedSustainFreq, modHold, decayDuration * decayCurve);
921
944
  }
@@ -986,8 +1009,8 @@ export class MidyGM1 extends EventTarget {
986
1009
  this.setVolumeEnvelope(note, now);
987
1010
  this.setFilterEnvelope(note, now);
988
1011
  this.setPitchEnvelope(note, now);
989
- this.updateDetune(channel, note, now);
990
- if (0 < state.modulationDepth) {
1012
+ this.setDetune(channel, note, now);
1013
+ if (0 < state.modulationDepthMSB) {
991
1014
  this.startModulation(channel, note, now);
992
1015
  }
993
1016
  note.bufferSource.connect(note.filterNode);
@@ -1067,15 +1090,14 @@ export class MidyGM1 extends EventTarget {
1067
1090
  }
1068
1091
  releaseNote(channel, note, endTime) {
1069
1092
  endTime ??= this.audioContext.currentTime;
1070
- const duration = note.voiceParams.volRelease * releaseTime;
1071
- const volRelease = endTime + duration;
1072
- const modRelease = endTime + note.voiceParams.modRelease;
1093
+ const volDuration = note.voiceParams.volRelease;
1094
+ const volRelease = endTime + volDuration;
1073
1095
  note.filterNode.frequency
1074
1096
  .cancelScheduledValues(endTime)
1075
- .linearRampToValueAtTime(note.adjustedBaseFreq, modRelease);
1097
+ .setTargetAtTime(note.adjustedBaseFreq, endTime, note.voiceParams.modRelease * releaseCurve);
1076
1098
  note.volumeEnvelopeNode.gain
1077
1099
  .cancelScheduledValues(endTime)
1078
- .setTargetAtTime(0, endTime, duration * releaseCurve);
1100
+ .setTargetAtTime(0, endTime, volDuration * releaseCurve);
1079
1101
  return new Promise((resolve) => {
1080
1102
  this.scheduleTask(() => {
1081
1103
  const bufferSource = note.bufferSource;
@@ -1271,6 +1293,9 @@ export class MidyGM1 extends EventTarget {
1271
1293
  },
1272
1294
  delayVibLFO: (_channel, _note, _scheduleTime) => { },
1273
1295
  freqVibLFO: (_channel, _note, _scheduleTime) => { },
1296
+ detune: (channel, note, scheduleTime) => {
1297
+ this.setDetune(channel, note, scheduleTime);
1298
+ },
1274
1299
  };
1275
1300
  }
1276
1301
  getControllerState(channel, noteNumber, velocity) {
@@ -1351,18 +1376,18 @@ export class MidyGM1 extends EventTarget {
1351
1376
  }
1352
1377
  });
1353
1378
  }
1354
- setModulationDepth(channelNumber, modulation, scheduleTime) {
1379
+ setModulationDepth(channelNumber, value, scheduleTime) {
1355
1380
  const channel = this.channels[channelNumber];
1356
1381
  if (!(0 <= scheduleTime))
1357
1382
  scheduleTime = this.audioContext.currentTime;
1358
- channel.state.modulationDepthMSB = modulation / 127;
1383
+ channel.state.modulationDepthMSB = value / 127;
1359
1384
  this.updateModulation(channel, scheduleTime);
1360
1385
  }
1361
- setVolume(channelNumber, volume, scheduleTime) {
1386
+ setVolume(channelNumber, value, scheduleTime) {
1362
1387
  if (!(0 <= scheduleTime))
1363
1388
  scheduleTime = this.audioContext.currentTime;
1364
1389
  const channel = this.channels[channelNumber];
1365
- channel.state.volumeMSB = volume / 127;
1390
+ channel.state.volumeMSB = value / 127;
1366
1391
  this.updateChannelVolume(channel, scheduleTime);
1367
1392
  }
1368
1393
  panToGain(pan) {
@@ -1372,18 +1397,18 @@ export class MidyGM1 extends EventTarget {
1372
1397
  gainRight: Math.sin(theta),
1373
1398
  };
1374
1399
  }
1375
- setPan(channelNumber, pan, scheduleTime) {
1400
+ setPan(channelNumber, value, scheduleTime) {
1376
1401
  if (!(0 <= scheduleTime))
1377
1402
  scheduleTime = this.audioContext.currentTime;
1378
1403
  const channel = this.channels[channelNumber];
1379
- channel.state.panMSB = pan / 127;
1404
+ channel.state.panMSB = value / 127;
1380
1405
  this.updateChannelVolume(channel, scheduleTime);
1381
1406
  }
1382
- setExpression(channelNumber, expression, scheduleTime) {
1407
+ setExpression(channelNumber, value, scheduleTime) {
1383
1408
  if (!(0 <= scheduleTime))
1384
1409
  scheduleTime = this.audioContext.currentTime;
1385
1410
  const channel = this.channels[channelNumber];
1386
- channel.state.expressionMSB = expression / 127;
1411
+ channel.state.expressionMSB = value / 127;
1387
1412
  this.updateChannelVolume(channel, scheduleTime);
1388
1413
  }
1389
1414
  dataEntryLSB(channelNumber, value, scheduleTime) {
@@ -1392,14 +1417,14 @@ export class MidyGM1 extends EventTarget {
1392
1417
  }
1393
1418
  updateChannelVolume(channel, scheduleTime) {
1394
1419
  const state = channel.state;
1395
- const volume = state.volumeMSB * state.expressionMSB;
1420
+ const gain = state.volumeMSB * state.expressionMSB;
1396
1421
  const { gainLeft, gainRight } = this.panToGain(state.panMSB);
1397
1422
  channel.gainL.gain
1398
1423
  .cancelScheduledValues(scheduleTime)
1399
- .setValueAtTime(volume * gainLeft, scheduleTime);
1424
+ .setValueAtTime(gain * gainLeft, scheduleTime);
1400
1425
  channel.gainR.gain
1401
1426
  .cancelScheduledValues(scheduleTime)
1402
- .setValueAtTime(volume * gainRight, scheduleTime);
1427
+ .setValueAtTime(gain * gainRight, scheduleTime);
1403
1428
  }
1404
1429
  setSustainPedal(channelNumber, value, scheduleTime) {
1405
1430
  const channel = this.channels[channelNumber];
@@ -1454,6 +1479,8 @@ export class MidyGM1 extends EventTarget {
1454
1479
  case 2:
1455
1480
  this.handleCoarseTuningRPN(channelNumber, scheduleTime);
1456
1481
  break;
1482
+ case 16383: // NULL
1483
+ break;
1457
1484
  default:
1458
1485
  console.warn(`Channel ${channelNumber}: Unsupported RPN MSB=${channel.rpnMSB} LSB=${channel.rpnLSB}`);
1459
1486
  }
package/esm/midy-GM2.d.ts CHANGED
@@ -15,6 +15,7 @@ export class MidyGM2 extends EventTarget {
15
15
  coarseTuning: number;
16
16
  };
17
17
  constructor(audioContext: any);
18
+ perceptualSmoothingTime: number;
18
19
  mode: string;
19
20
  masterFineTuning: number;
20
21
  masterCoarseTuning: number;
@@ -75,6 +76,7 @@ export class MidyGM2 extends EventTarget {
75
76
  freqModLFO: (_channel: any, note: any, scheduleTime: any) => void;
76
77
  delayVibLFO: (channel: any, note: any, _scheduleTime: any) => void;
77
78
  freqVibLFO: (channel: any, note: any, scheduleTime: any) => void;
79
+ detune: (channel: any, note: any, scheduleTime: any) => void;
78
80
  };
79
81
  controlChangeHandlers: any[];
80
82
  keyBasedControllerHandlers: any[];
@@ -128,6 +130,7 @@ export class MidyGM2 extends EventTarget {
128
130
  pause(): Promise<void>;
129
131
  resume(): Promise<void>;
130
132
  seekTo(second: any): void;
133
+ tempoChange(tempo: any): void;
131
134
  calcTotalTime(): number;
132
135
  currentTime(): number;
133
136
  processScheduledNotes(channel: any, callback: any): Promise<void>;
@@ -162,14 +165,16 @@ export class MidyGM2 extends EventTarget {
162
165
  centToRate(cent: any): number;
163
166
  centToHz(cent: any): number;
164
167
  calcChannelDetune(channel: any): any;
165
- calcNoteDetune(channel: any, note: any): any;
166
168
  updateChannelDetune(channel: any, scheduleTime: any): void;
167
- updateDetune(channel: any, note: any, scheduleTime: any): void;
169
+ calcScaleOctaveTuning(channel: any, note: any): any;
170
+ calcNoteDetune(channel: any, note: any): any;
168
171
  getPortamentoTime(channel: any, note: any): number;
169
172
  getPitchIncrementSpeed(value: any): number;
170
173
  setPortamentoVolumeEnvelope(channel: any, note: any, scheduleTime: any): void;
171
174
  setVolumeEnvelope(channel: any, note: any, scheduleTime: any): void;
172
- setPortamentoPitchEnvelope(note: any, scheduleTime: any): void;
175
+ setPortamentoDetune(channel: any, note: any, scheduleTime: any): void;
176
+ setDetune(channel: any, note: any, scheduleTime: any): void;
177
+ setPortamentoPitchEnvelope(channel: any, note: any, scheduleTime: any): void;
173
178
  setPitchEnvelope(note: any, scheduleTime: any): void;
174
179
  clampCutoffFrequency(frequency: any): number;
175
180
  setPortamentoFilterEnvelope(channel: any, note: any, scheduleTime: any): void;
@@ -204,8 +209,8 @@ export class MidyGM2 extends EventTarget {
204
209
  setChorusSend(channel: any, note: any, scheduleTime: any): void;
205
210
  setDelayModLFO(note: any): void;
206
211
  setFreqModLFO(note: any, scheduleTime: any): void;
207
- setFreqVibLFO(channel: any, note: any, scheduleTime: any): void;
208
212
  setDelayVibLFO(channel: any, note: any): void;
213
+ setFreqVibLFO(channel: any, note: any, scheduleTime: any): void;
209
214
  createVoiceParamsHandlers(): {
210
215
  modLfoToPitch: (channel: any, note: any, scheduleTime: any) => void;
211
216
  vibLfoToPitch: (channel: any, note: any, scheduleTime: any) => void;
@@ -217,6 +222,7 @@ export class MidyGM2 extends EventTarget {
217
222
  freqModLFO: (_channel: any, note: any, scheduleTime: any) => void;
218
223
  delayVibLFO: (channel: any, note: any, _scheduleTime: any) => void;
219
224
  freqVibLFO: (channel: any, note: any, scheduleTime: any) => void;
225
+ detune: (channel: any, note: any, scheduleTime: any) => void;
220
226
  };
221
227
  getControllerState(channel: any, noteNumber: any, velocity: any): Float32Array<any>;
222
228
  applyVoiceParams(channel: any, controllerType: any, scheduleTime: any): void;
@@ -224,16 +230,16 @@ export class MidyGM2 extends EventTarget {
224
230
  setControlChange(channelNumber: any, controllerType: any, value: any, scheduleTime: any): void;
225
231
  setBankMSB(channelNumber: any, msb: any): void;
226
232
  updateModulation(channel: any, scheduleTime: any): void;
227
- setModulationDepth(channelNumber: any, modulation: any, scheduleTime: any): void;
233
+ setModulationDepth(channelNumber: any, value: any, scheduleTime: any): void;
228
234
  updatePortamento(channel: any, scheduleTime: any): void;
229
- setPortamentoTime(channelNumber: any, portamentoTime: any, scheduleTime: any): void;
230
- setVolume(channelNumber: any, volume: any, scheduleTime: any): void;
235
+ setPortamentoTime(channelNumber: any, value: any, scheduleTime: any): void;
236
+ setVolume(channelNumber: any, value: any, scheduleTime: any): void;
231
237
  panToGain(pan: any): {
232
238
  gainLeft: number;
233
239
  gainRight: number;
234
240
  };
235
- setPan(channelNumber: any, pan: any, scheduleTime: any): void;
236
- setExpression(channelNumber: any, expression: any, scheduleTime: any): void;
241
+ setPan(channelNumber: any, value: any, scheduleTime: any): void;
242
+ setExpression(channelNumber: any, value: any, scheduleTime: any): void;
237
243
  setBankLSB(channelNumber: any, lsb: any): void;
238
244
  dataEntryLSB(channelNumber: any, value: any, scheduleTime: any): void;
239
245
  updateChannelVolume(channel: any, scheduleTime: any): 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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"}