From 2837e4dd30e1ca251f0c825360e36d4bfee475ee Mon Sep 17 00:00:00 2001 From: Maxwell Young Date: Thu, 17 Sep 2026 16:36:40 +1200 Subject: [PATCH] Add Playback as an in-development project Native macOS app for recording takes synced to a track. Uses a concept cover until there's a demo clip shot with the app. Compact concept covers now draw bars instead of truncated labels, which overlapped in list rows. --- src/components/ProjectMedia.tsx | 11 ++++++--- src/lib/projects.ts | 41 +++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 3 deletions(-) diff --git a/src/components/ProjectMedia.tsx b/src/components/ProjectMedia.tsx index 957e38d4..466f65c1 100644 --- a/src/components/ProjectMedia.tsx +++ b/src/components/ProjectMedia.tsx @@ -140,6 +140,7 @@ const conceptFrames = { whakapapa: ["SCAN", "EXTRACT", "REVIEW"], basketcase: ["CAPTURE", "NORMALIZE", "COMPARE"], liner: ["CANVAS", "AUDIO", "SYNC"], + playback: ["COUNT", "TAKE", "CUT"], "good-news-bad-news": ["GOOD", "BAD", "CHECK"], } as const; @@ -194,9 +195,13 @@ function ProjectConceptCover({
)} -

- {isCompact ? frame.slice(0, 3) : `${index + 1}. ${frame}`} -

+ {isCompact ? ( +
+ ) : ( +

+ {`${index + 1}. ${frame}`} +

+ )}
))}
diff --git a/src/lib/projects.ts b/src/lib/projects.ts index 2880e1b9..743966cf 100644 --- a/src/lib/projects.ts +++ b/src/lib/projects.ts @@ -339,6 +339,47 @@ const projects: Project[] = [ "Native SwiftUI with physics-based motion and haptics", ], }, + { + slug: "playback", + name: "Playback", + status: "Active", + category: "personal", + role: "Solo", + featured: false, + visibility: "public", + lifecycle: "current", + launchStage: "In development", + priority: 7, + description: + "Native macOS app for shooting lipsync, dance, and music video takes locked to the original track.", + longDescription: + "Playback records camera video against a song and exports it with the original audio lined up by timestamp. Instead of pressing play and record together, it schedules the track and reads camera frames on the system host clock, so every take knows exactly where it sits in the song. That turns a set of takes into a synced multicam session: a cut editor switches between them on the beat, loop mode records reps of a section hands-free, and a half-speed mode retimes slowed performances back to full speed. Lyrics are typed by hand, timed with on-device speech recognition, nudged, and exported as captions.", + tags: ["Swift", "SwiftUI", "macOS", "AVFoundation", "Video", "Audio"], + stack: ["Swift", "SwiftUI", "AVFoundation", "Speech", "MusicUnderstanding", "XCTest"], + startDate: "2026-09-01", + cover: { + variant: "concept", + kicker: "Native macOS app", + summary: "Record takes locked to the track, then cut between them on the beat", + tone: "amber", + }, + impact: [ + "Takes align to the track on the system host clock, not by pressing play and record together", + "Multi-take cut editor over one song timeline with beat-snapped switching", + "36 automated tests against synthesized video and audio cover export alignment, retiming, and cut resolution", + ], + buildLog: [ + { + date: "2026-09-17", + whatWorks: [ + "Synced export, loop takes, half-speed retiming, multi-take cut editor, and lyric captions", + "Export, editor, and alignment logic verified by automated tests", + ], + nextMilestone: "First real shoot and a demo clip made with the app", + openQuestion: "How well speech recognition times lyrics on dense vocal mixes", + }, + ], + }, { slug: "whakapapa", name: "Whakapapa",