Drawbars
A tonewheel organ with nine drawbars and no attack stage.
A sawtooth ensemble with chorus.
Engine preview
Not built for macOS, Windows or Linux
A divide-down keyboard is not a polysynth with a lot of voices. There is one top-octave generator, twelve master oscillators, one per pitch class, and every octave below it is produced by dividing a master in half, again and again, with flip-flops. A key does not allocate anything; it gates dividers that are already running onto a footage bus. That is why these instruments were fully polyphonic in an era when a synthesiser played one note at a time, and it is why holding down every key here is a normal gesture rather than an abuse of the module.
It is also why the raw sound is so plain. Every octave of a C comes off the same master through an exact divide-by-two, so two C's an octave apart are phase-locked and cannot drift against each other. Nothing beats. A bank of sawtooths with no beating in it is a buzz, not a string section.
So the ensemble is not a sweetener on top of a string sound, it is the thing that makes the sound a string sound. The classic circuit is three bucket-brigade delay lines swept by one three-phase oscillator and summed with the dry signal; the beating between those lines is the entire illusion of many players. That is the case this module is built to demonstrate, which is why one of its presets (Dry Contour) is the same settings with the chorus switched out and is meant to sound honestly unremarkable.
One deliberate departure from the hardware is worth knowing about before it surprises you: this preview gives each key its own pair of oscillators rather than tapping a shared divider chain, so the 8′ and 4′ ranks are not phase-locked here. The 4′ carries a fixed four-cent spread that a real divider cannot have, and the Humanize control scatters each key by a few seeded cents. Both stand in for the tuning error between a real machine's twelve masters, which do drift against each other even though each master's own octaves cannot.
This is a preview instrument. The DSP is hand-written Web Audio in the website's stand-in engine, enough to hear what the ensemble is doing and what it is worth, but it is not a compiled kernel and it is not covered by any parity claim.
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.
| Format | Result | Download |
|---|---|---|
| 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 |
| VST3 | Not built — the native export is blocked native-export.json records nativeEligibility "blocked" | Not built for macOS, Windows or Linux |
| Audio Unit | Not built — the native export is blocked native-export.json records nativeEligibility "blocked" | Not built for macOS |
| CLAP | Not built — the native export is blocked native-export.json records nativeEligibility "blocked" | Not built for macOS, Windows or Linux |
| Standalone app | Not 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.
Start from a named sound, then adjust the instrument to make it yours.
Migration fallback: approximated from parameter groups, not a runtime wiring diagram.
A key builds two sawtooth oscillators, 8′ at the played pitch, 4′ an octave above and four cents sharp, each through its own contour VCA onto one of two shared footage busses. The busses are the mix faders, so moving one is a single AudioParam write rather than a write per sounding note, and they sum into one trim, one lowpass and one ensemble for the whole keyboard. Everything that is shared is shared because the hardware shares it: a per-note filter would sound cleaner and would be the wrong instrument.
The contour is two knobs and nothing else: a linear ramp to full over the attack, a flat hold for as long as the key is down, and an exponential release that runs 4.6 time constants (−40 dB) before the voice is torn down. Releasing a key part-way through a long attack starts the fall from the level actually reached rather than from full, which is the difference between a release and a click on every short note.
The ensemble is where the module spends its effort. The classic circuit is three bucket-brigade lines on one three-phase oscillator; the shared web-fx chorus primitive is a stereo pair whose two lines sit one spread angle apart on a single rate, so one instance cannot be three-phase. Two instances are therefore layered in PARALLEL, parallel because the hardware sums its lines rather than cascading them, and a cascade double-modulates the second line's input and smears instead of thickening. The result is four modulated lines at four phases across two rates (a slow 7.5 ms pair and a fast 3.2 ms shimmer) against one dry path.
Switching the ensemble in and out is a crossfade between that wet sum and a straight dry path, with a derived makeup gain on the wet side. Each chorus passes half the dry signal and half its own modulated pair, so the wet bus before makeup is 0.5·dry + 0.25·A + 0.25·B; the modulated lines are uncorrelated with the dry and with each other, so the sum's power is the sum of the squares and the makeup is one over its square root. That lands the switch within a fraction of a decibel, which is what makes the dry comparison a statement about movement rather than about volume.
Tuning is deterministic. The per-key scatter is drawn from the repo's seeded xorshift32 source, forked by MIDI note and by rank, so the same chord tunes identically on every machine and in every render, `Math.random()` is forbidden in DSP here, and an instrument that retuned itself between takes would read as a fault rather than as life. At zero the scatter is exactly zero, so the control has a true off position.
Gain staging is sized for a chord rather than for the polyphony cap. Sixteen keys times two ranks is a sum well past unity, and scaling every rank down to fit that worst case would make ordinary playing inaudible, so the bus trim is one over the square root of a six-note chord, which is the right law because notes at different pitches are uncorrelated and add in power rather than in amplitude. Holding more keys gets louder, exactly as the hardware does.
A tonewheel organ with nine drawbars and no attack stage.
A compact subtractive synth for learning the signal path.
Convolution reverb: eight synthesized spaces, twenty-five real cabinets.