@marmooo/midy 0.2.2 → 0.2.4

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.
@@ -224,11 +224,11 @@ class MidyGMLite {
224
224
  value: new Map()
225
225
  });
226
226
  this.audioContext = audioContext;
227
- this.masterGain = new GainNode(audioContext);
227
+ this.masterVolume = new GainNode(audioContext);
228
228
  this.voiceParamsHandlers = this.createVoiceParamsHandlers();
229
229
  this.controlChangeHandlers = this.createControlChangeHandlers();
230
230
  this.channels = this.createChannels(audioContext);
231
- this.masterGain.connect(audioContext.destination);
231
+ this.masterVolume.connect(audioContext.destination);
232
232
  this.GM1SystemOn();
233
233
  }
234
234
  initSoundFontTable() {
@@ -274,7 +274,7 @@ class MidyGMLite {
274
274
  const merger = new ChannelMergerNode(audioContext, { numberOfInputs: 2 });
275
275
  gainL.connect(merger, 0, 0);
276
276
  gainR.connect(merger, 0, 1);
277
- merger.connect(this.masterGain);
277
+ merger.connect(this.masterVolume);
278
278
  return {
279
279
  gainL,
280
280
  gainR,
@@ -598,19 +598,22 @@ class MidyGMLite {
598
598
  const pitchWheelSensitivity = channel.state.pitchWheelSensitivity * 12800;
599
599
  return pitchWheel * pitchWheelSensitivity;
600
600
  }
601
- updateDetune(channel) {
602
- const now = this.audioContext.currentTime;
601
+ updateChannelDetune(channel) {
603
602
  channel.scheduledNotes.forEach((noteList) => {
604
603
  for (let i = 0; i < noteList.length; i++) {
605
604
  const note = noteList[i];
606
605
  if (!note)
607
606
  continue;
608
- note.bufferSource.detune
609
- .cancelScheduledValues(now)
610
- .setValueAtTime(channel.detune, now);
607
+ this.updateDetune(channel, note);
611
608
  }
612
609
  });
613
610
  }
611
+ updateDetune(channel, note) {
612
+ const now = this.audioContext.currentTime;
613
+ note.bufferSource.detune
614
+ .cancelScheduledValues(now)
615
+ .setValueAtTime(channel.detune, now);
616
+ }
614
617
  setVolumeEnvelope(note) {
615
618
  const now = this.audioContext.currentTime;
616
619
  const { voiceParams, startTime } = note;
@@ -859,7 +862,7 @@ class MidyGMLite {
859
862
  const next = (value - 8192) / 8192;
860
863
  state.pitchWheel = value / 16383;
861
864
  channel.detune += (next - prev) * state.pitchWheelSensitivity * 12800;
862
- this.updateDetune(channel);
865
+ this.updateChannelDetune(channel);
863
866
  this.applyVoiceParams(channel, 14);
864
867
  }
865
868
  setModLfoToPitch(channel, note) {
@@ -916,7 +919,7 @@ class MidyGMLite {
916
919
  if (0 < channel.state.modulationDepth)
917
920
  this.setModLfoToFilterFc(note);
918
921
  },
919
- modLfoToVolume: (channel, note) => {
922
+ modLfoToVolume: (channel, note, _prevValue) => {
920
923
  if (0 < channel.state.modulationDepth)
921
924
  this.setModLfoToVolume(note);
922
925
  },
@@ -963,7 +966,7 @@ class MidyGMLite {
963
966
  if (key in voiceParams)
964
967
  noteVoiceParams[key] = voiceParams[key];
965
968
  }
966
- this.setFilterEnvelope(channel, note);
969
+ this.setFilterEnvelope(note);
967
970
  this.setPitchEnvelope(note);
968
971
  }
969
972
  else if (volumeEnvelopeKeySet.has(key)) {
@@ -1002,6 +1005,8 @@ class MidyGMLite {
1002
1005
  const handler = this.controlChangeHandlers[controllerType];
1003
1006
  if (handler) {
1004
1007
  handler.call(this, channelNumber, value);
1008
+ const channel = this.channels[channelNumber];
1009
+ this.applyVoiceParams(channel, controllerType + 128);
1005
1010
  }
1006
1011
  else {
1007
1012
  console.warn(`Unsupported Control change: controllerType=${controllerType} value=${value}`);
@@ -1009,13 +1014,14 @@ class MidyGMLite {
1009
1014
  }
1010
1015
  updateModulation(channel) {
1011
1016
  const now = this.audioContext.currentTime;
1017
+ const depth = channel.state.modulationDepth * channel.modulationDepthRange;
1012
1018
  channel.scheduledNotes.forEach((noteList) => {
1013
1019
  for (let i = 0; i < noteList.length; i++) {
1014
1020
  const note = noteList[i];
1015
1021
  if (!note)
1016
1022
  continue;
1017
1023
  if (note.modulationDepth) {
1018
- note.modulationDepth.gain.setValueAtTime(channel.state.modulationDepth, now);
1024
+ note.modulationDepth.gain.setValueAtTime(depth, now);
1019
1025
  }
1020
1026
  else {
1021
1027
  this.setPitchEnvelope(note);
@@ -1026,8 +1032,7 @@ class MidyGMLite {
1026
1032
  }
1027
1033
  setModulationDepth(channelNumber, modulation) {
1028
1034
  const channel = this.channels[channelNumber];
1029
- channel.state.modulationDepth = (modulation / 127) *
1030
- channel.modulationDepthRange;
1035
+ channel.state.modulationDepth = modulation / 127;
1031
1036
  this.updateModulation(channel);
1032
1037
  }
1033
1038
  setVolume(channelNumber, volume) {
@@ -1119,12 +1124,14 @@ class MidyGMLite {
1119
1124
  const pitchBendRange = channel.dataMSB + channel.dataLSB / 100;
1120
1125
  this.setPitchBendRange(channelNumber, pitchBendRange);
1121
1126
  }
1122
- setPitchBendRange(channelNumber, pitchWheelSensitivity) {
1127
+ setPitchBendRange(channelNumber, value) {
1123
1128
  const channel = this.channels[channelNumber];
1124
1129
  const state = channel.state;
1125
- state.pitchWheelSensitivity = pitchWheelSensitivity / 128;
1126
- const detune = (state.pitchWheel * 2 - 1) * pitchWheelSensitivity * 100;
1127
- this.updateDetune(channel, detune);
1130
+ const prev = state.pitchWheelSensitivity;
1131
+ const next = value / 128;
1132
+ state.pitchWheelSensitivity = next;
1133
+ channel.detune += (state.pitchWheel * 2 - 1) * (next - prev) * 12800;
1134
+ this.updateChannelDetune(channel);
1128
1135
  this.applyVoiceParams(channel, 16);
1129
1136
  }
1130
1137
  allSoundOff(channelNumber) {
@@ -1141,7 +1148,7 @@ class MidyGMLite {
1141
1148
  const state = channel.state;
1142
1149
  for (let i = 0; i < stateTypes.length; i++) {
1143
1150
  const type = stateTypes[i];
1144
- state[type] = defaultControllerState[type];
1151
+ state[type] = defaultControllerState[type].defaultValue;
1145
1152
  }
1146
1153
  const settingTypes = [
1147
1154
  "rpnMSB",
@@ -1203,8 +1210,8 @@ class MidyGMLite {
1203
1210
  }
1204
1211
  else {
1205
1212
  const now = this.audioContext.currentTime;
1206
- this.masterGain.gain.cancelScheduledValues(now);
1207
- this.masterGain.gain.setValueAtTime(volume * volume, now);
1213
+ this.masterVolume.gain.cancelScheduledValues(now);
1214
+ this.masterVolume.gain.setValueAtTime(volume * volume, now);
1208
1215
  }
1209
1216
  }
1210
1217
  handleExclusiveMessage(data) {
package/script/midy.d.ts CHANGED
@@ -3,7 +3,8 @@ export class Midy {
3
3
  currentBufferSource: null;
4
4
  detune: number;
5
5
  scaleOctaveTuningTable: any[];
6
- pressureTable: Uint8Array<ArrayBuffer>;
6
+ channelPressureTable: Uint8Array<ArrayBuffer>;
7
+ polyphonicKeyPressureTable: Uint8Array<ArrayBuffer>;
7
8
  keyBasedInstrumentControlTable: Int8Array<ArrayBuffer>;
8
9
  program: number;
9
10
  bank: number;
@@ -17,14 +18,6 @@ export class Midy {
17
18
  coarseTuning: number;
18
19
  modulationDepthRange: number;
19
20
  };
20
- static controllerDestinationSettings: {
21
- pitchControl: number;
22
- filterCutoffControl: number;
23
- amplitudeControl: number;
24
- lfoPitchDepth: number;
25
- lfoFilterDepth: number;
26
- lfoAmplitudeDepth: number;
27
- };
28
21
  constructor(audioContext: any, options?: {
29
22
  reverbAlgorithm: (audioContext: any) => {
30
23
  input: any;
@@ -77,12 +70,12 @@ export class Midy {
77
70
  output: any;
78
71
  };
79
72
  };
80
- masterGain: any;
73
+ masterVolume: any;
81
74
  voiceParamsHandlers: {
82
75
  modLfoToPitch: (channel: any, note: any, _prevValue: any) => void;
83
76
  vibLfoToPitch: (channel: any, note: any, _prevValue: any) => void;
84
77
  modLfoToFilterFc: (channel: any, note: any, _prevValue: any) => void;
85
- modLfoToVolume: (channel: any, note: any) => void;
78
+ modLfoToVolume: (channel: any, note: any, _prevValue: any) => void;
86
79
  chorusEffectsSend: (channel: any, note: any, prevValue: any) => void;
87
80
  reverbEffectsSend: (channel: any, note: any, prevValue: any) => void;
88
81
  delayModLFO: (_channel: any, note: any, _prevValue: any) => void;
@@ -201,14 +194,15 @@ export class Midy {
201
194
  centToHz(cent: any): number;
202
195
  calcChannelDetune(channel: any): any;
203
196
  calcNoteDetune(channel: any, note: any): any;
204
- updateDetune(channel: any): void;
197
+ updateChannelDetune(channel: any): void;
198
+ updateDetune(channel: any, note: any, pressure: any): void;
205
199
  getPortamentoTime(channel: any): number;
206
200
  setPortamentoStartVolumeEnvelope(channel: any, note: any): void;
207
- setVolumeEnvelope(channel: any, note: any): void;
201
+ setVolumeEnvelope(channel: any, note: any, pressure: any): void;
208
202
  setPitchEnvelope(note: any): void;
209
203
  clampCutoffFrequency(frequency: any): number;
210
204
  setPortamentoStartFilterEnvelope(channel: any, note: any): void;
211
- setFilterEnvelope(channel: any, note: any): void;
205
+ setFilterEnvelope(channel: any, note: any, pressure: any): void;
212
206
  startModulation(channel: any, note: any, startTime: any): void;
213
207
  startVibrato(channel: any, note: any, startTime: any): void;
214
208
  createNote(channel: any, voice: any, noteNumber: any, velocity: any, startTime: any, portamento: any, isSF3: any): Promise<Note>;
@@ -224,22 +218,22 @@ export class Midy {
224
218
  handlePolyphonicKeyPressure(channelNumber: any, noteNumber: any, pressure: any): void;
225
219
  handleProgramChange(channelNumber: any, program: any): void;
226
220
  handleChannelPressure(channelNumber: any, value: any): void;
227
- setChannelPressure(channel: any, note: any): void;
228
221
  handlePitchBendMessage(channelNumber: any, lsb: any, msb: any): void;
229
222
  setPitchBend(channelNumber: any, value: any): void;
230
- setModLfoToPitch(channel: any, note: any): void;
223
+ setModLfoToPitch(channel: any, note: any, pressure: any): void;
231
224
  setVibLfoToPitch(channel: any, note: any): void;
232
- setModLfoToFilterFc(channel: any, note: any): void;
233
- setModLfoToVolume(channel: any, note: any): void;
225
+ setModLfoToFilterFc(note: any, pressure: any): void;
226
+ setModLfoToVolume(note: any, pressure: any): void;
234
227
  setReverbEffectsSend(channel: any, note: any, prevValue: any): void;
235
228
  setChorusEffectsSend(channel: any, note: any, prevValue: any): void;
236
229
  setDelayModLFO(note: any): void;
237
230
  setFreqModLFO(note: any): void;
231
+ setFreqVibLFO(channel: any, note: any): void;
238
232
  createVoiceParamsHandlers(): {
239
233
  modLfoToPitch: (channel: any, note: any, _prevValue: any) => void;
240
234
  vibLfoToPitch: (channel: any, note: any, _prevValue: any) => void;
241
235
  modLfoToFilterFc: (channel: any, note: any, _prevValue: any) => void;
242
- modLfoToVolume: (channel: any, note: any) => void;
236
+ modLfoToVolume: (channel: any, note: any, _prevValue: any) => void;
243
237
  chorusEffectsSend: (channel: any, note: any, prevValue: any) => void;
244
238
  reverbEffectsSend: (channel: any, note: any, prevValue: any) => void;
245
239
  delayModLFO: (_channel: any, note: any, _prevValue: any) => void;
@@ -342,7 +336,7 @@ export class Midy {
342
336
  handleUniversalNonRealTimeExclusiveMessage(data: any): void;
343
337
  GM1SystemOn(): void;
344
338
  GM2SystemOn(): void;
345
- handleUniversalRealTimeExclusiveMessage(data: any): void;
339
+ handleUniversalRealTimeExclusiveMessage(data: any): any;
346
340
  handleMasterVolumeSysEx(data: any): void;
347
341
  setMasterVolume(volume: any): void;
348
342
  handleMasterFineTuningSysEx(data: any): void;
@@ -369,11 +363,15 @@ export class Midy {
369
363
  getChorusSendToReverb(value: any): number;
370
364
  getChannelBitmap(data: any): any[];
371
365
  handleScaleOctaveTuning1ByteFormatSysEx(data: any): void;
372
- handleChannelPressureSysEx(data: any): void;
366
+ applyDestinationSettings(channel: any, note: any, table: any): void;
367
+ handleChannelPressureSysEx(data: any, tableName: any): void;
368
+ initControlTable(): Uint8Array<ArrayBuffer>;
369
+ applyControlTable(channel: any, controllerType: any): void;
370
+ handleControlChangeSysEx(data: any): void;
373
371
  getKeyBasedInstrumentControlValue(channel: any, keyNumber: any, controllerType: any): number;
374
372
  handleKeyBasedInstrumentControlSysEx(data: any): void;
375
373
  handleExclusiveMessage(data: any): void;
376
- handleSysEx(data: any): void;
374
+ handleSysEx(data: any): any;
377
375
  scheduleTask(callback: any, startTime: any): Promise<any>;
378
376
  }
379
377
  declare class Note {
@@ -392,6 +390,7 @@ declare class Note {
392
390
  reverbEffectsSend: any;
393
391
  chorusEffectsSend: any;
394
392
  portamento: any;
393
+ pressure: number;
395
394
  noteNumber: any;
396
395
  velocity: any;
397
396
  startTime: any;
@@ -1 +1 @@
1
- {"version":3,"file":"midy.d.ts","sourceRoot":"","sources":["../src/midy.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"midy.d.ts","sourceRoot":"","sources":["../src/midy.js"],"names":[],"mappings":"AAkHA;IAmCE;;;;;;;;;;;;;;;;;;MAkBE;IAgCF;;;;;OAaC;IAjGD,qBAAmB;IACnB,kBAAc;IACd,yBAAqB;IACrB,2BAAuB;IACvB;;;MAGE;IACF;;;;;;MAME;IACF,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;IAClB,iCAA8B;IAsB9B;;;;;MA4BE;IAGA,kBAAgC;IAChC;;;;;MAAqD;IACrD,kBAA8C;IAC9C;;;;;;;;;;;MAA2D;IAC3D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAA+D;IAC/D,gBAAiD;IACjD;;;MAA8D;IAC9D;;;;;;;;MAAyD;IAO3D,4BAMC;IAED,mCAWC;IAED,gDAMC;IAED,sCASC;IAED;;;;MAeC;IAED,yCAYC;IAED,6DA2BC;IAED,iEAUC;IAED,2CAcC;IAED,2EA8DC;IAED,mCAOC;IAED,0BAkDC;IAED,uDAEC;IAED,wDAEC;IAED;;;MAoGC;IAED,+EAoBC;IAED,qDAKC;IAED,uBAKC;IAED,aAGC;IAED,cAKC;IAED,wBAIC;IAED,0BAKC;IAED,wBAOC;IAED,sBAGC;IAED,uDASC;IAED,6CAQC;IAED,kFAuBC;IAED;;;;MAWC;IAED,gFAUC;IAED,mFAYC;IAED,sGAcC;IAID;;;MA8BC;IAED;;;;;;;;MA0CC;IAED,2BAEC;IAED,8BAEC;IAED,8BAEC;IAED,4BAEC;IAED,qCAUC;IAED,6CAEC;IAED,wCAQC;IAED,2DAOC;IAED,wCAIC;IAED,gEAWC;IAED,gEAkBC;IAED,kCAqBC;IAED,6CAIC;IAED,gEAuBC;IAED,gEA2BC;IAED,+DAoBC;IAED,4DAaC;IAED,iIA6DC;IAED,gDAQC;IAED,mHA0DC;IAED,2FASC;IAED,qFAqCC;IAED,wJAwCC;IAED,qHAUC;IAED,kEAeC;IAED,oEAYC;IAED,gFAqBC;IAED,sFAWC;IAED,4DAIC;IAED,4DAkBC;IAED,qEAGC;IAED,mDASC;IAED,+DAQC;IAED,gDASC;IAED,oDAMC;IAED,kDAQC;IAED,oEA2BC;IAED,oEA2BC;IAED,gCAOC;IAED,+BAMC;IAED,6CAMC;IAED;;;;;;;;;;;MAgDC;IAED,oFAMC;IAED,0DAiDC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAqCC;IAED,+EAYC;IAED,+CAEC;IAED,qCAeC;IAED,8DAIC;IAED,iEAIC;IAED,sCAiBC;IAED,iDAKC;IAED;;;MAMC;IAED,mCAqBC;IAED,2CAKC;IAED,yDAIC;IAED,+CAEC;IAED,mDAGC;IAED,wCAWC;IAED,sDAKC;IAED,oDAEC;IAED,wDAUC;IAED,uDAGC;IAED,mEAaC;IAED,2DAGC;IAED,yDAYC;IAED,yDAcC;IAED,uDAUC;IAED,2DAWC;IAED,6DAqBC;IAED,6DAYC;IAED,mEAmCC;IAED,mEAmCC;IAED,kFAeC;IAED,2DAMC;IAED,gDAyBC;IAGD,wCAEC;IAGD,wCAEC;IAED,gDAEC;IAED,gDAEC;IAED,mDAGC;IAED,kDAKC;IAED,wDASC;IAED,8CAKC;IAED,oDAOC;IAED,gDAKC;IAED,sDAOC;IAED,wDAKC;IAED,6EAIC;IAED,+CAEC;IAED,8CAyBC;IAED,+CAEC;IAED,gBAEC;IAED,eAEC;IAED,eAEC;IAED,eAEC;IAED,4DA4BC;IAED,oBASC;IAED,oBASC;IAED,wDAgDC;IAED,yCAGC;IAED,mCAQC;IAED,6CAGC;IAED,sCAMC;IAED,+CAGC;IAED,wCAMC;IAED,mDAeC;IAED,4CAOC;IAED,+BAKC;IAED,qDAiBC;IAED,gCAIC;IAED,kCAEC;IA6BD,4CAEC;IAED,4CAaC;IAED,+BAiBC;IAED,wFAKC;IAED,mCAKC;IAED,qCAEC;IAED,oCAOC;IAED,sCAEC;IAED,oCAUC;IAED,sCAEC;IAED,wCAuBC;IAED,0CAEC;IAED,mCAeC;IAED,yDAaC;IAED,oEAuDC;IAED,4DAQC;IAED,4CAUC;IAED,2DAWC;IAED,0CASC;IAED,6FAIC;IAED,sDAcC;IAED,wCAEC;IAED,4BASC;IAED,0DAUC;CACF;AArqFD;IAiBE,0FAMC;IAtBD,kBAAa;IACb,gBAAW;IACX,wBAAmB;IACnB,gBAAW;IACX,WAAM;IACN,WAAM;IACN,iBAAY;IACZ,mBAAc;IACd,qBAAgB;IAChB,gBAAW;IACX,kBAAa;IACb,uBAAkB;IAClB,uBAAkB;IAClB,gBAAW;IACX,iBAAa;IAGX,gBAA4B;IAC5B,cAAwB;IACxB,eAA0B;IAC1B,WAAkB;IAClB,iBAA8B;CAEjC"}