# Idol Hands

Pull the lever and three reels land on three dumb words. That's the song. A karaoke machine then plays it: an original pop backing track with a guide melody, lyrics wiping word by word, credits, and a focus-group score at the end. A comment on pop built like a VC-backed ghost kitchen: one kitchen, endless "brands", every order assembled from the same parts.

Every song uses the same four chords (I, V, vi, IV), only rotated, at a different tempo and key. That is the point.

Satire aims at the machine (labels, investors, focus groups), not the performers. All words, lyrics and music are original and generated in the browser. There are no samples, recordings or imitated voices: like a real karaoke machine, it plays the backing track and you sing.

## Files

- `engine.js`: words, songs, credits, share links. No DOM. Three reels (slang of the moment, something shiny in a bag, a fifteen-second ad-lib) and five chorus shapes built from repetition, spelling and nonsense ad-libs. Nothing in the lyrics names the theme; the emptiness makes the point. All original; no real lyrics or titles.
- `music.js`: `arrange(song)` turns a song into a timed arrangement (tempo, key, chords, word timings, melody). `createMusic()` plays it with Web Audio: drums, sidechained chords and plucks, bass, a riser into the chorus, and a guide-melody lead. Also the reel ticks and stop dings.
- `cosmos.js`: the background tunnel on a canvas. `warp(on)` and `burst()`.
- `app.js`: the choreography. Every visual cue hangs off the arrangement's clock, so each word wipes while its note plays.
- `index.html`, `style.css`: the karaoke CRT, grid floor, light leak, grain and glints.
- `about.html`, `about.js`: the About page. The same space and CRT, held still; the article rolls up the screen like credits and each line wipes as it crosses the reading line (tap to pause). "Read normally" swaps the TV for the plain text. Same channel keys as the main page, with ABOUT held down.

## Sequence

1. Pull: reels spin with ticks, stop one after another with a ding; the tunnel warps.
2. Landed: the title wipes across the two-bar intro while a riser builds.
3. Chorus: four lines, two bars each. TikTok dance views and shareholder value tick up in the corner with every sung word. Upcoming lines wait dimmed; the progress bar races through the fake runtime.
4. Scored: an ownership clause types out, then the "score" lands as the percentage of the performers the label owns ("Owned by the label", "Still theirs: n% (pending renewal)") and a final shareholder-value line. 大当たり on a jackpot.

## Hooks

- `body[data-state]`: `idle`, `spinning`, `landed`, `chorus`, `scored`. `body[data-jackpot]` on a jackpot.
- A `song` event fires on `document` with the song as `event.detail`.
- Shared links (`/idol-hands#3-c-7`) load the song and wait for a press of 再生 Play, since browsers only allow sound after a tap.
- Space pulls. The bezel is a channel selector shared by both pages: KARAOKE, ABOUT (the current page stays pressed in) and a pink LABS ↗ outlink. Mute is an on-screen speaker beside play/pause; it shows 消音 MUTE and is remembered per browser. Reduced motion skips the reel spin, tunnel and wipes.
