Monorepo for Aesthetic.Computer aesthetic.computer
4
fork

Configure Feed

Select the types of activity you want to include in your feed.

lacma-2026 demo: clean audio concat + drop prompt sim + retime narration

Audio sync fix: switching from `ffmpeg -f concat -c copy` (demuxer
stream-copy, brittle when source sample rates/PTS differ) to the
`concat` filter with full re-encode and explicit aresample on each
input's audio:

[0:a]aresample=48000:async=1,pan=stereo|c0=c0|c1=c0[a0];
[1:a]aresample=48000:async=1[a1];
[v0][a0][v1][a1]concat=n=2:v=1:a=1[v][a]

This ensures sample-aligned, PTS-continuous output across the boundary
between demo-viennese and the shutdown strobe. Fixes user-reported
"notepat audio playback still isn't heard in time with the video".

Sequence simplified — prompt-off simulation dropped. On real hardware
prompt.mjs receives "off" to trigger draw_shutdown_anim(); my PIL
prompt sim was a full-screen cream box that didn't reflect the actual
piece and made the flow feel more fake than it needed to. Cleaner to
go boot → notepat → shutdown directly with a byline explaining how
the real trigger works.

New 19.27s video:
0.00 – 3.00 boot greeting (real capture, own TTS)
3.00 – 17.75 notepat playing the Viennese waltz (real capture)
17.75 – 19.27 shutdown strobe (simulated, matches C code exactly)

Narration retimed: cues at 0:06, 0:09, 0:13, 0:16 land squarely on
the instrument section, nothing over the boot (has own TTS) or the
shutdown (will have own TTS + chime once hardware-recaptured).

Caption sequence chip + byline updated to match.
Cachebuster v=4 → v=5.

+18 -18
+11 -11
grants/lacma-2026/demo-narration.md
··· 1 - # title: AC Native — full demo narration (intro → prompt → notepat → prompt → off → bye) 1 + # title: AC Native — demo narration (boot → notepat → shutdown) 2 2 # voice: Daniel 3 3 # rate: 175 4 4 # 5 - # Subtitles only during the notepat section and the brief "type off" 6 - # moment. The intro (0:00–0:03) has its own boot TTS ("hi @jeffrey, 7 - # enjoy Los Angeles!"), and the shutdown animation (0:19.75+) has its 8 - # own TTS + chime baked into ac-native — no narration needed there. 5 + # Subtitles narrate only the instrument section. The boot (0:00–0:03) 6 + # has its own "hi @jeffrey" TTS baked into the recording; the shutdown 7 + # (0:17.75+) will have its own "bye @handle" TTS + chime from ac-native 8 + # once hardware-recaptured. Both left unnarrated to let native audio 9 + # stand on its own. 9 10 10 - [0:04] notepat - the default piece. 11 - [0:07] Thirty-two voices, 192 kilohertz. 12 - [0:11] Chord colors track what you play. 13 - [0:14] A Viennese waltz, played live. 14 - [0:18] Back to the prompt. Type 'off'. 15 - [0:20] --silence-- 11 + [0:06] notepat - the default piece. 12 + [0:09] Thirty-two voices, 192 kilohertz. 13 + [0:13] Chord colors track what you play. 14 + [0:16] A Viennese waltz, played live. 15 + [0:18] --silence--
+7 -7
system/public/lacma-2026/index.html
··· 617 617 <div class="demo-pair"> 618 618 <div class="demo-frame"> 619 619 <video id="demo-video" 620 - poster="https://assets.aesthetic.computer/lacma-2026/ac-native-demo-narrated-poster.jpg?v=4" 620 + poster="https://assets.aesthetic.computer/lacma-2026/ac-native-demo-narrated-poster.jpg?v=5" 621 621 autoplay muted loop playsinline controls preload="metadata"> 622 - <source src="https://assets.aesthetic.computer/lacma-2026/ac-native-demo-narrated.webm?v=4" type="video/webm"> 623 - <source src="https://assets.aesthetic.computer/lacma-2026/ac-native-demo-narrated.mp4?v=4" type="video/mp4"> 624 - Your browser doesn't support HTML5 video. <a href="https://assets.aesthetic.computer/lacma-2026/ac-native-demo-narrated.mp4?v=4">Download the MP4</a>. 622 + <source src="https://assets.aesthetic.computer/lacma-2026/ac-native-demo-narrated.webm?v=5" type="video/webm"> 623 + <source src="https://assets.aesthetic.computer/lacma-2026/ac-native-demo-narrated.mp4?v=5" type="video/mp4"> 624 + Your browser doesn't support HTML5 video. <a href="https://assets.aesthetic.computer/lacma-2026/ac-native-demo-narrated.mp4?v=5">Download the MP4</a>. 625 625 </video> 626 626 </div> 627 627 <div class="demo-hardware"> ··· 637 637 </div> 638 638 <div class="demo-caption"> 639 639 <div class="sequence"> 640 - <span class="step">boot</span><span class="arrow">→</span><span class="step">notepat</span><span class="arrow">→</span><span class="step">waltz</span><span class="arrow">→</span><span class="step">prompt</span><span class="arrow">→</span><span class="step">type 'off'</span><span class="arrow">→</span><span class="step">bye @jeffrey</span> 640 + <span class="step">boot</span><span class="arrow">→</span><span class="step">notepat</span><span class="arrow">→</span><span class="step">Viennese waltz</span><span class="arrow">→</span><span class="step">bye @jeffrey</span> 641 641 </div> 642 - <div class="byline">boot + notepat captured live · prompt + shutdown screens simulated pending hardware recapture</div> 642 + <div class="byline">boot + notepat captured live on an AC Blank · shutdown strobe simulated (pending hardware recapture — on real hardware, prompt.mjs receives 'off' to trigger it)</div> 643 643 </div> 644 644 <script> 645 645 (() => { 646 646 const tabs = document.querySelectorAll(".demo-tab"); 647 647 const video = document.getElementById("demo-video"); 648 648 const ASSET_BASE = "https://assets.aesthetic.computer/lacma-2026"; 649 - const V = "?v=4"; // bump when videos are re-rendered 649 + const V = "?v=5"; // bump when videos are re-rendered 650 650 tabs.forEach(tab => tab.addEventListener("click", () => { 651 651 if (tab.classList.contains("active")) return; 652 652 tabs.forEach(t => t.classList.remove("active"));