@yali-engine/audio 0.0.0-stage → 0.4.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/plugin.js ADDED
@@ -0,0 +1,530 @@
1
+ import { registerTransforms, YaliError } from '@yali-engine/core';
2
+ import { AudioMixer, modelOf } from "./audio.js";
3
+ import { cameraPose, dopplerFactor, poseOf, relative, rotate, rotateTo, zoneWeight } from "./space.js";
4
+ /** `audio.Source`'s fields (ADR-0096). */
5
+ export const SOURCE_FIELDS = {
6
+ clip: 'u32',
7
+ volume: 'f32',
8
+ pitch: 'f32',
9
+ loop: 'u8',
10
+ /** 1: playing (set it to start); the plugin sets 0 when a clip that does not loop ends. */
11
+ play: 'u8',
12
+ spatial: 'u8',
13
+ distanceModel: 'u8',
14
+ refDistance: 'f32',
15
+ maxDistance: 'f32',
16
+ rolloff: 'f32',
17
+ coneInner: 'f32',
18
+ coneOuter: 'f32',
19
+ coneOuterGain: 'f32',
20
+ };
21
+ /** `audio.ReverbZone`'s fields (ADR-0116). */
22
+ export const REVERB_ZONE_FIELDS = {
23
+ /** 0: a sphere of radius `x`; 1: a box of half extents `x`, `y`, `z` (turned with the entity). */
24
+ shape: 'u8',
25
+ x: 'f32',
26
+ y: 'f32',
27
+ z: 'f32',
28
+ /** How far inside the edge it reaches full strength, m. */
29
+ fade: 'f32',
30
+ /** Seconds to fall 60 dB. */
31
+ decay: 'f32',
32
+ /** Its level at full strength (linear). */
33
+ wet: 'f32',
34
+ };
35
+ /** Registers the audio components on `world` (the same ids every call). */
36
+ export function registerAudioComponents(world) {
37
+ return {
38
+ Source: world.registerComponent({ name: 'audio.Source', fields: SOURCE_FIELDS }),
39
+ Listener: world.registerComponent({ name: 'audio.Listener', fields: { active: 'u8' } }),
40
+ ReverbZone: world.registerComponent({ name: 'audio.ReverbZone', fields: REVERB_ZONE_FIELDS }),
41
+ };
42
+ }
43
+ /**
44
+ * `audio.ReverbZone` values (ADR-0116): put on an entity with a transform; while the listener is
45
+ * inside, every spatial sound also plays through this reverb, faded in over `fade` metres. Zones may
46
+ * overlap (each is heard at its own weight).
47
+ *
48
+ * @example
49
+ * world.insert(hall, audio.ReverbZone, reverbZone({ box: [12, 6, 20], decay: 2.2, wet: 0.5 }));
50
+ */
51
+ export function reverbZone(o) {
52
+ const box = o.box;
53
+ if ((o.sphere === undefined) === (box === undefined)) {
54
+ throw Object.assign(new YaliError('AUDIO_INVALID', 'A reverb zone needs exactly one of sphere or box.', 'Pass { sphere: radius } or { box: [x, y, z] } (half extents, m).'), { path: o.sphere === undefined ? 'sphere' : 'box' });
55
+ }
56
+ const dims = box ?? [o.sphere, 0, 0];
57
+ if (!dims.slice(0, box ? 3 : 1).every((d) => d > 0)) {
58
+ throw Object.assign(new YaliError('AUDIO_INVALID', `Reverb zone size ${dims.join(', ')}.`, 'Give sizes above 0 m.'), { path: box ? 'box' : 'sphere' });
59
+ }
60
+ return { shape: box ? 1 : 0, x: dims[0], y: dims[1], z: dims[2], fade: o.fade ?? 2, decay: o.decay ?? 1.5, wet: o.wet ?? 0.4 };
61
+ }
62
+ /** Encoded audio formats the clip loader serves. */
63
+ const AUDIO_EXTENSIONS = ['.ogg', '.oga', '.opus', '.wav', '.mp3', '.flac', '.m4a', '.aac'];
64
+ /**
65
+ * An asset-server loader for clips (ADR-0116): `assets.load<ClipId>('sounds/step.ogg')` decodes into
66
+ * `clips`, and a hot reload of the file swaps the sound under the same id. `audioPlugin` registers
67
+ * it with the app's asset server itself when there is one.
68
+ */
69
+ export function audioClipLoader(clips) {
70
+ return {
71
+ type: 'audio',
72
+ extensions: AUDIO_EXTENSIONS,
73
+ decode: (bytes, ctx) => clips.decodeFor(ctx.path, bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength)),
74
+ byteSize: (id) => {
75
+ const b = clips.get(id);
76
+ return b ? b.length * b.numberOfChannels * 4 : 0;
77
+ },
78
+ fallback: () => 0,
79
+ };
80
+ }
81
+ /**
82
+ * `audio.Source` values (ADR-0096) for clip `clip`: put on an entity with a transform; it plays
83
+ * from there. Set `play` to 0 to stop it, 1 to start it again.
84
+ *
85
+ * @example
86
+ * world.insert(engine, audio.Source, audioSource(hum, { loop: true, refDistance: 3 }));
87
+ */
88
+ export function audioSource(clip, o = {}) {
89
+ if (!Number.isInteger(clip) || clip < 1) {
90
+ throw Object.assign(new YaliError('AUDIO_INVALID', `Clip ${clip} is not a clip id.`, 'Pass the id audio.clips.load(url) or audio.clips.add(buffer) resolved to.'), { path: 'clip' });
91
+ }
92
+ return {
93
+ clip,
94
+ volume: o.volume ?? 1,
95
+ pitch: o.pitch ?? 1,
96
+ loop: o.loop ? 1 : 0,
97
+ play: (o.play ?? true) ? 1 : 0,
98
+ spatial: (o.spatial ?? true) ? 1 : 0,
99
+ distanceModel: o.distanceModel === 'linear' ? 0 : o.distanceModel === 'exponential' ? 2 : 1,
100
+ refDistance: o.refDistance ?? 1,
101
+ maxDistance: o.maxDistance ?? 100,
102
+ rolloff: o.rolloff ?? 1,
103
+ coneInner: o.cone?.inner ?? 360,
104
+ coneOuter: o.cone?.outer ?? 360,
105
+ coneOuterGain: o.cone?.outerGain ?? 0,
106
+ };
107
+ }
108
+ /**
109
+ * Diffraction's four detours (ADR-0130) for a source `dist` m from the listener at `lp` along `u`: through
110
+ * points `DETOUR` m around the source, across the line to it; for each, a ray from the listener to the
111
+ * point and one from the point to the source (8 rays, in pairs), handed to `push`.
112
+ */
113
+ function detours(lp, u, dist, push, radius, margin) {
114
+ // Two directions across the line: u × up (or u × x when the line is vertical), and u × that.
115
+ let a = Math.abs(u[1]) < 0.95 ? [-u[2], 0, u[0]] : [0, u[2], -u[1]];
116
+ const al = Math.hypot(a[0], a[1], a[2]);
117
+ a = [a[0] / al, a[1] / al, a[2] / al];
118
+ const b = [u[1] * a[2] - u[2] * a[1], u[2] * a[0] - u[0] * a[2], u[0] * a[1] - u[1] * a[0]];
119
+ const src = [lp[0] + u[0] * dist, lp[1] + u[1] * dist, lp[2] + u[2] * dist];
120
+ for (const [d, sign] of [[a, 1], [a, -1], [b, 1], [b, -1]]) {
121
+ const pt = [src[0] + d[0] * radius * sign, src[1] + d[1] * radius * sign, src[2] + d[2] * radius * sign];
122
+ // Listener → point (margin short of the listener), then point → source (margin short of the source).
123
+ const l1 = Math.hypot(pt[0] - lp[0], pt[1] - lp[1], pt[2] - lp[2]);
124
+ const v1 = [(pt[0] - lp[0]) / l1, (pt[1] - lp[1]) / l1, (pt[2] - lp[2]) / l1];
125
+ push([lp[0] + v1[0] * margin, lp[1] + v1[1] * margin, lp[2] + v1[2] * margin], v1, Math.max(0, l1 - margin));
126
+ const v2 = [(src[0] - pt[0]) / radius, (src[1] - pt[1]) / radius, (src[2] - pt[2]) / radius];
127
+ push(pt, v2, Math.max(0, radius - margin));
128
+ }
129
+ }
130
+ /**
131
+ * Spatial audio (ADR-0096): every entity with `audio.Source` and a `GlobalTransform` plays its
132
+ * clip from where it is, heard from the `audio.Listener` entity or, without one, the render
133
+ * camera. Runs in Extract, after transforms propagate. Provides `audio`; tools `audio.voices`
134
+ * and `audio.volume`.
135
+ *
136
+ * @example
137
+ * App.create({ core, plugins: [renderPlugin({ canvas }), audioPlugin(), transformsPlugin(), game] });
138
+ * const audio = app.resource<AudioContextResource>('audio');
139
+ * world.insert(e, audio.Source, audioSource(await audio.clips.load('hum.ogg'), { loop: true }));
140
+ */
141
+ export function audioPlugin(options = {}) {
142
+ return {
143
+ name: '@yali-engine/audio',
144
+ version: '0.4.0',
145
+ // Built after the asset server when there is one, so its clip loader can register (ADR-0116), and
146
+ // after physics, whose rays occlusion casts (ADR-0127).
147
+ dependencies: [
148
+ { name: '@yali-engine/assets', range: '^0.4.0', optional: true },
149
+ { name: '@yali-engine/physics', range: '^0.4.0', optional: true },
150
+ ],
151
+ build(b) {
152
+ const world = b.app.world;
153
+ const context = options.context ?? newContext();
154
+ const mixer = new AudioMixer(context, undefined, options.element);
155
+ if ((options.assets ?? true) && b.app.hasResource('assets'))
156
+ b.app.resource('assets').register(audioClipLoader(mixer.clips));
157
+ mixer.volume = options.volume ?? 1;
158
+ const comps = registerAudioComponents(world);
159
+ const { GlobalTransform } = registerTransforms(world);
160
+ const sources = world.query({
161
+ with: [comps.Source, GlobalTransform],
162
+ columns: [
163
+ [comps.Source, 'clip'],
164
+ [comps.Source, 'volume'],
165
+ [comps.Source, 'pitch'],
166
+ [comps.Source, 'loop'],
167
+ [comps.Source, 'play', 'write'],
168
+ [comps.Source, 'spatial'],
169
+ [comps.Source, 'distanceModel'],
170
+ [comps.Source, 'refDistance'],
171
+ [comps.Source, 'maxDistance'],
172
+ [comps.Source, 'rolloff'],
173
+ [comps.Source, 'coneInner'],
174
+ [comps.Source, 'coneOuter'],
175
+ [comps.Source, 'coneOuterGain'],
176
+ [GlobalTransform, 't'],
177
+ [GlobalTransform, 'r'],
178
+ ],
179
+ });
180
+ const listeners = world.query({ with: [comps.Listener, GlobalTransform], columns: [[GlobalTransform, 't'], [GlobalTransform, 'r']] });
181
+ const zones = world.query({
182
+ with: [comps.ReverbZone, GlobalTransform],
183
+ columns: [
184
+ [comps.ReverbZone, 'shape'],
185
+ [comps.ReverbZone, 'x'],
186
+ [comps.ReverbZone, 'y'],
187
+ [comps.ReverbZone, 'z'],
188
+ [comps.ReverbZone, 'fade'],
189
+ [comps.ReverbZone, 'decay'],
190
+ [comps.ReverbZone, 'wet'],
191
+ [GlobalTransform, 't'],
192
+ [GlobalTransform, 'r'],
193
+ ],
194
+ });
195
+ const dims = [0, 0, 0];
196
+ const local = [0, 0, 0];
197
+ const inv = [0, 0, 0, 1];
198
+ const resource = { ...comps, context, clips: mixer.clips, mixer };
199
+ b.provide('audio', resource);
200
+ const p = { clip: 0, volume: 1, pitch: 1, loop: false, spatial: true, distanceModel: 'inverse', refDistance: 1, maxDistance: 100, rolloff: 1, coneInner: 360, coneOuter: 360, coneOuterGain: 0, occlusion: 0 };
201
+ // Doppler (ADR-0127): each entity's last position and smoothed velocity, the listener's too.
202
+ const dop = options.doppler === false ? null : { scale: 1, speedOfSound: 343, maxSpeed: 150, ...(typeof options.doppler === 'object' ? options.doppler : {}) };
203
+ const motion = new Map();
204
+ const listenerMotion = new Float64Array(7);
205
+ const seen = new Set();
206
+ // Occlusion (ADR-0127): physics' rays unless a query is given; the smoothed level per source.
207
+ const occOpts = typeof options.occlusion === 'object' ? options.occlusion : {};
208
+ const physics = b.app.hasResource('physics') ? b.app.resource('physics') : null;
209
+ // On unless `false`: through the query when given, else physics' rays (an options object without a query
210
+ // used to turn it off, ADR-0130).
211
+ const occluding = options.occlusion !== false && (occOpts.query !== undefined || typeof physics?.raycasts === 'function');
212
+ mixer.occlusion = occluding;
213
+ const occlusion = new Map();
214
+ const margin = occOpts.margin ?? 0.25;
215
+ const mask = occOpts.mask ?? 0xffffffff;
216
+ // ADR-0130: thickness (physics' distances only), diffraction around the wall, early reflections.
217
+ const thickness = Math.max(1e-3, occOpts.thickness ?? 0.25);
218
+ const diffraction = Math.min(1, Math.max(0, occOpts.diffraction ?? 0.6));
219
+ const radius = occOpts.radius ?? 1.5;
220
+ const refOpts = typeof options.reflections === 'object' ? options.reflections : {};
221
+ const reflecting = options.reflections !== false && typeof physics?.raycasts === 'function';
222
+ const refDistance = refOpts.distance ?? 30;
223
+ const refGain = refOpts.gain ?? 0.5;
224
+ const refMask = refOpts.mask ?? 0xffffffff;
225
+ /** Per source cast this frame: its key, its forward and back rays, their length, its first detour ray (−1: none). */
226
+ const srcKey = [];
227
+ const srcFwd = [];
228
+ const srcBack = [];
229
+ const srcLen = [];
230
+ const srcDet = [];
231
+ /** The listener's right when the reflection rays were cast (for panning). */
232
+ const refRight = [1, 0, 0];
233
+ /**
234
+ * Tracks entity `key`'s velocity in `m` (x, y, z last position; vx, vy, vz; 1 once seen), from its
235
+ * position `at` after `dt` seconds: the move's velocity, smoothed over ~0.1 s; a teleport resets it.
236
+ */
237
+ const track = (m, at, dt) => {
238
+ if (m[6] && dt > 0) {
239
+ const vx = (at[0] - m[0]) / dt;
240
+ const vy = (at[1] - m[1]) / dt;
241
+ const vz = (at[2] - m[2]) / dt;
242
+ if (Math.hypot(vx, vy, vz) > dop.maxSpeed) {
243
+ m[3] = m[4] = m[5] = 0;
244
+ }
245
+ else {
246
+ const k = 1 - Math.exp(-dt / 0.1);
247
+ m[3] += (vx - m[3]) * k;
248
+ m[4] += (vy - m[4]) * k;
249
+ m[5] += (vz - m[5]) * k;
250
+ }
251
+ }
252
+ m[0] = at[0];
253
+ m[1] = at[1];
254
+ m[2] = at[2];
255
+ m[6] = 1;
256
+ };
257
+ const rays = [];
258
+ /** This frame's reflection rays (ADR-0130), cast with the occlusion rays when physics casts both. */
259
+ const refRays = [];
260
+ const offset = [0, 0, 0];
261
+ const pos = new Float64Array(3);
262
+ const fallback = { position: [0, 0, 0], forward: [0, 0, -1], up: [0, 1, 0] };
263
+ const listenerPose = () => {
264
+ let pose = null;
265
+ listeners.forEachChunk((c) => {
266
+ if (pose || c.length === 0)
267
+ return;
268
+ const t = c.f64(0);
269
+ const r = c.f32(1);
270
+ pose = poseOf([t[0], t[1], t[2]], [r[0], r[1], r[2], r[3]]);
271
+ });
272
+ if (pose)
273
+ return pose;
274
+ const cam = b.app.hasResource('render') ? b.app.resource('render').camera : undefined;
275
+ return cam ? cameraPose(cam.eye, cam.target) : fallback;
276
+ };
277
+ b.system({
278
+ name: 'audio.mix',
279
+ stage: 'Extract',
280
+ run: (f) => {
281
+ const pose = listenerPose();
282
+ const dt = f.time.virtualDelta;
283
+ if (dop)
284
+ track(listenerMotion, pose.position, dt);
285
+ // Last frame's rays (cast after the sources were read): each source's level, the reflections.
286
+ if (rays.length || refRays.length) {
287
+ let hits;
288
+ let refHits = [];
289
+ if (occOpts.query) {
290
+ hits = rays.length ? occOpts.query(rays.map((r) => [r[0], r[1], r[2]])) : [];
291
+ if (refRays.length)
292
+ refHits = physics.raycasts(refRays);
293
+ }
294
+ else {
295
+ const all = physics.raycasts(refRays.length ? rays.concat(refRays) : rays);
296
+ hits = all;
297
+ refHits = all.slice(rays.length);
298
+ }
299
+ const blocked = (i) => (i >= 0 ? hits[i] !== null && hits[i] !== false : false);
300
+ const k = 1 - Math.exp(-dt / 0.08);
301
+ for (let s = 0; s < srcKey.length; s++) {
302
+ let target = 0;
303
+ const fh = hits[srcFwd[s]];
304
+ if (fh !== null && fh !== false) {
305
+ const bh = srcBack[s] >= 0 ? hits[srcBack[s]] : null;
306
+ if (typeof fh === 'object' && bh !== null && typeof bh === 'object') {
307
+ // The solid between the first wall's near side and the last wall's far side (ADR-0130);
308
+ // a surface with no depth (a single-sided sheet) has an unknown thickness: fully occluding.
309
+ const span = srcLen[s] - fh.distance - bh.distance;
310
+ target = span > 1e-3 ? 1 - Math.exp(-span / thickness) : 1;
311
+ }
312
+ else
313
+ target = 1;
314
+ // Diffraction: the share of the detours clear both ways lets that much around the wall.
315
+ if (srcDet[s] >= 0) {
316
+ let clear = 0;
317
+ for (let d = 0; d < 4; d++)
318
+ if (!blocked(srcDet[s] + 2 * d) && !blocked(srcDet[s] + 2 * d + 1))
319
+ clear++;
320
+ target *= 1 - (diffraction * clear) / 4;
321
+ }
322
+ }
323
+ const o = occlusion.get(srcKey[s]) ?? 0;
324
+ occlusion.set(srcKey[s], o + (target - o) * k);
325
+ }
326
+ if (refHits.length === 6) {
327
+ for (let i = 0; i < 6; i++) {
328
+ const h = refHits[i];
329
+ const axis = i >> 1;
330
+ const pan = (i & 1 ? -1 : 1) * refRight[axis];
331
+ if (h)
332
+ mixer.reflection(i, (2 * h.distance) / (dop?.speedOfSound ?? 343), refGain / (1 + 2 * h.distance), pan);
333
+ else
334
+ mixer.reflection(i, 0, 0, 0);
335
+ }
336
+ }
337
+ }
338
+ rays.length = 0;
339
+ refRays.length = 0;
340
+ srcKey.length = srcFwd.length = srcBack.length = srcLen.length = srcDet.length = 0;
341
+ // This frame's reflection rays: ±x, ±y, ±z from the listener, panned by the listener's right.
342
+ if (reflecting) {
343
+ const fw = pose.forward;
344
+ const up = pose.up;
345
+ refRight[0] = fw[1] * up[2] - fw[2] * up[1];
346
+ refRight[1] = fw[2] * up[0] - fw[0] * up[2];
347
+ refRight[2] = fw[0] * up[1] - fw[1] * up[0];
348
+ for (let i = 0; i < 6; i++) {
349
+ const dir = [0, 0, 0];
350
+ dir[i >> 1] = i & 1 ? -1 : 1;
351
+ refRays.push([[pose.position[0], pose.position[1], pose.position[2]], dir, refDistance, refMask]);
352
+ }
353
+ }
354
+ seen.clear();
355
+ mixer.beginFrame(pose);
356
+ // Reverb zones (ADR-0116): each at the listener's weight in it (the listener in the zone's frame).
357
+ mixer.beginZones();
358
+ zones.forEachChunk((c) => {
359
+ const shape = c.u8(0);
360
+ const x = c.f32(1);
361
+ const y = c.f32(2);
362
+ const z = c.f32(3);
363
+ const fade = c.f32(4);
364
+ const decay = c.f32(5);
365
+ const wet = c.f32(6);
366
+ const t = c.f64(7);
367
+ const r = c.f32(8);
368
+ for (let i = 0; i < c.length; i++) {
369
+ inv[0] = -r[i * 4];
370
+ inv[1] = -r[i * 4 + 1];
371
+ inv[2] = -r[i * 4 + 2];
372
+ inv[3] = r[i * 4 + 3];
373
+ rotateTo(inv, pose.position[0] - t[i * 3], pose.position[1] - t[i * 3 + 1], pose.position[2] - t[i * 3 + 2], local);
374
+ dims[0] = x[i];
375
+ dims[1] = y[i];
376
+ dims[2] = z[i];
377
+ mixer.zone(c.entity(i), decay[i], wet[i], zoneWeight(shape[i], dims, fade[i], local));
378
+ }
379
+ });
380
+ mixer.endZones();
381
+ sources.forEachChunk((c) => {
382
+ const clip = c.u32(0);
383
+ const volume = c.f32(1);
384
+ const pitch = c.f32(2);
385
+ const loop = c.u8(3);
386
+ const play = c.u8(4);
387
+ const spatial = c.u8(5);
388
+ const model = c.u8(6);
389
+ const ref = c.f32(7);
390
+ const max = c.f32(8);
391
+ const rolloff = c.f32(9);
392
+ const inner = c.f32(10);
393
+ const outer = c.f32(11);
394
+ const outerGain = c.f32(12);
395
+ const t = c.f64(13);
396
+ const r = c.f32(14);
397
+ for (let i = 0; i < c.length; i++) {
398
+ if (!play[i])
399
+ continue;
400
+ const key = c.entity(i);
401
+ p.clip = clip[i];
402
+ p.volume = volume[i];
403
+ p.pitch = pitch[i];
404
+ p.loop = loop[i] !== 0;
405
+ p.spatial = spatial[i] !== 0;
406
+ p.distanceModel = modelOf(model[i]);
407
+ p.refDistance = ref[i];
408
+ p.maxDistance = max[i];
409
+ p.rolloff = rolloff[i];
410
+ p.coneInner = inner[i];
411
+ p.coneOuter = outer[i];
412
+ p.coneOuterGain = outerGain[i];
413
+ pos[0] = t[i * 3];
414
+ pos[1] = t[i * 3 + 1];
415
+ pos[2] = t[i * 3 + 2];
416
+ const forward = rotate([r[i * 4], r[i * 4 + 1], r[i * 4 + 2], r[i * 4 + 3]], [0, 0, -1]);
417
+ seen.add(key);
418
+ if (p.spatial) {
419
+ relative(pos, pose.position, offset);
420
+ const dist = Math.hypot(offset[0], offset[1], offset[2]);
421
+ if (dop && dop.scale > 0) {
422
+ let m = motion.get(key);
423
+ if (!m)
424
+ motion.set(key, (m = new Float64Array(7)));
425
+ track(m, pos, dt);
426
+ p.pitch *= dopplerFactor(offset, [m[3], m[4], m[5]], [listenerMotion[3], listenerMotion[4], listenerMotion[5]], dop.speedOfSound) ** dop.scale;
427
+ }
428
+ p.occlusion = occlusion.get(key) ?? 0;
429
+ // This frame's rays, cast at the next frame's start (one batched query a frame).
430
+ if (occluding && dist > 2 * margin) {
431
+ const s = 1 / dist;
432
+ const u = [offset[0] * s, offset[1] * s, offset[2] * s];
433
+ const lp = pose.position;
434
+ const len = dist - 2 * margin;
435
+ srcKey.push(key);
436
+ srcLen.push(len);
437
+ srcFwd.push(rays.length);
438
+ rays.push([[lp[0] + u[0] * margin, lp[1] + u[1] * margin, lp[2] + u[2] * margin], u, len, mask]);
439
+ // From the source back (ADR-0130): the last wall's far side, for its thickness.
440
+ srcBack.push(occOpts.query ? -1 : rays.length);
441
+ if (!occOpts.query)
442
+ rays.push([[lp[0] + u[0] * (dist - margin), lp[1] + u[1] * (dist - margin), lp[2] + u[2] * (dist - margin)], [-u[0], -u[1], -u[2]], len, mask]);
443
+ // Occluded now: four detours through points `radius` m around the source, across the line.
444
+ if (diffraction > 0 && (p.occlusion ?? 0) > 0.02) {
445
+ srcDet.push(rays.length);
446
+ detours(lp, u, dist, (from, dir, d) => rays.push([from, dir, d, mask]), radius, margin);
447
+ }
448
+ else
449
+ srcDet.push(-1);
450
+ }
451
+ }
452
+ else
453
+ p.occlusion = 0;
454
+ // Played to its end (and not looping): the source says so, and lets the voice go.
455
+ if (!mixer.update(key, p, pos, forward)) {
456
+ play[i] = 0;
457
+ mixer.stop(key);
458
+ }
459
+ }
460
+ });
461
+ mixer.endFrame();
462
+ // Sources that stopped or went: their motion and occlusion go too.
463
+ for (const k of motion.keys())
464
+ if (!seen.has(k))
465
+ motion.delete(k);
466
+ for (const k of occlusion.keys())
467
+ if (!seen.has(k))
468
+ occlusion.delete(k);
469
+ },
470
+ });
471
+ if (options.resumeOnGesture ?? true) {
472
+ const ctx = context;
473
+ if (typeof ctx.resume === 'function' && typeof addEventListener === 'function') {
474
+ const resume = () => {
475
+ if (ctx.state === 'suspended')
476
+ void ctx.resume();
477
+ };
478
+ addEventListener('pointerdown', resume, { capture: true });
479
+ addEventListener('keydown', resume, { capture: true });
480
+ b.onDispose(() => {
481
+ removeEventListener('pointerdown', resume, { capture: true });
482
+ removeEventListener('keydown', resume, { capture: true });
483
+ });
484
+ }
485
+ }
486
+ b.counter('audio.voices', () => mixer.voices);
487
+ b.tool({
488
+ name: 'audio.voices',
489
+ description: 'The playing voices, the clips loaded, the master volume and the context state.',
490
+ input: { type: 'object', properties: {} },
491
+ run: () => ({
492
+ voices: mixer.voices,
493
+ started: mixer.started,
494
+ clips: mixer.clips.count,
495
+ volume: mixer.volume,
496
+ zones: mixer.zones,
497
+ state: context.state ?? 'offline',
498
+ // ADR-0127: whether occlusion runs, and the sources more than half occluded now.
499
+ occlusion: occluding,
500
+ occluded: [...occlusion.values()].filter((o) => o > 0.5).length,
501
+ doppler: dop ? dop.scale : 0,
502
+ }),
503
+ });
504
+ b.tool({
505
+ name: 'audio.volume',
506
+ description: 'Sets the master volume (linear, 0 = silent).',
507
+ input: { type: 'object', properties: { volume: { type: 'number', description: 'Linear gain, 0 or more.' } }, required: ['volume'] },
508
+ run: (args) => {
509
+ const v = Number(args.volume);
510
+ if (!(v >= 0))
511
+ throw Object.assign(new YaliError('AUDIO_INVALID', `Volume ${args.volume}.`, 'Pass a number 0 or more.'), { path: 'volume' });
512
+ mixer.volume = v;
513
+ return { volume: v };
514
+ },
515
+ });
516
+ b.onDispose(() => {
517
+ mixer.dispose();
518
+ if (!options.context && 'close' in context)
519
+ void context.close();
520
+ });
521
+ },
522
+ };
523
+ }
524
+ function newContext() {
525
+ if (typeof AudioContext === 'undefined') {
526
+ throw new YaliError('AUDIO_UNAVAILABLE', 'There is no Web Audio here (no AudioContext).', 'Run in a browser page, or pass audioPlugin({ context }) (an OfflineAudioContext in tests).');
527
+ }
528
+ return new AudioContext();
529
+ }
530
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /** Where the listener is and which way it faces (f64 position, unit vectors). */
2
+ export interface ListenerPose {
3
+ readonly position: ArrayLike<number>;
4
+ readonly forward: readonly [number, number, number];
5
+ readonly up: readonly [number, number, number];
6
+ }
7
+ /**
8
+ * A source's position relative to the listener, in f32 range: the listener sits at the origin of
9
+ * the audio graph and sources are placed relative to it, so a scene 10,000 km out sounds the same
10
+ * as one at the origin (Web Audio's positions are f32).
11
+ */
12
+ export declare function relative(source: ArrayLike<number>, listener: ArrayLike<number>, out?: number[]): number[];
13
+ /**
14
+ * The Doppler factor (ADR-0127): how much faster a sound plays heard by a listener moving at
15
+ * `listenerVel` from a source moving at `sourceVel` (m/s, world), the source `offset` from the listener
16
+ * (source − listener): (c − v_listener·u) / (c − v_source·u), u the unit vector from the source to the
17
+ * listener, c the speed of sound. Each speed along u is held within ±0.9 c (a supersonic source has no
18
+ * finite answer), so the factor stays between 1/19 and 19.
19
+ *
20
+ * @example
21
+ * dopplerFactor([10, 0, 0], [0, 0, 0], [0, 0, 0], 343); // 1: nothing moves
22
+ * dopplerFactor([-10, 0, 0], [-20, 0, 0], [0, 0, 0], 343); // > 1: a source 10 m away coming at 20 m/s
23
+ */
24
+ export declare function dopplerFactor(offset: ArrayLike<number>, sourceVel: ArrayLike<number>, listenerVel: ArrayLike<number>, c?: number): number;
25
+ /** `v` rotated by unit quaternion `q` (x, y, z, w). */
26
+ export declare function rotate(q: ArrayLike<number>, v: readonly number[]): [number, number, number];
27
+ /** `v` (x, y, z) rotated by unit quaternion `q` into `out` (no allocation: per-frame paths). */
28
+ export declare function rotateTo(q: ArrayLike<number>, x: number, y: number, z: number, out: number[]): number[];
29
+ /** An entity's facing from its rotation: forward −Z, up +Y (glTF's and the camera's convention). */
30
+ export declare function poseOf(position: ArrayLike<number>, q: ArrayLike<number>): ListenerPose;
31
+ /** The listener at an orbit camera: at its eye, facing its target, up +Y (orthogonalised). */
32
+ export declare function cameraPose(eye: ArrayLike<number>, target: ArrayLike<number>): ListenerPose;
33
+ /** Web Audio's distance models (the panner's `distanceModel`). */
34
+ export type DistanceModel = 'linear' | 'inverse' | 'exponential';
35
+ /**
36
+ * The gain a distance model gives at `d` (Web Audio's formulas, so tests and tools can predict
37
+ * what the panner does): `ref` the distance of full volume, `max` where `linear` reaches the end,
38
+ * `rolloff` how fast it falls.
39
+ */
40
+ export declare function distanceGain(model: DistanceModel, d: number, ref: number, max: number, rolloff: number): number;
41
+ /**
42
+ * How much of a reverb zone the listener hears (ADR-0116): 1 at least `fade` metres inside it,
43
+ * falling to 0 at its edge. `local` is the listener in the zone's frame (its rotation undone);
44
+ * `shape` 0 is a sphere of radius `dims[0]`, 1 a box of half extents `dims`.
45
+ */
46
+ export declare function zoneWeight(shape: number, dims: ArrayLike<number>, fade: number, local: ArrayLike<number>): number;
47
+ /**
48
+ * A reverb's impulse response (ADR-0116): stereo noise under an exponential decay that reaches −60 dB
49
+ * at `decay` seconds, the two channels decorrelated, written into `left` and `right` (each
50
+ * `decay × rate` samples, at most 6 s). Deterministic for a seed, so a run sounds the same.
51
+ */
52
+ export declare function impulseResponse(left: Float32Array, right: Float32Array, rate: number, decay: number, seed?: number): void;