@aura3d/audio 3.0.0 → 4.0.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/AudioSource.d.ts +7 -0
- package/dist/AudioSource.d.ts.map +1 -1
- package/dist/AudioSource.js +21 -0
- package/dist/AudioSource.js.map +1 -1
- package/dist/PositionalEmitter.js +1 -1
- package/dist/PositionalEmitter.js.map +1 -1
- package/dist/contracts/gameSound.d.ts +94 -0
- package/dist/contracts/gameSound.d.ts.map +1 -0
- package/dist/contracts/gameSound.js +63 -0
- package/dist/contracts/gameSound.js.map +1 -0
- package/dist/game-sound/EngineLoop.d.ts +44 -0
- package/dist/game-sound/EngineLoop.d.ts.map +1 -0
- package/dist/game-sound/EngineLoop.js +114 -0
- package/dist/game-sound/EngineLoop.js.map +1 -0
- package/dist/game-sound/GameSoundEngine.d.ts +129 -0
- package/dist/game-sound/GameSoundEngine.d.ts.map +1 -0
- package/dist/game-sound/GameSoundEngine.js +563 -0
- package/dist/game-sound/GameSoundEngine.js.map +1 -0
- package/dist/game-sound/LoopHandle.d.ts +30 -0
- package/dist/game-sound/LoopHandle.d.ts.map +1 -0
- package/dist/game-sound/LoopHandle.js +78 -0
- package/dist/game-sound/LoopHandle.js.map +1 -0
- package/dist/game-sound/MasterChain.d.ts +57 -0
- package/dist/game-sound/MasterChain.d.ts.map +1 -0
- package/dist/game-sound/MasterChain.js +144 -0
- package/dist/game-sound/MasterChain.js.map +1 -0
- package/dist/game-sound/MusicController.d.ts +59 -0
- package/dist/game-sound/MusicController.d.ts.map +1 -0
- package/dist/game-sound/MusicController.js +210 -0
- package/dist/game-sound/MusicController.js.map +1 -0
- package/dist/game-sound/ReverbSend.d.ts +30 -0
- package/dist/game-sound/ReverbSend.d.ts.map +1 -0
- package/dist/game-sound/ReverbSend.js +69 -0
- package/dist/game-sound/ReverbSend.js.map +1 -0
- package/dist/game-sound/SpatialVoice.d.ts +30 -0
- package/dist/game-sound/SpatialVoice.d.ts.map +1 -0
- package/dist/game-sound/SpatialVoice.js +115 -0
- package/dist/game-sound/SpatialVoice.js.map +1 -0
- package/dist/game-sound/Voice.d.ts +139 -0
- package/dist/game-sound/Voice.d.ts.map +1 -0
- package/dist/game-sound/Voice.js +319 -0
- package/dist/game-sound/Voice.js.map +1 -0
- package/dist/game-sound/formatProbe.d.ts +19 -0
- package/dist/game-sound/formatProbe.d.ts.map +1 -0
- package/dist/game-sound/formatProbe.js +36 -0
- package/dist/game-sound/formatProbe.js.map +1 -0
- package/dist/game-sound/listenerSync.d.ts +55 -0
- package/dist/game-sound/listenerSync.d.ts.map +1 -0
- package/dist/game-sound/listenerSync.js +37 -0
- package/dist/game-sound/listenerSync.js.map +1 -0
- package/dist/game-sound/loudness.d.ts +35 -0
- package/dist/game-sound/loudness.d.ts.map +1 -0
- package/dist/game-sound/loudness.js +135 -0
- package/dist/game-sound/loudness.js.map +1 -0
- package/dist/game-sound/rng.d.ts +26 -0
- package/dist/game-sound/rng.d.ts.map +1 -0
- package/dist/game-sound/rng.js +57 -0
- package/dist/game-sound/rng.js.map +1 -0
- package/dist/game-sound/types.d.ts +96 -0
- package/dist/game-sound/types.d.ts.map +1 -0
- package/dist/game-sound/types.js +19 -0
- package/dist/game-sound/types.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* game-sound/loudness.ts — BS.1770-style loudness metering for `aura3d sfx admit`
|
|
3
|
+
* (PRD-09 1736 / §6.9 mastering targets).
|
|
4
|
+
*
|
|
5
|
+
* The admission pipeline decodes each source file to PCM (ffmpeg on the remote
|
|
6
|
+
* runner) and calls `measureLoudness` here — pure TypeScript, no deps, so unit
|
|
7
|
+
* tests exercise the same math the CLI reports into the pack manifest.
|
|
8
|
+
*
|
|
9
|
+
* Integrated loudness: K-weighted mean square per 400 ms block (75% overlap),
|
|
10
|
+
* two-stage gating (−70 LUFS absolute, then −10 LU relative).
|
|
11
|
+
* True peak: 4× oversampling with a windowed-sinc interpolator, per BS.1770
|
|
12
|
+
* Annex 2. `truePeakDb` is in dBTP (≤ 0 for clips that don't exceed FS).
|
|
13
|
+
*/
|
|
14
|
+
/** A single biquad section, per-channel state. */
|
|
15
|
+
class Biquad {
|
|
16
|
+
b;
|
|
17
|
+
a;
|
|
18
|
+
z1 = 0;
|
|
19
|
+
z2 = 0;
|
|
20
|
+
constructor(b, a) {
|
|
21
|
+
this.b = b;
|
|
22
|
+
this.a = a;
|
|
23
|
+
}
|
|
24
|
+
process(x) {
|
|
25
|
+
const y = this.b[0] * x + this.z1;
|
|
26
|
+
this.z1 = this.b[1] * x - this.a[0] * y + this.z2;
|
|
27
|
+
this.z2 = this.b[2] * x - this.a[1] * y;
|
|
28
|
+
return y;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/** ITU-R BS.1770-5 coefficients for a 48 kHz reference (rescaled on other rates by bilinear design is approximated — near-48k rates stay within ~0.2 LU). */
|
|
32
|
+
const SHELF_48K = { b: [1.53512485958697, -2.69169618940638, 1.19839281085285], a: [-1.69065929318241, 0.73248077421585] };
|
|
33
|
+
const RLB_48K = { b: [1, -2, 1], a: [-1.99004745483398, 0.99007225036621] };
|
|
34
|
+
const BLOCK_SECONDS = 0.4;
|
|
35
|
+
const OVERLAP = 0.75;
|
|
36
|
+
const ABS_GATE_LUFS = -70;
|
|
37
|
+
const REL_GATE_LU = 10;
|
|
38
|
+
const kWeight = (channel) => {
|
|
39
|
+
const shelf = new Biquad(SHELF_48K.b, SHELF_48K.a);
|
|
40
|
+
const rlb = new Biquad(RLB_48K.b, RLB_48K.a);
|
|
41
|
+
const out = new Float32Array(channel.length);
|
|
42
|
+
for (let i = 0; i < channel.length; i++)
|
|
43
|
+
out[i] = rlb.process(shelf.process(channel[i]));
|
|
44
|
+
return out;
|
|
45
|
+
};
|
|
46
|
+
const channelWeights = (count) => {
|
|
47
|
+
// BS.1770 default weights: 1.0 for all channels except surround backs (1.41).
|
|
48
|
+
if (count > 6) {
|
|
49
|
+
const w = new Array(count).fill(1);
|
|
50
|
+
for (let i = 6; i < count; i++)
|
|
51
|
+
w[i] = 1.41;
|
|
52
|
+
return w;
|
|
53
|
+
}
|
|
54
|
+
return new Array(count).fill(1);
|
|
55
|
+
};
|
|
56
|
+
/** Windowed-sinc kernel for 4× true-peak interpolation (±8 taps, Hann window). */
|
|
57
|
+
const SINC_TAPS = 8;
|
|
58
|
+
const sinc = (x) => (x === 0 ? 1 : (Math.sin(Math.PI * x) / (Math.PI * x)) * (0.5 + 0.5 * Math.cos((Math.PI * x) / SINC_TAPS)));
|
|
59
|
+
const truePeakOf = (channel) => {
|
|
60
|
+
let peak = 0;
|
|
61
|
+
const n = channel.length;
|
|
62
|
+
for (let i = 0; i < n; i++) {
|
|
63
|
+
peak = Math.max(peak, Math.abs(channel[i]));
|
|
64
|
+
for (let f = 1; f < 4; f++) {
|
|
65
|
+
const t = i + f / 4;
|
|
66
|
+
let s = 0;
|
|
67
|
+
for (let k = -SINC_TAPS; k <= SINC_TAPS; k++) {
|
|
68
|
+
const j = Math.round(t) - k;
|
|
69
|
+
if (j >= 0 && j < n)
|
|
70
|
+
s += channel[j] * sinc(t - j);
|
|
71
|
+
}
|
|
72
|
+
peak = Math.max(peak, Math.abs(s));
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return peak;
|
|
76
|
+
};
|
|
77
|
+
export function measureLoudness(input) {
|
|
78
|
+
const { channels, sampleRate } = input;
|
|
79
|
+
const length = channels[0]?.length ?? 0;
|
|
80
|
+
const durationSeconds = length / sampleRate;
|
|
81
|
+
const block = Math.round(BLOCK_SECONDS * sampleRate);
|
|
82
|
+
const step = Math.max(1, Math.round(block * (1 - OVERLAP)));
|
|
83
|
+
const weighted = channels.map(kWeight);
|
|
84
|
+
const weights = channelWeights(channels.length);
|
|
85
|
+
const truePeakDb = 20 * Math.log10(Math.max(1e-12, Math.max(...channels.map(truePeakOf))));
|
|
86
|
+
if (length < block) {
|
|
87
|
+
return { lufs: Number.NEGATIVE_INFINITY, truePeakDb, durationSeconds };
|
|
88
|
+
}
|
|
89
|
+
// Momentary block energies per channel.
|
|
90
|
+
const blockLoudness = [];
|
|
91
|
+
for (let start = 0; start + block <= length; start += step) {
|
|
92
|
+
let sum = 0;
|
|
93
|
+
for (let c = 0; c < weighted.length; c++) {
|
|
94
|
+
let acc = 0;
|
|
95
|
+
const ch = weighted[c];
|
|
96
|
+
for (let i = start; i < start + block; i++)
|
|
97
|
+
acc += ch[i] * ch[i];
|
|
98
|
+
sum += weights[c] * acc;
|
|
99
|
+
}
|
|
100
|
+
blockLoudness.push(sum / block);
|
|
101
|
+
}
|
|
102
|
+
const lufsOf = (z) => -0.691 + 10 * Math.log10(z);
|
|
103
|
+
const gated = blockLoudness.filter((z) => lufsOf(z) >= ABS_GATE_LUFS);
|
|
104
|
+
if (gated.length === 0)
|
|
105
|
+
return { lufs: Number.NEGATIVE_INFINITY, truePeakDb, durationSeconds };
|
|
106
|
+
const ungatedMean = gated.reduce((a, z) => a + z, 0) / gated.length;
|
|
107
|
+
const relGate = lufsOf(ungatedMean) - REL_GATE_LU;
|
|
108
|
+
const relGated = gated.filter((z) => lufsOf(z) > relGate);
|
|
109
|
+
const mean = relGated.length ? relGated.reduce((a, z) => a + z, 0) / relGated.length : ungatedMean;
|
|
110
|
+
return { lufs: lufsOf(mean), truePeakDb, durationSeconds };
|
|
111
|
+
}
|
|
112
|
+
export const MASTERING_TARGETS = {
|
|
113
|
+
"one-shot": { truePeakDb: -1 },
|
|
114
|
+
loop: { lufs: -20 },
|
|
115
|
+
ambience: { lufs: -20 },
|
|
116
|
+
music: { lufs: -16 }
|
|
117
|
+
};
|
|
118
|
+
/** Gain (dB) to apply so `measured` hits its class target. Returns 0 when nothing applies. */
|
|
119
|
+
export function gainForTarget(measured, cls) {
|
|
120
|
+
const target = MASTERING_TARGETS[cls];
|
|
121
|
+
let gain = 0;
|
|
122
|
+
if (target.truePeakDb !== undefined) {
|
|
123
|
+
const delta = target.truePeakDb - measured.truePeakDb;
|
|
124
|
+
gain = Number.isFinite(delta) ? delta : 0;
|
|
125
|
+
}
|
|
126
|
+
else if (target.lufs !== undefined && Number.isFinite(measured.lufs)) {
|
|
127
|
+
gain = target.lufs - measured.lufs;
|
|
128
|
+
}
|
|
129
|
+
// Never let a loudness boost push the file's true peak over −1 dBTP.
|
|
130
|
+
if (Number.isFinite(measured.truePeakDb)) {
|
|
131
|
+
gain = Math.min(gain, -1 - measured.truePeakDb);
|
|
132
|
+
}
|
|
133
|
+
return Math.round(gain * 100) / 100;
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=loudness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loudness.js","sourceRoot":"","sources":["../../../../../packages/audio/src/game-sound/loudness.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* game-sound/rng.ts — seeded jitter stream for deterministic captures (§6.8).
|
|
3
|
+
*
|
|
4
|
+
* One stream per engine instance, seeded from the session seed. Used for
|
|
5
|
+
* cue variant picks (round-robin without immediate repeats), pitch jitter
|
|
6
|
+
* (± semitones) and gain jitter (± dB).
|
|
7
|
+
*/
|
|
8
|
+
export type Rng = () => number;
|
|
9
|
+
export declare const mulberry32: (seed: number) => Rng;
|
|
10
|
+
/** Uniform value in [±range]. */
|
|
11
|
+
export declare const jitter: (rng: Rng, range: number) => number;
|
|
12
|
+
/**
|
|
13
|
+
* Pick a variant index in [0, count): round-robin order shuffled per cycle
|
|
14
|
+
* so picks never immediately repeat (when count > 1) and the sequence is
|
|
15
|
+
* deterministic for a seed.
|
|
16
|
+
*/
|
|
17
|
+
export declare class VariantPicker {
|
|
18
|
+
private readonly count;
|
|
19
|
+
private readonly rng;
|
|
20
|
+
private order;
|
|
21
|
+
private index;
|
|
22
|
+
constructor(count: number, rng: Rng);
|
|
23
|
+
next(): number;
|
|
24
|
+
private shuffle;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=rng.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rng.d.ts","sourceRoot":"","sources":["../../../../../packages/audio/src/game-sound/rng.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC;AAE/B,eAAO,MAAM,UAAU,GAAI,MAAM,MAAM,KAAG,GASzC,CAAC;AAEF,iCAAiC;AACjC,eAAO,MAAM,MAAM,GAAI,KAAK,GAAG,EAAE,OAAO,MAAM,KAAG,MAAiC,CAAC;AAEnF;;;;GAIG;AACH,qBAAa,aAAa;IAIZ,OAAO,CAAC,QAAQ,CAAC,KAAK;IAAU,OAAO,CAAC,QAAQ,CAAC,GAAG;IAHhE,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,KAAK,CAAK;gBAEW,KAAK,EAAE,MAAM,EAAmB,GAAG,EAAE,GAAG;IAErE,IAAI,IAAI,MAAM;IASd,OAAO,CAAC,OAAO;CAahB"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* game-sound/rng.ts — seeded jitter stream for deterministic captures (§6.8).
|
|
3
|
+
*
|
|
4
|
+
* One stream per engine instance, seeded from the session seed. Used for
|
|
5
|
+
* cue variant picks (round-robin without immediate repeats), pitch jitter
|
|
6
|
+
* (± semitones) and gain jitter (± dB).
|
|
7
|
+
*/
|
|
8
|
+
export const mulberry32 = (seed) => {
|
|
9
|
+
let a = seed >>> 0;
|
|
10
|
+
return () => {
|
|
11
|
+
a |= 0;
|
|
12
|
+
a = (a + 0x6d2b79f5) | 0;
|
|
13
|
+
let t = Math.imul(a ^ (a >>> 15), 1 | a);
|
|
14
|
+
t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;
|
|
15
|
+
return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
/** Uniform value in [±range]. */
|
|
19
|
+
export const jitter = (rng, range) => (rng() * 2 - 1) * range;
|
|
20
|
+
/**
|
|
21
|
+
* Pick a variant index in [0, count): round-robin order shuffled per cycle
|
|
22
|
+
* so picks never immediately repeat (when count > 1) and the sequence is
|
|
23
|
+
* deterministic for a seed.
|
|
24
|
+
*/
|
|
25
|
+
export class VariantPicker {
|
|
26
|
+
count;
|
|
27
|
+
rng;
|
|
28
|
+
order = [];
|
|
29
|
+
index = 0;
|
|
30
|
+
constructor(count, rng) {
|
|
31
|
+
this.count = count;
|
|
32
|
+
this.rng = rng;
|
|
33
|
+
}
|
|
34
|
+
next() {
|
|
35
|
+
if (this.count <= 1)
|
|
36
|
+
return 0;
|
|
37
|
+
if (this.index >= this.order.length) {
|
|
38
|
+
this.shuffle();
|
|
39
|
+
this.index = 0;
|
|
40
|
+
}
|
|
41
|
+
return this.order[this.index++];
|
|
42
|
+
}
|
|
43
|
+
shuffle() {
|
|
44
|
+
const previous = this.order.length > 0 ? this.order[(this.index - 1 + this.order.length) % this.order.length] : -1;
|
|
45
|
+
this.order = Array.from({ length: this.count }, (_, i) => i);
|
|
46
|
+
for (let i = this.count - 1; i > 0; i--) {
|
|
47
|
+
const j = Math.floor(this.rng() * (i + 1));
|
|
48
|
+
[this.order[i], this.order[j]] = [this.order[j], this.order[i]];
|
|
49
|
+
}
|
|
50
|
+
// Never lead a new cycle with the variant that ended the last one.
|
|
51
|
+
if (this.order[0] === previous && this.count > 1) {
|
|
52
|
+
const swap = 1 + Math.floor(this.rng() * (this.count - 1));
|
|
53
|
+
[this.order[0], this.order[swap]] = [this.order[swap], this.order[0]];
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=rng.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rng.js","sourceRoot":"","sources":["../../../../../packages/audio/src/game-sound/rng.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* game-sound/types.ts — shared internals for the GameSoundEngine (PRD-09 §7.5).
|
|
3
|
+
*
|
|
4
|
+
* The engine is unit-tested with fake contexts, so every node factory it
|
|
5
|
+
* needs goes through `SoundGraphContext` — a widening of the package's
|
|
6
|
+
* `AudioContextLike` with the optional factories a real `AudioContext`
|
|
7
|
+
* supplies. Missing factories are handled per-feature (e.g. no
|
|
8
|
+
* `createWaveShaper` → the safety clip stage is skipped and reported).
|
|
9
|
+
*/
|
|
10
|
+
import type { AudioContextLike } from "../AudioContextManager.js";
|
|
11
|
+
export interface SoundGraphContext extends AudioContextLike {
|
|
12
|
+
createDynamicsCompressor?(): DynamicsCompressorNode;
|
|
13
|
+
createWaveShaper?(): WaveShaperNode;
|
|
14
|
+
createMediaElementSource?(element: HTMLMediaElement): MediaElementAudioSourceNode;
|
|
15
|
+
decodeAudioData?(data: ArrayBuffer): Promise<AudioBuffer>;
|
|
16
|
+
createBuffer?(numberOfChannels: number, length: number, sampleRate: number): AudioBuffer;
|
|
17
|
+
}
|
|
18
|
+
/** Any node a fake can satisfy — connect/disconnect are all the engine uses generically. */
|
|
19
|
+
export interface SoundNodeLike {
|
|
20
|
+
connect(destination: SoundNodeLike): SoundNodeLike;
|
|
21
|
+
disconnect(): void;
|
|
22
|
+
}
|
|
23
|
+
export interface SoundGainLike {
|
|
24
|
+
readonly gain: {
|
|
25
|
+
value: number;
|
|
26
|
+
setTargetAtTime?(v: number, t: number, tau: number): void;
|
|
27
|
+
cancelScheduledValues?(t: number): void;
|
|
28
|
+
setValueAtTime?(v: number, t: number): void;
|
|
29
|
+
linearRampToValueAtTime?(v: number, t: number): void;
|
|
30
|
+
};
|
|
31
|
+
connect(destination: SoundNodeLike): SoundNodeLike;
|
|
32
|
+
disconnect(): void;
|
|
33
|
+
}
|
|
34
|
+
export declare const dbToGain: (db: number) => number;
|
|
35
|
+
export declare const gainToDb: (gain: number) => number;
|
|
36
|
+
export declare const clamp: (v: number, lo: number, hi: number) => number;
|
|
37
|
+
/** Equal-power crossfade gain for mix m ∈ [0,1] (0 → full A, 1 → full B). */
|
|
38
|
+
export declare const equalPower: (m: number) => {
|
|
39
|
+
a: number;
|
|
40
|
+
b: number;
|
|
41
|
+
};
|
|
42
|
+
export type Vec3 = readonly [number, number, number] | {
|
|
43
|
+
x: number;
|
|
44
|
+
y: number;
|
|
45
|
+
z: number;
|
|
46
|
+
};
|
|
47
|
+
export declare const vec3: (v: Vec3) => {
|
|
48
|
+
x: number;
|
|
49
|
+
y: number;
|
|
50
|
+
z: number;
|
|
51
|
+
};
|
|
52
|
+
/** Panner interface as used by the engine (subset of `PannerNode`). */
|
|
53
|
+
export interface SoundPannerLike extends SoundNodeLike {
|
|
54
|
+
panningModel?: PanningModelType;
|
|
55
|
+
distanceModel?: DistanceModelType;
|
|
56
|
+
refDistance?: number;
|
|
57
|
+
maxDistance?: number;
|
|
58
|
+
rolloffFactor?: number;
|
|
59
|
+
positionX?: {
|
|
60
|
+
value: number;
|
|
61
|
+
setTargetAtTime?(v: number, t: number, tau: number): void;
|
|
62
|
+
};
|
|
63
|
+
positionY?: {
|
|
64
|
+
value: number;
|
|
65
|
+
setTargetAtTime?(v: number, t: number, tau: number): void;
|
|
66
|
+
};
|
|
67
|
+
positionZ?: {
|
|
68
|
+
value: number;
|
|
69
|
+
setTargetAtTime?(v: number, t: number, tau: number): void;
|
|
70
|
+
};
|
|
71
|
+
setPosition?(x: number, y: number, z: number): void;
|
|
72
|
+
setVelocity?(x: number, y: number, z: number): void;
|
|
73
|
+
}
|
|
74
|
+
export interface SoundBiquadLike extends SoundNodeLike {
|
|
75
|
+
type?: BiquadFilterType;
|
|
76
|
+
frequency?: {
|
|
77
|
+
value: number;
|
|
78
|
+
setTargetAtTime?(v: number, t: number, tau: number): void;
|
|
79
|
+
setValueAtTime?(v: number, t: number): void;
|
|
80
|
+
};
|
|
81
|
+
Q?: {
|
|
82
|
+
value: number;
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
export interface SoundSourceLike extends SoundNodeLike {
|
|
86
|
+
buffer?: AudioBuffer | null;
|
|
87
|
+
loop?: boolean;
|
|
88
|
+
playbackRate?: {
|
|
89
|
+
value: number;
|
|
90
|
+
setTargetAtTime?(v: number, t: number, tau: number): number | void;
|
|
91
|
+
};
|
|
92
|
+
start(when?: number, offset?: number, duration?: number): void;
|
|
93
|
+
stop(when?: number): void;
|
|
94
|
+
onended?: (() => void) | null;
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../packages/audio/src/game-sound/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* game-sound/types.ts — shared internals for the GameSoundEngine (PRD-09 §7.5).
|
|
3
|
+
*
|
|
4
|
+
* The engine is unit-tested with fake contexts, so every node factory it
|
|
5
|
+
* needs goes through `SoundGraphContext` — a widening of the package's
|
|
6
|
+
* `AudioContextLike` with the optional factories a real `AudioContext`
|
|
7
|
+
* supplies. Missing factories are handled per-feature (e.g. no
|
|
8
|
+
* `createWaveShaper` → the safety clip stage is skipped and reported).
|
|
9
|
+
*/
|
|
10
|
+
export const dbToGain = (db) => Math.pow(10, db / 20);
|
|
11
|
+
export const gainToDb = (gain) => 20 * Math.log10(Math.max(gain, 1e-6));
|
|
12
|
+
export const clamp = (v, lo, hi) => Math.min(hi, Math.max(lo, v));
|
|
13
|
+
/** Equal-power crossfade gain for mix m ∈ [0,1] (0 → full A, 1 → full B). */
|
|
14
|
+
export const equalPower = (m) => {
|
|
15
|
+
const t = clamp(m, 0, 1) * Math.PI * 0.5;
|
|
16
|
+
return { a: Math.cos(t), b: Math.sin(t) };
|
|
17
|
+
};
|
|
18
|
+
export const vec3 = (v) => "x" in v ? v : { x: v[0], y: v[1], z: v[2] };
|
|
19
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../packages/audio/src/game-sound/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAwBH,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,EAAU,EAAU,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;AAEtE,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AAExF,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,CAAS,EAAE,EAAU,EAAE,EAAU,EAAU,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;AAElG,6EAA6E;AAC7E,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAS,EAA4B,EAAE;IAChE,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC;IACzC,OAAO,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;AAC5C,CAAC,CAAC;AAIF,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,CAAO,EAAuC,EAAE,CACnE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -29,4 +29,20 @@ export { SpatialAudio } from "./SpatialAudio.js";
|
|
|
29
29
|
export type { SpatialAudioOptions } from "./SpatialAudio.js";
|
|
30
30
|
export { FilterEffect } from "./effects/Filter.js";
|
|
31
31
|
export { ReverbEffect } from "./effects/Reverb.js";
|
|
32
|
+
export { createGameSoundEngine } from "./game-sound/GameSoundEngine.js";
|
|
33
|
+
export { createGameSoundEngine as createStubGameSoundEngine } from "./contracts/gameSound.js";
|
|
34
|
+
export type { GameSoundOptions, SoundCueSpec, AudioAssetRef, EngineLoopSpec, GameBusId } from "./game-sound/GameSoundEngine.js";
|
|
35
|
+
export type { SoundGraphContext } from "./game-sound/types.js";
|
|
36
|
+
export { createMasterChain, safetyClipCurve } from "./game-sound/MasterChain.js";
|
|
37
|
+
export { createSpatialNode, occlusionHz } from "./game-sound/SpatialVoice.js";
|
|
38
|
+
export { createEngineLoop, gainsForRpm } from "./game-sound/EngineLoop.js";
|
|
39
|
+
export { MusicControllerImpl } from "./game-sound/MusicController.js";
|
|
40
|
+
export { createReverbSend, IR_BUDGET_SECONDS, PRESET_IR_SECONDS } from "./game-sound/ReverbSend.js";
|
|
41
|
+
export { probeFormat, formatExtension } from "./game-sound/formatProbe.js";
|
|
42
|
+
export { measureLoudness, gainForTarget, MASTERING_TARGETS } from "./game-sound/loudness.js";
|
|
43
|
+
export type { LoudnessInput, LoudnessMeasurement, SfxMasteringClass } from "./game-sound/loudness.js";
|
|
44
|
+
export { VoicePool } from "./game-sound/Voice.js";
|
|
45
|
+
export type { VoiceCueSpec, VoiceRecord, VoicePriority } from "./game-sound/Voice.js";
|
|
46
|
+
export { syncListener } from "./game-sound/listenerSync.js";
|
|
47
|
+
export type { ListenerLike } from "./game-sound/listenerSync.js";
|
|
32
48
|
//# sourceMappingURL=index.d.ts.map
|
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":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../packages/audio/src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -15,4 +15,17 @@ export { SceneAudioBridge } from "./SceneAudioBridge.js";
|
|
|
15
15
|
export { SpatialAudio } from "./SpatialAudio.js";
|
|
16
16
|
export { FilterEffect } from "./effects/Filter.js";
|
|
17
17
|
export { ReverbEffect } from "./effects/Reverb.js";
|
|
18
|
+
export { createGameSoundEngine } from "./game-sound/GameSoundEngine.js";
|
|
19
|
+
// C-25 contract stub (CONTRACTS.md): the engine's `gameSoundSlot` uses this as
|
|
20
|
+
// its flag-off implementation; lane prd09 provides the real factory above.
|
|
21
|
+
export { createGameSoundEngine as createStubGameSoundEngine } from "./contracts/gameSound.js";
|
|
22
|
+
export { createMasterChain, safetyClipCurve } from "./game-sound/MasterChain.js";
|
|
23
|
+
export { createSpatialNode, occlusionHz } from "./game-sound/SpatialVoice.js";
|
|
24
|
+
export { createEngineLoop, gainsForRpm } from "./game-sound/EngineLoop.js";
|
|
25
|
+
export { MusicControllerImpl } from "./game-sound/MusicController.js";
|
|
26
|
+
export { createReverbSend, IR_BUDGET_SECONDS, PRESET_IR_SECONDS } from "./game-sound/ReverbSend.js";
|
|
27
|
+
export { probeFormat, formatExtension } from "./game-sound/formatProbe.js";
|
|
28
|
+
export { measureLoudness, gainForTarget, MASTERING_TARGETS } from "./game-sound/loudness.js";
|
|
29
|
+
export { VoicePool } from "./game-sound/Voice.js";
|
|
30
|
+
export { syncListener } from "./game-sound/listenerSync.js";
|
|
18
31
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","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;AAExC,OAAO,EAAE,gBAAgB,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAclF,OAAO,EAAE,8BAA8B,EAAE,8BAA8B,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAepJ,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,6BAA6B,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAYjK,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAG5D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,OAAO,EAAE,UAAU,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AAE/F,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,0BAA0B,EAC1B,mBAAmB,EACnB,yBAAyB,EACzB,gBAAgB,EACjB,MAAM,qBAAqB,CAAC;AAS7B,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAUxF,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","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;AAExC,OAAO,EAAE,gBAAgB,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAclF,OAAO,EAAE,8BAA8B,EAAE,8BAA8B,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAepJ,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,6BAA6B,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAYjK,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAG5D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,OAAO,EAAE,UAAU,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AAE/F,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,0BAA0B,EAC1B,mBAAmB,EACnB,yBAAyB,EACzB,gBAAgB,EACjB,MAAM,qBAAqB,CAAC;AAS7B,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAUxF,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,+EAA+E;AAC/E,2EAA2E;AAC3E,OAAO,EAAE,qBAAqB,IAAI,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAG3F,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjG,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE1F,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aura3d/audio",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "4.0.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": {
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"main": "./dist/index.js",
|
|
12
12
|
"types": "./dist/index.d.ts",
|
|
13
13
|
"dependencies": {
|
|
14
|
-
"@aura3d/scene": "
|
|
14
|
+
"@aura3d/scene": "4.0.0"
|
|
15
15
|
},
|
|
16
16
|
"description": "Browser audio lifecycle, clips, sources, buses, mixing, listener transforms, spatial attenuation, effects, and scene audio bridges for Aura3D.",
|
|
17
17
|
"keywords": [
|