@marmooo/midy 0.3.7 → 0.3.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.
@@ -216,7 +216,7 @@ class MidyGMLite {
216
216
  enumerable: true,
217
217
  configurable: true,
218
218
  writable: true,
219
- value: this.initSoundFontTable()
219
+ value: Array.from({ length: 128 }, () => [])
220
220
  });
221
221
  Object.defineProperty(this, "voiceCounter", {
222
222
  enumerable: true,
@@ -303,6 +303,7 @@ class MidyGMLite {
303
303
  length: 1,
304
304
  sampleRate: audioContext.sampleRate,
305
305
  });
306
+ this.messageHandlers = this.createMessageHandlers();
306
307
  this.voiceParamsHandlers = this.createVoiceParamsHandlers();
307
308
  this.controlChangeHandlers = this.createControlChangeHandlers();
308
309
  this.channels = this.createChannels(audioContext);
@@ -310,21 +311,14 @@ class MidyGMLite {
310
311
  this.scheduler.connect(audioContext.destination);
311
312
  this.GM1SystemOn();
312
313
  }
313
- initSoundFontTable() {
314
- const table = new Array(128);
315
- for (let i = 0; i < 128; i++) {
316
- table[i] = new Map();
317
- }
318
- return table;
319
- }
320
314
  addSoundFont(soundFont) {
321
315
  const index = this.soundFonts.length;
322
316
  this.soundFonts.push(soundFont);
323
317
  const presetHeaders = soundFont.parsed.presetHeaders;
318
+ const soundFontTable = this.soundFontTable;
324
319
  for (let i = 0; i < presetHeaders.length; i++) {
325
- const presetHeader = presetHeaders[i];
326
- const banks = this.soundFontTable[presetHeader.preset];
327
- banks.set(presetHeader.bank, index);
320
+ const { preset, bank } = presetHeaders[i];
321
+ soundFontTable[preset][bank] = index;
328
322
  }
329
323
  }
330
324
  async toUint8Array(input) {
@@ -402,13 +396,16 @@ class MidyGMLite {
402
396
  this.GM1SystemOn();
403
397
  }
404
398
  getVoiceId(channel, noteNumber, velocity) {
405
- const bankNumber = this.calcBank(channel);
406
- const soundFontIndex = this.soundFontTable[channel.programNumber]
407
- .get(bankNumber);
399
+ const programNumber = channel.programNumber;
400
+ const bankTable = this.soundFontTable[programNumber];
401
+ if (!bankTable)
402
+ return;
403
+ const bank = channel.isDrum ? 128 : 0;
404
+ const soundFontIndex = bankTable[bank];
408
405
  if (soundFontIndex === undefined)
409
406
  return;
410
407
  const soundFont = this.soundFonts[soundFontIndex];
411
- const voice = soundFont.getVoice(bankNumber, channel.programNumber, noteNumber, velocity);
408
+ const voice = soundFont.getVoice(bank, programNumber, noteNumber, velocity);
412
409
  const { instrument, sampleID } = voice.generators;
413
410
  return soundFontIndex * (2 ** 32) + (instrument << 16) + sampleID;
414
411
  }
@@ -459,13 +456,16 @@ class MidyGMLite {
459
456
  }
460
457
  return bufferSource;
461
458
  }
462
- async scheduleTimelineEvents(t, resumeTime, queueIndex) {
463
- while (queueIndex < this.timeline.length) {
464
- const event = this.timeline[queueIndex];
465
- if (event.startTime > t + this.lookAhead)
459
+ async scheduleTimelineEvents(scheduleTime, queueIndex) {
460
+ const timeOffset = this.resumeTime - this.startTime;
461
+ const lookAheadCheckTime = scheduleTime + timeOffset + this.lookAhead;
462
+ const schedulingOffset = this.startDelay - timeOffset;
463
+ const timeline = this.timeline;
464
+ while (queueIndex < timeline.length) {
465
+ const event = timeline[queueIndex];
466
+ if (lookAheadCheckTime < event.startTime)
466
467
  break;
467
- const delay = this.startDelay - resumeTime;
468
- const startTime = event.startTime + delay;
468
+ const startTime = event.startTime + schedulingOffset;
469
469
  switch (event.type) {
470
470
  case "noteOn":
471
471
  await this.scheduleNoteOn(event.channel, event.noteNumber, event.velocity, startTime);
@@ -537,13 +537,11 @@ class MidyGMLite {
537
537
  this.isPaused = false;
538
538
  this.startTime = this.audioContext.currentTime;
539
539
  let queueIndex = this.getQueueIndex(this.resumeTime);
540
- let resumeTime = this.resumeTime - this.startTime;
541
540
  let finished = false;
542
541
  this.notePromises = [];
543
542
  while (queueIndex < this.timeline.length) {
544
543
  const now = this.audioContext.currentTime;
545
- const t = now + resumeTime;
546
- queueIndex = await this.scheduleTimelineEvents(t, resumeTime, queueIndex);
544
+ queueIndex = await this.scheduleTimelineEvents(now, queueIndex);
547
545
  if (this.isPausing) {
548
546
  await this.stopNotes(0, true, now);
549
547
  await this.audioContext.suspend();
@@ -562,7 +560,6 @@ class MidyGMLite {
562
560
  const nextQueueIndex = this.getQueueIndex(this.resumeTime);
563
561
  this.updateStates(queueIndex, nextQueueIndex);
564
562
  queueIndex = nextQueueIndex;
565
- resumeTime = this.resumeTime - this.startTime;
566
563
  this.isSeeking = false;
567
564
  continue;
568
565
  }
@@ -581,16 +578,16 @@ class MidyGMLite {
581
578
  secondToTicks(second, secondsPerBeat) {
582
579
  return second * this.ticksPerBeat / secondsPerBeat;
583
580
  }
581
+ getSoundFontId(channel) {
582
+ const programNumber = channel.programNumber;
583
+ const bank = channel.isDrum ? "128" : "000";
584
+ const program = programNumber.toString().padStart(3, "0");
585
+ return `${bank}:${program}`;
586
+ }
584
587
  extractMidiData(midi) {
585
588
  const instruments = new Set();
586
589
  const timeline = [];
587
- const tmpChannels = new Array(this.channels.length);
588
- for (let i = 0; i < tmpChannels.length; i++) {
589
- tmpChannels[i] = {
590
- programNumber: -1,
591
- bank: this.channels[i].bank,
592
- };
593
- }
590
+ const channels = this.channels;
594
591
  for (let i = 0; i < midi.tracks.length; i++) {
595
592
  const track = midi.tracks[i];
596
593
  let currentTicks = 0;
@@ -600,17 +597,15 @@ class MidyGMLite {
600
597
  event.ticks = currentTicks;
601
598
  switch (event.type) {
602
599
  case "noteOn": {
603
- const channel = tmpChannels[event.channel];
604
- if (channel.programNumber < 0) {
605
- instruments.add(`${channel.bank}:0`);
606
- channel.programNumber = 0;
607
- }
600
+ const channel = channels[event.channel];
601
+ instruments.add(this.getSoundFontId(channel));
608
602
  break;
609
603
  }
610
604
  case "programChange": {
611
- const channel = tmpChannels[event.channel];
612
- channel.programNumber = event.programNumber;
613
- instruments.add(`${channel.bankNumber}:${channel.programNumber}`);
605
+ const channel = channels[event.channel];
606
+ this.setProgramChange(event.channel, event.programNumber);
607
+ instruments.add(this.getSoundFontId(channel));
608
+ break;
614
609
  }
615
610
  }
616
611
  delete event.deltaTime;
@@ -880,7 +875,7 @@ class MidyGMLite {
880
875
  const voiceParams = voice.getAllParams(controllerState);
881
876
  const note = new Note(noteNumber, velocity, startTime, voice, voiceParams);
882
877
  const audioBuffer = await this.getAudioBuffer(channel, noteNumber, velocity, voiceParams);
883
- note.bufferSource = this.createBufferSource(voiceParams, audioBuffer);
878
+ note.bufferSource = this.createBufferSource(channel, voiceParams, audioBuffer);
884
879
  note.volumeEnvelopeNode = new GainNode(this.audioContext);
885
880
  note.filterNode = new BiquadFilterNode(this.audioContext, {
886
881
  type: "lowpass",
@@ -916,7 +911,7 @@ class MidyGMLite {
916
911
  const channel = this.channels[channelNumber];
917
912
  if (!channel.isDrum)
918
913
  return;
919
- const drumExclusiveClass = drumExclusiveClasses[noteNumber];
914
+ const drumExclusiveClass = drumExclusiveClasses[note.noteNumber];
920
915
  if (drumExclusiveClass === 0)
921
916
  return;
922
917
  const index = drumExclusiveClass * this.channels.length + channelNumber;
@@ -929,13 +924,16 @@ class MidyGMLite {
929
924
  }
930
925
  async scheduleNoteOn(channelNumber, noteNumber, velocity, startTime) {
931
926
  const channel = this.channels[channelNumber];
932
- const bankNumber = channel.bank;
933
- const soundFontIndex = this.soundFontTable[channel.programNumber]
934
- .get(bankNumber);
927
+ const programNumber = channel.programNumber;
928
+ const bankTable = this.soundFontTable[programNumber];
929
+ if (!bankTable)
930
+ return;
931
+ const bank = channel.isDrum ? 128 : 0;
932
+ const soundFontIndex = bankTable[bank];
935
933
  if (soundFontIndex === undefined)
936
934
  return;
937
935
  const soundFont = this.soundFonts[soundFontIndex];
938
- const voice = soundFont.getVoice(bankNumber, channel.programNumber, noteNumber, velocity);
936
+ const voice = soundFont.getVoice(bank, programNumber, noteNumber, velocity);
939
937
  if (!voice)
940
938
  return;
941
939
  const note = await this.createNote(channel, voice, noteNumber, velocity, startTime);
@@ -1042,7 +1040,26 @@ class MidyGMLite {
1042
1040
  channel.sustainNotes = [];
1043
1041
  return promises;
1044
1042
  }
1045
- handleMIDIMessage(statusByte, data1, data2, scheduleTime) {
1043
+ createMessageHandlers() {
1044
+ const handlers = new Array(256);
1045
+ // Channel Message
1046
+ handlers[0x80] = (data, scheduleTime) => this.noteOff(data[0] & 0x0F, data[1], data[2], scheduleTime);
1047
+ handlers[0x90] = (data, scheduleTime) => this.noteOn(data[0] & 0x0F, data[1], data[2], scheduleTime);
1048
+ handlers[0xB0] = (data, scheduleTime) => this.setControlChange(data[0] & 0x0F, data[1], data[2], scheduleTime);
1049
+ handlers[0xC0] = (data, scheduleTime) => this.setProgramChange(data[0] & 0x0F, data[1], scheduleTime);
1050
+ handlers[0xE0] = (data, scheduleTime) => this.handlePitchBendMessage(data[0] & 0x0F, data[1], data[2], scheduleTime);
1051
+ return handlers;
1052
+ }
1053
+ handleMessage(data, scheduleTime) {
1054
+ const status = data[0];
1055
+ if (status === 0xF0) {
1056
+ return this.handleSysEx(data.subarray(1), scheduleTime);
1057
+ }
1058
+ const handler = this.messageHandlers[status];
1059
+ if (handler)
1060
+ handler(data, scheduleTime);
1061
+ }
1062
+ handleChannelMessage(statusByte, data1, data2, scheduleTime) {
1046
1063
  const channelNumber = statusByte & 0x0F;
1047
1064
  const messageType = statusByte & 0xF0;
1048
1065
  switch (messageType) {
@@ -1425,10 +1442,8 @@ class MidyGMLite {
1425
1442
  for (let i = 0; i < this.channels.length; i++) {
1426
1443
  this.allSoundOff(i, 0, scheduleTime);
1427
1444
  const channel = this.channels[i];
1428
- channel.bank = 0;
1429
1445
  channel.isDrum = false;
1430
1446
  }
1431
- this.channels[9].bank = 128;
1432
1447
  this.channels[9].isDrum = true;
1433
1448
  }
1434
1449
  handleUniversalRealTimeExclusiveMessage(data, scheduleTime) {
@@ -1449,16 +1464,11 @@ class MidyGMLite {
1449
1464
  const volume = (data[5] * 128 + data[4]) / 16383;
1450
1465
  this.setMasterVolume(volume, scheduleTime);
1451
1466
  }
1452
- setMasterVolume(volume, scheduleTime) {
1467
+ setMasterVolume(value, scheduleTime) {
1453
1468
  scheduleTime ??= this.audioContext.currentTime;
1454
- if (volume < 0 && 1 < volume) {
1455
- console.error("Master Volume is out of range");
1456
- }
1457
- else {
1458
- this.masterVolume.gain
1459
- .cancelScheduledValues(scheduleTime)
1460
- .setValueAtTime(volume * volume, scheduleTime);
1461
- }
1469
+ this.masterVolume.gain
1470
+ .cancelScheduledValues(scheduleTime)
1471
+ .setValueAtTime(value * value, scheduleTime);
1462
1472
  }
1463
1473
  handleSysEx(data, scheduleTime) {
1464
1474
  switch (data[0]) {
@@ -1499,7 +1509,6 @@ Object.defineProperty(MidyGMLite, "channelSettings", {
1499
1509
  scheduleIndex: 0,
1500
1510
  detune: 0,
1501
1511
  programNumber: 0,
1502
- bank: 0,
1503
1512
  dataMSB: 0,
1504
1513
  dataLSB: 0,
1505
1514
  rpnMSB: 127,
package/script/midy.d.ts CHANGED
@@ -3,7 +3,6 @@ export class Midy {
3
3
  scheduleIndex: number;
4
4
  detune: number;
5
5
  programNumber: number;
6
- bank: number;
7
6
  bankMSB: number;
8
7
  bankLSB: number;
9
8
  dataMSB: number;
@@ -34,13 +33,15 @@ export class Midy {
34
33
  numChannels: number;
35
34
  ticksPerBeat: number;
36
35
  totalTime: number;
36
+ lastActiveSensing: number;
37
+ activeSensingThreshold: number;
37
38
  noteCheckInterval: number;
38
39
  lookAhead: number;
39
40
  startDelay: number;
40
41
  startTime: number;
41
42
  resumeTime: number;
42
43
  soundFonts: any[];
43
- soundFontTable: any[];
44
+ soundFontTable: never[][];
44
45
  voiceCounter: Map<any, any>;
45
46
  voiceCache: Map<any, any>;
46
47
  isPlaying: boolean;
@@ -58,6 +59,7 @@ export class Midy {
58
59
  masterVolume: any;
59
60
  scheduler: any;
60
61
  schedulerBuffer: any;
62
+ messageHandlers: any[];
61
63
  voiceParamsHandlers: {
62
64
  modLfoToPitch: (channel: any, note: any, scheduleTime: any) => void;
63
65
  vibLfoToPitch: (channel: any, note: any, scheduleTime: any) => void;
@@ -71,6 +73,7 @@ export class Midy {
71
73
  freqVibLFO: (channel: any, note: any, scheduleTime: any) => void;
72
74
  };
73
75
  controlChangeHandlers: any[];
76
+ keyBasedControllerHandlers: any[];
74
77
  channels: any[];
75
78
  reverbEffect: {
76
79
  input: any;
@@ -85,7 +88,6 @@ export class Midy {
85
88
  delayNodes: any[];
86
89
  feedbackGains: any[];
87
90
  };
88
- initSoundFontTable(): any[];
89
91
  addSoundFont(soundFont: any): void;
90
92
  toUint8Array(input: any): Promise<Uint8Array<ArrayBuffer>>;
91
93
  loadSoundFont(input: any): Promise<void>;
@@ -102,13 +104,14 @@ export class Midy {
102
104
  createAudioBuffer(voiceParams: any): Promise<any>;
103
105
  isLoopDrum(channel: any, noteNumber: any): boolean;
104
106
  createBufferSource(channel: any, noteNumber: any, voiceParams: any, audioBuffer: any): any;
105
- scheduleTimelineEvents(t: any, resumeTime: any, queueIndex: any): Promise<any>;
107
+ scheduleTimelineEvents(scheduleTime: any, queueIndex: any): Promise<any>;
106
108
  getQueueIndex(second: any): number;
107
109
  resetAllStates(): void;
108
110
  updateStates(queueIndex: any, nextQueueIndex: any): void;
109
111
  playNotes(): Promise<void>;
110
112
  ticksToSecond(ticks: any, secondsPerBeat: any): number;
111
113
  secondToTicks(second: any, secondsPerBeat: any): number;
114
+ getSoundFontId(channel: any): string;
112
115
  extractMidiData(midi: any): {
113
116
  instruments: Set<any>;
114
117
  timeline: any[];
@@ -172,7 +175,6 @@ export class Midy {
172
175
  startVibrato(channel: any, note: any, scheduleTime: any): void;
173
176
  getAudioBuffer(channel: any, noteNumber: any, velocity: any, voiceParams: any): Promise<any>;
174
177
  createNote(channel: any, voice: any, noteNumber: any, velocity: any, startTime: any): Promise<Note>;
175
- calcBank(channel: any): any;
176
178
  handleExclusiveClass(note: any, channelNumber: any, startTime: any): void;
177
179
  handleDrumExclusiveClass(note: any, channelNumber: any, startTime: any): void;
178
180
  scheduleNoteOn(channelNumber: any, noteNumber: any, velocity: any, startTime: any): Promise<void>;
@@ -185,7 +187,9 @@ export class Midy {
185
187
  noteOff(channelNumber: any, noteNumber: any, velocity: any, scheduleTime: any): void;
186
188
  releaseSustainPedal(channelNumber: any, halfVelocity: any, scheduleTime: any): void[];
187
189
  releaseSostenutoPedal(channelNumber: any, halfVelocity: any, scheduleTime: any): void[];
188
- handleMIDIMessage(statusByte: any, data1: any, data2: any, scheduleTime: any): void | Promise<void>;
190
+ createMessageHandlers(): any[];
191
+ handleMessage(data: any, scheduleTime: any): void;
192
+ activeSensing(): void;
189
193
  setPolyphonicKeyPressure(channelNumber: any, noteNumber: any, pressure: any, scheduleTime: any): void;
190
194
  setProgramChange(channelNumber: any, programNumber: any, _scheduleTime: any): void;
191
195
  setChannelPressure(channelNumber: any, value: any, scheduleTime: any): void;
@@ -234,6 +238,7 @@ export class Midy {
234
238
  updateChannelVolume(channel: any, scheduleTime: any): void;
235
239
  updateKeyBasedVolume(channel: any, keyNumber: any, scheduleTime: any): void;
236
240
  setSustainPedal(channelNumber: any, value: any, scheduleTime: any): void;
241
+ isPortamento(channel: any, note: any): boolean;
237
242
  setPortamento(channelNumber: any, value: any, scheduleTime: any): void;
238
243
  setSostenutoPedal(channelNumber: any, value: any, scheduleTime: any): void;
239
244
  getSoftPedalFactor(channel: any, note: any): number;
@@ -278,7 +283,7 @@ export class Midy {
278
283
  GM2SystemOn(scheduleTime: any): void;
279
284
  handleUniversalRealTimeExclusiveMessage(data: any, scheduleTime: any): void;
280
285
  handleMasterVolumeSysEx(data: any, scheduleTime: any): void;
281
- setMasterVolume(volume: any, scheduleTime: any): void;
286
+ setMasterVolume(value: any, scheduleTime: any): void;
282
287
  handleMasterFineTuningSysEx(data: any, scheduleTime: any): void;
283
288
  setMasterFineTuning(value: any, scheduleTime: any): void;
284
289
  handleMasterCoarseTuningSysEx(data: any, scheduleTime: any): void;
@@ -316,6 +321,7 @@ export class Midy {
316
321
  setControlChangeEffects(channel: any, controllerType: any, scheduleTime: any): void;
317
322
  handleControlChangeSysEx(data: any, scheduleTime: any): void;
318
323
  getKeyBasedValue(channel: any, keyNumber: any, controllerType: any): any;
324
+ createKeyBasedControllerHandlers(): any[];
319
325
  handleKeyBasedInstrumentControlSysEx(data: any, scheduleTime: any): void;
320
326
  handleSysEx(data: any, scheduleTime: any): void;
321
327
  scheduleTask(callback: any, scheduleTime: any): Promise<any>;
@@ -1 +1 @@
1
- {"version":3,"file":"midy.d.ts","sourceRoot":"","sources":["../src/midy.js"],"names":[],"mappings":"AA4JA;IA0CE;;;;;;;;;;;;;;;MAeE;IAEF,+BAkBC;IA5ED,aAAa;IACb,yBAAqB;IACrB,2BAAuB;IACvB;;;;MAIE;IACF;;;;;;MAME;IACF,oBAAiB;IACjB,qBAAmB;IACnB,kBAAc;IACd,0BAAwB;IACxB,kBAAc;IACd,mBAAiB;IACjB,kBAAc;IACd,mBAAe;IACf,kBAAgB;IAChB,sBAA2C;IAC3C,4BAAyB;IACzB,0BAAuB;IACvB,mBAAkB;IAClB,mBAAkB;IAClB,kBAAiB;IACjB,oBAAmB;IACnB,mBAAkB;IAClB,iBAAY;IACZ,gBAAc;IACd,oBAAkB;IAClB,sBAAwB;IACxB,2BAAqC;IACrC,+BAEE;IAoBA,kBAAgC;IAChC,kBAA8C;IAC9C,eAAwD;IACxD,qBAGE;IACF;;;;;;;;;;;MAA2D;IAC3D,6BAA+D;IAC/D,gBAAiD;IACjD;;;kBAAyD;IACzD;;;;;;;;MAAyD;IAQ3D,4BAMC;IAED,mCASC;IAED,2DAYC;IAED,yCAmBC;IAED,oCASC;IAED,sBAoCC;IAED,8DAcC;IAED;;;;MAeC;IAED,sCAMC;IAED,yCAqBC;IAED,kDAUC;IAED,mDAIC;IAED,2FAWC;IAED,+EA6DC;IAED,mCAOC;IAED,uBAQC;IAED,yDA2BC;IAED,2BA+CC;IAED,uDAEC;IAED,wDAEC;IAED;;;MAoGC;IAED,kGAeC;IAED,mGAeC;IAED,wEAMC;IAED,uBAMC;IAED,sBAKC;IAED,uBAQC;IAED,wBAKC;IAED,0BAKC;IAED,wBAOC;IAED,sBAGC;IAED,yDAQC;IAED,yEASC;IAED,kFAuBC;IAED;;;;MASC;IAED,gFAUC;IAED,mFAYC;IAED,sGAcC;IAID;;;MA8BC;IAED;;;kBA6BC;IAED;;;;;;;;MA0CC;IAED,2BAEC;IAED,8BAEC;IAED,8BAEC;IAED,4BAEC;IAED,qCAkBC;IAED,6CAEC;IAED,2DAIC;IAED,+DAiBC;IAED,mDAIC;IAED,2CAoDC;IAED,8EAYC;IAED,oEAkBC;IAED,+DAKC;IAED,qDAoBC;IAED,6CAIC;IAED,8EAqBC;IAED,oEAyBC;IAED,kEAoBC;IAED,+DAcC;IAED,6FAyBC;IAED,oGAmEC;IAED,4BAYC;IAED,0EAiBC;IAED,8EAoBC;IAED,kGAiDC;IAED,6FASC;IAED,gCAmBC;IAED,iEAqBC;IAED,qGAuBC;IAED,6CAUC;IAED,qDAUC;IAED,qFASC;IAED,sFAeC;IAED,wFAkBC;IAED,oGAoCC;IAED,sGAeC;IAED,mFAeC;IAED,4EAgBC;IAED,wFAGC;IAED,sEAWC;IAED,mEAYC;IAED,mEAaC;IAED,sEAMC;IAED,oEAQC;IAED,gEAyBC;IAED,gEAyBC;IAED,gCAKC;IAED,kDAKC;IAED,gEAMC;IAED,8CAOC;IAED;;;;;;;;;;;MAiDC;IAED,gHAQC;IAED,6EAgCC;IAED,qCAqCC;IAED,+FAYC;IAED,+CAEC;IAED,wDASC;IAED,iFAMC;IAED,wDAkBC;IAED,oFAMC;IAED,oEAWC;IAED;;;MAMC;IAED,8DAWC;IAED,4EAKC;IAED,+CAEC;IAED,sEAGC;IAED,2DAUC;IAED,4EAoBC;IAED,yEAYC;IAED,uEAMC;IAED,2EAcC;IAED,oDAEC;IAED,0EAeC;IAED,8EAWC;IAED,4EAUC;IAED,8EAKC;IAED,4EAUC;IAED,4EAaC;IAED,0EAQC;IAED,8EASC;IAED,gFAeC;IAED,gFAUC;IAED,sFAQC;IAED,sFAQC;IAED,kFAeC;IAED,2DAMC;IAED,mEAyBC;IAGD,2DAGC;IAGD,2DAGC;IAED,gDAEC;IAED,gDAEC;IAED,sEAGC;IAED,qEAKC;IAED,2EAWC;IAED,iEAMC;IAED,uEASC;IAED,mEAKC;IAED,yEASC;IAED,2EAKC;IAED,iFAMC;IAED,gFAGC;IAED,6CAwBC;IAGD,8EAqCC;IAED,gFAGC;IAED,iEAEC;IAED,gEAEC;IAED,gEAIC;IAED,gEAIC;IAED,+EAuCC;IAED,qCAcC;IAED,qCAcC;IAED,4EAqEC;IAED,4DAGC;IAED,sDASC;IAED,gEAIC;IAED,yDAWC;IAED,kEAGC;IAED,2DAWC;IAED,sEAeC;IAED,4CAOC;IAED,+BAIC;IAED,qDAiBC;IAED,gCAGC;IAED,kCAEC;IA6BD,4CAEC;IAED,+DAaC;IAED,kDAiBC;IAED,2GAKC;IAED,sDAIC;IAED,qCAEC;IAED,uDAMC;IAED,sCAEC;IAED,uDASC;IAED,sCAEC;IAED,2DAqBC;IAED,0CAEC;IAED,mCAeC;IAED,2FAgBC;IAED,2FAoBC;IAED,iDAMC;IAED,wDAUC;IAED,qDAUC;IAED,kDAUC;IAED,mDAUC;IAED,sDAUC;IAED,yEAgBC;IAED,wEAaC;IAED,2CAIC;IAED,oFAOC;IAED,6DAcC;IAED,yEAIC;IAED,yEAwGC;IAED,gDAYC;IAGD,6DAgBC;CACF;AAzvGD;IAiBE,0FAMC;IAtBD,cAAW;IACX,gBAAe;IACf,kBAAa;IACb,gBAAW;IACX,iBAAY;IACZ,wBAAmB;IACnB,iBAAY;IACZ,mBAAc;IACd,qBAAgB;IAChB,gBAAW;IACX,kBAAa;IACb,gBAAW;IACX,gBAAW;IACX,6BAA0B;IAC1B,iBAAa;IAGX,gBAA4B;IAC5B,cAAwB;IACxB,eAA0B;IAC1B,WAAkB;IAClB,iBAA8B;CAEjC"}
1
+ {"version":3,"file":"midy.d.ts","sourceRoot":"","sources":["../src/midy.js"],"names":[],"mappings":"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"}