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.
Compares the two ways of mixing velocity layers, on Salamander
(set it with Piano A). The switch is per browser; the game reads it at load.
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.
Modelled piano
Epi (DatanoiseTV/epi)
computes every note from a hammer, strings and a soundboard as it is played: no samples,
a fixed 32 MiB heap, and the CPU it costs printed on its row. Its own room is off, so it
plays in the game's hall through the same shelves and output stage as every other piano.
Pick it as Piano A or B; with Live mode on it runs on the audio thread, the sustain
pedal as a continuous depth (a half-pedal works) and CC67 as the soft pedal.
Built on this machine by tools/epi_lab/build.sh. It is GPL-3.0: it
cannot ship inside the game, and it is never committed or deployed.