@marmooo/midy 0.2.5 → 0.2.6
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 +24 -25
- package/esm/midy-GM1.d.ts.map +1 -1
- package/esm/midy-GM1.js +55 -91
- package/esm/midy-GM2.d.ts +33 -29
- package/esm/midy-GM2.d.ts.map +1 -1
- package/esm/midy-GM2.js +146 -133
- package/esm/midy-GMLite.d.ts +18 -16
- package/esm/midy-GMLite.d.ts.map +1 -1
- package/esm/midy-GMLite.js +53 -39
- package/esm/midy.d.ts +35 -31
- package/esm/midy.d.ts.map +1 -1
- package/esm/midy.js +172 -161
- package/package.json +1 -1
- package/script/midy-GM1.d.ts +24 -25
- package/script/midy-GM1.d.ts.map +1 -1
- package/script/midy-GM1.js +55 -91
- package/script/midy-GM2.d.ts +33 -29
- package/script/midy-GM2.d.ts.map +1 -1
- package/script/midy-GM2.js +146 -133
- package/script/midy-GMLite.d.ts +18 -16
- package/script/midy-GMLite.d.ts.map +1 -1
- package/script/midy-GMLite.js +53 -39
- package/script/midy.d.ts +35 -31
- package/script/midy.d.ts.map +1 -1
- package/script/midy.js +172 -161
package/esm/midy-GM1.d.ts
CHANGED
|
@@ -37,22 +37,22 @@ export class MidyGM1 {
|
|
|
37
37
|
masterVolume: any;
|
|
38
38
|
voiceParamsHandlers: {
|
|
39
39
|
modLfoToPitch: (channel: any, note: any, _prevValue: any) => void;
|
|
40
|
-
vibLfoToPitch: (
|
|
40
|
+
vibLfoToPitch: (_channel: any, _note: any, _prevValue: any) => void;
|
|
41
41
|
modLfoToFilterFc: (channel: any, note: any, _prevValue: any) => void;
|
|
42
42
|
modLfoToVolume: (channel: any, note: any, _prevValue: any) => void;
|
|
43
43
|
chorusEffectsSend: (_channel: any, _note: any, _prevValue: any) => void;
|
|
44
44
|
reverbEffectsSend: (_channel: any, _note: any, _prevValue: any) => void;
|
|
45
45
|
delayModLFO: (_channel: any, note: any, _prevValue: any) => void;
|
|
46
46
|
freqModLFO: (_channel: any, note: any, _prevValue: any) => void;
|
|
47
|
-
delayVibLFO: (
|
|
48
|
-
freqVibLFO: (
|
|
47
|
+
delayVibLFO: (_channel: any, _note: any, _prevValue: any) => void;
|
|
48
|
+
freqVibLFO: (_channel: any, _note: any, _prevValue: any) => void;
|
|
49
49
|
};
|
|
50
50
|
controlChangeHandlers: {
|
|
51
|
-
1: (channelNumber: any, modulation: any) => void;
|
|
51
|
+
1: (channelNumber: any, modulation: any, scheduleTime: any) => void;
|
|
52
52
|
6: (channelNumber: any, value: any) => void;
|
|
53
|
-
7: (channelNumber: any, volume: any) => void;
|
|
54
|
-
10: (channelNumber: any, pan: any) => void;
|
|
55
|
-
11: (channelNumber: any, expression: any) => void;
|
|
53
|
+
7: (channelNumber: any, volume: any, scheduleTime: any) => void;
|
|
54
|
+
10: (channelNumber: any, pan: any, scheduleTime: any) => void;
|
|
55
|
+
11: (channelNumber: any, expression: any, scheduleTime: any) => void;
|
|
56
56
|
38: (channelNumber: any, value: any) => void;
|
|
57
57
|
64: (channelNumber: any, value: any) => void;
|
|
58
58
|
100: (channelNumber: any, value: any) => void;
|
|
@@ -93,6 +93,7 @@ export class MidyGM1 {
|
|
|
93
93
|
seekTo(second: any): void;
|
|
94
94
|
calcTotalTime(): number;
|
|
95
95
|
currentTime(): number;
|
|
96
|
+
processScheduledNotes(channel: any, scheduleTime: any, callback: any): void;
|
|
96
97
|
getActiveNotes(channel: any, time: any): SparseMap;
|
|
97
98
|
getActiveNote(noteList: any, time: any): any;
|
|
98
99
|
cbToRatio(cb: any): number;
|
|
@@ -103,7 +104,7 @@ export class MidyGM1 {
|
|
|
103
104
|
updateChannelDetune(channel: any): void;
|
|
104
105
|
updateDetune(channel: any, note: any): void;
|
|
105
106
|
setVolumeEnvelope(note: any): void;
|
|
106
|
-
setPitchEnvelope(note: any): void;
|
|
107
|
+
setPitchEnvelope(note: any, scheduleTime: any): void;
|
|
107
108
|
clampCutoffFrequency(frequency: any): number;
|
|
108
109
|
setFilterEnvelope(note: any): void;
|
|
109
110
|
startModulation(channel: any, note: any, startTime: any): void;
|
|
@@ -120,31 +121,30 @@ export class MidyGM1 {
|
|
|
120
121
|
handlePitchBendMessage(channelNumber: any, lsb: any, msb: any): void;
|
|
121
122
|
setPitchBend(channelNumber: any, value: any): void;
|
|
122
123
|
setModLfoToPitch(channel: any, note: any): void;
|
|
123
|
-
setVibLfoToPitch(channel: any, note: any): void;
|
|
124
124
|
setModLfoToFilterFc(note: any): void;
|
|
125
125
|
setModLfoToVolume(note: any): void;
|
|
126
126
|
setDelayModLFO(note: any): void;
|
|
127
127
|
setFreqModLFO(note: any): void;
|
|
128
128
|
createVoiceParamsHandlers(): {
|
|
129
129
|
modLfoToPitch: (channel: any, note: any, _prevValue: any) => void;
|
|
130
|
-
vibLfoToPitch: (
|
|
130
|
+
vibLfoToPitch: (_channel: any, _note: any, _prevValue: any) => void;
|
|
131
131
|
modLfoToFilterFc: (channel: any, note: any, _prevValue: any) => void;
|
|
132
132
|
modLfoToVolume: (channel: any, note: any, _prevValue: any) => void;
|
|
133
133
|
chorusEffectsSend: (_channel: any, _note: any, _prevValue: any) => void;
|
|
134
134
|
reverbEffectsSend: (_channel: any, _note: any, _prevValue: any) => void;
|
|
135
135
|
delayModLFO: (_channel: any, note: any, _prevValue: any) => void;
|
|
136
136
|
freqModLFO: (_channel: any, note: any, _prevValue: any) => void;
|
|
137
|
-
delayVibLFO: (
|
|
138
|
-
freqVibLFO: (
|
|
137
|
+
delayVibLFO: (_channel: any, _note: any, _prevValue: any) => void;
|
|
138
|
+
freqVibLFO: (_channel: any, _note: any, _prevValue: any) => void;
|
|
139
139
|
};
|
|
140
140
|
getControllerState(channel: any, noteNumber: any, velocity: any): Float32Array<any>;
|
|
141
141
|
applyVoiceParams(channel: any, controllerType: any): void;
|
|
142
142
|
createControlChangeHandlers(): {
|
|
143
|
-
1: (channelNumber: any, modulation: any) => void;
|
|
143
|
+
1: (channelNumber: any, modulation: any, scheduleTime: any) => void;
|
|
144
144
|
6: (channelNumber: any, value: any) => void;
|
|
145
|
-
7: (channelNumber: any, volume: any) => void;
|
|
146
|
-
10: (channelNumber: any, pan: any) => void;
|
|
147
|
-
11: (channelNumber: any, expression: any) => void;
|
|
145
|
+
7: (channelNumber: any, volume: any, scheduleTime: any) => void;
|
|
146
|
+
10: (channelNumber: any, pan: any, scheduleTime: any) => void;
|
|
147
|
+
11: (channelNumber: any, expression: any, scheduleTime: any) => void;
|
|
148
148
|
38: (channelNumber: any, value: any) => void;
|
|
149
149
|
64: (channelNumber: any, value: any) => void;
|
|
150
150
|
100: (channelNumber: any, value: any) => void;
|
|
@@ -153,18 +153,18 @@ export class MidyGM1 {
|
|
|
153
153
|
121: (channelNumber: any) => void;
|
|
154
154
|
123: (channelNumber: any) => Promise<void>;
|
|
155
155
|
};
|
|
156
|
-
handleControlChange(channelNumber: any, controllerType: any, value: any): void;
|
|
157
|
-
updateModulation(channel: any): void;
|
|
158
|
-
setModulationDepth(channelNumber: any, modulation: any): void;
|
|
159
|
-
setVolume(channelNumber: any, volume: any): void;
|
|
156
|
+
handleControlChange(channelNumber: any, controllerType: any, value: any, startTime: any): void;
|
|
157
|
+
updateModulation(channel: any, scheduleTime: any): void;
|
|
158
|
+
setModulationDepth(channelNumber: any, modulation: any, scheduleTime: any): void;
|
|
159
|
+
setVolume(channelNumber: any, volume: any, scheduleTime: any): void;
|
|
160
160
|
panToGain(pan: any): {
|
|
161
161
|
gainLeft: number;
|
|
162
162
|
gainRight: number;
|
|
163
163
|
};
|
|
164
|
-
setPan(channelNumber: any, pan: any): void;
|
|
165
|
-
setExpression(channelNumber: any, expression: any): void;
|
|
164
|
+
setPan(channelNumber: any, pan: any, scheduleTime: any): void;
|
|
165
|
+
setExpression(channelNumber: any, expression: any, scheduleTime: any): void;
|
|
166
166
|
dataEntryLSB(channelNumber: any, value: any): void;
|
|
167
|
-
updateChannelVolume(channel: any): void;
|
|
167
|
+
updateChannelVolume(channel: any, scheduleTime: any): void;
|
|
168
168
|
setSustainPedal(channelNumber: any, value: any): void;
|
|
169
169
|
limitData(channel: any, minMSB: any, maxMSB: any, minLSB: any, maxLSB: any): void;
|
|
170
170
|
limitDataMSB(channel: any, minMSB: any, maxMSB: any): void;
|
|
@@ -207,12 +207,11 @@ declare class Note {
|
|
|
207
207
|
constructor(noteNumber: any, velocity: any, startTime: any, voice: any, voiceParams: any);
|
|
208
208
|
bufferSource: any;
|
|
209
209
|
filterNode: any;
|
|
210
|
+
filterDepth: any;
|
|
210
211
|
volumeEnvelopeNode: any;
|
|
211
212
|
volumeDepth: any;
|
|
212
213
|
modulationLFO: any;
|
|
213
214
|
modulationDepth: any;
|
|
214
|
-
vibratoLFO: any;
|
|
215
|
-
vibratoDepth: any;
|
|
216
215
|
noteNumber: any;
|
|
217
216
|
velocity: any;
|
|
218
217
|
startTime: any;
|
package/esm/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":"AAiJA;IAsBE;;;;;;;;;;;;MAYE;IAEF,+BAQC;IA3CD,qBAAmB;IACnB,kBAAc;IACd,0BAAwB;IACxB,kBAAc;IACd,mBAAiB;IACjB,kBAAc;IACd,mBAAe;IACf,kBAAgB;IAChB,sBAA2C;IAC3C,kCAA+B;IAC/B,gCAA6B;IAC7B,mBAAkB;IAClB,mBAAkB;IAClB,kBAAiB;IACjB,oBAAmB;IACnB,mBAAkB;IAClB,gBAAc;IACd,mBAAiB;IACjB,oBAAkB;IAClB,6BAAuC;IAiBrC,kBAAgC;IAChC,kBAA8C;IAC9C;;;;;;;;;;;MAA2D;IAC3D;;;;;;;;;;;;;MAA+D;IAC/D,gBAAiD;IAKnD,4BAMC;IAED,mCAWC;IAED,gDAMC;IAED,sCASC;IAED;;;;MAeC;IAED,yCAUC;IAED,6DA2BC;IAED,8DASC;IAED,2EAqDC;IAED,mCAOC;IAED,0BAoDC;IAED,uDAEC;IAED,wDAEC;IAED,6EAEC;IAED;;;MA4EC;IAED,+EAmBC;IAED,qDAKC;IAED,uBAKC;IAED,aAGC;IAED,cAKC;IAED,wBAIC;IAED,0BAKC;IAED,wBAOC;IAED,sBAGC;IAED,4EASC;IAED,mDASC;IAED,6CAQC;IAED,2BAEC;IAED,8BAEC;IAED,8BAEC;IAED,4BAEC;IAED,qCAMC;IAED,wCAQC;IAED,4CAKC;IAED,mCAgBC;IAED,qDAqBC;IAED,6CAIC;IAED,mCAuBC;IAED,+DAoBC;IAED,yGAgBC;IAED,gHAuCC;IAED,kGAgDC;IAED,0EAGC;IAED,qFAwBC;IAED,6HAuBC;IAED,0FAGC;IAED,kEAeC;IAED,gFAiBC;IAED,4DAGC;IAED,qEAGC;IAED,mDASC;IAED,gDASC;IAED,qCAMC;IAED,mCAQC;IAED,gCAOC;IAED,+BAMC;IAED;;;;;;;;;;;MAqBC;IAED,oFAMC;IAED,0DA6CC;IAED;;;;;;;;;;;;;MAeC;IAED,+FAWC;IAED,wDAWC;IAED,iFAIC;IAED,oEAIC;IAED;;;MAMC;IAED,8DAIC;IAED,4EAIC;IAED,mDAGC;IAED,2DAWC;IAED,sDAKC;IAED,kFAeC;IAED,2DAMC;IAED,oCAkBC;IAED,gDAEC;IAED,gDAEC;IAED,mDAGC;IAED,kDAKC;IAED,wDASC;IAED,8CAKC;IAED,oDAOC;IAED,gDAKC;IAED,sDAOC;IAED,+CAEC;IAED,8CAqBC;IAED,+CAEC;IAED,4DAgBC;IAED,oBAMC;IAED,yDAaC;IAED,yCAGC;IAED,mCAQC;IAED,wCAEC;IAED,6BASC;IAED,0DAUC;CACF;AAz4CD;IACE,uBAGC;IAFC,YAA2B;IAC3B,qBAAuB;IAGzB,gCAKC;IAED,mBAEC;IAED,0BAUC;IAED,uBAEC;IAED,mBAEC;IAED,cAMC;IASD,6BAKC;IAZD,qDAKC;CAQF;AAED;IASE,0FAMC;IAdD,kBAAa;IACb,gBAAW;IACX,iBAAY;IACZ,wBAAmB;IACnB,iBAAY;IACZ,mBAAc;IACd,qBAAgB;IAGd,gBAA4B;IAC5B,cAAwB;IACxB,eAA0B;IAC1B,WAAkB;IAClB,iBAA8B;CAEjC"}
|
package/esm/midy-GM1.js
CHANGED
|
@@ -66,37 +66,31 @@ class Note {
|
|
|
66
66
|
writable: true,
|
|
67
67
|
value: void 0
|
|
68
68
|
});
|
|
69
|
-
Object.defineProperty(this, "
|
|
70
|
-
enumerable: true,
|
|
71
|
-
configurable: true,
|
|
72
|
-
writable: true,
|
|
73
|
-
value: void 0
|
|
74
|
-
});
|
|
75
|
-
Object.defineProperty(this, "volumeDepth", {
|
|
69
|
+
Object.defineProperty(this, "filterDepth", {
|
|
76
70
|
enumerable: true,
|
|
77
71
|
configurable: true,
|
|
78
72
|
writable: true,
|
|
79
73
|
value: void 0
|
|
80
74
|
});
|
|
81
|
-
Object.defineProperty(this, "
|
|
75
|
+
Object.defineProperty(this, "volumeEnvelopeNode", {
|
|
82
76
|
enumerable: true,
|
|
83
77
|
configurable: true,
|
|
84
78
|
writable: true,
|
|
85
79
|
value: void 0
|
|
86
80
|
});
|
|
87
|
-
Object.defineProperty(this, "
|
|
81
|
+
Object.defineProperty(this, "volumeDepth", {
|
|
88
82
|
enumerable: true,
|
|
89
83
|
configurable: true,
|
|
90
84
|
writable: true,
|
|
91
85
|
value: void 0
|
|
92
86
|
});
|
|
93
|
-
Object.defineProperty(this, "
|
|
87
|
+
Object.defineProperty(this, "modulationLFO", {
|
|
94
88
|
enumerable: true,
|
|
95
89
|
configurable: true,
|
|
96
90
|
writable: true,
|
|
97
91
|
value: void 0
|
|
98
92
|
});
|
|
99
|
-
Object.defineProperty(this, "
|
|
93
|
+
Object.defineProperty(this, "modulationDepth", {
|
|
100
94
|
enumerable: true,
|
|
101
95
|
configurable: true,
|
|
102
96
|
writable: true,
|
|
@@ -409,31 +403,32 @@ export class MidyGM1 {
|
|
|
409
403
|
const event = this.timeline[queueIndex];
|
|
410
404
|
if (event.startTime > t + this.lookAhead)
|
|
411
405
|
break;
|
|
406
|
+
const startTime = event.startTime + this.startDelay - offset;
|
|
412
407
|
switch (event.type) {
|
|
413
408
|
case "noteOn":
|
|
414
409
|
if (event.velocity !== 0) {
|
|
415
|
-
await this.scheduleNoteOn(event.channel, event.noteNumber, event.velocity,
|
|
410
|
+
await this.scheduleNoteOn(event.channel, event.noteNumber, event.velocity, startTime);
|
|
416
411
|
break;
|
|
417
412
|
}
|
|
418
413
|
/* falls through */
|
|
419
414
|
case "noteOff": {
|
|
420
|
-
const notePromise = this.scheduleNoteRelease(event.channel, event.noteNumber, event.velocity,
|
|
415
|
+
const notePromise = this.scheduleNoteRelease(event.channel, event.noteNumber, event.velocity, startTime);
|
|
421
416
|
if (notePromise) {
|
|
422
417
|
this.notePromises.push(notePromise);
|
|
423
418
|
}
|
|
424
419
|
break;
|
|
425
420
|
}
|
|
426
421
|
case "controller":
|
|
427
|
-
this.handleControlChange(event.channel, event.controllerType, event.value);
|
|
422
|
+
this.handleControlChange(event.channel, event.controllerType, event.value, startTime);
|
|
428
423
|
break;
|
|
429
424
|
case "programChange":
|
|
430
|
-
this.handleProgramChange(event.channel, event.programNumber);
|
|
425
|
+
this.handleProgramChange(event.channel, event.programNumber, startTime);
|
|
431
426
|
break;
|
|
432
427
|
case "pitchBend":
|
|
433
|
-
this.setPitchBend(event.channel, event.value + 8192);
|
|
428
|
+
this.setPitchBend(event.channel, event.value + 8192, startTime);
|
|
434
429
|
break;
|
|
435
430
|
case "sysEx":
|
|
436
|
-
this.handleSysEx(event.data);
|
|
431
|
+
this.handleSysEx(event.data, startTime);
|
|
437
432
|
}
|
|
438
433
|
queueIndex++;
|
|
439
434
|
}
|
|
@@ -643,6 +638,18 @@ export class MidyGM1 {
|
|
|
643
638
|
const now = this.audioContext.currentTime;
|
|
644
639
|
return this.resumeTime + now - this.startTime - this.startDelay;
|
|
645
640
|
}
|
|
641
|
+
processScheduledNotes(channel, scheduleTime, callback) {
|
|
642
|
+
channel.scheduledNotes.forEach((noteList) => {
|
|
643
|
+
for (let i = 0; i < noteList.length; i++) {
|
|
644
|
+
const note = noteList[i];
|
|
645
|
+
if (!note)
|
|
646
|
+
continue;
|
|
647
|
+
if (scheduleTime < note.startTime)
|
|
648
|
+
continue;
|
|
649
|
+
callback(note);
|
|
650
|
+
}
|
|
651
|
+
});
|
|
652
|
+
}
|
|
646
653
|
getActiveNotes(channel, time) {
|
|
647
654
|
const activeNotes = new SparseMap(128);
|
|
648
655
|
channel.scheduledNotes.forEach((noteList) => {
|
|
@@ -716,20 +723,20 @@ export class MidyGM1 {
|
|
|
716
723
|
.setValueAtTime(attackVolume, volHold)
|
|
717
724
|
.linearRampToValueAtTime(sustainVolume, volDecay);
|
|
718
725
|
}
|
|
719
|
-
setPitchEnvelope(note) {
|
|
720
|
-
|
|
726
|
+
setPitchEnvelope(note, scheduleTime) {
|
|
727
|
+
scheduleTime ??= this.audioContext.currentTime;
|
|
721
728
|
const { voiceParams } = note;
|
|
722
729
|
const baseRate = voiceParams.playbackRate;
|
|
723
730
|
note.bufferSource.playbackRate
|
|
724
|
-
.cancelScheduledValues(
|
|
725
|
-
.setValueAtTime(baseRate,
|
|
731
|
+
.cancelScheduledValues(scheduleTime)
|
|
732
|
+
.setValueAtTime(baseRate, scheduleTime);
|
|
726
733
|
const modEnvToPitch = voiceParams.modEnvToPitch;
|
|
727
734
|
if (modEnvToPitch === 0)
|
|
728
735
|
return;
|
|
729
736
|
const basePitch = this.rateToCent(baseRate);
|
|
730
737
|
const peekPitch = basePitch + modEnvToPitch;
|
|
731
738
|
const peekRate = this.centToRate(peekPitch);
|
|
732
|
-
const modDelay = startTime + voiceParams.modDelay;
|
|
739
|
+
const modDelay = note.startTime + voiceParams.modDelay;
|
|
733
740
|
const modAttack = modDelay + voiceParams.modAttack;
|
|
734
741
|
const modHold = modAttack + voiceParams.modHold;
|
|
735
742
|
const modDecay = modHold + voiceParams.modDecay;
|
|
@@ -886,10 +893,6 @@ export class MidyGM1 {
|
|
|
886
893
|
note.modulationDepth.disconnect();
|
|
887
894
|
note.modulationLFO.stop();
|
|
888
895
|
}
|
|
889
|
-
if (note.vibratoDepth) {
|
|
890
|
-
note.vibratoDepth.disconnect();
|
|
891
|
-
note.vibratoLFO.stop();
|
|
892
|
-
}
|
|
893
896
|
resolve();
|
|
894
897
|
};
|
|
895
898
|
note.bufferSource.stop(stopTime);
|
|
@@ -984,16 +987,6 @@ export class MidyGM1 {
|
|
|
984
987
|
.cancelScheduledValues(now)
|
|
985
988
|
.setValueAtTime(modulationDepth, now);
|
|
986
989
|
}
|
|
987
|
-
setVibLfoToPitch(channel, note) {
|
|
988
|
-
const now = this.audioContext.currentTime;
|
|
989
|
-
const vibLfoToPitch = note.voiceParams.vibLfoToPitch;
|
|
990
|
-
const vibratoDepth = Math.abs(vibLfoToPitch) * channel.state.vibratoDepth *
|
|
991
|
-
2;
|
|
992
|
-
const vibratoDepthSign = 0 < vibLfoToPitch;
|
|
993
|
-
note.vibratoDepth.gain
|
|
994
|
-
.cancelScheduledValues(now)
|
|
995
|
-
.setValueAtTime(vibratoDepth * vibratoDepthSign, now);
|
|
996
|
-
}
|
|
997
990
|
setModLfoToFilterFc(note) {
|
|
998
991
|
const now = this.audioContext.currentTime;
|
|
999
992
|
const modLfoToFilterFc = note.voiceParams.modLfoToFilterFc;
|
|
@@ -1033,11 +1026,7 @@ export class MidyGM1 {
|
|
|
1033
1026
|
this.setModLfoToPitch(channel, note);
|
|
1034
1027
|
}
|
|
1035
1028
|
},
|
|
1036
|
-
vibLfoToPitch: (
|
|
1037
|
-
if (0 < channel.state.vibratoDepth) {
|
|
1038
|
-
this.setVibLfoToPitch(channel, note);
|
|
1039
|
-
}
|
|
1040
|
-
},
|
|
1029
|
+
vibLfoToPitch: (_channel, _note, _prevValue) => { },
|
|
1041
1030
|
modLfoToFilterFc: (channel, note, _prevValue) => {
|
|
1042
1031
|
if (0 < channel.state.modulationDepth)
|
|
1043
1032
|
this.setModLfoToFilterFc(note);
|
|
@@ -1050,28 +1039,8 @@ export class MidyGM1 {
|
|
|
1050
1039
|
reverbEffectsSend: (_channel, _note, _prevValue) => { },
|
|
1051
1040
|
delayModLFO: (_channel, note, _prevValue) => this.setDelayModLFO(note),
|
|
1052
1041
|
freqModLFO: (_channel, note, _prevValue) => this.setFreqModLFO(note),
|
|
1053
|
-
delayVibLFO: (
|
|
1054
|
-
|
|
1055
|
-
const now = this.audioContext.currentTime;
|
|
1056
|
-
const vibratoDelay = channel.state.vibratoDelay * 2;
|
|
1057
|
-
const prevStartTime = note.startTime + prevValue * vibratoDelay;
|
|
1058
|
-
if (now < prevStartTime)
|
|
1059
|
-
return;
|
|
1060
|
-
const value = note.voiceParams.delayVibLFO;
|
|
1061
|
-
const startTime = note.startTime + value * vibratoDelay;
|
|
1062
|
-
note.vibratoLFO.stop(now);
|
|
1063
|
-
note.vibratoLFO.start(startTime);
|
|
1064
|
-
}
|
|
1065
|
-
},
|
|
1066
|
-
freqVibLFO: (channel, note, _prevValue) => {
|
|
1067
|
-
if (0 < channel.state.vibratoDepth) {
|
|
1068
|
-
const now = this.audioContext.currentTime;
|
|
1069
|
-
const freqVibLFO = note.voiceParams.freqVibLFO;
|
|
1070
|
-
note.vibratoLFO.frequency
|
|
1071
|
-
.cancelScheduledValues(now)
|
|
1072
|
-
.setValueAtTime(freqVibLFO * channel.state.vibratoRate * 2, now);
|
|
1073
|
-
}
|
|
1074
|
-
},
|
|
1042
|
+
delayVibLFO: (_channel, _note, _prevValue) => { },
|
|
1043
|
+
freqVibLFO: (_channel, _note, _prevValue) => { },
|
|
1075
1044
|
};
|
|
1076
1045
|
}
|
|
1077
1046
|
getControllerState(channel, noteNumber, velocity) {
|
|
@@ -1144,10 +1113,10 @@ export class MidyGM1 {
|
|
|
1144
1113
|
123: this.allNotesOff,
|
|
1145
1114
|
};
|
|
1146
1115
|
}
|
|
1147
|
-
handleControlChange(channelNumber, controllerType, value) {
|
|
1116
|
+
handleControlChange(channelNumber, controllerType, value, startTime) {
|
|
1148
1117
|
const handler = this.controlChangeHandlers[controllerType];
|
|
1149
1118
|
if (handler) {
|
|
1150
|
-
handler.call(this, channelNumber, value);
|
|
1119
|
+
handler.call(this, channelNumber, value, startTime);
|
|
1151
1120
|
const channel = this.channels[channelNumber];
|
|
1152
1121
|
this.applyVoiceParams(channel, controllerType + 128);
|
|
1153
1122
|
}
|
|
@@ -1155,33 +1124,28 @@ export class MidyGM1 {
|
|
|
1155
1124
|
console.warn(`Unsupported Control change: controllerType=${controllerType} value=${value}`);
|
|
1156
1125
|
}
|
|
1157
1126
|
}
|
|
1158
|
-
updateModulation(channel) {
|
|
1159
|
-
|
|
1127
|
+
updateModulation(channel, scheduleTime) {
|
|
1128
|
+
scheduleTime ??= this.audioContext.currentTime;
|
|
1160
1129
|
const depth = channel.state.modulationDepth * channel.modulationDepthRange;
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
}
|
|
1169
|
-
else {
|
|
1170
|
-
this.setPitchEnvelope(note);
|
|
1171
|
-
this.startModulation(channel, note, now);
|
|
1172
|
-
}
|
|
1130
|
+
this.processScheduledNotes(channel, scheduleTime, (note) => {
|
|
1131
|
+
if (note.modulationDepth) {
|
|
1132
|
+
note.modulationDepth.gain.setValueAtTime(depth, scheduleTime);
|
|
1133
|
+
}
|
|
1134
|
+
else {
|
|
1135
|
+
this.setPitchEnvelope(note, scheduleTime);
|
|
1136
|
+
this.startModulation(channel, note, scheduleTime);
|
|
1173
1137
|
}
|
|
1174
1138
|
});
|
|
1175
1139
|
}
|
|
1176
|
-
setModulationDepth(channelNumber, modulation) {
|
|
1140
|
+
setModulationDepth(channelNumber, modulation, scheduleTime) {
|
|
1177
1141
|
const channel = this.channels[channelNumber];
|
|
1178
1142
|
channel.state.modulationDepth = modulation / 127;
|
|
1179
|
-
this.updateModulation(channel);
|
|
1143
|
+
this.updateModulation(channel, scheduleTime);
|
|
1180
1144
|
}
|
|
1181
|
-
setVolume(channelNumber, volume) {
|
|
1145
|
+
setVolume(channelNumber, volume, scheduleTime) {
|
|
1182
1146
|
const channel = this.channels[channelNumber];
|
|
1183
1147
|
channel.state.volume = volume / 127;
|
|
1184
|
-
this.updateChannelVolume(channel);
|
|
1148
|
+
this.updateChannelVolume(channel, scheduleTime);
|
|
1185
1149
|
}
|
|
1186
1150
|
panToGain(pan) {
|
|
1187
1151
|
const theta = Math.PI / 2 * Math.max(0, pan * 127 - 1) / 126;
|
|
@@ -1190,31 +1154,31 @@ export class MidyGM1 {
|
|
|
1190
1154
|
gainRight: Math.sin(theta),
|
|
1191
1155
|
};
|
|
1192
1156
|
}
|
|
1193
|
-
setPan(channelNumber, pan) {
|
|
1157
|
+
setPan(channelNumber, pan, scheduleTime) {
|
|
1194
1158
|
const channel = this.channels[channelNumber];
|
|
1195
1159
|
channel.state.pan = pan / 127;
|
|
1196
|
-
this.updateChannelVolume(channel);
|
|
1160
|
+
this.updateChannelVolume(channel, scheduleTime);
|
|
1197
1161
|
}
|
|
1198
|
-
setExpression(channelNumber, expression) {
|
|
1162
|
+
setExpression(channelNumber, expression, scheduleTime) {
|
|
1199
1163
|
const channel = this.channels[channelNumber];
|
|
1200
1164
|
channel.state.expression = expression / 127;
|
|
1201
|
-
this.updateChannelVolume(channel);
|
|
1165
|
+
this.updateChannelVolume(channel, scheduleTime);
|
|
1202
1166
|
}
|
|
1203
1167
|
dataEntryLSB(channelNumber, value) {
|
|
1204
1168
|
this.channels[channelNumber].dataLSB = value;
|
|
1205
1169
|
this.handleRPN(channelNumber, 0);
|
|
1206
1170
|
}
|
|
1207
|
-
updateChannelVolume(channel) {
|
|
1208
|
-
|
|
1171
|
+
updateChannelVolume(channel, scheduleTime) {
|
|
1172
|
+
scheduleTime ??= this.audioContext.currentTime;
|
|
1209
1173
|
const state = channel.state;
|
|
1210
1174
|
const volume = state.volume * state.expression;
|
|
1211
1175
|
const { gainLeft, gainRight } = this.panToGain(state.pan);
|
|
1212
1176
|
channel.gainL.gain
|
|
1213
1177
|
.cancelScheduledValues(now)
|
|
1214
|
-
.setValueAtTime(volume * gainLeft,
|
|
1178
|
+
.setValueAtTime(volume * gainLeft, scheduleTime);
|
|
1215
1179
|
channel.gainR.gain
|
|
1216
1180
|
.cancelScheduledValues(now)
|
|
1217
|
-
.setValueAtTime(volume * gainRight,
|
|
1181
|
+
.setValueAtTime(volume * gainRight, scheduleTime);
|
|
1218
1182
|
}
|
|
1219
1183
|
setSustainPedal(channelNumber, value) {
|
|
1220
1184
|
this.channels[channelNumber].state.sustainPedal = value / 127;
|
package/esm/midy-GM2.d.ts
CHANGED
|
@@ -2,9 +2,6 @@ export class MidyGM2 {
|
|
|
2
2
|
static channelSettings: {
|
|
3
3
|
currentBufferSource: null;
|
|
4
4
|
detune: number;
|
|
5
|
-
scaleOctaveTuningTable: Int8Array<ArrayBuffer>;
|
|
6
|
-
channelPressureTable: Uint8Array<ArrayBuffer>;
|
|
7
|
-
keyBasedInstrumentControlTable: Int8Array<ArrayBuffer>;
|
|
8
5
|
program: number;
|
|
9
6
|
bank: number;
|
|
10
7
|
bankMSB: number;
|
|
@@ -86,12 +83,12 @@ export class MidyGM2 {
|
|
|
86
83
|
};
|
|
87
84
|
controlChangeHandlers: {
|
|
88
85
|
0: (channelNumber: any, msb: any) => void;
|
|
89
|
-
1: (channelNumber: any, modulation: any) => void;
|
|
86
|
+
1: (channelNumber: any, modulation: any, scheduleTime: any) => void;
|
|
90
87
|
5: (channelNumber: any, portamentoTime: any) => void;
|
|
91
88
|
6: (channelNumber: any, value: any) => void;
|
|
92
|
-
7: (channelNumber: any, volume: any) => void;
|
|
93
|
-
10: (channelNumber: any, pan: any) => void;
|
|
94
|
-
11: (channelNumber: any, expression: any) => void;
|
|
89
|
+
7: (channelNumber: any, volume: any, scheduleTime: any) => void;
|
|
90
|
+
10: (channelNumber: any, pan: any, scheduleTime: any) => void;
|
|
91
|
+
11: (channelNumber: any, expression: any, scheduleTime: any) => void;
|
|
95
92
|
32: (channelNumber: any, lsb: any) => void;
|
|
96
93
|
38: (channelNumber: any, value: any) => void;
|
|
97
94
|
64: (channelNumber: any, value: any) => void;
|
|
@@ -156,6 +153,7 @@ export class MidyGM2 {
|
|
|
156
153
|
seekTo(second: any): void;
|
|
157
154
|
calcTotalTime(): number;
|
|
158
155
|
currentTime(): number;
|
|
156
|
+
processScheduledNotes(channel: any, scheduleTime: any, callback: any): void;
|
|
159
157
|
getActiveNotes(channel: any, time: any): SparseMap;
|
|
160
158
|
getActiveNote(noteList: any, time: any): any;
|
|
161
159
|
createConvolutionReverbImpulse(audioContext: any, decay: any, preDecay: any): any;
|
|
@@ -187,14 +185,14 @@ export class MidyGM2 {
|
|
|
187
185
|
calcChannelDetune(channel: any): any;
|
|
188
186
|
calcNoteDetune(channel: any, note: any): any;
|
|
189
187
|
updateChannelDetune(channel: any): void;
|
|
190
|
-
updateDetune(channel: any, note: any
|
|
188
|
+
updateDetune(channel: any, note: any): void;
|
|
191
189
|
getPortamentoTime(channel: any): number;
|
|
192
190
|
setPortamentoStartVolumeEnvelope(channel: any, note: any): void;
|
|
193
|
-
setVolumeEnvelope(
|
|
194
|
-
setPitchEnvelope(note: any): void;
|
|
191
|
+
setVolumeEnvelope(channel: any, note: any): void;
|
|
192
|
+
setPitchEnvelope(note: any, scheduleTime: any): void;
|
|
195
193
|
clampCutoffFrequency(frequency: any): number;
|
|
196
194
|
setPortamentoStartFilterEnvelope(channel: any, note: any): void;
|
|
197
|
-
setFilterEnvelope(channel: any, note: any
|
|
195
|
+
setFilterEnvelope(channel: any, note: any): void;
|
|
198
196
|
startModulation(channel: any, note: any, startTime: any): void;
|
|
199
197
|
startVibrato(channel: any, note: any, startTime: any): void;
|
|
200
198
|
getAudioBuffer(program: any, noteNumber: any, velocity: any, voiceParams: any, isSF3: any): Promise<any>;
|
|
@@ -209,13 +207,13 @@ export class MidyGM2 {
|
|
|
209
207
|
releaseSostenutoPedal(channelNumber: any, halfVelocity: any): any[];
|
|
210
208
|
handleMIDIMessage(statusByte: any, data1: any, data2: any): void | Promise<any>;
|
|
211
209
|
handleProgramChange(channelNumber: any, program: any): void;
|
|
212
|
-
handleChannelPressure(channelNumber: any, value: any): void;
|
|
210
|
+
handleChannelPressure(channelNumber: any, value: any, startTime: any): void;
|
|
213
211
|
handlePitchBendMessage(channelNumber: any, lsb: any, msb: any): void;
|
|
214
212
|
setPitchBend(channelNumber: any, value: any): void;
|
|
215
|
-
setModLfoToPitch(channel: any, note: any
|
|
213
|
+
setModLfoToPitch(channel: any, note: any): void;
|
|
216
214
|
setVibLfoToPitch(channel: any, note: any): void;
|
|
217
|
-
setModLfoToFilterFc(
|
|
218
|
-
setModLfoToVolume(
|
|
215
|
+
setModLfoToFilterFc(channel: any, note: any): void;
|
|
216
|
+
setModLfoToVolume(channel: any, note: any): void;
|
|
219
217
|
setReverbEffectsSend(channel: any, note: any, prevValue: any): void;
|
|
220
218
|
setChorusEffectsSend(channel: any, note: any, prevValue: any): void;
|
|
221
219
|
setDelayModLFO(note: any): void;
|
|
@@ -237,12 +235,12 @@ export class MidyGM2 {
|
|
|
237
235
|
applyVoiceParams(channel: any, controllerType: any): void;
|
|
238
236
|
createControlChangeHandlers(): {
|
|
239
237
|
0: (channelNumber: any, msb: any) => void;
|
|
240
|
-
1: (channelNumber: any, modulation: any) => void;
|
|
238
|
+
1: (channelNumber: any, modulation: any, scheduleTime: any) => void;
|
|
241
239
|
5: (channelNumber: any, portamentoTime: any) => void;
|
|
242
240
|
6: (channelNumber: any, value: any) => void;
|
|
243
|
-
7: (channelNumber: any, volume: any) => void;
|
|
244
|
-
10: (channelNumber: any, pan: any) => void;
|
|
245
|
-
11: (channelNumber: any, expression: any) => void;
|
|
241
|
+
7: (channelNumber: any, volume: any, scheduleTime: any) => void;
|
|
242
|
+
10: (channelNumber: any, pan: any, scheduleTime: any) => void;
|
|
243
|
+
11: (channelNumber: any, expression: any, scheduleTime: any) => void;
|
|
246
244
|
32: (channelNumber: any, lsb: any) => void;
|
|
247
245
|
38: (channelNumber: any, value: any) => void;
|
|
248
246
|
64: (channelNumber: any, value: any) => void;
|
|
@@ -261,20 +259,20 @@ export class MidyGM2 {
|
|
|
261
259
|
126: () => void;
|
|
262
260
|
127: () => void;
|
|
263
261
|
};
|
|
264
|
-
handleControlChange(channelNumber: any, controllerType: any, value: any): void;
|
|
262
|
+
handleControlChange(channelNumber: any, controllerType: any, value: any, startTime: any): void;
|
|
265
263
|
setBankMSB(channelNumber: any, msb: any): void;
|
|
266
|
-
updateModulation(channel: any): void;
|
|
267
|
-
setModulationDepth(channelNumber: any, modulation: any): void;
|
|
264
|
+
updateModulation(channel: any, scheduleTime: any): void;
|
|
265
|
+
setModulationDepth(channelNumber: any, modulation: any, scheduleTime: any): void;
|
|
268
266
|
setPortamentoTime(channelNumber: any, portamentoTime: any): void;
|
|
269
|
-
setKeyBasedVolume(channel: any): void;
|
|
270
|
-
setVolume(channelNumber: any, volume: any): void;
|
|
267
|
+
setKeyBasedVolume(channel: any, scheduleTime: any): void;
|
|
268
|
+
setVolume(channelNumber: any, volume: any, scheduleTime: any): void;
|
|
271
269
|
panToGain(pan: any): {
|
|
272
270
|
gainLeft: number;
|
|
273
271
|
gainRight: number;
|
|
274
272
|
};
|
|
275
|
-
setKeyBasedPan(channel: any): void;
|
|
276
|
-
setPan(channelNumber: any, pan: any): void;
|
|
277
|
-
setExpression(channelNumber: any, expression: any): void;
|
|
273
|
+
setKeyBasedPan(channel: any, scheduleTime: any): void;
|
|
274
|
+
setPan(channelNumber: any, pan: any, scheduleTime: any): void;
|
|
275
|
+
setExpression(channelNumber: any, expression: any, scheduleTime: any): void;
|
|
278
276
|
setBankLSB(channelNumber: any, lsb: any): void;
|
|
279
277
|
dataEntryLSB(channelNumber: any, value: any): void;
|
|
280
278
|
updateChannelVolume(channel: any): void;
|
|
@@ -335,7 +333,12 @@ export class MidyGM2 {
|
|
|
335
333
|
getChorusSendToReverb(value: any): number;
|
|
336
334
|
getChannelBitmap(data: any): any[];
|
|
337
335
|
handleScaleOctaveTuning1ByteFormatSysEx(data: any, realtime: any): void;
|
|
338
|
-
|
|
336
|
+
getFilterCutoffControl(channel: any): number;
|
|
337
|
+
getAmplitudeControl(channel: any): number;
|
|
338
|
+
getLFOPitchDepth(channel: any): number;
|
|
339
|
+
getLFOFilterDepth(channel: any): number;
|
|
340
|
+
getLFOAmplitudeDepth(channel: any): number;
|
|
341
|
+
setControllerParameters(channel: any, note: any, table: any): void;
|
|
339
342
|
handleChannelPressureSysEx(data: any, tableName: any): void;
|
|
340
343
|
initControlTable(): Uint8Array<ArrayBuffer>;
|
|
341
344
|
applyControlTable(channel: any, controllerType: any): void;
|
|
@@ -363,11 +366,12 @@ declare class Note {
|
|
|
363
366
|
constructor(noteNumber: any, velocity: any, startTime: any, voice: any, voiceParams: any);
|
|
364
367
|
bufferSource: any;
|
|
365
368
|
filterNode: any;
|
|
369
|
+
filterDepth: any;
|
|
366
370
|
volumeEnvelopeNode: any;
|
|
371
|
+
volumeDepth: any;
|
|
367
372
|
volumeNode: any;
|
|
368
373
|
gainL: any;
|
|
369
374
|
gainR: any;
|
|
370
|
-
volumeDepth: any;
|
|
371
375
|
modulationLFO: any;
|
|
372
376
|
modulationDepth: any;
|
|
373
377
|
vibratoLFO: any;
|
package/esm/midy-GM2.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"midy-GM2.d.ts","sourceRoot":"","sources":["../src/midy-GM2.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"midy-GM2.d.ts","sourceRoot":"","sources":["../src/midy-GM2.js"],"names":[],"mappings":"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"}
|