@hyperframes/engine 0.7.107 → 0.7.108
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/dist/services/audioFxRender.d.ts +68 -0
- package/dist/services/audioFxRender.d.ts.map +1 -0
- package/dist/services/audioFxRender.js +360 -0
- package/dist/services/audioFxRender.js.map +1 -0
- package/dist/services/audioMixer.d.ts +15 -0
- package/dist/services/audioMixer.d.ts.map +1 -1
- package/dist/services/audioMixer.js +152 -14
- package/dist/services/audioMixer.js.map +1 -1
- package/dist/services/audioMixer.types.d.ts +10 -0
- package/dist/services/audioMixer.types.d.ts.map +1 -1
- package/dist/services/audioVolumeEnvelope.d.ts +11 -0
- package/dist/services/audioVolumeEnvelope.d.ts.map +1 -1
- package/dist/services/audioVolumeEnvelope.js +38 -25
- package/dist/services/audioVolumeEnvelope.js.map +1 -1
- package/dist/services/wavChunks.d.ts +29 -0
- package/dist/services/wavChunks.d.ts.map +1 -0
- package/dist/services/wavChunks.js +29 -0
- package/dist/services/wavChunks.js.map +1 -0
- package/package.json +3 -3
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Applies an audio FX chain to a WAV at render time.
|
|
3
|
+
*
|
|
4
|
+
* The processing runs in an OfflineAudioContext inside the headless browser the
|
|
5
|
+
* engine already drives, using the same graph builders the studio previews
|
|
6
|
+
* with. There is one implementation of each effect, so the render matching the
|
|
7
|
+
* preview is a property of the architecture rather than a tolerance to police.
|
|
8
|
+
*
|
|
9
|
+
* The alternative — reimplementing every effect as an FFmpeg filter — means two
|
|
10
|
+
* implementations that have to be kept in agreement, and four of them (the
|
|
11
|
+
* dynamics processors and the modulated delays) have no filter that behaves the
|
|
12
|
+
* same way, so preview would quietly stop predicting the render.
|
|
13
|
+
*/
|
|
14
|
+
import { type HfAudioFxChain } from "@hyperframes/core/audio-fx";
|
|
15
|
+
import { type HfAutomation } from "@hyperframes/core/audio-automation";
|
|
16
|
+
import type { AudioVolumeKeyframe } from "./audioMixer.types.js";
|
|
17
|
+
export declare class AudioFxRenderError extends Error {
|
|
18
|
+
constructor(message: string);
|
|
19
|
+
}
|
|
20
|
+
interface WavData {
|
|
21
|
+
samples: Float32Array;
|
|
22
|
+
sampleRate: number;
|
|
23
|
+
channels: number;
|
|
24
|
+
}
|
|
25
|
+
export declare function readWav(path: string): WavData;
|
|
26
|
+
/**
|
|
27
|
+
* Write 16-bit PCM, interleaved, preserving the channel count.
|
|
28
|
+
*
|
|
29
|
+
* 16-bit rather than the float32 this used to emit: the very next step in the
|
|
30
|
+
* mixer bakes the volume envelope into the samples, and that baker accepts only
|
|
31
|
+
* 16-bit PCM. Emitting float meant enabling any effect silently downgraded a
|
|
32
|
+
* track's volume automation to the ffmpeg expression path, which is capped at 32
|
|
33
|
+
* straight segments — so a curved envelope was quantised and a dense one could
|
|
34
|
+
* fall back to rendering at base volume.
|
|
35
|
+
*/
|
|
36
|
+
export declare function writeWav(path: string, samples: Float32Array, sampleRate: number, channels?: number): void;
|
|
37
|
+
/**
|
|
38
|
+
* Run a chain over `inputWav`, writing `outputWav`. Resolves to the path to use
|
|
39
|
+
* downstream — `outputWav` when the chain did something, `inputWav` untouched
|
|
40
|
+
* when the chain was empty — plus whether the volume envelope was baked here.
|
|
41
|
+
*
|
|
42
|
+
* The envelope is applied to the float samples the chain produced, BEFORE
|
|
43
|
+
* `writeWav` quantises them. Leaving it to the mixer's second pass meant a
|
|
44
|
+
* chain that overshoots full scale was destructively clipped to ±1 and only
|
|
45
|
+
* then ducked, so a track the lane pulls 12 dB down still rendered the
|
|
46
|
+
* distortion — which preview, working in float throughout, never had.
|
|
47
|
+
* `writeWav`'s clamp stays: it is the correct last resort for a signal that is
|
|
48
|
+
* still hot after the duck.
|
|
49
|
+
*
|
|
50
|
+
* Failure is fatal to the caller rather than a soft per-track warning: quietly
|
|
51
|
+
* rendering the dry signal ships a mix that sounds plausible and is not what
|
|
52
|
+
* the author set up.
|
|
53
|
+
*/
|
|
54
|
+
export declare function applyAudioFxChain(inputWav: string, chain: HfAudioFxChain, outputWav: string, options: {
|
|
55
|
+
trackId: string;
|
|
56
|
+
signal?: AbortSignal;
|
|
57
|
+
automation?: HfAutomation;
|
|
58
|
+
envelope?: {
|
|
59
|
+
keyframes: AudioVolumeKeyframe[];
|
|
60
|
+
trackStart: number;
|
|
61
|
+
baseVolume: number;
|
|
62
|
+
};
|
|
63
|
+
}): Promise<{
|
|
64
|
+
path: string;
|
|
65
|
+
envelopeBaked: boolean;
|
|
66
|
+
}>;
|
|
67
|
+
export type { HfAudioFxChain, HfAutomation };
|
|
68
|
+
//# sourceMappingURL=audioFxRender.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audioFxRender.d.ts","sourceRoot":"","sources":["../../src/services/audioFxRender.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAOH,OAAO,EAAuB,KAAK,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACtF,OAAO,EAAuB,KAAK,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAI5F,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAEjE,qBAAa,kBAAmB,SAAQ,KAAK;gBAC/B,OAAO,EAAE,MAAM;CAI5B;AAED,UAAU,OAAO;IACf,OAAO,EAAE,YAAY,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAmCD,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAQ7C;AAuBD;;;;;;;;;GASG;AACH,wBAAgB,QAAQ,CACtB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,YAAY,EACrB,UAAU,EAAE,MAAM,EAClB,QAAQ,SAAI,GACX,IAAI,CAmCN;AAmFD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,cAAc,EACrB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE;IACP,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,UAAU,CAAC,EAAE,YAAY,CAAC;IAC1B,QAAQ,CAAC,EAAE;QAAE,SAAS,EAAE,mBAAmB,EAAE,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;CACzF,GACA,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,OAAO,CAAA;CAAE,CAAC,CAuKnD;AAED,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC"}
|
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Applies an audio FX chain to a WAV at render time.
|
|
3
|
+
*
|
|
4
|
+
* The processing runs in an OfflineAudioContext inside the headless browser the
|
|
5
|
+
* engine already drives, using the same graph builders the studio previews
|
|
6
|
+
* with. There is one implementation of each effect, so the render matching the
|
|
7
|
+
* preview is a property of the architecture rather than a tolerance to police.
|
|
8
|
+
*
|
|
9
|
+
* The alternative — reimplementing every effect as an FFmpeg filter — means two
|
|
10
|
+
* implementations that have to be kept in agreement, and four of them (the
|
|
11
|
+
* dynamics processors and the modulated delays) have no filter that behaves the
|
|
12
|
+
* same way, so preview would quietly stop predicting the render.
|
|
13
|
+
*/
|
|
14
|
+
import { existsSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs";
|
|
15
|
+
import { tmpdir } from "node:os";
|
|
16
|
+
import { join } from "node:path";
|
|
17
|
+
import { pathToFileURL } from "node:url";
|
|
18
|
+
import { getAudioFxRuntimeScript } from "@hyperframes/core/audio-fx-runtime";
|
|
19
|
+
import { enabledAudioFxNodes } from "@hyperframes/core/audio-fx";
|
|
20
|
+
import { serializeAutomation } from "@hyperframes/core/audio-automation";
|
|
21
|
+
import { acquireBrowser } from "./browserManager.js";
|
|
22
|
+
import { createEnvelopeWalker } from "./audioVolumeEnvelope.js";
|
|
23
|
+
import { riffChunks } from "./wavChunks.js";
|
|
24
|
+
export class AudioFxRenderError extends Error {
|
|
25
|
+
constructor(message) {
|
|
26
|
+
super(message);
|
|
27
|
+
this.name = "AudioFxRenderError";
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Minimal reader for the WAVs the mixer produces upstream. Handles 16-bit PCM
|
|
32
|
+
* and 32-bit float, the two formats the trim/extract steps emit; anything else
|
|
33
|
+
* is refused rather than silently misread as noise.
|
|
34
|
+
*/
|
|
35
|
+
/** Walk the chunks for the format and the payload, in whatever order they sit. */
|
|
36
|
+
function readWavChunks(buf) {
|
|
37
|
+
const head = { format: 1, channels: 1, sampleRate: 48000, bits: 16 };
|
|
38
|
+
let data;
|
|
39
|
+
for (const { id, body, size } of riffChunks(buf)) {
|
|
40
|
+
if (id === "fmt ") {
|
|
41
|
+
head.format = buf.readUInt16LE(body);
|
|
42
|
+
head.channels = buf.readUInt16LE(body + 2);
|
|
43
|
+
head.sampleRate = buf.readUInt32LE(body + 4);
|
|
44
|
+
head.bits = buf.readUInt16LE(body + 14);
|
|
45
|
+
}
|
|
46
|
+
else if (id === "data") {
|
|
47
|
+
data = buf.subarray(body, Math.min(buf.length, body + size));
|
|
48
|
+
// The payload is the rest of the file for anything the mixer writes, and
|
|
49
|
+
// reading past it buys nothing: `fmt ` precedes `data` in every WAV these
|
|
50
|
+
// steps produce, and the alternative is walking a several-hundred-megabyte
|
|
51
|
+
// tail chunk by chunk.
|
|
52
|
+
break;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return { ...head, data };
|
|
56
|
+
}
|
|
57
|
+
export function readWav(path) {
|
|
58
|
+
const buf = readFileSync(path);
|
|
59
|
+
if (buf.length < 44 || buf.toString("ascii", 0, 4) !== "RIFF") {
|
|
60
|
+
throw new AudioFxRenderError(`Not a WAV file: ${path}`);
|
|
61
|
+
}
|
|
62
|
+
const { format, channels, sampleRate, bits, data } = readWavChunks(buf);
|
|
63
|
+
if (!data)
|
|
64
|
+
throw new AudioFxRenderError(`WAV has no data chunk: ${path}`);
|
|
65
|
+
return { samples: decodeSamples(data, format, bits, path), sampleRate, channels };
|
|
66
|
+
}
|
|
67
|
+
/** Interleaved samples as floats, for the two formats the mixer emits upstream. */
|
|
68
|
+
function decodeSamples(data, format, bits, path) {
|
|
69
|
+
if (format === 3 && bits === 32) {
|
|
70
|
+
const n = Math.floor(data.length / 4);
|
|
71
|
+
// A Float32Array view demands a 4-aligned offset, and chunk layouts that put
|
|
72
|
+
// `data` on an odd boundary (an 18-byte fmt plus a fact chunk, which
|
|
73
|
+
// ffmpeg's pcm_f32le writes) would otherwise throw RangeError. Copy then.
|
|
74
|
+
if (data.byteOffset % 4 === 0)
|
|
75
|
+
return new Float32Array(data.buffer, data.byteOffset, n);
|
|
76
|
+
const copied = new Float32Array(n);
|
|
77
|
+
for (let i = 0; i < n; i++)
|
|
78
|
+
copied[i] = data.readFloatLE(i * 4);
|
|
79
|
+
return copied;
|
|
80
|
+
}
|
|
81
|
+
if (format === 1 && bits === 16) {
|
|
82
|
+
const n = Math.floor(data.length / 2);
|
|
83
|
+
const out = new Float32Array(n);
|
|
84
|
+
for (let i = 0; i < n; i++)
|
|
85
|
+
out[i] = data.readInt16LE(i * 2) / 32768;
|
|
86
|
+
return out;
|
|
87
|
+
}
|
|
88
|
+
throw new AudioFxRenderError(`Unsupported WAV format ${format}/${bits}-bit: ${path}`);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Write 16-bit PCM, interleaved, preserving the channel count.
|
|
92
|
+
*
|
|
93
|
+
* 16-bit rather than the float32 this used to emit: the very next step in the
|
|
94
|
+
* mixer bakes the volume envelope into the samples, and that baker accepts only
|
|
95
|
+
* 16-bit PCM. Emitting float meant enabling any effect silently downgraded a
|
|
96
|
+
* track's volume automation to the ffmpeg expression path, which is capped at 32
|
|
97
|
+
* straight segments — so a curved envelope was quantised and a dense one could
|
|
98
|
+
* fall back to rendering at base volume.
|
|
99
|
+
*/
|
|
100
|
+
export function writeWav(path, samples, sampleRate, channels = 1) {
|
|
101
|
+
const n = samples.length;
|
|
102
|
+
const bytes = n * 2;
|
|
103
|
+
const buf = Buffer.alloc(44 + bytes);
|
|
104
|
+
buf.write("RIFF", 0, "ascii");
|
|
105
|
+
buf.writeUInt32LE(36 + bytes, 4);
|
|
106
|
+
buf.write("WAVE", 8, "ascii");
|
|
107
|
+
buf.write("fmt ", 12, "ascii");
|
|
108
|
+
buf.writeUInt32LE(16, 16);
|
|
109
|
+
buf.writeUInt16LE(1, 20); // WAVE_FORMAT_PCM
|
|
110
|
+
buf.writeUInt16LE(channels, 22);
|
|
111
|
+
buf.writeUInt32LE(sampleRate, 24);
|
|
112
|
+
buf.writeUInt32LE(sampleRate * channels * 2, 28);
|
|
113
|
+
buf.writeUInt16LE(channels * 2, 32);
|
|
114
|
+
buf.writeUInt16LE(16, 34);
|
|
115
|
+
buf.write("data", 36, "ascii");
|
|
116
|
+
buf.writeUInt32LE(bytes, 40);
|
|
117
|
+
for (let i = 0; i < n; i++) {
|
|
118
|
+
// Clamp before scaling: a limiter set to 0 dB or a resonant filter can push
|
|
119
|
+
// past full scale, and wrapping would turn that into a click.
|
|
120
|
+
const v = Math.max(-1, Math.min(1, samples[i] ?? 0));
|
|
121
|
+
buf.writeInt16LE(Math.round(v * 32767), 44 + i * 2);
|
|
122
|
+
}
|
|
123
|
+
// lgtm[js/insecure-temporary-file] — `path` is always inside a directory the
|
|
124
|
+
// caller made with `mkdtempSync`, never a name assembled directly under
|
|
125
|
+
// `tmpdir()`. Both routes here are covered: the browser host page writes into
|
|
126
|
+
// `mkdtempSync(join(tmpdir(), "hf-fx-host-"))` below, and the render output
|
|
127
|
+
// goes to the producer's work dir, itself created as
|
|
128
|
+
// `mkdtempSync(join(tempRoot, "producer-project-"))`. mkdtemp picks the random
|
|
129
|
+
// suffix and creates the directory 0700 in one syscall, so the predictable
|
|
130
|
+
// FILENAME inside it (`<elementId>-fx.wav`) cannot be pre-created or
|
|
131
|
+
// symlinked by another user — which is the attack this rule is about. CodeQL
|
|
132
|
+
// flags it because the dataflow reaches `tmpdir()` without seeing the mkdtemp
|
|
133
|
+
// in between.
|
|
134
|
+
writeFileSync(path, buf);
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Split an interleaved buffer into one array per channel.
|
|
138
|
+
*
|
|
139
|
+
* The graph used to fold everything to mono, which collapsed a stereo bed's
|
|
140
|
+
* width for the render only — and cost ~3 dB through the very mono-to-stereo
|
|
141
|
+
* rematrix that `prepareAudioTrack`'s pan filter exists to avoid. Preview kept
|
|
142
|
+
* the track stereo, so the two diverged the moment any effect was enabled.
|
|
143
|
+
*/
|
|
144
|
+
function deinterleave(samples, channels) {
|
|
145
|
+
if (channels <= 1)
|
|
146
|
+
return [samples];
|
|
147
|
+
const frames = Math.floor(samples.length / channels);
|
|
148
|
+
const out = Array.from({ length: channels }, () => new Float32Array(frames));
|
|
149
|
+
for (let i = 0; i < frames; i++) {
|
|
150
|
+
for (let c = 0; c < channels; c++) {
|
|
151
|
+
out[c][i] = samples[i * channels + c] ?? 0;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return out;
|
|
155
|
+
}
|
|
156
|
+
/** Re-interleave per-channel arrays for the WAV writer. */
|
|
157
|
+
function interleave(planes) {
|
|
158
|
+
if (planes.length === 1)
|
|
159
|
+
return planes[0];
|
|
160
|
+
const frames = planes[0]?.length ?? 0;
|
|
161
|
+
const out = new Float32Array(frames * planes.length);
|
|
162
|
+
for (let i = 0; i < frames; i++) {
|
|
163
|
+
for (let c = 0; c < planes.length; c++) {
|
|
164
|
+
out[i * planes.length + c] = planes[c][i] ?? 0;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return out;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Bytes of PCM per CDP message.
|
|
171
|
+
*
|
|
172
|
+
* The whole track used to cross in a single `page.evaluate` pair — ~184 MB of
|
|
173
|
+
* base64 for a 3-minute stereo 48 kHz clip, in one WebSocket frame each way.
|
|
174
|
+
* puppeteer-core caps its frames at 256 MB and the browser pool does not use
|
|
175
|
+
* the pipe transport, so stereo past ~8.7 minutes failed the render outright;
|
|
176
|
+
* V8's max string length is a second wall not far beyond it. Chunking bounds
|
|
177
|
+
* both, and bounds the peak Node-side allocation with them: the mixer renders
|
|
178
|
+
* tracks concurrently, so every track's payload was live at once.
|
|
179
|
+
*
|
|
180
|
+
* 8 MiB encodes to ~11 MB of base64. A multiple of 4, so a chunk boundary
|
|
181
|
+
* never falls inside a float.
|
|
182
|
+
*/
|
|
183
|
+
const TRANSFER_BYTES = 8 * 1024 * 1024;
|
|
184
|
+
/**
|
|
185
|
+
* Multiply every channel by the envelope, in place, one gain per frame.
|
|
186
|
+
*
|
|
187
|
+
* Frame-outer rather than plane-outer on purpose: the walker's cursor only
|
|
188
|
+
* moves forward, so restarting each channel at t=0 would hand the second one
|
|
189
|
+
* the tail gain for its whole length.
|
|
190
|
+
*/
|
|
191
|
+
function applyEnvelopeToPlanes(planes, sampleRate, gainAt) {
|
|
192
|
+
const frames = planes[0]?.length ?? 0;
|
|
193
|
+
for (let frame = 0; frame < frames; frame += 1) {
|
|
194
|
+
const gain = gainAt(frame / sampleRate);
|
|
195
|
+
for (const plane of planes)
|
|
196
|
+
plane[frame] = (plane[frame] ?? 0) * gain;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Run a chain over `inputWav`, writing `outputWav`. Resolves to the path to use
|
|
201
|
+
* downstream — `outputWav` when the chain did something, `inputWav` untouched
|
|
202
|
+
* when the chain was empty — plus whether the volume envelope was baked here.
|
|
203
|
+
*
|
|
204
|
+
* The envelope is applied to the float samples the chain produced, BEFORE
|
|
205
|
+
* `writeWav` quantises them. Leaving it to the mixer's second pass meant a
|
|
206
|
+
* chain that overshoots full scale was destructively clipped to ±1 and only
|
|
207
|
+
* then ducked, so a track the lane pulls 12 dB down still rendered the
|
|
208
|
+
* distortion — which preview, working in float throughout, never had.
|
|
209
|
+
* `writeWav`'s clamp stays: it is the correct last resort for a signal that is
|
|
210
|
+
* still hot after the duck.
|
|
211
|
+
*
|
|
212
|
+
* Failure is fatal to the caller rather than a soft per-track warning: quietly
|
|
213
|
+
* rendering the dry signal ships a mix that sounds plausible and is not what
|
|
214
|
+
* the author set up.
|
|
215
|
+
*/
|
|
216
|
+
export async function applyAudioFxChain(inputWav, chain, outputWav, options) {
|
|
217
|
+
if (enabledAudioFxNodes(chain).length === 0)
|
|
218
|
+
return { path: inputWav, envelopeBaked: false };
|
|
219
|
+
if (!existsSync(inputWav)) {
|
|
220
|
+
throw new AudioFxRenderError(`Audio FX input is missing: ${inputWav}`);
|
|
221
|
+
}
|
|
222
|
+
const { samples, sampleRate, channels } = readWav(inputWav);
|
|
223
|
+
const planes = deinterleave(samples, channels);
|
|
224
|
+
// An empty track has nothing to process — and an OfflineAudioContext of zero
|
|
225
|
+
// length throws, which is fatal for the WHOLE render rather than this track:
|
|
226
|
+
// the error travels past the mixer's per-track failure collector. ffmpeg
|
|
227
|
+
// writes an empty but structurally valid WAV whenever a clip's trim starts
|
|
228
|
+
// past the end of its source, so one mis-set `data-media-start` used to take
|
|
229
|
+
// the render down. Guarded here as well as in the runtime so an empty track
|
|
230
|
+
// never costs a browser.
|
|
231
|
+
if ((planes[0]?.length ?? 0) === 0)
|
|
232
|
+
return { path: inputWav, envelopeBaked: false };
|
|
233
|
+
// Both resources are taken INSIDE the try that releases them. The lease used
|
|
234
|
+
// to be acquired above it, with the mkdtemp between — so a failure there
|
|
235
|
+
// (a full disk, a read-only tmpdir) leaked a pooled browser, and a pool with
|
|
236
|
+
// no leases left hangs every later render rather than failing one.
|
|
237
|
+
const hostDir = mkdtempSync(join(tmpdir(), "hf-fx-host-"));
|
|
238
|
+
let lease = null;
|
|
239
|
+
try {
|
|
240
|
+
// Audio processing needs no GPU or special capture mode; a plain sandboxed
|
|
241
|
+
// browser is enough, and the lease pool reuses one across tracks.
|
|
242
|
+
// Checked before the lease, not after: an already-cancelled track has no
|
|
243
|
+
// reason to take a browser out of the pool just to hand it straight back.
|
|
244
|
+
if (options.signal?.aborted) {
|
|
245
|
+
throw new AudioFxRenderError(`Audio FX cancelled for track ${options.trackId}`);
|
|
246
|
+
}
|
|
247
|
+
lease = await acquireBrowser(["--no-sandbox", "--autoplay-policy=no-user-gesture-required"]);
|
|
248
|
+
const page = await lease.browser.newPage();
|
|
249
|
+
try {
|
|
250
|
+
// AudioWorklet is only exposed in a secure context, and about:blank is
|
|
251
|
+
// not one — the module would fail with an opaque error. A file:// page
|
|
252
|
+
// qualifies and needs no listening socket.
|
|
253
|
+
const hostPage = join(hostDir, "audio-fx.html");
|
|
254
|
+
writeFileSync(hostPage, "<!doctype html><meta charset=utf-8><title>audio fx</title>");
|
|
255
|
+
await page.goto(pathToFileURL(hostPage).href, { waitUntil: "domcontentloaded" });
|
|
256
|
+
await page.addScriptTag({ content: getAudioFxRuntimeScript() });
|
|
257
|
+
// Hand the input over a chunk at a time. The chunks stay separate byte
|
|
258
|
+
// arrays page-side rather than being concatenated into one string, so
|
|
259
|
+
// neither the frame cap nor V8's string limit sees the whole track.
|
|
260
|
+
await page.evaluate((count) => {
|
|
261
|
+
window.__HF_FX_IO = {
|
|
262
|
+
in: Array.from({ length: count }, () => []),
|
|
263
|
+
out: [],
|
|
264
|
+
};
|
|
265
|
+
}, planes.length);
|
|
266
|
+
for (let p = 0; p < planes.length; p += 1) {
|
|
267
|
+
const plane = planes[p];
|
|
268
|
+
if (!plane)
|
|
269
|
+
continue;
|
|
270
|
+
const bytes = Buffer.from(plane.buffer, plane.byteOffset, plane.length * 4);
|
|
271
|
+
for (let at = 0; at < bytes.length; at += TRANSFER_BYTES) {
|
|
272
|
+
await page.evaluate(([index, b64]) => {
|
|
273
|
+
const bin = atob(b64);
|
|
274
|
+
const chunk = new Uint8Array(bin.length);
|
|
275
|
+
for (let i = 0; i < bin.length; i++)
|
|
276
|
+
chunk[i] = bin.charCodeAt(i);
|
|
277
|
+
window.__HF_FX_IO?.in[index]?.push(chunk);
|
|
278
|
+
}, [p, bytes.subarray(at, at + TRANSFER_BYTES).toString("base64")]);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
const outLengths = (await page.evaluate(async ([rate, chainJson, automationJson]) => {
|
|
282
|
+
const w = window;
|
|
283
|
+
const io = w.__HF_FX_IO;
|
|
284
|
+
if (!w.__HF_AUDIO_FX || !io)
|
|
285
|
+
throw new Error("audio FX runtime failed to load");
|
|
286
|
+
const inPlanes = io.in.map((chunks) => {
|
|
287
|
+
const bytes = new Uint8Array(chunks.reduce((n, c) => n + c.length, 0));
|
|
288
|
+
let at = 0;
|
|
289
|
+
for (const chunk of chunks) {
|
|
290
|
+
bytes.set(chunk, at);
|
|
291
|
+
at += chunk.length;
|
|
292
|
+
}
|
|
293
|
+
return new Float32Array(bytes.buffer);
|
|
294
|
+
});
|
|
295
|
+
// Dropped before the render allocates its own buffers, so the page
|
|
296
|
+
// does not hold two copies of the track at once.
|
|
297
|
+
io.in = [];
|
|
298
|
+
io.out = await w.__HF_AUDIO_FX.render(inPlanes, rate, chainJson, automationJson || undefined);
|
|
299
|
+
return io.out.map((plane) => plane.length);
|
|
300
|
+
}, [
|
|
301
|
+
sampleRate,
|
|
302
|
+
JSON.stringify(chain),
|
|
303
|
+
options.automation ? serializeAutomation(options.automation) : "",
|
|
304
|
+
]));
|
|
305
|
+
const outPlanes = [];
|
|
306
|
+
for (let p = 0; p < outLengths.length; p += 1) {
|
|
307
|
+
const byteLength = (outLengths[p] ?? 0) * 4;
|
|
308
|
+
const parts = [];
|
|
309
|
+
for (let at = 0; at < byteLength; at += TRANSFER_BYTES) {
|
|
310
|
+
const b64 = (await page.evaluate(([index, offset, limit]) => {
|
|
311
|
+
const plane = window.__HF_FX_IO?.out[index];
|
|
312
|
+
if (!plane)
|
|
313
|
+
return "";
|
|
314
|
+
const u8 = new Uint8Array(plane.buffer, plane.byteOffset + offset, Math.min(limit, plane.length * 4 - offset));
|
|
315
|
+
let s = "";
|
|
316
|
+
const CHUNK = 0x8000;
|
|
317
|
+
for (let i = 0; i < u8.length; i += CHUNK) {
|
|
318
|
+
// `apply` takes array-likes, so the subarray goes in as it is;
|
|
319
|
+
// Array.from boxed every byte of a 32 KiB window for nothing.
|
|
320
|
+
s += String.fromCharCode.apply(null, u8.subarray(i, i + CHUNK));
|
|
321
|
+
}
|
|
322
|
+
return btoa(s);
|
|
323
|
+
}, [p, at, TRANSFER_BYTES]));
|
|
324
|
+
parts.push(Buffer.from(b64, "base64"));
|
|
325
|
+
}
|
|
326
|
+
// byteOffset and byteLength matter: Node pools small allocations, so a
|
|
327
|
+
// short payload decodes into an 8 KiB pool and a view over the whole
|
|
328
|
+
// ArrayBuffer would read kilobytes of unrelated memory at the wrong length.
|
|
329
|
+
const buf = Buffer.concat(parts);
|
|
330
|
+
outPlanes.push(new Float32Array(buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength)));
|
|
331
|
+
}
|
|
332
|
+
if (outPlanes.length === 0 || (outPlanes[0]?.length ?? 0) === 0) {
|
|
333
|
+
throw new AudioFxRenderError(`Audio FX produced no samples for track ${options.trackId}`);
|
|
334
|
+
}
|
|
335
|
+
// Null when the keyframes normalise away to nothing — then the mixer's
|
|
336
|
+
// own paths still own this track's gain, so say so rather than claiming
|
|
337
|
+
// a bake that never happened.
|
|
338
|
+
const gainAt = options.envelope
|
|
339
|
+
? createEnvelopeWalker(options.envelope.keyframes, options.envelope.trackStart, options.envelope.baseVolume)
|
|
340
|
+
: null;
|
|
341
|
+
if (gainAt)
|
|
342
|
+
applyEnvelopeToPlanes(outPlanes, sampleRate, gainAt);
|
|
343
|
+
writeWav(outputWav, interleave(outPlanes), sampleRate, outPlanes.length);
|
|
344
|
+
return { path: outputWav, envelopeBaked: gainAt !== null };
|
|
345
|
+
}
|
|
346
|
+
finally {
|
|
347
|
+
await page.close().catch(() => undefined);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
catch (err) {
|
|
351
|
+
if (err instanceof AudioFxRenderError)
|
|
352
|
+
throw err;
|
|
353
|
+
throw new AudioFxRenderError(`Audio FX failed for track ${options.trackId}: ${err.message}`);
|
|
354
|
+
}
|
|
355
|
+
finally {
|
|
356
|
+
rmSync(hostDir, { recursive: true, force: true });
|
|
357
|
+
await lease?.release().catch(() => undefined);
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
//# sourceMappingURL=audioFxRender.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audioFxRender.js","sourceRoot":"","sources":["../../src/services/audioFxRender.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,8 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { type EngineConfig } from "../config.js";
|
|
7
7
|
import type { AudioElement, MixResult } from "./audioMixer.types.js";
|
|
8
|
+
import { type HfAutomationLane } from "@hyperframes/core/audio-automation";
|
|
9
|
+
import type { AudioVolumeKeyframe } from "./audioMixer.types.js";
|
|
8
10
|
export type { AudioElement, MixResult } from "./audioMixer.types.js";
|
|
9
11
|
/**
|
|
10
12
|
* Filename every caller must use for the mixed-audio artifact.
|
|
@@ -20,6 +22,19 @@ export type { AudioElement, MixResult } from "./audioMixer.types.js";
|
|
|
20
22
|
* the PNG-sequence sidecar, and all three have to agree.
|
|
21
23
|
*/
|
|
22
24
|
export declare const MIXED_AUDIO_FILENAME = "audio.m4a";
|
|
25
|
+
/**
|
|
26
|
+
* A volume lane as keyframes for the PCM baker.
|
|
27
|
+
*
|
|
28
|
+
* The baker interpolates linearly between keyframes, so a straight segment
|
|
29
|
+
* needs only its two ends — a simple fade stays two keyframes. A bent one is
|
|
30
|
+
* sampled, or the bake would quietly straighten it.
|
|
31
|
+
*
|
|
32
|
+
* Times come out in composition seconds, which is what the baker subtracts the
|
|
33
|
+
* track start from. Returns null when the track has no volume lane.
|
|
34
|
+
*/
|
|
35
|
+
export declare function volumeLaneKeyframes(automation: {
|
|
36
|
+
lanes: HfAutomationLane[];
|
|
37
|
+
}, trackStart: number, duration: number): AudioVolumeKeyframe[] | null;
|
|
23
38
|
export declare function parseAudioElements(html: string): AudioElement[];
|
|
24
39
|
export declare function processCompositionAudio(elements: AudioElement[], baseDir: string, workDir: string, outputPath: string, totalDuration: number, signal?: AbortSignal, config?: Partial<Pick<EngineConfig, "ffmpegProcessTimeout" | "audioGain">>, compiledDir?: string): Promise<MixResult>;
|
|
25
40
|
//# sourceMappingURL=audioMixer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audioMixer.d.ts","sourceRoot":"","sources":["../../src/services/audioMixer.ts"],"names":[],"mappings":"AACA;;;;GAIG;AAaH,OAAO,EAAkB,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAKjE,OAAO,KAAK,EACV,YAAY,EAIZ,SAAS,EACV,MAAM,uBAAuB,CAAC;AAG/B,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAErE;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,oBAAoB,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"audioMixer.d.ts","sourceRoot":"","sources":["../../src/services/audioMixer.ts"],"names":[],"mappings":"AACA;;;;GAIG;AAaH,OAAO,EAAkB,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAKjE,OAAO,KAAK,EACV,YAAY,EAIZ,SAAS,EACV,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAML,KAAK,gBAAgB,EACtB,MAAM,oCAAoC,CAAC;AAG5C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAEjE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAErE;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,oBAAoB,cAAc,CAAC;AA+RhD;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE;IAAE,KAAK,EAAE,gBAAgB,EAAE,CAAA;CAAE,EACzC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf,mBAAmB,EAAE,GAAG,IAAI,CA+B9B;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,EAAE,CAmE/D;AA0TD,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,YAAY,EAAE,EACxB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,EACrB,MAAM,CAAC,EAAE,WAAW,EACpB,MAAM,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,sBAAsB,GAAG,WAAW,CAAC,CAAC,EAC1E,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,SAAS,CAAC,CA8TpB"}
|
|
@@ -16,6 +16,10 @@ import { unwrapTemplate } from "../utils/htmlTemplate.js";
|
|
|
16
16
|
import { resolveProjectRelativeSrc } from "./videoFrameExtractor.js";
|
|
17
17
|
import { resolveReferencedStart } from "./referenceResolver.js";
|
|
18
18
|
import { applyVolumeEnvelopeToWav } from "./audioVolumeEnvelope.js";
|
|
19
|
+
import { HF_AUDIO_FX_ATTR, parseAudioFxChain } from "@hyperframes/core/audio-fx";
|
|
20
|
+
import { HF_AUDIO_AUTOMATION_ATTR, parseAutomation, resolveAutomation, sampleAutomationLane, VOLUME_TARGET, } from "@hyperframes/core/audio-automation";
|
|
21
|
+
import { chainTailSeconds } from "@hyperframes/core/audio-fx-tail";
|
|
22
|
+
import { applyAudioFxChain, AudioFxRenderError } from "./audioFxRender.js";
|
|
19
23
|
/**
|
|
20
24
|
* Filename every caller must use for the mixed-audio artifact.
|
|
21
25
|
*
|
|
@@ -263,6 +267,50 @@ function ffmpegFailure(stage, result, elementId) {
|
|
|
263
267
|
: formatFfmpegError(result.exitCode, stderr)),
|
|
264
268
|
};
|
|
265
269
|
}
|
|
270
|
+
/** Extra samples per second inside a segment the baker cannot draw straight. */
|
|
271
|
+
const CURVED_SEGMENT_SAMPLES_PER_SEC = 30;
|
|
272
|
+
/**
|
|
273
|
+
* A volume lane as keyframes for the PCM baker.
|
|
274
|
+
*
|
|
275
|
+
* The baker interpolates linearly between keyframes, so a straight segment
|
|
276
|
+
* needs only its two ends — a simple fade stays two keyframes. A bent one is
|
|
277
|
+
* sampled, or the bake would quietly straighten it.
|
|
278
|
+
*
|
|
279
|
+
* Times come out in composition seconds, which is what the baker subtracts the
|
|
280
|
+
* track start from. Returns null when the track has no volume lane.
|
|
281
|
+
*/
|
|
282
|
+
export function volumeLaneKeyframes(automation, trackStart, duration) {
|
|
283
|
+
const lane = automation.lanes.find((l) => l.target === VOLUME_TARGET);
|
|
284
|
+
if (!lane || lane.points.length === 0)
|
|
285
|
+
return null;
|
|
286
|
+
const out = [];
|
|
287
|
+
const push = (t, v) => {
|
|
288
|
+
out.push({ time: trackStart + t, volume: v });
|
|
289
|
+
};
|
|
290
|
+
// The envelope holds its first value before the first point, rather than
|
|
291
|
+
// falling back to `data-volume`.
|
|
292
|
+
const first = lane.points[0];
|
|
293
|
+
if (first.t > 0)
|
|
294
|
+
push(0, first.v);
|
|
295
|
+
for (let i = 0; i < lane.points.length; i += 1) {
|
|
296
|
+
const a = lane.points[i];
|
|
297
|
+
push(a.t, a.v);
|
|
298
|
+
const b = lane.points[i + 1];
|
|
299
|
+
if (!b || !a.curve)
|
|
300
|
+
continue;
|
|
301
|
+
const steps = Math.max(2, Math.ceil((b.t - a.t) * CURVED_SEGMENT_SAMPLES_PER_SEC));
|
|
302
|
+
for (let k = 1; k < steps; k += 1) {
|
|
303
|
+
const t = a.t + ((b.t - a.t) * k) / steps;
|
|
304
|
+
push(t, sampleAutomationLane(lane, t));
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
// Hold the last value to the clip's end, so the baker does not ramp away
|
|
308
|
+
// from it toward whatever it would otherwise assume.
|
|
309
|
+
const last = lane.points[lane.points.length - 1];
|
|
310
|
+
if (duration > last.t)
|
|
311
|
+
push(duration, last.v);
|
|
312
|
+
return out;
|
|
313
|
+
}
|
|
266
314
|
export function parseAudioElements(html) {
|
|
267
315
|
const elements = [];
|
|
268
316
|
const { document } = parseHTML(unwrapTemplate(html));
|
|
@@ -294,6 +342,8 @@ export function parseAudioElements(html) {
|
|
|
294
342
|
const mediaStartAttr = el.getAttribute("data-media-start");
|
|
295
343
|
const layerAttr = el.getAttribute("data-layer");
|
|
296
344
|
const volumeAttr = el.getAttribute("data-volume");
|
|
345
|
+
const fxChain = el.getAttribute(HF_AUDIO_FX_ATTR);
|
|
346
|
+
const automation = el.getAttribute(HF_AUDIO_AUTOMATION_ATTR);
|
|
297
347
|
return {
|
|
298
348
|
id,
|
|
299
349
|
src: el.getAttribute("src"),
|
|
@@ -302,6 +352,8 @@ export function parseAudioElements(html) {
|
|
|
302
352
|
mediaStart: mediaStartAttr ? parseFloat(mediaStartAttr) : 0,
|
|
303
353
|
layer: layerAttr ? parseInt(layerAttr) : 0,
|
|
304
354
|
volume: volumeAttr ? parseFloat(volumeAttr) : 1.0,
|
|
355
|
+
...(fxChain ? { fxChain } : {}),
|
|
356
|
+
...(automation ? { automation } : {}),
|
|
305
357
|
type,
|
|
306
358
|
};
|
|
307
359
|
};
|
|
@@ -471,9 +523,13 @@ async function mixAudioTracks(tracks, outputPath, totalDuration, signal, config)
|
|
|
471
523
|
const filterParts = [];
|
|
472
524
|
tracks.forEach((track, i) => {
|
|
473
525
|
const delayMs = Math.round(track.start * 1000);
|
|
474
|
-
|
|
526
|
+
// A clip's own audio ends at `end`, but an FX tail is still decaying past
|
|
527
|
+
// it. Trimming at the boundary is what cut every reverb short; the final
|
|
528
|
+
// atrim below still holds the mix to the composition's length, so a tail
|
|
529
|
+
// can run over what follows but never past the end of the video.
|
|
530
|
+
const trimDuration = track.end - track.start + (track.tailSeconds ?? 0);
|
|
475
531
|
const volumeFilter = buildVolumeExpression(track, ignoreAutomation);
|
|
476
|
-
filterParts.push(`[${i}:a]atrim=0:${trimDuration},${volumeFilter},adelay=${delayMs}|${delayMs},apad,atrim=0:${formatFilterNumber(totalDuration)}[a${i}]`);
|
|
532
|
+
filterParts.push(`[${i}:a]atrim=0:${formatFilterNumber(trimDuration)},${volumeFilter},adelay=${delayMs}|${delayMs},apad,atrim=0:${formatFilterNumber(totalDuration)}[a${i}]`);
|
|
477
533
|
});
|
|
478
534
|
const mixInputs = tracks.map((_, i) => `[a${i}]`).join("");
|
|
479
535
|
const mixFilter = `${mixInputs}amix=inputs=${tracks.length}:duration=longest:dropout_transition=0[mixed]`;
|
|
@@ -594,8 +650,27 @@ export async function processCompositionAudio(elements, baseDir, workDir, output
|
|
|
594
650
|
const failures = [];
|
|
595
651
|
if (!existsSync(workDir))
|
|
596
652
|
mkdirSync(workDir, { recursive: true });
|
|
653
|
+
// Every element's work races under Promise.all, which rejects on the first
|
|
654
|
+
// failure without waiting for its siblings. A fatal FX error therefore has to
|
|
655
|
+
// be able to abort the in-flight ffmpeg runs before the finally-block removes
|
|
656
|
+
// workDir out from under them. Chained off the caller's signal so external
|
|
657
|
+
// cancellation still behaves as before.
|
|
658
|
+
//
|
|
659
|
+
// Every child that can outlive a sibling's failure has to be given THIS
|
|
660
|
+
// signal, not the caller's: the trim, the video extract and the download all
|
|
661
|
+
// took `signal`, so `internalController.abort()` cancelled nothing and the
|
|
662
|
+
// `rmSync(workDir)` on the next line ran while their ffmpeg children were
|
|
663
|
+
// still writing into it.
|
|
664
|
+
const internalController = new AbortController();
|
|
665
|
+
const effectiveSignal = internalController.signal;
|
|
666
|
+
if (signal) {
|
|
667
|
+
if (signal.aborted)
|
|
668
|
+
internalController.abort();
|
|
669
|
+
else
|
|
670
|
+
signal.addEventListener("abort", () => internalController.abort(), { once: true });
|
|
671
|
+
}
|
|
597
672
|
await Promise.all(elements.map(async (element) => {
|
|
598
|
-
if (
|
|
673
|
+
if (effectiveSignal.aborted) {
|
|
599
674
|
failures.push({
|
|
600
675
|
stage: "cancelled",
|
|
601
676
|
reason: "cancelled",
|
|
@@ -615,7 +690,7 @@ export async function processCompositionAudio(elements, baseDir, workDir, output
|
|
|
615
690
|
}
|
|
616
691
|
if (isHttpUrl(srcPath)) {
|
|
617
692
|
try {
|
|
618
|
-
srcPath = await downloadToTemp(srcPath, workDir, undefined,
|
|
693
|
+
srcPath = await downloadToTemp(srcPath, workDir, undefined, effectiveSignal, undefined, {
|
|
619
694
|
onTelemetry: writeUrlDownloadTelemetry,
|
|
620
695
|
});
|
|
621
696
|
}
|
|
@@ -672,7 +747,7 @@ export async function processCompositionAudio(elements, baseDir, workDir, output
|
|
|
672
747
|
const extractResult = await extractAudioFromVideo(srcPath, extractedPath, {
|
|
673
748
|
startTime: element.mediaStart,
|
|
674
749
|
duration: element.end - element.start,
|
|
675
|
-
},
|
|
750
|
+
}, effectiveSignal, config);
|
|
676
751
|
if (!extractResult.success) {
|
|
677
752
|
failures.push(extractResult.failure
|
|
678
753
|
? { ...extractResult.failure, elementId: element.id }
|
|
@@ -690,7 +765,7 @@ export async function processCompositionAudio(elements, baseDir, workDir, output
|
|
|
690
765
|
}
|
|
691
766
|
else {
|
|
692
767
|
const trimmedPath = join(workDir, `${element.id}-trimmed.wav`);
|
|
693
|
-
const prepResult = await prepareAudioTrack(srcPath, trimmedPath, element.mediaStart, element.end - element.start,
|
|
768
|
+
const prepResult = await prepareAudioTrack(srcPath, trimmedPath, element.mediaStart, element.end - element.start, effectiveSignal, config);
|
|
694
769
|
if (!prepResult.success) {
|
|
695
770
|
failures.push(prepResult.failure
|
|
696
771
|
? { ...prepResult.failure, elementId: element.id }
|
|
@@ -706,13 +781,58 @@ export async function processCompositionAudio(elements, baseDir, workDir, output
|
|
|
706
781
|
}
|
|
707
782
|
audioSrcPath = trimmedPath;
|
|
708
783
|
}
|
|
709
|
-
//
|
|
710
|
-
//
|
|
711
|
-
//
|
|
712
|
-
//
|
|
784
|
+
// Apply the track's FX chain to the dry, trimmed audio, before volume
|
|
785
|
+
// automation is baked in: effects should see the raw signal, and the
|
|
786
|
+
// envelope belongs on their output. A missing or broken chain is fatal
|
|
787
|
+
// for the whole mix rather than a per-track warning — quietly rendering
|
|
788
|
+
// the dry signal ships a mix that sounds plausible and is wrong.
|
|
789
|
+
const automation = element.automation
|
|
790
|
+
? resolveAutomation(parseAutomation(element.automation), element.fxChain ? parseAudioFxChain(element.fxChain) : undefined)
|
|
791
|
+
: null;
|
|
792
|
+
// Computed before the chain runs, not after: the FX pass bakes the
|
|
793
|
+
// envelope into its float output so the duck lands before the ±1 clamp
|
|
794
|
+
// in writeWav, instead of after it.
|
|
795
|
+
//
|
|
796
|
+
// A volume lane supersedes keyframes probed from the timeline: the two
|
|
797
|
+
// would fight, and the lane is the explicit one. `lint` warns when a
|
|
798
|
+
// track carries both.
|
|
799
|
+
const laneKeyframes = automation
|
|
800
|
+
? volumeLaneKeyframes(automation, element.start, element.end - element.start)
|
|
801
|
+
: null;
|
|
802
|
+
const envelopeKeyframes = laneKeyframes ?? element.volumeKeyframes;
|
|
803
|
+
const envelope = envelopeKeyframes && envelopeKeyframes.length > 0
|
|
804
|
+
? {
|
|
805
|
+
keyframes: envelopeKeyframes,
|
|
806
|
+
trackStart: element.start,
|
|
807
|
+
baseVolume: element.volume ?? 1.0,
|
|
808
|
+
}
|
|
809
|
+
: null;
|
|
713
810
|
let bakedEnvelope = false;
|
|
714
|
-
|
|
715
|
-
|
|
811
|
+
let tailSeconds = 0;
|
|
812
|
+
if (element.fxChain) {
|
|
813
|
+
// The chain is serialised into the attribute, the same way colour
|
|
814
|
+
// grading carries its config, so there is no side-car file to find,
|
|
815
|
+
// resolve or lose.
|
|
816
|
+
const chain = parseAudioFxChain(element.fxChain);
|
|
817
|
+
// The rendered WAV is longer than the input by exactly this much, so
|
|
818
|
+
// the mix has to be told to let it through.
|
|
819
|
+
tailSeconds = chainTailSeconds(chain, automation ?? undefined);
|
|
820
|
+
const fxResult = await applyAudioFxChain(audioSrcPath, chain, join(workDir, `${element.id}-fx.wav`), {
|
|
821
|
+
trackId: element.id,
|
|
822
|
+
signal: effectiveSignal,
|
|
823
|
+
...(automation ? { automation } : {}),
|
|
824
|
+
...(envelope ? { envelope } : {}),
|
|
825
|
+
});
|
|
826
|
+
audioSrcPath = fxResult.path;
|
|
827
|
+
bakedEnvelope = fxResult.envelopeBaked;
|
|
828
|
+
}
|
|
829
|
+
// Primary volume-automation path for a track the FX pass did not bake:
|
|
830
|
+
// multiply the envelope into the PCM samples (sample-accurate, no
|
|
831
|
+
// keyframe ceiling). If the WAV isn't the expected 16-bit PCM, fall
|
|
832
|
+
// back to the ffmpeg expression path by leaving the keyframes on the
|
|
833
|
+
// track for buildVolumeExpression to handle.
|
|
834
|
+
if (envelope && !bakedEnvelope) {
|
|
835
|
+
bakedEnvelope = applyVolumeEnvelopeToWav(audioSrcPath, envelope.keyframes, envelope.trackStart, envelope.baseVolume);
|
|
716
836
|
}
|
|
717
837
|
tracks.push({
|
|
718
838
|
id: element.id,
|
|
@@ -723,10 +843,17 @@ export async function processCompositionAudio(elements, baseDir, workDir, output
|
|
|
723
843
|
duration: element.end - element.start,
|
|
724
844
|
// Gain is already in the samples when baked, so mix at unity.
|
|
725
845
|
volume: bakedEnvelope ? 1.0 : (element.volume ?? 1.0),
|
|
726
|
-
volumeKeyframes: bakedEnvelope ? undefined :
|
|
846
|
+
volumeKeyframes: bakedEnvelope ? undefined : (envelopeKeyframes ?? undefined),
|
|
847
|
+
...(tailSeconds > 0 ? { tailSeconds } : {}),
|
|
727
848
|
});
|
|
728
849
|
}
|
|
729
850
|
catch (err) {
|
|
851
|
+
// An FX failure is fatal for the whole mix. Every other failure mode
|
|
852
|
+
// degrades gracefully — the track drops and siblings continue — but
|
|
853
|
+
// substituting the dry signal for a processed one ships a render that
|
|
854
|
+
// sounds plausible and is not what was authored.
|
|
855
|
+
if (err instanceof AudioFxRenderError)
|
|
856
|
+
throw err;
|
|
730
857
|
failures.push({
|
|
731
858
|
stage: "internal",
|
|
732
859
|
reason: "internal",
|
|
@@ -736,7 +863,18 @@ export async function processCompositionAudio(elements, baseDir, workDir, output
|
|
|
736
863
|
detail: boundedDetail(`Audio processing failed for element ${element.id}: ${err instanceof Error ? err.message : String(err)}`),
|
|
737
864
|
});
|
|
738
865
|
}
|
|
739
|
-
}))
|
|
866
|
+
})).catch((err) => {
|
|
867
|
+
// Promise.all rejected on the first fatal failure without waiting for its
|
|
868
|
+
// siblings; abort them so their ffmpeg stops before workDir disappears.
|
|
869
|
+
internalController.abort();
|
|
870
|
+
try {
|
|
871
|
+
rmSync(workDir, { recursive: true, force: true });
|
|
872
|
+
}
|
|
873
|
+
catch {
|
|
874
|
+
/* ignore */
|
|
875
|
+
}
|
|
876
|
+
throw err;
|
|
877
|
+
});
|
|
740
878
|
// Never turn a per-track preparation failure into a successful partial mix.
|
|
741
879
|
// The producer only surfaces audio failures when `success` is false; mixing
|
|
742
880
|
// the remaining tracks made the omitted cue indistinguishable from a valid
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audioMixer.js","sourceRoot":"","sources":["../../src/services/audioMixer.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"audioMixer.js","sourceRoot":"","sources":["../../src/services/audioMixer.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,6 +11,10 @@ export interface AudioElement {
|
|
|
11
11
|
layer: number;
|
|
12
12
|
volume?: number;
|
|
13
13
|
volumeKeyframes?: AudioVolumeKeyframe[];
|
|
14
|
+
/** Serialised FX chain JSON from `data-fx-chain`, when set. */
|
|
15
|
+
fxChain?: string;
|
|
16
|
+
/** Serialised automation JSON from `data-automation`, when set. */
|
|
17
|
+
automation?: string;
|
|
14
18
|
type: "audio" | "video";
|
|
15
19
|
}
|
|
16
20
|
export interface AudioTrack {
|
|
@@ -22,6 +26,12 @@ export interface AudioTrack {
|
|
|
22
26
|
duration: number;
|
|
23
27
|
volume: number;
|
|
24
28
|
volumeKeyframes?: AudioVolumeKeyframe[];
|
|
29
|
+
/**
|
|
30
|
+
* Seconds of FX tail past `end` that the mix should let through — a reverb or
|
|
31
|
+
* delay still decaying when the clip's own audio stops. Absent means cut at
|
|
32
|
+
* the clip boundary, which is what every track without an FX chain wants.
|
|
33
|
+
*/
|
|
34
|
+
tailSeconds?: number;
|
|
25
35
|
}
|
|
26
36
|
export type AudioFailureStage = "source" | "download" | "probe" | "extract" | "prepare" | "mix" | "silence" | "cancelled" | "internal";
|
|
27
37
|
export type AudioFailureReason = "source_not_found" | "download_failed" | "probe_failed" | "invalid_media" | "ffmpeg_unsupported" | "ffmpeg_timeout" | "ffmpeg_unavailable" | "ffmpeg_failed" | "cancelled" | "internal";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audioMixer.types.d.ts","sourceRoot":"","sources":["../../src/services/audioMixer.types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACxC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,mBAAmB,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"audioMixer.types.d.ts","sourceRoot":"","sources":["../../src/services/audioMixer.types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACxC,+DAA+D;IAC/D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mEAAmE;IACnE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACxC;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,iBAAiB,GACzB,QAAQ,GACR,UAAU,GACV,OAAO,GACP,SAAS,GACT,SAAS,GACT,KAAK,GACL,SAAS,GACT,WAAW,GACX,UAAU,CAAC;AAEf,MAAM,MAAM,kBAAkB,GAC1B,kBAAkB,GAClB,iBAAiB,GACjB,cAAc,GACd,eAAe,GACf,oBAAoB,GACpB,gBAAgB,GAChB,oBAAoB,GACpB,eAAe,GACf,WAAW,GACX,UAAU,CAAC;AAEf,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,iBAAiB,CAAC;IACzB,MAAM,EAAE,kBAAkB,CAAC;IAC3B,KAAK,EAAE,MAAM,GAAG,QAAQ,CAAC;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4EAA4E;IAC5E,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,sBAAsB,EAAE,CAAC;CACrC"}
|
|
@@ -15,6 +15,17 @@
|
|
|
15
15
|
* the caller can fall back to the expression path rather than corrupting audio.
|
|
16
16
|
*/
|
|
17
17
|
import type { AudioVolumeKeyframe } from "./audioMixer.types.js";
|
|
18
|
+
/**
|
|
19
|
+
* A gain lookup that walks forward through the envelope with a segment cursor,
|
|
20
|
+
* so a whole track costs O(N+M) rather than O(N×M). `interpolateVolumeGain`
|
|
21
|
+
* restarts from segment 0 on every call — fine for the preview path (once per
|
|
22
|
+
* RAF tick), not for a per-sample walk over 48k×duration frames.
|
|
23
|
+
*
|
|
24
|
+
* The cursor only ever advances, so callers must pass non-decreasing times.
|
|
25
|
+
* Returns null when the keyframes normalise to nothing, which the callers read
|
|
26
|
+
* as "no automation here".
|
|
27
|
+
*/
|
|
28
|
+
export declare function createEnvelopeWalker(keyframes: AudioVolumeKeyframe[], trackStart: number, baseVolume: number): ((time: number) => number) | null;
|
|
18
29
|
/**
|
|
19
30
|
* Multiply a prepared WAV's samples by a time-varying gain envelope in place.
|
|
20
31
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audioVolumeEnvelope.d.ts","sourceRoot":"","sources":["../../src/services/audioVolumeEnvelope.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"audioVolumeEnvelope.d.ts","sourceRoot":"","sources":["../../src/services/audioVolumeEnvelope.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAoDjE;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,mBAAmB,EAAE,EAChC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC,GAAG,IAAI,CAkBnC;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,mBAAmB,EAAE,EAChC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,OAAO,CAqCT"}
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
import { readFileSync, renameSync, writeFileSync } from "fs";
|
|
18
18
|
import { randomBytes } from "crypto";
|
|
19
19
|
import { normaliseEnvelope } from "@hyperframes/core/media-volume-envelope";
|
|
20
|
+
import { riffChunks } from "./wavChunks.js";
|
|
20
21
|
const PCM_FORMAT = 1; // WAVE_FORMAT_PCM
|
|
21
22
|
const SUPPORTED_BITS = 16;
|
|
22
23
|
/**
|
|
@@ -32,14 +33,10 @@ function parseWavLayout(buffer) {
|
|
|
32
33
|
return null;
|
|
33
34
|
if (buffer.toString("ascii", 8, 12) !== "WAVE")
|
|
34
35
|
return null;
|
|
35
|
-
let offset = 12;
|
|
36
36
|
let fmt = null;
|
|
37
37
|
let data = null;
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
const chunkSize = buffer.readUInt32LE(offset + 4);
|
|
41
|
-
const body = offset + 8;
|
|
42
|
-
if (chunkId === "fmt " && body + 16 <= buffer.length) {
|
|
38
|
+
for (const { id, body, size } of riffChunks(buffer)) {
|
|
39
|
+
if (id === "fmt " && body + 16 <= buffer.length) {
|
|
43
40
|
if (buffer.readUInt16LE(body) !== PCM_FORMAT)
|
|
44
41
|
return null;
|
|
45
42
|
fmt = {
|
|
@@ -48,11 +45,9 @@ function parseWavLayout(buffer) {
|
|
|
48
45
|
bitsPerSample: buffer.readUInt16LE(body + 14),
|
|
49
46
|
};
|
|
50
47
|
}
|
|
51
|
-
else if (
|
|
52
|
-
data = { offset: body, size: Math.min(
|
|
48
|
+
else if (id === "data") {
|
|
49
|
+
data = { offset: body, size: Math.min(size, buffer.length - body) };
|
|
53
50
|
}
|
|
54
|
-
// Chunks are word-aligned: an odd size carries a trailing pad byte.
|
|
55
|
-
offset = body + chunkSize + (chunkSize % 2);
|
|
56
51
|
}
|
|
57
52
|
if (!fmt || !data)
|
|
58
53
|
return null;
|
|
@@ -65,6 +60,36 @@ function parseWavLayout(buffer) {
|
|
|
65
60
|
dataSize: data.size,
|
|
66
61
|
};
|
|
67
62
|
}
|
|
63
|
+
/**
|
|
64
|
+
* A gain lookup that walks forward through the envelope with a segment cursor,
|
|
65
|
+
* so a whole track costs O(N+M) rather than O(N×M). `interpolateVolumeGain`
|
|
66
|
+
* restarts from segment 0 on every call — fine for the preview path (once per
|
|
67
|
+
* RAF tick), not for a per-sample walk over 48k×duration frames.
|
|
68
|
+
*
|
|
69
|
+
* The cursor only ever advances, so callers must pass non-decreasing times.
|
|
70
|
+
* Returns null when the keyframes normalise to nothing, which the callers read
|
|
71
|
+
* as "no automation here".
|
|
72
|
+
*/
|
|
73
|
+
export function createEnvelopeWalker(keyframes, trackStart, baseVolume) {
|
|
74
|
+
const envelope = normaliseEnvelope(keyframes, trackStart, baseVolume);
|
|
75
|
+
const first = envelope[0];
|
|
76
|
+
if (!first)
|
|
77
|
+
return null;
|
|
78
|
+
let segment = 0;
|
|
79
|
+
return (time) => {
|
|
80
|
+
for (;;) {
|
|
81
|
+
const next = envelope[segment + 1];
|
|
82
|
+
if (segment >= envelope.length - 2 || !next || time < next.time)
|
|
83
|
+
break;
|
|
84
|
+
segment += 1;
|
|
85
|
+
}
|
|
86
|
+
const a = envelope[segment] ?? first;
|
|
87
|
+
const b = envelope[segment + 1] ?? a;
|
|
88
|
+
const span = b.time - a.time;
|
|
89
|
+
const progress = span <= 0 ? 0 : Math.min(1, Math.max(0, (time - a.time) / span));
|
|
90
|
+
return a.volume + (b.volume - a.volume) * progress;
|
|
91
|
+
};
|
|
92
|
+
}
|
|
68
93
|
/**
|
|
69
94
|
* Multiply a prepared WAV's samples by a time-varying gain envelope in place.
|
|
70
95
|
*
|
|
@@ -72,8 +97,8 @@ function parseWavLayout(buffer) {
|
|
|
72
97
|
* expected 16-bit PCM (caller should fall back to the expression path).
|
|
73
98
|
*/
|
|
74
99
|
export function applyVolumeEnvelopeToWav(wavPath, keyframes, trackStart, baseVolume) {
|
|
75
|
-
const
|
|
76
|
-
if (
|
|
100
|
+
const gainAt = createEnvelopeWalker(keyframes, trackStart, baseVolume);
|
|
101
|
+
if (!gainAt)
|
|
77
102
|
return false;
|
|
78
103
|
try {
|
|
79
104
|
const buffer = readFileSync(wavPath);
|
|
@@ -84,20 +109,8 @@ export function applyVolumeEnvelopeToWav(wavPath, keyframes, trackStart, baseVol
|
|
|
84
109
|
const bytesPerSample = SUPPORTED_BITS / 8;
|
|
85
110
|
const frameBytes = numChannels * bytesPerSample;
|
|
86
111
|
const frameCount = Math.floor(dataSize / frameBytes);
|
|
87
|
-
// Maintain an incremental segment cursor so the per-frame envelope lookup
|
|
88
|
-
// is O(N+M) overall, not O(N×M). interpolateVolumeGain restarts from 0 on
|
|
89
|
-
// each call — fine for the preview path (one call per RAF tick) but not for
|
|
90
|
-
// the PCM path (one call per sample, 48k×duration frames total).
|
|
91
|
-
let segment = 0;
|
|
92
112
|
for (let frame = 0; frame < frameCount; frame += 1) {
|
|
93
|
-
const
|
|
94
|
-
while (segment < envelope.length - 2 && time >= envelope[segment + 1].time)
|
|
95
|
-
segment += 1;
|
|
96
|
-
const a = envelope[segment];
|
|
97
|
-
const b = envelope[segment + 1] ?? a;
|
|
98
|
-
const span = b.time - a.time;
|
|
99
|
-
const progress = span <= 0 ? 0 : Math.min(1, Math.max(0, (time - a.time) / span));
|
|
100
|
-
const gain = a.volume + (b.volume - a.volume) * progress;
|
|
113
|
+
const gain = gainAt(frame / sampleRate);
|
|
101
114
|
const base = dataOffset + frame * frameBytes;
|
|
102
115
|
for (let channel = 0; channel < numChannels; channel += 1) {
|
|
103
116
|
const at = base + channel * bytesPerSample;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audioVolumeEnvelope.js","sourceRoot":"","sources":["../../src/services/audioVolumeEnvelope.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAErC,OAAO,EAAE,iBAAiB,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"audioVolumeEnvelope.js","sourceRoot":"","sources":["../../src/services/audioVolumeEnvelope.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The RIFF chunk walk, which two WAV readers in this directory each had a copy
|
|
3
|
+
* of: `audioFxRender`'s `readWavChunks` and `audioVolumeEnvelope`'s
|
|
4
|
+
* `parseWavLayout`.
|
|
5
|
+
*
|
|
6
|
+
* Only the walk is shared. What the two do with the chunks is genuinely
|
|
7
|
+
* different — one wants a slice of the payload and lets the decoder judge the
|
|
8
|
+
* format, the other wants offsets to edit in place and refuses anything that is
|
|
9
|
+
* not 16-bit PCM — and folding those together would mean picking one behaviour
|
|
10
|
+
* for each difference, in the parser every render's audio passes through. So
|
|
11
|
+
* this yields chunks and holds no policy at all.
|
|
12
|
+
*/
|
|
13
|
+
export interface RiffChunk {
|
|
14
|
+
/** Four ASCII characters: `fmt `, `data`, `LIST`, `fact`, … */
|
|
15
|
+
id: string;
|
|
16
|
+
/** Byte offset of the chunk's body, past the 8-byte header. */
|
|
17
|
+
body: number;
|
|
18
|
+
/** The size the chunk declares. May run past the end of a truncated file. */
|
|
19
|
+
size: number;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Every chunk after the 12-byte RIFF header, in the order they sit.
|
|
23
|
+
*
|
|
24
|
+
* Advances by each chunk's declared size, so ordering is not assumed — `data`
|
|
25
|
+
* may precede `fmt `, and trailing LIST/fact chunks are walked past rather than
|
|
26
|
+
* tripped over. Chunks are word-aligned, so an odd size carries a pad byte.
|
|
27
|
+
*/
|
|
28
|
+
export declare function riffChunks(buffer: Buffer): Generator<RiffChunk>;
|
|
29
|
+
//# sourceMappingURL=wavChunks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wavChunks.d.ts","sourceRoot":"","sources":["../../src/services/wavChunks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,WAAW,SAAS;IACxB,+DAA+D;IAC/D,EAAE,EAAE,MAAM,CAAC;IACX,+DAA+D;IAC/D,IAAI,EAAE,MAAM,CAAC;IACb,6EAA6E;IAC7E,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;GAMG;AACH,wBAAiB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,CAQhE"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The RIFF chunk walk, which two WAV readers in this directory each had a copy
|
|
3
|
+
* of: `audioFxRender`'s `readWavChunks` and `audioVolumeEnvelope`'s
|
|
4
|
+
* `parseWavLayout`.
|
|
5
|
+
*
|
|
6
|
+
* Only the walk is shared. What the two do with the chunks is genuinely
|
|
7
|
+
* different — one wants a slice of the payload and lets the decoder judge the
|
|
8
|
+
* format, the other wants offsets to edit in place and refuses anything that is
|
|
9
|
+
* not 16-bit PCM — and folding those together would mean picking one behaviour
|
|
10
|
+
* for each difference, in the parser every render's audio passes through. So
|
|
11
|
+
* this yields chunks and holds no policy at all.
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Every chunk after the 12-byte RIFF header, in the order they sit.
|
|
15
|
+
*
|
|
16
|
+
* Advances by each chunk's declared size, so ordering is not assumed — `data`
|
|
17
|
+
* may precede `fmt `, and trailing LIST/fact chunks are walked past rather than
|
|
18
|
+
* tripped over. Chunks are word-aligned, so an odd size carries a pad byte.
|
|
19
|
+
*/
|
|
20
|
+
export function* riffChunks(buffer) {
|
|
21
|
+
let offset = 12;
|
|
22
|
+
while (offset + 8 <= buffer.length) {
|
|
23
|
+
const id = buffer.toString("ascii", offset, offset + 4);
|
|
24
|
+
const size = buffer.readUInt32LE(offset + 4);
|
|
25
|
+
yield { id, body: offset + 8, size };
|
|
26
|
+
offset += 8 + size + (size % 2);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=wavChunks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wavChunks.js","sourceRoot":"","sources":["../../src/services/wavChunks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAWH;;;;;;GAMG;AACH,MAAM,SAAS,CAAC,CAAC,UAAU,CAAC,MAAc;IACxC,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,OAAO,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QACnC,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC;QACxD,MAAM,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC7C,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC;QACrC,MAAM,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;IAClC,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hyperframes/engine",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.108",
|
|
4
4
|
"description": "Seekable web page to video rendering engine (Puppeteer + FFmpeg)",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -38,8 +38,8 @@
|
|
|
38
38
|
"linkedom": "^0.18.12",
|
|
39
39
|
"puppeteer": "^25.2.1",
|
|
40
40
|
"puppeteer-core": "^25.2.1",
|
|
41
|
-
"@hyperframes/core": "^0.7.
|
|
42
|
-
"@hyperframes/parsers": "^0.7.
|
|
41
|
+
"@hyperframes/core": "^0.7.108",
|
|
42
|
+
"@hyperframes/parsers": "^0.7.108"
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|
|
45
45
|
"@types/node": "^25.0.10",
|