StruckFrankenSim instrument lab

FrankenSim · physical acoustics

Nothing here
was recorded.

A concert grand and a drum kit, computed from geometry, materials and contact. Strings get their partials from tension, stiffness and mass; the soundboard gets its modes from finite elements; drum heads and cymbals are vibrating plates on a fine grid. A felt hammer, a stick or a beater collides with them, and the air carries the result to a microphone placed at a point in space.

Two ways to hear it: offline reference renders that took up to 41 minutes per clip, and a live engine compiled to WebAssembly that you can play in this tab. The only recordings on this page are the real instruments we grade ourselves against, and they are clearly marked.

Play it live Hear strings nobody struck

Satie, Gymnopédie No. 1 (1888), bars 1–2 and 5–9 · two pressure microphones 1 m above a Model D–derived soundboard · offline render

Offline reference0.00 s
Soundboard geometry: FE mesh, 17 ribs, 2 bridgeslit points: the 88 bridge stations where each key drives the board

Two ways to hear it

The same physics at two budgets.

The offline reference spends minutes per second of sound so that nothing is cut short. The live engine runs the same equations on a smaller description, fast enough to play. They are labelled everywhere, and the live engines report their measured distance from the reference.

Offline reference

Rendered here, at research fidelity

Native Rust, single-threaded per clip, run on a workstation and encoded to AAC for this page.

  • Grand pianoall 88 keys / 234 strings every step · 18,167 string partials · 128 soundboard modes to 2.4 kHz · 192 kHz mechanics
  • Drum kitone finite-difference plate solver for every head and cymbal · up to 7,589 grid points per surface · 48–288 kHz · von Kármán shells · 18 snare wires in contact with the head
  • Costthe 19 s grand-piano clip took 41 minutes (128× slower than real time)
  • Microphonepressure in pascals at a point, never normalized
Live · WebAssembly

Computed in your browser, as you play

Each engine runs in its own Web Worker (one per drum piece) and streams to an AudioWorklet that mixes them on the audio clock. Nothing is sampled or pre-recorded.

  • Drum kitthe offline kit's own plate solver, snare wires and clamped hi-hat included, on a grid 2–8× coarser, chosen per piece for each device · a piece that has gone quiet is not stepped
  • Pianothe reference's own equations, for the sounding keys only · on the largest soundboard this device keeps up with, up to the offline render's 128 coordinates · 16 keys held with the pedal down at about 2× real time
  • Not livethe finest drum detail (a coarser grid loses some above a few kHz), and the strings of keys you are not playing
  • Latencyabout 35–45 ms measured headlessly, including the output device

Offline reference Live · WebAssembly

One groove, two simulations, one switch.

The piano riff and four-on-the-floor of Todd Terje's Strandbar, played on FrankenSim's concert grand and drum kit. Two versions run on one clock: the studio render, computed offline at full resolution, and the same piano and drums computed in this tab while you listen. Flip the switch as it plays; nothing else changes.

Offline reference

A drum kit, every piece from one solver.

Kick, snare, toms, hi-hat, crash and ride are one object here: a thin plate on a fine grid. A drum head is a film under tension, clamped at its rim; a cymbal is a bronze shell with a free edge that bends, stretches and trades energy between its vibrations (von Kármán coupling), which is what turns a strike into a wash. Stick, beater, snare wires and hi-hat rims meet the surfaces through contact laws; the air inside a drum couples its two heads. The sizes copy a real kit recorded with overhead microphones, and each piece is played next to its recording below.

Live · WebAssembly

Play a drum kit that is being solved as you hit it.

Strike any head or cymbal where you like: the stick lands at that spot on the same plate solver as the kit above, computed in this tab. The colours are the surface's own velocity field, the wave you hear spreading from where you hit. Keys work too: B kick, S snare, T and F toms, H hi-hat, C crash, R ride.

Live · WebAssembly

A grand piano you can play — with its strings visible.

Each key launches a hysteretic felt hammer into stiff strings with the published Steinway scale's lengths, tensions and stiffness. Every string you play shares one soundboard. Press nearer the front of a key to strike harder.

Offline reference

A concert grand, all 234 strings at once.

The string scale is the published RT-0425 model of a Steinway D: 88 courses with lengths, linear densities, tensions and bending stiffness. The soundboard is a ribbed orthotropic spruce plate transcribed from published Model D drawings. Every string of every key stays in the simulation all the time, which is why the effects below need no "resonance layer".

The strings nobody struck

Hold C4, E4 and G4 down silently, so that their dampers lift without a hammer moving. Then strike C3 staccato and let it go. C3's dampers stop its own strings, but the shared bridge has already passed energy into the undamped C-major strings, and they keep singing. Compare it with the same strike alone, and with the pedal down, which lifts every damper. Use “Listen closer” to raise only the playback level of the quiet tail.

pp, mf, ff: the felt hardens

Hammer felt is stiffer the more it is squeezed, so a faster hammer stays in contact for less time. A shorter contact feeds energy into higher partials, which is why ff is brighter and not just louder. Beside the clips is the bridge velocity under the key: the force that actually reaches the soundboard.

Vertical bridge velocity under A3 for the first 30 ms. Each curve is scaled to its own peak and offset so that the shapes can be compared. The repeating pattern is the string's period, 4.5 ms for A3.

Why piano octaves are wider than 2:1

A steel string is a little stiff, so its partials run sharp: fₙ = n·f₁·√(1+Bn²)/√(1+B). The effect grows up the keyboard. With exact 2:1 first partials, A5's second partial lands 5.5 Hz (5.4 cents) above A6. Stretch tuning moves them together by changing each string's tension, not by retuning an oscillator. The clips play A4+A5, then A5+A6 from 2.6 s. The plot zooms into the rendered sound near 1760 Hz, where the two tunings differ.

The last 2.65 s of each clip, zoomed to 1752–1774 Hz; dotted marks are where the string scale puts A6's first partial and A5's second. Equal-tempered: two separate clusters about 5.5 Hz apart, as predicted. Stretch-tuned: one cluster where both predictions coincide (1767.35 Hz). Each cluster is itself split by about 0.9 Hz, because the model's three unison strings are detuned by ±0.8 cents. That split makes both clips wobble about once a second, and it masks the 5.5 Hz octave beat by ear.
Stretch relative to equal-tempered first partials (cents), and the inharmonicity B of every key (right axis, log), both computed from the dumped string scale.

The bottom and the top

A0 is a single 2.01 m wound string with partials so stretched that the 20th lies more than a semitone sharp of 20·f₁. C6 has three short plain strings and a much shorter hammer contact.

Solo the soundboard

Exact modal sum

A2 at 2.5 m/s, split into the pressure that each loaded soundboard mode contributes at the microphone. Mute and solo the modes: the signed sum of every channel is the rendered sound to 10⁻¹⁴, including the cancellation between modes.

Live · WebAssembly

A player piano and drum machine for any MIDI file.

A MIDI file is only a list of keys and strokes; it usually reaches you through a handful of recorded samples, and sounds like it. Here it is punched into a paper roll that plays FrankenSim's concert grand and drum kit, computed in this tab. Each note launches a felt hammer into real strings on one shared soundboard; each drum note lands a stick on a simulated head or cymbal. Pick a roll, or drop in a MIDI file of your own.

Graded against real instruments

How close is it to the real thing?

Sounding plausible is easy to fake, so we put FrankenSim's renders next to real recordings of the same notes, from the University of Iowa's free instrument samples: a Steinway & Sons Model B grand. We measured the same things on both, and the headline gap sits next to a ruler made only of the real piano: how much it changes between two dynamics. The drum kit is graded the same way, piece by piece, in its own section.

What the comparison shows

    Method: both signals are high-passed at 40–70 Hz to remove room rumble, and each pair is aligned at its note onset, measured against the recording's own noise floor. Partial frequencies come from a 1 s window, and B is fitted from (fₙ/n)² = f₀²(1+Bn²) over partials above the noise floor. Decay rates are linear fits of each partial over 0.2–2.6 s (0.2–2.0 s at C6). The Iowa piano was recorded with two microphones 8 inches above the bass and treble strings in a normal room; the bass-side channel is used, because averaging two spaced microphones can cancel partials. FrankenSim's piano is heard at one point 1 m above its board with no room, so some differences belong to the two listening positions rather than the instruments. Playback gets the same high-pass and an early-loudness match, and nothing else. The analysis is tools/verisim.py.

    Why it sounds different: tracing each gap to what the model leaves out

    A score says how far apart two sounds are, not why. Here each difference is followed back along the chain hammer → string → bridge → soundboard → air → microphone. Some links can be checked inside the simulation, which records the bridge's motion as well as the sound. Then one physical mechanism is switched on at a time and the note is rendered again. A suspicion counts as confirmed only when that experiment moves the measured gap.

    Method and honesty

    What is computed, what is estimated, what is absent.

    These instruments are descriptions, not instrument code. A drum is a short list of radii, thicknesses, moduli and tensions; the piano is composed out of FrankenSim's general physics crates (plates and shells, modal solvers, contact, port-Hamiltonian integration, boundary elements), and the kit out of one plate solver, fs-vkplate. The same crates serve the project's thermal, structural and fluid work.

    The instrument is a description

    The kit's snare, verbatim from crates/fs-vkplate/src/kit.rs. Edit a number and the solver builds a different drum.

    
                

    The crash: radius, bow and bell thickness, rise and grid. Thickness and height become functions of radius; the solver lays them on the grid.

    
                

    Six of the grand piano's 88 string courses, as the solver read them. Frequencies follow from these numbers; none is typed in.

    Three kinds of number

    Published, transcribed from sources

    RT-0425 string scale (84 courses)Model D board outline, ribs, bridgesSpruce & maple elastic constantsB20 bronze constantsKit sizes (Salamander Drumkit)Per-key hammer mass & stiffness laws

    Estimated, labelled in every run log

    Head tensions (tuned to the recording)Loss from the recordings' decay timesFelt crush & relaxationCymbal thickness & riseStick, beater & felt lawsSnare wire mass, tension, preloadHi-hat rim contactFour extrapolated end keys

    Not modelled

    Piano room & lidDrum shells, hoops & rimsCavity modes (kit)Hi-hat frictionWire radiationSympathetic buzz between kit piecesMicrophone capsuleReal-time offline engine

    It says no

    Real refusals from this campaign. A render that cannot be supported is refused rather than quietly approximated.

    Numbers behind this page

    Every offline clip carries its exact command, run time and energy closure in its “Run evidence” drawer. Totals: