← All modules
AvailableInstrument

Tines

A pickup-position model for tuned tine voices.

Engine preview

Not built for macOS, Windows or Linux

About

An electric piano is a machine with three parts and only one of them is interesting. A hammer strikes a stiff steel tine, a rod clamped at one end, free at the other, and beside it a heavier tonebar, tuned to the same note, keeps ringing after the tine's attack has gone. Neither of those is what people mean when they talk about the sound. What they mean is the third part: the electromagnetic pickup sitting a couple of millimetres from the tine's free end.

A pickup does not measure how far the tine has moved. It measures magnetic flux, and flux falls off steeply with distance, so the relationship between motion and voltage is a curve rather than a line. Set the pickup close and the tine's swing covers a strongly bent stretch of that curve, and the note growls. Back it off and the same swing covers an almost straight stretch, and the note is a clean bell. Set it level with the tine's rest line and a swing toward it is answered exactly as a swing away, so the curve is odd and makes only odd harmonics; offset it and the near swing wins, which is an even component and therefore even harmonics, the bark. Those are the two knobs this instrument is built around, and between them they cover most of the distance between the ballad sound and the aggressive one.

Which is also why velocity here is not a volume control. Velocity is how far the tine swings, so a quiet note sits in the near-linear middle of the pickup's curve and comes out a bell, and a hard one reaches the bent ends and barks, the same note, the same setting, a different place on the same curve. Nothing multiplies a brightness parameter by velocity. The morph is what the mechanism does, and the plot on the panel shows exactly which stretch of the curve the note you just played is using.

A side effect worth knowing about, because it is half the instrument's reputation: this curve compresses. It is steepest around rest and flattens toward its ends, so a fortissimo chord comes out proportionally quieter than it went in. Real electric pianos self-compress for precisely this reason and nothing in the model is doing it on purpose. The tremolo, by contrast, is doing it entirely on purpose, the cabinet's so-called tremolo is really a stereo auto-pan swinging the signal between two amplifiers, which is why it swirls rather than pulses.

This is a preview instrument. The DSP is hand-written Web Audio in the website's stand-in engine, good enough to hear the pickup move and the bark come in under your hands, but not a compiled kernel and not covered by any parity claim. The pickup curve itself is the exception to the usual arrangement: it lives in the shared UI kit as tested pure maths, and the audio path and the plotted curve on the panel are the same function rather than two implementations that agree.

Build evidence

Every row below is a recorded build row or the recorded absence of one. Nothing here is inferred from what this module is meant to support.

Module
music.codex.tines v0.1.0
Built at
no recorded row carries a build time; the browser lanes record none
Closure hash
not a Processor — no lowering closure
Toolchain
  • scriptc 64acce1ae3b8…
  • moduleToolchainDist c621ffab721d…
  • pluginShellKitRuntime bca003784692…
  • faceShellGeneration 8533207ab81f…
  • uiPreservation cd28dbd7e3d6…
  • packagerVersion 3
Build result and download for each format
FormatResultDownload
Browser package (JS)Not built by this module's lane

this module has no release.json; its packager lane records no browser program rows

Not built for the browser
Browser package (WASM)Not built by this module's lane

this module has no release.json; its packager lane records no browser program rows

Not built for the browser
VST3Not built — the native export is blocked

native-export.json records nativeEligibility "blocked"

Not built for macOS, Windows or Linux
Audio UnitNot built — the native export is blocked

native-export.json records nativeEligibility "blocked"

Not built for macOS
CLAPNot built — the native export is blocked

native-export.json records nativeEligibility "blocked"

Not built for macOS, Windows or Linux
Standalone appNot built — the native export is blocked

native-export.json records nativeEligibility "blocked"

Not built for macOS, Windows or Linux

Parity

No lane recorded an artifact; there is no parity evidence.

Presets

Start from a named sound, then adjust the instrument to make it yours.

InitMellowGlassyBarkSuitcaseDrivenModded BrightBallad BellShort Tine

Signal graph.

Experimental

Migration fallback: approximated from parameter groups, not a runtime wiring diagram.

How it works.

Each note is a hammer burst convolved with an impulse response synthesised for that exact pitch. The IR carries two mode groups at once. The tine's are the bending modes of a rod clamped at one end, 1, 6.267, 17.55 and 34.39 times the fundamental, wildly inharmonic, which is why a struck tine sounds like a tuning fork rather than a string and why its attack is a metallic cluster with no relationship to the note. The tonebar's are a free-free bar's, plus an octave partial the coupled pair sings at, and its fundamental sits four-tenths of a percent sharp so the two beat slowly against each other.

The hammer is a two-to-six-millisecond burst of low-passed noise with a leading impact, seeded so a given setting always produces the same burst. Contact time is what sets the bandwidth of the excitation, so a soft tip literally cannot wake the tine's seventeenth-ratio mode and a hard one wakes all of it, and because a neoprene tip compresses under a heavy blow, the played velocity moves the hammer's hardness as well as its force.

Then the pickup, which is the only part of this that is not a modal bank. A WaveShaperNode runs a transfer curve computed from a Lorentzian flux law: the gap sets how bent it is, and an alignment control fades in the even half of it, which is what turns odd harmonics into even ones. Velocity is not applied to the curve, it is applied to the signal entering it, so a quiet note sits in the near-linear middle and a hard one reaches the ends. For that to mean anything the level entering the curve has to be the same for every note, which it is not by default: the impulse responses are normalised by peak, and a short hammer burst sums far more coherently against a high note's dense response than a low note's, spanning about 15 dB across the compass. So each note's strike transient is measured once, when its response is rendered, and divided out, after which velocity is the only thing deciding where on the curve a note lands. The curve itself is level-matched to full scale so a dirtier setting is not also a louder one, and a DC blocker follows it because an offset pickup rectifies slightly, exactly as the capacitor in a real preamp is there for.

The curve is not written in the audio code. It lives in the shared UI kit's waveshaper maths as a tested pure function, and both the WaveShaperNode's table and the plot on the panel are sampled from that one function, the table pinned bit-identical to the plotted curve on the node's own sampling grid. A transfer plot that merely resembled the audio would be teaching a shape the ear cannot confirm, which is why this is arranged the way it is.

Behind the voices, the amplifier: a soft-clip drive stage and a stereo tremolo, both shared web-fx primitives rather than local copies. The tremolo runs its two channels in opposite phase from a quadrature-locked oscillator pair, so it pans rather than pulses and stays locked at any rate. IRs are cached by note and by the two knobs that change the samples, deliberately not by velocity, since velocity here never touches the modal bank, so a crescendo never misses the cache. Voices are capped at eight with oldest-first stealing, and every voice's nodes are freed on a six-second tail cap.

Goes well with.

Preview

Gamelan

Modelled bronze instruments with flexible tuning.

Preview
Preview

Wavetable

Single-cycle waves with continuous position morphing.

PreviewNot built for macOS, Windows or Linux
Preview

Space Mini

Convolution reverb: eight synthesized spaces, twenty-five real cabinets.

PreviewNo build recorded