@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 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
- chorusGains: any[];
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, options?: {}): {
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
- chorusGains: any[];
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
- handleGlobalParameterControl(data: any): void;
230
- handleReverbParameter(data: any): void;
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
- handleChorusParameter(data: any): void;
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>;
@@ -1 +1 @@
1
- {"version":3,"file":"midy-GM2.d.ts","sourceRoot":"","sources":["../src/midy-GM2.js"],"names":[],"mappings":"AAuBA;IAiCE;;;;;;;;;;;;;;;;;MAiBE;IAEF;;;;;;;;;;;MAWE;IAEF;;;;;;;MAOE;IAgCF;;;;;OAOC;IA9GD,qBAAmB;IACnB,kBAAc;IACd,yBAAqB;IACrB,2BAAuB;IACvB;;;MAGE;IACF;;;;;MAKE;IACF,cAAa;IACb,cAAa;IACb,0BAAwB;IACxB,kBAAc;IACd,mBAAiB;IACjB,kBAAc;IACd,mBAAe;IACf,kBAAgB;IAChB,sBAA2C;IAC3C,mBAAkB;IAClB,mBAAkB;IAClB,kBAAiB;IACjB,oBAAmB;IACnB,mBAAkB;IAClB,gBAAc;IACd,mBAAiB;IACjB,oBAAkB;IA2ClB;;;;;MA4BE;IAGA,kBAAgC;IAChC;;;;;MAAqD;IACrD,gBAA4C;IAE5C,gBAAiD;IAInD,4BAMC;IAED,mCASC;IAED,gDAMC;IAED,sCASC;IAED;;;;;;;;;;;;;;;MAkBC;IAED,yCAcC;IAED,+DAyBC;IAED,mEAWC;IAED,qDAOC;IAED,2EAkDC;IAED,mCAOC;IAED,0BA+CC;IAED,uDAEC;IAED,wDAEC;IAED;;;MAgGC;IAED,4BAsBC;IAED,uBAKC;IAED,aAGC;IAED,cAKC;IAED,wBAIC;IAED,0BAKC;IAED,wBAOC;IAED,sBAGC;IAED,uDASC;IAED,6CAQC;IAED,kFAuBC;IAED;;;;MAWC;IAED,gFAUC;IAED,mFAYC;IAED,sGAcC;IAID;;;MAiCC;IAED;;;;;;MAoCC;IAED,kDAsBC;IAED,2BAEC;IAED,4BAEC;IAED,sCAKC;IAED,mFAGC;IAED,iDAiBC;IAED,iDAiCC;IAED,0DAmBC;IAED,wHAiCC;IAED,gDAQC;IAED,kGAgCC;IAED,0EAGC;IAED,sIAiDC;IAED,0FAGC;IAED,kEAeC;IAED,oEAYC;IAED,wFAmBC;IAED,4DAIC;IAED,+DAcC;IAED,qEAGC;IAED,uDAOC;IAED,mFAuDC;IAED,+CAEC;IAED,qCAcC;IAED,yDAIC;IAED,iEAEC;IAED,iDAIC;IAED;;;MAMC;IAED,2CAIC;IAED,yDAIC;IAED,+CAEC;IAED,mDAGC;IAED,sCAUC;IAED,sDAMC;IAGD,oDAEC;IAED,mEAOC;IAED,mEAIC;IAED,wDAWC;IAED,uDAGC;IAED,kFAeC;IAED,2DAMC;IAED,oCAqBC;IAED,gDAEC;IAED,gDAEC;IAED,mDAGC;IAED,oDAUC;IAED,kDAKC;IAED,iEAOC;IAED,8CAKC;IAED,yDAMC;IAED,gDAKC;IAED,6DAMC;IAED,wDAKC;IAED,6EAKC;IAED,uCAoBC;IAED,8CAEC;IAED,uCAoBC;IAED,gBAEC;IAED,eAEC;IAED,eAEC;IAED,eAEC;IAED,4DAmBC;IAED,oBAQC;IAED,oBAQC;IAED,yDAiDC;IAED,yCAGC;IAED,mCAQC;IAED,6CAGC;IAED,2CAMC;IAED,+CAGC;IAED,+CAMC;IAED,8CAeC;IAED,uCAOC;IAED,+BAOC;IAED,qDAiBC;IAED,gCAMC;IAED,kCAEC;IA2BD,4CAEC;IAED,uCAaC;IAED,+BAEC;IAED,mCAEC;IAED,oCAEC;IAED,oCAEC;IAED,wCAEC;IAED,wCAEC;IAED,6BASC;IAED,0DAUC;CACF;AAhsDD;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-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.2,
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 * 0.122,
94
- modDepth: (3 + 1) / 3.2,
95
- feedback: 8 * 0.763,
96
- sendToReverb: 0 * 0.787,
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, options = {}) {
707
- const { chorusCount = 2, chorusRate = 0.6, chorusDepth = 0.15, delay = 0.01, variance = delay * 0.1, } = options;
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 chorusGains = [];
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 baseGain = 1 / chorusCount;
714
- for (let i = 0; i < chorusCount; i++) {
715
- const randomDelayFactor = (Math.random() - 0.5) * variance;
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
- chorusGains.push(chorusGain);
728
+ feedbackGains.push(feedbackGain);
729
+ input.connect(delayNode);
723
730
  lfoGain.connect(delayNode.delayTime);
724
- delayNode.connect(chorusGain);
725
- chorusGain.connect(output);
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
- chorusGains,
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 === 0) {
741
- if (channel.chorusSendLevel !== 0) { // chorus
742
- channel.chorusEffect.delayNodes.forEach((delayNode) => {
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
- else {
749
- if (channel.chorusSendLevel === 0) { // reverb
750
- channel.merger.connect(channel.reverbEffect.input);
751
- channel.reverbEffect.output.connect(this.masterGain);
752
- }
753
- else { // reverb + chorus
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
- channel.chorusEffect.lfoGain = channel.chorusSendLevel;
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.handleGlobalParameterControl(data);
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
- handleGlobalParameterControl(data) {
1485
- if (data[5] === 1) {
1486
- switch (data[6]) {
1488
+ handleGlobalParameterControlSysEx(data) {
1489
+ if (data[7] === 1) {
1490
+ switch (data[8]) {
1487
1491
  case 1:
1488
- return this.handleReverbParameter(data);
1492
+ return this.handleReverbParameterSysEx(data);
1489
1493
  case 2:
1490
- return this.handleChorusParameter(data);
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
- handleReverbParameter(data) {
1500
- switch (data[7]) {
1503
+ handleReverbParameterSysEx(data) {
1504
+ switch (data[9]) {
1501
1505
  case 0:
1502
- return this.setReverbType(data[8]);
1506
+ return this.setReverbType(data[10]);
1503
1507
  case 1:
1504
- return this.setReverbTime(data[8]);
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
- // A suitable average sound absorption coefficient is 0.18-0.28.
1565
- // Since the structure of the hall is complex,
1566
- // It would be easier to determine the delay based on the ideal feedback.
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
- handleChorusParameter(data) {
1572
- switch (data[7]) {
1577
+ handleChorusParameterSysEx(data) {
1578
+ switch (data[9]) {
1573
1579
  case 0:
1574
- return this.setChorusType(data[8]);
1580
+ return this.setChorusType(data[10]);
1575
1581
  case 1:
1576
- return this.setChorusModRate(data[8]);
1582
+ return this.setChorusModRate(data[10]);
1577
1583
  case 2:
1578
- return this.setChorusModDepth(data[8]);
1584
+ return this.setChorusModDepth(data[10]);
1579
1585
  case 3:
1580
- return this.setChorusFeedback(data[8]);
1586
+ return this.setChorusFeedback(data[10]);
1581
1587
  case 4:
1582
- return this.setChorusSendToReverb(data[8]);
1588
+ return this.setChorusSendToReverb(data[10]);
1583
1589
  }
1584
1590
  }
1585
1591
  setChorusType(type) {
1586
- // TODO
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
- // TODO
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
- // TODO
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
- // TODO
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
- // TODO
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
- chorusGains: any[];
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, options?: {}): {
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
- chorusGains: any[];
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
- handleGlobalParameterControl(data: any): void;
240
- handleReverbParameter(data: any): void;
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
- handleChorusParameter(data: any): void;
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;IAiCE;;;;;;;;;;;;;;;;;;;;MAoBE;IAEF;;;;;;;;;;;MAWE;IAEF;;;;;;;MAOE;IAgCF;;;;;OAOC;IAjHD,qBAAmB;IACnB,kBAAc;IACd,yBAAqB;IACrB,2BAAuB;IACvB;;;MAGE;IACF;;;;;MAKE;IACF,cAAa;IACb,cAAa;IACb,0BAAwB;IACxB,kBAAc;IACd,mBAAiB;IACjB,kBAAc;IACd,mBAAe;IACf,kBAAgB;IAChB,sBAA2C;IAC3C,mBAAkB;IAClB,mBAAkB;IAClB,kBAAiB;IACjB,oBAAmB;IACnB,mBAAkB;IAClB,gBAAc;IACd,mBAAiB;IACjB,oBAAkB;IA8ClB;;;;;MA4BE;IAGA,kBAAgC;IAChC;;;;;MAAqD;IACrD,gBAA4C;IAE5C,gBAAiD;IAInD,4BAMC;IAED,mCASC;IAED,gDAMC;IAED,sCASC;IAED;;;;;;;;;;;;;;;MAkBC;IAED,yCAiBC;IAED,+DAyBC;IAED,mEAWC;IAED,qDAOC;IAED,2EAyDC;IAED,mCAOC;IAED,0BA+CC;IAED,uDAEC;IAED,wDAEC;IAED;;;MAgGC;IAED,4BAsBC;IAED,uBAKC;IAED,aAGC;IAED,cAKC;IAED,wBAIC;IAED,0BAKC;IAED,wBAOC;IAED,sBAGC;IAED,uDASC;IAED,6CAQC;IAED,kFAuBC;IAED;;;;MAWC;IAED,gFAUC;IAED,mFAYC;IAED,sGAcC;IAID;;;MAiCC;IAED;;;;;;MAoCC;IAED,kDAsBC;IAED,2BAEC;IAED,4BAEC;IAED,sCAKC;IAED,mFAGC;IAED,iDAiBC;IAED,iDAiCC;IAED,0DAmBC;IAED,uDAcC;IAED,wHAqCC;IAED,gDAQC;IAED,kGAgCC;IAED,0EAGC;IAED,sIAiDC;IAED,0FAGC;IAED,kEAeC;IAED,oEAYC;IAED,wFAqBC;IAED,sFAcC;IAED,4DAIC;IAED,+DAcC;IAED,qEAGC;IAED,uDAOC;IAED,mFAkEC;IAED,+CAEC;IAED,qCAcC;IAED,yDAIC;IAED,iEAEC;IAED,iDAIC;IAED;;;MAMC;IAED,2CAIC;IAED,yDAIC;IAED,+CAEC;IAED,mDAGC;IAED,sCAUC;IAED,sDAMC;IAGD,oDAEC;IAED,mEAOC;IAED,mEAIC;IAED,wDAWC;IAED,uDAGC;IAED,2DAGC;IAED,6DAGC;IAED,6DASC;IAED,kFAeC;IAED,2DAMC;IAED,gDAyBC;IAED,wCAEC;IAED,wCAEC;IAED,gDAEC;IAED,gDAEC;IAED,mDAGC;IAED,oDAUC;IAED,kDAKC;IAED,iEAOC;IAED,8CAKC;IAED,yDAMC;IAED,gDAKC;IAED,6DAMC;IAED,wDAKC;IAED,6EAKC;IAED,uCAoBC;IAED,8CAEC;IAED,uCAoBC;IAED,gBAEC;IAED,eAEC;IAED,eAEC;IAED,eAEC;IAED,4DAmBC;IAED,oBAQC;IAED,oBAQC;IAED,yDAiDC;IAED,yCAGC;IAED,mCAQC;IAED,6CAGC;IAED,2CAMC;IAED,+CAGC;IAED,+CAMC;IAED,8CAeC;IAED,uCAOC;IAED,+BAOC;IAED,qDAiBC;IAED,gCAMC;IAED,kCAEC;IA2BD,4CAEC;IAED,uCAaC;IAED,+BAEC;IAED,mCAEC;IAED,oCAEC;IAED,oCAEC;IAED,wCAEC;IAED,wCAEC;IAED,6BASC;IAED,0DAUC;CACF;AA/xDD;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.d.ts","sourceRoot":"","sources":["../src/midy.js"],"names":[],"mappings":"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"}