@marmooo/midy 0.0.5 → 0.0.7

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/esm/midy.js CHANGED
@@ -225,22 +225,23 @@ export class Midy {
225
225
  this.totalTime = this.calcTotalTime();
226
226
  }
227
227
  setChannelAudioNodes(audioContext) {
228
- const gainNode = new GainNode(audioContext, {
229
- gain: Midy.channelSettings.volume,
230
- });
231
- const pannerNode = new StereoPannerNode(audioContext, {
232
- pan: Midy.channelSettings.pan,
233
- });
228
+ const { gainLeft, gainRight } = this.panToGain(Midy.channelSettings.pan);
229
+ const gainL = new GainNode(audioContext, { gain: gainLeft });
230
+ const gainR = new GainNode(audioContext, { gain: gainRight });
231
+ const merger = new ChannelMergerNode(audioContext, { numberOfInputs: 2 });
232
+ gainL.connect(merger, 0, 0);
233
+ gainR.connect(merger, 0, 1);
234
+ merger.connect(this.masterGain);
234
235
  const reverbEffect = this.createReverbEffect(audioContext);
235
236
  const chorusEffect = this.createChorusEffect(audioContext);
236
237
  chorusEffect.lfo.start();
237
- reverbEffect.dryGain.connect(pannerNode);
238
- reverbEffect.wetGain.connect(pannerNode);
239
- pannerNode.connect(gainNode);
240
- gainNode.connect(this.masterGain);
238
+ reverbEffect.dryGain.connect(gainL);
239
+ reverbEffect.dryGain.connect(gainR);
240
+ reverbEffect.wetGain.connect(gainL);
241
+ reverbEffect.wetGain.connect(gainR);
241
242
  return {
242
- gainNode,
243
- pannerNode,
243
+ gainL,
244
+ gainR,
244
245
  reverbEffect,
245
246
  chorusEffect,
246
247
  };
@@ -340,7 +341,7 @@ export class Midy {
340
341
  this.handleChannelPressure(event.channel, event.amount);
341
342
  break;
342
343
  case "pitchBend":
343
- this.handlePitchBend(event.channel, event.value);
344
+ this.setPitchBend(event.channel, event.value);
344
345
  break;
345
346
  case "sysEx":
346
347
  this.handleSysEx(event.data);
@@ -420,7 +421,6 @@ export class Midy {
420
421
  const tmpChannels = new Array(16);
421
422
  for (let i = 0; i < tmpChannels.length; i++) {
422
423
  tmpChannels[i] = {
423
- durationTicks: new Map(),
424
424
  programNumber: -1,
425
425
  bankMSB: this.channels[i].bankMSB,
426
426
  bankLSB: this.channels[i].bankLSB,
@@ -450,16 +450,6 @@ export class Midy {
450
450
  }
451
451
  channel.programNumber = 0;
452
452
  }
453
- channel.durationTicks.set(event.noteNumber, {
454
- ticks: event.ticks,
455
- noteOn: event,
456
- });
457
- break;
458
- }
459
- case "noteOff": {
460
- const { ticks, noteOn } = tmpChannels[event.channel].durationTicks
461
- .get(event.noteNumber);
462
- noteOn.durationTicks = event.ticks - ticks;
463
453
  break;
464
454
  }
465
455
  case "controller":
@@ -494,8 +484,8 @@ export class Midy {
494
484
  });
495
485
  });
496
486
  const priority = {
497
- setTempo: 0,
498
- controller: 1,
487
+ controller: 0,
488
+ sysEx: 1,
499
489
  };
500
490
  timeline.sort((a, b) => {
501
491
  if (a.ticks !== b.ticks)
@@ -633,12 +623,8 @@ export class Midy {
633
623
  }
634
624
  createChorusEffect(audioContext, options = {}) {
635
625
  const { chorusCount = 2, chorusRate = 0.6, chorusDepth = 0.15, delay = 0.01, variance = delay * 0.1, } = options;
636
- const lfo = new OscillatorNode(audioContext, {
637
- frequency: chorusRate,
638
- });
639
- const lfoGain = new GainNode(audioContext, {
640
- gain: chorusDepth,
641
- });
626
+ const lfo = new OscillatorNode(audioContext, { frequency: chorusRate });
627
+ const lfoGain = new GainNode(audioContext, { gain: chorusDepth });
642
628
  const chorusGains = [];
643
629
  const delayNodes = [];
644
630
  const baseGain = 1 / chorusCount;
@@ -649,9 +635,7 @@ export class Midy {
649
635
  maxDelayTime: delayTime,
650
636
  });
651
637
  delayNodes.push(delayNode);
652
- const chorusGain = new GainNode(audioContext, {
653
- gain: baseGain,
654
- });
638
+ const chorusGain = new GainNode(audioContext, { gain: baseGain });
655
639
  chorusGains.push(chorusGain);
656
640
  lfo.connect(lfoGain);
657
641
  lfoGain.connect(delayNode.delayTime);
@@ -667,14 +651,16 @@ export class Midy {
667
651
  connectNoteEffects(channel, gainNode) {
668
652
  if (channel.reverb === 0) {
669
653
  if (channel.chorus === 0) { // no effect
670
- gainNode.connect(channel.pannerNode);
654
+ gainNode.connect(channel.gainL);
655
+ gainNode.connect(channel.gainR);
671
656
  }
672
657
  else { // chorus
673
658
  channel.chorusEffect.delayNodes.forEach((delayNode) => {
674
659
  gainNode.connect(delayNode);
675
660
  });
676
661
  channel.chorusEffect.chorusGains.forEach((chorusGain) => {
677
- chorusGain.connect(channel.pannerNode);
662
+ chorusGain.connect(channel.gainL);
663
+ chorusGain.connect(channel.gainR);
678
664
  });
679
665
  }
680
666
  }
@@ -713,9 +699,7 @@ export class Midy {
713
699
  }
714
700
  setVolumeEnvelope(channel, note) {
715
701
  const { instrumentKey, startTime, velocity } = note;
716
- note.gainNode = new GainNode(this.audioContext, {
717
- gain: 0,
718
- });
702
+ note.gainNode = new GainNode(this.audioContext, { gain: 0 });
719
703
  let volume = (velocity / 127) * channel.volume * channel.expression;
720
704
  if (volume === 0)
721
705
  volume = 1e-6; // exponentialRampToValueAtTime() requires a non-zero value
@@ -992,21 +976,15 @@ export class Midy {
992
976
  }
993
977
  handlePitchBendMessage(channelNumber, lsb, msb) {
994
978
  const pitchBend = msb * 128 + lsb;
995
- this.handlePitchBend(channelNumber, pitchBend);
979
+ this.setPitchBend(channelNumber, pitchBend);
996
980
  }
997
- handlePitchBend(channelNumber, pitchBend) {
998
- const now = this.audioContext.currentTime;
981
+ setPitchBend(channelNumber, pitchBend) {
999
982
  const channel = this.channels[channelNumber];
983
+ const prevPitchBend = channel.pitchBend;
1000
984
  channel.pitchBend = (pitchBend - 8192) / 8192;
1001
- const semitoneOffset = this.calcSemitoneOffset(channel);
1002
- const activeNotes = this.getActiveNotes(channel, now);
1003
- activeNotes.forEach((activeNote) => {
1004
- const { bufferSource, instrumentKey, noteNumber } = activeNote;
1005
- const playbackRate = calcPlaybackRate(instrumentKey, noteNumber, semitoneOffset);
1006
- bufferSource.playbackRate
1007
- .cancelScheduledValues(now)
1008
- .setValueAtTime(playbackRate * pressure, now);
1009
- });
985
+ const detuneChange = (channel.pitchBend - prevPitchBend) *
986
+ channel.pitchBendRange * 100;
987
+ this.updateDetune(channel, detuneChange);
1010
988
  }
1011
989
  handleControlChange(channelNumber, controller, value) {
1012
990
  switch (controller) {
@@ -1047,14 +1025,14 @@ export class Midy {
1047
1025
  return this.setReverb(channelNumber, value);
1048
1026
  case 93:
1049
1027
  return this.setChorus(channelNumber, value);
1050
- case 96:
1028
+ case 96: // https://amei.or.jp/midistandardcommittee/Recommended_Practice/e/rp18.pdf
1051
1029
  return incrementRPNValue(channelNumber);
1052
- case 97:
1030
+ case 97: // https://amei.or.jp/midistandardcommittee/Recommended_Practice/e/rp18.pdf
1053
1031
  return decrementRPNValue(channelNumber);
1054
1032
  case 100:
1055
- return this.setRPNMSB(channelNumber, value);
1056
- case 101:
1057
1033
  return this.setRPNLSB(channelNumber, value);
1034
+ case 101:
1035
+ return this.setRPNMSB(channelNumber, value);
1058
1036
  case 120:
1059
1037
  return this.allSoundOff(channelNumber);
1060
1038
  case 121:
@@ -1100,12 +1078,17 @@ export class Midy {
1100
1078
  channel.volume = volume / 127;
1101
1079
  this.updateChannelGain(channel);
1102
1080
  }
1081
+ panToGain(pan) {
1082
+ const theta = Math.PI / 2 * Math.max(0, pan - 1) / 126;
1083
+ return {
1084
+ gainLeft: Math.cos(theta),
1085
+ gainRight: Math.sin(theta),
1086
+ };
1087
+ }
1103
1088
  setPan(channelNumber, pan) {
1104
- const now = this.audioContext.currentTime;
1105
1089
  const channel = this.channels[channelNumber];
1106
- channel.pan = pan / 127 * 2 - 1; // -1 (left) - +1 (right)
1107
- channel.pannerNode.pan.cancelScheduledValues(now);
1108
- channel.pannerNode.pan.setValueAtTime(channel.pan, now);
1090
+ channel.pan = pan;
1091
+ this.updateChannelGain(channel);
1109
1092
  }
1110
1093
  setExpression(channelNumber, expression) {
1111
1094
  const channel = this.channels[channelNumber];
@@ -1118,8 +1101,13 @@ export class Midy {
1118
1101
  updateChannelGain(channel) {
1119
1102
  const now = this.audioContext.currentTime;
1120
1103
  const volume = channel.volume * channel.expression;
1121
- channel.gainNode.gain.cancelScheduledValues(now);
1122
- channel.gainNode.gain.setValueAtTime(volume, now);
1104
+ const { gainLeft, gainRight } = this.panToGain(channel.pan);
1105
+ channel.gainL.gain
1106
+ .cancelScheduledValues(now)
1107
+ .setValueAtTime(volume * gainLeft, now);
1108
+ channel.gainR.gain
1109
+ .cancelScheduledValues(now)
1110
+ .setValueAtTime(volume * gainRight, now);
1123
1111
  }
1124
1112
  setSustainPedal(channelNumber, value) {
1125
1113
  const isOn = value >= 64;
@@ -1181,39 +1169,58 @@ export class Midy {
1181
1169
  const channel = this.channels[channelNumber];
1182
1170
  channel.vibratoDelay = vibratoDelay / 127 * 5; // 0-5sec
1183
1171
  }
1184
- incrementRPNValue(channelNumber) {
1172
+ limitData(channel, minMSB, maxMSB, minLSB, maxLSB) {
1173
+ if (maxLSB < channel.dataLSB) {
1174
+ channel.dataMSB++;
1175
+ channel.dataLSB = minLSB;
1176
+ }
1177
+ else if (channel.dataLSB < 0) {
1178
+ channel.dataMSB--;
1179
+ channel.dataLSB = maxLSB;
1180
+ }
1181
+ if (maxMSB < channel.dataMSB) {
1182
+ channel.dataMSB = maxMSB;
1183
+ channel.dataLSB = maxLSB;
1184
+ }
1185
+ else if (channel.dataMSB < 0) {
1186
+ channel.dataMSB = minMSB;
1187
+ channel.dataLSB = minLSB;
1188
+ }
1189
+ }
1190
+ limitDataMSB(channel, minMSB, maxMSB) {
1191
+ if (maxMSB < channel.dataMSB) {
1192
+ channel.dataMSB = maxMSB;
1193
+ }
1194
+ else if (channel.dataMSB < 0) {
1195
+ channel.dataMSB = minMSB;
1196
+ }
1197
+ }
1198
+ // TODO: support 3-4?
1199
+ handleRPN(channelNumber, value) {
1185
1200
  const channel = this.channels[channelNumber];
1186
1201
  const rpn = channel.rpnMSB * 128 + channel.rpnLSB;
1187
1202
  switch (rpn) {
1188
1203
  case 0:
1189
- channel.pitchBendRange = Math.min(1, channel.pitchBendRange + 1);
1204
+ channel.dataLSB += value;
1205
+ this.handlePitchBendRangeMessage(channelNumber);
1190
1206
  break;
1191
1207
  case 1:
1192
- channel.fineTuning = Math.min(1, channel.fineTuning + 1);
1208
+ channel.dataLSB += value;
1209
+ this.handleFineTuningMessage(channelNumber);
1193
1210
  break;
1194
1211
  case 2:
1195
- channel.coarseTuning = Math.min(88, channel.coarseTuning + 1);
1212
+ channel.dataMSB += value;
1213
+ this.handleCoarseTuningMessage(channelNumber);
1196
1214
  break;
1197
1215
  default:
1198
1216
  console.warn(`Channel ${channelNumber}: Unsupported RPN MSB=${channel.rpnMSB} LSB=${channel.rpnLSB}`);
1199
1217
  }
1200
1218
  }
1219
+ incrementRPNValue(channelNumber) {
1220
+ this.handleRPN(channelNumber, 1);
1221
+ }
1201
1222
  decrementRPNValue(channelNumber) {
1202
- const channel = this.channels[channelNumber];
1203
- const rpn = channel.rpnMSB * 128 + channel.rpnLSB;
1204
- switch (rpn) {
1205
- case 0:
1206
- channel.pitchBendRange = Math.max(-1, channel.pitchBendRange - 1);
1207
- break;
1208
- case 1:
1209
- channel.fineTuning = Math.max(-1, channel.fineTuning - 1);
1210
- break;
1211
- case 2:
1212
- channel.coarseTuning = Math.max(40, channel.coarseTuning - 1);
1213
- break;
1214
- default:
1215
- console.warn(`Channel ${channelNumber}: Unsupported RPN MSB=${channel.rpnMSB}, LSB=${channel.rpnLSB}.`);
1216
- }
1223
+ this.handleRPN(channelNumber, -1);
1217
1224
  }
1218
1225
  setRPNMSB(channelNumber, value) {
1219
1226
  this.channels[channelNumber].rpnMSB = value;
@@ -1221,28 +1228,55 @@ export class Midy {
1221
1228
  setRPNLSB(channelNumber, value) {
1222
1229
  this.channels[channelNumber].rpnLSB = value;
1223
1230
  }
1224
- // TODO: support 3-4?
1225
1231
  setDataEntry(channelNumber, value, isMSB) {
1226
1232
  const channel = this.channels[channelNumber];
1227
- const rpn = channel.rpnMSB * 128 + channel.rpnLSB;
1228
1233
  isMSB ? channel.dataMSB = value : channel.dataLSB = value;
1229
- const { dataMSB, dataLSB } = channel;
1230
- switch (rpn) {
1231
- case 0:
1232
- channel.pitchBendRange = dataMSB + dataLSB / 100;
1233
- break;
1234
- case 1:
1235
- channel.fineTuning = (dataMSB * 128 + dataLSB - 8192) / 8192;
1236
- break;
1237
- case 2:
1238
- channel.coarseTuning = dataMSB - 64;
1239
- break;
1240
- case 5:
1241
- channel.modulationDepthRange = dataMSB + dataLSB / 128;
1242
- break;
1243
- default:
1244
- console.warn(`Channel ${channelNumber}: Unsupported RPN MSB=${channel.rpnMSB} LSB=${channel.rpnLSB}`);
1245
- }
1234
+ this.handleRPN(channelNumber, 0);
1235
+ }
1236
+ updateDetune(channel, detuneChange) {
1237
+ const now = this.audioContext.currentTime;
1238
+ const activeNotes = this.getActiveNotes(channel, now);
1239
+ activeNotes.forEach((activeNote) => {
1240
+ const { bufferSource } = activeNote;
1241
+ const detune = bufferSource.detune.value + detuneChange;
1242
+ bufferSource.detune
1243
+ .cancelScheduledValues(now)
1244
+ .setValueAtTime(detune, now);
1245
+ });
1246
+ }
1247
+ handlePitchBendRangeMessage(channelNumber) {
1248
+ const channel = this.channels[channelNumber];
1249
+ this.limitData(channel, 0, 127, 0, 99);
1250
+ const pitchBendRange = channel.dataMSB + channel.dataLSB / 100;
1251
+ this.setPitchBendRange(channelNumber, pitchBendRange);
1252
+ }
1253
+ setPitchBendRange(channelNumber, pitchBendRange) {
1254
+ const channel = this.channels[channelNumber];
1255
+ const prevPitchBendRange = channel.pitchBendRange;
1256
+ channel.pitchBendRange = pitchBendRange;
1257
+ const detuneChange = (channel.pitchBendRange - prevPitchBendRange) *
1258
+ channel.pitchBend * 100;
1259
+ this.updateDetune(channel, detuneChange);
1260
+ }
1261
+ handleFineTuningMessage(channelNumber) {
1262
+ const channel = this.channels[channelNumber];
1263
+ this.limitData(channel, 0, 127, 0, 127);
1264
+ const fineTuning = (channel.dataMSB * 128 + channel.dataLSB - 8192) / 8192;
1265
+ this.setFineTuning(channelNumber, fineTuning);
1266
+ }
1267
+ setFineTuning(channelNumber, fineTuning) {
1268
+ const channel = this.channels[channelNumber];
1269
+ channel.fineTuning = fineTuning;
1270
+ }
1271
+ handleCoarseTuningMessage(channelNumber) {
1272
+ const channel = this.channels[channelNumber];
1273
+ this.limitDataMSB(channel, 0, 127);
1274
+ const coarseTuning = channel.dataMSB - 64;
1275
+ this.setFineTuning(channelNumber, coarseTuning);
1276
+ }
1277
+ setCoarseTuning(channelNumber, coarseTuning) {
1278
+ const channel = this.channels[channelNumber];
1279
+ channel.fineTuning = coarseTuning;
1246
1280
  }
1247
1281
  allSoundOff(channelNumber) {
1248
1282
  const now = this.audioContext.currentTime;
@@ -1315,8 +1349,8 @@ export class Midy {
1315
1349
  channel.bankLSB = 0;
1316
1350
  channel.bank = 0;
1317
1351
  });
1318
- this.channels[9].bankMSB = 120;
1319
- this.channels[9].bank = 120 * 128;
1352
+ this.channels[9].bankMSB = 1;
1353
+ this.channels[9].bank = 128;
1320
1354
  }
1321
1355
  GM2SystemOn() {
1322
1356
  this.channels.forEach((channel) => {
@@ -1334,9 +1368,9 @@ export class Midy {
1334
1368
  case 1:
1335
1369
  return this.handleMasterVolumeSysEx(data);
1336
1370
  case 3:
1337
- return this.handleMasterFineTuning(data);
1371
+ return this.handleMasterFineTuningSysEx(data);
1338
1372
  case 4:
1339
- return this.handleMasterCoarseTuning(data);
1373
+ return this.handleMasterCoarseTuningSysEx(data);
1340
1374
  // case 5: // TODO: Global Parameter Control
1341
1375
  default:
1342
1376
  console.warn(`Unsupported Exclusive Message ${data}`);
@@ -1378,9 +1412,9 @@ export class Midy {
1378
1412
  }
1379
1413
  handleMasterVolumeSysEx(data) {
1380
1414
  const volume = (data[5] * 128 + data[4]) / 16383;
1381
- this.handleMasterVolume(volume);
1415
+ this.setMasterVolume(volume);
1382
1416
  }
1383
- handleMasterVolume(volume) {
1417
+ setMasterVolume(volume) {
1384
1418
  if (volume < 0 && 1 < volume) {
1385
1419
  console.error("Master Volume is out of range");
1386
1420
  }
@@ -1392,9 +1426,9 @@ export class Midy {
1392
1426
  }
1393
1427
  handleMasterFineTuningSysEx(data) {
1394
1428
  const fineTuning = (data[5] * 128 + data[4] - 8192) / 8192;
1395
- this.handleMasterFineTuning(fineTuning);
1429
+ this.setMasterFineTuning(fineTuning);
1396
1430
  }
1397
- handleMasterFineTuning(fineTuning) {
1431
+ setMasterFineTuning(fineTuning) {
1398
1432
  if (fineTuning < -1 && 1 < fineTuning) {
1399
1433
  console.error("Master Fine Tuning value is out of range");
1400
1434
  }
@@ -1404,9 +1438,9 @@ export class Midy {
1404
1438
  }
1405
1439
  handleMasterCoarseTuningSysEx(data) {
1406
1440
  const coarseTuning = data[4];
1407
- this.handleMasterCoarseTuning(coarseTuning);
1441
+ this.setMasterCoarseTuning(coarseTuning);
1408
1442
  }
1409
- handleMasterCoarseTuning(coarseTuning) {
1443
+ setMasterCoarseTuning(coarseTuning) {
1410
1444
  if (coarseTuning < 0 && 127 < coarseTuning) {
1411
1445
  console.error("Master Coarse Tuning value is out of range");
1412
1446
  }
@@ -1446,7 +1480,7 @@ Object.defineProperty(Midy, "channelSettings", {
1446
1480
  value: {
1447
1481
  currentBufferSource: null,
1448
1482
  volume: 100 / 127,
1449
- pan: 0,
1483
+ pan: 64,
1450
1484
  portamentoTime: 0,
1451
1485
  reverb: 0,
1452
1486
  chorus: 0,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@marmooo/midy",
3
- "version": "0.0.5",
3
+ "version": "0.0.7",
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",
@@ -41,8 +41,8 @@ export class MidyGM1 {
41
41
  masterGain: any;
42
42
  channels: {
43
43
  scheduledNotes: Map<any, any>;
44
- gainNode: any;
45
- pannerNode: any;
44
+ gainL: any;
45
+ gainR: any;
46
46
  expression: number;
47
47
  modulation: number;
48
48
  sustainPedal: boolean;
@@ -65,13 +65,13 @@ export class MidyGM1 {
65
65
  loadSoundFont(soundFontUrl: any): Promise<void>;
66
66
  loadMIDI(midiUrl: any): Promise<void>;
67
67
  setChannelAudioNodes(audioContext: any): {
68
- gainNode: any;
69
- pannerNode: any;
68
+ gainL: any;
69
+ gainR: any;
70
70
  };
71
71
  createChannels(audioContext: any): {
72
72
  scheduledNotes: Map<any, any>;
73
- gainNode: any;
74
- pannerNode: any;
73
+ gainL: any;
74
+ gainR: any;
75
75
  expression: number;
76
76
  modulation: number;
77
77
  sustainPedal: boolean;
@@ -128,17 +128,31 @@ export class MidyGM1 {
128
128
  handleMIDIMessage(statusByte: any, data1: any, data2: any): void | any[] | Promise<any>;
129
129
  handleProgramChange(channelNumber: any, program: any): void;
130
130
  handlePitchBendMessage(channelNumber: any, lsb: any, msb: any): void;
131
- handlePitchBend(channelNumber: any, pitchBend: any): void;
131
+ setPitchBend(channelNumber: any, pitchBend: any): void;
132
132
  handleControlChange(channelNumber: any, controller: any, value: any): void | any[];
133
133
  setModulation(channelNumber: any, modulation: any): void;
134
134
  setVolume(channelNumber: any, volume: any): void;
135
+ panToGain(pan: any): {
136
+ gainLeft: number;
137
+ gainRight: number;
138
+ };
135
139
  setPan(channelNumber: any, pan: any): void;
136
140
  setExpression(channelNumber: any, expression: any): void;
137
141
  updateChannelGain(channel: any): void;
138
142
  setSustainPedal(channelNumber: any, value: any): void;
143
+ limitData(channel: any, minMSB: any, maxMSB: any, minLSB: any, maxLSB: any): void;
144
+ limitDataMSB(channel: any, minMSB: any, maxMSB: any): void;
145
+ handleRPN(channelNumber: any): void;
139
146
  setRPNMSB(channelNumber: any, value: any): void;
140
147
  setRPNLSB(channelNumber: any, value: any): void;
141
148
  setDataEntry(channelNumber: any, value: any, isMSB: any): void;
149
+ updateDetune(channel: any, detuneChange: any): void;
150
+ handlePitchBendRangeMessage(channelNumber: any): void;
151
+ setPitchBendRange(channelNumber: any, pitchBendRange: any): void;
152
+ handleFineTuningMessage(channelNumber: any): void;
153
+ setFineTuning(channelNumber: any, fineTuning: any): void;
154
+ handleCoarseTuningMessage(channelNumber: any): void;
155
+ setCoarseTuning(channelNumber: any, coarseTuning: any): void;
142
156
  allSoundOff(channelNumber: any): any[];
143
157
  resetAllControllers(channelNumber: any): void;
144
158
  allNotesOff(channelNumber: any): any[];
@@ -146,7 +160,7 @@ export class MidyGM1 {
146
160
  GM1SystemOn(): void;
147
161
  handleUniversalRealTimeExclusiveMessage(data: any): void;
148
162
  handleMasterVolumeSysEx(data: any): void;
149
- handleMasterVolume(volume: any): void;
163
+ setMasterVolume(volume: any): void;
150
164
  handleExclusiveMessage(data: any): void;
151
165
  handleSysEx(data: any): void;
152
166
  scheduleTask(callback: any, startTime: any): Promise<any>;
@@ -158,8 +172,6 @@ declare class Note {
158
172
  filterNode: any;
159
173
  modLFO: any;
160
174
  modLFOGain: any;
161
- vibLFO: any;
162
- vibLFOGain: any;
163
175
  noteNumber: any;
164
176
  velocity: any;
165
177
  startTime: any;
@@ -1 +1 @@
1
- {"version":3,"file":"midy-GM1.d.ts","sourceRoot":"","sources":["../src/midy-GM1.js"],"names":[],"mappings":"AAuBA;IAmBE;;;;;;;;;;;MAWE;IAEF;;;;;;;MAOE;IAEF,+BAMC;IA9CD,qBAAmB;IACnB,kBAAc;IACd,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;IAyBhB,kBAAgC;IAChC,gBAA4C;IAE5C;;;;;;;;;;;;;;;;;;;;QAAiD;IAInD,4BAMC;IAED,mCASC;IAED,gDAMC;IAED,sCASC;IAED;;;MAaC;IAED;;;;;;;;;;;;;;;;;;;;QAUC;IAED,+DAyBC;IAED,mEAWC;IAED,qDAOC;IAED,2EA+CC;IAED,mCAOC;IAED,0BA+CC;IAED,uDAEC;IAED,wDAEC;IAED;;;MAyEC;IAED,4BAsBC;IAED,uBAKC;IAED,aAGC;IAED,cAKC;IAED,wBAIC;IAED,0BAKC;IAED,wBAOC;IAED,sBAGC;IAED,uDASC;IAED,6CAQC;IAED,sDAEC;IAED,2BAEC;IAED,4BAEC;IAED,sCAGC;IAED,mFAGC;IAED,iDAmBC;IAED,iDAiCC;IAED,0DAmBC;IAED,wHA6BC;IAED,kGA6BC;IAED,0EAGC;IAED,sIAmDC;IAED,0FAGC;IAED,kEAeC;IAED,wFAiBC;IAED,4DAGC;IAED,qEAGC;IAED,0DAiBC;IAED,mFA+BC;IAED,yDAiBC;IAED,iDAIC;IAED,2CAMC;IAED,yDAIC;IAED,sCAKC;IAED,sDAMC;IAED,gDAEC;IAED,gDAEC;IAED,+DAoBC;IAED,uCAoBC;IAED,8CAEC;IAED,uCAoBC;IAED,4DAgBC;IAED,oBAQC;IAED,yDAaC;IAED,yCAGC;IAED,sCAQC;IAED,wCAEC;IAED,6BASC;IAED,0DAUC;CACF;AAv+BD;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-GM1.d.ts","sourceRoot":"","sources":["../src/midy-GM1.js"],"names":[],"mappings":"AAqBA;IAmBE;;;;;;;;;;;MAWE;IAEF;;;;;;;MAOE;IAEF,+BAMC;IA9CD,qBAAmB;IACnB,kBAAc;IACd,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;IAyBhB,kBAAgC;IAChC,gBAA4C;IAE5C;;;;;;;;;;;;;;;;;;;;QAAiD;IAInD,4BAMC;IAED,mCASC;IAED,gDAMC;IAED,sCASC;IAED;;;MAYC;IAED;;;;;;;;;;;;;;;;;;;;QAUC;IAED,+DAyBC;IAED,mEAWC;IAED,qDAOC;IAED,2EA+CC;IAED,mCAOC;IAED,0BA+CC;IAED,uDAEC;IAED,wDAEC;IAED;;;MA8DC;IAED,4BAsBC;IAED,uBAKC;IAED,aAGC;IAED,cAKC;IAED,wBAIC;IAED,0BAKC;IAED,wBAOC;IAED,sBAGC;IAED,uDASC;IAED,6CAQC;IAED,sDAGC;IAED,2BAEC;IAED,4BAEC;IAED,sCAGC;IAED,mFAGC;IAED,iDAiBC;IAED,iDAiCC;IAED,0DAmBC;IAED,wHA6BC;IAED,kGA6BC;IAED,0EAGC;IAED,sIAmDC;IAED,0FAGC;IAED,kEAeC;IAED,wFAiBC;IAED,4DAGC;IAED,qEAGC;IAED,uDAOC;IAED,mFA+BC;IAED,yDAiBC;IAED,iDAIC;IAED;;;MAMC;IAED,2CAIC;IAED,yDAIC;IAED,sCAUC;IAED,sDAMC;IAED,kFAeC;IAED,2DAMC;IAED,oCAkBC;IAED,gDAEC;IAED,gDAEC;IAED,+DAIC;IAED,oDAUC;IAED,sDAKC;IAED,iEAOC;IAED,kDAKC;IAED,yDAGC;IAED,oDAKC;IAED,6DAGC;IAED,uCAoBC;IAED,8CAEC;IAED,uCAoBC;IAED,4DAgBC;IAED,oBAQC;IAED,yDAaC;IAED,yCAGC;IAED,mCAQC;IAED,wCAEC;IAED,6BASC;IAED,0DAUC;CACF;AA1iCD;IAOE,gFAKC;IAXD,kBAAa;IACb,cAAS;IACT,gBAAW;IACX,YAAO;IACP,gBAAW;IAGT,gBAA4B;IAC5B,cAAwB;IACxB,eAA0B;IAC1B,mBAAkC;CAErC"}