@marmooo/midy 0.1.0 → 0.1.1
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-GM2.d.ts +18 -8
- package/esm/midy-GM2.d.ts.map +1 -1
- package/esm/midy-GM2.js +141 -69
- package/esm/midy.d.ts +18 -8
- package/esm/midy.d.ts.map +1 -1
- package/esm/midy.js +141 -69
- package/package.json +1 -1
- package/script/midy-GM2.d.ts +18 -8
- package/script/midy-GM2.d.ts.map +1 -1
- package/script/midy-GM2.js +141 -69
- package/script/midy.d.ts +18 -8
- package/script/midy.d.ts.map +1 -1
- package/script/midy.js +141 -69
package/esm/midy-GM2.d.ts
CHANGED
|
@@ -56,6 +56,7 @@ export class MidyGM2 {
|
|
|
56
56
|
modDepth: number;
|
|
57
57
|
feedback: number;
|
|
58
58
|
sendToReverb: number;
|
|
59
|
+
delayTimes: any[];
|
|
59
60
|
};
|
|
60
61
|
mono: boolean;
|
|
61
62
|
omni: boolean;
|
|
@@ -102,11 +103,13 @@ export class MidyGM2 {
|
|
|
102
103
|
output: any;
|
|
103
104
|
};
|
|
104
105
|
chorusEffect: {
|
|
106
|
+
input: any;
|
|
107
|
+
output: any;
|
|
108
|
+
sendGain: any;
|
|
105
109
|
lfo: any;
|
|
106
110
|
lfoGain: any;
|
|
107
111
|
delayNodes: any[];
|
|
108
|
-
|
|
109
|
-
output: any;
|
|
112
|
+
feedbackGains: any[];
|
|
110
113
|
};
|
|
111
114
|
};
|
|
112
115
|
createChannels(audioContext: any): any[];
|
|
@@ -145,12 +148,14 @@ export class MidyGM2 {
|
|
|
145
148
|
input: any;
|
|
146
149
|
output: any;
|
|
147
150
|
};
|
|
148
|
-
createChorusEffect(audioContext: any
|
|
151
|
+
createChorusEffect(audioContext: any): {
|
|
152
|
+
input: any;
|
|
153
|
+
output: any;
|
|
154
|
+
sendGain: any;
|
|
149
155
|
lfo: any;
|
|
150
156
|
lfoGain: any;
|
|
151
157
|
delayNodes: any[];
|
|
152
|
-
|
|
153
|
-
output: any;
|
|
158
|
+
feedbackGains: any[];
|
|
154
159
|
};
|
|
155
160
|
connectEffects(channel: any, gainNode: any): void;
|
|
156
161
|
cbToRatio(cb: any): number;
|
|
@@ -226,19 +231,24 @@ export class MidyGM2 {
|
|
|
226
231
|
setMasterFineTuning(fineTuning: any): void;
|
|
227
232
|
handleMasterCoarseTuningSysEx(data: any): void;
|
|
228
233
|
setMasterCoarseTuning(coarseTuning: any): void;
|
|
229
|
-
|
|
230
|
-
|
|
234
|
+
handleGlobalParameterControlSysEx(data: any): void;
|
|
235
|
+
handleReverbParameterSysEx(data: any): void;
|
|
231
236
|
setReverbType(type: any): void;
|
|
232
237
|
getReverbTimeFromType(type: any): number | undefined;
|
|
233
238
|
setReverbTime(value: any): void;
|
|
234
239
|
getReverbTime(value: any): number;
|
|
235
240
|
calcDelay(rt60: any, feedback: any): number;
|
|
236
|
-
|
|
241
|
+
handleChorusParameterSysEx(data: any): void;
|
|
237
242
|
setChorusType(type: any): void;
|
|
243
|
+
setChorusParameter(modRate: any, modDepth: any, feedback: any, sendToReverb: any): void;
|
|
238
244
|
setChorusModRate(value: any): void;
|
|
245
|
+
getChorusModRate(value: any): number;
|
|
239
246
|
setChorusModDepth(value: any): void;
|
|
247
|
+
getChorusModDepth(value: any): number;
|
|
240
248
|
setChorusFeedback(value: any): void;
|
|
249
|
+
getChorusFeedback(value: any): number;
|
|
241
250
|
setChorusSendToReverb(value: any): void;
|
|
251
|
+
getChorusSendToReverb(value: any): number;
|
|
242
252
|
handleExclusiveMessage(data: any): void;
|
|
243
253
|
handleSysEx(data: any): void;
|
|
244
254
|
scheduleTask(callback: any, startTime: any): Promise<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":"AAuBA;
|
|
1
|
+
{"version":3,"file":"midy-GM2.d.ts","sourceRoot":"","sources":["../src/midy-GM2.js"],"names":[],"mappings":"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"}
|
package/esm/midy-GM2.js
CHANGED
|
@@ -82,7 +82,7 @@ export class MidyGM2 {
|
|
|
82
82
|
writable: true,
|
|
83
83
|
value: {
|
|
84
84
|
time: this.getReverbTime(64),
|
|
85
|
-
feedback: 0.
|
|
85
|
+
feedback: 0.25,
|
|
86
86
|
}
|
|
87
87
|
});
|
|
88
88
|
Object.defineProperty(this, "chorus", {
|
|
@@ -90,10 +90,11 @@ export class MidyGM2 {
|
|
|
90
90
|
configurable: true,
|
|
91
91
|
writable: true,
|
|
92
92
|
value: {
|
|
93
|
-
modRate: 3
|
|
94
|
-
modDepth: (
|
|
95
|
-
feedback: 8
|
|
96
|
-
sendToReverb: 0
|
|
93
|
+
modRate: this.getChorusModRate(3),
|
|
94
|
+
modDepth: this.getChorusModDepth(19),
|
|
95
|
+
feedback: this.getChorusFeedback(8),
|
|
96
|
+
sendToReverb: this.getChorusSendToReverb(0),
|
|
97
|
+
delayTimes: this.generateDistributedArray(0.02, 2, 0.5),
|
|
97
98
|
}
|
|
98
99
|
});
|
|
99
100
|
Object.defineProperty(this, "mono", {
|
|
@@ -688,9 +689,7 @@ export class MidyGM2 {
|
|
|
688
689
|
createSchroederReverb(audioContext, combDelays, combFeedbacks, allpassDelays, allpassFeedbacks) {
|
|
689
690
|
const input = new GainNode(audioContext);
|
|
690
691
|
const output = new GainNode(audioContext);
|
|
691
|
-
const mergerGain = new GainNode(audioContext
|
|
692
|
-
gain: 1 / (combDelays.length * 2),
|
|
693
|
-
});
|
|
692
|
+
const mergerGain = new GainNode(audioContext);
|
|
694
693
|
for (let i = 0; i < combDelays.length; i++) {
|
|
695
694
|
const comb = this.createCombFilter(audioContext, input, combDelays[i], combFeedbacks[i]);
|
|
696
695
|
comb.connect(mergerGain);
|
|
@@ -703,60 +702,62 @@ export class MidyGM2 {
|
|
|
703
702
|
allpasses.at(-1).connect(output);
|
|
704
703
|
return { input, output };
|
|
705
704
|
}
|
|
706
|
-
createChorusEffect(audioContext
|
|
707
|
-
const
|
|
708
|
-
const lfo = new OscillatorNode(audioContext, { frequency: chorusRate });
|
|
709
|
-
const lfoGain = new GainNode(audioContext, { gain: chorusDepth });
|
|
705
|
+
createChorusEffect(audioContext) {
|
|
706
|
+
const input = new GainNode(audioContext);
|
|
710
707
|
const output = new GainNode(audioContext);
|
|
711
|
-
const
|
|
708
|
+
const sendGain = new GainNode(audioContext);
|
|
709
|
+
const lfo = new OscillatorNode(audioContext, {
|
|
710
|
+
frequency: this.chorus.modRate,
|
|
711
|
+
});
|
|
712
|
+
const lfoGain = new GainNode(audioContext, {
|
|
713
|
+
gain: this.chorus.modDepth / 2,
|
|
714
|
+
});
|
|
715
|
+
const delayTimes = this.chorus.delayTimes;
|
|
712
716
|
const delayNodes = [];
|
|
713
|
-
const
|
|
714
|
-
for (let i = 0; i <
|
|
715
|
-
const
|
|
716
|
-
const delayTime = (i + 1) * delay + randomDelayFactor;
|
|
717
|
+
const feedbackGains = [];
|
|
718
|
+
for (let i = 0; i < delayTimes.length; i++) {
|
|
719
|
+
const delayTime = delayTimes[i];
|
|
717
720
|
const delayNode = new DelayNode(audioContext, {
|
|
718
|
-
maxDelayTime: delayTime
|
|
721
|
+
maxDelayTime: 0.1, // generally, 5ms < delayTime < 50ms
|
|
722
|
+
delayTime,
|
|
723
|
+
});
|
|
724
|
+
const feedbackGain = new GainNode(audioContext, {
|
|
725
|
+
gain: this.chorus.feedback,
|
|
719
726
|
});
|
|
720
|
-
const chorusGain = new GainNode(audioContext, { gain: baseGain });
|
|
721
727
|
delayNodes.push(delayNode);
|
|
722
|
-
|
|
728
|
+
feedbackGains.push(feedbackGain);
|
|
729
|
+
input.connect(delayNode);
|
|
723
730
|
lfoGain.connect(delayNode.delayTime);
|
|
724
|
-
delayNode.connect(
|
|
725
|
-
|
|
731
|
+
delayNode.connect(feedbackGain);
|
|
732
|
+
feedbackGain.connect(delayNode);
|
|
733
|
+
delayNode.connect(output);
|
|
726
734
|
}
|
|
735
|
+
output.connect(sendGain);
|
|
727
736
|
lfo.connect(lfoGain);
|
|
728
737
|
lfo.start();
|
|
729
738
|
return {
|
|
739
|
+
input,
|
|
740
|
+
output,
|
|
741
|
+
sendGain,
|
|
730
742
|
lfo,
|
|
731
743
|
lfoGain,
|
|
732
744
|
delayNodes,
|
|
733
|
-
|
|
734
|
-
output,
|
|
745
|
+
feedbackGains,
|
|
735
746
|
};
|
|
736
747
|
}
|
|
737
748
|
connectEffects(channel, gainNode) {
|
|
738
749
|
gainNode.connect(channel.merger);
|
|
739
750
|
channel.merger.connect(this.masterGain);
|
|
740
|
-
if (channel.reverbSendLevel
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
channel.merger.connect(delayNode);
|
|
744
|
-
});
|
|
745
|
-
channel.chorusEffect.output.connect(this.masterGain);
|
|
746
|
-
}
|
|
751
|
+
if (0 < channel.reverbSendLevel) {
|
|
752
|
+
channel.merger.connect(channel.reverbEffect.input);
|
|
753
|
+
channel.reverbEffect.output.connect(this.masterGain);
|
|
747
754
|
}
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
channel.chorusEffect.delayNodes.forEach((delayNode) => {
|
|
755
|
-
channel.merger.connect(delayNode);
|
|
756
|
-
});
|
|
757
|
-
channel.merger.connect(channel.reverbEffect.input);
|
|
758
|
-
channel.reverbEffect.output.connect(this.masterGain);
|
|
759
|
-
}
|
|
755
|
+
if (0 < channel.chorusSendLevel) {
|
|
756
|
+
channel.merger.connect(channel.chorusEffect.input);
|
|
757
|
+
channel.reverbEffect.output.connect(this.masterGain);
|
|
758
|
+
}
|
|
759
|
+
if (0 < this.chorus.sendToReverb) {
|
|
760
|
+
channel.chorusEffect.sendGain.connect(channel.reverbEffect.input);
|
|
760
761
|
}
|
|
761
762
|
}
|
|
762
763
|
cbToRatio(cb) {
|
|
@@ -1170,9 +1171,12 @@ export class MidyGM2 {
|
|
|
1170
1171
|
reverbEffect.output.gain.setValueAtTime(channel.reverbSendLevel, now);
|
|
1171
1172
|
}
|
|
1172
1173
|
setChorusSendLevel(channelNumber, chorusSendLevel) {
|
|
1174
|
+
const now = this.audioContext.currentTime;
|
|
1173
1175
|
const channel = this.channels[channelNumber];
|
|
1176
|
+
const chorusEffect = channel.chorusEffect;
|
|
1174
1177
|
channel.chorusSendLevel = chorusSendLevel / 127;
|
|
1175
|
-
|
|
1178
|
+
chorusEffect.output.gain.cancelScheduledValues(now);
|
|
1179
|
+
chorusEffect.output.gain.setValueAtTime(channel.chorusSendLevel, now);
|
|
1176
1180
|
}
|
|
1177
1181
|
setSostenutoPedal(channelNumber, value) {
|
|
1178
1182
|
const isOn = value >= 64;
|
|
@@ -1404,7 +1408,7 @@ export class MidyGM2 {
|
|
|
1404
1408
|
case 4: // https://amei.or.jp/midistandardcommittee/Recommended_Practice/e/ca25.pdf
|
|
1405
1409
|
return this.handleMasterCoarseTuningSysEx(data);
|
|
1406
1410
|
case 5:
|
|
1407
|
-
return this.
|
|
1411
|
+
return this.handleGlobalParameterControlSysEx(data);
|
|
1408
1412
|
default:
|
|
1409
1413
|
console.warn(`Unsupported Exclusive Message: ${data}`);
|
|
1410
1414
|
}
|
|
@@ -1481,13 +1485,13 @@ export class MidyGM2 {
|
|
|
1481
1485
|
this.masterCoarseTuning = coarseTuning - 64;
|
|
1482
1486
|
}
|
|
1483
1487
|
}
|
|
1484
|
-
|
|
1485
|
-
if (data[
|
|
1486
|
-
switch (data[
|
|
1488
|
+
handleGlobalParameterControlSysEx(data) {
|
|
1489
|
+
if (data[7] === 1) {
|
|
1490
|
+
switch (data[8]) {
|
|
1487
1491
|
case 1:
|
|
1488
|
-
return this.
|
|
1492
|
+
return this.handleReverbParameterSysEx(data);
|
|
1489
1493
|
case 2:
|
|
1490
|
-
return this.
|
|
1494
|
+
return this.handleChorusParameterSysEx(data);
|
|
1491
1495
|
default:
|
|
1492
1496
|
console.warn(`Unsupported Global Parameter Control Message: ${data}`);
|
|
1493
1497
|
}
|
|
@@ -1496,12 +1500,12 @@ export class MidyGM2 {
|
|
|
1496
1500
|
console.warn(`Unsupported Global Parameter Control Message: ${data}`);
|
|
1497
1501
|
}
|
|
1498
1502
|
}
|
|
1499
|
-
|
|
1500
|
-
switch (data[
|
|
1503
|
+
handleReverbParameterSysEx(data) {
|
|
1504
|
+
switch (data[9]) {
|
|
1501
1505
|
case 0:
|
|
1502
|
-
return this.setReverbType(data[
|
|
1506
|
+
return this.setReverbType(data[10]);
|
|
1503
1507
|
case 1:
|
|
1504
|
-
return this.setReverbTime(data[
|
|
1508
|
+
return this.setReverbTime(data[10]);
|
|
1505
1509
|
}
|
|
1506
1510
|
}
|
|
1507
1511
|
setReverbType(type) {
|
|
@@ -1561,41 +1565,109 @@ export class MidyGM2 {
|
|
|
1561
1565
|
// RT60 = -3 * delay / Math.log10(feedback)
|
|
1562
1566
|
// feedback = Math.pow(10, -3 * delay / RT60)
|
|
1563
1567
|
// delay estimation using ideal feedback
|
|
1564
|
-
//
|
|
1565
|
-
//
|
|
1566
|
-
// It
|
|
1568
|
+
// The structure of a concert hall is complex,
|
|
1569
|
+
// so estimates based on mean free path are unstable.
|
|
1570
|
+
// It is easier to determine the delay based on ideal feedback.
|
|
1571
|
+
// The average sound absorption coefficient
|
|
1572
|
+
// suitable for playing musical instruments is 0.18 to 0.28.
|
|
1567
1573
|
// delay = -RT60 * Math.log10(feedback) / 3
|
|
1568
1574
|
calcDelay(rt60, feedback) {
|
|
1569
1575
|
return -rt60 * Math.log10(feedback) / 3;
|
|
1570
1576
|
}
|
|
1571
|
-
|
|
1572
|
-
switch (data[
|
|
1577
|
+
handleChorusParameterSysEx(data) {
|
|
1578
|
+
switch (data[9]) {
|
|
1573
1579
|
case 0:
|
|
1574
|
-
return this.setChorusType(data[
|
|
1580
|
+
return this.setChorusType(data[10]);
|
|
1575
1581
|
case 1:
|
|
1576
|
-
return this.setChorusModRate(data[
|
|
1582
|
+
return this.setChorusModRate(data[10]);
|
|
1577
1583
|
case 2:
|
|
1578
|
-
return this.setChorusModDepth(data[
|
|
1584
|
+
return this.setChorusModDepth(data[10]);
|
|
1579
1585
|
case 3:
|
|
1580
|
-
return this.setChorusFeedback(data[
|
|
1586
|
+
return this.setChorusFeedback(data[10]);
|
|
1581
1587
|
case 4:
|
|
1582
|
-
return this.setChorusSendToReverb(data[
|
|
1588
|
+
return this.setChorusSendToReverb(data[10]);
|
|
1583
1589
|
}
|
|
1584
1590
|
}
|
|
1585
1591
|
setChorusType(type) {
|
|
1586
|
-
|
|
1592
|
+
switch (type) {
|
|
1593
|
+
case 0:
|
|
1594
|
+
return this.setChorusParameter(3, 5, 0, 0);
|
|
1595
|
+
case 1:
|
|
1596
|
+
return this.setChorusParameter(9, 19, 5, 0);
|
|
1597
|
+
case 2:
|
|
1598
|
+
return this.setChorusParameter(3, 19, 8, 0);
|
|
1599
|
+
case 3:
|
|
1600
|
+
return this.setChorusParameter(9, 16, 16, 0);
|
|
1601
|
+
case 4:
|
|
1602
|
+
return this.setChorusParameter(2, 24, 64, 0);
|
|
1603
|
+
case 5:
|
|
1604
|
+
return this.setChorusParameter(1, 5, 112, 0);
|
|
1605
|
+
default:
|
|
1606
|
+
console.warn(`Unsupported Chorus Type: ${type}`);
|
|
1607
|
+
}
|
|
1608
|
+
}
|
|
1609
|
+
setChorusParameter(modRate, modDepth, feedback, sendToReverb) {
|
|
1610
|
+
this.setChorusModRate(modRate);
|
|
1611
|
+
this.setChorusModDepth(modDepth);
|
|
1612
|
+
this.setChorusFeedback(feedback);
|
|
1613
|
+
this.setChorusSendToReverb(sendToReverb);
|
|
1587
1614
|
}
|
|
1588
1615
|
setChorusModRate(value) {
|
|
1589
|
-
|
|
1616
|
+
const now = this.audioContext.currentTime;
|
|
1617
|
+
const modRate = this.getChorusModRate(value);
|
|
1618
|
+
this.chorus.modRate = modRate;
|
|
1619
|
+
for (let i = 0; i < this.channels.length; i++) {
|
|
1620
|
+
const lfo = this.channels[i].chorusEffect.lfo;
|
|
1621
|
+
lfo.frequency.setValueAtTime(modRate, now);
|
|
1622
|
+
}
|
|
1623
|
+
}
|
|
1624
|
+
getChorusModRate(value) {
|
|
1625
|
+
return value * 0.122; // Hz
|
|
1590
1626
|
}
|
|
1591
1627
|
setChorusModDepth(value) {
|
|
1592
|
-
|
|
1628
|
+
const now = this.audioContext.currentTime;
|
|
1629
|
+
const modDepth = this.getChorusModDepth(value);
|
|
1630
|
+
this.chorus.modDepth = modDepth;
|
|
1631
|
+
for (let i = 0; i < this.channels.length; i++) {
|
|
1632
|
+
const chorusEffect = this.channels[i].chorusEffect;
|
|
1633
|
+
chorusEffect.lfoGain.gain
|
|
1634
|
+
.cancelScheduledValues(now)
|
|
1635
|
+
.setValueAtTime(modDepth / 2, now);
|
|
1636
|
+
}
|
|
1637
|
+
}
|
|
1638
|
+
getChorusModDepth(value) {
|
|
1639
|
+
return (value + 1) / 3200; // second
|
|
1593
1640
|
}
|
|
1594
1641
|
setChorusFeedback(value) {
|
|
1595
|
-
|
|
1642
|
+
const now = this.audioContext.currentTime;
|
|
1643
|
+
const feedback = this.getChorusFeedback(value);
|
|
1644
|
+
this.chorus.feedback = feedback;
|
|
1645
|
+
for (let i = 0; i < this.channels.length; i++) {
|
|
1646
|
+
const chorusEffect = this.channels[i].chorusEffect;
|
|
1647
|
+
for (let j = 0; j < chorusEffect.feedbackGains.length; j++) {
|
|
1648
|
+
const feedbackGain = chorusEffect.feedbackGains[j];
|
|
1649
|
+
feedbackGain.gain
|
|
1650
|
+
.cancelScheduledValues(now)
|
|
1651
|
+
.setValueAtTime(feedback, now);
|
|
1652
|
+
}
|
|
1653
|
+
}
|
|
1654
|
+
}
|
|
1655
|
+
getChorusFeedback(value) {
|
|
1656
|
+
return value * 0.00763;
|
|
1596
1657
|
}
|
|
1597
1658
|
setChorusSendToReverb(value) {
|
|
1598
|
-
|
|
1659
|
+
const now = this.audioContext.currentTime;
|
|
1660
|
+
const sendToReverb = this.getChorusSendToReverb(value);
|
|
1661
|
+
this.chorus.sendToReverb = sendToReverb;
|
|
1662
|
+
for (let i = 0; i < this.channels.length; i++) {
|
|
1663
|
+
const chorusEffect = this.channels[i].chorusEffect;
|
|
1664
|
+
chorusEffect.sendGain.gain
|
|
1665
|
+
.cancelScheduledValues(now)
|
|
1666
|
+
.setValueAtTime(sendToReverb, now);
|
|
1667
|
+
}
|
|
1668
|
+
}
|
|
1669
|
+
getChorusSendToReverb(value) {
|
|
1670
|
+
return value * 0.00787;
|
|
1599
1671
|
}
|
|
1600
1672
|
handleExclusiveMessage(data) {
|
|
1601
1673
|
console.warn(`Unsupported Exclusive Message: ${data}`);
|
package/esm/midy.d.ts
CHANGED
|
@@ -59,6 +59,7 @@ export class Midy {
|
|
|
59
59
|
modDepth: number;
|
|
60
60
|
feedback: number;
|
|
61
61
|
sendToReverb: number;
|
|
62
|
+
delayTimes: any[];
|
|
62
63
|
};
|
|
63
64
|
mono: boolean;
|
|
64
65
|
omni: boolean;
|
|
@@ -105,11 +106,13 @@ export class Midy {
|
|
|
105
106
|
output: any;
|
|
106
107
|
};
|
|
107
108
|
chorusEffect: {
|
|
109
|
+
input: any;
|
|
110
|
+
output: any;
|
|
111
|
+
sendGain: any;
|
|
108
112
|
lfo: any;
|
|
109
113
|
lfoGain: any;
|
|
110
114
|
delayNodes: any[];
|
|
111
|
-
|
|
112
|
-
output: any;
|
|
115
|
+
feedbackGains: any[];
|
|
113
116
|
};
|
|
114
117
|
};
|
|
115
118
|
createChannels(audioContext: any): any[];
|
|
@@ -148,12 +151,14 @@ export class Midy {
|
|
|
148
151
|
input: any;
|
|
149
152
|
output: any;
|
|
150
153
|
};
|
|
151
|
-
createChorusEffect(audioContext: any
|
|
154
|
+
createChorusEffect(audioContext: any): {
|
|
155
|
+
input: any;
|
|
156
|
+
output: any;
|
|
157
|
+
sendGain: any;
|
|
152
158
|
lfo: any;
|
|
153
159
|
lfoGain: any;
|
|
154
160
|
delayNodes: any[];
|
|
155
|
-
|
|
156
|
-
output: any;
|
|
161
|
+
feedbackGains: any[];
|
|
157
162
|
};
|
|
158
163
|
connectEffects(channel: any, gainNode: any): void;
|
|
159
164
|
cbToRatio(cb: any): number;
|
|
@@ -236,19 +241,24 @@ export class Midy {
|
|
|
236
241
|
setMasterFineTuning(fineTuning: any): void;
|
|
237
242
|
handleMasterCoarseTuningSysEx(data: any): void;
|
|
238
243
|
setMasterCoarseTuning(coarseTuning: any): void;
|
|
239
|
-
|
|
240
|
-
|
|
244
|
+
handleGlobalParameterControlSysEx(data: any): void;
|
|
245
|
+
handleReverbParameterSysEx(data: any): void;
|
|
241
246
|
setReverbType(type: any): void;
|
|
242
247
|
getReverbTimeFromType(type: any): number | undefined;
|
|
243
248
|
setReverbTime(value: any): void;
|
|
244
249
|
getReverbTime(value: any): number;
|
|
245
250
|
calcDelay(rt60: any, feedback: any): number;
|
|
246
|
-
|
|
251
|
+
handleChorusParameterSysEx(data: any): void;
|
|
247
252
|
setChorusType(type: any): void;
|
|
253
|
+
setChorusParameter(modRate: any, modDepth: any, feedback: any, sendToReverb: any): void;
|
|
248
254
|
setChorusModRate(value: any): void;
|
|
255
|
+
getChorusModRate(value: any): number;
|
|
249
256
|
setChorusModDepth(value: any): void;
|
|
257
|
+
getChorusModDepth(value: any): number;
|
|
250
258
|
setChorusFeedback(value: any): void;
|
|
259
|
+
getChorusFeedback(value: any): number;
|
|
251
260
|
setChorusSendToReverb(value: any): void;
|
|
261
|
+
getChorusSendToReverb(value: any): number;
|
|
252
262
|
handleExclusiveMessage(data: any): void;
|
|
253
263
|
handleSysEx(data: any): void;
|
|
254
264
|
scheduleTask(callback: any, startTime: any): Promise<any>;
|
package/esm/midy.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"midy.d.ts","sourceRoot":"","sources":["../src/midy.js"],"names":[],"mappings":"AAuBA;
|
|
1
|
+
{"version":3,"file":"midy.d.ts","sourceRoot":"","sources":["../src/midy.js"],"names":[],"mappings":"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"}
|