@marmooo/midy 0.0.8 → 0.1.0

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.
@@ -186,23 +186,23 @@ class MidyGMLite {
186
186
  this.totalTime = this.calcTotalTime();
187
187
  }
188
188
  setChannelAudioNodes(audioContext) {
189
- const { gainLeft, gainRight } = this.panToGain(MidyGMLite.channelSettings.pan);
189
+ const { gainLeft, gainRight } = this.panToGain(this.constructor.channelSettings.pan);
190
190
  const gainL = new GainNode(audioContext, { gain: gainLeft });
191
191
  const gainR = new GainNode(audioContext, { gain: gainRight });
192
192
  const merger = new ChannelMergerNode(audioContext, { numberOfInputs: 2 });
193
193
  gainL.connect(merger, 0, 0);
194
194
  gainR.connect(merger, 0, 1);
195
- merger.connect(this.masterGain);
196
195
  return {
197
196
  gainL,
198
197
  gainR,
198
+ merger,
199
199
  };
200
200
  }
201
201
  createChannels(audioContext) {
202
202
  const channels = Array.from({ length: 16 }, () => {
203
203
  return {
204
- ...MidyGMLite.channelSettings,
205
- ...MidyGMLite.effectSettings,
204
+ ...this.constructor.channelSettings,
205
+ ...this.constructor.effectSettings,
206
206
  ...this.setChannelAudioNodes(audioContext),
207
207
  scheduledNotes: new Map(),
208
208
  };
@@ -494,9 +494,9 @@ class MidyGMLite {
494
494
  }
495
495
  return noteList[0];
496
496
  }
497
- connectNoteEffects(channel, gainNode) {
498
- gainNode.connect(channel.gainL);
499
- gainNode.connect(channel.gainR);
497
+ connectEffects(channel, gainNode) {
498
+ gainNode.connect(channel.merger);
499
+ merger.connect(this.masterGain);
500
500
  }
501
501
  cbToRatio(cb) {
502
502
  return Math.pow(10, cb / 200);
@@ -562,7 +562,7 @@ class MidyGMLite {
562
562
  startModulation(channel, note, time) {
563
563
  const { instrumentKey } = note;
564
564
  note.modLFOGain = new GainNode(this.audioContext, {
565
- gain: this.cbToRatio(instrumentKey.modLfoToVolume) * channel.modulation,
565
+ gain: this.cbToRatio(instrumentKey.modLfoToVolume + channel.modulation),
566
566
  });
567
567
  note.modLFO = new OscillatorNode(this.audioContext, {
568
568
  frequency: this.centToHz(instrumentKey.freqModLFO),
@@ -601,7 +601,7 @@ class MidyGMLite {
601
601
  if (!instrumentKey)
602
602
  return;
603
603
  const note = await this.createNote(channel, instrumentKey, noteNumber, velocity, startTime, isSF3);
604
- this.connectNoteEffects(channel, note.gainNode);
604
+ this.connectEffects(channel, note.gainNode);
605
605
  const scheduledNotes = channel.scheduledNotes;
606
606
  if (scheduledNotes.has(noteNumber)) {
607
607
  scheduledNotes.get(noteNumber).push(note);
@@ -620,39 +620,41 @@ class MidyGMLite {
620
620
  return;
621
621
  if (!channel.scheduledNotes.has(noteNumber))
622
622
  return;
623
- const targetNotes = channel.scheduledNotes.get(noteNumber);
624
- for (let i = 0; i < targetNotes.length; i++) {
625
- const targetNote = targetNotes[i];
626
- if (!targetNote)
623
+ const scheduledNotes = channel.scheduledNotes.get(noteNumber);
624
+ for (let i = 0; i < scheduledNotes.length; i++) {
625
+ const note = scheduledNotes[i];
626
+ if (!note)
627
627
  continue;
628
- if (targetNote.ending)
628
+ if (note.ending)
629
629
  continue;
630
- const { bufferSource, filterNode, gainNode, modLFO, modLFOGain, instrumentKey, } = targetNote;
631
630
  const velocityRate = (velocity + 127) / 127;
632
- const volEndTime = stopTime + instrumentKey.volRelease * velocityRate;
633
- gainNode.gain.cancelScheduledValues(stopTime);
634
- gainNode.gain.linearRampToValueAtTime(0, volEndTime);
631
+ const volEndTime = stopTime +
632
+ note.instrumentKey.volRelease * velocityRate;
633
+ note.gainNode.gain
634
+ .cancelScheduledValues(stopTime)
635
+ .linearRampToValueAtTime(0, volEndTime);
635
636
  const maxFreq = this.audioContext.sampleRate / 2;
636
- const baseFreq = this.centToHz(instrumentKey.initialFilterFc);
637
+ const baseFreq = this.centToHz(note.instrumentKey.initialFilterFc);
637
638
  const adjustedBaseFreq = Math.min(maxFreq, baseFreq);
638
- const modEndTime = stopTime + instrumentKey.modRelease * velocityRate;
639
- filterNode.frequency
639
+ const modEndTime = stopTime +
640
+ note.instrumentKey.modRelease * velocityRate;
641
+ note.filterNode.frequency
640
642
  .cancelScheduledValues(stopTime)
641
643
  .linearRampToValueAtTime(adjustedBaseFreq, modEndTime);
642
- targetNote.ending = true;
644
+ note.ending = true;
643
645
  this.scheduleTask(() => {
644
- bufferSource.loop = false;
646
+ note.bufferSource.loop = false;
645
647
  }, stopTime);
646
648
  return new Promise((resolve) => {
647
- bufferSource.onended = () => {
648
- targetNotes[i] = null;
649
- bufferSource.disconnect(0);
650
- filterNode.disconnect(0);
651
- gainNode.disconnect(0);
652
- if (modLFOGain)
653
- modLFOGain.disconnect(0);
654
- if (modLFO)
655
- modLFO.stop();
649
+ note.bufferSource.onended = () => {
650
+ scheduledNotes[i] = null;
651
+ note.bufferSource.disconnect();
652
+ note.filterNode.disconnect();
653
+ note.gainNode.disconnect();
654
+ if (note.modLFOGain)
655
+ note.modLFOGain.disconnect();
656
+ if (note.modLFO)
657
+ note.modLFO.stop();
656
658
  resolve();
657
659
  };
658
660
  bufferSource.stop(volEndTime);
@@ -894,11 +896,11 @@ class MidyGMLite {
894
896
  case 2: // GM System Off
895
897
  break;
896
898
  default:
897
- console.warn(`Unsupported Exclusive Message ${data}`);
899
+ console.warn(`Unsupported Exclusive Message: ${data}`);
898
900
  }
899
901
  break;
900
902
  default:
901
- console.warn(`Unsupported Exclusive Message ${data}`);
903
+ console.warn(`Unsupported Exclusive Message: ${data}`);
902
904
  }
903
905
  }
904
906
  GM1SystemOn() {
@@ -917,11 +919,11 @@ class MidyGMLite {
917
919
  case 1:
918
920
  return this.handleMasterVolumeSysEx(data);
919
921
  default:
920
- console.warn(`Unsupported Exclusive Message ${data}`);
922
+ console.warn(`Unsupported Exclusive Message: ${data}`);
921
923
  }
922
924
  break;
923
925
  default:
924
- console.warn(`Unsupported Exclusive Message ${data}`);
926
+ console.warn(`Unsupported Exclusive Message: ${data}`);
925
927
  }
926
928
  }
927
929
  handleMasterVolumeSysEx(data) {
@@ -939,7 +941,7 @@ class MidyGMLite {
939
941
  }
940
942
  }
941
943
  handleExclusiveMessage(data) {
942
- console.warn(`Unsupported Exclusive Message ${data}`);
944
+ console.warn(`Unsupported Exclusive Message: ${data}`);
943
945
  }
944
946
  handleSysEx(data) {
945
947
  switch (data[0]) {
package/script/midy.d.ts CHANGED
@@ -4,8 +4,8 @@ export class Midy {
4
4
  volume: number;
5
5
  pan: number;
6
6
  portamentoTime: number;
7
- reverb: number;
8
- chorus: number;
7
+ reverbSendLevel: number;
8
+ chorusSendLevel: number;
9
9
  vibratoRate: number;
10
10
  vibratoDepth: number;
11
11
  vibratoDelay: number;
@@ -40,12 +40,26 @@ export class Midy {
40
40
  lfoFilterDepth: number;
41
41
  lfoAmplitudeDepth: number;
42
42
  };
43
- constructor(audioContext: any);
43
+ constructor(audioContext: any, options?: {
44
+ reverbAlgorithm: (audioContext: any) => {
45
+ input: any;
46
+ output: any;
47
+ };
48
+ });
44
49
  ticksPerBeat: number;
45
50
  totalTime: number;
46
- reverbFactor: number;
47
51
  masterFineTuning: number;
48
52
  masterCoarseTuning: number;
53
+ reverb: {
54
+ time: number;
55
+ feedback: number;
56
+ };
57
+ chorus: {
58
+ modRate: number;
59
+ modDepth: number;
60
+ feedback: number;
61
+ sendToReverb: number;
62
+ };
49
63
  mono: boolean;
50
64
  omni: boolean;
51
65
  noteCheckInterval: number;
@@ -63,69 +77,21 @@ export class Midy {
63
77
  timeline: any[];
64
78
  instruments: any[];
65
79
  notePromises: any[];
66
- audioContext: any;
67
- masterGain: any;
68
- channels: {
69
- scheduledNotes: Map<any, any>;
70
- sostenutoNotes: Map<any, any>;
71
- polyphonicKeyPressure: {
72
- pitchControl: number;
73
- filterCutoffControl: number;
74
- amplitudeControl: number;
75
- lfoPitchDepth: number;
76
- lfoFilterDepth: number;
77
- lfoAmplitudeDepth: number;
78
- };
79
- channelPressure: {
80
- pitchControl: number;
81
- filterCutoffControl: number;
82
- amplitudeControl: number;
83
- lfoPitchDepth: number;
84
- lfoFilterDepth: number;
85
- lfoAmplitudeDepth: number;
80
+ defaultOptions: {
81
+ reverbAlgorithm: (audioContext: any) => {
82
+ input: any;
83
+ output: any;
86
84
  };
87
- gainL: any;
88
- gainR: any;
89
- reverbEffect: {
90
- convolverNode: any;
91
- dryGain: any;
92
- wetGain: any;
93
- };
94
- chorusEffect: {
95
- lfo: any;
96
- lfoGain: any;
97
- delayNodes: any[];
98
- chorusGains: any[];
85
+ };
86
+ audioContext: any;
87
+ options: {
88
+ reverbAlgorithm: (audioContext: any) => {
89
+ input: any;
90
+ output: any;
99
91
  };
100
- expression: number;
101
- modulation: number;
102
- sustainPedal: boolean;
103
- portamento: boolean;
104
- sostenutoPedal: boolean;
105
- softPedal: number;
106
- rpnMSB: number;
107
- rpnLSB: number;
108
- pitchBendRange: number;
109
- currentBufferSource: null;
110
- volume: number;
111
- pan: number;
112
- portamentoTime: number;
113
- reverb: number;
114
- chorus: number;
115
- vibratoRate: number;
116
- vibratoDepth: number;
117
- vibratoDelay: number;
118
- bank: number;
119
- bankMSB: number;
120
- bankLSB: number;
121
- dataMSB: number;
122
- dataLSB: number;
123
- program: number;
124
- pitchBend: number;
125
- fineTuning: number;
126
- coarseTuning: number;
127
- modulationDepthRange: number;
128
- }[];
92
+ };
93
+ masterGain: any;
94
+ channels: any[];
129
95
  initSoundFontTable(): any[];
130
96
  addSoundFont(soundFont: any): void;
131
97
  loadSoundFont(soundFontUrl: any): Promise<void>;
@@ -133,79 +99,20 @@ export class Midy {
133
99
  setChannelAudioNodes(audioContext: any): {
134
100
  gainL: any;
135
101
  gainR: any;
102
+ merger: any;
136
103
  reverbEffect: {
137
- convolverNode: any;
138
- dryGain: any;
139
- wetGain: any;
104
+ input: any;
105
+ output: any;
140
106
  };
141
107
  chorusEffect: {
142
108
  lfo: any;
143
109
  lfoGain: any;
144
110
  delayNodes: any[];
145
111
  chorusGains: any[];
112
+ output: any;
146
113
  };
147
114
  };
148
- createChannels(audioContext: any): {
149
- scheduledNotes: Map<any, any>;
150
- sostenutoNotes: Map<any, any>;
151
- polyphonicKeyPressure: {
152
- pitchControl: number;
153
- filterCutoffControl: number;
154
- amplitudeControl: number;
155
- lfoPitchDepth: number;
156
- lfoFilterDepth: number;
157
- lfoAmplitudeDepth: number;
158
- };
159
- channelPressure: {
160
- pitchControl: number;
161
- filterCutoffControl: number;
162
- amplitudeControl: number;
163
- lfoPitchDepth: number;
164
- lfoFilterDepth: number;
165
- lfoAmplitudeDepth: number;
166
- };
167
- gainL: any;
168
- gainR: any;
169
- reverbEffect: {
170
- convolverNode: any;
171
- dryGain: any;
172
- wetGain: any;
173
- };
174
- chorusEffect: {
175
- lfo: any;
176
- lfoGain: any;
177
- delayNodes: any[];
178
- chorusGains: any[];
179
- };
180
- expression: number;
181
- modulation: number;
182
- sustainPedal: boolean;
183
- portamento: boolean;
184
- sostenutoPedal: boolean;
185
- softPedal: number;
186
- rpnMSB: number;
187
- rpnLSB: number;
188
- pitchBendRange: number;
189
- currentBufferSource: null;
190
- volume: number;
191
- pan: number;
192
- portamentoTime: number;
193
- reverb: number;
194
- chorus: number;
195
- vibratoRate: number;
196
- vibratoDepth: number;
197
- vibratoDelay: number;
198
- bank: number;
199
- bankMSB: number;
200
- bankLSB: number;
201
- dataMSB: number;
202
- dataLSB: number;
203
- program: number;
204
- pitchBend: number;
205
- fineTuning: number;
206
- coarseTuning: number;
207
- modulationDepthRange: number;
208
- }[];
115
+ createChannels(audioContext: any): any[];
209
116
  createNoteBuffer(instrumentKey: any, isSF3: any): Promise<any>;
210
117
  createNoteBufferNode(instrumentKey: any, isSF3: any): Promise<any>;
211
118
  convertToFloat32Array(uint8Array: any): Float32Array;
@@ -228,18 +135,27 @@ export class Midy {
228
135
  currentTime(): number;
229
136
  getActiveNotes(channel: any, time: any): Map<any, any>;
230
137
  getActiveNote(noteList: any, time: any): any;
231
- createReverbEffect(audioContext: any, options?: {}): {
138
+ createConvolutionReverbImpulse(audioContext: any, decay: any, preDecay: any): any;
139
+ createConvolutionReverb(audioContext: any, impulse: any): {
140
+ input: any;
141
+ output: any;
232
142
  convolverNode: any;
233
- dryGain: any;
234
- wetGain: any;
143
+ };
144
+ createCombFilter(audioContext: any, input: any, delay: any, feedback: any): any;
145
+ createAllpassFilter(audioContext: any, input: any, delay: any, feedback: any): any;
146
+ generateDistributedArray(center: any, count: any, varianceRatio?: number, randomness?: number): any[];
147
+ createSchroederReverb(audioContext: any, combDelays: any, combFeedbacks: any, allpassDelays: any, allpassFeedbacks: any): {
148
+ input: any;
149
+ output: any;
235
150
  };
236
151
  createChorusEffect(audioContext: any, options?: {}): {
237
152
  lfo: any;
238
153
  lfoGain: any;
239
154
  delayNodes: any[];
240
155
  chorusGains: any[];
156
+ output: any;
241
157
  };
242
- connectNoteEffects(channel: any, gainNode: any): void;
158
+ connectEffects(channel: any, gainNode: any): void;
243
159
  cbToRatio(cb: any): number;
244
160
  centToHz(cent: any): number;
245
161
  calcSemitoneOffset(channel: any): any;
@@ -279,8 +195,8 @@ export class Midy {
279
195
  updateChannelGain(channel: any): void;
280
196
  setSustainPedal(channelNumber: any, value: any): void;
281
197
  setPortamento(channelNumber: any, value: any): void;
282
- setReverbSendLevel(channelNumber: any, reverb: any): void;
283
- setChorusSendLevel(channelNumber: any, chorus: any): void;
198
+ setReverbSendLevel(channelNumber: any, reverbSendLevel: any): void;
199
+ setChorusSendLevel(channelNumber: any, chorusSendLevel: any): void;
284
200
  setSostenutoPedal(channelNumber: any, value: any): void;
285
201
  setSoftPedal(channelNumber: any, softPedal: any): void;
286
202
  setVibratoRate(channelNumber: any, vibratoRate: any): void;
@@ -320,6 +236,19 @@ export class Midy {
320
236
  setMasterFineTuning(fineTuning: any): void;
321
237
  handleMasterCoarseTuningSysEx(data: any): void;
322
238
  setMasterCoarseTuning(coarseTuning: any): void;
239
+ handleGlobalParameterControl(data: any): void;
240
+ handleReverbParameter(data: any): void;
241
+ setReverbType(type: any): void;
242
+ getReverbTimeFromType(type: any): number | undefined;
243
+ setReverbTime(value: any): void;
244
+ getReverbTime(value: any): number;
245
+ calcDelay(rt60: any, feedback: any): number;
246
+ handleChorusParameter(data: any): void;
247
+ setChorusType(type: any): void;
248
+ setChorusModRate(value: any): void;
249
+ setChorusModDepth(value: any): void;
250
+ setChorusFeedback(value: any): void;
251
+ setChorusSendToReverb(value: any): void;
323
252
  handleExclusiveMessage(data: any): void;
324
253
  handleSysEx(data: any): void;
325
254
  scheduleTask(callback: any, startTime: any): Promise<any>;
@@ -1 +1 @@
1
- {"version":3,"file":"midy.d.ts","sourceRoot":"","sources":["../src/midy.js"],"names":[],"mappings":"AAuBA;IAwBE;;;;;;;;;;;;;;;;;;;;MAoBE;IAEF;;;;;;;;;;;MAWE;IAEF;;;;;;;MAOE;IAEF,+BAMC;IAzED,qBAAmB;IACnB,kBAAc;IACd,qBAAmB;IACnB,yBAAqB;IACrB,2BAAuB;IACvB,cAAa;IACb,cAAa;IACb,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;IA+ChB,kBAAgC;IAChC,gBAA4C;IAE5C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAAiD;IAInD,4BAMC;IAED,mCASC;IAED,gDAMC;IAED,sCASC;IAED;;;;;;;;;;;;;;MAqBC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAiBC;IAED,+DAyBC;IAED,mEAWC;IAED,qDAOC;IAED,2EAyDC;IAED,mCAOC;IAED,0BA+CC;IAED,uDAEC;IAED,wDAEC;IAED;;;MAgGC;IAED,4BAsBC;IAED,uBAKC;IAED,aAGC;IAED,cAKC;IAED,wBAIC;IAED,0BAKC;IAED,wBAOC;IAED,sBAGC;IAED,uDASC;IAED,6CAQC;IAED;;;;MAoCC;IAED;;;;;MAqCC;IAED,sDA6BC;IAED,2BAEC;IAED,4BAEC;IAED,sCAKC;IAED,mFAGC;IAED,iDAiBC;IAED,iDAiCC;IAED,0DAmBC;IAED,uDAcC;IAED,wHAqCC;IAED,gDAQC;IAED,kGAgCC;IAED,0EAGC;IAED,sIAwDC;IAED,0FAGC;IAED,kEAeC;IAED,oEAYC;IAED,wFAqBC;IAED,sFAcC;IAED,4DAIC;IAED,+DAcC;IAED,qEAGC;IAED,uDAOC;IAED,mFAkEC;IAED,+CAEC;IAED,qCAcC;IAED,yDAIC;IAED,iEAEC;IAED,iDAIC;IAED;;;MAMC;IAED,2CAIC;IAED,yDAIC;IAED,+CAEC;IAED,mDAGC;IAED,sCAUC;IAED,sDAMC;IAED,oDAEC;IAED,0DASC;IAED,0DAIC;IAED,wDAWC;IAED,uDAGC;IAED,2DAGC;IAED,6DAGC;IAED,6DASC;IAED,kFAeC;IAED,2DAMC;IAED,gDAyBC;IAED,wCAEC;IAED,wCAEC;IAED,gDAEC;IAED,gDAEC;IAED,mDAGC;IAED,oDAUC;IAED,kDAKC;IAED,iEAOC;IAED,8CAKC;IAED,yDAMC;IAED,gDAKC;IAED,6DAMC;IAED,wDAKC;IAED,6EAKC;IAED,uCAoBC;IAED,8CAEC;IAED,uCAoBC;IAED,gBAEC;IAED,eAEC;IAED,eAEC;IAED,eAEC;IAED,4DAmBC;IAED,oBAQC;IAED,oBAQC;IAED,yDAgDC;IAED,yCAGC;IAED,mCAQC;IAED,6CAGC;IAED,2CAMC;IAED,+CAGC;IAED,+CAMC;IAED,wCAEC;IAED,6BASC;IAED,0DAUC;CACF;AAxjDD;IASE,gFAKC;IAbD,kBAAa;IACb,cAAS;IACT,gBAAW;IACX,YAAO;IACP,gBAAW;IACX,YAAO;IACP,gBAAW;IAGT,gBAA4B;IAC5B,cAAwB;IACxB,eAA0B;IAC1B,mBAAkC;CAErC"}
1
+ {"version":3,"file":"midy.d.ts","sourceRoot":"","sources":["../src/midy.js"],"names":[],"mappings":"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"}