@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.d.ts CHANGED
@@ -256,14 +256,15 @@ export class Midy {
256
256
  releaseNote(channelNumber: any, noteNumber: any, velocity: any): Promise<any> | undefined;
257
257
  releaseSustainPedal(channelNumber: any, halfVelocity: any): any[];
258
258
  releaseSostenutoPedal(channelNumber: any, halfVelocity: any): any[];
259
- handleMIDIMessage(statusByte: any, data1: any, data2: any): any;
259
+ handleMIDIMessage(statusByte: any, data1: any, data2: any): void | any[] | Promise<any>;
260
260
  handlePolyphonicKeyPressure(channelNumber: any, noteNumber: any, pressure: any): void;
261
261
  handleProgramChange(channelNumber: any, program: any): void;
262
262
  handleChannelPressure(channelNumber: any, pressure: any): void;
263
263
  handlePitchBendMessage(channelNumber: any, lsb: any, msb: any): void;
264
264
  setPitchBend(channelNumber: any, pitchBend: any): void;
265
- handleControlChange(channelNumber: any, controller: any, value: any): any;
265
+ handleControlChange(channelNumber: any, controller: any, value: any): void | any[];
266
266
  setBankMSB(channelNumber: any, msb: any): void;
267
+ updateModulation(channel: any): void;
267
268
  setModulation(channelNumber: any, modulation: any): void;
268
269
  setPortamentoTime(channelNumber: any, portamentoTime: any): void;
269
270
  setVolume(channelNumber: any, volume: any): void;
@@ -274,11 +275,12 @@ export class Midy {
274
275
  setPan(channelNumber: any, pan: any): void;
275
276
  setExpression(channelNumber: any, expression: any): void;
276
277
  setBankLSB(channelNumber: any, lsb: any): void;
278
+ dataEntryLSB(channelNumber: any, value: any): void;
277
279
  updateChannelGain(channel: any): void;
278
280
  setSustainPedal(channelNumber: any, value: any): void;
279
281
  setPortamento(channelNumber: any, value: any): void;
280
- setReverb(channelNumber: any, reverb: any): void;
281
- setChorus(channelNumber: any, chorus: any): void;
282
+ setReverbSendLevel(channelNumber: any, reverb: any): void;
283
+ setChorusSendLevel(channelNumber: any, chorus: any): void;
282
284
  setSostenutoPedal(channelNumber: any, value: any): void;
283
285
  setSoftPedal(channelNumber: any, softPedal: any): void;
284
286
  setVibratoRate(channelNumber: any, vibratoRate: any): void;
@@ -287,18 +289,20 @@ export class Midy {
287
289
  limitData(channel: any, minMSB: any, maxMSB: any, minLSB: any, maxLSB: any): void;
288
290
  limitDataMSB(channel: any, minMSB: any, maxMSB: any): void;
289
291
  handleRPN(channelNumber: any, value: any): void;
290
- incrementRPNValue(channelNumber: any): void;
291
- decrementRPNValue(channelNumber: any): void;
292
+ dataIncrement(channelNumber: any): void;
293
+ dataDecrement(channelNumber: any): void;
292
294
  setRPNMSB(channelNumber: any, value: any): void;
293
295
  setRPNLSB(channelNumber: any, value: any): void;
294
- setDataEntry(channelNumber: any, value: any, isMSB: any): void;
296
+ dataEntryMSB(channelNumber: any, value: any): void;
295
297
  updateDetune(channel: any, detuneChange: any): void;
296
- handlePitchBendRangeMessage(channelNumber: any): void;
298
+ handlePitchBendRangeRPN(channelNumber: any): void;
297
299
  setPitchBendRange(channelNumber: any, pitchBendRange: any): void;
298
- handleFineTuningMessage(channelNumber: any): void;
300
+ handleFineTuningRPN(channelNumber: any): void;
299
301
  setFineTuning(channelNumber: any, fineTuning: any): void;
300
- handleCoarseTuningMessage(channelNumber: any): void;
302
+ handleCoarseTuningRPN(channelNumber: any): void;
301
303
  setCoarseTuning(channelNumber: any, coarseTuning: any): void;
304
+ handleModulationDepthRangeRPN(channelNumber: any): void;
305
+ setModulationDepthRange(channelNumber: any, modulationDepthRange: any): void;
302
306
  allSoundOff(channelNumber: any): any[];
303
307
  resetAllControllers(channelNumber: any): void;
304
308
  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,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"}
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,wFAqBC;IAED,sFAcC;IAED,4DAIC;IAED,+DAcC;IAED,qEAGC;IAED,uDAOC;IAED,mFAkEC;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,2DAGC;IAED,6DAGC;IAED,6DASC;IAED,kFAeC;IAED,2DAMC;IAED,gDAyBC;IAED,wCAEC;IAED,wCAEC;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;AAxjDD;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.js CHANGED
@@ -75,13 +75,13 @@ export class Midy {
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,
@@ -748,7 +748,7 @@ export class Midy {
748
748
  startModulation(channel, note, time) {
749
749
  const { instrumentKey } = note;
750
750
  note.modLFOGain = new GainNode(this.audioContext, {
751
- gain: this.cbToRatio(instrumentKey.modLfoToVolume) * channel.modulation,
751
+ gain: this.cbToRatio(instrumentKey.modLfoToVolume + channel.modulation),
752
752
  });
753
753
  note.modLFO = new OscillatorNode(this.audioContext, {
754
754
  frequency: this.centToHz(instrumentKey.freqModLFO),
@@ -995,7 +995,7 @@ export class Midy {
995
995
  case 5:
996
996
  return this.setPortamentoTime(channelNumber, value);
997
997
  case 6:
998
- return this.setDataEntry(channelNumber, value, true);
998
+ return this.dataEntryMSB(channelNumber, value);
999
999
  case 7:
1000
1000
  return this.setVolume(channelNumber, value);
1001
1001
  case 10:
@@ -1005,7 +1005,7 @@ export class Midy {
1005
1005
  case 32:
1006
1006
  return this.setBankLSB(channelNumber, value);
1007
1007
  case 38:
1008
- return this.setDataEntry(channelNumber, value, false);
1008
+ return this.dataEntryLSB(channelNumber, value);
1009
1009
  case 64:
1010
1010
  return this.setSustainPedal(channelNumber, value);
1011
1011
  case 65:
@@ -1022,13 +1022,13 @@ export class Midy {
1022
1022
  case 78:
1023
1023
  return this.setVibratoDelay(channelNumber, value);
1024
1024
  case 91:
1025
- return this.setReverb(channelNumber, value);
1025
+ return this.setReverbSendLevel(channelNumber, value);
1026
1026
  case 93:
1027
- return this.setChorus(channelNumber, value);
1027
+ return this.setChorusSendLevel(channelNumber, value);
1028
1028
  case 96: // https://amei.or.jp/midistandardcommittee/Recommended_Practice/e/rp18.pdf
1029
- return incrementRPNValue(channelNumber);
1029
+ return this.dataIncrement(channelNumber);
1030
1030
  case 97: // https://amei.or.jp/midistandardcommittee/Recommended_Practice/e/rp18.pdf
1031
- return decrementRPNValue(channelNumber);
1031
+ return this.dataDecrement(channelNumber);
1032
1032
  case 100:
1033
1033
  return this.setRPNLSB(channelNumber, value);
1034
1034
  case 101:
@@ -1054,22 +1054,24 @@ export class Midy {
1054
1054
  setBankMSB(channelNumber, msb) {
1055
1055
  this.channels[channelNumber].bankMSB = msb;
1056
1056
  }
1057
- setModulation(channelNumber, modulation) {
1057
+ updateModulation(channel) {
1058
1058
  const now = this.audioContext.currentTime;
1059
- const channel = this.channels[channelNumber];
1060
- channel.modulation = (modulation / 127) *
1061
- (channel.modulationDepthRange * 100);
1062
1059
  const activeNotes = this.getActiveNotes(channel, now);
1063
1060
  activeNotes.forEach((activeNote) => {
1064
1061
  if (activeNote.modLFO) {
1065
- activeNote.gainNode.gain.setValueAtTime(this.cbToRatio(activeNote.instrumentKey.modLfoToVolume) *
1066
- channel.modulation, now);
1062
+ const { gainNode, instrumentKey } = activeNote;
1063
+ gainNode.gain.setValueAtTime(this.cbToRatio(instrumentKey.modLfoToVolume + channel.modulation), now);
1067
1064
  }
1068
1065
  else {
1069
1066
  this.startModulation(channel, activeNote, now);
1070
1067
  }
1071
1068
  });
1072
1069
  }
1070
+ setModulation(channelNumber, modulation) {
1071
+ const channel = this.channels[channelNumber];
1072
+ channel.modulation = (modulation / 127) * channel.modulationDepthRange;
1073
+ this.updateModulation(channel);
1074
+ }
1073
1075
  setPortamentoTime(channelNumber, portamentoTime) {
1074
1076
  this.channels[channelNumber].portamentoTime = portamentoTime / 127;
1075
1077
  }
@@ -1098,6 +1100,10 @@ export class Midy {
1098
1100
  setBankLSB(channelNumber, lsb) {
1099
1101
  this.channels[channelNumber].bankLSB = lsb;
1100
1102
  }
1103
+ dataEntryLSB(channelNumber, value) {
1104
+ this.channels[channelNumber].dataLSB = value;
1105
+ this.handleRPN(channelNumber, 0);
1106
+ }
1101
1107
  updateChannelGain(channel) {
1102
1108
  const now = this.audioContext.currentTime;
1103
1109
  const volume = channel.volume * channel.expression;
@@ -1119,7 +1125,7 @@ export class Midy {
1119
1125
  setPortamento(channelNumber, value) {
1120
1126
  this.channels[channelNumber].portamento = value >= 64;
1121
1127
  }
1122
- setReverb(channelNumber, reverb) {
1128
+ setReverbSendLevel(channelNumber, reverb) {
1123
1129
  const now = this.audioContext.currentTime;
1124
1130
  const channel = this.channels[channelNumber];
1125
1131
  const reverbEffect = channel.reverbEffect;
@@ -1129,7 +1135,7 @@ export class Midy {
1129
1135
  reverbEffect.wetGain.gain.cancelScheduledValues(now);
1130
1136
  reverbEffect.wetGain.gain.setValueAtTime(channel.reverb, now);
1131
1137
  }
1132
- setChorus(channelNumber, chorus) {
1138
+ setChorusSendLevel(channelNumber, chorus) {
1133
1139
  const channel = this.channels[channelNumber];
1134
1140
  channel.chorus = chorus / 127;
1135
1141
  channel.chorusEffect.lfoGain = channel.chorus;
@@ -1195,31 +1201,34 @@ export class Midy {
1195
1201
  channel.dataMSB = minMSB;
1196
1202
  }
1197
1203
  }
1198
- // TODO: support 3-4?
1199
1204
  handleRPN(channelNumber, value) {
1200
1205
  const channel = this.channels[channelNumber];
1201
1206
  const rpn = channel.rpnMSB * 128 + channel.rpnLSB;
1202
1207
  switch (rpn) {
1203
1208
  case 0:
1204
1209
  channel.dataLSB += value;
1205
- this.handlePitchBendRangeMessage(channelNumber);
1210
+ this.handlePitchBendRangeRPN(channelNumber);
1206
1211
  break;
1207
1212
  case 1:
1208
1213
  channel.dataLSB += value;
1209
- this.handleFineTuningMessage(channelNumber);
1214
+ this.handleFineTuningRPN(channelNumber);
1210
1215
  break;
1211
1216
  case 2:
1212
1217
  channel.dataMSB += value;
1213
- this.handleCoarseTuningMessage(channelNumber);
1218
+ this.handleCoarseTuningRPN(channelNumber);
1219
+ break;
1220
+ case 5:
1221
+ channel.dataLSB += value;
1222
+ this.handleModulationDepthRangeRPN(channelNumber);
1214
1223
  break;
1215
1224
  default:
1216
1225
  console.warn(`Channel ${channelNumber}: Unsupported RPN MSB=${channel.rpnMSB} LSB=${channel.rpnLSB}`);
1217
1226
  }
1218
1227
  }
1219
- incrementRPNValue(channelNumber) {
1228
+ dataIncrement(channelNumber) {
1220
1229
  this.handleRPN(channelNumber, 1);
1221
1230
  }
1222
- decrementRPNValue(channelNumber) {
1231
+ dataDecrement(channelNumber) {
1223
1232
  this.handleRPN(channelNumber, -1);
1224
1233
  }
1225
1234
  setRPNMSB(channelNumber, value) {
@@ -1228,9 +1237,8 @@ export class Midy {
1228
1237
  setRPNLSB(channelNumber, value) {
1229
1238
  this.channels[channelNumber].rpnLSB = value;
1230
1239
  }
1231
- setDataEntry(channelNumber, value, isMSB) {
1232
- const channel = this.channels[channelNumber];
1233
- isMSB ? channel.dataMSB = value : channel.dataLSB = value;
1240
+ dataEntryMSB(channelNumber, value) {
1241
+ this.channels[channelNumber].dataMSB = value;
1234
1242
  this.handleRPN(channelNumber, 0);
1235
1243
  }
1236
1244
  updateDetune(channel, detuneChange) {
@@ -1244,7 +1252,7 @@ export class Midy {
1244
1252
  .setValueAtTime(detune, now);
1245
1253
  });
1246
1254
  }
1247
- handlePitchBendRangeMessage(channelNumber) {
1255
+ handlePitchBendRangeRPN(channelNumber) {
1248
1256
  const channel = this.channels[channelNumber];
1249
1257
  this.limitData(channel, 0, 127, 0, 99);
1250
1258
  const pitchBendRange = channel.dataMSB + channel.dataLSB / 100;
@@ -1258,7 +1266,7 @@ export class Midy {
1258
1266
  channel.pitchBend * 100;
1259
1267
  this.updateDetune(channel, detuneChange);
1260
1268
  }
1261
- handleFineTuningMessage(channelNumber) {
1269
+ handleFineTuningRPN(channelNumber) {
1262
1270
  const channel = this.channels[channelNumber];
1263
1271
  this.limitData(channel, 0, 127, 0, 127);
1264
1272
  const fineTuning = (channel.dataMSB * 128 + channel.dataLSB - 8192) / 8192;
@@ -1266,9 +1274,12 @@ export class Midy {
1266
1274
  }
1267
1275
  setFineTuning(channelNumber, fineTuning) {
1268
1276
  const channel = this.channels[channelNumber];
1277
+ const prevFineTuning = channel.fineTuning;
1269
1278
  channel.fineTuning = fineTuning;
1279
+ const detuneChange = channel.fineTuning - prevFineTuning;
1280
+ this.updateDetune(channel, detuneChange);
1270
1281
  }
1271
- handleCoarseTuningMessage(channelNumber) {
1282
+ handleCoarseTuningRPN(channelNumber) {
1272
1283
  const channel = this.channels[channelNumber];
1273
1284
  this.limitDataMSB(channel, 0, 127);
1274
1285
  const coarseTuning = channel.dataMSB - 64;
@@ -1276,7 +1287,22 @@ export class Midy {
1276
1287
  }
1277
1288
  setCoarseTuning(channelNumber, coarseTuning) {
1278
1289
  const channel = this.channels[channelNumber];
1279
- channel.fineTuning = coarseTuning;
1290
+ const prevCoarseTuning = channel.coarseTuning;
1291
+ channel.coarseTuning = coarseTuning;
1292
+ const detuneChange = channel.coarseTuning - prevCoarseTuning;
1293
+ this.updateDetune(channel, detuneChange);
1294
+ }
1295
+ handleModulationDepthRangeRPN(channelNumber) {
1296
+ const channel = this.channels[channelNumber];
1297
+ this.limitData(channel, 0, 127, 0, 127);
1298
+ const modulationDepthRange = dataMSB + dataLSB / 128;
1299
+ this.setModulationDepthRange(channelNumber, modulationDepthRange);
1300
+ }
1301
+ setModulationDepthRange(channelNumber, modulationDepthRange) {
1302
+ const channel = this.channels[channelNumber];
1303
+ channel.modulationDepthRange = modulationDepthRange;
1304
+ channel.modulation = (modulation / 127) * channel.modulationDepthRange;
1305
+ this.updateModulation(channel);
1280
1306
  }
1281
1307
  allSoundOff(channelNumber) {
1282
1308
  const now = this.audioContext.currentTime;
@@ -1367,9 +1393,9 @@ export class Midy {
1367
1393
  switch (data[3]) {
1368
1394
  case 1:
1369
1395
  return this.handleMasterVolumeSysEx(data);
1370
- case 3:
1396
+ case 3: // https://amei.or.jp/midistandardcommittee/Recommended_Practice/e/ca25.pdf
1371
1397
  return this.handleMasterFineTuningSysEx(data);
1372
- case 4:
1398
+ case 4: // https://amei.or.jp/midistandardcommittee/Recommended_Practice/e/ca25.pdf
1373
1399
  return this.handleMasterCoarseTuningSysEx(data);
1374
1400
  // case 5: // TODO: Global Parameter Control
1375
1401
  default:
@@ -1494,9 +1520,9 @@ Object.defineProperty(Midy, "channelSettings", {
1494
1520
  dataLSB: 0,
1495
1521
  program: 0,
1496
1522
  pitchBend: 0,
1497
- fineTuning: 0,
1498
- coarseTuning: 0,
1499
- modulationDepthRange: 0.5,
1523
+ fineTuning: 0, // cb
1524
+ coarseTuning: 0, // cb
1525
+ modulationDepthRange: 0.5, // cb
1500
1526
  }
1501
1527
  });
1502
1528
  Object.defineProperty(Midy, "effectSettings", {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@marmooo/midy",
3
- "version": "0.0.7",
3
+ "version": "0.0.8",
4
4
  "description": "A MIDI player/synthesizer written in JavaScript that supports GM-Lite/GM1 and SF2/SF3.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -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"}
@@ -719,7 +719,7 @@ class MidyGM1 {
719
719
  case 1:
720
720
  return this.setModulation(channelNumber, value);
721
721
  case 6:
722
- return this.setDataEntry(channelNumber, value, true);
722
+ return this.dataEntryMSB(channelNumber, value);
723
723
  case 7:
724
724
  return this.setVolume(channelNumber, value);
725
725
  case 10:
@@ -727,7 +727,7 @@ class MidyGM1 {
727
727
  case 11:
728
728
  return this.setExpression(channelNumber, value);
729
729
  case 38:
730
- return this.setDataEntry(channelNumber, value, false);
730
+ return this.dataEntryLSB(channelNumber, value);
731
731
  case 64:
732
732
  return this.setSustainPedal(channelNumber, value);
733
733
  case 100:
@@ -744,22 +744,24 @@ class MidyGM1 {
744
744
  console.warn(`Unsupported Control change: controller=${controller} value=${value}`);
745
745
  }
746
746
  }
747
- setModulation(channelNumber, modulation) {
747
+ updateModulation(channel) {
748
748
  const now = this.audioContext.currentTime;
749
- const channel = this.channels[channelNumber];
750
- channel.modulation = (modulation / 127) *
751
- (channel.modulationDepthRange * 100);
752
749
  const activeNotes = this.getActiveNotes(channel, now);
753
750
  activeNotes.forEach((activeNote) => {
754
751
  if (activeNote.modLFO) {
755
- activeNote.gainNode.gain.setValueAtTime(this.cbToRatio(activeNote.instrumentKey.modLfoToVolume) *
756
- channel.modulation, now);
752
+ const { gainNode, instrumentKey } = activeNote;
753
+ gainNode.gain.setValueAtTime(this.cbToRatio(instrumentKey.modLfoToVolume + channel.modulation), now);
757
754
  }
758
755
  else {
759
756
  this.startModulation(channel, activeNote, now);
760
757
  }
761
758
  });
762
759
  }
760
+ setModulation(channelNumber, modulation) {
761
+ const channel = this.channels[channelNumber];
762
+ channel.modulation = (modulation / 127) * channel.modulationDepthRange;
763
+ this.updateModulation(channel);
764
+ }
763
765
  setVolume(channelNumber, volume) {
764
766
  const channel = this.channels[channelNumber];
765
767
  channel.volume = volume / 127;
@@ -782,6 +784,10 @@ class MidyGM1 {
782
784
  channel.expression = expression / 127;
783
785
  this.updateChannelGain(channel);
784
786
  }
787
+ dataEntryLSB(channelNumber, value) {
788
+ this.channels[channelNumber].dataLSB = value;
789
+ this.handleRPN(channelNumber, 0);
790
+ }
785
791
  updateChannelGain(channel) {
786
792
  const now = this.audioContext.currentTime;
787
793
  const volume = channel.volume * channel.expression;
@@ -831,13 +837,13 @@ class MidyGM1 {
831
837
  const rpn = channel.rpnMSB * 128 + channel.rpnLSB;
832
838
  switch (rpn) {
833
839
  case 0:
834
- this.handlePitchBendRangeMessage(channelNumber);
840
+ this.handlePitchBendRangeRPN(channelNumber);
835
841
  break;
836
842
  case 1:
837
- this.handleFineTuningMessage(channelNumber);
843
+ this.handleFineTuningRPN(channelNumber);
838
844
  break;
839
845
  case 2:
840
- this.handleCoarseTuningMessage(channelNumber);
846
+ this.handleCoarseTuningRPN(channelNumber);
841
847
  break;
842
848
  default:
843
849
  console.warn(`Channel ${channelNumber}: Unsupported RPN MSB=${channel.rpnMSB} LSB=${channel.rpnLSB}`);
@@ -849,9 +855,8 @@ class MidyGM1 {
849
855
  setRPNLSB(channelNumber, value) {
850
856
  this.channels[channelNumber].rpnLSB = value;
851
857
  }
852
- setDataEntry(channelNumber, value, isMSB) {
853
- const channel = this.channels[channelNumber];
854
- isMSB ? channel.dataMSB = value : channel.dataLSB = value;
858
+ dataEntryMSB(channelNumber, value) {
859
+ this.channels[channelNumber].dataMSB = value;
855
860
  this.handleRPN(channelNumber);
856
861
  }
857
862
  updateDetune(channel, detuneChange) {
@@ -865,7 +870,7 @@ class MidyGM1 {
865
870
  .setValueAtTime(detune, now);
866
871
  });
867
872
  }
868
- handlePitchBendRangeMessage(channelNumber) {
873
+ handlePitchBendRangeRPN(channelNumber) {
869
874
  const channel = this.channels[channelNumber];
870
875
  this.limitData(channel, 0, 127, 0, 99);
871
876
  const pitchBendRange = channel.dataMSB + channel.dataLSB / 100;
@@ -879,7 +884,7 @@ class MidyGM1 {
879
884
  channel.pitchBend * 100;
880
885
  this.updateDetune(channel, detuneChange);
881
886
  }
882
- handleFineTuningMessage(channelNumber) {
887
+ handleFineTuningRPN(channelNumber) {
883
888
  const channel = this.channels[channelNumber];
884
889
  this.limitData(channel, 0, 127, 0, 127);
885
890
  const fineTuning = (channel.dataMSB * 128 + channel.dataLSB - 8192) / 8192;
@@ -887,9 +892,12 @@ class MidyGM1 {
887
892
  }
888
893
  setFineTuning(channelNumber, fineTuning) {
889
894
  const channel = this.channels[channelNumber];
895
+ const prevFineTuning = channel.fineTuning;
890
896
  channel.fineTuning = fineTuning;
897
+ const detuneChange = channel.fineTuning - prevFineTuning;
898
+ this.updateDetune(channel, detuneChange);
891
899
  }
892
- handleCoarseTuningMessage(channelNumber) {
900
+ handleCoarseTuningRPN(channelNumber) {
893
901
  const channel = this.channels[channelNumber];
894
902
  this.limitDataMSB(channel, 0, 127);
895
903
  const coarseTuning = channel.dataMSB - 64;
@@ -897,7 +905,10 @@ class MidyGM1 {
897
905
  }
898
906
  setCoarseTuning(channelNumber, coarseTuning) {
899
907
  const channel = this.channels[channelNumber];
900
- channel.fineTuning = coarseTuning;
908
+ const prevCoarseTuning = channel.coarseTuning;
909
+ channel.coarseTuning = coarseTuning;
910
+ const detuneChange = channel.coarseTuning - prevCoarseTuning;
911
+ this.updateDetune(channel, detuneChange);
901
912
  }
902
913
  allSoundOff(channelNumber) {
903
914
  const now = this.audioContext.currentTime;
@@ -1024,9 +1035,9 @@ Object.defineProperty(MidyGM1, "channelSettings", {
1024
1035
  dataLSB: 0,
1025
1036
  program: 0,
1026
1037
  pitchBend: 0,
1027
- fineTuning: 0,
1028
- coarseTuning: 0,
1029
- modulationDepthRange: 0.5,
1038
+ fineTuning: 0, // cb
1039
+ coarseTuning: 0, // cb
1040
+ modulationDepthRange: 0.5, // cb
1030
1041
  }
1031
1042
  });
1032
1043
  Object.defineProperty(MidyGM1, "effectSettings", {
@@ -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"}