Commit Graph
113 Commits
Author SHA1 Message Date
teahubxyzandClaude Fable 5.1 84c7ba1665 room tone decided from the phase, not from the player's paused flag (the unlock clip flipped it and caused an on-off-on fade); the crackle sample is 12 s long
shots / shots (push) Canceled after 34s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 07:15:50 +00:00
gitea-actions[bot] b47f62f8e6 shots + sw stamp 9213647549 2026-10-21 07:10:37 +00:00
teahubxyzandClaude Fable 5.1 9213647549 emoji drawer above the scrim (it was underneath it, so every tap closed it)
shots / shots (push) Successful in 2m15s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 07:08:39 +00:00
gitea-actions[bot] e531760491 shots + sw stamp b11b3b47a2 2026-10-21 07:06:23 +00:00
teahubxyzandClaude Fable 5.1 b11b3b47a2 emoji drawer: opens without grabbing the keyboard; the type-any-emoji box moves to the bottom; taps register on pointerup so a moving drawer can't swallow them
shots / shots (push) Successful in 2m17s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 07:04:21 +00:00
gitea-actions[bot] f01be6f5b2 shots + sw stamp b11ff4b7b6 2026-10-21 06:58:24 +00:00
teahubxyzandClaude Fable 5.1 b11ff4b7b6 reactions: the tray re-ranks after every tap; ticks that land within a second of each other stack upward instead of hiding one another
shots / shots (push) Successful in 2m18s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 06:56:22 +00:00
teahubxyzandClaude Fable 5.1 70c630711b webamp: mixtapes in the Open menu / LOAD LIST, SAVE LIST makes a tape from the playlist, ~40 Winamp Skin Museum skins in Options › Skins plus any museum link
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 06:47:39 +00:00
gitea-actions[bot] d607db3aac shots + sw stamp 6e0259daff 2026-10-21 06:31:36 +00:00
teahubxyzandClaude Fable 5.1 6e0259daff library opens again: the playing tile's class list no longer gets an empty token (which threw and aborted the render)
shots / shots (push) Successful in 2m26s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 06:29:08 +00:00
gitea-actions[bot] c2586c42e4 shots + sw stamp c5991ebc36 2026-10-21 06:27:46 +00:00
teahubxyzandClaude Fable 5.1 c5991ebc36 a little 🦙 in the library's cost line opens Winamp
shots / shots (push) Successful in 2m16s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 06:25:46 +00:00
teahubxyzandClaude Fable 5.1 105609b4b1 webamp.html on main: the library in Winamp with Milkdrop (gandora.lol/webamp.html)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 06:21:50 +00:00
teahubxyzandClaude Fable 5.1 582e5bebf2 typed "no X" / "less X" goes on the avoid list and marks X as a disliked tag; "more X" the reverse; the DJ is told the avoid list is a hard rule that outranks the taste model
shots / shots (push) Failing after 2m21s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 06:20:49 +00:00
teahubxyzandClaude Fable 5.1 a4dab59f21 brain: typed negatives count against the track, warm words never include what the station was told to avoid, a young station gets only a faint region prior from the other stations (no words), and the listener's avoid list wins
shots / shots (push) Canceled after 42s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 06:20:23 +00:00
gitea-actions[bot] d4b4f48b03 shots + sw stamp fc0bfe05a6 2026-10-21 06:16:27 +00:00
teahubxyzandClaude Fable 5.1 fc0bfe05a6 Merge pull request 'playback: one explicit state machine (idle → cooking → holding → playing → ended)' (#1) from playback-state-machine into main
shots / shots (push) Successful in 2m24s
playback as one state machine; brain.js via hooks; db.get; harness resume mode; docs (#1)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 06:14:04 +00:00
teahubxyzandClaude Fable 5.1 1aeebac6f2 harness: a resume mode (autoplay blocked); docs for the state machine and hooks
tools/harness.sh resume seeds IndexedDB with a station and one rendered
track, resumes it with no user gesture and expects the TAP TO PLAY wait.
IndexedDB needs http, so the page is served from a temp folder; headless
Chrome's virtual time doesn't wait for IndexedDB, so this mode is driven in
real time over the DevTools protocol (tools/harness-cdp.py, stdlib only).
The loop harness now prints state.phase too.

ARCHITECTURE.md describes the machine as implemented; HANDOFF.md lists what
was found and left alone; STORAGE.md gains db.get and the tapes store (the
code already had both); README points at the new files.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 06:01:48 +00:00
teahubxyzandClaude Fable 5.1 dddf8f0add brain: plug into the page's hooks instead of overriding its functions
hooks.djPrompt, hooks.stationOpened, hooks.jobMade and hooks.reacted carry what
the djPrompt / openStation / makeJob / react reassignments did; same behaviour.
countPlay reads its one row with db.get instead of db.all().

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 05:58:46 +00:00
teahubxyzandClaude Fable 5.1 eb110e827b playback: one explicit state machine, hooks for brain.js, db.get for single rows
state.phase (idle → cooking → holding → playing → ended) with named transitions
(toCooking, toHolding, toPlaying, startNow, handOver, toEnded, toIdle) replaces
the three overlapping mechanisms (playJob/advance, swapNow, the crackle hold with
state.holding/pendingJob). state.holding is now a read-only view of the phase.
Behaviour unchanged; the harness prints the same state lines before and after.

A `hooks` object (djPrompt, jobMade, stationOpened, reacted) is what brain.js
plugs into instead of overriding page functions by assignment.

db.all() used to find one row becomes db.get(id); tapes go through tapeById
(KEPT is virtual). setSource drops old object URLs but never the crackle's.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 05:57:59 +00:00
gitea-actions[bot] 52fad5f297 shots + sw stamp 7453484460 2026-10-21 05:30:24 +00:00
teahubxyzandClaude Fable 5.1 7453484460 a blocked resume no longer double-handles the first tap: the unlock starts playback and the play button's own click is ignored for that tap (it used to pause it straight back)
shots / shots (push) Successful in 2m20s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 05:28:20 +00:00
teahubxyzandClaude Fable 5.1 a54bfdff7e harness needs no audio file: it renders a generated wav; README wording
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 05:24:42 +00:00
teahubxyzandClaude Fable 5.1 4a33a30820 docs: README (what it is, how it runs), ARCHITECTURE (every moving part, the playback state machine, the data), HANDOFF (seams, known rough edges, what a refactor should keep); tools/harness.html as the playback regression test
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 05:24:03 +00:00
gitea-actions[bot] 2dbbbbe2be shots + sw stamp 8fc613ed20 2026-10-21 05:20:16 +00:00
teahubxyzandClaude Fable 5.1 8fc613ed20 the room tone tries to start on load (plays where the browser allows, otherwise on the first tap) — the seed page is never silent for want of a gesture
shots / shots (push) Successful in 2m22s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 05:17:12 +00:00
teahubxyzandClaude Fable 5.1 131f3b255b when a resume on load is blocked by autoplay rules, the cover says TAP TO PLAY and the first tap anywhere starts it; any play that succeeds counts as the unlock
shots / shots (push) Canceled after 1m48s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 05:16:09 +00:00
gitea-actions[bot] bdc62084a6 shots + sw stamp c14e3452ea 2026-10-21 05:06:28 +00:00
teahubxyzandClaude Fable 5.1 c14e3452ea crackle eases in over 600 ms and the bed decision waits 300 ms, so a source swap never fires a burst; default level 35%
shots / shots (push) Successful in 2m21s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 05:04:08 +00:00
gitea-actions[bot] 46589c9bf5 shots + sw stamp a6cb989fd8 2026-10-21 05:02:23 +00:00
teahubxyzandClaude Fable 5.1 a6cb989fd8 crackle: mix in float, clamp once into 16-bit (overlapping pops could wrap in the int buffer and click)
shots / shots (push) Successful in 2m16s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 05:00:11 +00:00
teahubxyzandClaude Fable 5.1 fb6497161e playback: the next track starts cooking before the play call, not after it resolves; the crackle fades the moment play resolves (not only on the playing event); the crackle itself is 12 dB louder (it sat at -27 dBFS, which is why nobody heard it)
shots / shots (push) Canceled after 34s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 04:59:49 +00:00
gitea-actions[bot] 53f5e8561f shots + sw stamp de1537050e 2026-10-21 04:54:38 +00:00
teahubxyzandClaude Fable 5.1 de1537050e reactions land in time: each tap keeps where in the track it hit (and which lyric section), shows as a tick on the bar, and the DJ hears "🔥 at 0:42 (chorus)"
shots / shots (push) Successful in 2m23s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 04:52:13 +00:00
gitea-actions[bot] 25d97db0ab shots + sw stamp 778ffcf925 2026-10-21 04:48:35 +00:00
teahubxyzandClaude Fable 5.1 778ffcf925 mashups: ⚡ MASHUP on any tape takes up to three of its tracks — the DJ writes one sheet from their sheets, the renderer hears them stitched together with crossfades — and the result goes next on the station
shots / shots (push) Successful in 2m17s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 04:46:31 +00:00
gitea-actions[bot] 0edbe3a9f2 shots + sw stamp 03251b5948 2026-10-21 04:40:44 +00:00
teahubxyzandClaude Fable 5.1 03251b5948 the tab says g*ndora, and the track while one plays
shots / shots (push) Successful in 2m23s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 04:38:27 +00:00
gitea-actions[bot] ab43f01073 shots + sw stamp d08be95048 2026-10-21 04:37:02 +00:00
teahubxyzandClaude Fable 5.1 d08be95048 mixtape covers: each tape gets its own generated cover, drawn from its tracks (their keys, tempo, energy and tags blended; the mark counts the tracks) — in the strip and at the top of the tape page
shots / shots (push) Successful in 2m23s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 04:33:54 +00:00
teahubxyzandClaude Fable 5.1 d4d5171f43 crackle level: quieter samples, bed default 80%, so the hold (played by the main player at full volume) matches the room tone
shots / shots (push) Canceled after 1m55s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 04:32:50 +00:00
teahubxyzandClaude Fable 5.1 3ee513ad34 volume and room-tone sliders in the station sheet, remembered
shots / shots (push) Canceled after 0s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 04:32:36 +00:00
teahubxyzandClaude Fable 5.1 cf00f15447 the crackle is the room tone: it runs whenever music isn't playing (seed screen, cooking, paused) from the first tap on, and fades out the moment a track starts
shots / shots (push) Canceled after 34s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 04:32:12 +00:00
gitea-actions[bot] 4f7d0999e3 shots + sw stamp 73b603970e 2026-10-21 04:04:50 +00:00
teahubxyzandClaude Fable 5.1 73b603970e the unlock clip is built in code (the pasted base64 was corrupt, so the unlock never happened: no crackle, no first autoplay)
shots / shots (push) Successful in 2m23s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 04:01:55 +00:00
teahubxyzandClaude Fable 5.1 bbf3ceb918 play first, then the bookkeeping: the track starts before it is written to the library, not after (a big library made that write take seconds, and a stalled one meant no sound at all)
shots / shots (push) Canceled after 1m58s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 04:00:29 +00:00
gitea-actions[bot] da2774918d shots + sw stamp 00fa658b70 2026-10-21 03:58:01 +00:00
teahubxyzandClaude Fable 5.1 00fa658b70 the unlock clip ending is not a track ending
shots / shots (push) Successful in 2m19s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 03:55:16 +00:00
teahubxyzandClaude Fable 5.1 077acd2dbc library: the now-playing bar is current when the library opens
shots / shots (push) Canceled after 1m56s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 03:53:33 +00:00
teahubxyzandClaude Fable 5.1 574a91d838 library: tap a tile and it plays while you stay; the playing tile is ringed and badged; a now-playing bar at the bottom with pause and a way back to the player
shots / shots (push) Canceled after 0s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 03:53:18 +00:00