🔊 AUDIO LAB

The master output stage, A/B'd. Every preset is rendered offline through the real Audio_ graph, so the renders are the same performance note-for-note and switching between them is instant and gapless. Numbers are measured off the rendered buffer; the latency column is measured with an impulse, not assumed.
Salamander sound comparison → ← back to the game

Test passage

150% + velocity 127 is the worst case a player can actually create.

Audition

Normalises every render to the same RMS before playback, so you judge character and transients rather than which preset is simply louder. Turn it off to hear how much level each one actually gives up.
Press 1–9 to jump between presets mid-playback — that is the comparison that matters. space replays the selected one.

Play it live

Routes a MIDI keyboard (or the computer keys a s d f g h j k) through the selected preset in real time, so you can feel the latency rather than read it.

Ship it

Writes the selected preset to localStorage["up-audio-out"], which the game and the replay exporter both read at boot. Clearing it falls back to the code default.

Piano samples

The game decodes each piano sample at its own rate (web/js/sample-rates.js): the bass at 16–32 kHz, the treble at the full 48 kHz, which takes about a third less memory. A desktop builds up to five of Salamander's velocity layers (v1 v5 v8 v10 v15); it had three until 2026-09-11. Set Compare to sample storage or velocity layers to render the same passage both ways through the selected preset, then flip with 1 / 2. With Live mode on, the same keys swap what your keyboard plays.

Piano tone

Every piano is recorded differently; the voice's shaping was tuned by ear on Salamander. These are Salamander's, applied live — turn Live mode on and play while you move them. The lowpass is the velocity → brightness curve in sampleVoice; the shelves sit on the piano buses.
Once it is right, paste the line under tone: in web/js/pianos.js so it is the piano's, not this browser's.

Licensed pianos

No captures yet.
Captured from the plugins on this machine by tools/piano_render/capture.py into the same 30 pitches and five velocity layers the shipped set uses, level-matched to it so the comparison is of tone and not of level. Both sides render at the full 48 kHz here: sample-rates.js was measured on Salamander's own audio, so it is not applied to another piano. These are renders of commercial plugins licensed to this workstation. They are gitignored, excluded from the deploy, and exist to decide which licence to pursue.
Loading the Salamander samples…
Preset Peak Clipped RMS Crest Attack Latency
waveform envelope   clipped samples   0 dBFS ceiling