@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.
Files changed (67) hide show
  1. package/dist/AudioSource.d.ts +7 -0
  2. package/dist/AudioSource.d.ts.map +1 -1
  3. package/dist/AudioSource.js +21 -0
  4. package/dist/AudioSource.js.map +1 -1
  5. package/dist/PositionalEmitter.js +1 -1
  6. package/dist/PositionalEmitter.js.map +1 -1
  7. package/dist/contracts/gameSound.d.ts +94 -0
  8. package/dist/contracts/gameSound.d.ts.map +1 -0
  9. package/dist/contracts/gameSound.js +63 -0
  10. package/dist/contracts/gameSound.js.map +1 -0
  11. package/dist/game-sound/EngineLoop.d.ts +44 -0
  12. package/dist/game-sound/EngineLoop.d.ts.map +1 -0
  13. package/dist/game-sound/EngineLoop.js +114 -0
  14. package/dist/game-sound/EngineLoop.js.map +1 -0
  15. package/dist/game-sound/GameSoundEngine.d.ts +129 -0
  16. package/dist/game-sound/GameSoundEngine.d.ts.map +1 -0
  17. package/dist/game-sound/GameSoundEngine.js +563 -0
  18. package/dist/game-sound/GameSoundEngine.js.map +1 -0
  19. package/dist/game-sound/LoopHandle.d.ts +30 -0
  20. package/dist/game-sound/LoopHandle.d.ts.map +1 -0
  21. package/dist/game-sound/LoopHandle.js +78 -0
  22. package/dist/game-sound/LoopHandle.js.map +1 -0
  23. package/dist/game-sound/MasterChain.d.ts +57 -0
  24. package/dist/game-sound/MasterChain.d.ts.map +1 -0
  25. package/dist/game-sound/MasterChain.js +144 -0
  26. package/dist/game-sound/MasterChain.js.map +1 -0
  27. package/dist/game-sound/MusicController.d.ts +59 -0
  28. package/dist/game-sound/MusicController.d.ts.map +1 -0
  29. package/dist/game-sound/MusicController.js +210 -0
  30. package/dist/game-sound/MusicController.js.map +1 -0
  31. package/dist/game-sound/ReverbSend.d.ts +30 -0
  32. package/dist/game-sound/ReverbSend.d.ts.map +1 -0
  33. package/dist/game-sound/ReverbSend.js +69 -0
  34. package/dist/game-sound/ReverbSend.js.map +1 -0
  35. package/dist/game-sound/SpatialVoice.d.ts +30 -0
  36. package/dist/game-sound/SpatialVoice.d.ts.map +1 -0
  37. package/dist/game-sound/SpatialVoice.js +115 -0
  38. package/dist/game-sound/SpatialVoice.js.map +1 -0
  39. package/dist/game-sound/Voice.d.ts +139 -0
  40. package/dist/game-sound/Voice.d.ts.map +1 -0
  41. package/dist/game-sound/Voice.js +319 -0
  42. package/dist/game-sound/Voice.js.map +1 -0
  43. package/dist/game-sound/formatProbe.d.ts +19 -0
  44. package/dist/game-sound/formatProbe.d.ts.map +1 -0
  45. package/dist/game-sound/formatProbe.js +36 -0
  46. package/dist/game-sound/formatProbe.js.map +1 -0
  47. package/dist/game-sound/listenerSync.d.ts +55 -0
  48. package/dist/game-sound/listenerSync.d.ts.map +1 -0
  49. package/dist/game-sound/listenerSync.js +37 -0
  50. package/dist/game-sound/listenerSync.js.map +1 -0
  51. package/dist/game-sound/loudness.d.ts +35 -0
  52. package/dist/game-sound/loudness.d.ts.map +1 -0
  53. package/dist/game-sound/loudness.js +135 -0
  54. package/dist/game-sound/loudness.js.map +1 -0
  55. package/dist/game-sound/rng.d.ts +26 -0
  56. package/dist/game-sound/rng.d.ts.map +1 -0
  57. package/dist/game-sound/rng.js +57 -0
  58. package/dist/game-sound/rng.js.map +1 -0
  59. package/dist/game-sound/types.d.ts +96 -0
  60. package/dist/game-sound/types.d.ts.map +1 -0
  61. package/dist/game-sound/types.js +19 -0
  62. package/dist/game-sound/types.js.map +1 -0
  63. package/dist/index.d.ts +16 -0
  64. package/dist/index.d.ts.map +1 -1
  65. package/dist/index.js +13 -0
  66. package/dist/index.js.map +1 -1
  67. 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
@@ -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.0.0",
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": "3.0.0"
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": [