polyhelm
polyhelm · sources · schema v1POLYHELM — HELM with a polyphonic (poly bus) input. The full HELM polyphonic subtractive synth (algorithm port of Matt Tytel's Helm; originally GPL-3.0, this port AGPL-3.0-or-later) reusing HELM's entire DSP engine (shared packages/dsp/src/lib/helm-engine.ts) — the same 4-8 voice allocator, 2 morphing oscillators with transpose/tune/unison, sub + noise, Cytomic TPT state-variable filter (12/24dB, LP↔BP↔HP blend, drive, key-track), three ADSR envelopes (amp/filter/mod), two pre-wired LFOs, 16-step gate-clocked step sequencer, and stereo voice-spread as HELM. The difference: POLYHELM ALSO accepts the project's 10-channel polyPitchGate poly bus on its POLY input, so a chord from MIDI LANE / POLYSEQZ / a chord sequencer plays it polyphonically — lane i drives one allocator voice (the DX7 pattern). Each lane's gate rising edge is a note-on at the lane's pitch and the falling edge a note-off; the played pitch is held on the voice so the ADSR release tail sounds at the played note (not C4) — held-pitch-through-release is correct because the pitch lives on the persistent voice, not a per-block cache. While a lane stays gated its pitch is tracked live (pitch glide / bend). The mono pitch_cv (V/oct) + gate fallback path still drives a single voice when no poly/MIDI source is patched (HELM-compatible), and the gear-icon Web MIDI settings panel works identically (device picker + per-channel rx). MIDI + poly + mono-CV can coexist (MIDI/CV use a non-lane allocator slot). The shipped HELM module is unchanged; POLYHELM is HELM + poly, not a stripped variant.
the faceplate
inputs
| id | cable | what it does |
|---|---|---|
poly | polyPitchGate | The preferred polyphonic input: the 10-channel poly bus (5 lanes of pitch + gate) from MIDI LANE / POLYSEQZ / a chord sequencer. Each gated lane drives its own Helm voice, so POLYHELM plays chords. This MUST be fed by a real poly source to hear polyphony — patch MIDI LANE → poly, or POLYSEQZ → poly. While any lane is gated this bus takes priority over the mono PITCH/GATE fallback. poly pitch+gate bus; 10-channel poly bus (5 pitch + 5 gate lanes) |
pitch_cv | cv | Mono V/oct pitch — the single-voice fallback used when nothing is patched into POLY (and no MIDI). Sets the pitch of the one voice the GATE input articulates. control voltage (CV) |
gate | gate | Mono gate for the single-voice fallback: a rising edge starts a note (envelopes attack), and the falling edge releases it. Used together with PITCH when POLY/MIDI are not driving the synth. gate / trigger |
midi_in | cv | A visual-only MIDI marker port. Actual MIDI flows in over the Web-MIDI API via the card's gear/settings panel (device + channel picker), not through a patch cable — this jack just shows that MIDI is a supported source. control voltage (CV) |
seq_reset | gate | Reset trigger for the internal step sequencer: a rising edge restarts the modulation sequence from step 1, re-syncing it to your groove. gate / trigger |
outputs
| id | cable | what it does |
|---|---|---|
out_l | audio | Left channel of the mixed polyphonic voices (after the stereo SPREAD). Pair with OUT R to keep the width. audio signal |
out_r | audio | Right channel of the mixed voices, the partner of OUT L. audio signal |
params
| id | label | range | default | curve |
|---|---|---|---|---|
voiceCount | Voices | 1..8 | 6 | discrete |
volume | Vol | 0..2 | 0.7 | linear |
osc1Wave | O1 Wav | 0..3 | 0 | discrete |
osc1Trans | O1 Tr | -24..24st | 0 | linear |
osc1Tune | O1 Tu | -100..100c | 0 | linear |
osc1Unison | O1 Uni | 1..7 | 1 | discrete |
osc1Detune | O1 Det | 0..50c | 10 | linear |
osc1Vol | O1 Vol | 0..1 | 0.8 | linear |
osc2Wave | O2 Wav | 0..3 | 1 | discrete |
osc2Trans | O2 Tr | -24..24st | 0 | linear |
osc2Tune | O2 Tu | -100..100c | 7 | linear |
osc2Unison | O2 Uni | 1..7 | 1 | discrete |
osc2Detune | O2 Det | 0..50c | 10 | linear |
osc2Vol | O2 Vol | 0..1 | 0.6 | linear |
subWave | Sub W | 0..3 | 3 | discrete |
subVol | Sub V | 0..1 | 0.4 | linear |
noiseVol | Noise | 0..1 | 0 | linear |
filterCutoff | Cut | 20..20000Hz | 4000 | log |
filterRes | Res | 0.5..16 | 1 | linear |
filterBlend | Mode | 0..2 | 0 | linear |
filterStyle | Pole | 0..1 | 0 | discrete |
filterDrive | Drv | 0.5..6 | 1 | linear |
filterKeyTrack | Key | -1..1 | 0 | linear |
ampAttack | A A | 0..8s | 0.005 | linear |
ampDecay | A D | 0..8s | 0.2 | linear |
ampSustain | A S | 0..1 | 0.6 | linear |
ampRelease | A R | 0..8s | 0.3 | linear |
filAttack | F A | 0..8s | 0.005 | linear |
filDecay | F D | 0..8s | 0.5 | linear |
filSustain | F S | 0..1 | 0 | linear |
filRelease | F R | 0..8s | 0.3 | linear |
filEnvDepth | F Dpth | -1..1 | 0 | linear |
modAttack | M A | 0..8s | 0.005 | linear |
modDecay | M D | 0..8s | 0.5 | linear |
modSustain | M S | 0..1 | 0 | linear |
modRelease | M R | 0..8s | 0.3 | linear |
modEnvDepth | M Dpth | -1..1 | 0 | linear |
lfo1Wave | L1 W | 0..3 | 3 | discrete |
lfo1Freq | L1 Hz | 0.01..30Hz | 1 | log |
lfo1Amp | L1 Amt | 0..1 | 0 | linear |
lfo2Wave | L2 W | 0..3 | 3 | discrete |
lfo2Freq | L2 Hz | 0.01..30Hz | 4 | log |
lfo2Amp | L2 Amt | 0..1 | 0 | linear |
stepNumSteps | Steps | 1..16 | 8 | discrete |
stepRate | St Hz | 0.1..30Hz | 4 | log |
stepSmooth | St Smth | 0..1 | 0 | linear |
stepDepth | St Dpth | -1..1 | 0 | linear |
spread | Spr | 0..1 | 0.3 | linear |
controls
| control | what it does |
|---|---|
| A A | Amp envelope ATTACK time (s) — how fast each note rises to full from note-on. |
| A D | Amp envelope DECAY time (s) — fall from the attack peak down to the sustain level. |
| A R | Amp envelope RELEASE time (s) — fade to silence after the gate falls. |
| A S | Amp envelope SUSTAIN level (0..1) — the level held while the note's gate stays high. |
| F A | Filter envelope ATTACK time (s) — how fast the filter-cutoff modulation rises on note-on. |
| F D | Filter envelope DECAY time (s) — fall to the filter-env sustain level. |
| F Dpth | Filter envelope DEPTH (−1..+1) — how much (and which polarity) the filter envelope sweeps the cutoff; 0 = no sweep. |
| F R | Filter envelope RELEASE time (s) — how fast the filter modulation fades after the gate falls. |
| F S | Filter envelope SUSTAIN level (0..1) — held filter-modulation level while the gate is high. |
| Mode | Filter mode blend (0 = low-pass, 1 = band-pass, 2 = high-pass) — morphs the state-variable filter response continuously. |
| Cut | Filter cutoff/corner frequency (20 Hz..20 kHz, log) — the main brightness control; the filter envelope and key-track add to it. |
| Drv | Filter input drive (0.5..6) — pushes the filter harder for saturation and a fatter, dirtier tone. |
| Key | Filter keyboard tracking (−1..+1) — how much the played note offsets the cutoff, keeping timbre consistent across the keyboard (positive opens the filter for higher notes). |
| Res | Filter resonance (0.5..16) — emphasises the cutoff frequency; high values self-oscillate. |
| Pole | Filter pole/style — switches the filter slope/character (a 1-pole vs steeper response). |
| L1 Amt | LFO 1 amount/depth (0..1) — how much LFO 1 modulates its destination. |
| L1 Hz | LFO 1 rate (0.01..30 Hz, log). |
| L1 W | LFO 1 waveform (sine / triangle / saw / square). |
| L2 Amt | LFO 2 amount/depth (0..1). |
| L2 Hz | LFO 2 rate (0.01..30 Hz, log). |
| L2 W | LFO 2 waveform (sine / triangle / saw / square). |
| M A | Mod envelope ATTACK time (s) — the free assignable envelope, used as a modulation source. |
| M D | Mod envelope DECAY time (s). |
| M Dpth | Mod envelope DEPTH (−1..+1) — the amount of the free mod-envelope routed to its destination. |
| M R | Mod envelope RELEASE time (s). |
| M S | Mod envelope SUSTAIN level (0..1). |
| Noise | White-noise level in the mix (0..1) — adds breath/grit, useful for percussion and texture. |
| O1 Det | Oscillator 1 unison detune spread in cents — how far apart the stacked unison copies are spread. |
| O1 Tr | Oscillator 1 coarse transpose in semitones (−24..+24). |
| O1 Tu | Oscillator 1 fine tune in cents (−100..+100) for detuning between semitones. |
| O1 Uni | Oscillator 1 unison voice count (1..7) — stacks detuned copies for a fatter tone. |
| O1 Vol | Oscillator 1 level in the per-voice mix (0..1). |
| O1 Wav | Oscillator 1 waveform (sine / triangle / saw / square). |
| O2 Det | Oscillator 2 unison detune spread in cents. |
| O2 Tr | Oscillator 2 coarse transpose in semitones (−24..+24). |
| O2 Tu | Oscillator 2 fine tune in cents (−100..+100); default +7 c for a slight detune-beat against OSC 1. |
| O2 Uni | Oscillator 2 unison voice count (1..7). |
| O2 Vol | Oscillator 2 level in the per-voice mix (0..1). |
| O2 Wav | Oscillator 2 waveform (sine / triangle / saw / square). |
| Spr | Stereo SPREAD (0..1) — pans the voices across the field for width (0 = mono/center, up = wider). |
| St Dpth | Step-sequencer modulation DEPTH (−1..+1) — how much the step pattern modulates its destination; reset its phase with the SEQ RESET input. |
| Steps | Internal step-sequencer length (1..16 steps) — the modulation pattern's period. |
| St Hz | Step-sequencer rate (0.1..30 Hz, log) — how fast it advances through its steps. |
| St Smth | Step-sequencer smoothing (0..1) — glides between step values instead of stepping abruptly (0 = hard steps, up = slewed). |
| Sub V | Sub-oscillator level in the mix (0..1). |
| Sub W | Sub-oscillator waveform (sine / triangle / saw / square), one octave below — adds low-end weight. |
| Voices | Polyphony: the maximum number of simultaneous voices the allocator will sound (1..8). Lower it for mono/duo behavior or to save CPU; raise it for thicker chords. |
| Vol | Master output gain across all voices (0..2; 1 = unity). |
source
polyhelm.ts on GitHub.