Two to four players each control one dimension of a single track from their phones: drums, harmony, lead, or crowd energy. When one player changes the chord, the whole band re-roots on the next downbeat.
- Master clock lives in the host browser and fans beats to phones over WebSocket; phones are thin controllers.
- The lead keyboard fires a local tone in under 20 ms, so playing never waits on a network round trip.
- I measured the generative model for tempo stability first. It drifts within ~30 seconds, because it has no tempo input at all, so I took it off the clock entirely: a deterministic clock-locked band wrapped in an arhythmic texture layer that floats off the grid, where drift is inaudible.
- That layer runs Magenta RealTime 2 on-device via MLX at ~2.37× real-time, conditioned on blended player taste, live chord, and crowd energy.
The constraint that mattered was not what the model could generate. It was what the model could generate in time, and I only knew that because I measured it first.
What the texture layer is for
A clock-locked band of drums, chords and lead is tight, and it is thin. Four quantised parts, every onset landing exactly where you expect it, nothing in the gaps between them. What a real room has that this does not is density: movement under the beat, timbre that changes from bar to bar.
The model fills that in. It runs continuously underneath the band, conditioned on the blended taste of whoever is playing, on the chord the harmony player is holding at that moment, and on the crowd-energy dial. So the texture follows the performance. Change the chord and the layer moves with the band. Push the energy dial and it thickens.
What it contributes is harmonic and timbral information, never a transient anyone is waiting for. That is why it can add density without adding anything that can arrive late.
It also explains why the layer stays off the grid. On the grid, thirty seconds of drift is a band coming apart. Off it there is no downbeat for the drift to be late against, and the same wander reads as room sound. Four players on four phones end up sounding like more than four parts.

Tone.js · WebSocket · Node · Python · MLX
