@marmooo/midy 0.5.0 → 0.5.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.
@@ -45,7 +45,7 @@ const ogg_vorbis_1 = require("@wasm-audio-decoders/ogg-vorbis");
45
45
  // A "rendering" event is dispatched when rendering starts, and a
46
46
  // "rendered" event is dispatched when rendering completes.
47
47
  /** @type {"none"|"ads"|"adsr"|"note"|"audio"} */
48
- const DEFAULT_CACHE_MODE = "audio";
48
+ const DEFAULT_CACHE_MODE = "ads";
49
49
  const _f64Buf = new ArrayBuffer(8);
50
50
  const _f64Array = new Float64Array(_f64Buf);
51
51
  const _u64Array = new BigUint64Array(_f64Buf);
@@ -163,7 +163,13 @@ class Note {
163
163
  }
164
164
  }
165
165
  class Channel {
166
- constructor(audioNodes, settings) {
166
+ constructor(channelNumber, audioNodes, settings) {
167
+ Object.defineProperty(this, "channelNumber", {
168
+ enumerable: true,
169
+ configurable: true,
170
+ writable: true,
171
+ value: 0
172
+ });
167
173
  Object.defineProperty(this, "isDrum", {
168
174
  enumerable: true,
169
175
  configurable: true,
@@ -236,6 +242,7 @@ class Channel {
236
242
  writable: true,
237
243
  value: null
238
244
  });
245
+ this.channelNumber = channelNumber;
239
246
  Object.assign(this, audioNodes);
240
247
  Object.assign(this, settings);
241
248
  this.state = new ControllerState();
@@ -884,6 +891,8 @@ class MidyGMLite extends EventTarget {
884
891
  return;
885
892
  const soundFont = this.soundFonts[soundFontIndex];
886
893
  const voice = soundFont.getVoice(bank, programNumber, noteNumber, velocity);
894
+ if (!voice)
895
+ return;
887
896
  const { instrument, sampleID } = voice.generators;
888
897
  return soundFontIndex * (2 ** 31) + instrument * (2 ** 24) +
889
898
  (sampleID << 8);
@@ -900,7 +909,7 @@ class MidyGMLite extends EventTarget {
900
909
  }
901
910
  createChannels(audioContext) {
902
911
  const settings = this.constructor.channelSettings;
903
- return Array.from({ length: this.numChannels }, () => new Channel(this.createChannelAudioNodes(audioContext), settings));
912
+ return Array.from({ length: this.numChannels }, (_, ch) => new Channel(ch, this.createChannelAudioNodes(audioContext), settings));
904
913
  }
905
914
  decodeOggVorbis(sample) {
906
915
  const task = decoderQueue.then(async () => {
@@ -1368,6 +1377,7 @@ class MidyGMLite extends EventTarget {
1368
1377
  continue;
1369
1378
  const soundFont = this.soundFonts[soundFontIndex];
1370
1379
  const fakeChannel = {
1380
+ channelNumber: ch,
1371
1381
  state: { array: renderControllerStates[ch].slice() },
1372
1382
  programNumber,
1373
1383
  isDrum,
@@ -1684,25 +1694,29 @@ class MidyGMLite extends EventTarget {
1684
1694
  const volHold = volAttack + voiceParams.volHold;
1685
1695
  const decayDuration = voiceParams.volDecay;
1686
1696
  const adsDuration = volHold + decayDuration * decayCurve * 5;
1687
- const loopStartTime = voiceParams.loopStart / voiceParams.sampleRate;
1688
- const loopDuration = isLoop
1697
+ const sampleLoopStart = voiceParams.loopStart / voiceParams.sampleRate;
1698
+ const sampleLoopDuration = isLoop
1689
1699
  ? (voiceParams.loopEnd - voiceParams.loopStart) / voiceParams.sampleRate
1690
1700
  : 0;
1691
- const loopCount = isLoop && adsDuration > loopStartTime
1692
- ? Math.ceil((adsDuration - loopStartTime) / loopDuration)
1701
+ const playbackRate = voiceParams.playbackRate;
1702
+ const outputLoopStart = sampleLoopStart / playbackRate;
1703
+ const outputLoopDuration = sampleLoopDuration / playbackRate;
1704
+ const loopCount = isLoop && adsDuration > outputLoopStart
1705
+ ? Math.ceil((adsDuration - outputLoopStart) / outputLoopDuration)
1693
1706
  : 0;
1694
- const alignedLoopStart = loopStartTime + loopCount * loopDuration;
1707
+ const alignedLoopStart = outputLoopStart + loopCount * outputLoopDuration;
1695
1708
  const renderDuration = isLoop
1696
- ? alignedLoopStart + loopDuration
1697
- : audioBuffer.duration;
1698
- const offlineContext = new OfflineAudioContext(audioBuffer.numberOfChannels, Math.ceil(renderDuration * this.audioContext.sampleRate), this.audioContext.sampleRate);
1709
+ ? alignedLoopStart + outputLoopDuration
1710
+ : audioBuffer.duration / playbackRate;
1711
+ const sampleRate = this.audioContext.sampleRate;
1712
+ const offlineContext = new OfflineAudioContext(audioBuffer.numberOfChannels, Math.ceil(renderDuration * sampleRate), sampleRate);
1699
1713
  const bufferSource = new AudioBufferSourceNode(offlineContext);
1700
1714
  bufferSource.buffer = audioBuffer;
1701
- bufferSource.playbackRate.value = voiceParams.playbackRate;
1715
+ bufferSource.playbackRate.value = playbackRate;
1702
1716
  bufferSource.loop = isLoop;
1703
1717
  if (isLoop) {
1704
- bufferSource.loopStart = loopStartTime;
1705
- bufferSource.loopEnd = loopStartTime + loopDuration;
1718
+ bufferSource.loopStart = sampleLoopStart;
1719
+ bufferSource.loopEnd = sampleLoopStart + sampleLoopDuration;
1706
1720
  }
1707
1721
  const initialFreq = this.clampCutoffFrequency(this.centToHz(voiceParams.initialFilterFc));
1708
1722
  const filterEnvelopeNode = new BiquadFilterNode(offlineContext, {
@@ -1734,7 +1748,7 @@ class MidyGMLite extends EventTarget {
1734
1748
  isLoop,
1735
1749
  adsDuration,
1736
1750
  loopStart: alignedLoopStart,
1737
- loopDuration,
1751
+ loopDuration: outputLoopDuration,
1738
1752
  });
1739
1753
  }
1740
1754
  async createAdsrRenderedBuffer(note, voiceParams, audioBuffer, noteDuration) {
@@ -1832,7 +1846,7 @@ class MidyGMLite extends EventTarget {
1832
1846
  }
1833
1847
  async createFullRenderedBuffer(channel, note, voiceParams, noteDuration, noteEvent = {}) {
1834
1848
  const { startTime: noteStartTime = 0, events: noteEvents = [] } = noteEvent;
1835
- const ch = note.channel ?? 0;
1849
+ const ch = channel.channelNumber;
1836
1850
  const releaseEndDuration = voiceParams.volRelease * releaseCurve * 5;
1837
1851
  const totalDuration = noteDuration + releaseEndDuration;
1838
1852
  const sampleRate = this.audioContext.sampleRate;
@@ -1881,7 +1895,7 @@ class MidyGMLite extends EventTarget {
1881
1895
  const audioBufferId = this.getVoiceId(channel, noteNumber, velocity);
1882
1896
  if (!realtime) {
1883
1897
  if (cacheMode === "note") {
1884
- return await this.getFullCachedBuffer(note, audioBufferId);
1898
+ return await this.getFullCachedBuffer(channel, note, audioBufferId);
1885
1899
  }
1886
1900
  else if (cacheMode === "adsr") {
1887
1901
  return await this.getAdsrCachedBuffer(note, audioBufferId);
@@ -1972,7 +1986,7 @@ class MidyGMLite extends EventTarget {
1972
1986
  durationMap.set(cacheKey, renderPromise);
1973
1987
  return await renderPromise;
1974
1988
  }
1975
- async getFullCachedBuffer(note, audioBufferId) {
1989
+ async getFullCachedBuffer(channel, note, audioBufferId) {
1976
1990
  const voiceParams = note.voiceParams;
1977
1991
  const timelineIndex = note.timelineIndex;
1978
1992
  const noteEvent = this.noteOnEvents.get(timelineIndex);
@@ -1997,7 +2011,7 @@ class MidyGMLite extends EventTarget {
1997
2011
  }
1998
2012
  const renderPromise = (async () => {
1999
2013
  try {
2000
- const rendered = await this.createFullRenderedBuffer(this.channels[note.channel], note, voiceParams, noteDuration, noteEvent);
2014
+ const rendered = await this.createFullRenderedBuffer(channel, note, voiceParams, noteDuration, noteEvent);
2001
2015
  durationMap.set(cacheKey, rendered);
2002
2016
  return rendered;
2003
2017
  }
@@ -2024,7 +2038,6 @@ class MidyGMLite extends EventTarget {
2024
2038
  note.renderedBuffer = isRendered ? audioBuffer : null;
2025
2039
  note.bufferSource = this.createBufferSource(channel, voiceParams, audioBuffer);
2026
2040
  note.volumeNode = new GainNode(audioContext);
2027
- note.volumeNode.gain.setValueAtTime(1, now);
2028
2041
  const cacheMode = this.cacheMode;
2029
2042
  const isFullCached = isRendered && audioBuffer.isFull === true;
2030
2043
  if (cacheMode === "none") {
@@ -2117,9 +2130,6 @@ class MidyGMLite extends EventTarget {
2117
2130
  startTime = this.audioContext.currentTime;
2118
2131
  const note = new Note(noteNumber, velocity, startTime);
2119
2132
  note.channel = channelNumber;
2120
- const channel = this.channels[channelNumber];
2121
- note.index = channel.scheduledNotes.length;
2122
- channel.scheduledNotes.push(note);
2123
2133
  return note;
2124
2134
  }
2125
2135
  async setupNote(channelNumber, note, startTime) {
@@ -2142,6 +2152,8 @@ class MidyGMLite extends EventTarget {
2142
2152
  note.voice = soundFont.getVoice(bank, programNumber, note.noteNumber, note.velocity);
2143
2153
  if (!note.voice)
2144
2154
  return;
2155
+ note.index = channel.scheduledNotes.length;
2156
+ channel.scheduledNotes.push(note);
2145
2157
  await this.setNoteAudioNode(channel, note, realtime);
2146
2158
  this.setNoteRouting(channelNumber, note, startTime);
2147
2159
  note.resolveReady();
@@ -2187,18 +2199,8 @@ class MidyGMLite extends EventTarget {
2187
2199
  const volRelease = endTime + volDuration;
2188
2200
  note.volumeNode.gain
2189
2201
  .cancelScheduledValues(endTime)
2190
- .setValueAtTime(1, endTime)
2191
2202
  .setTargetAtTime(0, endTime, volDuration * releaseCurve);
2192
- return new Promise((resolve) => {
2193
- this.scheduleTask(() => {
2194
- note.bufferSource.loop = false;
2195
- note.bufferSource.stop(volRelease);
2196
- this.disconnectNote(note);
2197
- channel.scheduledNotes[note.index] = undefined;
2198
- this.releaseFullCache(note);
2199
- resolve();
2200
- }, volRelease);
2201
- });
2203
+ note.bufferSource.stop(volRelease);
2202
2204
  }
2203
2205
  else {
2204
2206
  const now = this.audioContext.currentTime;
@@ -2208,15 +2210,16 @@ class MidyGMLite extends EventTarget {
2208
2210
  this.releaseFullCache(note);
2209
2211
  return Promise.resolve();
2210
2212
  }
2211
- return new Promise((resolve) => {
2212
- this.scheduleTask(() => {
2213
- this.disconnectNote(note);
2214
- channel.scheduledNotes[note.index] = undefined;
2215
- this.releaseFullCache(note);
2216
- resolve();
2217
- }, naturalEndTime);
2218
- });
2213
+ note.bufferSource.stop(naturalEndTime);
2219
2214
  }
2215
+ return new Promise((resolve) => {
2216
+ note.bufferSource.onended = () => {
2217
+ this.disconnectNote(note);
2218
+ channel.scheduledNotes[note.index] = undefined;
2219
+ this.releaseFullCache(note);
2220
+ resolve();
2221
+ };
2222
+ });
2220
2223
  }
2221
2224
  const volDuration = note.voiceParams.volRelease;
2222
2225
  const volRelease = endTime + volDuration;
@@ -2237,45 +2240,33 @@ class MidyGMLite extends EventTarget {
2237
2240
  const noteOffTime = note.startTime + (rb.noteDuration ?? 0);
2238
2241
  const isEarlyCut = endTime < noteOffTime;
2239
2242
  if (isEarlyCut) {
2240
- const volRelease = endTime + volDuration;
2241
2243
  note.volumeNode.gain
2242
2244
  .cancelScheduledValues(endTime)
2243
- .setValueAtTime(1, endTime)
2244
2245
  .setTargetAtTime(0, endTime, volDuration * releaseCurve);
2245
- return new Promise((resolve) => {
2246
- this.scheduleTask(() => {
2247
- note.bufferSource.stop(volRelease);
2248
- this.disconnectNote(note);
2249
- channel.scheduledNotes[note.index] = undefined;
2250
- resolve();
2251
- }, volRelease);
2252
- });
2246
+ note.bufferSource.stop(volRelease);
2253
2247
  }
2254
2248
  else {
2255
- return new Promise((resolve) => {
2256
- this.scheduleTask(() => {
2257
- note.bufferSource.stop();
2258
- this.disconnectNote(note);
2259
- channel.scheduledNotes[note.index] = undefined;
2260
- resolve();
2261
- }, naturalEndTime);
2262
- });
2249
+ note.bufferSource.stop(naturalEndTime);
2263
2250
  }
2251
+ return new Promise((resolve) => {
2252
+ note.bufferSource.onended = () => {
2253
+ this.disconnectNote(note);
2254
+ channel.scheduledNotes[note.index] = undefined;
2255
+ resolve();
2256
+ };
2257
+ });
2264
2258
  }
2265
2259
  note.volumeNode.gain
2266
2260
  .cancelScheduledValues(endTime)
2267
- .setValueAtTime(1, endTime)
2268
2261
  .setTargetAtTime(0, endTime, volDuration * releaseCurve);
2269
2262
  }
2263
+ note.bufferSource.stop(volRelease);
2270
2264
  return new Promise((resolve) => {
2271
- this.scheduleTask(() => {
2272
- const bufferSource = note.bufferSource;
2273
- bufferSource.loop = false;
2274
- bufferSource.stop(volRelease);
2265
+ note.bufferSource.onended = () => {
2275
2266
  this.disconnectNote(note);
2276
2267
  channel.scheduledNotes[note.index] = undefined;
2277
2268
  resolve();
2278
- }, volRelease);
2269
+ };
2279
2270
  });
2280
2271
  }
2281
2272
  noteOff(channelNumber, noteNumber, _velocity, endTime, force) {
@@ -2790,9 +2781,10 @@ class MidyGMLite extends EventTarget {
2790
2781
  setMasterVolume(value, scheduleTime) {
2791
2782
  if (!(0 <= scheduleTime))
2792
2783
  scheduleTime = this.audioContext.currentTime;
2784
+ const timeConstant = this.perceptualSmoothingTime / 5; // 99.3% (5 * tau)
2793
2785
  this.masterVolume.gain
2794
- .cancelScheduledValues(scheduleTime)
2795
- .setValueAtTime(value * value, scheduleTime);
2786
+ .cancelAndHoldAtTime(scheduleTime)
2787
+ .setTargetAtTime(value * value, scheduleTime, timeConstant);
2796
2788
  }
2797
2789
  handleSysEx(data, scheduleTime) {
2798
2790
  switch (data[0]) {
package/script/midy.d.ts CHANGED
@@ -105,7 +105,7 @@ export class Midy extends EventTarget {
105
105
  reverbEffect: {
106
106
  input: any;
107
107
  output: any;
108
- } | undefined;
108
+ };
109
109
  chorusEffect: {
110
110
  input: any;
111
111
  output: any;
@@ -127,7 +127,7 @@ export class Midy extends EventTarget {
127
127
  gainR: any;
128
128
  merger: any;
129
129
  };
130
- createChannels(audioContext: any): Channel[];
130
+ createChannels(): Channel[];
131
131
  decodeOggVorbis(sample: any): Promise<any>;
132
132
  createAudioBuffer(voiceParams: any): Promise<any>;
133
133
  isLoopDrum(channel: any, noteNumber: any): boolean;
@@ -160,24 +160,13 @@ export class Midy extends EventTarget {
160
160
  processScheduledNotes(channel: any, callback: any): Promise<void>;
161
161
  processActiveNotes(channel: any, scheduleTime: any, callback: any): Promise<void>;
162
162
  applyToMPEChannels(channelNumber: any, fn: any): void;
163
- createConvolutionReverbImpulse(audioContext: any, decay: any, preDecay: any): any;
164
- createConvolutionReverb(audioContext: any, impulse: any): {
165
- input: any;
166
- output: any;
167
- convolverNode: any;
168
- };
169
- createCombFilter(audioContext: any, input: any, delay: any, feedback: any): any;
170
- createAllpassFilter(audioContext: any, input: any, delay: any, feedback: any): any;
171
163
  generateDistributedArray(center: any, count: any, varianceRatio?: number, randomness?: number): any[];
172
- createSchroederReverb(audioContext: any, combFeedbacks: any, combDelays: any, allpassFeedbacks: any, allpassDelays: any): {
164
+ setReverbEffect(algorithm: any): void;
165
+ createReverbEffect(algorithm: any): {
173
166
  input: any;
174
167
  output: any;
175
168
  };
176
- createReverbEffect(audioContext: any): {
177
- input: any;
178
- output: any;
179
- } | undefined;
180
- createChorusEffect(audioContext: any): {
169
+ createChorusEffect(): {
181
170
  input: any;
182
171
  output: any;
183
172
  sendGain: any;
@@ -213,7 +202,7 @@ export class Midy extends EventTarget {
213
202
  getAudioBuffer(channel: any, note: any, realtime: any): Promise<any>;
214
203
  getAdsCachedBuffer(channel: any, note: any, audioBufferId: any, realtime: any): Promise<any>;
215
204
  getAdsrCachedBuffer(channel: any, note: any, audioBufferId: any): Promise<any>;
216
- getFullCachedBuffer(note: any, audioBufferId: any): Promise<any>;
205
+ getFullCachedBuffer(channel: any, note: any, audioBufferId: any): Promise<any>;
217
206
  setNoteAudioNode(channel: any, note: any, realtime: any): Promise<any>;
218
207
  handleExclusiveClass(note: any, channelNumber: any, startTime: any): void;
219
208
  handleDrumExclusiveClass(note: any, channelNumber: any, startTime: any): void;
@@ -394,7 +383,8 @@ export class Midy extends EventTarget {
394
383
  scheduleTask(callback: any, scheduleTime: any): Promise<any>;
395
384
  }
396
385
  declare class Channel {
397
- constructor(audioNodes: any, settings: any);
386
+ constructor(channelNumber: any, audioNodes: any, settings: any);
387
+ channelNumber: number;
398
388
  isDrum: boolean;
399
389
  programNumber: number;
400
390
  scheduleIndex: number;
@@ -1 +1 @@
1
- {"version":3,"file":"midy.d.ts","sourceRoot":"","sources":["../src/midy.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"midy.d.ts","sourceRoot":"","sources":["../src/midy.js"],"names":[],"mappings":"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"}