festifun/frontend
m3ultra c24af8029e Audio is the master clock + spatial audio free-roam (fresh-eyes opts 1 & feature 1)
Master clock: the selected soundtrack (new GET /api/audio/{id} —
listening-quality stereo AAC, lazily ffmpeg-extracted and cached in
data/work/audio_hq/) plays through WebAudio, and t_global derives from
AudioContext.currentTime. Every <video> is muted picture-only, so hard
seeks and playbackRate corrections are inaudible (the unmuted video
used to warble on every nudge). Graceful fallback to the old
performance.now() clock + <video> audio when a track can't load, with
an in-place upgrade if the decode lands mid-play. Drift is compensated
in the track's playbackRate; _resync() now recomputes from the live
clock since the soundtrack keeps playing while rAF is throttled.

Spatial audio (🎧 3D audio, shown when poses exist): every enabled
camera's track plays through an HRTF PannerNode at its live
reconstructed pose, gains normalized 1/sqrt(N); the listener follows
the viewer camera each frame (free roam, follow-cam, and M9 paths).
Tracks that finish decoding mid-play join the mix in place; toggling,
seeking, rate and enable changes rebuild the graph at the current
t_global with no timeline jump.

The window.__f4d debug hook is now also available in production builds
via localStorage f4dDebug=1 (headless panes throttle rAF; the pump is
the only way to drive the loop there).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 17:02:48 +10:00
..
src Audio is the master clock + spatial audio free-roam (fresh-eyes opts 1 & feature 1) 2026-07-17 17:02:48 +10:00
index.html Audio is the master clock + spatial audio free-roam (fresh-eyes opts 1 & feature 1) 2026-07-17 17:02:48 +10:00
package-lock.json Splat upgrade (ideas.md #1) + MODELBEAST crossover 2026-07-16 22:32:01 +10:00
package.json Splat upgrade (ideas.md #1) + MODELBEAST crossover 2026-07-16 22:32:01 +10:00
vite.config.js Deploy-ready: path-prefix hosting (digalot.fyi/festifun) + deploy artifacts 2026-07-16 13:20:36 +10:00