Word game · design prototypes

Rhythm answers when. Knowledge answers what.

An English vocabulary app for Korean learners built on a rhythm-game core loop. The learning unit comes from 말해보카; the open question is what a rhythm layer adds without eating the attention the learning needs. Every iteration is kept — the value is in opening two of them side by side.

Each file below is self-contained: no build step, no dependencies, no external requests. Open one and play — on a phone browser if you can, since that is the target. The two v5* files are the exception: they play a real recording, so python3 prototypes/build.py has to inline it into prototypes/dist/ first. Opened from here they load and play, but silently — clone the repo to hear them.

Falling letters · 8 versions

05 · Spell it on the beat

prototypes/05-falling-letters/

The newest line, and the only one where the answer is a spelling rather than a choice. Piano Tiles' four lanes carry the letters; Brilliant's white paper and rounded slabs carry everything else; the sound lab's five tracks carry the timing.

v8 · Letters, syllables, words
v8-modes-and-bands.html
start here

Current. Three modes, and the column count comes from the mode — a whole word gets two double-width lanes and two levers. A letter's decoy shares its beat because that is a choice; a syllable or a word is answered by waiting, so its decoys arrive on their own beats and are let past. Word lists split into Starter, Core and Hard, because everything before this was reluctant-sized.

v7 · Two tiles a line
v7-two-tiles-a-line.html

A letter carries at most one wrong tile, and the two sit a column apart — tiles that touch have no lane line between them wide enough to read as two things. Once every pair must be a column apart, four lanes admit only {0,2} {0,3} {1,3}, so two is the geometric maximum rather than a preference.

v6 · In time with what you hear
v6-in-time-with-what-you-hear.html

ac.outputLatency measured 192ms on the machine this was built on — 0.41 of a beat. The track's beat is heard that much after it is scheduled, so a player tapping in time with what they hear was judged 0.41 beats late, and under the earlier window a perfectly timed tap was a miss. Three complaints that sounded unrelated, one clock. nowBeat() now means the beat you are hearing.

v5 · A window you can hit
v5-a-window-you-can-hit.html

The hit window was set to fit a band between a tile and the foot of the board and never revisited — 178ms each side, drawn shorter than the tile crossing it. Half again as wide now, and the band is taller than a tile. And the tap has a transient: a snap that fires at currentTime and is never scheduled, so the gap between finger and ear is the audio hardware's and nothing else's.

v4 · You play the hook
v4-you-play-the-hook.html

A correct tap sounds the next note of the song's own motif, on the song's own lead voice — land a word and you have played the hook once through; drop letters and it comes out full of holes. An early hit inside 75ms snaps to the grid, so accurate playing is audibly locked to the drums. The hit line doubles as the metronome, swelling on every beat and harder on the downbeat.

v3 · Levers & hit line
v3-levers-and-hitline.html

Square full-lane tiles with the lane dividers drawn over them, so a lane goes solid instead of holding a tile. The timing bar and the tap target become two objects: a band across the lanes is the window, with a lime line at the beat, and four levers under the board are what you press — a press lights its lane from the foot up. No two letters can share a stretch of lane, because the chart derives its minimum spacing from the tile height and the scroll rate.

v2 · In the beat
v2-in-the-beat.html

Where the chart stopped being pixels and became beats — a letter is a note, and its tile is wherever that beat is relative to the playhead. Your combo drives the arrangement through four band tiers and every tap plays a note on the chord under the playhead. The foot of the board was still one object doing three jobs.

v1 · Falling letters
v1-falling-letters.html

The mechanic without the music. Tiles fell at a pixel rate and a tap counted any time before the tile left the board, which made the track decoration — you could answer a whole word between two beats and nothing about the music would know. Kept because it is the version that shows what a rhythm game looks like with no rhythm in it.

Sequencer · 11 versions

02 · The line that worked

prototypes/02-sequencer/

Text stands still and only the timing signal moves. Everything after v4b is a refinement of one idea: a row's brightness is its hit window.

v9 · Quick start & band tiers
v9-quick-start-and-band-tiers.html
start here

Current. 5–7s to the first word instead of 17–24. Stem gains become four discrete tiers driven by the combo, so the band is audible rather than a fader wobble. Interface and studied language split apart; so do tempo and vocabulary difficulty.

v8 · Taps make the music
v8-taps-make-the-music.html

The pad stops being a switch and becomes an instrument — every tap speaks, right or wrong, and your playing thins or thickens the arrangement. Adds a Listen screen and a two-bar audition of each track.

v7 · Levels & Korean
v7-levels-and-korean.html

A phone-width frame, four difficulty levels turning three separate dials, and a Korean version that swaps interface, word bank and voice — not chrome-deep.

v6 · Fill and strike
v6-fill-and-strike.html

One pad instead of four targets. Words fill with colour on staggered beats; a single tap claims whichever completion it landed nearest.

v5c · Real track arrangement
v5c-real-track-arrangement.html
needs build.py

A whole CC0 arrangement start to finish, with the round laid over its structure.

v5a · Real track loops
v5a-real-track-loops.html
needs build.py

A real recording as two eight-bar loops. Sounded better, built worse — the reason the line went back to synthesis.

v4e · Chorus
v4e-chorus-SYNTH-LIKED.html
preferred synth build

A chorus every four words, leeway on the echo, and music that builds by stacking stems.

v4d · Echo bar
v4d-echo-bar.html

The dead fourth bar becomes an echo: you tap the word back syllable by syllable, stress on a strong beat.

v4c · Syllable sweep
v4c-syllable-sweep.html

An unambiguous count-in — no bar on screen means no tapping — and syllables as the same mechanic with more than one tap.

v4b · Row sweep
v4b-row-sweep.html

The grid was over-built: one cell per row and column is just an ordering. Four rows and a falling bar replace it.

v4a · Step grid
v4a-step-grid.html

A 4×4 step sequencer. Rows are words, columns are beats.

Type-first · 2 versions

04 · The other design language

prototypes/04-type-first/

The look from references/kinetic-typography/ taken off the page and put on the game. Neither version changes the mechanic. Kept as the standing alternative to the Brilliant language this page and the falling-letters prototype now use — they do not mix, and having both built is the only way to choose between them.

Sound lab · 2 versions

03 · Music on its own

prototypes/03-sound-lab/

Five synthesised arrangements to audition with no game on top — intro, build, drop, breakdown, second drop — with live stem muting and jump-to-section. Built to choose from, not to play.

Modes · 3 versions · superseded

01 · Finding the shape

prototypes/01-modes/

Superseded, and worth playing anyway: this is where the conclusion came from that text must stand still and only the timing signal should move.

Reading

The reasoning

the expensive part to reconstruct