@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.
package/esm/midy-GM2.js CHANGED
@@ -225,22 +225,23 @@ export class MidyGM2 {
225
225
  this.totalTime = this.calcTotalTime();
226
226
  }
227
227
  setChannelAudioNodes(audioContext) {
228
- const gainNode = new GainNode(audioContext, {
229
- gain: MidyGM2.channelSettings.volume,
230
- });
231
- const pannerNode = new StereoPannerNode(audioContext, {
232
- pan: MidyGM2.channelSettings.pan,
233
- });
228
+ const { gainLeft, gainRight } = this.panToGain(MidyGM2.channelSettings.pan);
229
+ const gainL = new GainNode(audioContext, { gain: gainLeft });
230
+ const gainR = new GainNode(audioContext, { gain: gainRight });
231
+ const merger = new ChannelMergerNode(audioContext, { numberOfInputs: 2 });
232
+ gainL.connect(merger, 0, 0);
233
+ gainR.connect(merger, 0, 1);
234
+ merger.connect(this.masterGain);
234
235
  const reverbEffect = this.createReverbEffect(audioContext);
235
236
  const chorusEffect = this.createChorusEffect(audioContext);
236
237
  chorusEffect.lfo.start();
237
- reverbEffect.dryGain.connect(pannerNode);
238
- reverbEffect.wetGain.connect(pannerNode);
239
- pannerNode.connect(gainNode);
240
- gainNode.connect(this.masterGain);
238
+ reverbEffect.dryGain.connect(gainL);
239
+ reverbEffect.dryGain.connect(gainR);
240
+ reverbEffect.wetGain.connect(gainL);
241
+ reverbEffect.wetGain.connect(gainR);
241
242
  return {
242
- gainNode,
243
- pannerNode,
243
+ gainL,
244
+ gainR,
244
245
  reverbEffect,
245
246
  chorusEffect,
246
247
  };
@@ -334,7 +335,7 @@ export class MidyGM2 {
334
335
  this.handleChannelPressure(event.channel, event.amount);
335
336
  break;
336
337
  case "pitchBend":
337
- this.handlePitchBend(event.channel, event.value);
338
+ this.setPitchBend(event.channel, event.value);
338
339
  break;
339
340
  case "sysEx":
340
341
  this.handleSysEx(event.data);
@@ -414,7 +415,6 @@ export class MidyGM2 {
414
415
  const tmpChannels = new Array(16);
415
416
  for (let i = 0; i < tmpChannels.length; i++) {
416
417
  tmpChannels[i] = {
417
- durationTicks: new Map(),
418
418
  programNumber: -1,
419
419
  bankMSB: this.channels[i].bankMSB,
420
420
  bankLSB: this.channels[i].bankLSB,
@@ -444,16 +444,6 @@ export class MidyGM2 {
444
444
  }
445
445
  channel.programNumber = 0;
446
446
  }
447
- channel.durationTicks.set(event.noteNumber, {
448
- ticks: event.ticks,
449
- noteOn: event,
450
- });
451
- break;
452
- }
453
- case "noteOff": {
454
- const { ticks, noteOn } = tmpChannels[event.channel].durationTicks
455
- .get(event.noteNumber);
456
- noteOn.durationTicks = event.ticks - ticks;
457
447
  break;
458
448
  }
459
449
  case "controller":
@@ -488,8 +478,8 @@ export class MidyGM2 {
488
478
  });
489
479
  });
490
480
  const priority = {
491
- setTempo: 0,
492
- controller: 1,
481
+ controller: 0,
482
+ sysEx: 1,
493
483
  };
494
484
  timeline.sort((a, b) => {
495
485
  if (a.ticks !== b.ticks)
@@ -627,12 +617,8 @@ export class MidyGM2 {
627
617
  }
628
618
  createChorusEffect(audioContext, options = {}) {
629
619
  const { chorusCount = 2, chorusRate = 0.6, chorusDepth = 0.15, delay = 0.01, variance = delay * 0.1, } = options;
630
- const lfo = new OscillatorNode(audioContext, {
631
- frequency: chorusRate,
632
- });
633
- const lfoGain = new GainNode(audioContext, {
634
- gain: chorusDepth,
635
- });
620
+ const lfo = new OscillatorNode(audioContext, { frequency: chorusRate });
621
+ const lfoGain = new GainNode(audioContext, { gain: chorusDepth });
636
622
  const chorusGains = [];
637
623
  const delayNodes = [];
638
624
  const baseGain = 1 / chorusCount;
@@ -643,9 +629,7 @@ export class MidyGM2 {
643
629
  maxDelayTime: delayTime,
644
630
  });
645
631
  delayNodes.push(delayNode);
646
- const chorusGain = new GainNode(audioContext, {
647
- gain: baseGain,
648
- });
632
+ const chorusGain = new GainNode(audioContext, { gain: baseGain });
649
633
  chorusGains.push(chorusGain);
650
634
  lfo.connect(lfoGain);
651
635
  lfoGain.connect(delayNode.delayTime);
@@ -661,14 +645,16 @@ export class MidyGM2 {
661
645
  connectNoteEffects(channel, gainNode) {
662
646
  if (channel.reverb === 0) {
663
647
  if (channel.chorus === 0) { // no effect
664
- gainNode.connect(channel.pannerNode);
648
+ gainNode.connect(channel.gainL);
649
+ gainNode.connect(channel.gainR);
665
650
  }
666
651
  else { // chorus
667
652
  channel.chorusEffect.delayNodes.forEach((delayNode) => {
668
653
  gainNode.connect(delayNode);
669
654
  });
670
655
  channel.chorusEffect.chorusGains.forEach((chorusGain) => {
671
- chorusGain.connect(channel.pannerNode);
656
+ chorusGain.connect(channel.gainL);
657
+ chorusGain.connect(channel.gainR);
672
658
  });
673
659
  }
674
660
  }
@@ -707,9 +693,7 @@ export class MidyGM2 {
707
693
  }
708
694
  setVolumeEnvelope(channel, note) {
709
695
  const { instrumentKey, startTime, velocity } = note;
710
- note.gainNode = new GainNode(this.audioContext, {
711
- gain: 0,
712
- });
696
+ note.gainNode = new GainNode(this.audioContext, { gain: 0 });
713
697
  let volume = (velocity / 127) * channel.volume * channel.expression;
714
698
  if (volume === 0)
715
699
  volume = 1e-6; // exponentialRampToValueAtTime() requires a non-zero value
@@ -948,21 +932,15 @@ export class MidyGM2 {
948
932
  }
949
933
  handlePitchBendMessage(channelNumber, lsb, msb) {
950
934
  const pitchBend = msb * 128 + lsb;
951
- this.handlePitchBend(channelNumber, pitchBend);
935
+ this.setPitchBend(channelNumber, pitchBend);
952
936
  }
953
- handlePitchBend(channelNumber, pitchBend) {
954
- const now = this.audioContext.currentTime;
937
+ setPitchBend(channelNumber, pitchBend) {
955
938
  const channel = this.channels[channelNumber];
939
+ const prevPitchBend = channel.pitchBend;
956
940
  channel.pitchBend = (pitchBend - 8192) / 8192;
957
- const semitoneOffset = this.calcSemitoneOffset(channel);
958
- const activeNotes = this.getActiveNotes(channel, now);
959
- activeNotes.forEach((activeNote) => {
960
- const { bufferSource, instrumentKey, noteNumber } = activeNote;
961
- const playbackRate = calcPlaybackRate(instrumentKey, noteNumber, semitoneOffset);
962
- bufferSource.playbackRate
963
- .cancelScheduledValues(now)
964
- .setValueAtTime(playbackRate * pressure, now);
965
- });
941
+ const detuneChange = (channel.pitchBend - prevPitchBend) *
942
+ channel.pitchBendRange * 100;
943
+ this.updateDetune(channel, detuneChange);
966
944
  }
967
945
  handleControlChange(channelNumber, controller, value) {
968
946
  switch (controller) {
@@ -997,9 +975,9 @@ export class MidyGM2 {
997
975
  case 93:
998
976
  return this.setChorus(channelNumber, value);
999
977
  case 100:
1000
- return this.setRPNMSB(channelNumber, value);
1001
- case 101:
1002
978
  return this.setRPNLSB(channelNumber, value);
979
+ case 101:
980
+ return this.setRPNMSB(channelNumber, value);
1003
981
  case 120:
1004
982
  return this.allSoundOff(channelNumber);
1005
983
  case 121:
@@ -1045,12 +1023,17 @@ export class MidyGM2 {
1045
1023
  channel.volume = volume / 127;
1046
1024
  this.updateChannelGain(channel);
1047
1025
  }
1026
+ panToGain(pan) {
1027
+ const theta = Math.PI / 2 * Math.max(0, pan - 1) / 126;
1028
+ return {
1029
+ gainLeft: Math.cos(theta),
1030
+ gainRight: Math.sin(theta),
1031
+ };
1032
+ }
1048
1033
  setPan(channelNumber, pan) {
1049
- const now = this.audioContext.currentTime;
1050
1034
  const channel = this.channels[channelNumber];
1051
- channel.pan = pan / 127 * 2 - 1; // -1 (left) - +1 (right)
1052
- channel.pannerNode.pan.cancelScheduledValues(now);
1053
- channel.pannerNode.pan.setValueAtTime(channel.pan, now);
1035
+ channel.pan = pan;
1036
+ this.updateChannelGain(channel);
1054
1037
  }
1055
1038
  setExpression(channelNumber, expression) {
1056
1039
  const channel = this.channels[channelNumber];
@@ -1063,8 +1046,13 @@ export class MidyGM2 {
1063
1046
  updateChannelGain(channel) {
1064
1047
  const now = this.audioContext.currentTime;
1065
1048
  const volume = channel.volume * channel.expression;
1066
- channel.gainNode.gain.cancelScheduledValues(now);
1067
- channel.gainNode.gain.setValueAtTime(volume, now);
1049
+ const { gainLeft, gainRight } = this.panToGain(channel.pan);
1050
+ channel.gainL.gain
1051
+ .cancelScheduledValues(now)
1052
+ .setValueAtTime(volume * gainLeft, now);
1053
+ channel.gainR.gain
1054
+ .cancelScheduledValues(now)
1055
+ .setValueAtTime(volume * gainRight, now);
1068
1056
  }
1069
1057
  setSustainPedal(channelNumber, value) {
1070
1058
  const isOn = value >= 64;
@@ -1096,7 +1084,8 @@ export class MidyGM2 {
1096
1084
  const channel = this.channels[channelNumber];
1097
1085
  channel.sostenutoPedal = isOn;
1098
1086
  if (isOn) {
1099
- const activeNotes = this.getActiveNotes(channel);
1087
+ const now = this.audioContext.currentTime;
1088
+ const activeNotes = this.getActiveNotes(channel, now);
1100
1089
  channel.sostenutoNotes = new Map(activeNotes);
1101
1090
  }
1102
1091
  else {
@@ -1107,34 +1096,108 @@ export class MidyGM2 {
1107
1096
  const channel = this.channels[channelNumber];
1108
1097
  channel.softPedal = softPedal / 127;
1109
1098
  }
1110
- setRPNMSB(channelNumber, value) {
1111
- this.channels[channelNumber].rpnMSB = value;
1099
+ limitData(channel, minMSB, maxMSB, minLSB, maxLSB) {
1100
+ if (maxLSB < channel.dataLSB) {
1101
+ channel.dataMSB++;
1102
+ channel.dataLSB = minLSB;
1103
+ }
1104
+ else if (channel.dataLSB < 0) {
1105
+ channel.dataMSB--;
1106
+ channel.dataLSB = maxLSB;
1107
+ }
1108
+ if (maxMSB < channel.dataMSB) {
1109
+ channel.dataMSB = maxMSB;
1110
+ channel.dataLSB = maxLSB;
1111
+ }
1112
+ else if (channel.dataMSB < 0) {
1113
+ channel.dataMSB = minMSB;
1114
+ channel.dataLSB = minLSB;
1115
+ }
1112
1116
  }
1113
- setRPNLSB(channelNumber, value) {
1114
- this.channels[channelNumber].rpnLSB = value;
1117
+ limitDataMSB(channel, minMSB, maxMSB) {
1118
+ if (maxMSB < channel.dataMSB) {
1119
+ channel.dataMSB = maxMSB;
1120
+ }
1121
+ else if (channel.dataMSB < 0) {
1122
+ channel.dataMSB = minMSB;
1123
+ }
1115
1124
  }
1116
- setDataEntry(channelNumber, value, isMSB) {
1125
+ handleRPN(channelNumber, value) {
1117
1126
  const channel = this.channels[channelNumber];
1118
1127
  const rpn = channel.rpnMSB * 128 + channel.rpnLSB;
1119
- isMSB ? channel.dataMSB = value : channel.dataLSB = value;
1120
- const { dataMSB, dataLSB } = channel;
1121
1128
  switch (rpn) {
1122
1129
  case 0:
1123
- channel.pitchBendRange = dataMSB + dataLSB / 100;
1130
+ channel.dataLSB += value;
1131
+ this.handlePitchBendRangeMessage(channelNumber);
1124
1132
  break;
1125
1133
  case 1:
1126
- channel.fineTuning = (dataMSB * 128 + dataLSB - 8192) / 8192;
1134
+ channel.dataLSB += value;
1135
+ this.handleFineTuningMessage(channelNumber);
1127
1136
  break;
1128
1137
  case 2:
1129
- channel.coarseTuning = dataMSB - 64;
1130
- break;
1131
- case 5:
1132
- channel.modulationDepthRange = dataMSB + dataLSB / 128;
1138
+ channel.dataMSB += value;
1139
+ this.handleCoarseTuningMessage(channelNumber);
1133
1140
  break;
1134
1141
  default:
1135
1142
  console.warn(`Channel ${channelNumber}: Unsupported RPN MSB=${channel.rpnMSB} LSB=${channel.rpnLSB}`);
1136
1143
  }
1137
1144
  }
1145
+ setRPNMSB(channelNumber, value) {
1146
+ this.channels[channelNumber].rpnMSB = value;
1147
+ }
1148
+ setRPNLSB(channelNumber, value) {
1149
+ this.channels[channelNumber].rpnLSB = value;
1150
+ }
1151
+ setDataEntry(channelNumber, value, isMSB) {
1152
+ const channel = this.channels[channelNumber];
1153
+ isMSB ? channel.dataMSB = value : channel.dataLSB = value;
1154
+ this.handleRPN(channelNumber);
1155
+ }
1156
+ updateDetune(channel, detuneChange) {
1157
+ const now = this.audioContext.currentTime;
1158
+ const activeNotes = this.getActiveNotes(channel, now);
1159
+ activeNotes.forEach((activeNote) => {
1160
+ const { bufferSource } = activeNote;
1161
+ const detune = bufferSource.detune.value + detuneChange;
1162
+ bufferSource.detune
1163
+ .cancelScheduledValues(now)
1164
+ .setValueAtTime(detune, now);
1165
+ });
1166
+ }
1167
+ handlePitchBendRangeMessage(channelNumber) {
1168
+ const channel = this.channels[channelNumber];
1169
+ this.limitData(channel, 0, 127, 0, 99);
1170
+ const pitchBendRange = channel.dataMSB + channel.dataLSB / 100;
1171
+ this.setPitchBendRange(channelNumber, pitchBendRange);
1172
+ }
1173
+ setPitchBendRange(channelNumber, pitchBendRange) {
1174
+ const channel = this.channels[channelNumber];
1175
+ const prevPitchBendRange = channel.pitchBendRange;
1176
+ channel.pitchBendRange = pitchBendRange;
1177
+ const detuneChange = (channel.pitchBendRange - prevPitchBendRange) *
1178
+ channel.pitchBend * 100;
1179
+ this.updateDetune(channel, detuneChange);
1180
+ }
1181
+ handleFineTuningMessage(channelNumber) {
1182
+ const channel = this.channels[channelNumber];
1183
+ this.limitData(channel, 0, 127, 0, 127);
1184
+ const fineTuning = (channel.dataMSB * 128 + channel.dataLSB - 8192) / 8192;
1185
+ this.setFineTuning(channelNumber, fineTuning);
1186
+ }
1187
+ setFineTuning(channelNumber, fineTuning) {
1188
+ const channel = this.channels[channelNumber];
1189
+ channel.fineTuning = fineTuning;
1190
+ }
1191
+ handleCoarseTuningMessage(channelNumber) {
1192
+ const channel = this.channels[channelNumber];
1193
+ this.limitDataMSB(channel, 0, 127);
1194
+ const coarseTuning = channel.dataMSB - 64;
1195
+ this.setFineTuning(channelNumber, coarseTuning);
1196
+ }
1197
+ setCoarseTuning(channelNumber, coarseTuning) {
1198
+ const channel = this.channels[channelNumber];
1199
+ channel.fineTuning = coarseTuning;
1200
+ }
1138
1201
  allSoundOff(channelNumber) {
1139
1202
  const now = this.audioContext.currentTime;
1140
1203
  const channel = this.channels[channelNumber];
@@ -1225,9 +1288,9 @@ export class MidyGM2 {
1225
1288
  case 1:
1226
1289
  return this.handleMasterVolumeSysEx(data);
1227
1290
  case 3:
1228
- return this.handleMasterFineTuning(data);
1291
+ return this.handleMasterFineTuningSysEx(data);
1229
1292
  case 4:
1230
- return this.handleMasterCoarseTuning(data);
1293
+ return this.handleMasterCoarseTuningSysEx(data);
1231
1294
  // case 5: // TODO: Global Parameter Control
1232
1295
  default:
1233
1296
  console.warn(`Unsupported Exclusive Message ${data}`);
@@ -1269,9 +1332,9 @@ export class MidyGM2 {
1269
1332
  }
1270
1333
  handleMasterVolumeSysEx(data) {
1271
1334
  const volume = (data[5] * 128 + data[4]) / 16383;
1272
- this.handleMasterVolume(volume);
1335
+ this.setMasterVolume(volume);
1273
1336
  }
1274
- handleMasterVolume(volume) {
1337
+ setMasterVolume(volume) {
1275
1338
  if (volume < 0 && 1 < volume) {
1276
1339
  console.error("Master Volume is out of range");
1277
1340
  }
@@ -1283,9 +1346,9 @@ export class MidyGM2 {
1283
1346
  }
1284
1347
  handleMasterFineTuningSysEx(data) {
1285
1348
  const fineTuning = (data[5] * 128 + data[4] - 8192) / 8192;
1286
- this.handleMasterFineTuning(fineTuning);
1349
+ this.setMasterFineTuning(fineTuning);
1287
1350
  }
1288
- handleMasterFineTuning(fineTuning) {
1351
+ setMasterFineTuning(fineTuning) {
1289
1352
  if (fineTuning < -1 && 1 < fineTuning) {
1290
1353
  console.error("Master Fine Tuning value is out of range");
1291
1354
  }
@@ -1295,9 +1358,9 @@ export class MidyGM2 {
1295
1358
  }
1296
1359
  handleMasterCoarseTuningSysEx(data) {
1297
1360
  const coarseTuning = data[4];
1298
- this.handleMasterCoarseTuning(coarseTuning);
1361
+ this.setMasterCoarseTuning(coarseTuning);
1299
1362
  }
1300
- handleMasterCoarseTuning(coarseTuning) {
1363
+ setMasterCoarseTuning(coarseTuning) {
1301
1364
  if (coarseTuning < 0 && 127 < coarseTuning) {
1302
1365
  console.error("Master Coarse Tuning value is out of range");
1303
1366
  }
@@ -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"}