@aura3d/audio 1.0.6
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/README.md +16 -0
- package/dist/AdaptiveMusicFixtures.d.ts +36 -0
- package/dist/AdaptiveMusicFixtures.d.ts.map +1 -0
- package/dist/AdaptiveMusicFixtures.js +90 -0
- package/dist/AdaptiveMusicFixtures.js.map +1 -0
- package/dist/AudioBus.d.ts +13 -0
- package/dist/AudioBus.d.ts.map +1 -0
- package/dist/AudioBus.js +32 -0
- package/dist/AudioBus.js.map +1 -0
- package/dist/AudioClip.d.ts +13 -0
- package/dist/AudioClip.d.ts.map +1 -0
- package/dist/AudioClip.js +18 -0
- package/dist/AudioClip.js.map +1 -0
- package/dist/AudioContextManager.d.ts +31 -0
- package/dist/AudioContextManager.d.ts.map +1 -0
- package/dist/AudioContextManager.js +49 -0
- package/dist/AudioContextManager.js.map +1 -0
- package/dist/AudioEffect.d.ts +8 -0
- package/dist/AudioEffect.d.ts.map +1 -0
- package/dist/AudioEffect.js +2 -0
- package/dist/AudioEffect.js.map +1 -0
- package/dist/AudioEffectsAnalysisFixtures.d.ts +99 -0
- package/dist/AudioEffectsAnalysisFixtures.d.ts.map +1 -0
- package/dist/AudioEffectsAnalysisFixtures.js +192 -0
- package/dist/AudioEffectsAnalysisFixtures.js.map +1 -0
- package/dist/AudioListener.d.ts +12 -0
- package/dist/AudioListener.d.ts.map +1 -0
- package/dist/AudioListener.js +11 -0
- package/dist/AudioListener.js.map +1 -0
- package/dist/AudioMixer.d.ts +12 -0
- package/dist/AudioMixer.d.ts.map +1 -0
- package/dist/AudioMixer.js +33 -0
- package/dist/AudioMixer.js.map +1 -0
- package/dist/AudioSource.d.ts +25 -0
- package/dist/AudioSource.d.ts.map +1 -0
- package/dist/AudioSource.js +58 -0
- package/dist/AudioSource.js.map +1 -0
- package/dist/AudioSystem.d.ts +13 -0
- package/dist/AudioSystem.d.ts.map +1 -0
- package/dist/AudioSystem.js +28 -0
- package/dist/AudioSystem.js.map +1 -0
- package/dist/SceneAudioBridge.d.ts +19 -0
- package/dist/SceneAudioBridge.d.ts.map +1 -0
- package/dist/SceneAudioBridge.js +37 -0
- package/dist/SceneAudioBridge.js.map +1 -0
- package/dist/SpatialAudio.d.ts +17 -0
- package/dist/SpatialAudio.d.ts.map +1 -0
- package/dist/SpatialAudio.js +22 -0
- package/dist/SpatialAudio.js.map +1 -0
- package/dist/SpatialAudioFixtures.d.ts +38 -0
- package/dist/SpatialAudioFixtures.d.ts.map +1 -0
- package/dist/SpatialAudioFixtures.js +94 -0
- package/dist/SpatialAudioFixtures.js.map +1 -0
- package/dist/effects/Filter.d.ts +13 -0
- package/dist/effects/Filter.d.ts.map +1 -0
- package/dist/effects/Filter.js +31 -0
- package/dist/effects/Filter.js.map +1 -0
- package/dist/effects/Reverb.d.ts +12 -0
- package/dist/effects/Reverb.d.ts.map +1 -0
- package/dist/effects/Reverb.js +23 -0
- package/dist/effects/Reverb.js.map +1 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/package.json +16 -0
- package/src/AdaptiveMusicFixtures.ts +132 -0
- package/src/AudioBus.ts +39 -0
- package/src/AudioClip.ts +26 -0
- package/src/AudioContextManager.ts +74 -0
- package/src/AudioEffect.ts +7 -0
- package/src/AudioEffectsAnalysisFixtures.ts +311 -0
- package/src/AudioListener.ts +17 -0
- package/src/AudioMixer.ts +36 -0
- package/src/AudioSource.ts +75 -0
- package/src/AudioSystem.ts +34 -0
- package/src/SceneAudioBridge.ts +49 -0
- package/src/SpatialAudio.ts +36 -0
- package/src/SpatialAudioFixtures.ts +137 -0
- package/src/effects/Filter.ts +39 -0
- package/src/effects/Reverb.ts +30 -0
- package/src/index.ts +33 -0
- package/tests/audio.test.ts +121 -0
- package/tsconfig.json +7 -0
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
const COMPRESSOR_PRESETS = {
|
|
2
|
+
gentle: { thresholdDb: -30, kneeDb: 20, ratio: 2, attackSeconds: 0.01, releaseSeconds: 0.3 },
|
|
3
|
+
moderate: { thresholdDb: -24, kneeDb: 30, ratio: 4, attackSeconds: 0.005, releaseSeconds: 0.25 },
|
|
4
|
+
aggressive: { thresholdDb: -18, kneeDb: 10, ratio: 8, attackSeconds: 0.001, releaseSeconds: 0.1 },
|
|
5
|
+
limiter: { thresholdDb: -6, kneeDb: 0, ratio: 20, attackSeconds: 0.001, releaseSeconds: 0.05 },
|
|
6
|
+
vocal: { thresholdDb: -20, kneeDb: 15, ratio: 3, attackSeconds: 0.005, releaseSeconds: 0.2 },
|
|
7
|
+
drums: { thresholdDb: -18, kneeDb: 5, ratio: 6, attackSeconds: 0.001, releaseSeconds: 0.08 },
|
|
8
|
+
master: { thresholdDb: -14, kneeDb: 8, ratio: 3, attackSeconds: 0.004, releaseSeconds: 0.16 }
|
|
9
|
+
};
|
|
10
|
+
const SPECTRUM_BANDS = [
|
|
11
|
+
{ name: "Sub Bass", minHz: 20, maxHz: 60 },
|
|
12
|
+
{ name: "Bass", minHz: 60, maxHz: 250 },
|
|
13
|
+
{ name: "Low Mid", minHz: 250, maxHz: 500 },
|
|
14
|
+
{ name: "Mid", minHz: 500, maxHz: 2_000 },
|
|
15
|
+
{ name: "High Mid", minHz: 2_000, maxHz: 4_000 },
|
|
16
|
+
{ name: "Presence", minHz: 4_000, maxHz: 6_000 },
|
|
17
|
+
{ name: "Brilliance", minHz: 6_000, maxHz: 20_000 }
|
|
18
|
+
];
|
|
19
|
+
export function sampleAudioEffectsAnalysisFixture(options = {}) {
|
|
20
|
+
const preset = options.preset ?? "master";
|
|
21
|
+
const compressorPreset = COMPRESSOR_PRESETS[preset];
|
|
22
|
+
const intensity = clamp01(options.intensity ?? 0.72);
|
|
23
|
+
const inputPeakDb = clamp(options.inputPeakDb ?? -3.5, -60, 6);
|
|
24
|
+
const overThresholdDb = Math.max(0, inputPeakDb - compressorPreset.thresholdDb);
|
|
25
|
+
const compressedOverage = overThresholdDb / compressorPreset.ratio;
|
|
26
|
+
const gainReductionDb = round(Math.max(0, overThresholdDb - compressedOverage));
|
|
27
|
+
const makeupGainDb = round(Math.min(6, gainReductionDb * 0.38));
|
|
28
|
+
const outputPeakDb = round(inputPeakDb - gainReductionDb + makeupGainDb);
|
|
29
|
+
const eqBands = eqBandsForIntensity(intensity);
|
|
30
|
+
const spectrumBands = SPECTRUM_BANDS.map((band, index) => ({
|
|
31
|
+
...band,
|
|
32
|
+
magnitude: round(clamp01((Math.sin(index * 1.37 + intensity * 2.1) + 1) * 0.29 + intensity * (index === 1 || index === 5 ? 0.28 : 0.16)))
|
|
33
|
+
}));
|
|
34
|
+
const bars = spectrumBars(spectrumBands, 16);
|
|
35
|
+
const peak = spectrumBands.reduce((best, band) => band.magnitude > best.magnitude ? band : best, spectrumBands[0]);
|
|
36
|
+
const fixture = {
|
|
37
|
+
source: "origin-master-audio-effects-analysis-adapted",
|
|
38
|
+
effectChain: ["parametric-eq", "dynamic-compressor", "delay", "chorus", "distortion", "filter", "spectrum-analyzer"],
|
|
39
|
+
compressor: {
|
|
40
|
+
preset,
|
|
41
|
+
...compressorPreset,
|
|
42
|
+
inputPeakDb: round(inputPeakDb),
|
|
43
|
+
outputPeakDb,
|
|
44
|
+
gainReductionDb,
|
|
45
|
+
makeupGainDb,
|
|
46
|
+
limiterTriggered: outputPeakDb >= -0.5 || preset === "limiter"
|
|
47
|
+
},
|
|
48
|
+
eq: {
|
|
49
|
+
bands: eqBands,
|
|
50
|
+
activeBandCount: eqBands.filter((band) => band.enabled).length,
|
|
51
|
+
lowShelfGainDb: eqBands[0]?.gainDb ?? 0,
|
|
52
|
+
presenceGainDb: eqBands.find((band) => band.name === "presence-lift")?.gainDb ?? 0,
|
|
53
|
+
outputGain: round(1 - Math.max(0, outputPeakDb) * 0.05)
|
|
54
|
+
},
|
|
55
|
+
delay: delayFixture(intensity),
|
|
56
|
+
chorus: chorusFixture(intensity),
|
|
57
|
+
distortion: distortionFixture(intensity, inputPeakDb),
|
|
58
|
+
filter: filterFixture(intensity),
|
|
59
|
+
spectrum: {
|
|
60
|
+
bands: spectrumBands,
|
|
61
|
+
barCount: bars.length,
|
|
62
|
+
bars,
|
|
63
|
+
peakFrequencyHz: Math.round((peak.minHz + peak.maxHz) / 2),
|
|
64
|
+
peakMagnitude: peak.magnitude,
|
|
65
|
+
logarithmicScale: true
|
|
66
|
+
},
|
|
67
|
+
hash: "",
|
|
68
|
+
claimBoundary: "Audio effects fixture adapts old compressor, EQ, delay, chorus, distortion, filter, and spectrum-analysis concepts for deterministic telemetry; it does not instantiate a production WebAudio mastering graph or prove audio middleware parity.",
|
|
69
|
+
blockedClaims: [
|
|
70
|
+
"production WebAudio effects graph parity",
|
|
71
|
+
"production delay/chorus/distortion/filter node graph parity",
|
|
72
|
+
"real-time FFT browser analyzer certification",
|
|
73
|
+
"audio middleware mastering parity",
|
|
74
|
+
"Unity Audio Mixer parity",
|
|
75
|
+
"Unreal Audio Mixer parity"
|
|
76
|
+
]
|
|
77
|
+
};
|
|
78
|
+
return {
|
|
79
|
+
...fixture,
|
|
80
|
+
hash: stableHash([
|
|
81
|
+
fixture.compressor.preset,
|
|
82
|
+
fixture.compressor.outputPeakDb,
|
|
83
|
+
fixture.compressor.gainReductionDb,
|
|
84
|
+
fixture.delay.preset,
|
|
85
|
+
fixture.delay.repeatsAboveNoiseFloor,
|
|
86
|
+
fixture.chorus.voices,
|
|
87
|
+
fixture.chorus.stereoWidth,
|
|
88
|
+
fixture.distortion.curve,
|
|
89
|
+
fixture.distortion.harmonicBoost,
|
|
90
|
+
fixture.filter.frequencyHz,
|
|
91
|
+
fixture.eq.bands.map((band) => `${band.frequencyHz}:${band.gainDb}`).join(","),
|
|
92
|
+
fixture.spectrum.peakFrequencyHz,
|
|
93
|
+
fixture.spectrum.peakMagnitude
|
|
94
|
+
].join("|"))
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
function delayFixture(intensity) {
|
|
98
|
+
const preset = intensity > 0.7 ? "tape_echo" : intensity > 0.52 ? "medium_echo" : "short_echo";
|
|
99
|
+
const delayTimeSeconds = preset === "tape_echo" ? 0.42 : preset === "medium_echo" ? 0.5 : 0.25;
|
|
100
|
+
const feedback = round(preset === "tape_echo" ? 0.58 : 0.22 + intensity * 0.35);
|
|
101
|
+
const wetDryMix = round(0.24 + intensity * 0.34);
|
|
102
|
+
return {
|
|
103
|
+
source: "origin-master-delay-effect-adapted",
|
|
104
|
+
preset,
|
|
105
|
+
delayTimeSeconds,
|
|
106
|
+
feedback,
|
|
107
|
+
wetDryMix,
|
|
108
|
+
filterFrequencyHz: Math.round(7_500 - intensity * 4_600),
|
|
109
|
+
pingPong: preset === "tape_echo" || intensity > 0.82,
|
|
110
|
+
repeatsAboveNoiseFloor: Math.max(1, Math.min(8, Math.ceil(Math.log(0.04) / Math.log(Math.max(0.05, feedback)))))
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
function chorusFixture(intensity) {
|
|
114
|
+
const preset = intensity > 0.72 ? "ensemble" : intensity > 0.5 ? "classic" : "subtle";
|
|
115
|
+
const voices = preset === "ensemble" ? 4 : preset === "classic" ? 2 : 1;
|
|
116
|
+
return {
|
|
117
|
+
source: "origin-master-chorus-effect-adapted",
|
|
118
|
+
preset,
|
|
119
|
+
rateHz: round(0.85 + intensity * 2.2),
|
|
120
|
+
depthSeconds: round(0.0012 + intensity * 0.006),
|
|
121
|
+
feedback: round(0.08 + intensity * 0.26),
|
|
122
|
+
wetDryMix: round(0.18 + intensity * 0.42),
|
|
123
|
+
delaySeconds: round(0.012 + intensity * 0.018),
|
|
124
|
+
voices,
|
|
125
|
+
stereoWidth: round(Math.min(1, 0.36 + voices * 0.13 + intensity * 0.22))
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
function distortionFixture(intensity, inputPeakDb) {
|
|
129
|
+
const curve = intensity > 0.76 ? "saturation" : intensity > 0.58 ? "softclip" : "sigmoid";
|
|
130
|
+
const amount = round(18 + intensity * 62);
|
|
131
|
+
const preGain = round(1 + intensity * 2.4);
|
|
132
|
+
const postGain = round(Math.max(0.42, 1 - intensity * 0.36));
|
|
133
|
+
const harmonicBoost = round(Math.max(0, amount / 100 * preGain * Math.max(0.25, (inputPeakDb + 24) / 24)));
|
|
134
|
+
return {
|
|
135
|
+
source: "origin-master-distortion-effect-adapted",
|
|
136
|
+
curve,
|
|
137
|
+
amount,
|
|
138
|
+
preGain,
|
|
139
|
+
postGain,
|
|
140
|
+
wetDryMix: round(0.2 + intensity * 0.55),
|
|
141
|
+
harmonicBoost,
|
|
142
|
+
outputCeiling: round(Math.min(0.98, postGain + harmonicBoost * 0.08))
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
function filterFixture(intensity) {
|
|
146
|
+
const type = intensity > 0.62 ? "lowpass" : "bandpass";
|
|
147
|
+
const frequencyHz = Math.round(type === "lowpass" ? 6_800 - intensity * 2_400 : 1_200 + intensity * 2_200);
|
|
148
|
+
const q = round(0.7 + intensity * 1.6);
|
|
149
|
+
return {
|
|
150
|
+
source: "origin-master-filter-effect-adapted",
|
|
151
|
+
type,
|
|
152
|
+
frequencyHz,
|
|
153
|
+
q,
|
|
154
|
+
resonanceDb: round(q * 2.6),
|
|
155
|
+
enabled: true
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
function eqBandsForIntensity(intensity) {
|
|
159
|
+
return [
|
|
160
|
+
{ name: "low-body", type: "lowshelf", frequencyHz: 120, q: 0.7, gainDb: round(2.4 * intensity), enabled: true },
|
|
161
|
+
{ name: "mud-cut", type: "peaking", frequencyHz: 360, q: 1.1, gainDb: round(-1.8 * intensity), enabled: true },
|
|
162
|
+
{ name: "presence-lift", type: "peaking", frequencyHz: 3_200, q: 0.9, gainDb: round(2.2 * intensity), enabled: true },
|
|
163
|
+
{ name: "air", type: "highshelf", frequencyHz: 8_500, q: 0.8, gainDb: round(1.6 * intensity), enabled: true }
|
|
164
|
+
];
|
|
165
|
+
}
|
|
166
|
+
function spectrumBars(bands, count) {
|
|
167
|
+
const bars = [];
|
|
168
|
+
for (let index = 0; index < count; index += 1) {
|
|
169
|
+
const band = bands[Math.min(bands.length - 1, Math.floor(index / count * bands.length))];
|
|
170
|
+
const shimmer = 0.85 + 0.15 * Math.sin(index * 0.9);
|
|
171
|
+
bars.push(round(clamp01(band.magnitude * shimmer)));
|
|
172
|
+
}
|
|
173
|
+
return bars;
|
|
174
|
+
}
|
|
175
|
+
function clamp01(value) {
|
|
176
|
+
return clamp(value, 0, 1);
|
|
177
|
+
}
|
|
178
|
+
function clamp(value, min, max) {
|
|
179
|
+
return Math.max(min, Math.min(max, Number.isFinite(value) ? value : min));
|
|
180
|
+
}
|
|
181
|
+
function round(value) {
|
|
182
|
+
return Number(value.toFixed(4));
|
|
183
|
+
}
|
|
184
|
+
function stableHash(value) {
|
|
185
|
+
let hash = 0x811c9dc5;
|
|
186
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
187
|
+
hash ^= value.charCodeAt(index);
|
|
188
|
+
hash = Math.imul(hash, 0x01000193);
|
|
189
|
+
}
|
|
190
|
+
return (hash >>> 0).toString(16).padStart(8, "0");
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=AudioEffectsAnalysisFixtures.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AudioEffectsAnalysisFixtures.js","sourceRoot":"","sources":["../../../../packages/audio/src/AudioEffectsAnalysisFixtures.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface Vec3Like {
|
|
2
|
+
readonly x: number;
|
|
3
|
+
readonly y: number;
|
|
4
|
+
readonly z: number;
|
|
5
|
+
}
|
|
6
|
+
export declare class AudioListener {
|
|
7
|
+
position: Vec3Like;
|
|
8
|
+
forward: Vec3Like;
|
|
9
|
+
up: Vec3Like;
|
|
10
|
+
setTransform(position: Vec3Like, forward?: Vec3Like, up?: Vec3Like): void;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=AudioListener.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AudioListener.d.ts","sourceRoot":"","sources":["../../../../packages/audio/src/AudioListener.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,aAAa;IACxB,QAAQ,EAAE,QAAQ,CAAwB;IAC1C,OAAO,EAAE,QAAQ,CAAyB;IAC1C,EAAE,EAAE,QAAQ,CAAwB;IAEpC,YAAY,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,GAAE,QAAuB,EAAE,EAAE,GAAE,QAAkB,GAAG,IAAI;CAKjG"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export class AudioListener {
|
|
2
|
+
position = { x: 0, y: 0, z: 0 };
|
|
3
|
+
forward = { x: 0, y: 0, z: -1 };
|
|
4
|
+
up = { x: 0, y: 1, z: 0 };
|
|
5
|
+
setTransform(position, forward = this.forward, up = this.up) {
|
|
6
|
+
this.position = { ...position };
|
|
7
|
+
this.forward = { ...forward };
|
|
8
|
+
this.up = { ...up };
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=AudioListener.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AudioListener.js","sourceRoot":"","sources":["../../../../packages/audio/src/AudioListener.ts"],"names":[],"mappings":"AAMA,MAAM,OAAO,aAAa;IACxB,QAAQ,GAAa,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IAC1C,OAAO,GAAa,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;IAC1C,EAAE,GAAa,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IAEpC,YAAY,CAAC,QAAkB,EAAE,UAAoB,IAAI,CAAC,OAAO,EAAE,KAAe,IAAI,CAAC,EAAE;QACvF,IAAI,CAAC,QAAQ,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAChC,IAAI,CAAC,OAAO,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC;QAC9B,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC;IACtB,CAAC;CACF"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { AudioBus } from "./AudioBus";
|
|
2
|
+
import type { AudioContextLike } from "./AudioContextManager";
|
|
3
|
+
export declare class AudioMixer {
|
|
4
|
+
private readonly context;
|
|
5
|
+
readonly master: AudioBus;
|
|
6
|
+
private readonly buses;
|
|
7
|
+
constructor(context: AudioContextLike);
|
|
8
|
+
createBus(name: string, destination?: AudioNode): AudioBus;
|
|
9
|
+
getBus(name: string): AudioBus;
|
|
10
|
+
dispose(): void;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=AudioMixer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AudioMixer.d.ts","sourceRoot":"","sources":["../../../../packages/audio/src/AudioMixer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,qBAAa,UAAU;IAIT,OAAO,CAAC,QAAQ,CAAC,OAAO;IAHpC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;IAC1B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA+B;gBAExB,OAAO,EAAE,gBAAgB;IAKtD,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,GAAE,SAA6B,GAAG,QAAQ;IAS7E,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ;IAQ9B,OAAO,IAAI,IAAI;CAMhB"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { AudioBus } from "./AudioBus.js";
|
|
2
|
+
export class AudioMixer {
|
|
3
|
+
context;
|
|
4
|
+
master;
|
|
5
|
+
buses = new Map();
|
|
6
|
+
constructor(context) {
|
|
7
|
+
this.context = context;
|
|
8
|
+
this.master = new AudioBus("master", context);
|
|
9
|
+
this.buses.set(this.master.name, this.master);
|
|
10
|
+
}
|
|
11
|
+
createBus(name, destination = this.master.input) {
|
|
12
|
+
if (this.buses.has(name)) {
|
|
13
|
+
throw new Error(`Audio bus already exists: ${name}`);
|
|
14
|
+
}
|
|
15
|
+
const bus = new AudioBus(name, this.context, destination);
|
|
16
|
+
this.buses.set(name, bus);
|
|
17
|
+
return bus;
|
|
18
|
+
}
|
|
19
|
+
getBus(name) {
|
|
20
|
+
const bus = this.buses.get(name);
|
|
21
|
+
if (!bus) {
|
|
22
|
+
throw new Error(`Unknown audio bus: ${name}`);
|
|
23
|
+
}
|
|
24
|
+
return bus;
|
|
25
|
+
}
|
|
26
|
+
dispose() {
|
|
27
|
+
for (const bus of [...this.buses.values()].reverse()) {
|
|
28
|
+
bus.dispose();
|
|
29
|
+
}
|
|
30
|
+
this.buses.clear();
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=AudioMixer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AudioMixer.js","sourceRoot":"","sources":["../../../../packages/audio/src/AudioMixer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGtC,MAAM,OAAO,UAAU;IAIQ;IAHpB,MAAM,CAAW;IACT,KAAK,GAAG,IAAI,GAAG,EAAoB,CAAC;IAErD,YAA6B,OAAyB;QAAzB,YAAO,GAAP,OAAO,CAAkB;QACpD,IAAI,CAAC,MAAM,GAAG,IAAI,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC9C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAChD,CAAC;IAED,SAAS,CAAC,IAAY,EAAE,cAAyB,IAAI,CAAC,MAAM,CAAC,KAAK;QAChE,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,6BAA6B,IAAI,EAAE,CAAC,CAAC;QACvD,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAC1D,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC1B,OAAO,GAAG,CAAC;IACb,CAAC;IAED,MAAM,CAAC,IAAY;QACjB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,sBAAsB,IAAI,EAAE,CAAC,CAAC;QAChD,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,OAAO;QACL,KAAK,MAAM,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;YACrD,GAAG,CAAC,OAAO,EAAE,CAAC;QAChB,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;CACF"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { AudioClip } from "./AudioClip";
|
|
2
|
+
import type { AudioContextLike } from "./AudioContextManager";
|
|
3
|
+
export type AudioSourceState = "idle" | "playing" | "paused" | "stopped";
|
|
4
|
+
export interface AudioSourceOptions {
|
|
5
|
+
readonly context: AudioContextLike;
|
|
6
|
+
readonly destination?: AudioNode;
|
|
7
|
+
readonly clip?: AudioClip;
|
|
8
|
+
readonly loop?: boolean;
|
|
9
|
+
readonly volume?: number;
|
|
10
|
+
}
|
|
11
|
+
export declare class AudioSource {
|
|
12
|
+
private readonly options;
|
|
13
|
+
clip?: AudioClip;
|
|
14
|
+
loop: boolean;
|
|
15
|
+
readonly gain: GainNode;
|
|
16
|
+
private stateRef;
|
|
17
|
+
private node?;
|
|
18
|
+
constructor(options: AudioSourceOptions);
|
|
19
|
+
get state(): AudioSourceState;
|
|
20
|
+
play(when?: number): void;
|
|
21
|
+
stop(when?: number): void;
|
|
22
|
+
setVolume(value: number): void;
|
|
23
|
+
dispose(): void;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=AudioSource.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AudioSource.d.ts","sourceRoot":"","sources":["../../../../packages/audio/src/AudioSource.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEzE,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAC;IACnC,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,CAAC;IACjC,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,qBAAa,WAAW;IAQV,OAAO,CAAC,QAAQ,CAAC,OAAO;IAPpC,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAExB,OAAO,CAAC,QAAQ,CAA4B;IAC5C,OAAO,CAAC,IAAI,CAAC,CAAwB;gBAER,OAAO,EAAE,kBAAkB;IAQxD,IAAI,KAAK,IAAI,gBAAgB,CAE5B;IAED,IAAI,CAAC,IAAI,SAAI,GAAG,IAAI;IAmBpB,IAAI,CAAC,IAAI,SAAI,GAAG,IAAI;IAWpB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAO9B,OAAO,IAAI,IAAI;CAIhB"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
export class AudioSource {
|
|
2
|
+
options;
|
|
3
|
+
clip;
|
|
4
|
+
loop;
|
|
5
|
+
gain;
|
|
6
|
+
stateRef = "idle";
|
|
7
|
+
node;
|
|
8
|
+
constructor(options) {
|
|
9
|
+
this.options = options;
|
|
10
|
+
this.clip = options.clip;
|
|
11
|
+
this.loop = options.loop ?? false;
|
|
12
|
+
this.gain = options.context.createGain();
|
|
13
|
+
this.gain.gain.value = options.volume ?? 1;
|
|
14
|
+
this.gain.connect(options.destination ?? options.context.destination);
|
|
15
|
+
}
|
|
16
|
+
get state() {
|
|
17
|
+
return this.stateRef;
|
|
18
|
+
}
|
|
19
|
+
play(when = 0) {
|
|
20
|
+
if (!this.clip) {
|
|
21
|
+
throw new Error("Cannot play an AudioSource without an AudioClip");
|
|
22
|
+
}
|
|
23
|
+
this.stop();
|
|
24
|
+
const source = this.options.context.createBufferSource();
|
|
25
|
+
source.buffer = this.clip.buffer;
|
|
26
|
+
source.loop = this.loop;
|
|
27
|
+
source.connect(this.gain);
|
|
28
|
+
source.start(when);
|
|
29
|
+
source.onended = () => {
|
|
30
|
+
if (this.node === source && this.stateRef === "playing") {
|
|
31
|
+
this.stateRef = "stopped";
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
this.node = source;
|
|
35
|
+
this.stateRef = "playing";
|
|
36
|
+
}
|
|
37
|
+
stop(when = 0) {
|
|
38
|
+
if (this.node) {
|
|
39
|
+
this.node.stop(when);
|
|
40
|
+
this.node.disconnect();
|
|
41
|
+
this.node = undefined;
|
|
42
|
+
}
|
|
43
|
+
if (this.stateRef !== "idle") {
|
|
44
|
+
this.stateRef = "stopped";
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
setVolume(value) {
|
|
48
|
+
if (!Number.isFinite(value) || value < 0) {
|
|
49
|
+
throw new Error("Audio source volume must be a non-negative finite number");
|
|
50
|
+
}
|
|
51
|
+
this.gain.gain.value = value;
|
|
52
|
+
}
|
|
53
|
+
dispose() {
|
|
54
|
+
this.stop();
|
|
55
|
+
this.gain.disconnect();
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=AudioSource.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AudioSource.js","sourceRoot":"","sources":["../../../../packages/audio/src/AudioSource.ts"],"names":[],"mappings":"AAaA,MAAM,OAAO,WAAW;IAQO;IAP7B,IAAI,CAAa;IACjB,IAAI,CAAU;IACL,IAAI,CAAW;IAEhB,QAAQ,GAAqB,MAAM,CAAC;IACpC,IAAI,CAAyB;IAErC,YAA6B,OAA2B;QAA3B,YAAO,GAAP,OAAO,CAAoB;QACtD,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QACzB,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,KAAK,CAAC;QAClC,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QACzC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;QAC3C,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACxE,CAAC;IAED,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,IAAI,CAAC,IAAI,GAAG,CAAC;QACX,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;QACrE,CAAC;QACD,IAAI,CAAC,IAAI,EAAE,CAAC;QACZ,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC;QACzD,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;QACjC,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACxB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACnB,MAAM,CAAC,OAAO,GAAG,GAAG,EAAE;YACpB,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;gBACxD,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;YAC5B,CAAC;QACH,CAAC,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC;QACnB,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;IAC5B,CAAC;IAED,IAAI,CAAC,IAAI,GAAG,CAAC;QACX,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACvB,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC;QACxB,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;YAC7B,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,SAAS,CAAC,KAAa;QACrB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACzC,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;QAC9E,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IAC/B,CAAC;IAED,OAAO;QACL,IAAI,CAAC,IAAI,EAAE,CAAC;QACZ,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;IACzB,CAAC;CACF"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { AudioContextManager, type AudioContextManagerOptions } from "./AudioContextManager";
|
|
2
|
+
import { AudioMixer } from "./AudioMixer";
|
|
3
|
+
export declare class AudioSystem {
|
|
4
|
+
readonly contextManager: AudioContextManager;
|
|
5
|
+
private mixerRef?;
|
|
6
|
+
constructor(options?: AudioContextManagerOptions);
|
|
7
|
+
get mixer(): AudioMixer;
|
|
8
|
+
unlock(): Promise<void>;
|
|
9
|
+
suspend(): Promise<void>;
|
|
10
|
+
resume(): Promise<void>;
|
|
11
|
+
dispose(): Promise<void>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=AudioSystem.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AudioSystem.d.ts","sourceRoot":"","sources":["../../../../packages/audio/src/AudioSystem.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,KAAK,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AAC7F,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,qBAAa,WAAW;IACtB,QAAQ,CAAC,cAAc,EAAE,mBAAmB,CAAC;IAC7C,OAAO,CAAC,QAAQ,CAAC,CAAa;gBAElB,OAAO,GAAE,0BAA+B;IAIpD,IAAI,KAAK,IAAI,UAAU,CAGtB;IAEK,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAIvB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAIxB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAIvB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAK/B"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { AudioContextManager } from "./AudioContextManager.js";
|
|
2
|
+
import { AudioMixer } from "./AudioMixer.js";
|
|
3
|
+
export class AudioSystem {
|
|
4
|
+
contextManager;
|
|
5
|
+
mixerRef;
|
|
6
|
+
constructor(options = {}) {
|
|
7
|
+
this.contextManager = new AudioContextManager(options);
|
|
8
|
+
}
|
|
9
|
+
get mixer() {
|
|
10
|
+
this.mixerRef ??= new AudioMixer(this.contextManager.context);
|
|
11
|
+
return this.mixerRef;
|
|
12
|
+
}
|
|
13
|
+
async unlock() {
|
|
14
|
+
await this.contextManager.unlock();
|
|
15
|
+
}
|
|
16
|
+
async suspend() {
|
|
17
|
+
await this.contextManager.suspend();
|
|
18
|
+
}
|
|
19
|
+
async resume() {
|
|
20
|
+
await this.contextManager.resume();
|
|
21
|
+
}
|
|
22
|
+
async dispose() {
|
|
23
|
+
this.mixerRef?.dispose();
|
|
24
|
+
this.mixerRef = undefined;
|
|
25
|
+
await this.contextManager.dispose();
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=AudioSystem.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AudioSystem.js","sourceRoot":"","sources":["../../../../packages/audio/src/AudioSystem.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAmC,MAAM,uBAAuB,CAAC;AAC7F,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,MAAM,OAAO,WAAW;IACb,cAAc,CAAsB;IACrC,QAAQ,CAAc;IAE9B,YAAY,UAAsC,EAAE;QAClD,IAAI,CAAC,cAAc,GAAG,IAAI,mBAAmB,CAAC,OAAO,CAAC,CAAC;IACzD,CAAC;IAED,IAAI,KAAK;QACP,IAAI,CAAC,QAAQ,KAAK,IAAI,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QAC9D,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,MAAM;QACV,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,MAAM;QACV,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC;QACzB,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC1B,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC;IACtC,CAAC;CACF"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Scene, SceneNode } from "@aura3d/scene";
|
|
2
|
+
import type { AudioListener } from "./AudioListener";
|
|
3
|
+
import type { SpatialAudio } from "./SpatialAudio";
|
|
4
|
+
export interface SceneAudioSourceBinding {
|
|
5
|
+
readonly node: SceneNode;
|
|
6
|
+
readonly spatial: SpatialAudio;
|
|
7
|
+
}
|
|
8
|
+
export declare class SceneAudioBridge {
|
|
9
|
+
private readonly scene?;
|
|
10
|
+
private listenerBinding?;
|
|
11
|
+
private readonly sources;
|
|
12
|
+
constructor(scene?: Scene | undefined);
|
|
13
|
+
bindListener(node: SceneNode, listener: AudioListener): void;
|
|
14
|
+
unbindListener(): void;
|
|
15
|
+
bindSource(node: SceneNode, spatial: SpatialAudio): SceneAudioSourceBinding;
|
|
16
|
+
unbindSource(binding: SceneAudioSourceBinding): void;
|
|
17
|
+
update(): void;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=SceneAudioBridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SceneAudioBridge.d.ts","sourceRoot":"","sources":["../../../../packages/audio/src/SceneAudioBridge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnD,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;CAChC;AAED,qBAAa,gBAAgB;IAIf,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;IAHnC,OAAO,CAAC,eAAe,CAAC,CAAiE;IACzF,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsC;gBAEjC,KAAK,CAAC,EAAE,KAAK,YAAA;IAE1C,YAAY,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI;IAI5D,cAAc,IAAI,IAAI;IAItB,UAAU,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,GAAG,uBAAuB;IAM3E,YAAY,CAAC,OAAO,EAAE,uBAAuB,GAAG,IAAI;IAIpD,MAAM,IAAI,IAAI;CASf"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export class SceneAudioBridge {
|
|
2
|
+
scene;
|
|
3
|
+
listenerBinding;
|
|
4
|
+
sources = new Set();
|
|
5
|
+
constructor(scene) {
|
|
6
|
+
this.scene = scene;
|
|
7
|
+
}
|
|
8
|
+
bindListener(node, listener) {
|
|
9
|
+
this.listenerBinding = { node, listener };
|
|
10
|
+
}
|
|
11
|
+
unbindListener() {
|
|
12
|
+
this.listenerBinding = undefined;
|
|
13
|
+
}
|
|
14
|
+
bindSource(node, spatial) {
|
|
15
|
+
const binding = { node, spatial };
|
|
16
|
+
this.sources.add(binding);
|
|
17
|
+
return binding;
|
|
18
|
+
}
|
|
19
|
+
unbindSource(binding) {
|
|
20
|
+
this.sources.delete(binding);
|
|
21
|
+
}
|
|
22
|
+
update() {
|
|
23
|
+
this.scene?.updateWorldTransforms();
|
|
24
|
+
if (this.listenerBinding) {
|
|
25
|
+
this.listenerBinding.listener.setTransform(worldPosition(this.listenerBinding.node));
|
|
26
|
+
}
|
|
27
|
+
for (const binding of this.sources) {
|
|
28
|
+
binding.spatial.setPosition(worldPosition(binding.node));
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
function worldPosition(node) {
|
|
33
|
+
node.updateWorldTransform();
|
|
34
|
+
const matrix = node.transform.worldMatrix;
|
|
35
|
+
return { x: matrix[12], y: matrix[13], z: matrix[14] };
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=SceneAudioBridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SceneAudioBridge.js","sourceRoot":"","sources":["../../../../packages/audio/src/SceneAudioBridge.ts"],"names":[],"mappings":"AASA,MAAM,OAAO,gBAAgB;IAIE;IAHrB,eAAe,CAAkE;IACxE,OAAO,GAAG,IAAI,GAAG,EAA2B,CAAC;IAE9D,YAA6B,KAAa;QAAb,UAAK,GAAL,KAAK,CAAQ;IAAG,CAAC;IAE9C,YAAY,CAAC,IAAe,EAAE,QAAuB;QACnD,IAAI,CAAC,eAAe,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAC5C,CAAC;IAED,cAAc;QACZ,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC;IACnC,CAAC;IAED,UAAU,CAAC,IAAe,EAAE,OAAqB;QAC/C,MAAM,OAAO,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAClC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC1B,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,YAAY,CAAC,OAAgC;QAC3C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAED,MAAM;QACJ,IAAI,CAAC,KAAK,EAAE,qBAAqB,EAAE,CAAC;QACpC,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,YAAY,CAAC,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;QACvF,CAAC;QACD,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACnC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;CACF;AAED,SAAS,aAAa,CAAC,IAAe;IACpC,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,WAAgC,CAAC;IAC/D,OAAO,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;AACzD,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { AudioContextLike } from "./AudioContextManager";
|
|
2
|
+
import type { Vec3Like } from "./AudioListener";
|
|
3
|
+
export interface SpatialAudioOptions {
|
|
4
|
+
readonly context: AudioContextLike;
|
|
5
|
+
readonly destination?: AudioNode;
|
|
6
|
+
readonly position?: Vec3Like;
|
|
7
|
+
readonly maxDistance?: number;
|
|
8
|
+
readonly refDistance?: number;
|
|
9
|
+
readonly rolloffFactor?: number;
|
|
10
|
+
}
|
|
11
|
+
export declare class SpatialAudio {
|
|
12
|
+
readonly panner: PannerNode;
|
|
13
|
+
constructor(options: SpatialAudioOptions);
|
|
14
|
+
setPosition(position: Vec3Like): void;
|
|
15
|
+
dispose(): void;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=SpatialAudio.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SpatialAudio.d.ts","sourceRoot":"","sources":["../../../../packages/audio/src/SpatialAudio.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEhD,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAC;IACnC,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,CAAC;IACjC,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAC7B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,qBAAa,YAAY;IACvB,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;gBAEhB,OAAO,EAAE,mBAAmB;IAWxC,WAAW,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAMrC,OAAO,IAAI,IAAI;CAGhB"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export class SpatialAudio {
|
|
2
|
+
panner;
|
|
3
|
+
constructor(options) {
|
|
4
|
+
this.panner = options.context.createPanner();
|
|
5
|
+
this.panner.panningModel = "HRTF";
|
|
6
|
+
this.panner.distanceModel = "inverse";
|
|
7
|
+
this.panner.maxDistance = options.maxDistance ?? 10_000;
|
|
8
|
+
this.panner.refDistance = options.refDistance ?? 1;
|
|
9
|
+
this.panner.rolloffFactor = options.rolloffFactor ?? 1;
|
|
10
|
+
this.panner.connect(options.destination ?? options.context.destination);
|
|
11
|
+
this.setPosition(options.position ?? { x: 0, y: 0, z: 0 });
|
|
12
|
+
}
|
|
13
|
+
setPosition(position) {
|
|
14
|
+
this.panner.positionX.value = position.x;
|
|
15
|
+
this.panner.positionY.value = position.y;
|
|
16
|
+
this.panner.positionZ.value = position.z;
|
|
17
|
+
}
|
|
18
|
+
dispose() {
|
|
19
|
+
this.panner.disconnect();
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=SpatialAudio.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SpatialAudio.js","sourceRoot":"","sources":["../../../../packages/audio/src/SpatialAudio.ts"],"names":[],"mappings":"AAYA,MAAM,OAAO,YAAY;IACd,MAAM,CAAa;IAE5B,YAAY,OAA4B;QACtC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;QAC7C,IAAI,CAAC,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC;QAClC,IAAI,CAAC,MAAM,CAAC,aAAa,GAAG,SAAS,CAAC;QACtC,IAAI,CAAC,MAAM,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,MAAM,CAAC;QACxD,IAAI,CAAC,MAAM,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC;QACnD,IAAI,CAAC,MAAM,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,CAAC,CAAC;QACvD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QACxE,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,WAAW,CAAC,QAAkB;QAC5B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC;QACzC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC;QACzC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO;QACL,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;IAC3B,CAAC;CACF"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export type AudioOcclusionLevel = "none" | "light" | "medium" | "heavy" | "complete";
|
|
2
|
+
export interface AudioEnvironmentFixtureOptions {
|
|
3
|
+
readonly sourcePosition?: readonly [number, number, number];
|
|
4
|
+
readonly listenerPosition?: readonly [number, number, number];
|
|
5
|
+
readonly sourceVelocity?: readonly [number, number, number];
|
|
6
|
+
readonly listenerVelocity?: readonly [number, number, number];
|
|
7
|
+
readonly obstacleCount?: number;
|
|
8
|
+
readonly reverbZoneRadius?: number;
|
|
9
|
+
readonly reverbZoneDistance?: number;
|
|
10
|
+
readonly baseFrequencyHz?: number;
|
|
11
|
+
}
|
|
12
|
+
export interface AudioEnvironmentFixture {
|
|
13
|
+
readonly source: "origin-master-spatial-audio-environment-adapted";
|
|
14
|
+
readonly distance: number;
|
|
15
|
+
readonly occlusion: {
|
|
16
|
+
readonly level: AudioOcclusionLevel;
|
|
17
|
+
readonly obstacleCount: number;
|
|
18
|
+
readonly lowpassHz: number;
|
|
19
|
+
readonly volume: number;
|
|
20
|
+
};
|
|
21
|
+
readonly doppler: {
|
|
22
|
+
readonly relativeVelocity: number;
|
|
23
|
+
readonly approaching: boolean;
|
|
24
|
+
readonly pitchFactor: number;
|
|
25
|
+
readonly frequencyShiftHz: number;
|
|
26
|
+
};
|
|
27
|
+
readonly reverb: {
|
|
28
|
+
readonly zoneRadius: number;
|
|
29
|
+
readonly zoneDistance: number;
|
|
30
|
+
readonly blend: number;
|
|
31
|
+
readonly wetLevel: number;
|
|
32
|
+
readonly dryLevel: number;
|
|
33
|
+
};
|
|
34
|
+
readonly hash: string;
|
|
35
|
+
readonly claimBoundary: string;
|
|
36
|
+
}
|
|
37
|
+
export declare function sampleAudioEnvironmentFixture(options?: AudioEnvironmentFixtureOptions): AudioEnvironmentFixture;
|
|
38
|
+
//# sourceMappingURL=SpatialAudioFixtures.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SpatialAudioFixtures.d.ts","sourceRoot":"","sources":["../../../../packages/audio/src/SpatialAudioFixtures.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,UAAU,CAAC;AAErF,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,cAAc,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5D,QAAQ,CAAC,gBAAgB,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9D,QAAQ,CAAC,cAAc,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5D,QAAQ,CAAC,gBAAgB,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9D,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;CACnC;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,MAAM,EAAE,iDAAiD,CAAC;IACnE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE;QAClB,QAAQ,CAAC,KAAK,EAAE,mBAAmB,CAAC;QACpC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;QAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;KACzB,CAAC;IACF,QAAQ,CAAC,OAAO,EAAE;QAChB,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;QAClC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;QAC9B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;QAC7B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;KACnC,CAAC;IACF,QAAQ,CAAC,MAAM,EAAE;QACf,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;QAC5B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;QAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;KAC3B,CAAC;IACF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC;AAUD,wBAAgB,6BAA6B,CAAC,OAAO,GAAE,8BAAmC,GAAG,uBAAuB,CA+CnH"}
|