@marmooo/midy 0.0.5 → 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.
@@ -228,22 +228,23 @@ class MidyGM2 {
228
228
  this.totalTime = this.calcTotalTime();
229
229
  }
230
230
  setChannelAudioNodes(audioContext) {
231
- const gainNode = new GainNode(audioContext, {
232
- gain: MidyGM2.channelSettings.volume,
233
- });
234
- const pannerNode = new StereoPannerNode(audioContext, {
235
- pan: MidyGM2.channelSettings.pan,
236
- });
231
+ const { gainLeft, gainRight } = this.panToGain(MidyGM2.channelSettings.pan);
232
+ const gainL = new GainNode(audioContext, { gain: gainLeft });
233
+ const gainR = new GainNode(audioContext, { gain: gainRight });
234
+ const merger = new ChannelMergerNode(audioContext, { numberOfInputs: 2 });
235
+ gainL.connect(merger, 0, 0);
236
+ gainR.connect(merger, 0, 1);
237
+ merger.connect(this.masterGain);
237
238
  const reverbEffect = this.createReverbEffect(audioContext);
238
239
  const chorusEffect = this.createChorusEffect(audioContext);
239
240
  chorusEffect.lfo.start();
240
- reverbEffect.dryGain.connect(pannerNode);
241
- reverbEffect.wetGain.connect(pannerNode);
242
- pannerNode.connect(gainNode);
243
- gainNode.connect(this.masterGain);
241
+ reverbEffect.dryGain.connect(gainL);
242
+ reverbEffect.dryGain.connect(gainR);
243
+ reverbEffect.wetGain.connect(gainL);
244
+ reverbEffect.wetGain.connect(gainR);
244
245
  return {
245
- gainNode,
246
- pannerNode,
246
+ gainL,
247
+ gainR,
247
248
  reverbEffect,
248
249
  chorusEffect,
249
250
  };
@@ -337,7 +338,7 @@ class MidyGM2 {
337
338
  this.handleChannelPressure(event.channel, event.amount);
338
339
  break;
339
340
  case "pitchBend":
340
- this.handlePitchBend(event.channel, event.value);
341
+ this.setPitchBend(event.channel, event.value);
341
342
  break;
342
343
  case "sysEx":
343
344
  this.handleSysEx(event.data);
@@ -417,7 +418,6 @@ class MidyGM2 {
417
418
  const tmpChannels = new Array(16);
418
419
  for (let i = 0; i < tmpChannels.length; i++) {
419
420
  tmpChannels[i] = {
420
- durationTicks: new Map(),
421
421
  programNumber: -1,
422
422
  bankMSB: this.channels[i].bankMSB,
423
423
  bankLSB: this.channels[i].bankLSB,
@@ -447,16 +447,6 @@ class MidyGM2 {
447
447
  }
448
448
  channel.programNumber = 0;
449
449
  }
450
- channel.durationTicks.set(event.noteNumber, {
451
- ticks: event.ticks,
452
- noteOn: event,
453
- });
454
- break;
455
- }
456
- case "noteOff": {
457
- const { ticks, noteOn } = tmpChannels[event.channel].durationTicks
458
- .get(event.noteNumber);
459
- noteOn.durationTicks = event.ticks - ticks;
460
450
  break;
461
451
  }
462
452
  case "controller":
@@ -491,8 +481,8 @@ class MidyGM2 {
491
481
  });
492
482
  });
493
483
  const priority = {
494
- setTempo: 0,
495
- controller: 1,
484
+ controller: 0,
485
+ sysEx: 1,
496
486
  };
497
487
  timeline.sort((a, b) => {
498
488
  if (a.ticks !== b.ticks)
@@ -630,12 +620,8 @@ class MidyGM2 {
630
620
  }
631
621
  createChorusEffect(audioContext, options = {}) {
632
622
  const { chorusCount = 2, chorusRate = 0.6, chorusDepth = 0.15, delay = 0.01, variance = delay * 0.1, } = options;
633
- const lfo = new OscillatorNode(audioContext, {
634
- frequency: chorusRate,
635
- });
636
- const lfoGain = new GainNode(audioContext, {
637
- gain: chorusDepth,
638
- });
623
+ const lfo = new OscillatorNode(audioContext, { frequency: chorusRate });
624
+ const lfoGain = new GainNode(audioContext, { gain: chorusDepth });
639
625
  const chorusGains = [];
640
626
  const delayNodes = [];
641
627
  const baseGain = 1 / chorusCount;
@@ -646,9 +632,7 @@ class MidyGM2 {
646
632
  maxDelayTime: delayTime,
647
633
  });
648
634
  delayNodes.push(delayNode);
649
- const chorusGain = new GainNode(audioContext, {
650
- gain: baseGain,
651
- });
635
+ const chorusGain = new GainNode(audioContext, { gain: baseGain });
652
636
  chorusGains.push(chorusGain);
653
637
  lfo.connect(lfoGain);
654
638
  lfoGain.connect(delayNode.delayTime);
@@ -664,14 +648,16 @@ class MidyGM2 {
664
648
  connectNoteEffects(channel, gainNode) {
665
649
  if (channel.reverb === 0) {
666
650
  if (channel.chorus === 0) { // no effect
667
- gainNode.connect(channel.pannerNode);
651
+ gainNode.connect(channel.gainL);
652
+ gainNode.connect(channel.gainR);
668
653
  }
669
654
  else { // chorus
670
655
  channel.chorusEffect.delayNodes.forEach((delayNode) => {
671
656
  gainNode.connect(delayNode);
672
657
  });
673
658
  channel.chorusEffect.chorusGains.forEach((chorusGain) => {
674
- chorusGain.connect(channel.pannerNode);
659
+ chorusGain.connect(channel.gainL);
660
+ chorusGain.connect(channel.gainR);
675
661
  });
676
662
  }
677
663
  }
@@ -710,9 +696,7 @@ class MidyGM2 {
710
696
  }
711
697
  setVolumeEnvelope(channel, note) {
712
698
  const { instrumentKey, startTime, velocity } = note;
713
- note.gainNode = new GainNode(this.audioContext, {
714
- gain: 0,
715
- });
699
+ note.gainNode = new GainNode(this.audioContext, { gain: 0 });
716
700
  let volume = (velocity / 127) * channel.volume * channel.expression;
717
701
  if (volume === 0)
718
702
  volume = 1e-6; // exponentialRampToValueAtTime() requires a non-zero value
@@ -951,21 +935,15 @@ class MidyGM2 {
951
935
  }
952
936
  handlePitchBendMessage(channelNumber, lsb, msb) {
953
937
  const pitchBend = msb * 128 + lsb;
954
- this.handlePitchBend(channelNumber, pitchBend);
938
+ this.setPitchBend(channelNumber, pitchBend);
955
939
  }
956
- handlePitchBend(channelNumber, pitchBend) {
957
- const now = this.audioContext.currentTime;
940
+ setPitchBend(channelNumber, pitchBend) {
958
941
  const channel = this.channels[channelNumber];
942
+ const prevPitchBend = channel.pitchBend;
959
943
  channel.pitchBend = (pitchBend - 8192) / 8192;
960
- const semitoneOffset = this.calcSemitoneOffset(channel);
961
- const activeNotes = this.getActiveNotes(channel, now);
962
- activeNotes.forEach((activeNote) => {
963
- const { bufferSource, instrumentKey, noteNumber } = activeNote;
964
- const playbackRate = calcPlaybackRate(instrumentKey, noteNumber, semitoneOffset);
965
- bufferSource.playbackRate
966
- .cancelScheduledValues(now)
967
- .setValueAtTime(playbackRate * pressure, now);
968
- });
944
+ const detuneChange = (channel.pitchBend - prevPitchBend) *
945
+ channel.pitchBendRange * 100;
946
+ this.updateDetune(channel, detuneChange);
969
947
  }
970
948
  handleControlChange(channelNumber, controller, value) {
971
949
  switch (controller) {
@@ -1000,9 +978,9 @@ class MidyGM2 {
1000
978
  case 93:
1001
979
  return this.setChorus(channelNumber, value);
1002
980
  case 100:
1003
- return this.setRPNMSB(channelNumber, value);
1004
- case 101:
1005
981
  return this.setRPNLSB(channelNumber, value);
982
+ case 101:
983
+ return this.setRPNMSB(channelNumber, value);
1006
984
  case 120:
1007
985
  return this.allSoundOff(channelNumber);
1008
986
  case 121:
@@ -1048,12 +1026,17 @@ class MidyGM2 {
1048
1026
  channel.volume = volume / 127;
1049
1027
  this.updateChannelGain(channel);
1050
1028
  }
1029
+ panToGain(pan) {
1030
+ const theta = Math.PI / 2 * Math.max(0, pan - 1) / 126;
1031
+ return {
1032
+ gainLeft: Math.cos(theta),
1033
+ gainRight: Math.sin(theta),
1034
+ };
1035
+ }
1051
1036
  setPan(channelNumber, pan) {
1052
- const now = this.audioContext.currentTime;
1053
1037
  const channel = this.channels[channelNumber];
1054
- channel.pan = pan / 127 * 2 - 1; // -1 (left) - +1 (right)
1055
- channel.pannerNode.pan.cancelScheduledValues(now);
1056
- channel.pannerNode.pan.setValueAtTime(channel.pan, now);
1038
+ channel.pan = pan;
1039
+ this.updateChannelGain(channel);
1057
1040
  }
1058
1041
  setExpression(channelNumber, expression) {
1059
1042
  const channel = this.channels[channelNumber];
@@ -1066,8 +1049,13 @@ class MidyGM2 {
1066
1049
  updateChannelGain(channel) {
1067
1050
  const now = this.audioContext.currentTime;
1068
1051
  const volume = channel.volume * channel.expression;
1069
- channel.gainNode.gain.cancelScheduledValues(now);
1070
- channel.gainNode.gain.setValueAtTime(volume, now);
1052
+ const { gainLeft, gainRight } = this.panToGain(channel.pan);
1053
+ channel.gainL.gain
1054
+ .cancelScheduledValues(now)
1055
+ .setValueAtTime(volume * gainLeft, now);
1056
+ channel.gainR.gain
1057
+ .cancelScheduledValues(now)
1058
+ .setValueAtTime(volume * gainRight, now);
1071
1059
  }
1072
1060
  setSustainPedal(channelNumber, value) {
1073
1061
  const isOn = value >= 64;
@@ -1099,7 +1087,8 @@ class MidyGM2 {
1099
1087
  const channel = this.channels[channelNumber];
1100
1088
  channel.sostenutoPedal = isOn;
1101
1089
  if (isOn) {
1102
- const activeNotes = this.getActiveNotes(channel);
1090
+ const now = this.audioContext.currentTime;
1091
+ const activeNotes = this.getActiveNotes(channel, now);
1103
1092
  channel.sostenutoNotes = new Map(activeNotes);
1104
1093
  }
1105
1094
  else {
@@ -1110,34 +1099,108 @@ class MidyGM2 {
1110
1099
  const channel = this.channels[channelNumber];
1111
1100
  channel.softPedal = softPedal / 127;
1112
1101
  }
1113
- setRPNMSB(channelNumber, value) {
1114
- this.channels[channelNumber].rpnMSB = value;
1102
+ limitData(channel, minMSB, maxMSB, minLSB, maxLSB) {
1103
+ if (maxLSB < channel.dataLSB) {
1104
+ channel.dataMSB++;
1105
+ channel.dataLSB = minLSB;
1106
+ }
1107
+ else if (channel.dataLSB < 0) {
1108
+ channel.dataMSB--;
1109
+ channel.dataLSB = maxLSB;
1110
+ }
1111
+ if (maxMSB < channel.dataMSB) {
1112
+ channel.dataMSB = maxMSB;
1113
+ channel.dataLSB = maxLSB;
1114
+ }
1115
+ else if (channel.dataMSB < 0) {
1116
+ channel.dataMSB = minMSB;
1117
+ channel.dataLSB = minLSB;
1118
+ }
1115
1119
  }
1116
- setRPNLSB(channelNumber, value) {
1117
- this.channels[channelNumber].rpnLSB = value;
1120
+ limitDataMSB(channel, minMSB, maxMSB) {
1121
+ if (maxMSB < channel.dataMSB) {
1122
+ channel.dataMSB = maxMSB;
1123
+ }
1124
+ else if (channel.dataMSB < 0) {
1125
+ channel.dataMSB = minMSB;
1126
+ }
1118
1127
  }
1119
- setDataEntry(channelNumber, value, isMSB) {
1128
+ handleRPN(channelNumber, value) {
1120
1129
  const channel = this.channels[channelNumber];
1121
1130
  const rpn = channel.rpnMSB * 128 + channel.rpnLSB;
1122
- isMSB ? channel.dataMSB = value : channel.dataLSB = value;
1123
- const { dataMSB, dataLSB } = channel;
1124
1131
  switch (rpn) {
1125
1132
  case 0:
1126
- channel.pitchBendRange = dataMSB + dataLSB / 100;
1133
+ channel.dataLSB += value;
1134
+ this.handlePitchBendRangeMessage(channelNumber);
1127
1135
  break;
1128
1136
  case 1:
1129
- channel.fineTuning = (dataMSB * 128 + dataLSB - 8192) / 8192;
1137
+ channel.dataLSB += value;
1138
+ this.handleFineTuningMessage(channelNumber);
1130
1139
  break;
1131
1140
  case 2:
1132
- channel.coarseTuning = dataMSB - 64;
1133
- break;
1134
- case 5:
1135
- channel.modulationDepthRange = dataMSB + dataLSB / 128;
1141
+ channel.dataMSB += value;
1142
+ this.handleCoarseTuningMessage(channelNumber);
1136
1143
  break;
1137
1144
  default:
1138
1145
  console.warn(`Channel ${channelNumber}: Unsupported RPN MSB=${channel.rpnMSB} LSB=${channel.rpnLSB}`);
1139
1146
  }
1140
1147
  }
1148
+ setRPNMSB(channelNumber, value) {
1149
+ this.channels[channelNumber].rpnMSB = value;
1150
+ }
1151
+ setRPNLSB(channelNumber, value) {
1152
+ this.channels[channelNumber].rpnLSB = value;
1153
+ }
1154
+ setDataEntry(channelNumber, value, isMSB) {
1155
+ const channel = this.channels[channelNumber];
1156
+ isMSB ? channel.dataMSB = value : channel.dataLSB = value;
1157
+ this.handleRPN(channelNumber);
1158
+ }
1159
+ updateDetune(channel, detuneChange) {
1160
+ const now = this.audioContext.currentTime;
1161
+ const activeNotes = this.getActiveNotes(channel, now);
1162
+ activeNotes.forEach((activeNote) => {
1163
+ const { bufferSource } = activeNote;
1164
+ const detune = bufferSource.detune.value + detuneChange;
1165
+ bufferSource.detune
1166
+ .cancelScheduledValues(now)
1167
+ .setValueAtTime(detune, now);
1168
+ });
1169
+ }
1170
+ handlePitchBendRangeMessage(channelNumber) {
1171
+ const channel = this.channels[channelNumber];
1172
+ this.limitData(channel, 0, 127, 0, 99);
1173
+ const pitchBendRange = channel.dataMSB + channel.dataLSB / 100;
1174
+ this.setPitchBendRange(channelNumber, pitchBendRange);
1175
+ }
1176
+ setPitchBendRange(channelNumber, pitchBendRange) {
1177
+ const channel = this.channels[channelNumber];
1178
+ const prevPitchBendRange = channel.pitchBendRange;
1179
+ channel.pitchBendRange = pitchBendRange;
1180
+ const detuneChange = (channel.pitchBendRange - prevPitchBendRange) *
1181
+ channel.pitchBend * 100;
1182
+ this.updateDetune(channel, detuneChange);
1183
+ }
1184
+ handleFineTuningMessage(channelNumber) {
1185
+ const channel = this.channels[channelNumber];
1186
+ this.limitData(channel, 0, 127, 0, 127);
1187
+ const fineTuning = (channel.dataMSB * 128 + channel.dataLSB - 8192) / 8192;
1188
+ this.setFineTuning(channelNumber, fineTuning);
1189
+ }
1190
+ setFineTuning(channelNumber, fineTuning) {
1191
+ const channel = this.channels[channelNumber];
1192
+ channel.fineTuning = fineTuning;
1193
+ }
1194
+ handleCoarseTuningMessage(channelNumber) {
1195
+ const channel = this.channels[channelNumber];
1196
+ this.limitDataMSB(channel, 0, 127);
1197
+ const coarseTuning = channel.dataMSB - 64;
1198
+ this.setFineTuning(channelNumber, coarseTuning);
1199
+ }
1200
+ setCoarseTuning(channelNumber, coarseTuning) {
1201
+ const channel = this.channels[channelNumber];
1202
+ channel.fineTuning = coarseTuning;
1203
+ }
1141
1204
  allSoundOff(channelNumber) {
1142
1205
  const now = this.audioContext.currentTime;
1143
1206
  const channel = this.channels[channelNumber];
@@ -1228,9 +1291,9 @@ class MidyGM2 {
1228
1291
  case 1:
1229
1292
  return this.handleMasterVolumeSysEx(data);
1230
1293
  case 3:
1231
- return this.handleMasterFineTuning(data);
1294
+ return this.handleMasterFineTuningSysEx(data);
1232
1295
  case 4:
1233
- return this.handleMasterCoarseTuning(data);
1296
+ return this.handleMasterCoarseTuningSysEx(data);
1234
1297
  // case 5: // TODO: Global Parameter Control
1235
1298
  default:
1236
1299
  console.warn(`Unsupported Exclusive Message ${data}`);
@@ -1272,9 +1335,9 @@ class MidyGM2 {
1272
1335
  }
1273
1336
  handleMasterVolumeSysEx(data) {
1274
1337
  const volume = (data[5] * 128 + data[4]) / 16383;
1275
- this.handleMasterVolume(volume);
1338
+ this.setMasterVolume(volume);
1276
1339
  }
1277
- handleMasterVolume(volume) {
1340
+ setMasterVolume(volume) {
1278
1341
  if (volume < 0 && 1 < volume) {
1279
1342
  console.error("Master Volume is out of range");
1280
1343
  }
@@ -1286,9 +1349,9 @@ class MidyGM2 {
1286
1349
  }
1287
1350
  handleMasterFineTuningSysEx(data) {
1288
1351
  const fineTuning = (data[5] * 128 + data[4] - 8192) / 8192;
1289
- this.handleMasterFineTuning(fineTuning);
1352
+ this.setMasterFineTuning(fineTuning);
1290
1353
  }
1291
- handleMasterFineTuning(fineTuning) {
1354
+ setMasterFineTuning(fineTuning) {
1292
1355
  if (fineTuning < -1 && 1 < fineTuning) {
1293
1356
  console.error("Master Fine Tuning value is out of range");
1294
1357
  }
@@ -1298,9 +1361,9 @@ class MidyGM2 {
1298
1361
  }
1299
1362
  handleMasterCoarseTuningSysEx(data) {
1300
1363
  const coarseTuning = data[4];
1301
- this.handleMasterCoarseTuning(coarseTuning);
1364
+ this.setMasterCoarseTuning(coarseTuning);
1302
1365
  }
1303
- handleMasterCoarseTuning(coarseTuning) {
1366
+ setMasterCoarseTuning(coarseTuning) {
1304
1367
  if (coarseTuning < 0 && 127 < coarseTuning) {
1305
1368
  console.error("Master Coarse Tuning value is out of range");
1306
1369
  }
@@ -39,8 +39,8 @@ export class MidyGMLite {
39
39
  masterGain: any;
40
40
  channels: {
41
41
  scheduledNotes: Map<any, any>;
42
- gainNode: any;
43
- pannerNode: any;
42
+ gainL: any;
43
+ gainR: any;
44
44
  expression: number;
45
45
  modulation: number;
46
46
  sustainPedal: boolean;
@@ -61,13 +61,13 @@ export class MidyGMLite {
61
61
  loadSoundFont(soundFontUrl: any): Promise<void>;
62
62
  loadMIDI(midiUrl: any): Promise<void>;
63
63
  setChannelAudioNodes(audioContext: any): {
64
- gainNode: any;
65
- pannerNode: any;
64
+ gainL: any;
65
+ gainR: any;
66
66
  };
67
67
  createChannels(audioContext: any): {
68
68
  scheduledNotes: Map<any, any>;
69
- gainNode: any;
70
- pannerNode: any;
69
+ gainL: any;
70
+ gainR: any;
71
71
  expression: number;
72
72
  modulation: number;
73
73
  sustainPedal: boolean;
@@ -122,17 +122,25 @@ export class MidyGMLite {
122
122
  handleMIDIMessage(statusByte: any, data1: any, data2: any): void | any[] | Promise<any>;
123
123
  handleProgramChange(channelNumber: any, program: any): void;
124
124
  handlePitchBendMessage(channelNumber: any, lsb: any, msb: any): void;
125
- handlePitchBend(channelNumber: any, pitchBend: any): void;
125
+ setPitchBend(channelNumber: any, pitchBend: any): void;
126
126
  handleControlChange(channelNumber: any, controller: any, value: any): void | any[];
127
127
  setModulation(channelNumber: any, modulation: any): void;
128
128
  setVolume(channelNumber: any, volume: any): void;
129
+ panToGain(pan: any): {
130
+ gainLeft: number;
131
+ gainRight: number;
132
+ };
129
133
  setPan(channelNumber: any, pan: any): void;
130
134
  setExpression(channelNumber: any, expression: any): void;
131
135
  updateChannelGain(channel: any): void;
132
136
  setSustainPedal(channelNumber: any, value: any): void;
137
+ handleRPN(channelNumber: any): void;
133
138
  setRPNMSB(channelNumber: any, value: any): void;
134
139
  setRPNLSB(channelNumber: any, value: any): void;
135
140
  setDataEntry(channelNumber: any, value: any, isMSB: any): void;
141
+ updateDetune(channel: any, detuneChange: any): void;
142
+ handlePitchBendRangeMessage(channelNumber: any): void;
143
+ setPitchBendRange(channelNumber: any, pitchBendRange: any): void;
136
144
  allSoundOff(channelNumber: any): any[];
137
145
  resetAllControllers(channelNumber: any): void;
138
146
  allNotesOff(channelNumber: any): any[];
@@ -140,7 +148,7 @@ export class MidyGMLite {
140
148
  GM1SystemOn(): void;
141
149
  handleUniversalRealTimeExclusiveMessage(data: any): void;
142
150
  handleMasterVolumeSysEx(data: any): void;
143
- handleMasterVolume(volume: any): void;
151
+ setMasterVolume(volume: any): void;
144
152
  handleExclusiveMessage(data: any): void;
145
153
  handleSysEx(data: any): void;
146
154
  scheduleTask(callback: any, startTime: any): Promise<any>;
@@ -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;;;MAaC;IAED;;;;;;;;;;;;;;;;;;QAUC;IAED,+DAyBC;IAED,mEAWC;IAED,qDAOC;IAED,2EA+CC;IAED,mCAOC;IAED,0BA+CC;IAED,uDAEC;IAED,wDAEC;IAED;;;MAyEC;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,iDAmBC;IAED,iDAiCC;IAED,0DAmBC;IAED,wHA6BC;IAED,kGA6BC;IAED,0EAGC;IAED,sIAmDC;IAED,0FAGC;IAED,kEAeC;IAED,wFAiBC;IAED,4DAGC;IAED,qEAGC;IAED,0DAiBC;IAED,mFA+BC;IAED,yDAiBC;IAED,iDAIC;IAED,2CAMC;IAED,yDAIC;IAED,sCAKC;IAED,sDAMC;IAED,gDAEC;IAED,gDAEC;IAED,+DAcC;IAED,uCAoBC;IAED,8CAEC;IAED,uCAoBC;IAED,4DAgBC;IAED,oBAQC;IAED,yDAaC;IAED,yCAGC;IAED,sCAQC;IAED,wCAEC;IAED,6BASC;IAED,0DAUC;CACF;AA59BD;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"}