@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-GM1.d.ts +22 -10
- package/esm/midy-GM1.d.ts.map +1 -1
- package/esm/midy-GM1.js +126 -73
- package/esm/midy-GM2.d.ts +24 -10
- package/esm/midy-GM2.d.ts.map +1 -1
- package/esm/midy-GM2.js +145 -82
- package/esm/midy-GMLite.d.ts +16 -8
- package/esm/midy-GMLite.d.ts.map +1 -1
- package/esm/midy-GMLite.js +79 -60
- package/esm/midy.d.ts +24 -10
- package/esm/midy.d.ts.map +1 -1
- package/esm/midy.js +145 -111
- package/package.json +1 -1
- package/script/midy-GM1.d.ts +22 -10
- package/script/midy-GM1.d.ts.map +1 -1
- package/script/midy-GM1.js +126 -73
- package/script/midy-GM2.d.ts +24 -10
- package/script/midy-GM2.d.ts.map +1 -1
- package/script/midy-GM2.js +145 -82
- package/script/midy-GMLite.d.ts +16 -8
- package/script/midy-GMLite.d.ts.map +1 -1
- package/script/midy-GMLite.js +79 -60
- package/script/midy.d.ts +24 -10
- package/script/midy.d.ts.map +1 -1
- package/script/midy.js +145 -111
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
|
|
229
|
-
|
|
230
|
-
});
|
|
231
|
-
const
|
|
232
|
-
|
|
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(
|
|
238
|
-
reverbEffect.
|
|
239
|
-
|
|
240
|
-
|
|
238
|
+
reverbEffect.dryGain.connect(gainL);
|
|
239
|
+
reverbEffect.dryGain.connect(gainR);
|
|
240
|
+
reverbEffect.wetGain.connect(gainL);
|
|
241
|
+
reverbEffect.wetGain.connect(gainR);
|
|
241
242
|
return {
|
|
242
|
-
|
|
243
|
-
|
|
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.
|
|
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
|
-
|
|
498
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
979
|
+
this.setPitchBend(channelNumber, pitchBend);
|
|
996
980
|
}
|
|
997
|
-
|
|
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
|
|
1002
|
-
|
|
1003
|
-
|
|
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
|
|
1107
|
-
|
|
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.
|
|
1122
|
-
channel.
|
|
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
|
-
|
|
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.
|
|
1204
|
+
channel.dataLSB += value;
|
|
1205
|
+
this.handlePitchBendRangeMessage(channelNumber);
|
|
1190
1206
|
break;
|
|
1191
1207
|
case 1:
|
|
1192
|
-
channel.
|
|
1208
|
+
channel.dataLSB += value;
|
|
1209
|
+
this.handleFineTuningMessage(channelNumber);
|
|
1193
1210
|
break;
|
|
1194
1211
|
case 2:
|
|
1195
|
-
channel.
|
|
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
|
-
|
|
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
|
-
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
|
|
1241
|
-
|
|
1242
|
-
|
|
1243
|
-
|
|
1244
|
-
|
|
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 =
|
|
1319
|
-
this.channels[9].bank =
|
|
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.
|
|
1371
|
+
return this.handleMasterFineTuningSysEx(data);
|
|
1338
1372
|
case 4:
|
|
1339
|
-
return this.
|
|
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.
|
|
1415
|
+
this.setMasterVolume(volume);
|
|
1382
1416
|
}
|
|
1383
|
-
|
|
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.
|
|
1429
|
+
this.setMasterFineTuning(fineTuning);
|
|
1396
1430
|
}
|
|
1397
|
-
|
|
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.
|
|
1441
|
+
this.setMasterCoarseTuning(coarseTuning);
|
|
1408
1442
|
}
|
|
1409
|
-
|
|
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:
|
|
1483
|
+
pan: 64,
|
|
1450
1484
|
portamentoTime: 0,
|
|
1451
1485
|
reverb: 0,
|
|
1452
1486
|
chorus: 0,
|
package/package.json
CHANGED
package/script/midy-GM1.d.ts
CHANGED
|
@@ -41,8 +41,8 @@ export class MidyGM1 {
|
|
|
41
41
|
masterGain: any;
|
|
42
42
|
channels: {
|
|
43
43
|
scheduledNotes: Map<any, any>;
|
|
44
|
-
|
|
45
|
-
|
|
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
|
-
|
|
69
|
-
|
|
68
|
+
gainL: any;
|
|
69
|
+
gainR: any;
|
|
70
70
|
};
|
|
71
71
|
createChannels(audioContext: any): {
|
|
72
72
|
scheduledNotes: Map<any, any>;
|
|
73
|
-
|
|
74
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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;
|
package/script/midy-GM1.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"midy-GM1.d.ts","sourceRoot":"","sources":["../src/midy-GM1.js"],"names":[],"mappings":"
|
|
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"}
|