From f4c4629bb20052131642f251f0dfdcd1a24e1e6e Mon Sep 17 00:00:00 2001 From: cbaucom Date: Mon, 22 Jun 2026 09:57:04 -0400 Subject: [PATCH] Add sequential audio clip playlist for multi-track soundtrack. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replaces single soundtrackFilename with ordered audioClips in slideshow.json, sequential RenderPlan segments, and playlist UI — foundation for loudness normalization and media looping. Closes #45 Co-authored-by: Cursor --- .claude/plans/multi-track-audio-breakdown.md | 96 ++++++++++++++++++ specs/multi-track-audio-timeline.md | 40 ++++++++ src/composition/SlideshowComposition.tsx | 46 +++++++-- src/composition/soundtrackVolume.ts | 4 + src/editor-shell/App.tsx | 36 ++++--- src/editor-shell/EditorSidebar.tsx | 13 +-- src/editor-shell/SoundtrackPanel.tsx | 100 ++++++++++++++----- src/editor-shell/slidePersistence.test.ts | 99 +++++++++++++++--- src/editor-shell/slidePersistence.ts | 26 ++++- src/editor-shell/useBeatGrid.ts | 8 +- src/editor-shell/useProject.ts | 60 ++++++----- src/project-store/schema.ts | 6 ++ src/sequence-planner/ducking.test.ts | 28 +++--- src/sequence-planner/index.ts | 14 ++- src/sequence-planner/planner.test.ts | 62 ++++++++---- src/sequence-planner/planner.ts | 47 ++++++--- src/sequence-planner/types.ts | 9 ++ src/timeline-core/audioClips.test.ts | 34 +++++++ src/timeline-core/audioClips.ts | 18 ++++ src/timeline-core/index.ts | 3 +- src/timeline-core/types.ts | 5 + 21 files changed, 600 insertions(+), 154 deletions(-) create mode 100644 .claude/plans/multi-track-audio-breakdown.md create mode 100644 specs/multi-track-audio-timeline.md create mode 100644 src/timeline-core/audioClips.test.ts create mode 100644 src/timeline-core/audioClips.ts diff --git a/.claude/plans/multi-track-audio-breakdown.md b/.claude/plans/multi-track-audio-breakdown.md new file mode 100644 index 0000000..5ff7e37 --- /dev/null +++ b/.claude/plans/multi-track-audio-breakdown.md @@ -0,0 +1,96 @@ +# Approved issue breakdown — Multi-track audio timeline + +Source: parent PRD issue #1. Approved by Chris on 2026-06-22. Expands PRD out-of-scope items (multi-track audio, media looping). Create in listed order; blocked-by references use real issue numbers. + +--- + +## Slice 19 — Audio clip sequence: model, planner, composition + +**Type**: AFK | **Stories**: 17 | **Blocked by**: #34 | **Issue**: #45 + +**What to build**: Replace the single-soundtrack model with an ordered, sequential playlist of audio clips. Migrate `soundtrackFilename` → `audioClips` on load. + +**Acceptance criteria**: +- [ ] Given multiple audio files in the folder, when the user builds a clip sequence (add / reorder / remove), then `slideshow.json` stores `audioClips: [{ filename, gainDb? }]` and persists across reopen. +- [ ] Given a clip sequence, when planned, then `RenderPlan` contains ordered audio segments with absolute `startFrame`, `durationInFrames`, `blobUrl`, and per-clip gain (default 0 dB). +- [ ] Given sequential clips, when played/exported, then clip 2 starts exactly when clip 1 ends (frame-accurate, no gap/overlap). +- [ ] Given an existing project with only `soundtrackFilename`, when opened, then it loads as a one-clip sequence without data loss. + +**Technical notes**: Timeline Core `AudioClip` type; `slidePersistence` migration; `planner.ts` multi-audio; `SlideshowComposition` multiple `