@marmooo/midy 0.0.7 → 0.0.8

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
@@ -130,6 +130,7 @@ export class MidyGM1 {
130
130
  handlePitchBendMessage(channelNumber: any, lsb: any, msb: any): void;
131
131
  setPitchBend(channelNumber: any, pitchBend: any): void;
132
132
  handleControlChange(channelNumber: any, controller: any, value: any): void | any[];
133
+ updateModulation(channel: any): void;
133
134
  setModulation(channelNumber: any, modulation: any): void;
134
135
  setVolume(channelNumber: any, volume: any): void;
135
136
  panToGain(pan: any): {
@@ -138,6 +139,7 @@ export class MidyGM1 {
138
139
  };
139
140
  setPan(channelNumber: any, pan: any): void;
140
141
  setExpression(channelNumber: any, expression: any): void;
142
+ dataEntryLSB(channelNumber: any, value: any): void;
141
143
  updateChannelGain(channel: any): void;
142
144
  setSustainPedal(channelNumber: any, value: any): void;
143
145
  limitData(channel: any, minMSB: any, maxMSB: any, minLSB: any, maxLSB: any): void;
@@ -145,13 +147,13 @@ export class MidyGM1 {
145
147
  handleRPN(channelNumber: any): void;
146
148
  setRPNMSB(channelNumber: any, value: any): void;
147
149
  setRPNLSB(channelNumber: any, value: any): void;
148
- setDataEntry(channelNumber: any, value: any, isMSB: any): void;
150
+ dataEntryMSB(channelNumber: any, value: any): void;
149
151
  updateDetune(channel: any, detuneChange: any): void;
150
- handlePitchBendRangeMessage(channelNumber: any): void;
152
+ handlePitchBendRangeRPN(channelNumber: any): void;
151
153
  setPitchBendRange(channelNumber: any, pitchBendRange: any): void;
152
- handleFineTuningMessage(channelNumber: any): void;
154
+ handleFineTuningRPN(channelNumber: any): void;
153
155
  setFineTuning(channelNumber: any, fineTuning: any): void;
154
- handleCoarseTuningMessage(channelNumber: any): void;
156
+ handleCoarseTuningRPN(channelNumber: any): void;
155
157
  setCoarseTuning(channelNumber: any, coarseTuning: any): void;
156
158
  allSoundOff(channelNumber: any): any[];
157
159
  resetAllControllers(channelNumber: any): void;
@@ -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,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"}
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,qCAcC;IAED,yDAIC;IACD,iDAIC;IAED;;;MAMC;IAED,2CAIC;IAED,yDAIC;IAED,mDAGC;IAED,sCAUC;IAED,sDAMC;IAED,kFAeC;IAED,2DAMC;IAED,oCAkBC;IAED,gDAEC;IAED,gDAEC;IAED,mDAGC;IAED,oDAUC;IAED,kDAKC;IAED,iEAOC;IAED,8CAKC;IAED,yDAMC;IAED,gDAKC;IAED,6DAMC;IAED,uCAoBC;IAED,8CAEC;IAED,uCAoBC;IAED,4DAgBC;IAED,oBAQC;IAED,yDAaC;IAED,yCAGC;IAED,mCAQC;IAED,wCAEC;IAED,6BASC;IAED,0DAUC;CACF;AAtjCD;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
@@ -716,7 +716,7 @@ export class MidyGM1 {
716
716
  case 1:
717
717
  return this.setModulation(channelNumber, value);
718
718
  case 6:
719
- return this.setDataEntry(channelNumber, value, true);
719
+ return this.dataEntryMSB(channelNumber, value);
720
720
  case 7:
721
721
  return this.setVolume(channelNumber, value);
722
722
  case 10:
@@ -724,7 +724,7 @@ export class MidyGM1 {
724
724
  case 11:
725
725
  return this.setExpression(channelNumber, value);
726
726
  case 38:
727
- return this.setDataEntry(channelNumber, value, false);
727
+ return this.dataEntryLSB(channelNumber, value);
728
728
  case 64:
729
729
  return this.setSustainPedal(channelNumber, value);
730
730
  case 100:
@@ -741,22 +741,24 @@ export class MidyGM1 {
741
741
  console.warn(`Unsupported Control change: controller=${controller} value=${value}`);
742
742
  }
743
743
  }
744
- setModulation(channelNumber, modulation) {
744
+ updateModulation(channel) {
745
745
  const now = this.audioContext.currentTime;
746
- const channel = this.channels[channelNumber];
747
- channel.modulation = (modulation / 127) *
748
- (channel.modulationDepthRange * 100);
749
746
  const activeNotes = this.getActiveNotes(channel, now);
750
747
  activeNotes.forEach((activeNote) => {
751
748
  if (activeNote.modLFO) {
752
- activeNote.gainNode.gain.setValueAtTime(this.cbToRatio(activeNote.instrumentKey.modLfoToVolume) *
753
- channel.modulation, now);
749
+ const { gainNode, instrumentKey } = activeNote;
750
+ gainNode.gain.setValueAtTime(this.cbToRatio(instrumentKey.modLfoToVolume + channel.modulation), now);
754
751
  }
755
752
  else {
756
753
  this.startModulation(channel, activeNote, now);
757
754
  }
758
755
  });
759
756
  }
757
+ setModulation(channelNumber, modulation) {
758
+ const channel = this.channels[channelNumber];
759
+ channel.modulation = (modulation / 127) * channel.modulationDepthRange;
760
+ this.updateModulation(channel);
761
+ }
760
762
  setVolume(channelNumber, volume) {
761
763
  const channel = this.channels[channelNumber];
762
764
  channel.volume = volume / 127;
@@ -779,6 +781,10 @@ export class MidyGM1 {
779
781
  channel.expression = expression / 127;
780
782
  this.updateChannelGain(channel);
781
783
  }
784
+ dataEntryLSB(channelNumber, value) {
785
+ this.channels[channelNumber].dataLSB = value;
786
+ this.handleRPN(channelNumber, 0);
787
+ }
782
788
  updateChannelGain(channel) {
783
789
  const now = this.audioContext.currentTime;
784
790
  const volume = channel.volume * channel.expression;
@@ -828,13 +834,13 @@ export class MidyGM1 {
828
834
  const rpn = channel.rpnMSB * 128 + channel.rpnLSB;
829
835
  switch (rpn) {
830
836
  case 0:
831
- this.handlePitchBendRangeMessage(channelNumber);
837
+ this.handlePitchBendRangeRPN(channelNumber);
832
838
  break;
833
839
  case 1:
834
- this.handleFineTuningMessage(channelNumber);
840
+ this.handleFineTuningRPN(channelNumber);
835
841
  break;
836
842
  case 2:
837
- this.handleCoarseTuningMessage(channelNumber);
843
+ this.handleCoarseTuningRPN(channelNumber);
838
844
  break;
839
845
  default:
840
846
  console.warn(`Channel ${channelNumber}: Unsupported RPN MSB=${channel.rpnMSB} LSB=${channel.rpnLSB}`);
@@ -846,9 +852,8 @@ export class MidyGM1 {
846
852
  setRPNLSB(channelNumber, value) {
847
853
  this.channels[channelNumber].rpnLSB = value;
848
854
  }
849
- setDataEntry(channelNumber, value, isMSB) {
850
- const channel = this.channels[channelNumber];
851
- isMSB ? channel.dataMSB = value : channel.dataLSB = value;
855
+ dataEntryMSB(channelNumber, value) {
856
+ this.channels[channelNumber].dataMSB = value;
852
857
  this.handleRPN(channelNumber);
853
858
  }
854
859
  updateDetune(channel, detuneChange) {
@@ -862,7 +867,7 @@ export class MidyGM1 {
862
867
  .setValueAtTime(detune, now);
863
868
  });
864
869
  }
865
- handlePitchBendRangeMessage(channelNumber) {
870
+ handlePitchBendRangeRPN(channelNumber) {
866
871
  const channel = this.channels[channelNumber];
867
872
  this.limitData(channel, 0, 127, 0, 99);
868
873
  const pitchBendRange = channel.dataMSB + channel.dataLSB / 100;
@@ -876,7 +881,7 @@ export class MidyGM1 {
876
881
  channel.pitchBend * 100;
877
882
  this.updateDetune(channel, detuneChange);
878
883
  }
879
- handleFineTuningMessage(channelNumber) {
884
+ handleFineTuningRPN(channelNumber) {
880
885
  const channel = this.channels[channelNumber];
881
886
  this.limitData(channel, 0, 127, 0, 127);
882
887
  const fineTuning = (channel.dataMSB * 128 + channel.dataLSB - 8192) / 8192;
@@ -884,9 +889,12 @@ export class MidyGM1 {
884
889
  }
885
890
  setFineTuning(channelNumber, fineTuning) {
886
891
  const channel = this.channels[channelNumber];
892
+ const prevFineTuning = channel.fineTuning;
887
893
  channel.fineTuning = fineTuning;
894
+ const detuneChange = channel.fineTuning - prevFineTuning;
895
+ this.updateDetune(channel, detuneChange);
888
896
  }
889
- handleCoarseTuningMessage(channelNumber) {
897
+ handleCoarseTuningRPN(channelNumber) {
890
898
  const channel = this.channels[channelNumber];
891
899
  this.limitDataMSB(channel, 0, 127);
892
900
  const coarseTuning = channel.dataMSB - 64;
@@ -894,7 +902,10 @@ export class MidyGM1 {
894
902
  }
895
903
  setCoarseTuning(channelNumber, coarseTuning) {
896
904
  const channel = this.channels[channelNumber];
897
- channel.fineTuning = coarseTuning;
905
+ const prevCoarseTuning = channel.coarseTuning;
906
+ channel.coarseTuning = coarseTuning;
907
+ const detuneChange = channel.coarseTuning - prevCoarseTuning;
908
+ this.updateDetune(channel, detuneChange);
898
909
  }
899
910
  allSoundOff(channelNumber) {
900
911
  const now = this.audioContext.currentTime;
@@ -1020,9 +1031,9 @@ Object.defineProperty(MidyGM1, "channelSettings", {
1020
1031
  dataLSB: 0,
1021
1032
  program: 0,
1022
1033
  pitchBend: 0,
1023
- fineTuning: 0,
1024
- coarseTuning: 0,
1025
- modulationDepthRange: 0.5,
1034
+ fineTuning: 0, // cb
1035
+ coarseTuning: 0, // cb
1036
+ modulationDepthRange: 0.5, // cb
1026
1037
  }
1027
1038
  });
1028
1039
  Object.defineProperty(MidyGM1, "effectSettings", {
package/esm/midy-GM2.d.ts CHANGED
@@ -237,6 +237,7 @@ export class MidyGM2 {
237
237
  setPitchBend(channelNumber: any, pitchBend: any): void;
238
238
  handleControlChange(channelNumber: any, controller: any, value: any): void | any[];
239
239
  setBankMSB(channelNumber: any, msb: any): void;
240
+ updateModulation(channel: any): void;
240
241
  setModulation(channelNumber: any, modulation: any): void;
241
242
  setPortamentoTime(channelNumber: any, portamentoTime: any): void;
242
243
  setVolume(channelNumber: any, volume: any): void;
@@ -247,26 +248,29 @@ export class MidyGM2 {
247
248
  setPan(channelNumber: any, pan: any): void;
248
249
  setExpression(channelNumber: any, expression: any): void;
249
250
  setBankLSB(channelNumber: any, lsb: any): void;
251
+ dataEntryLSB(channelNumber: any, value: any): void;
250
252
  updateChannelGain(channel: any): void;
251
253
  setSustainPedal(channelNumber: any, value: any): void;
252
254
  setPortamento(channelNumber: any, value: any): void;
253
- setReverb(channelNumber: any, reverb: any): void;
254
- setChorus(channelNumber: any, chorus: any): void;
255
+ setReverbSendLevel(channelNumber: any, reverb: any): void;
256
+ setChorusSendLevel(channelNumber: any, chorus: any): void;
255
257
  setSostenutoPedal(channelNumber: any, value: any): void;
256
258
  setSoftPedal(channelNumber: any, softPedal: any): void;
257
259
  limitData(channel: any, minMSB: any, maxMSB: any, minLSB: any, maxLSB: any): void;
258
260
  limitDataMSB(channel: any, minMSB: any, maxMSB: any): void;
259
- handleRPN(channelNumber: any, value: any): void;
261
+ handleRPN(channelNumber: any): void;
260
262
  setRPNMSB(channelNumber: any, value: any): void;
261
263
  setRPNLSB(channelNumber: any, value: any): void;
262
- setDataEntry(channelNumber: any, value: any, isMSB: any): void;
264
+ dataEntryMSB(channelNumber: any, value: any): void;
263
265
  updateDetune(channel: any, detuneChange: any): void;
264
- handlePitchBendRangeMessage(channelNumber: any): void;
266
+ handlePitchBendRangeRPN(channelNumber: any): void;
265
267
  setPitchBendRange(channelNumber: any, pitchBendRange: any): void;
266
- handleFineTuningMessage(channelNumber: any): void;
268
+ handleFineTuningRPN(channelNumber: any): void;
267
269
  setFineTuning(channelNumber: any, fineTuning: any): void;
268
- handleCoarseTuningMessage(channelNumber: any): void;
270
+ handleCoarseTuningRPN(channelNumber: any): void;
269
271
  setCoarseTuning(channelNumber: any, coarseTuning: any): void;
272
+ handleModulationDepthRangeRPN(channelNumber: any): void;
273
+ setModulationDepthRange(channelNumber: any, modulationDepthRange: any): void;
270
274
  allSoundOff(channelNumber: any): any[];
271
275
  resetAllControllers(channelNumber: any): void;
272
276
  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;;;;;;;;;;;;;;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"}
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,qCAcC;IAED,yDAIC;IAED,iEAEC;IAED,iDAIC;IAED;;;MAMC;IAED,2CAIC;IAED,yDAIC;IAED,+CAEC;IAED,mDAGC;IAED,sCAUC;IAED,sDAMC;IAED,oDAEC;IAED,0DASC;IAED,0DAIC;IAED,wDAWC;IAED,uDAGC;IAED,kFAeC;IAED,2DAMC;IAED,oCAqBC;IAED,gDAEC;IAED,gDAEC;IAED,mDAGC;IAED,oDAUC;IAED,kDAKC;IAED,iEAOC;IAED,8CAKC;IAED,yDAMC;IAED,gDAKC;IAED,6DAMC;IAED,wDAKC;IAED,6EAKC;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;AAr9CD;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
@@ -75,13 +75,13 @@ export class MidyGM2 {
75
75
  configurable: true,
76
76
  writable: true,
77
77
  value: 0
78
- });
78
+ }); // cb
79
79
  Object.defineProperty(this, "masterCoarseTuning", {
80
80
  enumerable: true,
81
81
  configurable: true,
82
82
  writable: true,
83
83
  value: 0
84
- });
84
+ }); // cb
85
85
  Object.defineProperty(this, "mono", {
86
86
  enumerable: true,
87
87
  configurable: true,
@@ -951,7 +951,7 @@ export class MidyGM2 {
951
951
  case 5:
952
952
  return this.setPortamentoTime(channelNumber, value);
953
953
  case 6:
954
- return this.setDataEntry(channelNumber, value, true);
954
+ return this.dataEntryMSB(channelNumber, value);
955
955
  case 7:
956
956
  return this.setVolume(channelNumber, value);
957
957
  case 10:
@@ -961,7 +961,7 @@ export class MidyGM2 {
961
961
  case 32:
962
962
  return this.setBankLSB(channelNumber, value);
963
963
  case 38:
964
- return this.setDataEntry(channelNumber, value, false);
964
+ return this.dataEntryLSB(channelNumber, value);
965
965
  case 64:
966
966
  return this.setSustainPedal(channelNumber, value);
967
967
  case 65:
@@ -971,9 +971,9 @@ export class MidyGM2 {
971
971
  case 67:
972
972
  return this.setSoftPedal(channelNumber, value);
973
973
  case 91:
974
- return this.setReverb(channelNumber, value);
974
+ return this.setReverbSendLevel(channelNumber, value);
975
975
  case 93:
976
- return this.setChorus(channelNumber, value);
976
+ return this.setChorusSendLevel(channelNumber, value);
977
977
  case 100:
978
978
  return this.setRPNLSB(channelNumber, value);
979
979
  case 101:
@@ -999,22 +999,24 @@ export class MidyGM2 {
999
999
  setBankMSB(channelNumber, msb) {
1000
1000
  this.channels[channelNumber].bankMSB = msb;
1001
1001
  }
1002
- setModulation(channelNumber, modulation) {
1002
+ updateModulation(channel) {
1003
1003
  const now = this.audioContext.currentTime;
1004
- const channel = this.channels[channelNumber];
1005
- channel.modulation = (modulation / 127) *
1006
- (channel.modulationDepthRange * 100);
1007
1004
  const activeNotes = this.getActiveNotes(channel, now);
1008
1005
  activeNotes.forEach((activeNote) => {
1009
1006
  if (activeNote.modLFO) {
1010
- activeNote.gainNode.gain.setValueAtTime(this.cbToRatio(activeNote.instrumentKey.modLfoToVolume) *
1011
- channel.modulation, now);
1007
+ const { gainNode, instrumentKey } = activeNote;
1008
+ gainNode.gain.setValueAtTime(this.cbToRatio(instrumentKey.modLfoToVolume + channel.modulation), now);
1012
1009
  }
1013
1010
  else {
1014
1011
  this.startModulation(channel, activeNote, now);
1015
1012
  }
1016
1013
  });
1017
1014
  }
1015
+ setModulation(channelNumber, modulation) {
1016
+ const channel = this.channels[channelNumber];
1017
+ channel.modulation = (modulation / 127) * channel.modulationDepthRange;
1018
+ this.updateModulation(channel);
1019
+ }
1018
1020
  setPortamentoTime(channelNumber, portamentoTime) {
1019
1021
  this.channels[channelNumber].portamentoTime = portamentoTime / 127;
1020
1022
  }
@@ -1043,6 +1045,10 @@ export class MidyGM2 {
1043
1045
  setBankLSB(channelNumber, lsb) {
1044
1046
  this.channels[channelNumber].bankLSB = lsb;
1045
1047
  }
1048
+ dataEntryLSB(channelNumber, value) {
1049
+ this.channels[channelNumber].dataLSB = value;
1050
+ this.handleRPN(channelNumber);
1051
+ }
1046
1052
  updateChannelGain(channel) {
1047
1053
  const now = this.audioContext.currentTime;
1048
1054
  const volume = channel.volume * channel.expression;
@@ -1064,7 +1070,7 @@ export class MidyGM2 {
1064
1070
  setPortamento(channelNumber, value) {
1065
1071
  this.channels[channelNumber].portamento = value >= 64;
1066
1072
  }
1067
- setReverb(channelNumber, reverb) {
1073
+ setReverbSendLevel(channelNumber, reverb) {
1068
1074
  const now = this.audioContext.currentTime;
1069
1075
  const channel = this.channels[channelNumber];
1070
1076
  const reverbEffect = channel.reverbEffect;
@@ -1074,7 +1080,7 @@ export class MidyGM2 {
1074
1080
  reverbEffect.wetGain.gain.cancelScheduledValues(now);
1075
1081
  reverbEffect.wetGain.gain.setValueAtTime(channel.reverb, now);
1076
1082
  }
1077
- setChorus(channelNumber, chorus) {
1083
+ setChorusSendLevel(channelNumber, chorus) {
1078
1084
  const channel = this.channels[channelNumber];
1079
1085
  channel.chorus = chorus / 127;
1080
1086
  channel.chorusEffect.lfoGain = channel.chorus;
@@ -1122,21 +1128,21 @@ export class MidyGM2 {
1122
1128
  channel.dataMSB = minMSB;
1123
1129
  }
1124
1130
  }
1125
- handleRPN(channelNumber, value) {
1131
+ handleRPN(channelNumber) {
1126
1132
  const channel = this.channels[channelNumber];
1127
1133
  const rpn = channel.rpnMSB * 128 + channel.rpnLSB;
1128
1134
  switch (rpn) {
1129
1135
  case 0:
1130
- channel.dataLSB += value;
1131
- this.handlePitchBendRangeMessage(channelNumber);
1136
+ this.handlePitchBendRangeRPN(channelNumber);
1132
1137
  break;
1133
1138
  case 1:
1134
- channel.dataLSB += value;
1135
- this.handleFineTuningMessage(channelNumber);
1139
+ this.handleFineTuningRPN(channelNumber);
1136
1140
  break;
1137
1141
  case 2:
1138
- channel.dataMSB += value;
1139
- this.handleCoarseTuningMessage(channelNumber);
1142
+ this.handleCoarseTuningRPN(channelNumber);
1143
+ break;
1144
+ case 5:
1145
+ this.handleModulationDepthRangeRPN(channelNumber);
1140
1146
  break;
1141
1147
  default:
1142
1148
  console.warn(`Channel ${channelNumber}: Unsupported RPN MSB=${channel.rpnMSB} LSB=${channel.rpnLSB}`);
@@ -1148,9 +1154,8 @@ export class MidyGM2 {
1148
1154
  setRPNLSB(channelNumber, value) {
1149
1155
  this.channels[channelNumber].rpnLSB = value;
1150
1156
  }
1151
- setDataEntry(channelNumber, value, isMSB) {
1152
- const channel = this.channels[channelNumber];
1153
- isMSB ? channel.dataMSB = value : channel.dataLSB = value;
1157
+ dataEntryMSB(channelNumber, value) {
1158
+ this.channels[channelNumber].dataMSB = value;
1154
1159
  this.handleRPN(channelNumber);
1155
1160
  }
1156
1161
  updateDetune(channel, detuneChange) {
@@ -1164,7 +1169,7 @@ export class MidyGM2 {
1164
1169
  .setValueAtTime(detune, now);
1165
1170
  });
1166
1171
  }
1167
- handlePitchBendRangeMessage(channelNumber) {
1172
+ handlePitchBendRangeRPN(channelNumber) {
1168
1173
  const channel = this.channels[channelNumber];
1169
1174
  this.limitData(channel, 0, 127, 0, 99);
1170
1175
  const pitchBendRange = channel.dataMSB + channel.dataLSB / 100;
@@ -1178,7 +1183,7 @@ export class MidyGM2 {
1178
1183
  channel.pitchBend * 100;
1179
1184
  this.updateDetune(channel, detuneChange);
1180
1185
  }
1181
- handleFineTuningMessage(channelNumber) {
1186
+ handleFineTuningRPN(channelNumber) {
1182
1187
  const channel = this.channels[channelNumber];
1183
1188
  this.limitData(channel, 0, 127, 0, 127);
1184
1189
  const fineTuning = (channel.dataMSB * 128 + channel.dataLSB - 8192) / 8192;
@@ -1186,9 +1191,12 @@ export class MidyGM2 {
1186
1191
  }
1187
1192
  setFineTuning(channelNumber, fineTuning) {
1188
1193
  const channel = this.channels[channelNumber];
1194
+ const prevFineTuning = channel.fineTuning;
1189
1195
  channel.fineTuning = fineTuning;
1196
+ const detuneChange = channel.fineTuning - prevFineTuning;
1197
+ this.updateDetune(channel, detuneChange);
1190
1198
  }
1191
- handleCoarseTuningMessage(channelNumber) {
1199
+ handleCoarseTuningRPN(channelNumber) {
1192
1200
  const channel = this.channels[channelNumber];
1193
1201
  this.limitDataMSB(channel, 0, 127);
1194
1202
  const coarseTuning = channel.dataMSB - 64;
@@ -1196,7 +1204,22 @@ export class MidyGM2 {
1196
1204
  }
1197
1205
  setCoarseTuning(channelNumber, coarseTuning) {
1198
1206
  const channel = this.channels[channelNumber];
1199
- channel.fineTuning = coarseTuning;
1207
+ const prevCoarseTuning = channel.coarseTuning;
1208
+ channel.coarseTuning = coarseTuning;
1209
+ const detuneChange = channel.coarseTuning - prevCoarseTuning;
1210
+ this.updateDetune(channel, detuneChange);
1211
+ }
1212
+ handleModulationDepthRangeRPN(channelNumber) {
1213
+ const channel = this.channels[channelNumber];
1214
+ this.limitData(channel, 0, 127, 0, 127);
1215
+ const modulationDepthRange = dataMSB + dataLSB / 128;
1216
+ this.setModulationDepthRange(channelNumber, modulationDepthRange);
1217
+ }
1218
+ setModulationDepthRange(channelNumber, modulationDepthRange) {
1219
+ const channel = this.channels[channelNumber];
1220
+ channel.modulationDepthRange = modulationDepthRange;
1221
+ channel.modulation = (modulation / 127) * channel.modulationDepthRange;
1222
+ this.updateModulation(channel);
1200
1223
  }
1201
1224
  allSoundOff(channelNumber) {
1202
1225
  const now = this.audioContext.currentTime;
@@ -1287,9 +1310,9 @@ export class MidyGM2 {
1287
1310
  switch (data[3]) {
1288
1311
  case 1:
1289
1312
  return this.handleMasterVolumeSysEx(data);
1290
- case 3:
1313
+ case 3: // https://amei.or.jp/midistandardcommittee/Recommended_Practice/e/ca25.pdf
1291
1314
  return this.handleMasterFineTuningSysEx(data);
1292
- case 4:
1315
+ case 4: // https://amei.or.jp/midistandardcommittee/Recommended_Practice/e/ca25.pdf
1293
1316
  return this.handleMasterCoarseTuningSysEx(data);
1294
1317
  // case 5: // TODO: Global Parameter Control
1295
1318
  default:
@@ -1400,7 +1423,7 @@ Object.defineProperty(MidyGM2, "channelSettings", {
1400
1423
  value: {
1401
1424
  currentBufferSource: null,
1402
1425
  volume: 100 / 127,
1403
- pan: 0,
1426
+ pan: 64,
1404
1427
  portamentoTime: 0,
1405
1428
  reverb: 0,
1406
1429
  chorus: 0,
@@ -1411,9 +1434,9 @@ Object.defineProperty(MidyGM2, "channelSettings", {
1411
1434
  dataLSB: 0,
1412
1435
  program: 0,
1413
1436
  pitchBend: 0,
1414
- fineTuning: 0,
1415
- coarseTuning: 0,
1416
- modulationDepthRange: 0.5,
1437
+ fineTuning: 0, // cb
1438
+ coarseTuning: 0, // cb
1439
+ modulationDepthRange: 0.5, // cb
1417
1440
  }
1418
1441
  });
1419
1442
  Object.defineProperty(MidyGM2, "effectSettings", {
@@ -124,6 +124,7 @@ export class MidyGMLite {
124
124
  handlePitchBendMessage(channelNumber: any, lsb: any, msb: any): void;
125
125
  setPitchBend(channelNumber: any, pitchBend: any): void;
126
126
  handleControlChange(channelNumber: any, controller: any, value: any): void | any[];
127
+ updateModulation(channel: any): void;
127
128
  setModulation(channelNumber: any, modulation: any): void;
128
129
  setVolume(channelNumber: any, volume: any): void;
129
130
  panToGain(pan: any): {
@@ -132,14 +133,15 @@ export class MidyGMLite {
132
133
  };
133
134
  setPan(channelNumber: any, pan: any): void;
134
135
  setExpression(channelNumber: any, expression: any): void;
136
+ dataEntryLSB(channelNumber: any, value: any): void;
135
137
  updateChannelGain(channel: any): void;
136
138
  setSustainPedal(channelNumber: any, value: any): void;
137
139
  handleRPN(channelNumber: any): void;
138
140
  setRPNMSB(channelNumber: any, value: any): void;
139
141
  setRPNLSB(channelNumber: any, value: any): void;
140
- setDataEntry(channelNumber: any, value: any, isMSB: any): void;
142
+ dataEntryMSB(channelNumber: any, value: any): void;
141
143
  updateDetune(channel: any, detuneChange: any): void;
142
- handlePitchBendRangeMessage(channelNumber: any): void;
144
+ handlePitchBendRangeRPN(channelNumber: any): void;
143
145
  setPitchBendRange(channelNumber: any, pitchBendRange: any): void;
144
146
  allSoundOff(channelNumber: any): any[];
145
147
  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,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"}
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,qCAcC;IAED,yDAIC;IACD,iDAIC;IAED;;;MAMC;IAED,2CAIC;IAED,yDAIC;IAED,mDAGC;IAED,sCAUC;IAED,sDAMC;IAED,oCAYC;IAED,gDAEC;IAED,gDAEC;IAED,mDAGC;IAED,oDAUC;IAED,kDAKC;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;AAx/BD;IAOE,gFAKC;IAXD,kBAAa;IACb,cAAS;IACT,gBAAW;IACX,YAAO;IACP,gBAAW;IAGT,gBAA4B;IAC5B,cAAwB;IACxB,eAA0B;IAC1B,mBAAkC;CAErC"}
@@ -715,7 +715,7 @@ export class MidyGMLite {
715
715
  case 1:
716
716
  return this.setModulation(channelNumber, value);
717
717
  case 6:
718
- return this.setDataEntry(channelNumber, value, true);
718
+ return this.dataEntryMSB(channelNumber, value);
719
719
  case 7:
720
720
  return this.setVolume(channelNumber, value);
721
721
  case 10:
@@ -723,7 +723,7 @@ export class MidyGMLite {
723
723
  case 11:
724
724
  return this.setExpression(channelNumber, value);
725
725
  case 38:
726
- return this.setDataEntry(channelNumber, value, false);
726
+ return this.dataEntryLSB(channelNumber, value);
727
727
  case 64:
728
728
  return this.setSustainPedal(channelNumber, value);
729
729
  case 100:
@@ -740,22 +740,24 @@ export class MidyGMLite {
740
740
  console.warn(`Unsupported Control change: controller=${controller} value=${value}`);
741
741
  }
742
742
  }
743
- setModulation(channelNumber, modulation) {
743
+ updateModulation(channel) {
744
744
  const now = this.audioContext.currentTime;
745
- const channel = this.channels[channelNumber];
746
- channel.modulation = (modulation / 127) *
747
- (channel.modulationDepthRange * 100);
748
745
  const activeNotes = this.getActiveNotes(channel, now);
749
746
  activeNotes.forEach((activeNote) => {
750
747
  if (activeNote.modLFO) {
751
- activeNote.gainNode.gain.setValueAtTime(this.cbToRatio(activeNote.instrumentKey.modLfoToVolume) *
752
- channel.modulation, now);
748
+ const { gainNode, instrumentKey } = activeNote;
749
+ gainNode.gain.setValueAtTime(this.cbToRatio(instrumentKey.modLfoToVolume + channel.modulation), now);
753
750
  }
754
751
  else {
755
752
  this.startModulation(channel, activeNote, now);
756
753
  }
757
754
  });
758
755
  }
756
+ setModulation(channelNumber, modulation) {
757
+ const channel = this.channels[channelNumber];
758
+ channel.modulation = (modulation / 127) * channel.modulationDepthRange;
759
+ this.updateModulation(channel);
760
+ }
759
761
  setVolume(channelNumber, volume) {
760
762
  const channel = this.channels[channelNumber];
761
763
  channel.volume = volume / 127;
@@ -778,6 +780,10 @@ export class MidyGMLite {
778
780
  channel.expression = expression / 127;
779
781
  this.updateChannelGain(channel);
780
782
  }
783
+ dataEntryLSB(channelNumber, value) {
784
+ this.channels[channelNumber].dataLSB = value;
785
+ this.handleRPN(channelNumber);
786
+ }
781
787
  updateChannelGain(channel) {
782
788
  const now = this.audioContext.currentTime;
783
789
  const volume = channel.volume * channel.expression;
@@ -801,7 +807,7 @@ export class MidyGMLite {
801
807
  const rpn = channel.rpnMSB * 128 + channel.rpnLSB;
802
808
  switch (rpn) {
803
809
  case 0:
804
- this.handlePitchBendRangeMessage(channelNumber);
810
+ this.handlePitchBendRangeRPN(channelNumber);
805
811
  break;
806
812
  default:
807
813
  console.warn(`Channel ${channelNumber}: Unsupported RPN MSB=${channel.rpnMSB} LSB=${channel.rpnLSB}`);
@@ -813,9 +819,8 @@ export class MidyGMLite {
813
819
  setRPNLSB(channelNumber, value) {
814
820
  this.channels[channelNumber].rpnLSB = value;
815
821
  }
816
- setDataEntry(channelNumber, value, isMSB) {
817
- const channel = this.channels[channelNumber];
818
- isMSB ? channel.dataMSB = value : channel.dataLSB = value;
822
+ dataEntryMSB(channelNumber, value) {
823
+ this.channels[channelNumber].dataMSB = value;
819
824
  this.handleRPN(channelNumber);
820
825
  }
821
826
  updateDetune(channel, detuneChange) {
@@ -829,7 +834,7 @@ export class MidyGMLite {
829
834
  .setValueAtTime(detune, now);
830
835
  });
831
836
  }
832
- handlePitchBendRangeMessage(channelNumber) {
837
+ handlePitchBendRangeRPN(channelNumber) {
833
838
  const channel = this.channels[channelNumber];
834
839
  this.limitData(channel, 0, 127, 0, 99);
835
840
  const pitchBendRange = channel.dataMSB + channel.dataLSB / 100;
@@ -967,7 +972,7 @@ Object.defineProperty(MidyGMLite, "channelSettings", {
967
972
  dataLSB: 0,
968
973
  program: 0,
969
974
  pitchBend: 0,
970
- modulationDepthRange: 0.5,
975
+ modulationDepthRange: 0.5, // cb
971
976
  }
972
977
  });
973
978
  Object.defineProperty(MidyGMLite, "effectSettings", {