diff --git a/docs/design/002-direction-round-notes.md b/docs/design/002-direction-round-notes.md index d2f3e13..70fcd58 100644 --- a/docs/design/002-direction-round-notes.md +++ b/docs/design/002-direction-round-notes.md @@ -341,6 +341,13 @@ and brief one agent from a copy of 16, using `/content/library.json`, `parseLrc` - Resumed from §18. 17 (real content) is started now, as agreed; the user's reaction to 16 is asked in parallel. +- **17 is finished and committed**; report in `docs/design/002-sea-chart-spikes/17-voyage-real-report.md`. + Real FLAC playback with seeking, line-synced lyrics (click a line to seek), the Butler Odyssey passage + in a reading view, fallback to 16 without the folder. Agent's choices: "Play voyage" stays silent (no + excerpts, avoids near-autoplay); part buttons dropped in real mode (sample part times don't match the + recordings). Open: passage start points are keyword guesses; parts/motifs aren't timed to the + recordings yet (report proposes a small mapping file in the content folder). + ## Open questions (in priority order) 1. ~~Which sea-chart approach (08–11) reads best, or which mix?~~ 11's navigation + 10's style (§9). diff --git a/docs/design/002-sea-chart-spikes/17-voyage-real-report.md b/docs/design/002-sea-chart-spikes/17-voyage-real-report.md new file mode 100644 index 0000000..54d0ebe --- /dev/null +++ b/docs/design/002-sea-chart-spikes/17-voyage-real-report.md @@ -0,0 +1,133 @@ +# 17 Voyage with real content — report + +Status: **done** (not committed). Built from `17-voyage-real-brief.md`, starting from a copy of 16. + +## What was built + +`src/mockups/17-voyage-real/` is 16 unchanged on the stage (look 2, Inter labels, frieze accents, five +beats, stylised 3D, combined paths, fan works placeholders). Only the content side changed. URL params +are as in 16, plus **`?read=1`**, which opens About's Odyssey reading view for the first song (used for +screenshots). + +- **`content.ts`** (new) reads the mounted folder at runtime: + - `loadLibrary()` fetches `/content/library.json` before the panel is built (top-level await, 4 s + timeout). A 404 or a failure means "not mounted". + - `realFor(song)` matches a sample song to the library by normalised title. Case, accents, + apostrophes and punctuation are ignored. A miss is logged once and does not crash. + - `loadLyrics()` parses `.lrc` files with `parseLrc` (`src/shared/lrc.ts`) and splits `.txt` files + into plain lines. `loadBook()` fetches `/content/homer/odyssey/.json`. Both are cached. + - It also holds the keywords that mark each song's passage, `passageStart()`, and a footnote-marker + stripper for Gutenberg's inline note numbers. + - Only types are imported from `src/content/`. + +1. **Real player** (`player.ts`, `panel.ts`). + - The `