@marmooo/midy 0.0.6 → 0.0.7

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
@@ -140,11 +140,19 @@ export class MidyGM1 {
140
140
  setExpression(channelNumber: any, expression: any): void;
141
141
  updateChannelGain(channel: any): void;
142
142
  setSustainPedal(channelNumber: any, value: any): void;
143
+ limitData(channel: any, minMSB: any, maxMSB: any, minLSB: any, maxLSB: any): void;
144
+ limitDataMSB(channel: any, minMSB: any, maxMSB: any): void;
145
+ handleRPN(channelNumber: any): void;
143
146
  setRPNMSB(channelNumber: any, value: any): void;
144
147
  setRPNLSB(channelNumber: any, value: any): void;
145
148
  setDataEntry(channelNumber: any, value: any, isMSB: any): void;
146
- handlePitchBendRangeMessage(channelNumber: any, dataMSB: any, dataLSB: any): void;
149
+ updateDetune(channel: any, detuneChange: any): void;
150
+ handlePitchBendRangeMessage(channelNumber: any): void;
147
151
  setPitchBendRange(channelNumber: any, pitchBendRange: any): void;
152
+ handleFineTuningMessage(channelNumber: any): void;
153
+ setFineTuning(channelNumber: any, fineTuning: any): void;
154
+ handleCoarseTuningMessage(channelNumber: any): void;
155
+ setCoarseTuning(channelNumber: any, coarseTuning: any): void;
148
156
  allSoundOff(channelNumber: any): any[];
149
157
  resetAllControllers(channelNumber: any): void;
150
158
  allNotesOff(channelNumber: any): any[];
@@ -1 +1 @@
1
- {"version":3,"file":"midy-GM1.d.ts","sourceRoot":"","sources":["../src/midy-GM1.js"],"names":[],"mappings":"AAqBA;IAmBE;;;;;;;;;;;MAWE;IAEF;;;;;;;MAOE;IAEF,+BAMC;IA9CD,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;IAyBhB,kBAAgC;IAChC,gBAA4C;IAE5C;;;;;;;;;;;;;;;;;;;;QAAiD;IAInD,4BAMC;IAED,mCASC;IAED,gDAMC;IAED,sCASC;IAED;;;MAYC;IAED;;;;;;;;;;;;;;;;;;;;QAUC;IAED,+DAyBC;IAED,mEAWC;IAED,qDAOC;IAED,2EA+CC;IAED,mCAOC;IAED,0BA+CC;IAED,uDAEC;IAED,wDAEC;IAED;;;MA8DC;IAED,4BAsBC;IAED,uBAKC;IAED,aAGC;IAED,cAKC;IAED,wBAIC;IAED,0BAKC;IAED,wBAOC;IAED,sBAGC;IAED,uDASC;IAED,6CAQC;IAED,sDAEC;IAED,2BAEC;IAED,4BAEC;IAED,sCAGC;IAED,mFAGC;IAED,iDAiBC;IAED,iDAiCC;IAED,0DAmBC;IAED,wHA6BC;IAED,kGA6BC;IAED,0EAGC;IAED,sIAmDC;IAED,0FAGC;IAED,kEAeC;IAED,wFAiBC;IAED,4DAGC;IAED,qEAGC;IAED,uDAeC;IAED,mFA+BC;IAED,yDAiBC;IAED,iDAIC;IAED;;;MAMC;IAED,2CAIC;IAED,yDAIC;IAED,sCAUC;IAED,sDAMC;IAED,gDAEC;IAED,gDAEC;IAED,+DAuBC;IAED,kFAGC;IAED,iEAeC;IAED,uCAoBC;IAED,8CAEC;IAED,uCAoBC;IAED,4DAgBC;IAED,oBAQC;IAED,yDAaC;IAED,yCAGC;IAED,mCAQC;IAED,wCAEC;IAED,6BASC;IAED,0DAUC;CACF;AAz/BD;IAOE,gFAKC;IAXD,kBAAa;IACb,cAAS;IACT,gBAAW;IACX,YAAO;IACP,gBAAW;IAGT,gBAA4B;IAC5B,cAAwB;IACxB,eAA0B;IAC1B,mBAAkC;CAErC"}
1
+ {"version":3,"file":"midy-GM1.d.ts","sourceRoot":"","sources":["../src/midy-GM1.js"],"names":[],"mappings":"AAqBA;IAmBE;;;;;;;;;;;MAWE;IAEF;;;;;;;MAOE;IAEF,+BAMC;IA9CD,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;IAyBhB,kBAAgC;IAChC,gBAA4C;IAE5C;;;;;;;;;;;;;;;;;;;;QAAiD;IAInD,4BAMC;IAED,mCASC;IAED,gDAMC;IAED,sCASC;IAED;;;MAYC;IAED;;;;;;;;;;;;;;;;;;;;QAUC;IAED,+DAyBC;IAED,mEAWC;IAED,qDAOC;IAED,2EA+CC;IAED,mCAOC;IAED,0BA+CC;IAED,uDAEC;IAED,wDAEC;IAED;;;MA8DC;IAED,4BAsBC;IAED,uBAKC;IAED,aAGC;IAED,cAKC;IAED,wBAIC;IAED,0BAKC;IAED,wBAOC;IAED,sBAGC;IAED,uDASC;IAED,6CAQC;IAED,sDAGC;IAED,2BAEC;IAED,4BAEC;IAED,sCAGC;IAED,mFAGC;IAED,iDAiBC;IAED,iDAiCC;IAED,0DAmBC;IAED,wHA6BC;IAED,kGA6BC;IAED,0EAGC;IAED,sIAmDC;IAED,0FAGC;IAED,kEAeC;IAED,wFAiBC;IAED,4DAGC;IAED,qEAGC;IAED,uDAOC;IAED,mFA+BC;IAED,yDAiBC;IAED,iDAIC;IAED;;;MAMC;IAED,2CAIC;IAED,yDAIC;IAED,sCAUC;IAED,sDAMC;IAED,kFAeC;IAED,2DAMC;IAED,oCAkBC;IAED,gDAEC;IAED,gDAEC;IAED,+DAIC;IAED,oDAUC;IAED,sDAKC;IAED,iEAOC;IAED,kDAKC;IAED,yDAGC;IAED,oDAKC;IAED,6DAGC;IAED,uCAoBC;IAED,8CAEC;IAED,uCAoBC;IAED,4DAgBC;IAED,oBAQC;IAED,yDAaC;IAED,yCAGC;IAED,mCAQC;IAED,wCAEC;IAED,6BASC;IAED,0DAUC;CACF;AA1iCD;IAOE,gFAKC;IAXD,kBAAa;IACb,cAAS;IACT,gBAAW;IACX,YAAO;IACP,gBAAW;IAGT,gBAA4B;IAC5B,cAAwB;IACxB,eAA0B;IAC1B,mBAAkC;CAErC"}
package/esm/midy-GM1.js CHANGED
@@ -492,7 +492,8 @@ export class MidyGM1 {
492
492
  return noteList[0];
493
493
  }
494
494
  connectNoteEffects(channel, gainNode) {
495
- gainNode.connect(channel.pannerNode);
495
+ gainNode.connect(channel.gainL);
496
+ gainNode.connect(channel.gainR);
496
497
  }
497
498
  cbToRatio(cb) {
498
499
  return Math.pow(10, cb / 200);
@@ -703,20 +704,12 @@ export class MidyGM1 {
703
704
  this.setPitchBend(channelNumber, pitchBend);
704
705
  }
705
706
  setPitchBend(channelNumber, pitchBend) {
706
- const now = this.audioContext.currentTime;
707
707
  const channel = this.channels[channelNumber];
708
708
  const prevPitchBend = channel.pitchBend;
709
709
  channel.pitchBend = (pitchBend - 8192) / 8192;
710
710
  const detuneChange = (channel.pitchBend - prevPitchBend) *
711
711
  channel.pitchBendRange * 100;
712
- const activeNotes = this.getActiveNotes(channel, now);
713
- activeNotes.forEach((activeNote) => {
714
- const { bufferSource } = activeNote;
715
- const detune = bufferSource.detune.value + detuneChange;
716
- bufferSource.detune
717
- .cancelScheduledValues(now)
718
- .setValueAtTime(detune, now);
719
- });
712
+ this.updateDetune(channel, detuneChange);
720
713
  }
721
714
  handleControlChange(channelNumber, controller, value) {
722
715
  switch (controller) {
@@ -735,9 +728,9 @@ export class MidyGM1 {
735
728
  case 64:
736
729
  return this.setSustainPedal(channelNumber, value);
737
730
  case 100:
738
- return this.setRPNMSB(channelNumber, value);
739
- case 101:
740
731
  return this.setRPNLSB(channelNumber, value);
732
+ case 101:
733
+ return this.setRPNMSB(channelNumber, value);
741
734
  case 120:
742
735
  return this.allSoundOff(channelNumber);
743
736
  case 121:
@@ -804,41 +797,62 @@ export class MidyGM1 {
804
797
  this.releaseSustainPedal(channelNumber, value);
805
798
  }
806
799
  }
807
- setRPNMSB(channelNumber, value) {
808
- this.channels[channelNumber].rpnMSB = value;
800
+ limitData(channel, minMSB, maxMSB, minLSB, maxLSB) {
801
+ if (maxLSB < channel.dataLSB) {
802
+ channel.dataMSB++;
803
+ channel.dataLSB = minLSB;
804
+ }
805
+ else if (channel.dataLSB < 0) {
806
+ channel.dataMSB--;
807
+ channel.dataLSB = maxLSB;
808
+ }
809
+ if (maxMSB < channel.dataMSB) {
810
+ channel.dataMSB = maxMSB;
811
+ channel.dataLSB = maxLSB;
812
+ }
813
+ else if (channel.dataMSB < 0) {
814
+ channel.dataMSB = minMSB;
815
+ channel.dataLSB = minLSB;
816
+ }
809
817
  }
810
- setRPNLSB(channelNumber, value) {
811
- this.channels[channelNumber].rpnLSB = value;
818
+ limitDataMSB(channel, minMSB, maxMSB) {
819
+ if (maxMSB < channel.dataMSB) {
820
+ channel.dataMSB = maxMSB;
821
+ }
822
+ else if (channel.dataMSB < 0) {
823
+ channel.dataMSB = minMSB;
824
+ }
812
825
  }
813
- setDataEntry(channelNumber, value, isMSB) {
826
+ handleRPN(channelNumber) {
814
827
  const channel = this.channels[channelNumber];
815
828
  const rpn = channel.rpnMSB * 128 + channel.rpnLSB;
816
- isMSB ? channel.dataMSB = value : channel.dataLSB = value;
817
- const { dataMSB, dataLSB } = channel;
818
829
  switch (rpn) {
819
830
  case 0:
820
- return this.handlePitchBendRangeMessage(channelNumber, dataMSB, dataLSB);
831
+ this.handlePitchBendRangeMessage(channelNumber);
832
+ break;
821
833
  case 1:
822
- channel.fineTuning = (dataMSB * 128 + dataLSB - 8192) / 8192;
834
+ this.handleFineTuningMessage(channelNumber);
823
835
  break;
824
836
  case 2:
825
- channel.coarseTuning = dataMSB - 64;
837
+ this.handleCoarseTuningMessage(channelNumber);
826
838
  break;
827
839
  default:
828
840
  console.warn(`Channel ${channelNumber}: Unsupported RPN MSB=${channel.rpnMSB} LSB=${channel.rpnLSB}`);
829
841
  }
830
842
  }
831
- handlePitchBendRangeMessage(channelNumber, dataMSB, dataLSB) {
832
- const pitchBendRange = dataMSB + dataLSB / 100;
833
- this.setPitchBendRange(channelNumber, pitchBendRange);
843
+ setRPNMSB(channelNumber, value) {
844
+ this.channels[channelNumber].rpnMSB = value;
834
845
  }
835
- setPitchBendRange(channelNumber, pitchBendRange) {
836
- const now = this.audioContext.currentTime;
846
+ setRPNLSB(channelNumber, value) {
847
+ this.channels[channelNumber].rpnLSB = value;
848
+ }
849
+ setDataEntry(channelNumber, value, isMSB) {
837
850
  const channel = this.channels[channelNumber];
838
- const prevPitchBendRange = channel.pitchBendRange;
839
- channel.pitchBendRange = pitchBendRange;
840
- const detuneChange = (channel.pitchBendRange - prevPitchBendRange) *
841
- channel.pitchBend * 100;
851
+ isMSB ? channel.dataMSB = value : channel.dataLSB = value;
852
+ this.handleRPN(channelNumber);
853
+ }
854
+ updateDetune(channel, detuneChange) {
855
+ const now = this.audioContext.currentTime;
842
856
  const activeNotes = this.getActiveNotes(channel, now);
843
857
  activeNotes.forEach((activeNote) => {
844
858
  const { bufferSource } = activeNote;
@@ -848,6 +862,40 @@ export class MidyGM1 {
848
862
  .setValueAtTime(detune, now);
849
863
  });
850
864
  }
865
+ handlePitchBendRangeMessage(channelNumber) {
866
+ const channel = this.channels[channelNumber];
867
+ this.limitData(channel, 0, 127, 0, 99);
868
+ const pitchBendRange = channel.dataMSB + channel.dataLSB / 100;
869
+ this.setPitchBendRange(channelNumber, pitchBendRange);
870
+ }
871
+ setPitchBendRange(channelNumber, pitchBendRange) {
872
+ const channel = this.channels[channelNumber];
873
+ const prevPitchBendRange = channel.pitchBendRange;
874
+ channel.pitchBendRange = pitchBendRange;
875
+ const detuneChange = (channel.pitchBendRange - prevPitchBendRange) *
876
+ channel.pitchBend * 100;
877
+ this.updateDetune(channel, detuneChange);
878
+ }
879
+ handleFineTuningMessage(channelNumber) {
880
+ const channel = this.channels[channelNumber];
881
+ this.limitData(channel, 0, 127, 0, 127);
882
+ const fineTuning = (channel.dataMSB * 128 + channel.dataLSB - 8192) / 8192;
883
+ this.setFineTuning(channelNumber, fineTuning);
884
+ }
885
+ setFineTuning(channelNumber, fineTuning) {
886
+ const channel = this.channels[channelNumber];
887
+ channel.fineTuning = fineTuning;
888
+ }
889
+ handleCoarseTuningMessage(channelNumber) {
890
+ const channel = this.channels[channelNumber];
891
+ this.limitDataMSB(channel, 0, 127);
892
+ const coarseTuning = channel.dataMSB - 64;
893
+ this.setFineTuning(channelNumber, coarseTuning);
894
+ }
895
+ setCoarseTuning(channelNumber, coarseTuning) {
896
+ const channel = this.channels[channelNumber];
897
+ channel.fineTuning = coarseTuning;
898
+ }
851
899
  allSoundOff(channelNumber) {
852
900
  const now = this.audioContext.currentTime;
853
901
  const channel = this.channels[channelNumber];
package/esm/midy-GM2.d.ts CHANGED
@@ -73,8 +73,8 @@ export class MidyGM2 {
73
73
  lfoFilterDepth: number;
74
74
  lfoAmplitudeDepth: number;
75
75
  };
76
- gainNode: any;
77
- pannerNode: any;
76
+ gainL: any;
77
+ gainR: any;
78
78
  reverbEffect: {
79
79
  convolverNode: any;
80
80
  dryGain: any;
@@ -117,8 +117,8 @@ export class MidyGM2 {
117
117
  loadSoundFont(soundFontUrl: any): Promise<void>;
118
118
  loadMIDI(midiUrl: any): Promise<void>;
119
119
  setChannelAudioNodes(audioContext: any): {
120
- gainNode: any;
121
- pannerNode: any;
120
+ gainL: any;
121
+ gainR: any;
122
122
  reverbEffect: {
123
123
  convolverNode: any;
124
124
  dryGain: any;
@@ -142,8 +142,8 @@ export class MidyGM2 {
142
142
  lfoFilterDepth: number;
143
143
  lfoAmplitudeDepth: number;
144
144
  };
145
- gainNode: any;
146
- pannerNode: any;
145
+ gainL: any;
146
+ gainR: any;
147
147
  reverbEffect: {
148
148
  convolverNode: any;
149
149
  dryGain: any;
@@ -254,11 +254,19 @@ export class MidyGM2 {
254
254
  setChorus(channelNumber: any, chorus: any): void;
255
255
  setSostenutoPedal(channelNumber: any, value: any): void;
256
256
  setSoftPedal(channelNumber: any, softPedal: any): void;
257
+ limitData(channel: any, minMSB: any, maxMSB: any, minLSB: any, maxLSB: any): void;
258
+ limitDataMSB(channel: any, minMSB: any, maxMSB: any): void;
259
+ handleRPN(channelNumber: any, value: any): void;
257
260
  setRPNMSB(channelNumber: any, value: any): void;
258
261
  setRPNLSB(channelNumber: any, value: any): void;
259
262
  setDataEntry(channelNumber: any, value: any, isMSB: any): void;
260
- handlePitchBendRangeMessage(channelNumber: any, dataMSB: any, dataLSB: any): void;
263
+ updateDetune(channel: any, detuneChange: any): void;
264
+ handlePitchBendRangeMessage(channelNumber: any): void;
261
265
  setPitchBendRange(channelNumber: any, pitchBendRange: any): void;
266
+ handleFineTuningMessage(channelNumber: any): void;
267
+ setFineTuning(channelNumber: any, fineTuning: any): void;
268
+ handleCoarseTuningMessage(channelNumber: any): void;
269
+ setCoarseTuning(channelNumber: any, coarseTuning: any): void;
262
270
  allSoundOff(channelNumber: any): any[];
263
271
  resetAllControllers(channelNumber: any): void;
264
272
  allNotesOff(channelNumber: any): any[];
@@ -1 +1 @@
1
- {"version":3,"file":"midy-GM2.d.ts","sourceRoot":"","sources":["../src/midy-GM2.js"],"names":[],"mappings":"AAuBA;IAwBE;;;;;;;;;;;;;;;;;MAiBE;IAEF;;;;;;;;;;;MAWE;IAEF;;;;;;;MAOE;IAEF,+BAMC;IAtED,qBAAmB;IACnB,kBAAc;IACd,qBAAmB;IACnB,yBAAqB;IACrB,2BAAuB;IACvB,cAAa;IACb,cAAa;IACb,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;IA4ChB,kBAAgC;IAChC,gBAA4C;IAE5C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAAiD;IAInD,4BAMC;IAED,mCASC;IAED,gDAMC;IAED,sCASC;IAED;;;;;;;;;;;;;;MAoBC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAcC;IAED,+DAyBC;IAED,mEAWC;IAED,qDAOC;IAED,2EAkDC;IAED,mCAOC;IAED,0BA+CC;IAED,uDAEC;IAED,wDAEC;IAED;;;MAgGC;IAED,4BAsBC;IAED,uBAKC;IAED,aAGC;IAED,cAKC;IAED,wBAIC;IAED,0BAKC;IAED,wBAOC;IAED,sBAGC;IAED,uDASC;IAED,6CAQC;IAED;;;;MAoCC;IAED;;;;;MAqCC;IAED,sDA2BC;IAED,2BAEC;IAED,4BAEC;IAED,sCAKC;IAED,mFAGC;IAED,iDAiBC;IAED,iDAiCC;IAED,0DAmBC;IAED,wHAiCC;IAED,gDAQC;IAED,kGAgCC;IAED,0EAGC;IAED,sIAoDC;IAED,0FAGC;IAED,kEAeC;IAED,oEAYC;IAED,wFAmBC;IAED,4DAIC;IAED,+DAcC;IAED,qEAGC;IAED,uDAeC;IAED,mFAuDC;IAED,+CAEC;IAED,yDAiBC;IAED,iEAEC;IAED,iDAIC;IAED;;;MAMC;IAED,2CAIC;IAED,yDAIC;IAED,+CAEC;IAED,sCAUC;IAED,sDAMC;IAED,oDAEC;IAED,iDASC;IAED,iDAIC;IAED,wDAWC;IAED,uDAGC;IAED,gDAEC;IAED,gDAEC;IAED,+DA0BC;IAED,kFAGC;IAED,iEAeC;IAED,uCAoBC;IAED,8CAEC;IAED,uCAoBC;IAED,gBAEC;IAED,eAEC;IAED,eAEC;IAED,eAEC;IAED,4DAmBC;IAED,oBAQC;IAED,oBAQC;IAED,yDAgDC;IAED,yCAGC;IAED,mCAQC;IAED,6CAGC;IAED,2CAMC;IAED,+CAGC;IAED,+CAMC;IAED,wCAEC;IAED,6BASC;IAED,0DAUC;CACF;AAv4CD;IASE,gFAKC;IAbD,kBAAa;IACb,cAAS;IACT,gBAAW;IACX,YAAO;IACP,gBAAW;IACX,YAAO;IACP,gBAAW;IAGT,gBAA4B;IAC5B,cAAwB;IACxB,eAA0B;IAC1B,mBAAkC;CAErC"}
1
+ {"version":3,"file":"midy-GM2.d.ts","sourceRoot":"","sources":["../src/midy-GM2.js"],"names":[],"mappings":"AAuBA;IAwBE;;;;;;;;;;;;;;;;;MAiBE;IAEF;;;;;;;;;;;MAWE;IAEF;;;;;;;MAOE;IAEF,+BAMC;IAtED,qBAAmB;IACnB,kBAAc;IACd,qBAAmB;IACnB,yBAAqB;IACrB,2BAAuB;IACvB,cAAa;IACb,cAAa;IACb,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;IA4ChB,kBAAgC;IAChC,gBAA4C;IAE5C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAAiD;IAInD,4BAMC;IAED,mCASC;IAED,gDAMC;IAED,sCASC;IAED;;;;;;;;;;;;;;MAqBC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAcC;IAED,+DAyBC;IAED,mEAWC;IAED,qDAOC;IAED,2EAkDC;IAED,mCAOC;IAED,0BA+CC;IAED,uDAEC;IAED,wDAEC;IAED;;;MAgGC;IAED,4BAsBC;IAED,uBAKC;IAED,aAGC;IAED,cAKC;IAED,wBAIC;IAED,0BAKC;IAED,wBAOC;IAED,sBAGC;IAED,uDASC;IAED,6CAQC;IAED;;;;MAoCC;IAED;;;;;MAqCC;IAED,sDA6BC;IAED,2BAEC;IAED,4BAEC;IAED,sCAKC;IAED,mFAGC;IAED,iDAiBC;IAED,iDAiCC;IAED,0DAmBC;IAED,wHAiCC;IAED,gDAQC;IAED,kGAgCC;IAED,0EAGC;IAED,sIAoDC;IAED,0FAGC;IAED,kEAeC;IAED,oEAYC;IAED,wFAmBC;IAED,4DAIC;IAED,+DAcC;IAED,qEAGC;IAED,uDAOC;IAED,mFAuDC;IAED,+CAEC;IAED,yDAiBC;IAED,iEAEC;IAED,iDAIC;IAED;;;MAMC;IAED,2CAIC;IAED,yDAIC;IAED,+CAEC;IAED,sCAUC;IAED,sDAMC;IAED,oDAEC;IAED,iDASC;IAED,iDAIC;IAED,wDAWC;IAED,uDAGC;IAED,kFAeC;IAED,2DAMC;IAED,gDAqBC;IAED,gDAEC;IAED,gDAEC;IAED,+DAIC;IAED,oDAUC;IAED,sDAKC;IAED,iEAOC;IAED,kDAKC;IAED,yDAGC;IAED,oDAKC;IAED,6DAGC;IAED,uCAoBC;IAED,8CAEC;IAED,uCAoBC;IAED,gBAEC;IAED,eAEC;IAED,eAEC;IAED,eAEC;IAED,4DAmBC;IAED,oBAQC;IAED,oBAQC;IAED,yDAgDC;IAED,yCAGC;IAED,mCAQC;IAED,6CAGC;IAED,2CAMC;IAED,+CAGC;IAED,+CAMC;IAED,wCAEC;IAED,6BASC;IAED,0DAUC;CACF;AA17CD;IASE,gFAKC;IAbD,kBAAa;IACb,cAAS;IACT,gBAAW;IACX,YAAO;IACP,gBAAW;IACX,YAAO;IACP,gBAAW;IAGT,gBAA4B;IAC5B,cAAwB;IACxB,eAA0B;IAC1B,mBAAkC;CAErC"}
package/esm/midy-GM2.js CHANGED
@@ -225,22 +225,23 @@ export class MidyGM2 {
225
225
  this.totalTime = this.calcTotalTime();
226
226
  }
227
227
  setChannelAudioNodes(audioContext) {
228
- const gainNode = new GainNode(audioContext, {
229
- gain: MidyGM2.channelSettings.volume,
230
- });
231
- const pannerNode = new StereoPannerNode(audioContext, {
232
- pan: MidyGM2.channelSettings.pan,
233
- });
228
+ const { gainLeft, gainRight } = this.panToGain(MidyGM2.channelSettings.pan);
229
+ const gainL = new GainNode(audioContext, { gain: gainLeft });
230
+ const gainR = new GainNode(audioContext, { gain: gainRight });
231
+ const merger = new ChannelMergerNode(audioContext, { numberOfInputs: 2 });
232
+ gainL.connect(merger, 0, 0);
233
+ gainR.connect(merger, 0, 1);
234
+ merger.connect(this.masterGain);
234
235
  const reverbEffect = this.createReverbEffect(audioContext);
235
236
  const chorusEffect = this.createChorusEffect(audioContext);
236
237
  chorusEffect.lfo.start();
237
- reverbEffect.dryGain.connect(pannerNode);
238
- reverbEffect.wetGain.connect(pannerNode);
239
- pannerNode.connect(gainNode);
240
- gainNode.connect(this.masterGain);
238
+ reverbEffect.dryGain.connect(gainL);
239
+ reverbEffect.dryGain.connect(gainR);
240
+ reverbEffect.wetGain.connect(gainL);
241
+ reverbEffect.wetGain.connect(gainR);
241
242
  return {
242
- gainNode,
243
- pannerNode,
243
+ gainL,
244
+ gainR,
244
245
  reverbEffect,
245
246
  chorusEffect,
246
247
  };
@@ -644,14 +645,16 @@ export class MidyGM2 {
644
645
  connectNoteEffects(channel, gainNode) {
645
646
  if (channel.reverb === 0) {
646
647
  if (channel.chorus === 0) { // no effect
647
- gainNode.connect(channel.pannerNode);
648
+ gainNode.connect(channel.gainL);
649
+ gainNode.connect(channel.gainR);
648
650
  }
649
651
  else { // chorus
650
652
  channel.chorusEffect.delayNodes.forEach((delayNode) => {
651
653
  gainNode.connect(delayNode);
652
654
  });
653
655
  channel.chorusEffect.chorusGains.forEach((chorusGain) => {
654
- chorusGain.connect(channel.pannerNode);
656
+ chorusGain.connect(channel.gainL);
657
+ chorusGain.connect(channel.gainR);
655
658
  });
656
659
  }
657
660
  }
@@ -932,20 +935,12 @@ export class MidyGM2 {
932
935
  this.setPitchBend(channelNumber, pitchBend);
933
936
  }
934
937
  setPitchBend(channelNumber, pitchBend) {
935
- const now = this.audioContext.currentTime;
936
938
  const channel = this.channels[channelNumber];
937
939
  const prevPitchBend = channel.pitchBend;
938
940
  channel.pitchBend = (pitchBend - 8192) / 8192;
939
941
  const detuneChange = (channel.pitchBend - prevPitchBend) *
940
942
  channel.pitchBendRange * 100;
941
- const activeNotes = this.getActiveNotes(channel, now);
942
- activeNotes.forEach((activeNote) => {
943
- const { bufferSource } = activeNote;
944
- const detune = bufferSource.detune.value + detuneChange;
945
- bufferSource.detune
946
- .cancelScheduledValues(now)
947
- .setValueAtTime(detune, now);
948
- });
943
+ this.updateDetune(channel, detuneChange);
949
944
  }
950
945
  handleControlChange(channelNumber, controller, value) {
951
946
  switch (controller) {
@@ -980,9 +975,9 @@ export class MidyGM2 {
980
975
  case 93:
981
976
  return this.setChorus(channelNumber, value);
982
977
  case 100:
983
- return this.setRPNMSB(channelNumber, value);
984
- case 101:
985
978
  return this.setRPNLSB(channelNumber, value);
979
+ case 101:
980
+ return this.setRPNMSB(channelNumber, value);
986
981
  case 120:
987
982
  return this.allSoundOff(channelNumber);
988
983
  case 121:
@@ -1101,44 +1096,65 @@ export class MidyGM2 {
1101
1096
  const channel = this.channels[channelNumber];
1102
1097
  channel.softPedal = softPedal / 127;
1103
1098
  }
1104
- setRPNMSB(channelNumber, value) {
1105
- this.channels[channelNumber].rpnMSB = value;
1099
+ limitData(channel, minMSB, maxMSB, minLSB, maxLSB) {
1100
+ if (maxLSB < channel.dataLSB) {
1101
+ channel.dataMSB++;
1102
+ channel.dataLSB = minLSB;
1103
+ }
1104
+ else if (channel.dataLSB < 0) {
1105
+ channel.dataMSB--;
1106
+ channel.dataLSB = maxLSB;
1107
+ }
1108
+ if (maxMSB < channel.dataMSB) {
1109
+ channel.dataMSB = maxMSB;
1110
+ channel.dataLSB = maxLSB;
1111
+ }
1112
+ else if (channel.dataMSB < 0) {
1113
+ channel.dataMSB = minMSB;
1114
+ channel.dataLSB = minLSB;
1115
+ }
1106
1116
  }
1107
- setRPNLSB(channelNumber, value) {
1108
- this.channels[channelNumber].rpnLSB = value;
1117
+ limitDataMSB(channel, minMSB, maxMSB) {
1118
+ if (maxMSB < channel.dataMSB) {
1119
+ channel.dataMSB = maxMSB;
1120
+ }
1121
+ else if (channel.dataMSB < 0) {
1122
+ channel.dataMSB = minMSB;
1123
+ }
1109
1124
  }
1110
- setDataEntry(channelNumber, value, isMSB) {
1125
+ handleRPN(channelNumber, value) {
1111
1126
  const channel = this.channels[channelNumber];
1112
1127
  const rpn = channel.rpnMSB * 128 + channel.rpnLSB;
1113
- isMSB ? channel.dataMSB = value : channel.dataLSB = value;
1114
- const { dataMSB, dataLSB } = channel;
1115
1128
  switch (rpn) {
1116
1129
  case 0:
1117
- return this.handlePitchBendRangeMessage(channelNumber, dataMSB, dataLSB);
1130
+ channel.dataLSB += value;
1131
+ this.handlePitchBendRangeMessage(channelNumber);
1132
+ break;
1118
1133
  case 1:
1119
- channel.fineTuning = (dataMSB * 128 + dataLSB - 8192) / 8192;
1134
+ channel.dataLSB += value;
1135
+ this.handleFineTuningMessage(channelNumber);
1120
1136
  break;
1121
1137
  case 2:
1122
- channel.coarseTuning = dataMSB - 64;
1123
- break;
1124
- case 5:
1125
- channel.modulationDepthRange = dataMSB + dataLSB / 128;
1138
+ channel.dataMSB += value;
1139
+ this.handleCoarseTuningMessage(channelNumber);
1126
1140
  break;
1127
1141
  default:
1128
1142
  console.warn(`Channel ${channelNumber}: Unsupported RPN MSB=${channel.rpnMSB} LSB=${channel.rpnLSB}`);
1129
1143
  }
1130
1144
  }
1131
- handlePitchBendRangeMessage(channelNumber, dataMSB, dataLSB) {
1132
- const pitchBendRange = dataMSB + dataLSB / 100;
1133
- this.setPitchBendRange(channelNumber, pitchBendRange);
1145
+ setRPNMSB(channelNumber, value) {
1146
+ this.channels[channelNumber].rpnMSB = value;
1134
1147
  }
1135
- setPitchBendRange(channelNumber, pitchBendRange) {
1136
- const now = this.audioContext.currentTime;
1148
+ setRPNLSB(channelNumber, value) {
1149
+ this.channels[channelNumber].rpnLSB = value;
1150
+ }
1151
+ setDataEntry(channelNumber, value, isMSB) {
1137
1152
  const channel = this.channels[channelNumber];
1138
- const prevPitchBendRange = channel.pitchBendRange;
1139
- channel.pitchBendRange = pitchBendRange;
1140
- const detuneChange = (channel.pitchBendRange - prevPitchBendRange) *
1141
- channel.pitchBend * 100;
1153
+ isMSB ? channel.dataMSB = value : channel.dataLSB = value;
1154
+ this.handleRPN(channelNumber);
1155
+ }
1156
+ updateDetune(channel, detuneChange) {
1157
+ const now = this.audioContext.currentTime;
1142
1158
  const activeNotes = this.getActiveNotes(channel, now);
1143
1159
  activeNotes.forEach((activeNote) => {
1144
1160
  const { bufferSource } = activeNote;
@@ -1148,6 +1164,40 @@ export class MidyGM2 {
1148
1164
  .setValueAtTime(detune, now);
1149
1165
  });
1150
1166
  }
1167
+ handlePitchBendRangeMessage(channelNumber) {
1168
+ const channel = this.channels[channelNumber];
1169
+ this.limitData(channel, 0, 127, 0, 99);
1170
+ const pitchBendRange = channel.dataMSB + channel.dataLSB / 100;
1171
+ this.setPitchBendRange(channelNumber, pitchBendRange);
1172
+ }
1173
+ setPitchBendRange(channelNumber, pitchBendRange) {
1174
+ const channel = this.channels[channelNumber];
1175
+ const prevPitchBendRange = channel.pitchBendRange;
1176
+ channel.pitchBendRange = pitchBendRange;
1177
+ const detuneChange = (channel.pitchBendRange - prevPitchBendRange) *
1178
+ channel.pitchBend * 100;
1179
+ this.updateDetune(channel, detuneChange);
1180
+ }
1181
+ handleFineTuningMessage(channelNumber) {
1182
+ const channel = this.channels[channelNumber];
1183
+ this.limitData(channel, 0, 127, 0, 127);
1184
+ const fineTuning = (channel.dataMSB * 128 + channel.dataLSB - 8192) / 8192;
1185
+ this.setFineTuning(channelNumber, fineTuning);
1186
+ }
1187
+ setFineTuning(channelNumber, fineTuning) {
1188
+ const channel = this.channels[channelNumber];
1189
+ channel.fineTuning = fineTuning;
1190
+ }
1191
+ handleCoarseTuningMessage(channelNumber) {
1192
+ const channel = this.channels[channelNumber];
1193
+ this.limitDataMSB(channel, 0, 127);
1194
+ const coarseTuning = channel.dataMSB - 64;
1195
+ this.setFineTuning(channelNumber, coarseTuning);
1196
+ }
1197
+ setCoarseTuning(channelNumber, coarseTuning) {
1198
+ const channel = this.channels[channelNumber];
1199
+ channel.fineTuning = coarseTuning;
1200
+ }
1151
1201
  allSoundOff(channelNumber) {
1152
1202
  const now = this.audioContext.currentTime;
1153
1203
  const channel = this.channels[channelNumber];
@@ -134,10 +134,12 @@ export class MidyGMLite {
134
134
  setExpression(channelNumber: any, expression: any): void;
135
135
  updateChannelGain(channel: any): void;
136
136
  setSustainPedal(channelNumber: any, value: any): void;
137
+ handleRPN(channelNumber: any): void;
137
138
  setRPNMSB(channelNumber: any, value: any): void;
138
139
  setRPNLSB(channelNumber: any, value: any): void;
139
140
  setDataEntry(channelNumber: any, value: any, isMSB: any): void;
140
- handlePitchBendRangeMessage(channelNumber: any, dataMSB: any, dataLSB: any): void;
141
+ updateDetune(channel: any, detuneChange: any): void;
142
+ handlePitchBendRangeMessage(channelNumber: any): void;
141
143
  setPitchBendRange(channelNumber: any, pitchBendRange: any): void;
142
144
  allSoundOff(channelNumber: any): any[];
143
145
  resetAllControllers(channelNumber: any): void;
@@ -1 +1 @@
1
- {"version":3,"file":"midy-GMLite.d.ts","sourceRoot":"","sources":["../src/midy-GMLite.js"],"names":[],"mappings":"AAqBA;IAmBE;;;;;;;;;MASE;IAEF;;;;;;;MAOE;IAEF,+BAMC;IA5CD,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;IAuBhB,kBAAgC;IAChC,gBAA4C;IAE5C;;;;;;;;;;;;;;;;;;QAAiD;IAInD,4BAMC;IAED,mCASC;IAED,gDAMC;IAED,sCASC;IAED;;;MAcC;IAED;;;;;;;;;;;;;;;;;;QAUC;IAED,+DAyBC;IAED,mEAWC;IAED,qDAOC;IAED,2EA+CC;IAED,mCAOC;IAED,0BA+CC;IAED,uDAEC;IAED,wDAEC;IAED;;;MA8DC;IAED,4BAsBC;IAED,uBAKC;IAED,aAGC;IAED,cAKC;IAED,wBAIC;IAED,0BAKC;IAED,wBAOC;IAED,sBAGC;IAED,uDASC;IAED,6CAQC;IAED,sDAEC;IAED,2BAEC;IAED,4BAEC;IAED,yCAEC;IAED,mFAGC;IAED,iDAiBC;IAED,iDAiCC;IAED,0DAmBC;IAED,wHA6BC;IAED,kGA6BC;IAED,0EAGC;IAED,sIAmDC;IAED,0FAGC;IAED,kEAeC;IAED,wFAiBC;IAED,4DAGC;IAED,qEAGC;IAED,uDAeC;IAED,mFA+BC;IAED,yDAiBC;IAED,iDAIC;IAED;;;MAMC;IAED,2CAIC;IAED,yDAIC;IAED,sCAUC;IAED,sDAMC;IAED,gDAEC;IAED,gDAEC;IAED,+DAiBC;IAED,kFAGC;IAED,iEAeC;IAED,uCAoBC;IAED,8CAEC;IAED,uCAoBC;IAED,4DAgBC;IAED,oBAQC;IAED,yDAaC;IAED,yCAGC;IAED,mCAQC;IAED,wCAEC;IAED,6BASC;IAED,0DAUC;CACF;AAl/BD;IAOE,gFAKC;IAXD,kBAAa;IACb,cAAS;IACT,gBAAW;IACX,YAAO;IACP,gBAAW;IAGT,gBAA4B;IAC5B,cAAwB;IACxB,eAA0B;IAC1B,mBAAkC;CAErC"}
1
+ {"version":3,"file":"midy-GMLite.d.ts","sourceRoot":"","sources":["../src/midy-GMLite.js"],"names":[],"mappings":"AAqBA;IAmBE;;;;;;;;;MASE;IAEF;;;;;;;MAOE;IAEF,+BAMC;IA5CD,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;IAuBhB,kBAAgC;IAChC,gBAA4C;IAE5C;;;;;;;;;;;;;;;;;;QAAiD;IAInD,4BAMC;IAED,mCASC;IAED,gDAMC;IAED,sCASC;IAED;;;MAcC;IAED;;;;;;;;;;;;;;;;;;QAUC;IAED,+DAyBC;IAED,mEAWC;IAED,qDAOC;IAED,2EA+CC;IAED,mCAOC;IAED,0BA+CC;IAED,uDAEC;IAED,wDAEC;IAED;;;MA8DC;IAED,4BAsBC;IAED,uBAKC;IAED,aAGC;IAED,cAKC;IAED,wBAIC;IAED,0BAKC;IAED,wBAOC;IAED,sBAGC;IAED,uDASC;IAED,6CAQC;IAED,sDAGC;IAED,2BAEC;IAED,4BAEC;IAED,yCAEC;IAED,mFAGC;IAED,iDAiBC;IAED,iDAiCC;IAED,0DAmBC;IAED,wHA6BC;IAED,kGA6BC;IAED,0EAGC;IAED,sIAmDC;IAED,0FAGC;IAED,kEAeC;IAED,wFAiBC;IAED,4DAGC;IAED,qEAGC;IAED,uDAOC;IAED,mFA+BC;IAED,yDAiBC;IAED,iDAIC;IAED;;;MAMC;IAED,2CAIC;IAED,yDAIC;IAED,sCAUC;IAED,sDAMC;IAED,oCAYC;IAED,gDAEC;IAED,gDAEC;IAED,+DAIC;IAED,oDAUC;IAED,sDAKC;IAED,iEAOC;IAED,uCAoBC;IAED,8CAEC;IAED,uCAoBC;IAED,4DAgBC;IAED,oBAQC;IAED,yDAaC;IAED,yCAGC;IAED,mCAQC;IAED,wCAEC;IAED,6BASC;IAED,0DAUC;CACF;AAl/BD;IAOE,gFAKC;IAXD,kBAAa;IACb,cAAS;IACT,gBAAW;IACX,YAAO;IACP,gBAAW;IAGT,gBAA4B;IAC5B,cAAwB;IACxB,eAA0B;IAC1B,mBAAkC;CAErC"}
@@ -492,7 +492,8 @@ export class MidyGMLite {
492
492
  return noteList[0];
493
493
  }
494
494
  connectNoteEffects(channel, gainNode) {
495
- gainNode.connect(channel.pannerNode);
495
+ gainNode.connect(channel.gainL);
496
+ gainNode.connect(channel.gainR);
496
497
  }
497
498
  cbToRatio(cb) {
498
499
  return Math.pow(10, cb / 200);
@@ -702,20 +703,12 @@ export class MidyGMLite {
702
703
  this.setPitchBend(channelNumber, pitchBend);
703
704
  }
704
705
  setPitchBend(channelNumber, pitchBend) {
705
- const now = this.audioContext.currentTime;
706
706
  const channel = this.channels[channelNumber];
707
707
  const prevPitchBend = channel.pitchBend;
708
708
  channel.pitchBend = (pitchBend - 8192) / 8192;
709
709
  const detuneChange = (channel.pitchBend - prevPitchBend) *
710
710
  channel.pitchBendRange * 100;
711
- const activeNotes = this.getActiveNotes(channel, now);
712
- activeNotes.forEach((activeNote) => {
713
- const { bufferSource } = activeNote;
714
- const detune = bufferSource.detune.value + detuneChange;
715
- bufferSource.detune
716
- .cancelScheduledValues(now)
717
- .setValueAtTime(detune, now);
718
- });
711
+ this.updateDetune(channel, detuneChange);
719
712
  }
720
713
  handleControlChange(channelNumber, controller, value) {
721
714
  switch (controller) {
@@ -734,9 +727,9 @@ export class MidyGMLite {
734
727
  case 64:
735
728
  return this.setSustainPedal(channelNumber, value);
736
729
  case 100:
737
- return this.setRPNMSB(channelNumber, value);
738
- case 101:
739
730
  return this.setRPNLSB(channelNumber, value);
731
+ case 101:
732
+ return this.setRPNMSB(channelNumber, value);
740
733
  case 120:
741
734
  return this.allSoundOff(channelNumber);
742
735
  case 121:
@@ -803,6 +796,17 @@ export class MidyGMLite {
803
796
  this.releaseSustainPedal(channelNumber, value);
804
797
  }
805
798
  }
799
+ handleRPN(channelNumber) {
800
+ const channel = this.channels[channelNumber];
801
+ const rpn = channel.rpnMSB * 128 + channel.rpnLSB;
802
+ switch (rpn) {
803
+ case 0:
804
+ this.handlePitchBendRangeMessage(channelNumber);
805
+ break;
806
+ default:
807
+ console.warn(`Channel ${channelNumber}: Unsupported RPN MSB=${channel.rpnMSB} LSB=${channel.rpnLSB}`);
808
+ }
809
+ }
806
810
  setRPNMSB(channelNumber, value) {
807
811
  this.channels[channelNumber].rpnMSB = value;
808
812
  }
@@ -811,27 +815,11 @@ export class MidyGMLite {
811
815
  }
812
816
  setDataEntry(channelNumber, value, isMSB) {
813
817
  const channel = this.channels[channelNumber];
814
- const rpn = channel.rpnMSB * 128 + channel.rpnLSB;
815
818
  isMSB ? channel.dataMSB = value : channel.dataLSB = value;
816
- const { dataMSB, dataLSB } = channel;
817
- switch (rpn) {
818
- case 0:
819
- return this.handlePitchBendRangeMessage(channelNumber, dataMSB, dataLSB);
820
- default:
821
- console.warn(`Channel ${channelNumber}: Unsupported RPN MSB=${channel.rpnMSB} LSB=${channel.rpnLSB}`);
822
- }
823
- }
824
- handlePitchBendRangeMessage(channelNumber, dataMSB, dataLSB) {
825
- const pitchBendRange = dataMSB + dataLSB / 100;
826
- this.setPitchBendRange(channelNumber, pitchBendRange);
819
+ this.handleRPN(channelNumber);
827
820
  }
828
- setPitchBendRange(channelNumber, pitchBendRange) {
821
+ updateDetune(channel, detuneChange) {
829
822
  const now = this.audioContext.currentTime;
830
- const channel = this.channels[channelNumber];
831
- const prevPitchBendRange = channel.pitchBendRange;
832
- channel.pitchBendRange = pitchBendRange;
833
- const detuneChange = (channel.pitchBendRange - prevPitchBendRange) *
834
- channel.pitchBend * 100;
835
823
  const activeNotes = this.getActiveNotes(channel, now);
836
824
  activeNotes.forEach((activeNote) => {
837
825
  const { bufferSource } = activeNote;
@@ -841,6 +829,20 @@ export class MidyGMLite {
841
829
  .setValueAtTime(detune, now);
842
830
  });
843
831
  }
832
+ handlePitchBendRangeMessage(channelNumber) {
833
+ const channel = this.channels[channelNumber];
834
+ this.limitData(channel, 0, 127, 0, 99);
835
+ const pitchBendRange = channel.dataMSB + channel.dataLSB / 100;
836
+ this.setPitchBendRange(channelNumber, pitchBendRange);
837
+ }
838
+ setPitchBendRange(channelNumber, pitchBendRange) {
839
+ const channel = this.channels[channelNumber];
840
+ const prevPitchBendRange = channel.pitchBendRange;
841
+ channel.pitchBendRange = pitchBendRange;
842
+ const detuneChange = (channel.pitchBendRange - prevPitchBendRange) *
843
+ channel.pitchBend * 100;
844
+ this.updateDetune(channel, detuneChange);
845
+ }
844
846
  allSoundOff(channelNumber) {
845
847
  const now = this.audioContext.currentTime;
846
848
  const channel = this.channels[channelNumber];
package/esm/midy.d.ts CHANGED
@@ -284,13 +284,21 @@ export class Midy {
284
284
  setVibratoRate(channelNumber: any, vibratoRate: any): void;
285
285
  setVibratoDepth(channelNumber: any, vibratoDepth: any): void;
286
286
  setVibratoDelay(channelNumber: any, vibratoDelay: any): void;
287
+ limitData(channel: any, minMSB: any, maxMSB: any, minLSB: any, maxLSB: any): void;
288
+ limitDataMSB(channel: any, minMSB: any, maxMSB: any): void;
289
+ handleRPN(channelNumber: any, value: any): void;
287
290
  incrementRPNValue(channelNumber: any): void;
288
291
  decrementRPNValue(channelNumber: any): void;
289
292
  setRPNMSB(channelNumber: any, value: any): void;
290
293
  setRPNLSB(channelNumber: any, value: any): void;
291
294
  setDataEntry(channelNumber: any, value: any, isMSB: any): void;
292
- handlePitchBendRangeMessage(channelNumber: any, dataMSB: any, dataLSB: any): void;
295
+ updateDetune(channel: any, detuneChange: any): void;
296
+ handlePitchBendRangeMessage(channelNumber: any): void;
293
297
  setPitchBendRange(channelNumber: any, pitchBendRange: any): void;
298
+ handleFineTuningMessage(channelNumber: any): void;
299
+ setFineTuning(channelNumber: any, fineTuning: any): void;
300
+ handleCoarseTuningMessage(channelNumber: any): void;
301
+ setCoarseTuning(channelNumber: any, coarseTuning: any): void;
294
302
  allSoundOff(channelNumber: any): any[];
295
303
  resetAllControllers(channelNumber: any): void;
296
304
  allNotesOff(channelNumber: any): any[];
package/esm/midy.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"midy.d.ts","sourceRoot":"","sources":["../src/midy.js"],"names":[],"mappings":"AAuBA;IAwBE;;;;;;;;;;;;;;;;;;;;MAoBE;IAEF;;;;;;;;;;;MAWE;IAEF;;;;;;;MAOE;IAEF,+BAMC;IAzED,qBAAmB;IACnB,kBAAc;IACd,qBAAmB;IACnB,yBAAqB;IACrB,2BAAuB;IACvB,cAAa;IACb,cAAa;IACb,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;IA+ChB,kBAAgC;IAChC,gBAA4C;IAE5C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAAiD;IAInD,4BAMC;IAED,mCASC;IAED,gDAMC;IAED,sCASC;IAED;;;;;;;;;;;;;;MAqBC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAiBC;IAED,+DAyBC;IAED,mEAWC;IAED,qDAOC;IAED,2EAyDC;IAED,mCAOC;IAED,0BA+CC;IAED,uDAEC;IAED,wDAEC;IAED;;;MAgGC;IAED,4BAsBC;IAED,uBAKC;IAED,aAGC;IAED,cAKC;IAED,wBAIC;IAED,0BAKC;IAED,wBAOC;IAED,sBAGC;IAED,uDASC;IAED,6CAQC;IAED;;;;MAoCC;IAED;;;;;MAqCC;IAED,sDA2BC;IAED,2BAEC;IAED,4BAEC;IAED,sCAKC;IAED,mFAGC;IAED,iDAiBC;IAED,iDAiCC;IAED,0DAmBC;IAED,uDAcC;IAED,wHAqCC;IAED,gDAQC;IAED,kGAgCC;IAED,0EAGC;IAED,sIAwDC;IAED,0FAGC;IAED,kEAeC;IAED,oEAYC;IAED,gEAqBC;IAED,sFAcC;IAED,4DAIC;IAED,+DAcC;IAED,qEAGC;IAED,uDAeC;IAED,0EAkEC;IAED,+CAEC;IAED,yDAiBC;IAED,iEAEC;IAED,iDAIC;IAED;;;MAMC;IAED,2CAIC;IAED,yDAIC;IAED,+CAEC;IAED,sCAUC;IAED,sDAMC;IAED,oDAEC;IAED,iDASC;IAED,iDAIC;IAED,wDAWC;IAED,uDAGC;IAED,2DAGC;IAED,6DAGC;IAED,6DASC;IAED,4CAkBC;IAED,4CAkBC;IAED,gDAEC;IAED,gDAEC;IAGD,+DA0BC;IAED,kFAGC;IAED,iEAeC;IAED,uCAoBC;IAED,8CAEC;IAED,uCAoBC;IAED,gBAEC;IAED,eAEC;IAED,eAEC;IAED,eAEC;IAED,4DAmBC;IAED,oBAQC;IAED,oBAQC;IAED,yDAgDC;IAED,yCAGC;IAED,mCAQC;IAED,6CAGC;IAED,2CAMC;IAED,+CAGC;IAED,+CAMC;IAED,wCAEC;IAED,6BASC;IAED,0DAUC;CACF;AAxgDD;IASE,gFAKC;IAbD,kBAAa;IACb,cAAS;IACT,gBAAW;IACX,YAAO;IACP,gBAAW;IACX,YAAO;IACP,gBAAW;IAGT,gBAA4B;IAC5B,cAAwB;IACxB,eAA0B;IAC1B,mBAAkC;CAErC"}
1
+ {"version":3,"file":"midy.d.ts","sourceRoot":"","sources":["../src/midy.js"],"names":[],"mappings":"AAuBA;IAwBE;;;;;;;;;;;;;;;;;;;;MAoBE;IAEF;;;;;;;;;;;MAWE;IAEF;;;;;;;MAOE;IAEF,+BAMC;IAzED,qBAAmB;IACnB,kBAAc;IACd,qBAAmB;IACnB,yBAAqB;IACrB,2BAAuB;IACvB,cAAa;IACb,cAAa;IACb,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;IA+ChB,kBAAgC;IAChC,gBAA4C;IAE5C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAAiD;IAInD,4BAMC;IAED,mCASC;IAED,gDAMC;IAED,sCASC;IAED;;;;;;;;;;;;;;MAqBC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAiBC;IAED,+DAyBC;IAED,mEAWC;IAED,qDAOC;IAED,2EAyDC;IAED,mCAOC;IAED,0BA+CC;IAED,uDAEC;IAED,wDAEC;IAED;;;MAgGC;IAED,4BAsBC;IAED,uBAKC;IAED,aAGC;IAED,cAKC;IAED,wBAIC;IAED,0BAKC;IAED,wBAOC;IAED,sBAGC;IAED,uDASC;IAED,6CAQC;IAED;;;;MAoCC;IAED;;;;;MAqCC;IAED,sDA6BC;IAED,2BAEC;IAED,4BAEC;IAED,sCAKC;IAED,mFAGC;IAED,iDAiBC;IAED,iDAiCC;IAED,0DAmBC;IAED,uDAcC;IAED,wHAqCC;IAED,gDAQC;IAED,kGAgCC;IAED,0EAGC;IAED,sIAwDC;IAED,0FAGC;IAED,kEAeC;IAED,oEAYC;IAED,gEAqBC;IAED,sFAcC;IAED,4DAIC;IAED,+DAcC;IAED,qEAGC;IAED,uDAOC;IAED,0EAkEC;IAED,+CAEC;IAED,yDAiBC;IAED,iEAEC;IAED,iDAIC;IAED;;;MAMC;IAED,2CAIC;IAED,yDAIC;IAED,+CAEC;IAED,sCAUC;IAED,sDAMC;IAED,oDAEC;IAED,iDASC;IAED,iDAIC;IAED,wDAWC;IAED,uDAGC;IAED,2DAGC;IAED,6DAGC;IAED,6DASC;IAED,kFAeC;IAED,2DAMC;IAGD,gDAqBC;IAED,4CAEC;IAED,4CAEC;IAED,gDAEC;IAED,gDAEC;IAED,+DAIC;IAED,oDAUC;IAED,sDAKC;IAED,iEAOC;IAED,kDAKC;IAED,yDAGC;IAED,oDAKC;IAED,6DAGC;IAED,uCAoBC;IAED,8CAEC;IAED,uCAoBC;IAED,gBAEC;IAED,eAEC;IAED,eAEC;IAED,eAEC;IAED,4DAmBC;IAED,oBAQC;IAED,oBAQC;IAED,yDAgDC;IAED,yCAGC;IAED,mCAQC;IAED,6CAGC;IAED,2CAMC;IAED,+CAGC;IAED,+CAMC;IAED,wCAEC;IAED,6BASC;IAED,0DAUC;CACF;AA1hDD;IASE,gFAKC;IAbD,kBAAa;IACb,cAAS;IACT,gBAAW;IACX,YAAO;IACP,gBAAW;IACX,YAAO;IACP,gBAAW;IAGT,gBAA4B;IAC5B,cAAwB;IACxB,eAA0B;IAC1B,mBAAkC;CAErC"}