@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.
@@ -42,7 +42,7 @@ import { OggVorbisDecoderWebWorker } from "@wasm-audio-decoders/ogg-vorbis";
42
42
  // A "rendering" event is dispatched when rendering starts, and a
43
43
  // "rendered" event is dispatched when rendering completes.
44
44
  /** @type {"none"|"ads"|"adsr"|"note"|"audio"} */
45
- const DEFAULT_CACHE_MODE = "audio";
45
+ const DEFAULT_CACHE_MODE = "ads";
46
46
  const _f64Buf = new ArrayBuffer(8);
47
47
  const _f64Array = new Float64Array(_f64Buf);
48
48
  const _u64Array = new BigUint64Array(_f64Buf);
@@ -160,7 +160,13 @@ class Note {
160
160
  }
161
161
  }
162
162
  class Channel {
163
- constructor(audioNodes, settings) {
163
+ constructor(channelNumber, audioNodes, settings) {
164
+ Object.defineProperty(this, "channelNumber", {
165
+ enumerable: true,
166
+ configurable: true,
167
+ writable: true,
168
+ value: 0
169
+ });
164
170
  Object.defineProperty(this, "isDrum", {
165
171
  enumerable: true,
166
172
  configurable: true,
@@ -233,6 +239,7 @@ class Channel {
233
239
  writable: true,
234
240
  value: null
235
241
  });
242
+ this.channelNumber = channelNumber;
236
243
  Object.assign(this, audioNodes);
237
244
  Object.assign(this, settings);
238
245
  this.state = new ControllerState();
@@ -881,6 +888,8 @@ export class MidyGMLite extends EventTarget {
881
888
  return;
882
889
  const soundFont = this.soundFonts[soundFontIndex];
883
890
  const voice = soundFont.getVoice(bank, programNumber, noteNumber, velocity);
891
+ if (!voice)
892
+ return;
884
893
  const { instrument, sampleID } = voice.generators;
885
894
  return soundFontIndex * (2 ** 31) + instrument * (2 ** 24) +
886
895
  (sampleID << 8);
@@ -897,7 +906,7 @@ export class MidyGMLite extends EventTarget {
897
906
  }
898
907
  createChannels(audioContext) {
899
908
  const settings = this.constructor.channelSettings;
900
- return Array.from({ length: this.numChannels }, () => new Channel(this.createChannelAudioNodes(audioContext), settings));
909
+ return Array.from({ length: this.numChannels }, (_, ch) => new Channel(ch, this.createChannelAudioNodes(audioContext), settings));
901
910
  }
902
911
  decodeOggVorbis(sample) {
903
912
  const task = decoderQueue.then(async () => {
@@ -1365,6 +1374,7 @@ export class MidyGMLite extends EventTarget {
1365
1374
  continue;
1366
1375
  const soundFont = this.soundFonts[soundFontIndex];
1367
1376
  const fakeChannel = {
1377
+ channelNumber: ch,
1368
1378
  state: { array: renderControllerStates[ch].slice() },
1369
1379
  programNumber,
1370
1380
  isDrum,
@@ -1681,25 +1691,29 @@ export class MidyGMLite extends EventTarget {
1681
1691
  const volHold = volAttack + voiceParams.volHold;
1682
1692
  const decayDuration = voiceParams.volDecay;
1683
1693
  const adsDuration = volHold + decayDuration * decayCurve * 5;
1684
- const loopStartTime = voiceParams.loopStart / voiceParams.sampleRate;
1685
- const loopDuration = isLoop
1694
+ const sampleLoopStart = voiceParams.loopStart / voiceParams.sampleRate;
1695
+ const sampleLoopDuration = isLoop
1686
1696
  ? (voiceParams.loopEnd - voiceParams.loopStart) / voiceParams.sampleRate
1687
1697
  : 0;
1688
- const loopCount = isLoop && adsDuration > loopStartTime
1689
- ? Math.ceil((adsDuration - loopStartTime) / loopDuration)
1698
+ const playbackRate = voiceParams.playbackRate;
1699
+ const outputLoopStart = sampleLoopStart / playbackRate;
1700
+ const outputLoopDuration = sampleLoopDuration / playbackRate;
1701
+ const loopCount = isLoop && adsDuration > outputLoopStart
1702
+ ? Math.ceil((adsDuration - outputLoopStart) / outputLoopDuration)
1690
1703
  : 0;
1691
- const alignedLoopStart = loopStartTime + loopCount * loopDuration;
1704
+ const alignedLoopStart = outputLoopStart + loopCount * outputLoopDuration;
1692
1705
  const renderDuration = isLoop
1693
- ? alignedLoopStart + loopDuration
1694
- : audioBuffer.duration;
1695
- const offlineContext = new OfflineAudioContext(audioBuffer.numberOfChannels, Math.ceil(renderDuration * this.audioContext.sampleRate), this.audioContext.sampleRate);
1706
+ ? alignedLoopStart + outputLoopDuration
1707
+ : audioBuffer.duration / playbackRate;
1708
+ const sampleRate = this.audioContext.sampleRate;
1709
+ const offlineContext = new OfflineAudioContext(audioBuffer.numberOfChannels, Math.ceil(renderDuration * sampleRate), sampleRate);
1696
1710
  const bufferSource = new AudioBufferSourceNode(offlineContext);
1697
1711
  bufferSource.buffer = audioBuffer;
1698
- bufferSource.playbackRate.value = voiceParams.playbackRate;
1712
+ bufferSource.playbackRate.value = playbackRate;
1699
1713
  bufferSource.loop = isLoop;
1700
1714
  if (isLoop) {
1701
- bufferSource.loopStart = loopStartTime;
1702
- bufferSource.loopEnd = loopStartTime + loopDuration;
1715
+ bufferSource.loopStart = sampleLoopStart;
1716
+ bufferSource.loopEnd = sampleLoopStart + sampleLoopDuration;
1703
1717
  }
1704
1718
  const initialFreq = this.clampCutoffFrequency(this.centToHz(voiceParams.initialFilterFc));
1705
1719
  const filterEnvelopeNode = new BiquadFilterNode(offlineContext, {
@@ -1731,7 +1745,7 @@ export class MidyGMLite extends EventTarget {
1731
1745
  isLoop,
1732
1746
  adsDuration,
1733
1747
  loopStart: alignedLoopStart,
1734
- loopDuration,
1748
+ loopDuration: outputLoopDuration,
1735
1749
  });
1736
1750
  }
1737
1751
  async createAdsrRenderedBuffer(note, voiceParams, audioBuffer, noteDuration) {
@@ -1829,7 +1843,7 @@ export class MidyGMLite extends EventTarget {
1829
1843
  }
1830
1844
  async createFullRenderedBuffer(channel, note, voiceParams, noteDuration, noteEvent = {}) {
1831
1845
  const { startTime: noteStartTime = 0, events: noteEvents = [] } = noteEvent;
1832
- const ch = note.channel ?? 0;
1846
+ const ch = channel.channelNumber;
1833
1847
  const releaseEndDuration = voiceParams.volRelease * releaseCurve * 5;
1834
1848
  const totalDuration = noteDuration + releaseEndDuration;
1835
1849
  const sampleRate = this.audioContext.sampleRate;
@@ -1878,7 +1892,7 @@ export class MidyGMLite extends EventTarget {
1878
1892
  const audioBufferId = this.getVoiceId(channel, noteNumber, velocity);
1879
1893
  if (!realtime) {
1880
1894
  if (cacheMode === "note") {
1881
- return await this.getFullCachedBuffer(note, audioBufferId);
1895
+ return await this.getFullCachedBuffer(channel, note, audioBufferId);
1882
1896
  }
1883
1897
  else if (cacheMode === "adsr") {
1884
1898
  return await this.getAdsrCachedBuffer(note, audioBufferId);
@@ -1969,7 +1983,7 @@ export class MidyGMLite extends EventTarget {
1969
1983
  durationMap.set(cacheKey, renderPromise);
1970
1984
  return await renderPromise;
1971
1985
  }
1972
- async getFullCachedBuffer(note, audioBufferId) {
1986
+ async getFullCachedBuffer(channel, note, audioBufferId) {
1973
1987
  const voiceParams = note.voiceParams;
1974
1988
  const timelineIndex = note.timelineIndex;
1975
1989
  const noteEvent = this.noteOnEvents.get(timelineIndex);
@@ -1994,7 +2008,7 @@ export class MidyGMLite extends EventTarget {
1994
2008
  }
1995
2009
  const renderPromise = (async () => {
1996
2010
  try {
1997
- const rendered = await this.createFullRenderedBuffer(this.channels[note.channel], note, voiceParams, noteDuration, noteEvent);
2011
+ const rendered = await this.createFullRenderedBuffer(channel, note, voiceParams, noteDuration, noteEvent);
1998
2012
  durationMap.set(cacheKey, rendered);
1999
2013
  return rendered;
2000
2014
  }
@@ -2021,7 +2035,6 @@ export class MidyGMLite extends EventTarget {
2021
2035
  note.renderedBuffer = isRendered ? audioBuffer : null;
2022
2036
  note.bufferSource = this.createBufferSource(channel, voiceParams, audioBuffer);
2023
2037
  note.volumeNode = new GainNode(audioContext);
2024
- note.volumeNode.gain.setValueAtTime(1, now);
2025
2038
  const cacheMode = this.cacheMode;
2026
2039
  const isFullCached = isRendered && audioBuffer.isFull === true;
2027
2040
  if (cacheMode === "none") {
@@ -2114,9 +2127,6 @@ export class MidyGMLite extends EventTarget {
2114
2127
  startTime = this.audioContext.currentTime;
2115
2128
  const note = new Note(noteNumber, velocity, startTime);
2116
2129
  note.channel = channelNumber;
2117
- const channel = this.channels[channelNumber];
2118
- note.index = channel.scheduledNotes.length;
2119
- channel.scheduledNotes.push(note);
2120
2130
  return note;
2121
2131
  }
2122
2132
  async setupNote(channelNumber, note, startTime) {
@@ -2139,6 +2149,8 @@ export class MidyGMLite extends EventTarget {
2139
2149
  note.voice = soundFont.getVoice(bank, programNumber, note.noteNumber, note.velocity);
2140
2150
  if (!note.voice)
2141
2151
  return;
2152
+ note.index = channel.scheduledNotes.length;
2153
+ channel.scheduledNotes.push(note);
2142
2154
  await this.setNoteAudioNode(channel, note, realtime);
2143
2155
  this.setNoteRouting(channelNumber, note, startTime);
2144
2156
  note.resolveReady();
@@ -2184,18 +2196,8 @@ export class MidyGMLite extends EventTarget {
2184
2196
  const volRelease = endTime + volDuration;
2185
2197
  note.volumeNode.gain
2186
2198
  .cancelScheduledValues(endTime)
2187
- .setValueAtTime(1, endTime)
2188
2199
  .setTargetAtTime(0, endTime, volDuration * releaseCurve);
2189
- return new Promise((resolve) => {
2190
- this.scheduleTask(() => {
2191
- note.bufferSource.loop = false;
2192
- note.bufferSource.stop(volRelease);
2193
- this.disconnectNote(note);
2194
- channel.scheduledNotes[note.index] = undefined;
2195
- this.releaseFullCache(note);
2196
- resolve();
2197
- }, volRelease);
2198
- });
2200
+ note.bufferSource.stop(volRelease);
2199
2201
  }
2200
2202
  else {
2201
2203
  const now = this.audioContext.currentTime;
@@ -2205,15 +2207,16 @@ export class MidyGMLite extends EventTarget {
2205
2207
  this.releaseFullCache(note);
2206
2208
  return Promise.resolve();
2207
2209
  }
2208
- return new Promise((resolve) => {
2209
- this.scheduleTask(() => {
2210
- this.disconnectNote(note);
2211
- channel.scheduledNotes[note.index] = undefined;
2212
- this.releaseFullCache(note);
2213
- resolve();
2214
- }, naturalEndTime);
2215
- });
2210
+ note.bufferSource.stop(naturalEndTime);
2216
2211
  }
2212
+ return new Promise((resolve) => {
2213
+ note.bufferSource.onended = () => {
2214
+ this.disconnectNote(note);
2215
+ channel.scheduledNotes[note.index] = undefined;
2216
+ this.releaseFullCache(note);
2217
+ resolve();
2218
+ };
2219
+ });
2217
2220
  }
2218
2221
  const volDuration = note.voiceParams.volRelease;
2219
2222
  const volRelease = endTime + volDuration;
@@ -2234,45 +2237,33 @@ export class MidyGMLite extends EventTarget {
2234
2237
  const noteOffTime = note.startTime + (rb.noteDuration ?? 0);
2235
2238
  const isEarlyCut = endTime < noteOffTime;
2236
2239
  if (isEarlyCut) {
2237
- const volRelease = endTime + volDuration;
2238
2240
  note.volumeNode.gain
2239
2241
  .cancelScheduledValues(endTime)
2240
- .setValueAtTime(1, endTime)
2241
2242
  .setTargetAtTime(0, endTime, volDuration * releaseCurve);
2242
- return new Promise((resolve) => {
2243
- this.scheduleTask(() => {
2244
- note.bufferSource.stop(volRelease);
2245
- this.disconnectNote(note);
2246
- channel.scheduledNotes[note.index] = undefined;
2247
- resolve();
2248
- }, volRelease);
2249
- });
2243
+ note.bufferSource.stop(volRelease);
2250
2244
  }
2251
2245
  else {
2252
- return new Promise((resolve) => {
2253
- this.scheduleTask(() => {
2254
- note.bufferSource.stop();
2255
- this.disconnectNote(note);
2256
- channel.scheduledNotes[note.index] = undefined;
2257
- resolve();
2258
- }, naturalEndTime);
2259
- });
2246
+ note.bufferSource.stop(naturalEndTime);
2260
2247
  }
2248
+ return new Promise((resolve) => {
2249
+ note.bufferSource.onended = () => {
2250
+ this.disconnectNote(note);
2251
+ channel.scheduledNotes[note.index] = undefined;
2252
+ resolve();
2253
+ };
2254
+ });
2261
2255
  }
2262
2256
  note.volumeNode.gain
2263
2257
  .cancelScheduledValues(endTime)
2264
- .setValueAtTime(1, endTime)
2265
2258
  .setTargetAtTime(0, endTime, volDuration * releaseCurve);
2266
2259
  }
2260
+ note.bufferSource.stop(volRelease);
2267
2261
  return new Promise((resolve) => {
2268
- this.scheduleTask(() => {
2269
- const bufferSource = note.bufferSource;
2270
- bufferSource.loop = false;
2271
- bufferSource.stop(volRelease);
2262
+ note.bufferSource.onended = () => {
2272
2263
  this.disconnectNote(note);
2273
2264
  channel.scheduledNotes[note.index] = undefined;
2274
2265
  resolve();
2275
- }, volRelease);
2266
+ };
2276
2267
  });
2277
2268
  }
2278
2269
  noteOff(channelNumber, noteNumber, _velocity, endTime, force) {
@@ -2787,9 +2778,10 @@ export class MidyGMLite extends EventTarget {
2787
2778
  setMasterVolume(value, scheduleTime) {
2788
2779
  if (!(0 <= scheduleTime))
2789
2780
  scheduleTime = this.audioContext.currentTime;
2781
+ const timeConstant = this.perceptualSmoothingTime / 5; // 99.3% (5 * tau)
2790
2782
  this.masterVolume.gain
2791
- .cancelScheduledValues(scheduleTime)
2792
- .setValueAtTime(value * value, scheduleTime);
2783
+ .cancelAndHoldAtTime(scheduleTime)
2784
+ .setTargetAtTime(value * value, scheduleTime, timeConstant);
2793
2785
  }
2794
2786
  handleSysEx(data, scheduleTime) {
2795
2787
  switch (data[0]) {
package/esm/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;
package/esm/midy.d.ts.map CHANGED
@@ -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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"}