From a88bbd3488f0beb39789db025256b418bf4c303a Mon Sep 17 00:00:00 2001 From: "prompt.ac/@jeffrey" Date: Wed, 22 Apr 2026 15:26:09 -0700 Subject: [PATCH] lacma-2026 demo: fix audio/video sync + longer 8-bar waltz MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Root cause: ac-native-macos-core captures frames at ~84.35 fps, but demo.sh encodes at exactly 60 fps — so the MKV played video 40% slower than real-time while audio ran at wall-clock speed. Result: notepat key-highlight frames and waltz audio drifted apart over ~15 seconds. Fix: re-encoded from the raw PNG frames in /tmp/ac-demo-final/ using the actual capture fps (computed from frame_count / mix.wav_duration = 1664 / 19.727 = 84.352 fps) as the -framerate input, then resample to 60 fps for delivery with -vf fps=60. Output plays at real-time and audio/video stay locked. Also ran with BARS=8 (was 4) for a fuller Viennese waltz — the extra three bars let the groove establish and breathe instead of cutting off 5 seconds in. New fresh-demo.mp4 is 19.73s (was 15.77s). Full composed video is now 21.25s: 0:00 – 2:00 boot + "hi @jeffrey" TTS 2:00 – 3:70 prompt piece typing "notepat" 3:70 – 5:00 notepat loading 5:00 – 19:73 8-bar Viennese waltz 19:73 – 21:25 shutdown strobe Narration retimed (5 cues at 0:02.5, 0:05, 0:08, 0:12, 0:16) to land inside the longer instrument section; boot and shutdown still unnarrated so the native TTS / chime can stand on their own. Desktop preview copies refreshed at ~/Desktop/lacma-videos/. Cachebuster v=6 → v=7. Note: the sync issue lives in demo.sh in the nervous-newton-134547 worktree (owned by another thread). Fix described here should be merged into that script as `-framerate $(echo "scale=4; $N_FRAMES / $MIX_DUR" | bc) -vf fps=60` so future captures don't need manual re-encoding. --- grants/lacma-2026/demo-narration.md | 10 +++++----- system/public/lacma-2026/index.html | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/grants/lacma-2026/demo-narration.md b/grants/lacma-2026/demo-narration.md index 5a3cc67cbd..898acb2fbf 100644 --- a/grants/lacma-2026/demo-narration.md +++ b/grants/lacma-2026/demo-narration.md @@ -1,15 +1,15 @@ -# title: AC Native — fresh demo narration (boot → prompt → notepat → shutdown) +# title: AC Native — synced demo narration (boot → prompt → notepat → shutdown) # voice: Daniel # rate: 175 # # Subtitles narrate only from the prompt onward. Boot (0:00–0:02) has its -# own "hi @jeffrey, enjoy Los Angeles!" TTS baked in; shutdown (0:15.77+) +# own "hi @jeffrey, enjoy Los Angeles!" TTS baked in; shutdown (0:19.7+) # will have its own "bye @handle" TTS + chime from ac-native once # hardware-recaptured. [0:02.5] At the prompt — type a piece name. [0:05] notepat: the default instrument. [0:08] Thirty-two voices at 192 kilohertz. -[0:11] Chord colors track what you play. -[0:13] A Viennese waltz, played live. -[0:16] --silence-- +[0:12] Chord colors track what you play. +[0:16] A Viennese waltz, played live. +[0:19] --silence-- diff --git a/system/public/lacma-2026/index.html b/system/public/lacma-2026/index.html index 4db1c13c56..87849ba4ef 100644 --- a/system/public/lacma-2026/index.html +++ b/system/public/lacma-2026/index.html @@ -617,11 +617,11 @@
@@ -646,7 +646,7 @@ const tabs = document.querySelectorAll(".demo-tab"); const video = document.getElementById("demo-video"); const ASSET_BASE = "https://assets.aesthetic.computer/lacma-2026"; - const V = "?v=6"; // bump when videos are re-rendered + const V = "?v=7"; // bump when videos are re-rendered tabs.forEach(tab => tab.addEventListener("click", () => { if (tab.classList.contains("active")) return; tabs.forEach(t => t.classList.remove("active")); -- 2.51.2