@datamoc/mw_games 0.19.0 → 0.20.0

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.
Files changed (44) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/dist/ai/index.d.ts +2 -2
  3. package/dist/ai/index.d.ts.map +1 -1
  4. package/dist/ai/index.js +1 -1
  5. package/dist/ai/index.js.map +1 -1
  6. package/dist/ai/search.d.ts +49 -0
  7. package/dist/ai/search.d.ts.map +1 -1
  8. package/dist/ai/search.js +48 -0
  9. package/dist/ai/search.js.map +1 -1
  10. package/dist/audio/MidiRender.d.ts +39 -2
  11. package/dist/audio/MidiRender.d.ts.map +1 -1
  12. package/dist/audio/MidiRender.js +286 -199
  13. package/dist/audio/MidiRender.js.map +1 -1
  14. package/dist/audio/index.d.ts +2 -2
  15. package/dist/audio/index.d.ts.map +1 -1
  16. package/dist/audio/index.js +1 -1
  17. package/dist/audio/index.js.map +1 -1
  18. package/dist/board/Engine.d.ts +33 -0
  19. package/dist/board/Engine.d.ts.map +1 -1
  20. package/dist/board/Engine.js +448 -1
  21. package/dist/board/Engine.js.map +1 -1
  22. package/dist/board/index.d.ts +2 -2
  23. package/dist/board/index.d.ts.map +1 -1
  24. package/dist/board/index.js +1 -1
  25. package/dist/board/index.js.map +1 -1
  26. package/dist/mw_games.global.js +22 -22
  27. package/dist/threads/index.d.ts +3 -0
  28. package/dist/threads/index.d.ts.map +1 -0
  29. package/dist/threads/index.js +2 -0
  30. package/dist/threads/index.js.map +1 -0
  31. package/dist/threads/spawn.d.ts +41 -0
  32. package/dist/threads/spawn.d.ts.map +1 -0
  33. package/dist/threads/spawn.js +143 -0
  34. package/dist/threads/spawn.js.map +1 -0
  35. package/dist/threads/worker.d.ts +51 -0
  36. package/dist/threads/worker.d.ts.map +1 -0
  37. package/dist/threads/worker.js +84 -0
  38. package/dist/threads/worker.js.map +1 -0
  39. package/dist/version.d.ts +1 -1
  40. package/dist/version.js +1 -1
  41. package/package.json +6 -1
  42. package/sbom.cdx.json +54 -28
  43. package/tools/compress-dist.d.mts +8 -0
  44. package/tools/compress-dist.mjs +76 -30
@@ -1,4 +1,6 @@
1
- import { midiLoopStart, noteToFrequency, scheduleMidi } from './Midi.js';
1
+ import { midiLoopStart, noteToFrequency, parseMidi, scheduleMidi } from './Midi.js';
2
+ import { parseSoundFont } from './SoundFont.js';
3
+ import { spawn } from '../threads/index.js';
2
4
  const DEFAULT_SAMPLE_RATE = 22050;
3
5
  const DEFAULT_MASTER_GAIN = 0.35;
4
6
  const DEFAULT_MAX_DURATION = 8 * 60;
@@ -6,7 +8,9 @@ const DEFAULT_MAX_DURATION = 8 * 60;
6
8
  * Renders a parsed MIDI file to stereo PCM frames: one offline pass, then the result
7
9
  * plays, loops, seeks and re-pitches like any decoded track. Deterministic: the same
8
10
  * file and options always produce the same frames, so a test can render and assert
9
- * without any audio hardware.
11
+ * without any audio hardware. The synthesis itself lives in `renderNotes`, which the
12
+ * async twin `renderMidiToBufferAsync` ships to a worker, so both paths produce the
13
+ * same bits.
10
14
  *
11
15
  * @example
12
16
  * ```ts
@@ -19,6 +23,49 @@ const DEFAULT_MAX_DURATION = 8 * 60;
19
23
  * ```
20
24
  */
21
25
  export function renderMidiToBuffer(file, options = {}) {
26
+ return renderNotes(prepare(file, options));
27
+ }
28
+ /**
29
+ * Renders raw MIDI bytes to stereo PCM frames on a worker thread, so the work that costs
30
+ * seconds on a real track (T161 measured 2 to 11.8) does not freeze the loading screen
31
+ * the caller is presumably drawing. Everything cheap stays on this thread: the parse, the
32
+ * schedule, option validation and the SoundFont voice lookup. Only the synthesis crosses
33
+ * to the worker, as structured-cloneable note data, and the stereo buffers come back
34
+ * transferred rather than copied.
35
+ *
36
+ * Deterministic to the bit, because both paths call the same `renderNotes`: for the same
37
+ * bytes and options this resolves exactly what `renderMidiToBuffer(parseMidi(bytes), ...)`
38
+ * returns. A failure (a malformed file, invalid options, a dead worker) rejects with the
39
+ * same message the synchronous path would have thrown.
40
+ *
41
+ * @example
42
+ * ```ts
43
+ * import { renderMidiToBufferAsync } from '@datamoc/mw_games/audio';
44
+ *
45
+ * declare const midi: ArrayBuffer;
46
+ * declare const soundFont: ArrayBuffer;
47
+ *
48
+ * const track = await renderMidiToBufferAsync(midi, { soundFontBytes: soundFont });
49
+ * console.log(track.duration, track.loopStart, track.loopEnd);
50
+ * ```
51
+ */
52
+ export async function renderMidiToBufferAsync(midi, options = {}) {
53
+ const file = parseMidi(midi);
54
+ const soundfont = options.soundFontBytes ? parseSoundFont(options.soundFontBytes) : null;
55
+ const task = prepare(file, {
56
+ soundfont,
57
+ sampleRate: options.sampleRate,
58
+ gain: options.gain,
59
+ maxDuration: options.maxDuration,
60
+ });
61
+ return spawn(renderNotes, [task]);
62
+ }
63
+ /**
64
+ * The main-thread half of a render: validation, the schedule, and the voice lookup - the
65
+ * parts that need the MidiFile or the SoundFont object, neither of which survives a
66
+ * structured clone. Both paths run this first, which is why they cannot diverge.
67
+ */
68
+ function prepare(file, options) {
22
69
  const sampleRate = options.sampleRate ?? DEFAULT_SAMPLE_RATE;
23
70
  const master = options.gain ?? DEFAULT_MASTER_GAIN;
24
71
  const maxDuration = options.maxDuration ?? DEFAULT_MAX_DURATION;
@@ -31,30 +78,19 @@ export function renderMidiToBuffer(file, options = {}) {
31
78
  const notes = scheduleMidi(file).filter((note) => note.time < maxDuration);
32
79
  if (notes.length === 0)
33
80
  throw new Error('MIDI file has no notes');
34
- const tail = notes.reduce((latest, note) => Math.max(latest, note.time + note.duration), 0);
35
- const duration = Math.min(maxDuration, tail + 1.5);
36
- const frames = Math.max(1, Math.ceil(duration * sampleRate));
37
- const left = new Float32Array(frames);
38
- const right = new Float32Array(frames);
39
- const loopStart = Math.min(midiLoopStart(file) ?? 0, Math.max(0, duration - 0.1));
40
81
  const soundfont = options.soundfont ?? null;
41
82
  const voiceCache = new Map();
42
- for (const note of notes) {
43
- const startFrame = Math.floor(note.time * sampleRate);
44
- if (startFrame >= frames)
45
- continue;
46
- const peak = master * Math.max(0.02, (note.velocity / 127) * note.gain);
47
- const voices = soundfont ? sampledVoices(soundfont, voiceCache, note) : [];
48
- if (voices.length > 0) {
49
- for (const voice of voices) {
50
- renderSampled(left, right, sampleRate, note, voice, peak, startFrame, frames);
51
- }
52
- }
53
- else {
54
- renderSynth(left, right, sampleRate, note, peak, startFrame, frames);
55
- }
56
- }
57
- return { sampleRate, left, right, loopStart, loopEnd: duration, duration };
83
+ return {
84
+ notes: notes.map((note) => ({
85
+ ...note,
86
+ frequency: noteToFrequency(note.note),
87
+ voices: soundfont ? sampledVoices(soundfont, voiceCache, note) : undefined,
88
+ })),
89
+ loopStart: midiLoopStart(file),
90
+ sampleRate,
91
+ gain: master,
92
+ maxDuration,
93
+ };
58
94
  }
59
95
  /** layered SoundFont voices for a note, memoized: drums read bank 128 whatever CC0 says */
60
96
  function sampledVoices(soundfont, cache, note) {
@@ -67,195 +103,246 @@ function sampledVoices(soundfont, cache, note) {
67
103
  }
68
104
  return voices;
69
105
  }
70
- /** equal-power stereo gains for a pan in -1 (left) to 1 (right) */
71
- function equalPower(pan) {
72
- const angle = ((Math.max(-1, Math.min(1, pan)) + 1) * Math.PI) / 4;
73
- return [Math.cos(angle), Math.sin(angle)];
74
- }
75
- /** one sampled voice, mixed additively into the render */
76
- function renderSampled(left, right, sampleRate, note, voice, peak, startFrame, frameCount) {
77
- const data = voice.sample.data;
78
- if (data.length === 0)
79
- return;
80
- const ratio = 2 ** (((note.note - voice.rootKey) * 100 + voice.cents) / 1200);
81
- const step = (ratio * voice.sample.rate) / sampleRate;
82
- if (!(step > 0))
83
- return;
84
- const endTime = note.time + note.duration;
85
- const attack = Math.max(0.002, voice.attack);
86
- const decayEnd = attack + voice.hold + Math.min(voice.decay, 30);
87
- const release = Math.max(0.03, Math.min(voice.release, 4));
88
- const sampleSeconds = data.length / voice.sample.rate;
89
- //Drums ignore note-off: the sample rings out. Melodic voices release at note-off.
90
- const heldUntil = note.channel === 9
91
- ? Math.max(endTime, note.time + Math.min(2, sampleSeconds))
92
- : Math.max(endTime, note.time + attack);
93
- const heldLen = heldUntil - note.time;
94
- const level = peak * voice.gain;
95
- const sustainLevel = level * voice.sustain;
96
- const [gainLeft, gainRight] = equalPower(note.pan + voice.pan);
97
- const looping = voice.loop && voice.sample.loopEnd > voice.sample.loopStart;
98
- const loopSpan = voice.sample.loopEnd - voice.sample.loopStart;
99
- const lastFrame = Math.min(frameCount, startFrame + Math.ceil((heldUntil + release + 0.02 - note.time) * sampleRate));
100
- let position = 0;
101
- for (let frame = startFrame; frame < lastFrame; frame++) {
102
- const t = frame / sampleRate - note.time;
103
- let envelope;
104
- if (t < attack)
105
- envelope = level * (t / attack);
106
- else if (t < attack + voice.hold)
107
- envelope = level;
108
- else if (t < decayEnd) {
109
- envelope =
110
- level +
111
- (sustainLevel - level) * ((t - attack - voice.hold) / Math.max(1e-6, decayEnd - attack - voice.hold));
106
+ /**
107
+ * The synthesis itself. **Self-contained by construction:** `spawn` stringifies this
108
+ * function into a worker, where `new Function` rehydrates it with nothing but its own
109
+ * body in scope, so every helper it uses is declared inside it - a module-scope binding
110
+ * would arrive as a ReferenceError on the other side. The synchronous path calls it
111
+ * directly and the async path sends it, which is the whole reason their output is
112
+ * bit-identical rather than merely similar.
113
+ */
114
+ function renderNotes(task) {
115
+ const { sampleRate, gain: master, maxDuration } = task;
116
+ const notes = task.notes;
117
+ const tail = notes.reduce((latest, note) => Math.max(latest, note.time + note.duration), 0);
118
+ const duration = Math.min(maxDuration, tail + 1.5);
119
+ const frames = Math.max(1, Math.ceil(duration * sampleRate));
120
+ const left = new Float32Array(frames);
121
+ const right = new Float32Array(frames);
122
+ const loopStart = Math.min(task.loopStart ?? 0, Math.max(0, duration - 0.1));
123
+ /** equal-power stereo gains for a pan in -1 (left) to 1 (right) */
124
+ function equalPower(pan) {
125
+ const angle = ((Math.max(-1, Math.min(1, pan)) + 1) * Math.PI) / 4;
126
+ return [Math.cos(angle), Math.sin(angle)];
127
+ }
128
+ /** one sampled voice, mixed additively into the render */
129
+ function renderSampled(left, right, sampleRate, note, voice, peak, startFrame, frameCount) {
130
+ const data = voice.sample.data;
131
+ if (data.length === 0)
132
+ return;
133
+ const ratio = 2 ** (((note.note - voice.rootKey) * 100 + voice.cents) / 1200);
134
+ const step = (ratio * voice.sample.rate) / sampleRate;
135
+ if (!(step > 0))
136
+ return;
137
+ const endTime = note.time + note.duration;
138
+ const attack = Math.max(0.002, voice.attack);
139
+ const decayEnd = attack + voice.hold + Math.min(voice.decay, 30);
140
+ const release = Math.max(0.03, Math.min(voice.release, 4));
141
+ const sampleSeconds = data.length / voice.sample.rate;
142
+ //Drums ignore note-off: the sample rings out. Melodic voices release at note-off.
143
+ const heldUntil = note.channel === 9
144
+ ? Math.max(endTime, note.time + Math.min(2, sampleSeconds))
145
+ : Math.max(endTime, note.time + attack);
146
+ const heldLen = heldUntil - note.time;
147
+ const level = peak * voice.gain;
148
+ const sustainLevel = level * voice.sustain;
149
+ const [gainLeft, gainRight] = equalPower(note.pan + voice.pan);
150
+ const looping = voice.loop && voice.sample.loopEnd > voice.sample.loopStart;
151
+ const loopSpan = voice.sample.loopEnd - voice.sample.loopStart;
152
+ const lastFrame = Math.min(frameCount, startFrame + Math.ceil((heldUntil + release + 0.02 - note.time) * sampleRate));
153
+ let position = 0;
154
+ for (let frame = startFrame; frame < lastFrame; frame++) {
155
+ const t = frame / sampleRate - note.time;
156
+ let envelope;
157
+ if (t < attack)
158
+ envelope = level * (t / attack);
159
+ else if (t < attack + voice.hold)
160
+ envelope = level;
161
+ else if (t < decayEnd) {
162
+ envelope =
163
+ level +
164
+ (sustainLevel - level) *
165
+ ((t - attack - voice.hold) / Math.max(1e-6, decayEnd - attack - voice.hold));
166
+ }
167
+ else if (t < heldLen)
168
+ envelope = sustainLevel;
169
+ else if (t < heldLen + release)
170
+ envelope = sustainLevel * (1 - (t - heldLen) / release);
171
+ else
172
+ envelope = 0;
173
+ if (looping && position >= voice.sample.loopEnd) {
174
+ position = voice.sample.loopStart + ((position - voice.sample.loopStart) % loopSpan);
175
+ }
176
+ const floored = Math.floor(position);
177
+ const frac = Math.min(1, Math.max(0, position - floored));
178
+ let value;
179
+ if ((!looping && position >= data.length) || floored < 0)
180
+ value = 0;
181
+ else {
182
+ const first = data[Math.min(floored, data.length - 1)];
183
+ const second = data[Math.min(floored + 1, data.length - 1)];
184
+ value = first + (second - first) * frac;
185
+ }
186
+ left[frame] += value * envelope * gainLeft;
187
+ right[frame] += value * envelope * gainRight;
188
+ position += step;
112
189
  }
113
- else if (t < heldLen)
114
- envelope = sustainLevel;
115
- else if (t < heldLen + release)
116
- envelope = sustainLevel * (1 - (t - heldLen) / release);
117
- else
118
- envelope = 0;
119
- if (looping && position >= voice.sample.loopEnd) {
120
- position = voice.sample.loopStart + ((position - voice.sample.loopStart) % loopSpan);
190
+ }
191
+ /** program family to synthesis recipe: pianos pluck, organs hold, strings swell */
192
+ function recipeFor(program) {
193
+ if (program < 8)
194
+ return { wave: 'triangle', attack: 0.005, decay: 1.2, sustain: 0.25, release: 0.2, detune: 0 };
195
+ if (program < 16)
196
+ return { wave: 'sine', attack: 0.003, decay: 0.8, sustain: 0.1, release: 0.5, detune: 0 };
197
+ if (program < 24) {
198
+ return { wave: 'square', attack: 0.01, decay: 0.1, sustain: 0.7, release: 0.08, detune: 0, cutoff: 2500 };
121
199
  }
122
- const floored = Math.floor(position);
123
- const frac = Math.min(1, Math.max(0, position - floored));
124
- let value;
125
- if ((!looping && position >= data.length) || floored < 0)
126
- value = 0;
127
- else {
128
- const first = data[Math.min(floored, data.length - 1)];
129
- const second = data[Math.min(floored + 1, data.length - 1)];
130
- value = first + (second - first) * frac;
200
+ if (program < 32) {
201
+ return {
202
+ wave: 'sawtooth',
203
+ attack: 0.004,
204
+ decay: 0.6,
205
+ sustain: 0.15,
206
+ release: 0.15,
207
+ detune: 0,
208
+ cutoff: 3000,
209
+ };
131
210
  }
132
- left[frame] += value * envelope * gainLeft;
133
- right[frame] += value * envelope * gainRight;
134
- position += step;
135
- }
136
- }
137
- /** program family to synthesis recipe: pianos pluck, organs hold, strings swell */
138
- function recipeFor(program) {
139
- if (program < 8)
140
- return { wave: 'triangle', attack: 0.005, decay: 1.2, sustain: 0.25, release: 0.2, detune: 0 };
141
- if (program < 16)
142
- return { wave: 'sine', attack: 0.003, decay: 0.8, sustain: 0.1, release: 0.5, detune: 0 };
143
- if (program < 24) {
144
- return { wave: 'square', attack: 0.01, decay: 0.1, sustain: 0.7, release: 0.08, detune: 0, cutoff: 2500 };
145
- }
146
- if (program < 32) {
147
- return { wave: 'sawtooth', attack: 0.004, decay: 0.6, sustain: 0.15, release: 0.15, detune: 0, cutoff: 3000 };
148
- }
149
- if (program < 40)
150
- return { wave: 'triangle', attack: 0.005, decay: 0.4, sustain: 0.5, release: 0.1, detune: 0 };
151
- if (program < 56) {
152
- return { wave: 'sawtooth', attack: 0.12, decay: 0.2, sustain: 0.8, release: 0.3, detune: 6, cutoff: 3500 };
211
+ if (program < 40)
212
+ return { wave: 'triangle', attack: 0.005, decay: 0.4, sustain: 0.5, release: 0.1, detune: 0 };
213
+ if (program < 56) {
214
+ return { wave: 'sawtooth', attack: 0.12, decay: 0.2, sustain: 0.8, release: 0.3, detune: 6, cutoff: 3500 };
215
+ }
216
+ if (program < 80) {
217
+ return {
218
+ wave: 'sawtooth',
219
+ attack: 0.04,
220
+ decay: 0.15,
221
+ sustain: 0.75,
222
+ release: 0.12,
223
+ detune: 0,
224
+ cutoff: 4500,
225
+ };
226
+ }
227
+ if (program < 88) {
228
+ return { wave: 'square', attack: 0.01, decay: 0.1, sustain: 0.8, release: 0.1, detune: 0, cutoff: 3800 };
229
+ }
230
+ if (program < 104) {
231
+ return { wave: 'sawtooth', attack: 0.25, decay: 0.3, sustain: 0.7, release: 0.5, detune: 8, cutoff: 2200 };
232
+ }
233
+ return { wave: 'triangle', attack: 0.005, decay: 0.5, sustain: 0.2, release: 0.2, detune: 0 };
153
234
  }
154
- if (program < 80) {
155
- return { wave: 'sawtooth', attack: 0.04, decay: 0.15, sustain: 0.75, release: 0.12, detune: 0, cutoff: 4500 };
235
+ function oscillate(wave, phase) {
236
+ switch (wave) {
237
+ case 'sine':
238
+ return Math.sin(phase);
239
+ case 'square':
240
+ return Math.sin(phase) >= 0 ? 1 : -1;
241
+ case 'sawtooth': {
242
+ const cycles = phase / (2 * Math.PI);
243
+ return 2 * (cycles - Math.floor(cycles)) - 1;
244
+ }
245
+ case 'triangle': {
246
+ const cycles = phase / (2 * Math.PI);
247
+ return 4 * Math.abs(cycles - Math.floor(cycles) - 0.5) - 1;
248
+ }
249
+ }
156
250
  }
157
- if (program < 88) {
158
- return { wave: 'square', attack: 0.01, decay: 0.1, sustain: 0.8, release: 0.1, detune: 0, cutoff: 3800 };
251
+ /** attack-decay-sustain-release level multiplier, 0 to 1, for a note held `held` seconds */
252
+ function adsr(t, attack, decay, sustain, held, release) {
253
+ if (t < attack)
254
+ return t / attack;
255
+ if (t < attack + decay)
256
+ return 1 - (1 - sustain) * ((t - attack) / Math.max(1e-6, decay));
257
+ if (t < held)
258
+ return sustain;
259
+ if (t < held + release)
260
+ return sustain * (1 - (t - held) / release);
261
+ return 0;
159
262
  }
160
- if (program < 104) {
161
- return { wave: 'sawtooth', attack: 0.25, decay: 0.3, sustain: 0.7, release: 0.5, detune: 8, cutoff: 2200 };
263
+ /** deterministic pseudo-random sample in [-1, 1]: the same seed always gives the same noise */
264
+ function noiseAt(seed, index) {
265
+ let h = Math.imul(seed ^ index, 2654435761) >>> 0;
266
+ h = Math.imul(h ^ (h >>> 15), 2246822519) >>> 0;
267
+ h = Math.imul(h ^ (h >>> 13), 3266489917) >>> 0;
268
+ h ^= h >>> 16;
269
+ return ((h >>> 0) / 4294967295) * 2 - 1;
162
270
  }
163
- return { wave: 'triangle', attack: 0.005, decay: 0.5, sustain: 0.2, release: 0.2, detune: 0 };
164
- }
165
- function oscillate(wave, phase) {
166
- switch (wave) {
167
- case 'sine':
168
- return Math.sin(phase);
169
- case 'square':
170
- return Math.sin(phase) >= 0 ? 1 : -1;
171
- case 'sawtooth': {
172
- const cycles = phase / (2 * Math.PI);
173
- return 2 * (cycles - Math.floor(cycles)) - 1;
271
+ /** one built-in synth voice, or the drum kit on channel 10, mixed additively */
272
+ function renderSynth(left, right, sampleRate, note, peak, startFrame, frameCount) {
273
+ if (note.channel === 9) {
274
+ renderDrum(left, right, sampleRate, note, peak, startFrame, frameCount);
275
+ return;
174
276
  }
175
- case 'triangle': {
176
- const cycles = phase / (2 * Math.PI);
177
- return 4 * Math.abs(cycles - Math.floor(cycles) - 0.5) - 1;
277
+ const recipe = recipeFor(note.program);
278
+ const frequency = note.frequency * 2 ** (recipe.detune / 1200);
279
+ const held = Math.max(note.duration, recipe.attack + 0.01);
280
+ const release = Math.max(0.02, recipe.release);
281
+ const lastFrame = Math.min(frameCount, startFrame + Math.ceil((held + release + 0.02) * sampleRate));
282
+ const [gainLeft, gainRight] = equalPower(note.pan);
283
+ const filtered = recipe.cutoff !== undefined;
284
+ const coefficient = filtered
285
+ ? 1 - Math.exp((-2 * Math.PI * Math.min(recipe.cutoff, frequency * 8 + 800)) / sampleRate)
286
+ : 0;
287
+ let lowpass = 0;
288
+ let phase = 0;
289
+ const phaseStep = (2 * Math.PI * frequency) / sampleRate;
290
+ for (let frame = startFrame; frame < lastFrame; frame++) {
291
+ const t = frame / sampleRate - note.time;
292
+ const value = oscillate(recipe.wave, phase);
293
+ phase += phaseStep;
294
+ lowpass = filtered ? lowpass + coefficient * (value - lowpass) : value;
295
+ const envelope = peak * adsr(t, recipe.attack, recipe.decay, recipe.sustain, held, release);
296
+ left[frame] += lowpass * envelope * gainLeft;
297
+ right[frame] += lowpass * envelope * gainRight;
178
298
  }
179
299
  }
180
- }
181
- /** attack-decay-sustain-release level multiplier, 0 to 1, for a note held `held` seconds */
182
- function adsr(t, attack, decay, sustain, held, release) {
183
- if (t < attack)
184
- return t / attack;
185
- if (t < attack + decay)
186
- return 1 - (1 - sustain) * ((t - attack) / Math.max(1e-6, decay));
187
- if (t < held)
188
- return sustain;
189
- if (t < held + release)
190
- return sustain * (1 - (t - held) / release);
191
- return 0;
192
- }
193
- /** deterministic pseudo-random sample in [-1, 1]: the same seed always gives the same noise */
194
- function noiseAt(seed, index) {
195
- let h = Math.imul(seed ^ index, 2654435761) >>> 0;
196
- h = Math.imul(h ^ (h >>> 15), 2246822519) >>> 0;
197
- h = Math.imul(h ^ (h >>> 13), 3266489917) >>> 0;
198
- h ^= h >>> 16;
199
- return ((h >>> 0) / 4294967295) * 2 - 1;
200
- }
201
- /** one built-in synth voice, or the drum kit on channel 10, mixed additively */
202
- function renderSynth(left, right, sampleRate, note, peak, startFrame, frameCount) {
203
- if (note.channel === 9) {
204
- renderDrum(left, right, sampleRate, note, peak, startFrame, frameCount);
205
- return;
206
- }
207
- const recipe = recipeFor(note.program);
208
- const frequency = noteToFrequency(note.note) * 2 ** (recipe.detune / 1200);
209
- const held = Math.max(note.duration, recipe.attack + 0.01);
210
- const release = Math.max(0.02, recipe.release);
211
- const lastFrame = Math.min(frameCount, startFrame + Math.ceil((held + release + 0.02) * sampleRate));
212
- const [gainLeft, gainRight] = equalPower(note.pan);
213
- const filtered = recipe.cutoff !== undefined;
214
- const coefficient = filtered
215
- ? 1 - Math.exp((-2 * Math.PI * Math.min(recipe.cutoff, frequency * 8 + 800)) / sampleRate)
216
- : 0;
217
- let lowpass = 0;
218
- let phase = 0;
219
- const phaseStep = (2 * Math.PI * frequency) / sampleRate;
220
- for (let frame = startFrame; frame < lastFrame; frame++) {
221
- const t = frame / sampleRate - note.time;
222
- const value = oscillate(recipe.wave, phase);
223
- phase += phaseStep;
224
- lowpass = filtered ? lowpass + coefficient * (value - lowpass) : value;
225
- const envelope = peak * adsr(t, recipe.attack, recipe.decay, recipe.sustain, held, release);
226
- left[frame] += lowpass * envelope * gainLeft;
227
- right[frame] += lowpass * envelope * gainRight;
228
- }
229
- }
230
- /** channel 10: kicks thump, snares and hats hiss, keyed by General MIDI drum note */
231
- function renderDrum(left, right, sampleRate, note, peak, startFrame, frameCount) {
232
- const [gainLeft, gainRight] = equalPower(note.pan);
233
- const seed = note.note * 7919 + startFrame;
234
- if (note.note === 35 || note.note === 36 || note.note < 45) {
235
- //Kick: a sine dropping 150 Hz to 45 Hz, decaying exponentially.
236
- const level = peak * 1.4;
237
- const lastFrame = Math.min(frameCount, startFrame + Math.ceil(0.27 * sampleRate));
238
- let phase = 0;
300
+ /** channel 10: kicks thump, snares and hats hiss, keyed by General MIDI drum note */
301
+ function renderDrum(left, right, sampleRate, note, peak, startFrame, frameCount) {
302
+ const [gainLeft, gainRight] = equalPower(note.pan);
303
+ const seed = note.note * 7919 + startFrame;
304
+ if (note.note === 35 || note.note === 36 || note.note < 45) {
305
+ //Kick: a sine dropping 150 Hz to 45 Hz, decaying exponentially.
306
+ const level = peak * 1.4;
307
+ const lastFrame = Math.min(frameCount, startFrame + Math.ceil(0.27 * sampleRate));
308
+ let phase = 0;
309
+ for (let frame = startFrame; frame < lastFrame; frame++) {
310
+ const t = frame / sampleRate - note.time;
311
+ const frequency = t < 0.12 ? 150 * (45 / 150) ** (t / 0.12) : 45;
312
+ phase += (2 * Math.PI * frequency) / sampleRate;
313
+ const envelope = level * (0.001 / level) ** Math.min(1, t / 0.22);
314
+ left[frame] += Math.sin(phase) * envelope * gainLeft;
315
+ right[frame] += Math.sin(phase) * envelope * gainRight;
316
+ }
317
+ return;
318
+ }
319
+ const snare = note.note === 38 || note.note === 40;
320
+ const length = snare ? 0.16 : note.note >= 49 ? 0.5 : 0.06;
321
+ const level = peak * (snare ? 0.9 : 0.5);
322
+ const lastFrame = Math.min(frameCount, startFrame + Math.ceil((length + 0.02) * sampleRate));
239
323
  for (let frame = startFrame; frame < lastFrame; frame++) {
240
324
  const t = frame / sampleRate - note.time;
241
- const frequency = t < 0.12 ? 150 * (45 / 150) ** (t / 0.12) : 45;
242
- phase += (2 * Math.PI * frequency) / sampleRate;
243
- const envelope = level * (0.001 / level) ** Math.min(1, t / 0.22);
244
- left[frame] += Math.sin(phase) * envelope * gainLeft;
245
- right[frame] += Math.sin(phase) * envelope * gainRight;
325
+ const envelope = level * (0.001 / level) ** Math.min(1, t / length);
326
+ const value = noiseAt(seed, frame - startFrame) * envelope;
327
+ left[frame] += value * gainLeft;
328
+ right[frame] += value * gainRight;
246
329
  }
247
- return;
248
330
  }
249
- const snare = note.note === 38 || note.note === 40;
250
- const length = snare ? 0.16 : note.note >= 49 ? 0.5 : 0.06;
251
- const level = peak * (snare ? 0.9 : 0.5);
252
- const lastFrame = Math.min(frameCount, startFrame + Math.ceil((length + 0.02) * sampleRate));
253
- for (let frame = startFrame; frame < lastFrame; frame++) {
254
- const t = frame / sampleRate - note.time;
255
- const envelope = level * (0.001 / level) ** Math.min(1, t / length);
256
- const value = noiseAt(seed, frame - startFrame) * envelope;
257
- left[frame] += value * gainLeft;
258
- right[frame] += value * gainRight;
331
+ for (const note of notes) {
332
+ const startFrame = Math.floor(note.time * sampleRate);
333
+ if (startFrame >= frames)
334
+ continue;
335
+ const peak = master * Math.max(0.02, (note.velocity / 127) * note.gain);
336
+ const voices = note.voices ?? [];
337
+ if (voices.length > 0) {
338
+ for (const voice of voices) {
339
+ renderSampled(left, right, sampleRate, note, voice, peak, startFrame, frames);
340
+ }
341
+ }
342
+ else {
343
+ renderSynth(left, right, sampleRate, note, peak, startFrame, frames);
344
+ }
259
345
  }
346
+ return { sampleRate, left, right, loopStart, loopEnd: duration, duration };
260
347
  }
261
348
  //# sourceMappingURL=MidiRender.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MidiRender.js","sourceRoot":"","sources":["../../src/audio/MidiRender.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MidiRender.js","sourceRoot":"","sources":["../../src/audio/MidiRender.ts"],"names":[],"mappings":"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"}
@@ -12,8 +12,8 @@ export { synthesizeTone, playTone } from './Synth.ts';
12
12
  export type { Waveform, ToneOptions } from './Synth.ts';
13
13
  export { parseMidi, scheduleMidi, noteToFrequency, midiLoopStart, MidiPlayer } from './Midi.ts';
14
14
  export type { MidiFile, MidiEvent, MidiNoteEvent, MidiTempoEvent, MidiProgramEvent, MidiControlEvent, MidiPitchBendEvent, MidiVoice, ScheduledNote, MidiPlayerOptions, } from './Midi.ts';
15
- export { renderMidiToBuffer } from './MidiRender.ts';
16
- export type { RenderMidiOptions, RenderedMidi } from './MidiRender.ts';
15
+ export { renderMidiToBuffer, renderMidiToBufferAsync } from './MidiRender.ts';
16
+ export type { RenderMidiOptions, RenderMidiAsyncOptions, RenderedMidi } from './MidiRender.ts';
17
17
  export { collectSoundFontUsage, parseSoundFont, subsetSoundFont } from './SoundFont.ts';
18
18
  export type { SoundFont, SoundFontProgram, SoundFontSample, SoundFontVoice } from './SoundFont.ts';
19
19
  export { Channel, AudioBus } from './Channels.ts';