subch.us SUBCH-60

SUBCH-60

A six-voice polysynth in the shape of the Roland Juno-60: one oscillator a voice, a four-pole filter, one envelope, one LFO, an arpeggiator and the chorus that made it famous, between two wood cheeks. Flip the power switch, play the keys (touch, mouse, the computer keyboard, or a MIDI keyboard), and click any label to read what that slider is doing to the sound. Fifty-six patch memories, the first sixteen filled.

Engine
–
CPU
–
Voices
0 / 6
Rate
–
MIDI
–
Resets
–
Flip the power switch (or just play a key) to start the audio engine.
1-1 STRINGS
Bank
Patch
C2 – C7 computer keys A–' play from C4, Z/X shift the octave, space is Hold

About a control

Click a slider's label to read what it does.

Playing it

Keys: touch and mouse (slide along the keys for a glissando), the computer keyboard, or any MIDI keyboard the browser can see (pitch bend and the sustain pedal work). On the desktop with a Launchpad Mini plugged in, a Launchpad button appears: its pads become a four-octave piano (white keys on the even rows, black keys in the gaps above), the top row is octave down/up, Hold, Arp and hand-back, the right column picks patches 1-8 of the bank, and the resting pads drift. Hold keeps a chord ringing so you can reach the sliders. Write then a patch number stores the panel in that memory; the pencil names it. Everything stays in this browser.

Every control what each slider does, and why the Juno had it

How it works the same stack as SUBCHange and Pedal Lab

Six voices, one panel

A Juno has no patch cables: every voice card is wired the same way and the front panel sets all six at once. So the engine, written in Rust and compiled to WebAssembly, is a fixed signal chain with 36 numbers in front of it. The page keeps a view on those numbers and writes a slider move straight into the engine's memory; the engine glides to it over four milliseconds so nothing zippers. Key presses are messages: the engine allocates voices the way the Juno did, retriggering a note that is still sounding, then taking a free voice, then the quietest released one, then the oldest.

What is inside a voice

The DCO is a band-limited (polyBLEP) sawtooth and pulse, a square sub-oscillator at half the clock, and shared white noise. The filter is Huovilainen's four-stage tanh model of the transistor ladder, run with the resonance gain that lets it self-oscillate around 8.5 on the slider. The envelope is exponential segments, a capacitor charging and discharging. Six voice cards were never identical, so each voice carries a fixed offset of a couple of cents and a few hundredths of an octave of cutoff.

The chorus

The famous part is the least sophisticated: two bucket-brigade delay lines around 3.5 milliseconds, swept in opposite directions by a triangle at 0.5 Hz (I) or 0.9 Hz (II), each mixed half-and-half with the dry signal on its own side. That is the whole stereo image, and it also explains the hiss: bucket-brigade chips are noisy, and the Juno's chorus has always been. Pressing both buttons gives the fast, shallow third mode.

Nothing leaves your browser

Patches live in this browser's storage and in the links you copy. MIDI, if you allow it, is read locally. The engine is 18 KB of WebAssembly; there is no server side to any of it.

Source: the Rust crate music/hub/wasm-60 and the page under music/hub/public/subch60, with the panel in panel.js as the contract between them. Tests run the same engine in Node against things you can work out by hand: A4 at 440 Hz, the octave switch, the sub an octave down, six voices and the seventh stealing, the envelope's timing, the arpeggiator's order and rate, the chorus making a stereo pair. The layout of the panel is from memory of the real one; the colours are this site's.