← All modules
AvailableInstrument

Handpan

Nine tuned steel notes, with no extra tenth note.

Engine preview

VST3

About

A handpan note is a deliberately tuned object. The maker hammers a dimple into the steel and works it until three partials line up at once, the fundamental, the octave above it, and the compound fifth an octave and a fifth above that, and that 1 : 2 : 3 stack is checked with a tuner on all three at the same time. It is the opposite craft to the gamelan's, where the partials are stretched to 2.3 and 3.6 and the shimmer comes from the mismatch. Same modal engine here, opposite recipe, and that recipe is most of why one sounds like bronze and the other like a bell you want to hug.

The centre is not a tone field. The ding is a dome, deeper, stiffer, doubly curved, and its octave partial is not one mode but a pair a few cents apart, because the dome is never quite symmetric. That pair is written into the model as two modes rather than as an effect, so the shimmer on a struck ding is real interference between two detuned partials, and a struck tone field, which has no such pair, does not shimmer.

A physical handpan still has only the fields its maker tuned. In Scale preserves that finite layout by mapping every keyboard or MIDI input to the nearest field; changing the root transposes the whole layout. The 12-TET alternative models additional chromatic fields for composition and interoperability.

This is a preview instrument. Its hand-written Web Audio DSP now belongs to the canonical Handpan package and is loaded through the same SDK prototype contract in Studio and on the website. It remains uncompiled and is not covered by a native parity claim.

System requirements.

The downloadable Handpan release supports the hosts and systems listed below.

  • VST3macOS · arm64

    Works in Ableton Live, Reaper, Cubase, Studio One, Bitwig and FL Studio.

Version 0.1.0

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.handpan v0.1.0
Built at
Closure hash
e345f81e056c…
Toolchain
  • scriptc 64acce1ae3b8…
  • moduleToolchainDist c621ffab721d…
  • pluginShellKitRuntime bca003784692…
  • faceShellGeneration 8533207ab81f…
  • uiPreservation cd28dbd7e3d6…
  • packagerVersion 3
Build result and download for each format
FormatResultDownload
Browser package (JS)
Builtweb

bundle sha256 937c4f619732… · 407 KB

Built, but no downloadable archive was recorded.
Browser package (WASM)
Builtweb

bundle sha256 5342bd610173… · 2.0 MB

Built, but no downloadable archive was recorded.
VST3
Builtdarwin-arm64Steinberg validator + VST3 host render: passed

bundle sha256 4a27b4714af3… · 2.2 MB

CodexHandpan-vst3-darwin-arm64.zip

archive sha256 6796961969b0… · 2.2 MB · darwin-arm64

Audio UnitNot built

no recorded artifact row for au; native-lane-report.json is absent or records no au row for this module

Not built for macOS
CLAPNot built

no recorded artifact row for clap; native-lane-report.json is absent or records no clap row for this module

Not built for macOS, Windows or Linux
Standalone appNot built

no recorded artifact row for standalone; native-lane-report.json is absent or records no standalone row for this module

Not built for macOS, Windows or Linux

Parity

browser-js = browser-wasm = vst3 qualified against their own recorded digests. Not recorded: au, clap, standalone.

Presets

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

InitD Kurd SteelCeltic DuskHijaz BazaarIntegral AirPygmy LapSabye SunriseDeep B KurdFingertip Rhythm

Signal graph.

Experimental

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

How it works.

Each note is a hand strike convolved with an impulse response synthesised for that exact note: three to fourteen milliseconds of low-passed noise with a leading click, driving a bank of exponentially-decaying sinusoids. The bank is where the instrument lives. A tone field's first three partials sit at exactly 1, 2 and 3 times the fundamental, because that is what the maker hammered them to, and only the modes above them, the shell's own, which nobody tunes, are inharmonic. The upper modes also die fastest, and that ordering is the shimmering attack: everything arrives at once, the top of the bank leaves within a second, and what remains is the tuned 1 : 2 : 3 core.

The ding gets a different bank, not a transposed one. It is a dome rather than a dimple, so its partials are lower and denser, and its octave is a PAIR of modes at 1.994 and 2.011 rather than a single one, a real asymmetry in a real dome. Rendering both and letting them interfere is what makes a struck ding shimmer and a struck tone field not, and it is the same mechanism modal-ir.ts uses for a gamelan's ombak rather than an amplitude modulation applied afterwards.

Strike position is applied to the modes before the impulse response is rendered, so it changes which partials exist rather than filtering the ones that do. The dimple at the centre of a field is the antinode of its tuned fundamental; the shoulder around it belongs to the shell. Two lobes blended across the bank express that: at the dimple the fundamental is full and the shell modes are down at a fifth of their weight, at the shoulder it inverts. Nothing is ever weighted to zero, because a hand has width and never lands on a mathematical point.

Velocity does two things, both physical. Level follows velocity squared, which is the repo's own perceptual curve. And a harder tap is a shorter contact, which is a wider excitation spectrum, so velocity is coupled into the hand's effective hardness, a quiet note is genuinely duller and not merely quieter. There is no knob to defeat that coupling, because there is no way to defeat it on the instrument. The exciter burst is drawn from a seeded generator forked by the hand setting, so a given touch always produces the same burst; Math.random has no place in this path.

Rendering an impulse response is a few hundred thousand sine evaluations, so they are cached per note and dropped wholesale whenever a parameter that changes the samples moves, scale, base pitch, position, ring, damping, size or width. A nine-note instrument fills its cache in nine strikes. Voices are capped at ten with oldest-first stealing. Each strike is a one-shot whose duration grows from 1.4 to 5.5 seconds with velocity, followed by the Release fade, with an eight-second resource cap.

Which note a key plays is decided before any synthesis by the shared note remapper. In Scale quantises to the nearest field in the selected root-relative layout, including correct held-note release and collision handling; 12-TET passes the chromatic note through and lets the model build a matching field. Keyboard, MIDI, clips and the on-screen surfaces all use the same boundary.

Goes well with.

Preview

Gamelan

Modelled bronze instruments with flexible tuning.

Preview
Preview

Gong

A struck gong voice with a late shimmer.

Preview
Preview

Space Mini

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

PreviewNo build recorded