@marmooo/midy 0.4.4 → 0.4.6

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/README.md CHANGED
@@ -23,7 +23,11 @@ This library provides several files depending on the implementation level.
23
23
  - [@marmooo/midi-player](https://marmooo.github.io/midi-player/) - GUI library
24
24
  - [Humidy](https://marmooo.github.io/humidy/) - GM2 MIDI mixer app
25
25
  - [Timidy](https://marmooo.github.io/timidy/) - Timidity++ style MIDI player
26
- - [4x4pad](https://marmooo.github.io/4x4pad/) - 4x4 grid style MIDI controller
26
+ - [4x4pad](https://marmooo.github.io/4x4pad/) - 4x4 grid MPE MIDI controller
27
+ - [Celltone](https://marmooo.github.io/celltone/) - Grid MPE MIDI controller with
28
+ Janko-Piano layout
29
+ - [Isotone](https://marmooo.github.io/isotone/) - Grid MPE MIDI controller
30
+ optimized for chords
27
31
 
28
32
  ## Support Status
29
33
 
package/esm/midy-GM1.js CHANGED
@@ -549,8 +549,8 @@ export class MidyGM1 extends EventTarget {
549
549
  this.voiceCache.clear();
550
550
  this.realtimeVoiceCache.clear();
551
551
  const channels = this.channels;
552
- for (let i = 0; i < channels.length; i++) {
553
- channels[i].scheduledNotes = [];
552
+ for (let ch = 0; ch < channels.length; ch++) {
553
+ channels[ch].scheduledNotes = [];
554
554
  this.resetChannelStates(i);
555
555
  }
556
556
  }
@@ -741,8 +741,8 @@ export class MidyGM1 extends EventTarget {
741
741
  }
742
742
  stopNotes(velocity, force, scheduleTime) {
743
743
  const channels = this.channels;
744
- for (let i = 0; i < channels.length; i++) {
745
- this.stopChannelNotes(i, velocity, force, scheduleTime);
744
+ for (let ch = 0; ch < channels.length; ch++) {
745
+ this.stopChannelNotes(ch, velocity, force, scheduleTime);
746
746
  }
747
747
  const stopPromise = Promise.all(this.notePromises);
748
748
  this.notePromises = [];
@@ -1626,9 +1626,9 @@ export class MidyGM1 extends EventTarget {
1626
1626
  if (!(0 <= scheduleTime))
1627
1627
  scheduleTime = this.audioContext.currentTime;
1628
1628
  this.mode = "GM1";
1629
- for (let i = 0; i < channels.length; i++) {
1630
- this.allSoundOff(i, 0, scheduleTime);
1631
- const channel = channels[i];
1629
+ for (let ch = 0; ch < channels.length; ch++) {
1630
+ this.allSoundOff(ch, 0, scheduleTime);
1631
+ const channel = channels[ch];
1632
1632
  channel.isDrum = false;
1633
1633
  }
1634
1634
  channels[9].isDrum = true;
@@ -1 +1 @@
1
- {"version":3,"file":"midy-GM2.d.ts","sourceRoot":"","sources":["../src/midy-GM2.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"midy-GM2.d.ts","sourceRoot":"","sources":["../src/midy-GM2.js"],"names":[],"mappings":"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"}
package/esm/midy-GM2.js CHANGED
@@ -708,9 +708,9 @@ export class MidyGM2 extends EventTarget {
708
708
  this.voiceCache.clear();
709
709
  this.realtimeVoiceCache.clear();
710
710
  const channels = this.channels;
711
- for (let i = 0; i < channels.length; i++) {
712
- channels[i].scheduledNotes = [];
713
- this.resetChannelStates(i);
711
+ for (let ch = 0; i < channels.length; ch++) {
712
+ channels[ch].scheduledNotes = [];
713
+ this.resetChannelStates(ch);
714
714
  }
715
715
  }
716
716
  updateStates(queueIndex, nextQueueIndex) {
@@ -938,8 +938,8 @@ export class MidyGM2 extends EventTarget {
938
938
  }
939
939
  stopNotes(velocity, force, scheduleTime) {
940
940
  const channels = this.channels;
941
- for (let i = 0; i < channels.length; i++) {
942
- this.stopChannelNotes(i, velocity, force, scheduleTime);
941
+ for (let ch = 0; ch < channels.length; ch++) {
942
+ this.stopChannelNotes(ch, velocity, force, scheduleTime);
943
943
  }
944
944
  const stopPromise = Promise.all(this.notePromises);
945
945
  this.notePromises = [];
@@ -2559,9 +2559,9 @@ export class MidyGM2 extends EventTarget {
2559
2559
  if (!(0 <= scheduleTime))
2560
2560
  scheduleTime = this.audioContext.currentTime;
2561
2561
  this.mode = "GM1";
2562
- for (let i = 0; i < channels.length; i++) {
2563
- this.allSoundOff(i, 0, scheduleTime);
2564
- const channel = channels[i];
2562
+ for (let ch = 0; ch < channels.length; ch++) {
2563
+ this.allSoundOff(ch, 0, scheduleTime);
2564
+ const channel = channels[ch];
2565
2565
  channel.bankMSB = 0;
2566
2566
  channel.bankLSB = 0;
2567
2567
  channel.isDrum = false;
@@ -2574,9 +2574,9 @@ export class MidyGM2 extends EventTarget {
2574
2574
  if (!(0 <= scheduleTime))
2575
2575
  scheduleTime = this.audioContext.currentTime;
2576
2576
  this.mode = "GM2";
2577
- for (let i = 0; i < channels.length; i++) {
2578
- this.allSoundOff(i, 0, scheduleTime);
2579
- const channel = channels[i];
2577
+ for (let ch = 0; ch < channels.length; ch++) {
2578
+ this.allSoundOff(ch, 0, scheduleTime);
2579
+ const channel = channels[ch];
2580
2580
  channel.bankMSB = 121;
2581
2581
  channel.bankLSB = 0;
2582
2582
  channel.isDrum = false;
@@ -2643,8 +2643,9 @@ export class MidyGM2 extends EventTarget {
2643
2643
  const next = value;
2644
2644
  this.masterFineTuning = next;
2645
2645
  const detuneChange = next - prev;
2646
- for (let i = 0; i < this.channels.length; i++) {
2647
- const channel = this.channels[i];
2646
+ const channels = this.channels;
2647
+ for (let ch = 0; i < channels.length; ch++) {
2648
+ const channel = this.channels[ch];
2648
2649
  if (channel.isDrum)
2649
2650
  continue;
2650
2651
  channel.detune += detuneChange;
@@ -2660,8 +2661,9 @@ export class MidyGM2 extends EventTarget {
2660
2661
  const next = value;
2661
2662
  this.masterCoarseTuning = next;
2662
2663
  const detuneChange = next - prev;
2663
- for (let i = 0; i < this.channels.length; i++) {
2664
- const channel = this.channels[i];
2664
+ const channels = this.channels;
2665
+ for (let ch = 0; ch < channels.length; ch++) {
2666
+ const channel = this.channels[ch];
2665
2667
  if (channel.isDrum)
2666
2668
  continue;
2667
2669
  channel.detune += detuneChange;
@@ -570,8 +570,8 @@ export class MidyGMLite extends EventTarget {
570
570
  this.voiceCache.clear();
571
571
  this.realtimeVoiceCache.clear();
572
572
  const channels = this.channels;
573
- for (let i = 0; i < channels.length; i++) {
574
- channels[i].scheduledNotes = [];
573
+ for (let ch = 0; ch < channels.length; ch++) {
574
+ channels[ch].scheduledNotes = [];
575
575
  this.resetChannelStates(i);
576
576
  }
577
577
  }
@@ -762,8 +762,8 @@ export class MidyGMLite extends EventTarget {
762
762
  }
763
763
  stopNotes(velocity, force, scheduleTime) {
764
764
  const channels = this.channels;
765
- for (let i = 0; i < channels.length; i++) {
766
- this.stopChannelNotes(i, velocity, force, scheduleTime);
765
+ for (let ch = 0; ch < channels.length; ch++) {
766
+ this.stopChannelNotes(ch, velocity, force, scheduleTime);
767
767
  }
768
768
  const stopPromise = Promise.all(this.notePromises);
769
769
  this.notePromises = [];
@@ -1618,9 +1618,9 @@ export class MidyGMLite extends EventTarget {
1618
1618
  if (!(0 <= scheduleTime))
1619
1619
  scheduleTime = this.audioContext.currentTime;
1620
1620
  this.mode = "GM1";
1621
- for (let i = 0; i < channels.length; i++) {
1622
- this.allSoundOff(i, 0, scheduleTime);
1623
- const channel = channels[i];
1621
+ for (let ch = 0; ch < channels.length; ch++) {
1622
+ this.allSoundOff(ch, 0, scheduleTime);
1623
+ const channel = channels[ch];
1624
1624
  channel.isDrum = false;
1625
1625
  }
1626
1626
  channels[9].isDrum = true;
package/esm/midy.d.ts CHANGED
@@ -68,7 +68,7 @@ export class Midy extends EventTarget {
68
68
  lowerMPEMembers: number;
69
69
  upperMPEMembers: number;
70
70
  mpeState: {
71
- channelToNote: Map<any, any>;
71
+ channelToNotes: Map<any, any>;
72
72
  noteToChannel: Map<any, any>;
73
73
  };
74
74
  audioContext: any;
@@ -146,6 +146,7 @@ export class Midy extends EventTarget {
146
146
  currentTime(): number;
147
147
  processScheduledNotes(channel: any, callback: any): Promise<void>;
148
148
  processActiveNotes(channel: any, scheduleTime: any, callback: any): Promise<void>;
149
+ applyToMPEChannels(channelNumber: any, fn: any): void;
149
150
  createConvolutionReverbImpulse(audioContext: any, decay: any, preDecay: any): any;
150
151
  createConvolutionReverb(audioContext: any, impulse: any): {
151
152
  input: any;
@@ -211,10 +212,13 @@ export class Midy extends EventTarget {
211
212
  handleMessage(data: any, scheduleTime: any): void;
212
213
  activeSensing(): void;
213
214
  setPolyphonicKeyPressure(channelNumber: any, noteNumber: any, pressure: any, scheduleTime: any): void;
214
- setProgramChange(channelNumber: any, programNumber: any, _scheduleTime: any): void;
215
+ setProgramChange(channelNumber: any, programNumber: any, scheduleTime: any): void;
216
+ applyProgramChange(channelNumber: any, programNumber: any, _scheduleTime: any): void;
215
217
  setChannelPressure(channelNumber: any, value: any, scheduleTime: any): void;
218
+ applyChannelPressure(channelNumber: any, value: any, scheduleTime: any): void;
216
219
  handlePitchBendMessage(channelNumber: any, lsb: any, msb: any, scheduleTime: any): void;
217
220
  setPitchBend(channelNumber: any, value: any, scheduleTime: any): void;
221
+ applyPitchBend(channelNumber: any, value: any, scheduleTime: any): void;
218
222
  setModLfoToPitch(channel: any, note: any, scheduleTime: any): void;
219
223
  setVibLfoToPitch(channel: any, note: any, scheduleTime: any): void;
220
224
  setModLfoToFilterFc(channel: any, note: any, scheduleTime: any): void;
package/esm/midy.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"midy.d.ts","sourceRoot":"","sources":["../src/midy.js"],"names":[],"mappings":"AAgLA;IA+DE;;;;;;;;;;;;;;;;;MAiBE;IAEF,+BAqBC;IAlGD,gCAAgC;IAChC,aAAa;IACb,yBAAqB;IACrB,2BAAuB;IACvB;;;;MAIE;IACF;;;;;;MAME;IACF,oBAAiB;IACjB,qBAAmB;IACnB,kBAAc;IACd,0BAAsB;IACtB,+BAA6B;IAC7B,0BAAwB;IACxB,kBAAc;IACd,mBAAiB;IACjB,kBAAc;IACd,mBAAe;IACf,kBAAgB;IAChB,0BAAuD;IACvD,4BAAyB;IACzB,0BAAuB;IACvB,kCAA+B;IAC/B,mBAAkB;IAClB,mBAAkB;IAClB,kBAAiB;IACjB,oBAAmB;IACnB,mBAAkB;IAClB,iCAEG;IACH,cAAU;IACV,cAAa;IACb,kBAAc;IACd,iBAAY;IACZ,gBAAc;IACd,oBAAkB;IAClB,sBAAwB;IACxB,2BAAqC;IACrC,+BAEE;IACF,oBAAmB;IACnB,wBAAoB;IACpB,wBAAoB;IACpB;;;MAGE;IAuBA,kBAAgC;IAChC,kBAA8C;IAC9C,eAAwD;IACxD,qBAGE;IACF,uBAAmD;IACnD;;;;;;;;;;;;MAA2D;IAC3D,6BAA+D;IAC/D,kCAAyE;IACzE,gBAAiD;IACjD;;;kBAAyD;IACzD;;;;;;;;MAAyD;IAQ3D,mCASC;IAED,2DAYC;IAED,yCAmBC;IAED,oCASC;IAED,sBAoCC;IAED,8DAeC;IAED;;;;MAeC;IAED,sCAMC;IAED,yCAqBC;IAED,kDASC;IAED,mDAIC;IAED,2FAWC;IAED,gEAiEC;IAED,mCASC;IAED,uBAUC;IAED,yDAqCC;IAED,2BA0FC;IAED,uDAEC;IAED,wDAEC;IAED,qCAMC;IAED;;;MAqFC;IAED,kGAeC;IAED,mGAeC;IAED,wEAQC;IAED,uBAMC;IAED,sBAIC;IAED,uBAMC;IAED,wBAIC;IAED,0BAKC;IAED,8BAMC;IAED,wBAYC;IAED,sBAIC;IAED,kEAWC;IAED,kFAYC;IAED,kFAuBC;IAED;;;;MASC;IAED,gFAUC;IAED,mFAYC;IAED,sGAcC;IAID;;;MA8BC;IAED;;;kBA6BC;IAED;;;;;;;;MA0CC;IAED,8BAEC;IAED,8BAEC;IAED,4BAEC;IAED,qCAkBC;IAED,2DAQC;IAED,oDAEC;IAED,6CAKC;IAED,mDAMC;IAED,2CAoDC;IAED,8EASC;IAED,oEAkBC;IAED,sEAgBC;IAED,4DASC;IAED,6EAOC;IAED,qDAkBC;IAED,6CAIC;IAED,8EAqBC;IAED,oEAiCC;IAED,kEAqBC;IAED,+DAcC;IAED,4GAkCC;IAED,uEAoEC;IAED,0EAiBC;IAED,8EAoBC;IAED,oEAuBC;IAED,0FAaC;IAED,yGAwBC;IAED,gCAmBC;IAED,iEAyBC;IAED,2FA4BC;IAED,6FA2BC;IAED,6CAUC;IAED,qDAUC;IAED,qFAeC;IAED,uFAkBC;IAED,+BAyCC;IAED,kDAOC;IAED,sBAEC;IAED,sGAiBC;IAED,mFAcC;IAED,4EAiBC;IAED,wFAGC;IAED,sEAWC;IAED,mEAcC;IAED,mEAaC;IAED,sEAMC;IAED,oEAQC;IAED,gEAyBC;IAED,gEAyBC;IAED,gCAKC;IAED,kDAKC;IAED,8CAOC;IAED,gEAMC;IAED;;;;;;;;;;;;MA6DC;IAED,gHAQC;IAED,6EAgCC;IAED,qCA4CC;IAED,+FA2BC;IAED,iGAYC;IAED,+CAEC;IAED,wDAWC;IAED,4EASC;IAED,wDAeC;IAED,2EASC;IAED,mEAcC;IAED;;;MAMC;IAED,gEAcC;IAED,uEAQC;IAED,+CAEC;IAED,sEAGC;IAED,2DAoBC;IAED,4EA6BC;IAED,yEAYC;IAED,+CAEC;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,iFAKC;IAED,sFAQC;IAED,sFAQC;IAED,kFAeC;IAED,2DAMC;IAED,mEA+BC;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,gFAEC;IAED,kEAmBC;IAED,2EAGC;IAED,qEAGC;IAED,iGAIC;IAED,6CAwBC;IAGD,8EAuCC;IAED,gFAGC;IAED,iEAEC;IAED,gEAGC;IAED,gEAKC;IAED,gEAKC;IAED,+EAuCC;IAED,qCAaC;IAED,qCAaC;IAED,4EAqEC;IAED,4DAGC;IAED,qDAKC;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,yEAsBC;IAED,wEAaC;IAED,2CAIC;IAED,oFAOC;IAED,6DAcC;IAED,yEAIC;IAED,0CAuEC;IAED,yEAcC;IAED,gDAYC;IAGD,6DAgBC;CACF;AA3iHD;IAoBE,4DAOC;IA1BD,WAAM;IACN,iBAAY;IACZ,yBAAyB;IACzB,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,oBAEE;IADA,mCAA2B;CAGhC"}
1
+ {"version":3,"file":"midy.d.ts","sourceRoot":"","sources":["../src/midy.js"],"names":[],"mappings":"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"}
package/esm/midy.js CHANGED
@@ -517,7 +517,7 @@ export class Midy extends EventTarget {
517
517
  configurable: true,
518
518
  writable: true,
519
519
  value: {
520
- channelToNote: new Map(),
520
+ channelToNotes: new Map(),
521
521
  noteToChannel: new Map(),
522
522
  }
523
523
  });
@@ -768,9 +768,9 @@ export class Midy extends EventTarget {
768
768
  this.voiceCache.clear();
769
769
  this.realtimeVoiceCache.clear();
770
770
  const channels = this.channels;
771
- for (let i = 0; i < channels.length; i++) {
772
- channels[i].scheduledNotes = [];
773
- this.resetChannelStates(i);
771
+ for (let ch = 0; ch < channels.length; ch++) {
772
+ channels[ch].scheduledNotes = [];
773
+ this.resetChannelStates(ch);
774
774
  }
775
775
  }
776
776
  updateStates(queueIndex, nextQueueIndex) {
@@ -1105,6 +1105,22 @@ export class Midy extends EventTarget {
1105
1105
  }
1106
1106
  await Promise.all(tasks);
1107
1107
  }
1108
+ applyToMPEChannels(channelNumber, fn) {
1109
+ fn(channelNumber);
1110
+ const channel = this.channels[channelNumber];
1111
+ if (!channel.isMPEManager)
1112
+ return;
1113
+ if (channelNumber === 0) {
1114
+ for (let ch = 1; ch <= this.lowerMPEMembers; ch++) {
1115
+ fn(ch);
1116
+ }
1117
+ }
1118
+ else if (channelNumber === 15) {
1119
+ for (let ch = 15 - this.upperMPEMembers; ch <= 14; ch++) {
1120
+ fn(ch);
1121
+ }
1122
+ }
1123
+ }
1108
1124
  createConvolutionReverbImpulse(audioContext, decay, preDecay) {
1109
1125
  const sampleRate = audioContext.sampleRate;
1110
1126
  const length = sampleRate * decay;
@@ -1677,7 +1693,10 @@ export class Midy extends EventTarget {
1677
1693
  async noteOn(channelNumber, noteNumber, velocity, startTime) {
1678
1694
  if (this.mpeEnabled) {
1679
1695
  const note = await this.startNote(channelNumber, noteNumber, velocity, startTime);
1680
- this.mpeState.channelToNote.set(channelNumber, note.index);
1696
+ if (!this.mpeState.channelToNotes.has(channelNumber)) {
1697
+ this.mpeState.channelToNotes.set(channelNumber, new Set());
1698
+ }
1699
+ this.mpeState.channelToNotes.get(channelNumber).add(note.index);
1681
1700
  this.mpeState.noteToChannel.set(note.index, channelNumber);
1682
1701
  }
1683
1702
  else {
@@ -1757,17 +1776,30 @@ export class Midy extends EventTarget {
1757
1776
  }
1758
1777
  noteOff(channelNumber, noteNumber, velocity, endTime, force) {
1759
1778
  if (this.mpeEnabled) {
1760
- const noteIndex = this.mpeState.channelToNote.get(channelNumber);
1761
- if (noteIndex === undefined)
1779
+ const noteIndices = this.mpeState.channelToNotes.get(channelNumber);
1780
+ if (!noteIndices || noteIndices.size === 0)
1762
1781
  return;
1763
1782
  const channel = this.channels[channelNumber];
1764
- const note = channel.scheduledNotes[noteIndex];
1783
+ let targetNoteIndex = undefined;
1784
+ for (const noteIndex of noteIndices) {
1785
+ const note = channel.scheduledNotes[noteIndex];
1786
+ if (note && note.noteNumber === noteNumber && !note.ending) {
1787
+ targetNoteIndex = noteIndex;
1788
+ break;
1789
+ }
1790
+ }
1791
+ if (targetNoteIndex === undefined)
1792
+ return;
1793
+ const note = channel.scheduledNotes[targetNoteIndex];
1765
1794
  note.ending = true;
1766
1795
  const promise = note.ready.then(() => {
1767
1796
  return this.releaseNote(channel, note, endTime);
1768
1797
  });
1769
- this.mpeState.channelToNote.delete(channelNumber);
1770
- this.mpeState.noteToChannel.delete(noteIndex);
1798
+ noteIndices.delete(targetNoteIndex);
1799
+ if (noteIndices.size === 0) {
1800
+ this.mpeState.channelToNotes.delete(channelNumber);
1801
+ }
1802
+ this.mpeState.noteToChannel.delete(targetNoteIndex);
1771
1803
  return promise;
1772
1804
  }
1773
1805
  else {
@@ -1904,7 +1936,12 @@ export class Midy extends EventTarget {
1904
1936
  });
1905
1937
  this.applyVoiceParams(channel, 10, scheduleTime);
1906
1938
  }
1907
- setProgramChange(channelNumber, programNumber, _scheduleTime) {
1939
+ setProgramChange(channelNumber, programNumber, scheduleTime) {
1940
+ this.applyToMPEChannels(channelNumber, (ch) => {
1941
+ this.applyProgramChange(ch, programNumber, scheduleTime);
1942
+ });
1943
+ }
1944
+ applyProgramChange(channelNumber, programNumber, _scheduleTime) {
1908
1945
  const channel = this.channels[channelNumber];
1909
1946
  channel.programNumber = programNumber;
1910
1947
  if (this.mode === "GM2") {
@@ -1920,6 +1957,11 @@ export class Midy extends EventTarget {
1920
1957
  }
1921
1958
  }
1922
1959
  setChannelPressure(channelNumber, value, scheduleTime) {
1960
+ this.applyToMPEChannels(channelNumber, (ch) => {
1961
+ this.applyChannelPressure(ch, value, scheduleTime);
1962
+ });
1963
+ }
1964
+ applyChannelPressure(channelNumber, value, scheduleTime) {
1923
1965
  if (!(0 <= scheduleTime))
1924
1966
  scheduleTime = this.audioContext.currentTime;
1925
1967
  const channel = this.channels[channelNumber];
@@ -1944,6 +1986,11 @@ export class Midy extends EventTarget {
1944
1986
  this.setPitchBend(channelNumber, pitchBend, scheduleTime);
1945
1987
  }
1946
1988
  setPitchBend(channelNumber, value, scheduleTime) {
1989
+ this.applyToMPEChannels(channelNumber, (ch) => {
1990
+ this.applyPitchBend(ch, value, scheduleTime);
1991
+ });
1992
+ }
1993
+ applyPitchBend(channelNumber, value, scheduleTime) {
1947
1994
  const channel = this.channels[channelNumber];
1948
1995
  if (channel.isDrum)
1949
1996
  return;
@@ -2245,19 +2292,9 @@ export class Midy extends EventTarget {
2245
2292
  return handlers;
2246
2293
  }
2247
2294
  setControlChange(channelNumber, controllerType, value, scheduleTime) {
2248
- const channel = this.channels[channelNumber];
2249
- if (channel.isMPEMember) {
2250
- this.applyControlChange(channelNumber, controllerType, value, scheduleTime);
2251
- }
2252
- else if (channel.isMPEManager) {
2253
- channel.state[controllerType] = value / 127;
2254
- for (const memberChannel of this.mpeState.channelToNote.keys()) {
2255
- this.applyControlChange(memberChannel, controllerType, value, scheduleTime);
2256
- }
2257
- }
2258
- else {
2259
- this.applyControlChange(channelNumber, controllerType, value, scheduleTime);
2260
- }
2295
+ this.applyToMPEChannels(channelNumber, (ch) => {
2296
+ this.applyControlChange(ch, controllerType, value, scheduleTime);
2297
+ });
2261
2298
  }
2262
2299
  applyControlChange(channelNumber, controllerType, value, scheduleTime) {
2263
2300
  const handler = this.controlChangeHandlers[controllerType];
@@ -2804,11 +2841,12 @@ export class Midy extends EventTarget {
2804
2841
  const lowerEnd = this.lowerMPEMembers;
2805
2842
  const upperStart = 16 - this.upperMPEMembers;
2806
2843
  const upperEnd = 14;
2807
- for (let i = 0; i < 16; i++) {
2808
- const isLower = this.lowerMPEMembers && lowerStart <= i && i <= lowerEnd;
2809
- const isUpper = this.upperMPEMembers && upperStart <= i && i <= upperEnd;
2810
- this.channels[i].isMPEMember = this.mpeEnabled && (isLower || isUpper);
2811
- this.channels[i].isMPEManager = this.mpeEnabled && (i === 0 || i === 15);
2844
+ const { channels, lowerMPEMembers, upperMPEMembers, mpeEnabled } = this;
2845
+ for (let ch = 0; ch < 16; ch++) {
2846
+ const isLower = lowerMPEMembers && lowerStart <= ch && ch <= lowerEnd;
2847
+ const isUpper = upperMPEMembers && upperStart <= ch && ch <= upperEnd;
2848
+ channels[ch].isMPEMember = mpeEnabled && (isLower || isUpper);
2849
+ channels[ch].isMPEManager = mpeEnabled && (ch === 0 || ch === 15);
2812
2850
  }
2813
2851
  }
2814
2852
  setRPGMakerLoop(_channelNumber, _value, scheduleTime) {
@@ -2891,6 +2929,8 @@ export class Midy extends EventTarget {
2891
2929
  return this.stopActiveNotes(channelNumber, 0, false, scheduleTime);
2892
2930
  }
2893
2931
  omniOff(channelNumber, value, scheduleTime) {
2932
+ if (this.mpeEnabled)
2933
+ return;
2894
2934
  this.allNotesOff(channelNumber, value, scheduleTime);
2895
2935
  }
2896
2936
  omniOn(channelNumber, value, scheduleTime) {
@@ -2949,9 +2989,9 @@ export class Midy extends EventTarget {
2949
2989
  if (!(0 <= scheduleTime))
2950
2990
  scheduleTime = this.audioContext.currentTime;
2951
2991
  this.mode = "GM1";
2952
- for (let i = 0; i < channels.length; i++) {
2953
- this.applyAllSoundOff(i, 0, scheduleTime);
2954
- const channel = channels[i];
2992
+ for (let ch = 0; ch < channels.length; ch++) {
2993
+ this.applyAllSoundOff(ch, 0, scheduleTime);
2994
+ const channel = channels[ch];
2955
2995
  channel.bankMSB = 0;
2956
2996
  channel.bankLSB = 0;
2957
2997
  channel.isDrum = false;
@@ -2964,9 +3004,9 @@ export class Midy extends EventTarget {
2964
3004
  if (!(0 <= scheduleTime))
2965
3005
  scheduleTime = this.audioContext.currentTime;
2966
3006
  this.mode = "GM2";
2967
- for (let i = 0; i < channels.length; i++) {
2968
- this.applyAllSoundOff(i, 0, scheduleTime);
2969
- const channel = channels[i];
3007
+ for (let ch = 0; ch < channels.length; ch++) {
3008
+ this.applyAllSoundOff(ch, 0, scheduleTime);
3009
+ const channel = channels[ch];
2970
3010
  channel.bankMSB = 121;
2971
3011
  channel.bankLSB = 0;
2972
3012
  channel.isDrum = false;
@@ -3046,8 +3086,9 @@ export class Midy extends EventTarget {
3046
3086
  const next = value;
3047
3087
  this.masterFineTuning = next;
3048
3088
  const detuneChange = next - prev;
3049
- for (let i = 0; i < this.channels.length; i++) {
3050
- const channel = this.channels[i];
3089
+ const channels = this.channels;
3090
+ for (let ch = 0; ch < channels.length; ch++) {
3091
+ const channel = channels[ch];
3051
3092
  if (channel.isDrum)
3052
3093
  continue;
3053
3094
  channel.detune += detuneChange;
@@ -3063,8 +3104,9 @@ export class Midy extends EventTarget {
3063
3104
  const next = value;
3064
3105
  this.masterCoarseTuning = next;
3065
3106
  const detuneChange = next - prev;
3066
- for (let i = 0; i < this.channels.length; i++) {
3067
- const channel = this.channels[i];
3107
+ const channels = this.channels;
3108
+ for (let ch = 0; ch < channels.length; ch++) {
3109
+ const channel = channels[ch];
3068
3110
  if (channel.isDrum)
3069
3111
  continue;
3070
3112
  channel.detune += detuneChange;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@marmooo/midy",
3
- "version": "0.4.4",
3
+ "version": "0.4.6",
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",
@@ -552,8 +552,8 @@ class MidyGM1 extends EventTarget {
552
552
  this.voiceCache.clear();
553
553
  this.realtimeVoiceCache.clear();
554
554
  const channels = this.channels;
555
- for (let i = 0; i < channels.length; i++) {
556
- channels[i].scheduledNotes = [];
555
+ for (let ch = 0; ch < channels.length; ch++) {
556
+ channels[ch].scheduledNotes = [];
557
557
  this.resetChannelStates(i);
558
558
  }
559
559
  }
@@ -744,8 +744,8 @@ class MidyGM1 extends EventTarget {
744
744
  }
745
745
  stopNotes(velocity, force, scheduleTime) {
746
746
  const channels = this.channels;
747
- for (let i = 0; i < channels.length; i++) {
748
- this.stopChannelNotes(i, velocity, force, scheduleTime);
747
+ for (let ch = 0; ch < channels.length; ch++) {
748
+ this.stopChannelNotes(ch, velocity, force, scheduleTime);
749
749
  }
750
750
  const stopPromise = Promise.all(this.notePromises);
751
751
  this.notePromises = [];
@@ -1629,9 +1629,9 @@ class MidyGM1 extends EventTarget {
1629
1629
  if (!(0 <= scheduleTime))
1630
1630
  scheduleTime = this.audioContext.currentTime;
1631
1631
  this.mode = "GM1";
1632
- for (let i = 0; i < channels.length; i++) {
1633
- this.allSoundOff(i, 0, scheduleTime);
1634
- const channel = channels[i];
1632
+ for (let ch = 0; ch < channels.length; ch++) {
1633
+ this.allSoundOff(ch, 0, scheduleTime);
1634
+ const channel = channels[ch];
1635
1635
  channel.isDrum = false;
1636
1636
  }
1637
1637
  channels[9].isDrum = true;
@@ -1 +1 @@
1
- {"version":3,"file":"midy-GM2.d.ts","sourceRoot":"","sources":["../src/midy-GM2.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"midy-GM2.d.ts","sourceRoot":"","sources":["../src/midy-GM2.js"],"names":[],"mappings":"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"}
@@ -711,9 +711,9 @@ class MidyGM2 extends EventTarget {
711
711
  this.voiceCache.clear();
712
712
  this.realtimeVoiceCache.clear();
713
713
  const channels = this.channels;
714
- for (let i = 0; i < channels.length; i++) {
715
- channels[i].scheduledNotes = [];
716
- this.resetChannelStates(i);
714
+ for (let ch = 0; i < channels.length; ch++) {
715
+ channels[ch].scheduledNotes = [];
716
+ this.resetChannelStates(ch);
717
717
  }
718
718
  }
719
719
  updateStates(queueIndex, nextQueueIndex) {
@@ -941,8 +941,8 @@ class MidyGM2 extends EventTarget {
941
941
  }
942
942
  stopNotes(velocity, force, scheduleTime) {
943
943
  const channels = this.channels;
944
- for (let i = 0; i < channels.length; i++) {
945
- this.stopChannelNotes(i, velocity, force, scheduleTime);
944
+ for (let ch = 0; ch < channels.length; ch++) {
945
+ this.stopChannelNotes(ch, velocity, force, scheduleTime);
946
946
  }
947
947
  const stopPromise = Promise.all(this.notePromises);
948
948
  this.notePromises = [];
@@ -2562,9 +2562,9 @@ class MidyGM2 extends EventTarget {
2562
2562
  if (!(0 <= scheduleTime))
2563
2563
  scheduleTime = this.audioContext.currentTime;
2564
2564
  this.mode = "GM1";
2565
- for (let i = 0; i < channels.length; i++) {
2566
- this.allSoundOff(i, 0, scheduleTime);
2567
- const channel = channels[i];
2565
+ for (let ch = 0; ch < channels.length; ch++) {
2566
+ this.allSoundOff(ch, 0, scheduleTime);
2567
+ const channel = channels[ch];
2568
2568
  channel.bankMSB = 0;
2569
2569
  channel.bankLSB = 0;
2570
2570
  channel.isDrum = false;
@@ -2577,9 +2577,9 @@ class MidyGM2 extends EventTarget {
2577
2577
  if (!(0 <= scheduleTime))
2578
2578
  scheduleTime = this.audioContext.currentTime;
2579
2579
  this.mode = "GM2";
2580
- for (let i = 0; i < channels.length; i++) {
2581
- this.allSoundOff(i, 0, scheduleTime);
2582
- const channel = channels[i];
2580
+ for (let ch = 0; ch < channels.length; ch++) {
2581
+ this.allSoundOff(ch, 0, scheduleTime);
2582
+ const channel = channels[ch];
2583
2583
  channel.bankMSB = 121;
2584
2584
  channel.bankLSB = 0;
2585
2585
  channel.isDrum = false;
@@ -2646,8 +2646,9 @@ class MidyGM2 extends EventTarget {
2646
2646
  const next = value;
2647
2647
  this.masterFineTuning = next;
2648
2648
  const detuneChange = next - prev;
2649
- for (let i = 0; i < this.channels.length; i++) {
2650
- const channel = this.channels[i];
2649
+ const channels = this.channels;
2650
+ for (let ch = 0; i < channels.length; ch++) {
2651
+ const channel = this.channels[ch];
2651
2652
  if (channel.isDrum)
2652
2653
  continue;
2653
2654
  channel.detune += detuneChange;
@@ -2663,8 +2664,9 @@ class MidyGM2 extends EventTarget {
2663
2664
  const next = value;
2664
2665
  this.masterCoarseTuning = next;
2665
2666
  const detuneChange = next - prev;
2666
- for (let i = 0; i < this.channels.length; i++) {
2667
- const channel = this.channels[i];
2667
+ const channels = this.channels;
2668
+ for (let ch = 0; ch < channels.length; ch++) {
2669
+ const channel = this.channels[ch];
2668
2670
  if (channel.isDrum)
2669
2671
  continue;
2670
2672
  channel.detune += detuneChange;
@@ -573,8 +573,8 @@ class MidyGMLite extends EventTarget {
573
573
  this.voiceCache.clear();
574
574
  this.realtimeVoiceCache.clear();
575
575
  const channels = this.channels;
576
- for (let i = 0; i < channels.length; i++) {
577
- channels[i].scheduledNotes = [];
576
+ for (let ch = 0; ch < channels.length; ch++) {
577
+ channels[ch].scheduledNotes = [];
578
578
  this.resetChannelStates(i);
579
579
  }
580
580
  }
@@ -765,8 +765,8 @@ class MidyGMLite extends EventTarget {
765
765
  }
766
766
  stopNotes(velocity, force, scheduleTime) {
767
767
  const channels = this.channels;
768
- for (let i = 0; i < channels.length; i++) {
769
- this.stopChannelNotes(i, velocity, force, scheduleTime);
768
+ for (let ch = 0; ch < channels.length; ch++) {
769
+ this.stopChannelNotes(ch, velocity, force, scheduleTime);
770
770
  }
771
771
  const stopPromise = Promise.all(this.notePromises);
772
772
  this.notePromises = [];
@@ -1621,9 +1621,9 @@ class MidyGMLite extends EventTarget {
1621
1621
  if (!(0 <= scheduleTime))
1622
1622
  scheduleTime = this.audioContext.currentTime;
1623
1623
  this.mode = "GM1";
1624
- for (let i = 0; i < channels.length; i++) {
1625
- this.allSoundOff(i, 0, scheduleTime);
1626
- const channel = channels[i];
1624
+ for (let ch = 0; ch < channels.length; ch++) {
1625
+ this.allSoundOff(ch, 0, scheduleTime);
1626
+ const channel = channels[ch];
1627
1627
  channel.isDrum = false;
1628
1628
  }
1629
1629
  channels[9].isDrum = true;
package/script/midy.d.ts CHANGED
@@ -68,7 +68,7 @@ export class Midy extends EventTarget {
68
68
  lowerMPEMembers: number;
69
69
  upperMPEMembers: number;
70
70
  mpeState: {
71
- channelToNote: Map<any, any>;
71
+ channelToNotes: Map<any, any>;
72
72
  noteToChannel: Map<any, any>;
73
73
  };
74
74
  audioContext: any;
@@ -146,6 +146,7 @@ export class Midy extends EventTarget {
146
146
  currentTime(): number;
147
147
  processScheduledNotes(channel: any, callback: any): Promise<void>;
148
148
  processActiveNotes(channel: any, scheduleTime: any, callback: any): Promise<void>;
149
+ applyToMPEChannels(channelNumber: any, fn: any): void;
149
150
  createConvolutionReverbImpulse(audioContext: any, decay: any, preDecay: any): any;
150
151
  createConvolutionReverb(audioContext: any, impulse: any): {
151
152
  input: any;
@@ -211,10 +212,13 @@ export class Midy extends EventTarget {
211
212
  handleMessage(data: any, scheduleTime: any): void;
212
213
  activeSensing(): void;
213
214
  setPolyphonicKeyPressure(channelNumber: any, noteNumber: any, pressure: any, scheduleTime: any): void;
214
- setProgramChange(channelNumber: any, programNumber: any, _scheduleTime: any): void;
215
+ setProgramChange(channelNumber: any, programNumber: any, scheduleTime: any): void;
216
+ applyProgramChange(channelNumber: any, programNumber: any, _scheduleTime: any): void;
215
217
  setChannelPressure(channelNumber: any, value: any, scheduleTime: any): void;
218
+ applyChannelPressure(channelNumber: any, value: any, scheduleTime: any): void;
216
219
  handlePitchBendMessage(channelNumber: any, lsb: any, msb: any, scheduleTime: any): void;
217
220
  setPitchBend(channelNumber: any, value: any, scheduleTime: any): void;
221
+ applyPitchBend(channelNumber: any, value: any, scheduleTime: any): void;
218
222
  setModLfoToPitch(channel: any, note: any, scheduleTime: any): void;
219
223
  setVibLfoToPitch(channel: any, note: any, scheduleTime: any): void;
220
224
  setModLfoToFilterFc(channel: any, note: any, scheduleTime: any): void;
@@ -1 +1 @@
1
- {"version":3,"file":"midy.d.ts","sourceRoot":"","sources":["../src/midy.js"],"names":[],"mappings":"AAgLA;IA+DE;;;;;;;;;;;;;;;;;MAiBE;IAEF,+BAqBC;IAlGD,gCAAgC;IAChC,aAAa;IACb,yBAAqB;IACrB,2BAAuB;IACvB;;;;MAIE;IACF;;;;;;MAME;IACF,oBAAiB;IACjB,qBAAmB;IACnB,kBAAc;IACd,0BAAsB;IACtB,+BAA6B;IAC7B,0BAAwB;IACxB,kBAAc;IACd,mBAAiB;IACjB,kBAAc;IACd,mBAAe;IACf,kBAAgB;IAChB,0BAAuD;IACvD,4BAAyB;IACzB,0BAAuB;IACvB,kCAA+B;IAC/B,mBAAkB;IAClB,mBAAkB;IAClB,kBAAiB;IACjB,oBAAmB;IACnB,mBAAkB;IAClB,iCAEG;IACH,cAAU;IACV,cAAa;IACb,kBAAc;IACd,iBAAY;IACZ,gBAAc;IACd,oBAAkB;IAClB,sBAAwB;IACxB,2BAAqC;IACrC,+BAEE;IACF,oBAAmB;IACnB,wBAAoB;IACpB,wBAAoB;IACpB;;;MAGE;IAuBA,kBAAgC;IAChC,kBAA8C;IAC9C,eAAwD;IACxD,qBAGE;IACF,uBAAmD;IACnD;;;;;;;;;;;;MAA2D;IAC3D,6BAA+D;IAC/D,kCAAyE;IACzE,gBAAiD;IACjD;;;kBAAyD;IACzD;;;;;;;;MAAyD;IAQ3D,mCASC;IAED,2DAYC;IAED,yCAmBC;IAED,oCASC;IAED,sBAoCC;IAED,8DAeC;IAED;;;;MAeC;IAED,sCAMC;IAED,yCAqBC;IAED,kDASC;IAED,mDAIC;IAED,2FAWC;IAED,gEAiEC;IAED,mCASC;IAED,uBAUC;IAED,yDAqCC;IAED,2BA0FC;IAED,uDAEC;IAED,wDAEC;IAED,qCAMC;IAED;;;MAqFC;IAED,kGAeC;IAED,mGAeC;IAED,wEAQC;IAED,uBAMC;IAED,sBAIC;IAED,uBAMC;IAED,wBAIC;IAED,0BAKC;IAED,8BAMC;IAED,wBAYC;IAED,sBAIC;IAED,kEAWC;IAED,kFAYC;IAED,kFAuBC;IAED;;;;MASC;IAED,gFAUC;IAED,mFAYC;IAED,sGAcC;IAID;;;MA8BC;IAED;;;kBA6BC;IAED;;;;;;;;MA0CC;IAED,8BAEC;IAED,8BAEC;IAED,4BAEC;IAED,qCAkBC;IAED,2DAQC;IAED,oDAEC;IAED,6CAKC;IAED,mDAMC;IAED,2CAoDC;IAED,8EASC;IAED,oEAkBC;IAED,sEAgBC;IAED,4DASC;IAED,6EAOC;IAED,qDAkBC;IAED,6CAIC;IAED,8EAqBC;IAED,oEAiCC;IAED,kEAqBC;IAED,+DAcC;IAED,4GAkCC;IAED,uEAoEC;IAED,0EAiBC;IAED,8EAoBC;IAED,oEAuBC;IAED,0FAaC;IAED,yGAwBC;IAED,gCAmBC;IAED,iEAyBC;IAED,2FA4BC;IAED,6FA2BC;IAED,6CAUC;IAED,qDAUC;IAED,qFAeC;IAED,uFAkBC;IAED,+BAyCC;IAED,kDAOC;IAED,sBAEC;IAED,sGAiBC;IAED,mFAcC;IAED,4EAiBC;IAED,wFAGC;IAED,sEAWC;IAED,mEAcC;IAED,mEAaC;IAED,sEAMC;IAED,oEAQC;IAED,gEAyBC;IAED,gEAyBC;IAED,gCAKC;IAED,kDAKC;IAED,8CAOC;IAED,gEAMC;IAED;;;;;;;;;;;;MA6DC;IAED,gHAQC;IAED,6EAgCC;IAED,qCA4CC;IAED,+FA2BC;IAED,iGAYC;IAED,+CAEC;IAED,wDAWC;IAED,4EASC;IAED,wDAeC;IAED,2EASC;IAED,mEAcC;IAED;;;MAMC;IAED,gEAcC;IAED,uEAQC;IAED,+CAEC;IAED,sEAGC;IAED,2DAoBC;IAED,4EA6BC;IAED,yEAYC;IAED,+CAEC;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,iFAKC;IAED,sFAQC;IAED,sFAQC;IAED,kFAeC;IAED,2DAMC;IAED,mEA+BC;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,gFAEC;IAED,kEAmBC;IAED,2EAGC;IAED,qEAGC;IAED,iGAIC;IAED,6CAwBC;IAGD,8EAuCC;IAED,gFAGC;IAED,iEAEC;IAED,gEAGC;IAED,gEAKC;IAED,gEAKC;IAED,+EAuCC;IAED,qCAaC;IAED,qCAaC;IAED,4EAqEC;IAED,4DAGC;IAED,qDAKC;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,yEAsBC;IAED,wEAaC;IAED,2CAIC;IAED,oFAOC;IAED,6DAcC;IAED,yEAIC;IAED,0CAuEC;IAED,yEAcC;IAED,gDAYC;IAGD,6DAgBC;CACF;AA3iHD;IAoBE,4DAOC;IA1BD,WAAM;IACN,iBAAY;IACZ,yBAAyB;IACzB,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,oBAEE;IADA,mCAA2B;CAGhC"}
1
+ {"version":3,"file":"midy.d.ts","sourceRoot":"","sources":["../src/midy.js"],"names":[],"mappings":"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"}
package/script/midy.js CHANGED
@@ -520,7 +520,7 @@ class Midy extends EventTarget {
520
520
  configurable: true,
521
521
  writable: true,
522
522
  value: {
523
- channelToNote: new Map(),
523
+ channelToNotes: new Map(),
524
524
  noteToChannel: new Map(),
525
525
  }
526
526
  });
@@ -771,9 +771,9 @@ class Midy extends EventTarget {
771
771
  this.voiceCache.clear();
772
772
  this.realtimeVoiceCache.clear();
773
773
  const channels = this.channels;
774
- for (let i = 0; i < channels.length; i++) {
775
- channels[i].scheduledNotes = [];
776
- this.resetChannelStates(i);
774
+ for (let ch = 0; ch < channels.length; ch++) {
775
+ channels[ch].scheduledNotes = [];
776
+ this.resetChannelStates(ch);
777
777
  }
778
778
  }
779
779
  updateStates(queueIndex, nextQueueIndex) {
@@ -1108,6 +1108,22 @@ class Midy extends EventTarget {
1108
1108
  }
1109
1109
  await Promise.all(tasks);
1110
1110
  }
1111
+ applyToMPEChannels(channelNumber, fn) {
1112
+ fn(channelNumber);
1113
+ const channel = this.channels[channelNumber];
1114
+ if (!channel.isMPEManager)
1115
+ return;
1116
+ if (channelNumber === 0) {
1117
+ for (let ch = 1; ch <= this.lowerMPEMembers; ch++) {
1118
+ fn(ch);
1119
+ }
1120
+ }
1121
+ else if (channelNumber === 15) {
1122
+ for (let ch = 15 - this.upperMPEMembers; ch <= 14; ch++) {
1123
+ fn(ch);
1124
+ }
1125
+ }
1126
+ }
1111
1127
  createConvolutionReverbImpulse(audioContext, decay, preDecay) {
1112
1128
  const sampleRate = audioContext.sampleRate;
1113
1129
  const length = sampleRate * decay;
@@ -1680,7 +1696,10 @@ class Midy extends EventTarget {
1680
1696
  async noteOn(channelNumber, noteNumber, velocity, startTime) {
1681
1697
  if (this.mpeEnabled) {
1682
1698
  const note = await this.startNote(channelNumber, noteNumber, velocity, startTime);
1683
- this.mpeState.channelToNote.set(channelNumber, note.index);
1699
+ if (!this.mpeState.channelToNotes.has(channelNumber)) {
1700
+ this.mpeState.channelToNotes.set(channelNumber, new Set());
1701
+ }
1702
+ this.mpeState.channelToNotes.get(channelNumber).add(note.index);
1684
1703
  this.mpeState.noteToChannel.set(note.index, channelNumber);
1685
1704
  }
1686
1705
  else {
@@ -1760,17 +1779,30 @@ class Midy extends EventTarget {
1760
1779
  }
1761
1780
  noteOff(channelNumber, noteNumber, velocity, endTime, force) {
1762
1781
  if (this.mpeEnabled) {
1763
- const noteIndex = this.mpeState.channelToNote.get(channelNumber);
1764
- if (noteIndex === undefined)
1782
+ const noteIndices = this.mpeState.channelToNotes.get(channelNumber);
1783
+ if (!noteIndices || noteIndices.size === 0)
1765
1784
  return;
1766
1785
  const channel = this.channels[channelNumber];
1767
- const note = channel.scheduledNotes[noteIndex];
1786
+ let targetNoteIndex = undefined;
1787
+ for (const noteIndex of noteIndices) {
1788
+ const note = channel.scheduledNotes[noteIndex];
1789
+ if (note && note.noteNumber === noteNumber && !note.ending) {
1790
+ targetNoteIndex = noteIndex;
1791
+ break;
1792
+ }
1793
+ }
1794
+ if (targetNoteIndex === undefined)
1795
+ return;
1796
+ const note = channel.scheduledNotes[targetNoteIndex];
1768
1797
  note.ending = true;
1769
1798
  const promise = note.ready.then(() => {
1770
1799
  return this.releaseNote(channel, note, endTime);
1771
1800
  });
1772
- this.mpeState.channelToNote.delete(channelNumber);
1773
- this.mpeState.noteToChannel.delete(noteIndex);
1801
+ noteIndices.delete(targetNoteIndex);
1802
+ if (noteIndices.size === 0) {
1803
+ this.mpeState.channelToNotes.delete(channelNumber);
1804
+ }
1805
+ this.mpeState.noteToChannel.delete(targetNoteIndex);
1774
1806
  return promise;
1775
1807
  }
1776
1808
  else {
@@ -1907,7 +1939,12 @@ class Midy extends EventTarget {
1907
1939
  });
1908
1940
  this.applyVoiceParams(channel, 10, scheduleTime);
1909
1941
  }
1910
- setProgramChange(channelNumber, programNumber, _scheduleTime) {
1942
+ setProgramChange(channelNumber, programNumber, scheduleTime) {
1943
+ this.applyToMPEChannels(channelNumber, (ch) => {
1944
+ this.applyProgramChange(ch, programNumber, scheduleTime);
1945
+ });
1946
+ }
1947
+ applyProgramChange(channelNumber, programNumber, _scheduleTime) {
1911
1948
  const channel = this.channels[channelNumber];
1912
1949
  channel.programNumber = programNumber;
1913
1950
  if (this.mode === "GM2") {
@@ -1923,6 +1960,11 @@ class Midy extends EventTarget {
1923
1960
  }
1924
1961
  }
1925
1962
  setChannelPressure(channelNumber, value, scheduleTime) {
1963
+ this.applyToMPEChannels(channelNumber, (ch) => {
1964
+ this.applyChannelPressure(ch, value, scheduleTime);
1965
+ });
1966
+ }
1967
+ applyChannelPressure(channelNumber, value, scheduleTime) {
1926
1968
  if (!(0 <= scheduleTime))
1927
1969
  scheduleTime = this.audioContext.currentTime;
1928
1970
  const channel = this.channels[channelNumber];
@@ -1947,6 +1989,11 @@ class Midy extends EventTarget {
1947
1989
  this.setPitchBend(channelNumber, pitchBend, scheduleTime);
1948
1990
  }
1949
1991
  setPitchBend(channelNumber, value, scheduleTime) {
1992
+ this.applyToMPEChannels(channelNumber, (ch) => {
1993
+ this.applyPitchBend(ch, value, scheduleTime);
1994
+ });
1995
+ }
1996
+ applyPitchBend(channelNumber, value, scheduleTime) {
1950
1997
  const channel = this.channels[channelNumber];
1951
1998
  if (channel.isDrum)
1952
1999
  return;
@@ -2248,19 +2295,9 @@ class Midy extends EventTarget {
2248
2295
  return handlers;
2249
2296
  }
2250
2297
  setControlChange(channelNumber, controllerType, value, scheduleTime) {
2251
- const channel = this.channels[channelNumber];
2252
- if (channel.isMPEMember) {
2253
- this.applyControlChange(channelNumber, controllerType, value, scheduleTime);
2254
- }
2255
- else if (channel.isMPEManager) {
2256
- channel.state[controllerType] = value / 127;
2257
- for (const memberChannel of this.mpeState.channelToNote.keys()) {
2258
- this.applyControlChange(memberChannel, controllerType, value, scheduleTime);
2259
- }
2260
- }
2261
- else {
2262
- this.applyControlChange(channelNumber, controllerType, value, scheduleTime);
2263
- }
2298
+ this.applyToMPEChannels(channelNumber, (ch) => {
2299
+ this.applyControlChange(ch, controllerType, value, scheduleTime);
2300
+ });
2264
2301
  }
2265
2302
  applyControlChange(channelNumber, controllerType, value, scheduleTime) {
2266
2303
  const handler = this.controlChangeHandlers[controllerType];
@@ -2807,11 +2844,12 @@ class Midy extends EventTarget {
2807
2844
  const lowerEnd = this.lowerMPEMembers;
2808
2845
  const upperStart = 16 - this.upperMPEMembers;
2809
2846
  const upperEnd = 14;
2810
- for (let i = 0; i < 16; i++) {
2811
- const isLower = this.lowerMPEMembers && lowerStart <= i && i <= lowerEnd;
2812
- const isUpper = this.upperMPEMembers && upperStart <= i && i <= upperEnd;
2813
- this.channels[i].isMPEMember = this.mpeEnabled && (isLower || isUpper);
2814
- this.channels[i].isMPEManager = this.mpeEnabled && (i === 0 || i === 15);
2847
+ const { channels, lowerMPEMembers, upperMPEMembers, mpeEnabled } = this;
2848
+ for (let ch = 0; ch < 16; ch++) {
2849
+ const isLower = lowerMPEMembers && lowerStart <= ch && ch <= lowerEnd;
2850
+ const isUpper = upperMPEMembers && upperStart <= ch && ch <= upperEnd;
2851
+ channels[ch].isMPEMember = mpeEnabled && (isLower || isUpper);
2852
+ channels[ch].isMPEManager = mpeEnabled && (ch === 0 || ch === 15);
2815
2853
  }
2816
2854
  }
2817
2855
  setRPGMakerLoop(_channelNumber, _value, scheduleTime) {
@@ -2894,6 +2932,8 @@ class Midy extends EventTarget {
2894
2932
  return this.stopActiveNotes(channelNumber, 0, false, scheduleTime);
2895
2933
  }
2896
2934
  omniOff(channelNumber, value, scheduleTime) {
2935
+ if (this.mpeEnabled)
2936
+ return;
2897
2937
  this.allNotesOff(channelNumber, value, scheduleTime);
2898
2938
  }
2899
2939
  omniOn(channelNumber, value, scheduleTime) {
@@ -2952,9 +2992,9 @@ class Midy extends EventTarget {
2952
2992
  if (!(0 <= scheduleTime))
2953
2993
  scheduleTime = this.audioContext.currentTime;
2954
2994
  this.mode = "GM1";
2955
- for (let i = 0; i < channels.length; i++) {
2956
- this.applyAllSoundOff(i, 0, scheduleTime);
2957
- const channel = channels[i];
2995
+ for (let ch = 0; ch < channels.length; ch++) {
2996
+ this.applyAllSoundOff(ch, 0, scheduleTime);
2997
+ const channel = channels[ch];
2958
2998
  channel.bankMSB = 0;
2959
2999
  channel.bankLSB = 0;
2960
3000
  channel.isDrum = false;
@@ -2967,9 +3007,9 @@ class Midy extends EventTarget {
2967
3007
  if (!(0 <= scheduleTime))
2968
3008
  scheduleTime = this.audioContext.currentTime;
2969
3009
  this.mode = "GM2";
2970
- for (let i = 0; i < channels.length; i++) {
2971
- this.applyAllSoundOff(i, 0, scheduleTime);
2972
- const channel = channels[i];
3010
+ for (let ch = 0; ch < channels.length; ch++) {
3011
+ this.applyAllSoundOff(ch, 0, scheduleTime);
3012
+ const channel = channels[ch];
2973
3013
  channel.bankMSB = 121;
2974
3014
  channel.bankLSB = 0;
2975
3015
  channel.isDrum = false;
@@ -3049,8 +3089,9 @@ class Midy extends EventTarget {
3049
3089
  const next = value;
3050
3090
  this.masterFineTuning = next;
3051
3091
  const detuneChange = next - prev;
3052
- for (let i = 0; i < this.channels.length; i++) {
3053
- const channel = this.channels[i];
3092
+ const channels = this.channels;
3093
+ for (let ch = 0; ch < channels.length; ch++) {
3094
+ const channel = channels[ch];
3054
3095
  if (channel.isDrum)
3055
3096
  continue;
3056
3097
  channel.detune += detuneChange;
@@ -3066,8 +3107,9 @@ class Midy extends EventTarget {
3066
3107
  const next = value;
3067
3108
  this.masterCoarseTuning = next;
3068
3109
  const detuneChange = next - prev;
3069
- for (let i = 0; i < this.channels.length; i++) {
3070
- const channel = this.channels[i];
3110
+ const channels = this.channels;
3111
+ for (let ch = 0; ch < channels.length; ch++) {
3112
+ const channel = channels[ch];
3071
3113
  if (channel.isDrum)
3072
3114
  continue;
3073
3115
  channel.detune += detuneChange;