@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.
@@ -183,23 +183,23 @@ export class MidyGMLite {
183
183
  this.totalTime = this.calcTotalTime();
184
184
  }
185
185
  setChannelAudioNodes(audioContext) {
186
- const { gainLeft, gainRight } = this.panToGain(MidyGMLite.channelSettings.pan);
186
+ const { gainLeft, gainRight } = this.panToGain(this.constructor.channelSettings.pan);
187
187
  const gainL = new GainNode(audioContext, { gain: gainLeft });
188
188
  const gainR = new GainNode(audioContext, { gain: gainRight });
189
189
  const merger = new ChannelMergerNode(audioContext, { numberOfInputs: 2 });
190
190
  gainL.connect(merger, 0, 0);
191
191
  gainR.connect(merger, 0, 1);
192
- merger.connect(this.masterGain);
193
192
  return {
194
193
  gainL,
195
194
  gainR,
195
+ merger,
196
196
  };
197
197
  }
198
198
  createChannels(audioContext) {
199
199
  const channels = Array.from({ length: 16 }, () => {
200
200
  return {
201
- ...MidyGMLite.channelSettings,
202
- ...MidyGMLite.effectSettings,
201
+ ...this.constructor.channelSettings,
202
+ ...this.constructor.effectSettings,
203
203
  ...this.setChannelAudioNodes(audioContext),
204
204
  scheduledNotes: new Map(),
205
205
  };
@@ -491,9 +491,9 @@ export class MidyGMLite {
491
491
  }
492
492
  return noteList[0];
493
493
  }
494
- connectNoteEffects(channel, gainNode) {
495
- gainNode.connect(channel.gainL);
496
- gainNode.connect(channel.gainR);
494
+ connectEffects(channel, gainNode) {
495
+ gainNode.connect(channel.merger);
496
+ merger.connect(this.masterGain);
497
497
  }
498
498
  cbToRatio(cb) {
499
499
  return Math.pow(10, cb / 200);
@@ -559,7 +559,7 @@ export class MidyGMLite {
559
559
  startModulation(channel, note, time) {
560
560
  const { instrumentKey } = note;
561
561
  note.modLFOGain = new GainNode(this.audioContext, {
562
- gain: this.cbToRatio(instrumentKey.modLfoToVolume) * channel.modulation,
562
+ gain: this.cbToRatio(instrumentKey.modLfoToVolume + channel.modulation),
563
563
  });
564
564
  note.modLFO = new OscillatorNode(this.audioContext, {
565
565
  frequency: this.centToHz(instrumentKey.freqModLFO),
@@ -598,7 +598,7 @@ export class MidyGMLite {
598
598
  if (!instrumentKey)
599
599
  return;
600
600
  const note = await this.createNote(channel, instrumentKey, noteNumber, velocity, startTime, isSF3);
601
- this.connectNoteEffects(channel, note.gainNode);
601
+ this.connectEffects(channel, note.gainNode);
602
602
  const scheduledNotes = channel.scheduledNotes;
603
603
  if (scheduledNotes.has(noteNumber)) {
604
604
  scheduledNotes.get(noteNumber).push(note);
@@ -617,39 +617,41 @@ export class MidyGMLite {
617
617
  return;
618
618
  if (!channel.scheduledNotes.has(noteNumber))
619
619
  return;
620
- const targetNotes = channel.scheduledNotes.get(noteNumber);
621
- for (let i = 0; i < targetNotes.length; i++) {
622
- const targetNote = targetNotes[i];
623
- if (!targetNote)
620
+ const scheduledNotes = channel.scheduledNotes.get(noteNumber);
621
+ for (let i = 0; i < scheduledNotes.length; i++) {
622
+ const note = scheduledNotes[i];
623
+ if (!note)
624
624
  continue;
625
- if (targetNote.ending)
625
+ if (note.ending)
626
626
  continue;
627
- const { bufferSource, filterNode, gainNode, modLFO, modLFOGain, instrumentKey, } = targetNote;
628
627
  const velocityRate = (velocity + 127) / 127;
629
- const volEndTime = stopTime + instrumentKey.volRelease * velocityRate;
630
- gainNode.gain.cancelScheduledValues(stopTime);
631
- gainNode.gain.linearRampToValueAtTime(0, volEndTime);
628
+ const volEndTime = stopTime +
629
+ note.instrumentKey.volRelease * velocityRate;
630
+ note.gainNode.gain
631
+ .cancelScheduledValues(stopTime)
632
+ .linearRampToValueAtTime(0, volEndTime);
632
633
  const maxFreq = this.audioContext.sampleRate / 2;
633
- const baseFreq = this.centToHz(instrumentKey.initialFilterFc);
634
+ const baseFreq = this.centToHz(note.instrumentKey.initialFilterFc);
634
635
  const adjustedBaseFreq = Math.min(maxFreq, baseFreq);
635
- const modEndTime = stopTime + instrumentKey.modRelease * velocityRate;
636
- filterNode.frequency
636
+ const modEndTime = stopTime +
637
+ note.instrumentKey.modRelease * velocityRate;
638
+ note.filterNode.frequency
637
639
  .cancelScheduledValues(stopTime)
638
640
  .linearRampToValueAtTime(adjustedBaseFreq, modEndTime);
639
- targetNote.ending = true;
641
+ note.ending = true;
640
642
  this.scheduleTask(() => {
641
- bufferSource.loop = false;
643
+ note.bufferSource.loop = false;
642
644
  }, stopTime);
643
645
  return new Promise((resolve) => {
644
- bufferSource.onended = () => {
645
- targetNotes[i] = null;
646
- bufferSource.disconnect(0);
647
- filterNode.disconnect(0);
648
- gainNode.disconnect(0);
649
- if (modLFOGain)
650
- modLFOGain.disconnect(0);
651
- if (modLFO)
652
- modLFO.stop();
646
+ note.bufferSource.onended = () => {
647
+ scheduledNotes[i] = null;
648
+ note.bufferSource.disconnect();
649
+ note.filterNode.disconnect();
650
+ note.gainNode.disconnect();
651
+ if (note.modLFOGain)
652
+ note.modLFOGain.disconnect();
653
+ if (note.modLFO)
654
+ note.modLFO.stop();
653
655
  resolve();
654
656
  };
655
657
  bufferSource.stop(volEndTime);
@@ -891,11 +893,11 @@ export class MidyGMLite {
891
893
  case 2: // GM System Off
892
894
  break;
893
895
  default:
894
- console.warn(`Unsupported Exclusive Message ${data}`);
896
+ console.warn(`Unsupported Exclusive Message: ${data}`);
895
897
  }
896
898
  break;
897
899
  default:
898
- console.warn(`Unsupported Exclusive Message ${data}`);
900
+ console.warn(`Unsupported Exclusive Message: ${data}`);
899
901
  }
900
902
  }
901
903
  GM1SystemOn() {
@@ -914,11 +916,11 @@ export class MidyGMLite {
914
916
  case 1:
915
917
  return this.handleMasterVolumeSysEx(data);
916
918
  default:
917
- console.warn(`Unsupported Exclusive Message ${data}`);
919
+ console.warn(`Unsupported Exclusive Message: ${data}`);
918
920
  }
919
921
  break;
920
922
  default:
921
- console.warn(`Unsupported Exclusive Message ${data}`);
923
+ console.warn(`Unsupported Exclusive Message: ${data}`);
922
924
  }
923
925
  }
924
926
  handleMasterVolumeSysEx(data) {
@@ -936,7 +938,7 @@ export class MidyGMLite {
936
938
  }
937
939
  }
938
940
  handleExclusiveMessage(data) {
939
- console.warn(`Unsupported Exclusive Message ${data}`);
941
+ console.warn(`Unsupported Exclusive Message: ${data}`);
940
942
  }
941
943
  handleSysEx(data) {
942
944
  switch (data[0]) {
package/esm/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>;
package/esm/midy.d.ts.map CHANGED
@@ -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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"}