Match timelapse · 8×
Reaction–diffusion · voice · territory

Acoustic Tribe WarYour voice grows a species. Two species fight for the screen.

An interactive installation built on the Gray–Scott reaction–diffusion equations, the same mechanism behind zebra stripes, leopard spots and fish-skin labyrinths. Each player's voiceprint becomes the genome of a living pattern; volume, pitch and room noise decide who takes the substrate.

The idea

A nutrient field, and the chemicals that eat it

Pour two chemicals into a dish. One is food, u. The other, v, copies itself by eating the food and slowly decays. Both diffuse, but at different speeds. Depending on two dials, the feed rate F and the kill rate k, the mixture settles into spots, stripes, holes, labyrinths or travelling spirals. Alan Turing proposed this in 1952 as a way to explain animal markings.

This project hands those dials to sound. In the full game there are three replicators competing for the same food: one per player and one for strangers.

∂vA/∂t = DA∇²vA + gA·u vA² − (F̄ + kA) vA − c · vA(vB + vX)
∂u/∂t = ∇²u − u(vA² + vB² + vX²) + F̄(1 − u) F̄ = feed rate mixed by local concentration
EmberPlayer A. A deep voice gives large, fast-spreading leopard spots.
FrostPlayer B. A high voice gives a dense, stable labyrinth.
OutsiderAny voice matching neither voiceprint. Grows a grey third species that harms both tribes.
Room toneAmbient noise. Shown as one small ring glyph scattered across the field.
How it was built

Three iterations

v1 Sound-driven visualizer

One voice, one living texture

Single-player prototype.

  • Pitch (spectral centroid) slides the system along a path in the F–k plane: spirals → labyrinth → holes → coral → leopard spots.
  • Volume raises the kill rate, so loud sounds make the pattern melt.
  • Bass hits speed up diffusion and drop new seeds on the beat.
  • A live F–k map traces where your voice has taken the chemistry.
v1 driven by its built-in synth. Recorded headless and sped up 1.6×.
v2 Two tribes

Competition on one substrate

  • Two self-replicating species share the food and inhibit each other where they touch. The contact front glows white-hot.
  • Volume speeds up replication and drops seeds along your own border, so territory advances from the front line.
  • A sudden pitch jump triggers a 1.5 s spiral mutation that hits the opponent harder.
  • Hold 70% of the field for 3 s and your species floods the screen. The winning moment is saved as an acoustic fossil.

Balancing: a CPU prototype showed leopard spots lose to labyrinths in seconds at equal settings, so the low-voice gene gets a small growth bonus.

Opening 30 seconds of a match with demo players: seeding, a spiral mutation, both fronts meeting. 1.8×.
v3 Sound check + match

Teach it who is who before the fight

Playtesting showed the voices blurred together, so v3 adds a measured enrollment stage. It records room tone and each player alone, learns a voiceprint per person, then scores how cleanly it can pull your voices back out of a mixture.

  • A 15-second drill prompts A, B and silence, and shows a table of what was prompted against what the tracker heard.
  • The verdict reads Ready, Playable or Too similar, with concrete tips.
  • In the match, room tone becomes scattered glyphs and unknown voices grow the grey outsider species.
The who-is-who drill with demo voices, ending in its confusion table. 1.6×.
How it works

From air pressure to territory

Every 32 ms the tracker decides whose sound it is, then turns that into chemistry on the GPU.

01CaptureMic at 16 kHz, 1024-sample window, hop 512.
02Spectrum512-point STFT, speech band 94 Hz–4 kHz.
03VoiceprintsKL-NMF bases: 10 per player and 4 for the room, learned at enrollment.
04AttributionFit activations per frame and weigh in pitch likelihood. Label each frame A, B, room or outsider.
05GenesPitch sets F, k and D. Level sets growth. A pitch jump triggers a mutation.
06FieldWebGL2 float textures, 12 steps per frame. A 64-cell tally reads territory back.
Sound check results

How well can it tell two voices apart?

Measured on the built-in demo voices (synthetic, ≈112 Hz and ≈228 Hz) plus room noise. Real voices will score differently, so run the sound check before every session.

99.2%Drill: voiced frames credited to the right player
≈96%Live match attribution against the demo script
22 dBSIR: how little the other player leaks in
0.90 / 0.93STOI after separation, up from 0.64 / 0.76
MetricEmberFrostMeaning
SI-SDR9.8 dB12.6 dBScale-invariant distortion of the recovered voice against the solo take.
SI-SDR improvement+12.2 dB+10.3 dBGain over listening to the raw mixture.
SDR · BSS-Eval9.8 dB12.6 dBGain-only projection, without the distortion filter, so it runs close to SI-SDR.
SIR · BSS-Eval22.0 dB21.2 dBThe "who is who" number. Above 15 dB is good.
SAR · BSS-Eval10.1 dB13.3 dBArtifacts and leftover room noise.
STOI (mixture)0.90 (0.64)0.93 (0.76)Intelligibility, 0–1. Cross-checked against pystoi: 0.902 / 0.932.
PESQkitkitNot computed in the browser. The exported kit runs it with the reference library.
Voiceprint purity95.8%97.7%Share of your own solo take credited to you.
Sound check: room tone, Ember and Frost enrollment cards with pitch and purity
Enrollment: room tone, then each player alone.
Separation test table with SI-SDR, BSS-Eval and STOI
The separation test as it appears in the app.
Voiceprint spectra chart and the Ready verdict
Average spectra per voice, and the verdict.
Run it

Playing with real voices

  1. Download the game's HTML file and open it in Chrome or Edge. Microphone access is blocked inside Claude's preview, but demo players work there.
  2. In Sound check, choose Microphone. Record 3 s of room tone, then each player alone for 5 s at match volume.
  3. Run the who-is-who drill. Aim for Ready; if it says Too similar, exaggerate the contrast (one low and full, one high and bright).
  4. Start the match. Get loud to grow, jump in pitch to mutate. Bystanders who talk will grow grey outsiders.
  5. Use Export test kit to get WAVs and evaluate.py for PESQ, STOI and BSS-Eval with the reference libraries.
Known limits

What it does not do yet

  • Outsider detection catches only about half of an unknown voice's frames when that voice's pitch sits between the two players'. It never flagged the enrolled players as outsiders in testing.
  • BSS-Eval uses gain-only projections, and the references are the solo takes, which include room noise. Treat scores as relative.
  • A labyrinth front is very stable, so rounds can stall short of the 70% line without a strong push.
  • The clips on this page were recorded in a headless browser with software rendering and sped up. Real hardware runs smoother.
← Wenjie Lin