@marmooo/midy 0.2.0 → 0.2.2

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.
@@ -1,6 +1,7 @@
1
1
  export class MidyGMLite {
2
2
  static channelSettings: {
3
3
  currentBufferSource: null;
4
+ detune: number;
4
5
  program: number;
5
6
  bank: number;
6
7
  dataMSB: number;
@@ -89,11 +90,13 @@ export class MidyGMLite {
89
90
  getActiveNotes(channel: any, time: any): Map<any, any>;
90
91
  getActiveNote(noteList: any, time: any): any;
91
92
  cbToRatio(cb: any): number;
93
+ rateToCent(rate: any): number;
94
+ centToRate(cent: any): number;
92
95
  centToHz(cent: any): number;
93
- calcSemitoneOffset(channel: any): number;
96
+ calcChannelDetune(channel: any): number;
97
+ updateDetune(channel: any): void;
94
98
  setVolumeEnvelope(note: any): void;
95
- setPlaybackRate(note: any): void;
96
- setPitch(channel: any, note: any): void;
99
+ setPitchEnvelope(note: any): void;
97
100
  clampCutoffFrequency(frequency: any): number;
98
101
  setFilterEnvelope(note: any): void;
99
102
  startModulation(channel: any, note: any, startTime: any): void;
@@ -109,8 +112,8 @@ export class MidyGMLite {
109
112
  handlePitchBendMessage(channelNumber: any, lsb: any, msb: any): void;
110
113
  setPitchBend(channelNumber: any, value: any): void;
111
114
  setModLfoToPitch(channel: any, note: any): void;
112
- setModLfoToVolume(note: any): void;
113
115
  setModLfoToFilterFc(note: any): void;
116
+ setModLfoToVolume(note: any): void;
114
117
  setDelayModLFO(note: any): void;
115
118
  setFreqModLFO(note: any): void;
116
119
  createVoiceParamsHandlers(): {
@@ -125,7 +128,7 @@ export class MidyGMLite {
125
128
  delayVibLFO: (_channel: any, _note: any, _prevValue: any) => void;
126
129
  freqVibLFO: (_channel: any, _note: any, _prevValue: any) => void;
127
130
  };
128
- getControllerState(channel: any, noteNumber: any, velocity: any): Float32Array;
131
+ getControllerState(channel: any, noteNumber: any, velocity: any): Float32Array<any>;
129
132
  applyVoiceParams(channel: any, controllerType: any): void;
130
133
  createControlChangeHandlers(): {
131
134
  1: (channelNumber: any, modulation: any) => void;
@@ -159,7 +162,6 @@ export class MidyGMLite {
159
162
  setRPNMSB(channelNumber: any, value: any): void;
160
163
  setRPNLSB(channelNumber: any, value: any): void;
161
164
  dataEntryMSB(channelNumber: any, value: any): void;
162
- updateDetune(channel: any, detune: any): void;
163
165
  handlePitchBendRangeRPN(channelNumber: any): void;
164
166
  setPitchBendRange(channelNumber: any, pitchWheelSensitivity: any): void;
165
167
  allSoundOff(channelNumber: any): Promise<void>;
@@ -178,7 +180,7 @@ declare class Note {
178
180
  constructor(noteNumber: any, velocity: any, startTime: any, voice: any, voiceParams: any);
179
181
  bufferSource: any;
180
182
  filterNode: any;
181
- volumeNode: any;
183
+ volumeEnvelopeNode: any;
182
184
  volumeDepth: any;
183
185
  modulationLFO: any;
184
186
  modulationDepth: any;
@@ -1 +1 @@
1
- {"version":3,"file":"midy-GMLite.d.ts","sourceRoot":"","sources":["../src/midy-GMLite.js"],"names":[],"mappings":"AAmFA;IAoBE;;;;;;;;MAQE;IAEF,+BAQC;IArCD,qBAAmB;IACnB,kBAAc;IACd,0BAAwB;IACxB,kBAAc;IACd,mBAAiB;IACjB,kBAAc;IACd,mBAAe;IACf,kBAAgB;IAChB,sBAA2C;IAC3C,mBAAkB;IAClB,mBAAkB;IAClB,kBAAiB;IACjB,oBAAmB;IACnB,mBAAkB;IAClB,gBAAc;IACd,mBAAiB;IACjB,oBAAkB;IAClB,iCAA8B;IAa5B,kBAAgC;IAChC,gBAA4C;IAC5C;;;;;;;;;;;MAA2D;IAC3D;;;;;;;;;;;;;MAA+D;IAC/D,gBAAiD;IAKnD,4BAMC;IAED,mCAWC;IAED,gDAMC;IAED,sCASC;IAED;;;;MAeC;IAED,yCAUC;IAED,6DA2BC;IAED,iEAUC;IAED,2EA+CC;IAED,mCAOC;IAED,0BAkDC;IAED,uDAEC;IAED,wDAEC;IAED;;;MAgEC;IAED,+EAmBC;IAED,qDAKC;IAED,uBAKC;IAED,aAGC;IAED,cAKC;IAED,wBAIC;IAED,0BAKC;IAED,wBAOC;IAED,sBAGC;IAED,uDASC;IAED,6CAQC;IAED,2BAEC;IAED,4BAEC;IAED,yCAIC;IAED,mCAgBC;IAED,iCAKC;IAED,wCAmBC;IAED,6CAIC;IAED,mCAuBC;IAED,+DAoBC;IAED,gHA4BC;IAED,kGAgDC;IAED,0EAGC;IAED,qFAwBC;IAED,6HAuBC;IAED,0FAGC;IAED,kEAeC;IAED,gFAiBC;IAED,4DAGC;IAED,qEAGC;IAED,mDAOC;IAED,gDASC;IAED,mCAQC;IAED,qCAMC;IAED,gCAOC;IAED,+BAMC;IAED;;;;;;;;;;;MAqBC;IAED,+EAMC;IAED,0DA6CC;IAED;;;;;;;;;;;;;MAeC;IAED,+EASC;IAED,qCAiBC;IAED,8DAKC;IACD,iDAIC;IAED;;;MAMC;IAED,2CAIC;IAED,yDAIC;IAED,mDAGC;IAED,wCAWC;IAED,sDAKC;IAED,kFAeC;IAED,oCAYC;IAED,gDAEC;IAED,gDAEC;IAED,mDAGC;IAED,8CAYC;IAED,kDAKC;IAED,wEAOC;IAED,+CAEC;IAED,8CAqBC;IAED,+CAEC;IAED,4DAgBC;IAED,oBAMC;IAED,yDAaC;IAED,yCAGC;IAED,mCAQC;IAED,wCAEC;IAED,6BASC;IAED,0DAUC;CACF;AAjtCD;IAQE,0FAMC;IAbD,kBAAa;IACb,gBAAW;IACX,gBAAW;IACX,iBAAY;IACZ,mBAAc;IACd,qBAAgB;IAGd,gBAA4B;IAC5B,cAAwB;IACxB,eAA0B;IAC1B,WAAkB;IAClB,iBAA8B;CAEjC"}
1
+ {"version":3,"file":"midy-GMLite.d.ts","sourceRoot":"","sources":["../src/midy-GMLite.js"],"names":[],"mappings":"AAmFA;IAoBE;;;;;;;;;MASE;IAEF,+BAQC;IAtCD,qBAAmB;IACnB,kBAAc;IACd,0BAAwB;IACxB,kBAAc;IACd,mBAAiB;IACjB,kBAAc;IACd,mBAAe;IACf,kBAAgB;IAChB,sBAA2C;IAC3C,mBAAkB;IAClB,mBAAkB;IAClB,kBAAiB;IACjB,oBAAmB;IACnB,mBAAkB;IAClB,gBAAc;IACd,mBAAiB;IACjB,oBAAkB;IAClB,iCAA8B;IAc5B,kBAAgC;IAChC,gBAA4C;IAC5C;;;;;;;;;;;MAA2D;IAC3D;;;;;;;;;;;;;MAA+D;IAC/D,gBAAiD;IAKnD,4BAMC;IAED,mCAWC;IAED,gDAMC;IAED,sCASC;IAED;;;;MAeC;IAED,yCAUC;IAED,6DA2BC;IAED,iEAUC;IAED,2EA+CC;IAED,mCAOC;IAED,0BAkDC;IAED,uDAEC;IAED,wDAEC;IAED;;;MAgEC;IAED,+EAmBC;IAED,qDAKC;IAED,uBAKC;IAED,aAGC;IAED,cAKC;IAED,wBAIC;IAED,0BAKC;IAED,wBAOC;IAED,sBAGC;IAED,uDASC;IAED,6CAQC;IAED,2BAEC;IAED,8BAEC;IAED,8BAEC;IAED,4BAEC;IAED,wCAIC;IAED,iCAWC;IAED,mCAgBC;IAED,kCAqBC;IAED,6CAIC;IAED,mCAuBC;IAED,+DAoBC;IAED,gHA2BC;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,+EASC;IAED,qCAiBC;IAED,8DAKC;IACD,iDAIC;IAED;;;MAMC;IAED,2CAIC;IAED,yDAIC;IAED,mDAGC;IAED,wCAWC;IAED,sDAKC;IAED,kFAeC;IAED,oCAYC;IAED,gDAEC;IAED,gDAEC;IAED,mDAGC;IAED,kDAKC;IAED,wEAOC;IAED,+CAEC;IAED,8CAqBC;IAED,+CAEC;IAED,4DAgBC;IAED,oBAMC;IAED,yDAaC;IAED,yCAGC;IAED,mCAQC;IAED,wCAEC;IAED,6BASC;IAED,0DAUC;CACF;AArtCD;IAQE,0FAMC;IAbD,kBAAa;IACb,gBAAW;IACX,wBAAmB;IACnB,iBAAY;IACZ,mBAAc;IACd,qBAAgB;IAGd,gBAA4B;IAC5B,cAAwB;IACxB,eAA0B;IAC1B,WAAkB;IAClB,iBAA8B;CAEjC"}
@@ -14,7 +14,7 @@ class Note {
14
14
  writable: true,
15
15
  value: void 0
16
16
  });
17
- Object.defineProperty(this, "volumeNode", {
17
+ Object.defineProperty(this, "volumeEnvelopeNode", {
18
18
  enumerable: true,
19
19
  configurable: true,
20
20
  writable: true,
@@ -581,14 +581,33 @@ export class MidyGMLite {
581
581
  cbToRatio(cb) {
582
582
  return Math.pow(10, cb / 200);
583
583
  }
584
+ rateToCent(rate) {
585
+ return 1200 * Math.log2(rate);
586
+ }
587
+ centToRate(cent) {
588
+ return Math.pow(2, cent / 1200);
589
+ }
584
590
  centToHz(cent) {
585
- return 8.176 * Math.pow(2, cent / 1200);
591
+ return 8.176 * this.centToRate(cent);
586
592
  }
587
- calcSemitoneOffset(channel) {
593
+ calcChannelDetune(channel) {
588
594
  const pitchWheel = channel.state.pitchWheel * 2 - 1;
589
- const pitchWheelSensitivity = channel.state.pitchWheelSensitivity * 128;
595
+ const pitchWheelSensitivity = channel.state.pitchWheelSensitivity * 12800;
590
596
  return pitchWheel * pitchWheelSensitivity;
591
597
  }
598
+ updateDetune(channel) {
599
+ const now = this.audioContext.currentTime;
600
+ channel.scheduledNotes.forEach((noteList) => {
601
+ for (let i = 0; i < noteList.length; i++) {
602
+ const note = noteList[i];
603
+ if (!note)
604
+ continue;
605
+ note.bufferSource.detune
606
+ .cancelScheduledValues(now)
607
+ .setValueAtTime(channel.detune, now);
608
+ }
609
+ });
610
+ }
592
611
  setVolumeEnvelope(note) {
593
612
  const now = this.audioContext.currentTime;
594
613
  const { voiceParams, startTime } = note;
@@ -598,7 +617,7 @@ export class MidyGMLite {
598
617
  const volAttack = volDelay + voiceParams.volAttack;
599
618
  const volHold = volAttack + voiceParams.volHold;
600
619
  const volDecay = volHold + voiceParams.volDecay;
601
- note.volumeNode.gain
620
+ note.volumeEnvelopeNode.gain
602
621
  .cancelScheduledValues(now)
603
622
  .setValueAtTime(0, startTime)
604
623
  .setValueAtTime(1e-6, volDelay) // exponentialRampToValueAtTime() requires a non-zero value
@@ -606,32 +625,28 @@ export class MidyGMLite {
606
625
  .setValueAtTime(attackVolume, volHold)
607
626
  .linearRampToValueAtTime(sustainVolume, volDecay);
608
627
  }
609
- setPlaybackRate(note) {
628
+ setPitchEnvelope(note) {
610
629
  const now = this.audioContext.currentTime;
630
+ const { voiceParams } = note;
631
+ const baseRate = voiceParams.playbackRate;
611
632
  note.bufferSource.playbackRate
612
633
  .cancelScheduledValues(now)
613
- .setValueAtTime(note.voiceParams.playbackRate, now);
614
- }
615
- setPitch(channel, note) {
616
- const now = this.audioContext.currentTime;
617
- const { startTime } = note;
618
- const basePitch = this.calcSemitoneOffset(channel) * 100;
619
- note.bufferSource.detune
620
- .cancelScheduledValues(now)
621
- .setValueAtTime(basePitch, startTime);
622
- const modEnvToPitch = note.voiceParams.modEnvToPitch;
634
+ .setValueAtTime(baseRate, now);
635
+ const modEnvToPitch = voiceParams.modEnvToPitch;
623
636
  if (modEnvToPitch === 0)
624
637
  return;
638
+ const basePitch = this.rateToCent(baseRate);
625
639
  const peekPitch = basePitch + modEnvToPitch;
640
+ const peekRate = this.centToRate(peekPitch);
626
641
  const modDelay = startTime + voiceParams.modDelay;
627
642
  const modAttack = modDelay + voiceParams.modAttack;
628
643
  const modHold = modAttack + voiceParams.modHold;
629
644
  const modDecay = modHold + voiceParams.modDecay;
630
- note.bufferSource.detune
631
- .setValueAtTime(basePitch, modDelay)
632
- .exponentialRampToValueAtTime(peekPitch, modAttack)
633
- .setValueAtTime(peekPitch, modHold)
634
- .linearRampToValueAtTime(basePitch, modDecay);
645
+ note.bufferSource.playbackRate
646
+ .setValueAtTime(baseRate, modDelay)
647
+ .exponentialRampToValueAtTime(peekRate, modAttack)
648
+ .setValueAtTime(peekRate, modHold)
649
+ .linearRampToValueAtTime(baseRate, modDecay);
635
650
  }
636
651
  clampCutoffFrequency(frequency) {
637
652
  const minFrequency = 20; // min Hz of initialFilterFc
@@ -678,27 +693,26 @@ export class MidyGMLite {
678
693
  note.modulationLFO.connect(note.modulationDepth);
679
694
  note.modulationDepth.connect(note.bufferSource.detune);
680
695
  note.modulationLFO.connect(note.volumeDepth);
681
- note.volumeDepth.connect(note.volumeNode.gain);
696
+ note.volumeDepth.connect(note.volumeEnvelopeNode.gain);
682
697
  }
683
698
  async createNote(channel, voice, noteNumber, velocity, startTime, isSF3) {
684
699
  const state = channel.state;
685
700
  const voiceParams = voice.getAllParams(state.array);
686
701
  const note = new Note(noteNumber, velocity, startTime, voice, voiceParams);
687
702
  note.bufferSource = await this.createNoteBufferNode(voiceParams, isSF3);
688
- note.volumeNode = new GainNode(this.audioContext);
703
+ note.volumeEnvelopeNode = new GainNode(this.audioContext);
689
704
  note.filterNode = new BiquadFilterNode(this.audioContext, {
690
705
  type: "lowpass",
691
706
  Q: voiceParams.initialFilterQ / 10, // dB
692
707
  });
693
708
  this.setVolumeEnvelope(note);
694
709
  this.setFilterEnvelope(note);
695
- this.setPlaybackRate(note);
710
+ this.setPitchEnvelope(note);
696
711
  if (0 < state.modulationDepth) {
697
- this.setPitch(channel, note);
698
712
  this.startModulation(channel, note, startTime);
699
713
  }
700
714
  note.bufferSource.connect(note.filterNode);
701
- note.filterNode.connect(note.volumeNode);
715
+ note.filterNode.connect(note.volumeEnvelopeNode);
702
716
  note.bufferSource.start(startTime);
703
717
  return note;
704
718
  }
@@ -714,8 +728,8 @@ export class MidyGMLite {
714
728
  if (!voice)
715
729
  return;
716
730
  const note = await this.createNote(channel, voice, noteNumber, velocity, startTime, isSF3);
717
- note.volumeNode.connect(channel.gainL);
718
- note.volumeNode.connect(channel.gainR);
731
+ note.volumeEnvelopeNode.connect(channel.gainL);
732
+ note.volumeEnvelopeNode.connect(channel.gainR);
719
733
  const exclusiveClass = note.voiceParams.exclusiveClass;
720
734
  if (exclusiveClass !== 0) {
721
735
  if (this.exclusiveClassMap.has(exclusiveClass)) {
@@ -743,7 +757,7 @@ export class MidyGMLite {
743
757
  }
744
758
  stopNote(endTime, stopTime, scheduledNotes, index) {
745
759
  const note = scheduledNotes[index];
746
- note.volumeNode.gain
760
+ note.volumeEnvelopeNode.gain
747
761
  .cancelScheduledValues(endTime)
748
762
  .linearRampToValueAtTime(0, stopTime);
749
763
  note.ending = true;
@@ -754,8 +768,8 @@ export class MidyGMLite {
754
768
  note.bufferSource.onended = () => {
755
769
  scheduledNotes[index] = null;
756
770
  note.bufferSource.disconnect();
757
- note.volumeNode.disconnect();
758
771
  note.filterNode.disconnect();
772
+ note.volumeEnvelopeNode.disconnect();
759
773
  if (note.modulationDepth) {
760
774
  note.volumeDepth.disconnect();
761
775
  note.modulationDepth.disconnect();
@@ -838,29 +852,22 @@ export class MidyGMLite {
838
852
  setPitchBend(channelNumber, value) {
839
853
  const channel = this.channels[channelNumber];
840
854
  const state = channel.state;
855
+ const prev = state.pitchWheel * 2 - 1;
856
+ const next = (value - 8192) / 8192;
841
857
  state.pitchWheel = value / 16383;
842
- const pitchWheel = (value - 8192) / 8192;
843
- const detuneChange = pitchWheel * state.pitchWheelSensitivity * 12800;
844
- this.updateDetune(channel, detuneChange);
858
+ channel.detune += (next - prev) * state.pitchWheelSensitivity * 12800;
859
+ this.updateDetune(channel);
860
+ this.applyVoiceParams(channel, 14);
845
861
  }
846
862
  setModLfoToPitch(channel, note) {
847
863
  const now = this.audioContext.currentTime;
848
864
  const modLfoToPitch = note.voiceParams.modLfoToPitch;
849
- const modulationDepth = Math.abs(modLfoToPitch) +
865
+ const baseDepth = Math.abs(modLfoToPitch) +
850
866
  channel.state.modulationDepth;
851
- const modulationDepthSign = (0 < modLfoToPitch) ? 1 : -1;
867
+ const modulationDepth = baseDepth * Math.sign(modLfoToPitch);
852
868
  note.modulationDepth.gain
853
869
  .cancelScheduledValues(now)
854
- .setValueAtTime(modulationDepth * modulationDepthSign, now);
855
- }
856
- setModLfoToVolume(note) {
857
- const now = this.audioContext.currentTime;
858
- const modLfoToVolume = note.voiceParams.modLfoToVolume;
859
- const volumeDepth = this.cbToRatio(Math.abs(modLfoToVolume)) - 1;
860
- const volumeDepthSign = (0 < modLfoToVolume) ? 1 : -1;
861
- note.volumeDepth.gain
862
- .cancelScheduledValues(now)
863
- .setValueAtTime(volumeDepth * volumeDepthSign, now);
870
+ .setValueAtTime(modulationDepth, now);
864
871
  }
865
872
  setModLfoToFilterFc(note) {
866
873
  const now = this.audioContext.currentTime;
@@ -869,6 +876,15 @@ export class MidyGMLite {
869
876
  .cancelScheduledValues(now)
870
877
  .setValueAtTime(modLfoToFilterFc, now);
871
878
  }
879
+ setModLfoToVolume(note) {
880
+ const now = this.audioContext.currentTime;
881
+ const modLfoToVolume = note.voiceParams.modLfoToVolume;
882
+ const baseDepth = this.cbToRatio(Math.abs(modLfoToVolume)) - 1;
883
+ const volumeDepth = baseDepth * Math.sign(modLfoToVolume);
884
+ note.volumeDepth.gain
885
+ .cancelScheduledValues(now)
886
+ .setValueAtTime(volumeDepth, now);
887
+ }
872
888
  setDelayModLFO(note) {
873
889
  const now = this.audioContext.currentTime;
874
890
  const startTime = note.startTime;
@@ -945,7 +961,7 @@ export class MidyGMLite {
945
961
  noteVoiceParams[key] = voiceParams[key];
946
962
  }
947
963
  this.setFilterEnvelope(channel, note);
948
- this.setPitch(channel, note);
964
+ this.setPitchEnvelope(note);
949
965
  }
950
966
  else if (volumeEnvelopeKeySet.has(key)) {
951
967
  if (appliedVolumeEnvelope)
@@ -999,7 +1015,7 @@ export class MidyGMLite {
999
1015
  note.modulationDepth.gain.setValueAtTime(channel.state.modulationDepth, now);
1000
1016
  }
1001
1017
  else {
1002
- this.setPitch(channel, note);
1018
+ this.setPitchEnvelope(note);
1003
1019
  this.startModulation(channel, note, now);
1004
1020
  }
1005
1021
  }
@@ -1094,20 +1110,6 @@ export class MidyGMLite {
1094
1110
  this.channels[channelNumber].dataMSB = value;
1095
1111
  this.handleRPN(channelNumber);
1096
1112
  }
1097
- updateDetune(channel, detune) {
1098
- const now = this.audioContext.currentTime;
1099
- channel.scheduledNotes.forEach((noteList) => {
1100
- for (let i = 0; i < noteList.length; i++) {
1101
- const note = noteList[i];
1102
- if (!note)
1103
- continue;
1104
- const { bufferSource } = note;
1105
- bufferSource.detune
1106
- .cancelScheduledValues(now)
1107
- .setValueAtTime(detune, now);
1108
- }
1109
- });
1110
- }
1111
1113
  handlePitchBendRangeRPN(channelNumber) {
1112
1114
  const channel = this.channels[channelNumber];
1113
1115
  this.limitData(channel, 0, 127, 0, 99);
@@ -1233,6 +1235,7 @@ Object.defineProperty(MidyGMLite, "channelSettings", {
1233
1235
  writable: true,
1234
1236
  value: {
1235
1237
  currentBufferSource: null,
1238
+ detune: 0,
1236
1239
  program: 0,
1237
1240
  bank: 0,
1238
1241
  dataMSB: 0,
package/esm/midy.d.ts CHANGED
@@ -1,6 +1,10 @@
1
1
  export class Midy {
2
2
  static channelSettings: {
3
3
  currentBufferSource: null;
4
+ detune: number;
5
+ scaleOctaveTuningTable: any[];
6
+ pressureTable: Uint8Array<ArrayBuffer>;
7
+ keyBasedInstrumentControlTable: Int8Array<ArrayBuffer>;
4
8
  program: number;
5
9
  bank: number;
6
10
  bankMSB: number;
@@ -79,8 +83,8 @@ export class Midy {
79
83
  vibLfoToPitch: (channel: any, note: any, _prevValue: any) => void;
80
84
  modLfoToFilterFc: (channel: any, note: any, _prevValue: any) => void;
81
85
  modLfoToVolume: (channel: any, note: any) => void;
82
- chorusEffectsSend: (_channel: any, note: any, prevValue: any) => void;
83
- reverbEffectsSend: (_channel: any, note: any, prevValue: any) => void;
86
+ chorusEffectsSend: (channel: any, note: any, prevValue: any) => void;
87
+ reverbEffectsSend: (channel: any, note: any, prevValue: any) => void;
84
88
  delayModLFO: (_channel: any, note: any, _prevValue: any) => void;
85
89
  freqModLFO: (_channel: any, note: any, _prevValue: any) => void;
86
90
  delayVibLFO: (channel: any, note: any, prevValue: any) => void;
@@ -192,12 +196,16 @@ export class Midy {
192
196
  feedbackGains: any[];
193
197
  };
194
198
  cbToRatio(cb: any): number;
199
+ rateToCent(rate: any): number;
200
+ centToRate(cent: any): number;
195
201
  centToHz(cent: any): number;
196
- calcSemitoneOffset(channel: any): any;
202
+ calcChannelDetune(channel: any): any;
203
+ calcNoteDetune(channel: any, note: any): any;
204
+ updateDetune(channel: any): void;
205
+ getPortamentoTime(channel: any): number;
197
206
  setPortamentoStartVolumeEnvelope(channel: any, note: any): void;
198
207
  setVolumeEnvelope(channel: any, note: any): void;
199
- setPlaybackRate(note: any): void;
200
- setPitch(channel: any, note: any): void;
208
+ setPitchEnvelope(note: any): void;
201
209
  clampCutoffFrequency(frequency: any): number;
202
210
  setPortamentoStartFilterEnvelope(channel: any, note: any): void;
203
211
  setFilterEnvelope(channel: any, note: any): void;
@@ -215,15 +223,16 @@ export class Midy {
215
223
  handleMIDIMessage(statusByte: any, data1: any, data2: any): void | Promise<any>;
216
224
  handlePolyphonicKeyPressure(channelNumber: any, noteNumber: any, pressure: any): void;
217
225
  handleProgramChange(channelNumber: any, program: any): void;
218
- handleChannelPressure(channelNumber: any, pressure: any): void;
226
+ handleChannelPressure(channelNumber: any, value: any): void;
227
+ setChannelPressure(channel: any, note: any): void;
219
228
  handlePitchBendMessage(channelNumber: any, lsb: any, msb: any): void;
220
229
  setPitchBend(channelNumber: any, value: any): void;
221
230
  setModLfoToPitch(channel: any, note: any): void;
222
- setModLfoToVolume(note: any): void;
223
- setChorusEffectsSend(note: any, prevValue: any): void;
224
- setReverbEffectsSend(note: any, prevValue: any): void;
225
231
  setVibLfoToPitch(channel: any, note: any): void;
226
- setModLfoToFilterFc(note: any): void;
232
+ setModLfoToFilterFc(channel: any, note: any): void;
233
+ setModLfoToVolume(channel: any, note: any): void;
234
+ setReverbEffectsSend(channel: any, note: any, prevValue: any): void;
235
+ setChorusEffectsSend(channel: any, note: any, prevValue: any): void;
227
236
  setDelayModLFO(note: any): void;
228
237
  setFreqModLFO(note: any): void;
229
238
  createVoiceParamsHandlers(): {
@@ -231,14 +240,14 @@ export class Midy {
231
240
  vibLfoToPitch: (channel: any, note: any, _prevValue: any) => void;
232
241
  modLfoToFilterFc: (channel: any, note: any, _prevValue: any) => void;
233
242
  modLfoToVolume: (channel: any, note: any) => void;
234
- chorusEffectsSend: (_channel: any, note: any, prevValue: any) => void;
235
- reverbEffectsSend: (_channel: any, note: any, prevValue: any) => void;
243
+ chorusEffectsSend: (channel: any, note: any, prevValue: any) => void;
244
+ reverbEffectsSend: (channel: any, note: any, prevValue: any) => void;
236
245
  delayModLFO: (_channel: any, note: any, _prevValue: any) => void;
237
246
  freqModLFO: (_channel: any, note: any, _prevValue: any) => void;
238
247
  delayVibLFO: (channel: any, note: any, prevValue: any) => void;
239
248
  freqVibLFO: (channel: any, note: any, _prevValue: any) => void;
240
249
  };
241
- getControllerState(channel: any, noteNumber: any, velocity: any): Float32Array;
250
+ getControllerState(channel: any, noteNumber: any, velocity: any): Float32Array<any>;
242
251
  applyVoiceParams(channel: any, controllerType: any): void;
243
252
  createControlChangeHandlers(): {
244
253
  0: (channelNumber: any, msb: any) => void;
@@ -281,11 +290,13 @@ export class Midy {
281
290
  updateModulation(channel: any): void;
282
291
  setModulationDepth(channelNumber: any, modulation: any): void;
283
292
  setPortamentoTime(channelNumber: any, portamentoTime: any): void;
293
+ setKeyBasedVolume(channel: any): void;
284
294
  setVolume(channelNumber: any, volume: any): void;
285
295
  panToGain(pan: any): {
286
296
  gainLeft: number;
287
297
  gainRight: number;
288
298
  };
299
+ setKeyBasedPan(channel: any): void;
289
300
  setPan(channelNumber: any, pan: any): void;
290
301
  setExpression(channelNumber: any, expression: any): void;
291
302
  setBankLSB(channelNumber: any, lsb: any): void;
@@ -293,8 +304,6 @@ export class Midy {
293
304
  updateChannelVolume(channel: any): void;
294
305
  setSustainPedal(channelNumber: any, value: any): void;
295
306
  setPortamento(channelNumber: any, value: any): void;
296
- setReverbSendLevel(channelNumber: any, reverbSendLevel: any): void;
297
- setChorusSendLevel(channelNumber: any, chorusSendLevel: any): void;
298
307
  setSostenutoPedal(channelNumber: any, value: any): void;
299
308
  setSoftPedal(channelNumber: any, softPedal: any): void;
300
309
  setFilterResonance(channelNumber: any, filterResonance: any): void;
@@ -305,6 +314,8 @@ export class Midy {
305
314
  setVibratoRate(channelNumber: any, vibratoRate: any): void;
306
315
  setVibratoDepth(channelNumber: any, vibratoDepth: any): void;
307
316
  setVibratoDelay(channelNumber: any, vibratoDelay: any): void;
317
+ setReverbSendLevel(channelNumber: any, reverbSendLevel: any): void;
318
+ setChorusSendLevel(channelNumber: any, chorusSendLevel: any): void;
308
319
  limitData(channel: any, minMSB: any, maxMSB: any, minLSB: any, maxLSB: any): void;
309
320
  limitDataMSB(channel: any, minMSB: any, maxMSB: any): void;
310
321
  handleRPN(channelNumber: any, value: any): void;
@@ -313,13 +324,12 @@ export class Midy {
313
324
  setRPNMSB(channelNumber: any, value: any): void;
314
325
  setRPNLSB(channelNumber: any, value: any): void;
315
326
  dataEntryMSB(channelNumber: any, value: any): void;
316
- updateDetune(channel: any, detune: any): void;
317
327
  handlePitchBendRangeRPN(channelNumber: any): void;
318
- setPitchBendRange(channelNumber: any, pitchWheelSensitivity: any): void;
328
+ setPitchBendRange(channelNumber: any, value: any): void;
319
329
  handleFineTuningRPN(channelNumber: any): void;
320
- setFineTuning(channelNumber: any, fineTuning: any): void;
330
+ setFineTuning(channelNumber: any, value: any): void;
321
331
  handleCoarseTuningRPN(channelNumber: any): void;
322
- setCoarseTuning(channelNumber: any, coarseTuning: any): void;
332
+ setCoarseTuning(channelNumber: any, value: any): void;
323
333
  handleModulationDepthRangeRPN(channelNumber: any): void;
324
334
  setModulationDepthRange(channelNumber: any, modulationDepthRange: any): void;
325
335
  allSoundOff(channelNumber: any): Promise<void>;
@@ -336,9 +346,9 @@ export class Midy {
336
346
  handleMasterVolumeSysEx(data: any): void;
337
347
  setMasterVolume(volume: any): void;
338
348
  handleMasterFineTuningSysEx(data: any): void;
339
- setMasterFineTuning(fineTuning: any): void;
349
+ setMasterFineTuning(value: any): void;
340
350
  handleMasterCoarseTuningSysEx(data: any): void;
341
- setMasterCoarseTuning(coarseTuning: any): void;
351
+ setMasterCoarseTuning(value: any): void;
342
352
  handleGlobalParameterControlSysEx(data: any): void;
343
353
  handleReverbParameterSysEx(data: any): void;
344
354
  setReverbType(type: any): void;
@@ -357,6 +367,11 @@ export class Midy {
357
367
  getChorusFeedback(value: any): number;
358
368
  setChorusSendToReverb(value: any): void;
359
369
  getChorusSendToReverb(value: any): number;
370
+ getChannelBitmap(data: any): any[];
371
+ handleScaleOctaveTuning1ByteFormatSysEx(data: any): void;
372
+ handleChannelPressureSysEx(data: any): void;
373
+ getKeyBasedInstrumentControlValue(channel: any, keyNumber: any, controllerType: any): number;
374
+ handleKeyBasedInstrumentControlSysEx(data: any): void;
360
375
  handleExclusiveMessage(data: any): void;
361
376
  handleSysEx(data: any): void;
362
377
  scheduleTask(callback: any, startTime: any): Promise<any>;
@@ -365,7 +380,10 @@ declare class Note {
365
380
  constructor(noteNumber: any, velocity: any, startTime: any, voice: any, voiceParams: any);
366
381
  bufferSource: any;
367
382
  filterNode: any;
383
+ volumeEnvelopeNode: any;
368
384
  volumeNode: any;
385
+ gainL: any;
386
+ gainR: any;
369
387
  volumeDepth: any;
370
388
  modulationLFO: any;
371
389
  modulationDepth: any;
package/esm/midy.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"midy.d.ts","sourceRoot":"","sources":["../src/midy.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"midy.d.ts","sourceRoot":"","sources":["../src/midy.js"],"names":[],"mappings":"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"}