@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.
@@ -213,7 +213,7 @@ export class MidyGMLite {
213
213
  enumerable: true,
214
214
  configurable: true,
215
215
  writable: true,
216
- value: this.initSoundFontTable()
216
+ value: Array.from({ length: 128 }, () => [])
217
217
  });
218
218
  Object.defineProperty(this, "voiceCounter", {
219
219
  enumerable: true,
@@ -300,6 +300,7 @@ export class MidyGMLite {
300
300
  length: 1,
301
301
  sampleRate: audioContext.sampleRate,
302
302
  });
303
+ this.messageHandlers = this.createMessageHandlers();
303
304
  this.voiceParamsHandlers = this.createVoiceParamsHandlers();
304
305
  this.controlChangeHandlers = this.createControlChangeHandlers();
305
306
  this.channels = this.createChannels(audioContext);
@@ -307,21 +308,14 @@ export class MidyGMLite {
307
308
  this.scheduler.connect(audioContext.destination);
308
309
  this.GM1SystemOn();
309
310
  }
310
- initSoundFontTable() {
311
- const table = new Array(128);
312
- for (let i = 0; i < 128; i++) {
313
- table[i] = new Map();
314
- }
315
- return table;
316
- }
317
311
  addSoundFont(soundFont) {
318
312
  const index = this.soundFonts.length;
319
313
  this.soundFonts.push(soundFont);
320
314
  const presetHeaders = soundFont.parsed.presetHeaders;
315
+ const soundFontTable = this.soundFontTable;
321
316
  for (let i = 0; i < presetHeaders.length; i++) {
322
- const presetHeader = presetHeaders[i];
323
- const banks = this.soundFontTable[presetHeader.preset];
324
- banks.set(presetHeader.bank, index);
317
+ const { preset, bank } = presetHeaders[i];
318
+ soundFontTable[preset][bank] = index;
325
319
  }
326
320
  }
327
321
  async toUint8Array(input) {
@@ -399,13 +393,16 @@ export class MidyGMLite {
399
393
  this.GM1SystemOn();
400
394
  }
401
395
  getVoiceId(channel, noteNumber, velocity) {
402
- const bankNumber = this.calcBank(channel);
403
- const soundFontIndex = this.soundFontTable[channel.programNumber]
404
- .get(bankNumber);
396
+ const programNumber = channel.programNumber;
397
+ const bankTable = this.soundFontTable[programNumber];
398
+ if (!bankTable)
399
+ return;
400
+ const bank = channel.isDrum ? 128 : 0;
401
+ const soundFontIndex = bankTable[bank];
405
402
  if (soundFontIndex === undefined)
406
403
  return;
407
404
  const soundFont = this.soundFonts[soundFontIndex];
408
- const voice = soundFont.getVoice(bankNumber, channel.programNumber, noteNumber, velocity);
405
+ const voice = soundFont.getVoice(bank, programNumber, noteNumber, velocity);
409
406
  const { instrument, sampleID } = voice.generators;
410
407
  return soundFontIndex * (2 ** 32) + (instrument << 16) + sampleID;
411
408
  }
@@ -456,13 +453,16 @@ export class MidyGMLite {
456
453
  }
457
454
  return bufferSource;
458
455
  }
459
- async scheduleTimelineEvents(t, resumeTime, queueIndex) {
460
- while (queueIndex < this.timeline.length) {
461
- const event = this.timeline[queueIndex];
462
- if (event.startTime > t + this.lookAhead)
456
+ async scheduleTimelineEvents(scheduleTime, queueIndex) {
457
+ const timeOffset = this.resumeTime - this.startTime;
458
+ const lookAheadCheckTime = scheduleTime + timeOffset + this.lookAhead;
459
+ const schedulingOffset = this.startDelay - timeOffset;
460
+ const timeline = this.timeline;
461
+ while (queueIndex < timeline.length) {
462
+ const event = timeline[queueIndex];
463
+ if (lookAheadCheckTime < event.startTime)
463
464
  break;
464
- const delay = this.startDelay - resumeTime;
465
- const startTime = event.startTime + delay;
465
+ const startTime = event.startTime + schedulingOffset;
466
466
  switch (event.type) {
467
467
  case "noteOn":
468
468
  await this.scheduleNoteOn(event.channel, event.noteNumber, event.velocity, startTime);
@@ -534,13 +534,11 @@ export class MidyGMLite {
534
534
  this.isPaused = false;
535
535
  this.startTime = this.audioContext.currentTime;
536
536
  let queueIndex = this.getQueueIndex(this.resumeTime);
537
- let resumeTime = this.resumeTime - this.startTime;
538
537
  let finished = false;
539
538
  this.notePromises = [];
540
539
  while (queueIndex < this.timeline.length) {
541
540
  const now = this.audioContext.currentTime;
542
- const t = now + resumeTime;
543
- queueIndex = await this.scheduleTimelineEvents(t, resumeTime, queueIndex);
541
+ queueIndex = await this.scheduleTimelineEvents(now, queueIndex);
544
542
  if (this.isPausing) {
545
543
  await this.stopNotes(0, true, now);
546
544
  await this.audioContext.suspend();
@@ -559,7 +557,6 @@ export class MidyGMLite {
559
557
  const nextQueueIndex = this.getQueueIndex(this.resumeTime);
560
558
  this.updateStates(queueIndex, nextQueueIndex);
561
559
  queueIndex = nextQueueIndex;
562
- resumeTime = this.resumeTime - this.startTime;
563
560
  this.isSeeking = false;
564
561
  continue;
565
562
  }
@@ -578,16 +575,16 @@ export class MidyGMLite {
578
575
  secondToTicks(second, secondsPerBeat) {
579
576
  return second * this.ticksPerBeat / secondsPerBeat;
580
577
  }
578
+ getSoundFontId(channel) {
579
+ const programNumber = channel.programNumber;
580
+ const bank = channel.isDrum ? "128" : "000";
581
+ const program = programNumber.toString().padStart(3, "0");
582
+ return `${bank}:${program}`;
583
+ }
581
584
  extractMidiData(midi) {
582
585
  const instruments = new Set();
583
586
  const timeline = [];
584
- const tmpChannels = new Array(this.channels.length);
585
- for (let i = 0; i < tmpChannels.length; i++) {
586
- tmpChannels[i] = {
587
- programNumber: -1,
588
- bank: this.channels[i].bank,
589
- };
590
- }
587
+ const channels = this.channels;
591
588
  for (let i = 0; i < midi.tracks.length; i++) {
592
589
  const track = midi.tracks[i];
593
590
  let currentTicks = 0;
@@ -597,17 +594,15 @@ export class MidyGMLite {
597
594
  event.ticks = currentTicks;
598
595
  switch (event.type) {
599
596
  case "noteOn": {
600
- const channel = tmpChannels[event.channel];
601
- if (channel.programNumber < 0) {
602
- instruments.add(`${channel.bank}:0`);
603
- channel.programNumber = 0;
604
- }
597
+ const channel = channels[event.channel];
598
+ instruments.add(this.getSoundFontId(channel));
605
599
  break;
606
600
  }
607
601
  case "programChange": {
608
- const channel = tmpChannels[event.channel];
609
- channel.programNumber = event.programNumber;
610
- instruments.add(`${channel.bankNumber}:${channel.programNumber}`);
602
+ const channel = channels[event.channel];
603
+ this.setProgramChange(event.channel, event.programNumber);
604
+ instruments.add(this.getSoundFontId(channel));
605
+ break;
611
606
  }
612
607
  }
613
608
  delete event.deltaTime;
@@ -877,7 +872,7 @@ export class MidyGMLite {
877
872
  const voiceParams = voice.getAllParams(controllerState);
878
873
  const note = new Note(noteNumber, velocity, startTime, voice, voiceParams);
879
874
  const audioBuffer = await this.getAudioBuffer(channel, noteNumber, velocity, voiceParams);
880
- note.bufferSource = this.createBufferSource(voiceParams, audioBuffer);
875
+ note.bufferSource = this.createBufferSource(channel, voiceParams, audioBuffer);
881
876
  note.volumeEnvelopeNode = new GainNode(this.audioContext);
882
877
  note.filterNode = new BiquadFilterNode(this.audioContext, {
883
878
  type: "lowpass",
@@ -913,7 +908,7 @@ export class MidyGMLite {
913
908
  const channel = this.channels[channelNumber];
914
909
  if (!channel.isDrum)
915
910
  return;
916
- const drumExclusiveClass = drumExclusiveClasses[noteNumber];
911
+ const drumExclusiveClass = drumExclusiveClasses[note.noteNumber];
917
912
  if (drumExclusiveClass === 0)
918
913
  return;
919
914
  const index = drumExclusiveClass * this.channels.length + channelNumber;
@@ -926,13 +921,16 @@ export class MidyGMLite {
926
921
  }
927
922
  async scheduleNoteOn(channelNumber, noteNumber, velocity, startTime) {
928
923
  const channel = this.channels[channelNumber];
929
- const bankNumber = channel.bank;
930
- const soundFontIndex = this.soundFontTable[channel.programNumber]
931
- .get(bankNumber);
924
+ const programNumber = channel.programNumber;
925
+ const bankTable = this.soundFontTable[programNumber];
926
+ if (!bankTable)
927
+ return;
928
+ const bank = channel.isDrum ? 128 : 0;
929
+ const soundFontIndex = bankTable[bank];
932
930
  if (soundFontIndex === undefined)
933
931
  return;
934
932
  const soundFont = this.soundFonts[soundFontIndex];
935
- const voice = soundFont.getVoice(bankNumber, channel.programNumber, noteNumber, velocity);
933
+ const voice = soundFont.getVoice(bank, programNumber, noteNumber, velocity);
936
934
  if (!voice)
937
935
  return;
938
936
  const note = await this.createNote(channel, voice, noteNumber, velocity, startTime);
@@ -1039,7 +1037,26 @@ export class MidyGMLite {
1039
1037
  channel.sustainNotes = [];
1040
1038
  return promises;
1041
1039
  }
1042
- handleMIDIMessage(statusByte, data1, data2, scheduleTime) {
1040
+ createMessageHandlers() {
1041
+ const handlers = new Array(256);
1042
+ // Channel Message
1043
+ handlers[0x80] = (data, scheduleTime) => this.noteOff(data[0] & 0x0F, data[1], data[2], scheduleTime);
1044
+ handlers[0x90] = (data, scheduleTime) => this.noteOn(data[0] & 0x0F, data[1], data[2], scheduleTime);
1045
+ handlers[0xB0] = (data, scheduleTime) => this.setControlChange(data[0] & 0x0F, data[1], data[2], scheduleTime);
1046
+ handlers[0xC0] = (data, scheduleTime) => this.setProgramChange(data[0] & 0x0F, data[1], scheduleTime);
1047
+ handlers[0xE0] = (data, scheduleTime) => this.handlePitchBendMessage(data[0] & 0x0F, data[1], data[2], scheduleTime);
1048
+ return handlers;
1049
+ }
1050
+ handleMessage(data, scheduleTime) {
1051
+ const status = data[0];
1052
+ if (status === 0xF0) {
1053
+ return this.handleSysEx(data.subarray(1), scheduleTime);
1054
+ }
1055
+ const handler = this.messageHandlers[status];
1056
+ if (handler)
1057
+ handler(data, scheduleTime);
1058
+ }
1059
+ handleChannelMessage(statusByte, data1, data2, scheduleTime) {
1043
1060
  const channelNumber = statusByte & 0x0F;
1044
1061
  const messageType = statusByte & 0xF0;
1045
1062
  switch (messageType) {
@@ -1422,10 +1439,8 @@ export class MidyGMLite {
1422
1439
  for (let i = 0; i < this.channels.length; i++) {
1423
1440
  this.allSoundOff(i, 0, scheduleTime);
1424
1441
  const channel = this.channels[i];
1425
- channel.bank = 0;
1426
1442
  channel.isDrum = false;
1427
1443
  }
1428
- this.channels[9].bank = 128;
1429
1444
  this.channels[9].isDrum = true;
1430
1445
  }
1431
1446
  handleUniversalRealTimeExclusiveMessage(data, scheduleTime) {
@@ -1446,16 +1461,11 @@ export class MidyGMLite {
1446
1461
  const volume = (data[5] * 128 + data[4]) / 16383;
1447
1462
  this.setMasterVolume(volume, scheduleTime);
1448
1463
  }
1449
- setMasterVolume(volume, scheduleTime) {
1464
+ setMasterVolume(value, scheduleTime) {
1450
1465
  scheduleTime ??= this.audioContext.currentTime;
1451
- if (volume < 0 && 1 < volume) {
1452
- console.error("Master Volume is out of range");
1453
- }
1454
- else {
1455
- this.masterVolume.gain
1456
- .cancelScheduledValues(scheduleTime)
1457
- .setValueAtTime(volume * volume, scheduleTime);
1458
- }
1466
+ this.masterVolume.gain
1467
+ .cancelScheduledValues(scheduleTime)
1468
+ .setValueAtTime(value * value, scheduleTime);
1459
1469
  }
1460
1470
  handleSysEx(data, scheduleTime) {
1461
1471
  switch (data[0]) {
@@ -1495,7 +1505,6 @@ Object.defineProperty(MidyGMLite, "channelSettings", {
1495
1505
  scheduleIndex: 0,
1496
1506
  detune: 0,
1497
1507
  programNumber: 0,
1498
- bank: 0,
1499
1508
  dataMSB: 0,
1500
1509
  dataLSB: 0,
1501
1510
  rpnMSB: 127,
package/esm/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>;
package/esm/midy.d.ts.map CHANGED
@@ -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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"}