@aura3d/audio 1.0.6 → 1.1.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.
- package/dist/AudioBus.d.ts +2 -0
- package/dist/AudioBus.d.ts.map +1 -1
- package/dist/AudioBus.js +6 -0
- package/dist/AudioBus.js.map +1 -1
- package/dist/AudioFileManager.d.ts +77 -0
- package/dist/AudioFileManager.d.ts.map +1 -0
- package/dist/AudioFileManager.js +168 -0
- package/dist/AudioFileManager.js.map +1 -0
- package/dist/AudioMixer.d.ts +43 -0
- package/dist/AudioMixer.d.ts.map +1 -1
- package/dist/AudioMixer.js +43 -0
- package/dist/AudioMixer.js.map +1 -1
- package/dist/AudioTimelineTrack.d.ts +135 -0
- package/dist/AudioTimelineTrack.d.ts.map +1 -0
- package/dist/AudioTimelineTrack.js +356 -0
- package/dist/AudioTimelineTrack.js.map +1 -0
- package/dist/AudioWaveform.d.ts +64 -0
- package/dist/AudioWaveform.d.ts.map +1 -0
- package/dist/AudioWaveform.js +146 -0
- package/dist/AudioWaveform.js.map +1 -0
- package/dist/index.d.ts +8 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/src/AudioBus.ts +8 -0
- package/src/AudioFileManager.ts +252 -0
- package/src/AudioMixer.ts +87 -0
- package/src/AudioTimelineTrack.ts +516 -0
- package/src/AudioWaveform.ts +226 -0
- package/src/index.ts +42 -1
- package/tests/audio.test.ts +233 -1
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
export class AudioTimelineTrack {
|
|
2
|
+
id;
|
|
3
|
+
name;
|
|
4
|
+
role;
|
|
5
|
+
busName;
|
|
6
|
+
volume;
|
|
7
|
+
muted;
|
|
8
|
+
solo;
|
|
9
|
+
clipsRef = [];
|
|
10
|
+
constructor(options) {
|
|
11
|
+
this.id = nonEmpty(options.id, "Audio timeline track id");
|
|
12
|
+
this.name = options.name ?? options.id;
|
|
13
|
+
this.role = options.role;
|
|
14
|
+
this.busName = options.busName ?? defaultAudioTimelineBusForRole(options.role);
|
|
15
|
+
this.volume = validateVolume(options.volume ?? 1, "Audio timeline track volume");
|
|
16
|
+
this.muted = options.muted ?? false;
|
|
17
|
+
this.solo = options.solo ?? false;
|
|
18
|
+
for (const clip of options.clips ?? []) {
|
|
19
|
+
this.addClip(clip);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
get clips() {
|
|
23
|
+
return [...this.clipsRef].sort(compareTimelineClips);
|
|
24
|
+
}
|
|
25
|
+
addClip(options) {
|
|
26
|
+
if (this.clipsRef.some((clip) => clip.id === options.id)) {
|
|
27
|
+
throw new Error(`Audio timeline clip already exists: ${options.id}`);
|
|
28
|
+
}
|
|
29
|
+
const clip = createAudioTimelineClip(options, this.busName);
|
|
30
|
+
this.clipsRef.push(clip);
|
|
31
|
+
this.sortClips();
|
|
32
|
+
return clip;
|
|
33
|
+
}
|
|
34
|
+
getClip(id) {
|
|
35
|
+
const clip = this.clipsRef.find((entry) => entry.id === id);
|
|
36
|
+
if (!clip) {
|
|
37
|
+
throw new Error(`Unknown audio timeline clip: ${id}`);
|
|
38
|
+
}
|
|
39
|
+
return clip;
|
|
40
|
+
}
|
|
41
|
+
removeClip(id) {
|
|
42
|
+
const index = this.clipsRef.findIndex((clip) => clip.id === id);
|
|
43
|
+
if (index < 0) {
|
|
44
|
+
throw new Error(`Unknown audio timeline clip: ${id}`);
|
|
45
|
+
}
|
|
46
|
+
const [removed] = this.clipsRef.splice(index, 1);
|
|
47
|
+
return removed;
|
|
48
|
+
}
|
|
49
|
+
moveClip(id, startTime) {
|
|
50
|
+
const clip = this.getClip(id);
|
|
51
|
+
const updated = { ...clip, startTime: validateNonNegative(startTime, "Audio timeline clip startTime") };
|
|
52
|
+
this.replaceClip(updated);
|
|
53
|
+
return updated;
|
|
54
|
+
}
|
|
55
|
+
trimClip(id, trimStart, trimEnd) {
|
|
56
|
+
const clip = this.getClip(id);
|
|
57
|
+
const sourceDuration = clip.sourceDuration;
|
|
58
|
+
const nextTrimStart = validateNonNegative(trimStart, "Audio timeline clip trimStart");
|
|
59
|
+
const nextTrimEnd = validateNonNegative(trimEnd, "Audio timeline clip trimEnd");
|
|
60
|
+
if (nextTrimEnd <= nextTrimStart || nextTrimEnd > sourceDuration) {
|
|
61
|
+
throw new Error("Audio timeline trim range must be inside the source duration");
|
|
62
|
+
}
|
|
63
|
+
const updated = {
|
|
64
|
+
...clip,
|
|
65
|
+
trimStart: nextTrimStart,
|
|
66
|
+
trimEnd: nextTrimEnd,
|
|
67
|
+
duration: nextTrimEnd - nextTrimStart,
|
|
68
|
+
envelope: clip.envelope.filter((point) => point.time <= nextTrimEnd - nextTrimStart)
|
|
69
|
+
};
|
|
70
|
+
this.replaceClip(updated);
|
|
71
|
+
return updated;
|
|
72
|
+
}
|
|
73
|
+
splitClip(id, splitTime, rightId = `${id}:split`) {
|
|
74
|
+
const clip = this.getClip(id);
|
|
75
|
+
const split = validateNonNegative(splitTime, "Audio timeline splitTime");
|
|
76
|
+
if (split <= clip.startTime || split >= clip.startTime + clip.duration) {
|
|
77
|
+
throw new Error("Audio timeline splitTime must fall inside the clip");
|
|
78
|
+
}
|
|
79
|
+
if (this.clipsRef.some((entry) => entry.id === rightId)) {
|
|
80
|
+
throw new Error(`Audio timeline clip already exists: ${rightId}`);
|
|
81
|
+
}
|
|
82
|
+
const leftDuration = split - clip.startTime;
|
|
83
|
+
const rightDuration = clip.duration - leftDuration;
|
|
84
|
+
const left = {
|
|
85
|
+
...clip,
|
|
86
|
+
duration: leftDuration,
|
|
87
|
+
trimEnd: clip.trimStart + leftDuration,
|
|
88
|
+
envelope: clip.envelope.filter((point) => point.time <= leftDuration)
|
|
89
|
+
};
|
|
90
|
+
const right = {
|
|
91
|
+
...clip,
|
|
92
|
+
id: rightId,
|
|
93
|
+
startTime: split,
|
|
94
|
+
duration: rightDuration,
|
|
95
|
+
trimStart: clip.trimStart + leftDuration,
|
|
96
|
+
envelope: shiftEnvelope(clip.envelope.filter((point) => point.time >= leftDuration), -leftDuration)
|
|
97
|
+
};
|
|
98
|
+
this.replaceClip(left);
|
|
99
|
+
this.clipsRef.push(right);
|
|
100
|
+
this.sortClips();
|
|
101
|
+
return [left, right];
|
|
102
|
+
}
|
|
103
|
+
activeClipsAt(time) {
|
|
104
|
+
const timelineTime = validateNonNegative(time, "Audio timeline sample time");
|
|
105
|
+
return this.clipsRef.filter((clip) => clipContainsTimelineTime(clip, timelineTime)).sort(compareTimelineClips);
|
|
106
|
+
}
|
|
107
|
+
sampleAt(time) {
|
|
108
|
+
const timelineTime = validateNonNegative(time, "Audio timeline sample time");
|
|
109
|
+
if (this.muted)
|
|
110
|
+
return [];
|
|
111
|
+
return this.activeClipsAt(timelineTime)
|
|
112
|
+
.map((clip) => createTimelineSample(this, clip, timelineTime))
|
|
113
|
+
.filter((sample) => !sample.muted && sample.volume > 0);
|
|
114
|
+
}
|
|
115
|
+
replaceClip(next) {
|
|
116
|
+
const index = this.clipsRef.findIndex((clip) => clip.id === next.id);
|
|
117
|
+
if (index < 0) {
|
|
118
|
+
throw new Error(`Unknown audio timeline clip: ${next.id}`);
|
|
119
|
+
}
|
|
120
|
+
this.clipsRef[index] = next;
|
|
121
|
+
this.sortClips();
|
|
122
|
+
}
|
|
123
|
+
sortClips() {
|
|
124
|
+
this.clipsRef.sort(compareTimelineClips);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
export function defaultAudioTimelineBusForRole(role) {
|
|
128
|
+
if (role === "dialogue")
|
|
129
|
+
return "voice";
|
|
130
|
+
if (role === "sfx")
|
|
131
|
+
return "sfx";
|
|
132
|
+
return role;
|
|
133
|
+
}
|
|
134
|
+
export function createAudioTimelineMixSnapshot(tracks, time, options = {}) {
|
|
135
|
+
const soloTracks = tracks.filter((track) => track.solo);
|
|
136
|
+
const candidateTracks = soloTracks.length > 0 ? soloTracks : tracks;
|
|
137
|
+
const activeSamples = candidateTracks.flatMap((track) => track.sampleAt(time));
|
|
138
|
+
const dialogueActive = activeSamples.some((sample) => sample.role === "dialogue" && sample.volume > 0);
|
|
139
|
+
const duckingApplied = dialogueActive && options.duckMusicDuringDialogue !== false;
|
|
140
|
+
const mutedBuses = new Set(options.mutedBuses ?? []);
|
|
141
|
+
const soloBuses = new Set(options.soloBuses ?? []);
|
|
142
|
+
const hasSoloBus = soloBuses.size > 0;
|
|
143
|
+
const busByName = new Map();
|
|
144
|
+
busByName.set("master", {
|
|
145
|
+
busName: "master",
|
|
146
|
+
role: "master",
|
|
147
|
+
volume: validateVolume(options.masterVolume ?? 1, "Audio timeline master volume"),
|
|
148
|
+
muted: mutedBuses.has("master"),
|
|
149
|
+
solo: soloBuses.has("master"),
|
|
150
|
+
ducked: false
|
|
151
|
+
});
|
|
152
|
+
for (const track of tracks) {
|
|
153
|
+
const configuredVolume = options.busVolumes?.[track.busName] ?? track.volume;
|
|
154
|
+
const ducked = duckingApplied && track.role === "music";
|
|
155
|
+
const volume = validateVolume(configuredVolume, `Audio timeline bus ${track.busName} volume`)
|
|
156
|
+
* (ducked ? validateDuckingRatio(options.duckingRatio ?? 0.35) : 1);
|
|
157
|
+
const muted = track.muted || mutedBuses.has(track.busName) || (hasSoloBus && !soloBuses.has(track.busName));
|
|
158
|
+
busByName.set(track.busName, {
|
|
159
|
+
busName: track.busName,
|
|
160
|
+
role: track.role,
|
|
161
|
+
volume,
|
|
162
|
+
muted,
|
|
163
|
+
solo: soloBuses.has(track.busName),
|
|
164
|
+
ducked
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
return {
|
|
168
|
+
time: validateNonNegative(time, "Audio timeline mix snapshot time"),
|
|
169
|
+
activeSamples: activeSamples.filter((sample) => {
|
|
170
|
+
const bus = busByName.get(sample.busName);
|
|
171
|
+
return bus ? !bus.muted && bus.volume > 0 : true;
|
|
172
|
+
}),
|
|
173
|
+
buses: [...busByName.values()].sort((a, b) => a.busName.localeCompare(b.busName)),
|
|
174
|
+
dialogueActive,
|
|
175
|
+
duckingApplied
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
export function validateAudioCaptionSync(tracks, captions, options = {}) {
|
|
179
|
+
const frameRate = finitePositive(options.frameRate ?? 30, "Audio caption sync frameRate");
|
|
180
|
+
const toleranceFrames = Math.max(0, Math.floor(options.toleranceFrames ?? 1));
|
|
181
|
+
const dialogueClips = tracks
|
|
182
|
+
.filter((track) => track.role === "dialogue")
|
|
183
|
+
.flatMap((track) => track.clips.map((clip) => ({ track, clip })));
|
|
184
|
+
const issues = [];
|
|
185
|
+
for (const cue of captions) {
|
|
186
|
+
const cueStart = validateNonNegative(cue.startTime, "Audio caption cue startTime");
|
|
187
|
+
const cueEnd = validateNonNegative(cue.endTime, "Audio caption cue endTime");
|
|
188
|
+
if (cueEnd <= cueStart) {
|
|
189
|
+
issues.push({
|
|
190
|
+
code: "caption-invalid-range",
|
|
191
|
+
cueId: cue.id,
|
|
192
|
+
message: `Caption "${cue.id}" endTime must be after startTime.`
|
|
193
|
+
});
|
|
194
|
+
continue;
|
|
195
|
+
}
|
|
196
|
+
const match = cue.audioClipId
|
|
197
|
+
? dialogueClips.find(({ clip }) => clip.id === cue.audioClipId)
|
|
198
|
+
: dialogueClips.find(({ clip }) => Math.abs((clip.startTime - cueStart) * frameRate) <= toleranceFrames);
|
|
199
|
+
if (!match) {
|
|
200
|
+
issues.push({
|
|
201
|
+
code: "caption-audio-clip-missing",
|
|
202
|
+
cueId: cue.id,
|
|
203
|
+
clipId: cue.audioClipId,
|
|
204
|
+
message: `Caption "${cue.id}" has no matching dialogue audio clip.`
|
|
205
|
+
});
|
|
206
|
+
continue;
|
|
207
|
+
}
|
|
208
|
+
const startDeltaFrames = Math.abs((match.clip.startTime - cueStart) * frameRate);
|
|
209
|
+
const endDeltaFrames = Math.abs((match.clip.startTime + match.clip.duration - cueEnd) * frameRate);
|
|
210
|
+
if (startDeltaFrames > toleranceFrames) {
|
|
211
|
+
issues.push({
|
|
212
|
+
code: "caption-audio-start-out-of-sync",
|
|
213
|
+
cueId: cue.id,
|
|
214
|
+
clipId: match.clip.id,
|
|
215
|
+
deltaFrames: startDeltaFrames,
|
|
216
|
+
message: `Caption "${cue.id}" starts ${startDeltaFrames.toFixed(2)} frames away from dialogue clip "${match.clip.id}".`
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
if (endDeltaFrames > toleranceFrames) {
|
|
220
|
+
issues.push({
|
|
221
|
+
code: "caption-audio-end-out-of-sync",
|
|
222
|
+
cueId: cue.id,
|
|
223
|
+
clipId: match.clip.id,
|
|
224
|
+
deltaFrames: endDeltaFrames,
|
|
225
|
+
message: `Caption "${cue.id}" ends ${endDeltaFrames.toFixed(2)} frames away from dialogue clip "${match.clip.id}".`
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
return {
|
|
230
|
+
ok: issues.length === 0,
|
|
231
|
+
frameRate,
|
|
232
|
+
toleranceFrames,
|
|
233
|
+
checkedCueCount: captions.length,
|
|
234
|
+
issues
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
function createAudioTimelineClip(options, fallbackBusName) {
|
|
238
|
+
const id = nonEmpty(options.id, "Audio timeline clip id");
|
|
239
|
+
const sourceDuration = validateSourceDuration(options);
|
|
240
|
+
const trimStart = validateNonNegative(options.trimStart ?? 0, "Audio timeline clip trimStart");
|
|
241
|
+
const trimEnd = validateNonNegative(options.trimEnd ?? sourceDuration, "Audio timeline clip trimEnd");
|
|
242
|
+
if (trimEnd <= trimStart || trimEnd > sourceDuration) {
|
|
243
|
+
throw new Error("Audio timeline clip trim range must be inside the source duration");
|
|
244
|
+
}
|
|
245
|
+
const duration = validateNonNegative(options.duration ?? (trimEnd - trimStart), "Audio timeline clip duration");
|
|
246
|
+
if (duration <= 0) {
|
|
247
|
+
throw new Error("Audio timeline clip duration must be greater than zero");
|
|
248
|
+
}
|
|
249
|
+
return {
|
|
250
|
+
id,
|
|
251
|
+
...(options.clip ? { clip: options.clip } : {}),
|
|
252
|
+
...(options.assetId ? { assetId: options.assetId } : {}),
|
|
253
|
+
...(options.sourceUrl ? { sourceUrl: options.sourceUrl } : {}),
|
|
254
|
+
...(options.waveform ? { waveform: options.waveform } : {}),
|
|
255
|
+
startTime: validateNonNegative(options.startTime, "Audio timeline clip startTime"),
|
|
256
|
+
duration,
|
|
257
|
+
trimStart,
|
|
258
|
+
trimEnd,
|
|
259
|
+
sourceDuration,
|
|
260
|
+
volume: validateVolume(options.volume ?? 1, "Audio timeline clip volume"),
|
|
261
|
+
muted: options.muted ?? false,
|
|
262
|
+
loop: options.loop ?? false,
|
|
263
|
+
busName: options.busName ?? fallbackBusName,
|
|
264
|
+
envelope: sortEnvelope(options.envelope ?? [])
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
function validateSourceDuration(options) {
|
|
268
|
+
const sourceDuration = options.clip?.duration ?? options.waveform?.duration ?? options.duration;
|
|
269
|
+
if (sourceDuration === undefined) {
|
|
270
|
+
throw new Error("Audio timeline clip requires a clip, waveform, or explicit duration");
|
|
271
|
+
}
|
|
272
|
+
return finitePositive(sourceDuration, "Audio timeline clip source duration");
|
|
273
|
+
}
|
|
274
|
+
function createTimelineSample(track, clip, timelineTime) {
|
|
275
|
+
const localTime = timelineTime - clip.startTime;
|
|
276
|
+
const sourceWindow = clip.trimEnd - clip.trimStart;
|
|
277
|
+
const sourceOffset = clip.loop ? localTime % sourceWindow : Math.min(localTime, sourceWindow);
|
|
278
|
+
const sourceTime = clip.trimStart + sourceOffset;
|
|
279
|
+
return {
|
|
280
|
+
trackId: track.id,
|
|
281
|
+
clipId: clip.id,
|
|
282
|
+
role: track.role,
|
|
283
|
+
busName: clip.busName,
|
|
284
|
+
timelineTime,
|
|
285
|
+
localTime,
|
|
286
|
+
sourceTime,
|
|
287
|
+
volume: track.volume * clip.volume * envelopeValueAt(clip.envelope, localTime),
|
|
288
|
+
muted: track.muted || clip.muted,
|
|
289
|
+
clip
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
function clipContainsTimelineTime(clip, time) {
|
|
293
|
+
return time >= clip.startTime && time < clip.startTime + clip.duration;
|
|
294
|
+
}
|
|
295
|
+
function envelopeValueAt(envelope, time) {
|
|
296
|
+
if (envelope.length === 0)
|
|
297
|
+
return 1;
|
|
298
|
+
if (time <= envelope[0].time)
|
|
299
|
+
return envelope[0].value;
|
|
300
|
+
for (let index = 1; index < envelope.length; index++) {
|
|
301
|
+
const previous = envelope[index - 1];
|
|
302
|
+
const next = envelope[index];
|
|
303
|
+
if (time <= next.time) {
|
|
304
|
+
const span = next.time - previous.time;
|
|
305
|
+
const alpha = span <= 0 ? 0 : (time - previous.time) / span;
|
|
306
|
+
return previous.value + (next.value - previous.value) * alpha;
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
return envelope[envelope.length - 1].value;
|
|
310
|
+
}
|
|
311
|
+
function sortEnvelope(envelope) {
|
|
312
|
+
return envelope
|
|
313
|
+
.map((point) => ({
|
|
314
|
+
time: validateNonNegative(point.time, "Audio timeline envelope time"),
|
|
315
|
+
value: validateVolume(point.value, "Audio timeline envelope value")
|
|
316
|
+
}))
|
|
317
|
+
.sort((a, b) => a.time - b.time);
|
|
318
|
+
}
|
|
319
|
+
function shiftEnvelope(envelope, delta) {
|
|
320
|
+
return sortEnvelope(envelope.map((point) => ({ ...point, time: Math.max(0, point.time + delta) })));
|
|
321
|
+
}
|
|
322
|
+
function compareTimelineClips(left, right) {
|
|
323
|
+
return left.startTime - right.startTime || left.id.localeCompare(right.id);
|
|
324
|
+
}
|
|
325
|
+
function nonEmpty(value, label) {
|
|
326
|
+
const trimmed = value.trim();
|
|
327
|
+
if (!trimmed) {
|
|
328
|
+
throw new Error(`${label} must be a non-empty string`);
|
|
329
|
+
}
|
|
330
|
+
return trimmed;
|
|
331
|
+
}
|
|
332
|
+
function finitePositive(value, label) {
|
|
333
|
+
if (!Number.isFinite(value) || value <= 0) {
|
|
334
|
+
throw new Error(`${label} must be a positive finite number`);
|
|
335
|
+
}
|
|
336
|
+
return value;
|
|
337
|
+
}
|
|
338
|
+
function validateNonNegative(value, label) {
|
|
339
|
+
if (!Number.isFinite(value) || value < 0) {
|
|
340
|
+
throw new Error(`${label} must be a non-negative finite number`);
|
|
341
|
+
}
|
|
342
|
+
return value;
|
|
343
|
+
}
|
|
344
|
+
function validateVolume(value, label) {
|
|
345
|
+
if (!Number.isFinite(value) || value < 0) {
|
|
346
|
+
throw new Error(`${label} must be a non-negative finite number`);
|
|
347
|
+
}
|
|
348
|
+
return value;
|
|
349
|
+
}
|
|
350
|
+
function validateDuckingRatio(value) {
|
|
351
|
+
if (!Number.isFinite(value) || value < 0 || value > 1) {
|
|
352
|
+
throw new Error("Audio timeline duckingRatio must be between 0 and 1");
|
|
353
|
+
}
|
|
354
|
+
return value;
|
|
355
|
+
}
|
|
356
|
+
//# sourceMappingURL=AudioTimelineTrack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AudioTimelineTrack.js","sourceRoot":"","sources":["../../../../packages/audio/src/AudioTimelineTrack.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import type { AudioClip } from "./AudioClip";
|
|
2
|
+
export interface AudioWaveformOptions {
|
|
3
|
+
readonly peakCount?: number;
|
|
4
|
+
readonly samplesPerPeak?: number;
|
|
5
|
+
readonly channel?: number | "mix";
|
|
6
|
+
readonly normalize?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export interface AudioWaveformPeak {
|
|
9
|
+
readonly min: number;
|
|
10
|
+
readonly max: number;
|
|
11
|
+
readonly rms: number;
|
|
12
|
+
}
|
|
13
|
+
export interface AudioWaveformData {
|
|
14
|
+
readonly duration: number;
|
|
15
|
+
readonly sampleRate: number;
|
|
16
|
+
readonly channels: number;
|
|
17
|
+
readonly peakCount: number;
|
|
18
|
+
readonly samplesPerPeak: number;
|
|
19
|
+
readonly normalized: boolean;
|
|
20
|
+
readonly peaks: readonly AudioWaveformPeak[];
|
|
21
|
+
}
|
|
22
|
+
export interface AudioWaveformPathPoint {
|
|
23
|
+
readonly x: number;
|
|
24
|
+
readonly yMin: number;
|
|
25
|
+
readonly yMax: number;
|
|
26
|
+
readonly rmsHeight: number;
|
|
27
|
+
}
|
|
28
|
+
export interface AudioWaveformPathOptions {
|
|
29
|
+
readonly width: number;
|
|
30
|
+
readonly height: number;
|
|
31
|
+
readonly padding?: number;
|
|
32
|
+
}
|
|
33
|
+
export interface AudioWaveformReviewStem {
|
|
34
|
+
readonly id: string;
|
|
35
|
+
readonly label?: string;
|
|
36
|
+
readonly startTime: number;
|
|
37
|
+
readonly waveform: AudioWaveformData;
|
|
38
|
+
}
|
|
39
|
+
export interface AudioWaveformReviewStemView {
|
|
40
|
+
readonly id: string;
|
|
41
|
+
readonly label: string;
|
|
42
|
+
readonly startTime: number;
|
|
43
|
+
readonly duration: number;
|
|
44
|
+
readonly peakCount: number;
|
|
45
|
+
readonly path: readonly AudioWaveformPathPoint[];
|
|
46
|
+
}
|
|
47
|
+
export interface AudioWaveformReviewData {
|
|
48
|
+
readonly kind: "audio-waveform-review-data";
|
|
49
|
+
readonly stemCount: number;
|
|
50
|
+
readonly width: number;
|
|
51
|
+
readonly height: number;
|
|
52
|
+
readonly stems: readonly AudioWaveformReviewStemView[];
|
|
53
|
+
}
|
|
54
|
+
export type AudioWaveformInput = AudioBuffer | AudioClip;
|
|
55
|
+
export declare function createAudioWaveform(input: AudioWaveformInput, options?: AudioWaveformOptions): AudioWaveformData;
|
|
56
|
+
export declare function sampleAudioWaveformAtTime(waveform: AudioWaveformData, timeSeconds: number): AudioWaveformPeak;
|
|
57
|
+
export declare function createAudioWaveformPath(waveform: AudioWaveformData, options: AudioWaveformPathOptions): readonly AudioWaveformPathPoint[];
|
|
58
|
+
export declare function createAudioWaveformReviewData(stems: readonly AudioWaveformReviewStem[], options: AudioWaveformPathOptions): AudioWaveformReviewData;
|
|
59
|
+
export declare function audioWaveformPeakRange(waveform: AudioWaveformData): {
|
|
60
|
+
readonly min: number;
|
|
61
|
+
readonly max: number;
|
|
62
|
+
readonly rmsMax: number;
|
|
63
|
+
};
|
|
64
|
+
//# sourceMappingURL=AudioWaveform.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AudioWaveform.d.ts","sourceRoot":"","sources":["../../../../packages/audio/src/AudioWaveform.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
export function createAudioWaveform(input, options = {}) {
|
|
2
|
+
const buffer = audioBufferFromInput(input);
|
|
3
|
+
const channels = buffer.numberOfChannels;
|
|
4
|
+
const sampleRate = finitePositive(buffer.sampleRate, "sampleRate");
|
|
5
|
+
const duration = Math.max(0, buffer.duration);
|
|
6
|
+
const totalSamples = Math.max(0, Math.round(duration * sampleRate));
|
|
7
|
+
const samplesPerPeak = resolveSamplesPerPeak(totalSamples, options);
|
|
8
|
+
const peakCount = totalSamples === 0 ? 0 : Math.ceil(totalSamples / samplesPerPeak);
|
|
9
|
+
const peaks = [];
|
|
10
|
+
const sourceChannels = collectWaveformChannels(buffer, options.channel ?? "mix");
|
|
11
|
+
for (let peakIndex = 0; peakIndex < peakCount; peakIndex++) {
|
|
12
|
+
const start = peakIndex * samplesPerPeak;
|
|
13
|
+
const end = Math.min(totalSamples, start + samplesPerPeak);
|
|
14
|
+
let min = 0;
|
|
15
|
+
let max = 0;
|
|
16
|
+
let sumSquares = 0;
|
|
17
|
+
let sampleCount = 0;
|
|
18
|
+
for (let sampleIndex = start; sampleIndex < end; sampleIndex++) {
|
|
19
|
+
let value = 0;
|
|
20
|
+
for (const channel of sourceChannels) {
|
|
21
|
+
value += channel[sampleIndex] ?? 0;
|
|
22
|
+
}
|
|
23
|
+
value /= sourceChannels.length;
|
|
24
|
+
min = Math.min(min, value);
|
|
25
|
+
max = Math.max(max, value);
|
|
26
|
+
sumSquares += value * value;
|
|
27
|
+
sampleCount++;
|
|
28
|
+
}
|
|
29
|
+
peaks.push({
|
|
30
|
+
min,
|
|
31
|
+
max,
|
|
32
|
+
rms: sampleCount === 0 ? 0 : Math.sqrt(sumSquares / sampleCount)
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
const normalize = options.normalize ?? false;
|
|
36
|
+
const outputPeaks = normalize ? normalizePeaks(peaks) : peaks;
|
|
37
|
+
return {
|
|
38
|
+
duration,
|
|
39
|
+
sampleRate,
|
|
40
|
+
channels,
|
|
41
|
+
peakCount: outputPeaks.length,
|
|
42
|
+
samplesPerPeak,
|
|
43
|
+
normalized: normalize,
|
|
44
|
+
peaks: outputPeaks
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
export function sampleAudioWaveformAtTime(waveform, timeSeconds) {
|
|
48
|
+
if (waveform.peaks.length === 0 || waveform.duration <= 0) {
|
|
49
|
+
return { min: 0, max: 0, rms: 0 };
|
|
50
|
+
}
|
|
51
|
+
const normalizedTime = clamp(timeSeconds / waveform.duration, 0, 1);
|
|
52
|
+
const index = Math.min(waveform.peaks.length - 1, Math.floor(normalizedTime * waveform.peaks.length));
|
|
53
|
+
return waveform.peaks[index] ?? { min: 0, max: 0, rms: 0 };
|
|
54
|
+
}
|
|
55
|
+
export function createAudioWaveformPath(waveform, options) {
|
|
56
|
+
const width = finitePositive(options.width, "width");
|
|
57
|
+
const height = finitePositive(options.height, "height");
|
|
58
|
+
const padding = Math.max(0, options.padding ?? 0);
|
|
59
|
+
const drawableHeight = Math.max(1, height - padding * 2);
|
|
60
|
+
const centerY = padding + drawableHeight / 2;
|
|
61
|
+
const halfHeight = drawableHeight / 2;
|
|
62
|
+
const denominator = Math.max(1, waveform.peaks.length - 1);
|
|
63
|
+
return waveform.peaks.map((peak, index) => ({
|
|
64
|
+
x: waveform.peaks.length === 1 ? width / 2 : index / denominator * width,
|
|
65
|
+
yMin: centerY - clamp(peak.max, -1, 1) * halfHeight,
|
|
66
|
+
yMax: centerY - clamp(peak.min, -1, 1) * halfHeight,
|
|
67
|
+
rmsHeight: clamp(peak.rms, 0, 1) * halfHeight
|
|
68
|
+
}));
|
|
69
|
+
}
|
|
70
|
+
export function createAudioWaveformReviewData(stems, options) {
|
|
71
|
+
const width = finitePositive(options.width, "width");
|
|
72
|
+
const height = finitePositive(options.height, "height");
|
|
73
|
+
return {
|
|
74
|
+
kind: "audio-waveform-review-data",
|
|
75
|
+
stemCount: stems.length,
|
|
76
|
+
width,
|
|
77
|
+
height,
|
|
78
|
+
stems: stems.map((stem) => ({
|
|
79
|
+
id: stem.id,
|
|
80
|
+
label: stem.label ?? stem.id,
|
|
81
|
+
startTime: Math.max(0, stem.startTime),
|
|
82
|
+
duration: stem.waveform.duration,
|
|
83
|
+
peakCount: stem.waveform.peakCount,
|
|
84
|
+
path: createAudioWaveformPath(stem.waveform, { ...options, width, height })
|
|
85
|
+
}))
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
export function audioWaveformPeakRange(waveform) {
|
|
89
|
+
let min = 0;
|
|
90
|
+
let max = 0;
|
|
91
|
+
let rmsMax = 0;
|
|
92
|
+
for (const peak of waveform.peaks) {
|
|
93
|
+
min = Math.min(min, peak.min);
|
|
94
|
+
max = Math.max(max, peak.max);
|
|
95
|
+
rmsMax = Math.max(rmsMax, peak.rms);
|
|
96
|
+
}
|
|
97
|
+
return { min, max, rmsMax };
|
|
98
|
+
}
|
|
99
|
+
function audioBufferFromInput(input) {
|
|
100
|
+
return "buffer" in input ? input.buffer : input;
|
|
101
|
+
}
|
|
102
|
+
function resolveSamplesPerPeak(totalSamples, options) {
|
|
103
|
+
if (options.samplesPerPeak !== undefined) {
|
|
104
|
+
return Math.max(1, Math.floor(finitePositive(options.samplesPerPeak, "samplesPerPeak")));
|
|
105
|
+
}
|
|
106
|
+
if (options.peakCount !== undefined) {
|
|
107
|
+
const peakCount = Math.max(1, Math.floor(finitePositive(options.peakCount, "peakCount")));
|
|
108
|
+
return Math.max(1, Math.ceil(totalSamples / peakCount));
|
|
109
|
+
}
|
|
110
|
+
return Math.max(1, Math.ceil(totalSamples / 1024));
|
|
111
|
+
}
|
|
112
|
+
function collectWaveformChannels(buffer, channel) {
|
|
113
|
+
if (buffer.numberOfChannels <= 0) {
|
|
114
|
+
throw new Error("Audio waveform requires at least one channel");
|
|
115
|
+
}
|
|
116
|
+
if (channel === "mix") {
|
|
117
|
+
return Array.from({ length: buffer.numberOfChannels }, (_, index) => buffer.getChannelData(index));
|
|
118
|
+
}
|
|
119
|
+
if (!Number.isInteger(channel) || channel < 0 || channel >= buffer.numberOfChannels) {
|
|
120
|
+
throw new Error(`Audio waveform channel ${channel} is outside the buffer channel range`);
|
|
121
|
+
}
|
|
122
|
+
return [buffer.getChannelData(channel)];
|
|
123
|
+
}
|
|
124
|
+
function normalizePeaks(peaks) {
|
|
125
|
+
let maxAbs = 0;
|
|
126
|
+
for (const peak of peaks) {
|
|
127
|
+
maxAbs = Math.max(maxAbs, Math.abs(peak.min), Math.abs(peak.max), peak.rms);
|
|
128
|
+
}
|
|
129
|
+
if (maxAbs <= 0)
|
|
130
|
+
return peaks;
|
|
131
|
+
return peaks.map((peak) => ({
|
|
132
|
+
min: peak.min / maxAbs,
|
|
133
|
+
max: peak.max / maxAbs,
|
|
134
|
+
rms: peak.rms / maxAbs
|
|
135
|
+
}));
|
|
136
|
+
}
|
|
137
|
+
function finitePositive(value, label) {
|
|
138
|
+
if (!Number.isFinite(value) || value <= 0) {
|
|
139
|
+
throw new Error(`Audio waveform ${label} must be a positive finite number`);
|
|
140
|
+
}
|
|
141
|
+
return value;
|
|
142
|
+
}
|
|
143
|
+
function clamp(value, min, max) {
|
|
144
|
+
return Math.min(max, Math.max(min, value));
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=AudioWaveform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AudioWaveform.js","sourceRoot":"","sources":["../../../../packages/audio/src/AudioWaveform.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
export { AudioBus } from "./AudioBus";
|
|
2
2
|
export { AudioClip } from "./AudioClip";
|
|
3
3
|
export type { AudioClipOptions } from "./AudioClip";
|
|
4
|
+
export { AudioFileManager, validateEpisodeAudioAssets } from "./AudioFileManager";
|
|
5
|
+
export type { AudioDecodeContextLike, EpisodeAudioAssetDiagnostic, EpisodeAudioAssetReadiness, EpisodeAudioAssetRequirement, AudioFileAssetLike, AudioFileFetchResponseLike, AudioFileInput, AudioFileManagerOptions, AudioFileRequest, ResolvedAudioFileRequest } from "./AudioFileManager";
|
|
6
|
+
export { createAudioTimelineMixSnapshot, defaultAudioTimelineBusForRole, validateAudioCaptionSync, AudioTimelineTrack } from "./AudioTimelineTrack";
|
|
7
|
+
export type { AudioCaptionCue, AudioCaptionSyncIssue, AudioCaptionSyncReport, AudioTimelineBusMix, AudioTimelineClip, AudioTimelineClipOptions, AudioTimelineEnvelopePoint, AudioTimelineMixOptions, AudioTimelineMixSnapshot, AudioTimelineSample, AudioTimelineTrackOptions, AudioTimelineTrackRole } from "./AudioTimelineTrack";
|
|
8
|
+
export { audioWaveformPeakRange, createAudioWaveform, createAudioWaveformPath, createAudioWaveformReviewData, sampleAudioWaveformAtTime } from "./AudioWaveform";
|
|
9
|
+
export type { AudioWaveformData, AudioWaveformInput, AudioWaveformOptions, AudioWaveformPathOptions, AudioWaveformPathPoint, AudioWaveformPeak, AudioWaveformReviewData, AudioWaveformReviewStem, AudioWaveformReviewStemView } from "./AudioWaveform";
|
|
4
10
|
export { sampleAudioEffectsAnalysisFixture } from "./AudioEffectsAnalysisFixtures";
|
|
5
11
|
export type { AudioChorusPreset, AudioCompressorPreset, AudioDelayPreset, AudioDistortionCurve, AudioEffectsAnalysisFixture, AudioEffectsAnalysisFixtureOptions, AudioEqBandFixture, AudioSpectrumBandFixture } from "./AudioEffectsAnalysisFixtures";
|
|
6
12
|
export { sampleAdaptiveMusicFixture } from "./AdaptiveMusicFixtures";
|
|
@@ -12,7 +18,8 @@ export type { AudioContextLike, AudioContextManagerOptions, AudioContextState }
|
|
|
12
18
|
export type { AudioEffect } from "./AudioEffect";
|
|
13
19
|
export { AudioListener } from "./AudioListener";
|
|
14
20
|
export type { Vec3Like } from "./AudioListener";
|
|
15
|
-
export { AudioMixer } from "./AudioMixer";
|
|
21
|
+
export { AudioMixer, createAudioMixerEvidence, createCartoonAudioMixer } from "./AudioMixer";
|
|
22
|
+
export type { AudioMixerBusEvidence, AudioMixerEvidence, CartoonAudioMixer, CartoonAudioMixerOptions } from "./AudioMixer";
|
|
16
23
|
export { AudioSource } from "./AudioSource";
|
|
17
24
|
export type { AudioSourceOptions, AudioSourceState } from "./AudioSource";
|
|
18
25
|
export { AudioSystem } from "./AudioSystem";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../packages/audio/src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,iCAAiC,EAAE,MAAM,gCAAgC,CAAC;AACnF,YAAY,EACV,iBAAiB,EACjB,qBAAqB,EACrB,gBAAgB,EAChB,oBAAoB,EACpB,2BAA2B,EAC3B,kCAAkC,EAClC,kBAAkB,EAClB,wBAAwB,EACzB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AACrE,YAAY,EAAE,2BAA2B,EAAE,oBAAoB,EAAE,2BAA2B,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChL,OAAO,EAAE,6BAA6B,EAAE,MAAM,wBAAwB,CAAC;AACvE,YAAY,EAAE,uBAAuB,EAAE,8BAA8B,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC3H,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,YAAY,EAAE,gBAAgB,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC7G,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../packages/audio/src/index.ts"],"names":[],"mappings":"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"}
|