Chorgan
README
Chorgan Sequencer
Six-voice morphing chord synthesizer with built-in chord sequencer for the Workshop Computer.
Knob X and CV In 1 set the root pitch.
Knob Y selects an interval above the root in semitone steps.
Four extension voices fill out the chord β the extensions are drawn from the same harmonic world as the chosen interval. (A perfect 5th stays open and powerful, a minor 3rd stays dark, a major 3rd stays bright. The Main knob morphs all six voices through sine, triangle, saw, and narrow pulse).
A built-in chord sequencer stores up to eight chords and steps through them on rising edges at Pulse In 2.
Two modes are available, selected at boot:
- Normal mode (default): detune/chorus across the six voices
- Slew mode (hold Switch Down at power-on): chord changes glide β all six voices portamento independently to their new pitches
In both modes, Pulse Out 2 and CV Out 2 fire a timed envelope on every chord event β a gate and a unipolar downward voltage ramp (+5V to 0V) that can drive a VCA, filter, or act as a trigger.
Inputs
| Jack | Function |
|---|---|
| CV In 1 | Root pitch 1V/oct (0V = C4) β summed with Knob X |
| CV In 2 | Timbre offset β bipolar, offsets the Main knob position |
| Pulse In 1 | Rising edge advances the chord extension preset |
| Pulse In 2 | Rising edge recalls the next stored chord |
Outputs
| Jack | Function |
|---|---|
| Audio Out 1 | 6-voice mix |
| Audio Out 2 | Same 6 voices with per-voice phase offsets β stereo width |
| Pulse Out 1 | Square wave one octave below root |
| Pulse Out 2 | PWM envelope β resets to 50% duty on each chord event, ramps to 20% and holds |
| CV Out 1 | Root pitch + voiced interval (1V/oct) β follows X knob, CV In 1, and chord override |
| CV Out 2 | Unipolar downward ramp β +5V on chord event, decays to 0V and holds; tracks Pulse Out 2 timing exactly |
Controls
Knob X + CV In 1 β Root pitch Knob X sweeps from C3 to C6. CV In 1 tracks 1V/oct on top of that. Both are summed and applied uniformly to all six voices.
Knob Y β Interval Sets the interval between voice 1 (root) and voice 2 in audible integer semitone steps, 0 (unison) to 12 (octave). Voices 3β6 are chord extensions above the root, chosen by the current preset.
Main Knob + CV In 2 β Timbre Morphs the waveform of all six voices simultaneously. The curve is a W-shape:
| Position | Waveform |
|---|---|
| Fully CCW | Narrow pulse |
| 9 o'clock | Sine |
| 12 o'clock | Saw (fullest) |
| 3 o'clock | Sine |
| Fully CW | Narrow pulse |
CV In 2 offsets the knob position bipolarly but cannot push the timbre into a different detune/slew zone β that is always determined by the physical knob position.
Switch + Main Knob position β Detune (normal mode) / Slew rate (slew mode)
The four zones also set the rate of the Pulse Out 2 / CV Out 2 envelope in both modes.
In normal mode, four detune levels are selected by switch position and whether the Main knob is CCW or CW of centre:
| Switch | Knob position | Outer voice detune | Envelope ramp time |
|---|---|---|---|
| Mid | CCW of centre | 0 cents (clean) | ~250ms |
| Mid | CW of centre | 5 cents | ~100ms |
| Up | CW of centre | 10 cents | ~500ms |
| Up | CCW of centre | 15 cents | ~3s |
In slew mode, the same four zones set the portamento rate (detune is disabled):
| Switch | Knob position | Slew rate | Envelope ramp time |
|---|---|---|---|
| Mid | CCW of centre | Instant | ~250ms |
| Mid | CW of centre | Fast (~200ms) | ~100ms |
| Up | CW of centre | Slow (~700ms) | ~500ms |
| Up | CCW of centre | Glacial (~3s) | ~3s |
Tap Switch Down β Cycle preset A short tap (less than one second) advances the chord extension preset for voices 3β6. There are 6 presets per interval, cycling through different harmonic choices. A rising edge on Pulse In 1 does the same thing.
Chord extension presets
Each of the 13 Y positions (0β12 semitones) has 6 extension presets. Extensions are chosen to reinforce the harmonic character of the chosen interval β no minor 3rds if you've picked a major 3rd, no 3rds at all if you've picked a 5th or unison.
| Y | Interval | Harmonic world |
|---|---|---|
| 0 | Unison | 5ths and octaves only |
| 1 | Min 2nd | Clusters β semitone stacks, tritones, m7ths |
| 2 | Maj 2nd | Sus2 β 2nds, 4ths, 5ths, 9ths |
| 3 | Min 3rd | Minor β m3, P5, m7 |
| 4 | Maj 3rd | Major β M3, P5, M7, 9th |
| 5 | Perf 4th | Sus4/quartal β 4ths, 5ths, octaves |
| 6 | Tritone | Dim/aug β tritones, m3, M6 |
| 7 | Perf 5th | Power chord β 5ths, octaves, 9th |
| 8 | Min 6th | Minor/Phrygian β m3, P5, m6, m7 |
| 9 | Maj 6th | Major/pentatonic β M3, P5, M6 |
| 10 | Min 7th | Dominant/blues β P5, m7, 9th |
| 11 | Maj 7th | Lydian/maj7 β M3, P5, M7, #4 |
| 12 | Octave | Quartal/suspended β 4ths, 5ths, 2nds |
Boot modes
Normal mode β power on with Switch in any position except Down. LEDs sweep 0β5 at startup.
Slew mode β hold Switch Down before powering on, hold until LEDs flash (all on, then all off, ~200ms). Detune is disabled; chord changes glide instead.
Chord sequencer
Hold Switch Down (1 second) β Store chord Hold Switch Down until the LEDs change (one second). Release immediately β the chord is written to the next slot. The LED pattern shows which slot was just stored (LEDs 1, 3, 5 full bright; LEDs 0, 2, 4 encode the slot number in binary).
Up to eight chords can be stored. Storing more than eight overwrites from the beginning.
Recalling chords β Pulse In 2 Each rising edge at Pulse In 2 recalls the next chord in sequence, stepping through slots in the order they were stored and wrapping at the end. When a chord is held, LEDs 0, 2, 4 are full bright and LEDs 1, 3, 5 encode the recalled slot in binary.
Note: Pulse In 2 must be seen low at least once before it will respond (boot guard).
Breaking out of a held chord Move Knob X or CV In 1 by more than one semitone from where they were when the chord was recalled, or move Knob Y to a different step. The override releases immediately and you return to manual control.
Advancing preset while a chord is held Tapping Switch Down or sending a rising edge to Pulse In 1 advances the preset while the chord override is active β it does not break the override.
LEDs
| State | LED pattern |
|---|---|
| Boot (normal mode) | Single LED sweeps 0β5 |
| Boot (slew mode) | All LEDs flash on then off |
| Storing (hold active) | LEDs 1, 3, 5 full bright; LEDs 0, 2, 4 = slot number in binary |
| Chord held | LEDs 0, 2, 4 full bright; LEDs 1, 3, 5 = recalled slot in binary |
| Normal | LEDs 0β4: interval position; LED 5: preset brightness |
In normal operation, LEDs 0β4 show where Knob Y is across the 0β12 semitone range. LED 5 brightness indicates the current preset (dim = preset 0, bright = preset 5).
Voice layout
- Voice 1: always root
- Voice 2: root + Y interval (0β12 semitones)
- Voices 3β6: chord extensions above root, selected by current preset
Quick start
Self-contained pad
- Patch Audio Out 1 to a mixer or effects
- Knob Y to 7 (perfect 5th), Main Knob to 12 o'clock (saw β fullest sound)
- Switch Mid, Main Knob slightly CW for gentle 5-cent detune
Pitched chord voice
- Patch 1V/oct into CV In 1
- Knob Y to 4 (major 3rd), tap Switch Down to cycle presets
- Main Knob to taste β 12 o'clock for saw, 9/3 o'clock for sine, fully CCW/CW for pulse
Slow timbre sweep
- Patch a slow LFO into CV In 2
- The timbre morphs symmetrically around the current Main knob position
Chord sequence from a clock
- Set Pitch (X + CV In 1), Interval (Y), and preset (Switch Down taps) for your first chord
- Hold Switch Down for one second to store it
- Repeat for up to eight chords
- Patch a clock or gate sequence into Pulse In 2 β steps through your stored chords on each rising edge
- Move Knob X or Y by more than a semitone to drop back to manual
Portamento chord changes (slew mode)
- Boot with Switch Down held
- Set Switch Mid, Knob CW of centre for fast slew; Switch Up, Knob CCW for glacial
- Tap Switch Down or trigger Pulse In 1 to change preset β pitches glide to the new chord
Sub-bass layer
- Patch Pulse Out 1 to a filter or oscillator β clean square one octave below root
- Patch Pulse Out 2 alongside it for a PWM version whose timbre narrows on each chord change
Chord-triggered VCA
- Patch CV Out 2 to a VCA CV input β it fires +5V on each chord event then ramps down to 0V
- Works directly with any VCA that opens on positive voltage; no inversion needed
- Use Switch Mid CCW for a quick ~250ms decay; Switch Up CCW for a slow ~3s fade
Chord-triggered filter
- Patch CV Out 2 to a filter cutoff β the downward ramp darkens the filter after each chord change
- Combine with Audio Out into the filter input for a natural attack/decay envelope on the chord
Chord-triggered envelope (external)
- Patch Pulse Out 2 into an external envelope generator's gate input
- The PWM duty resets to 50% on each chord event β use the wide phase as your gate high time
- CV Out 2 mirrors the same timing as a direct voltage ramp if you don't have an envelope generator
Interval-keyed filter or oscillator
- Patch CV Out 1 to a filter cutoff or a second oscillator's 1V/oct input
- The CV tracks the root pitch plus voiced interval in semitones β use it to transpose an external voice in harmony with whatever Chorgan is playing
Technical notes
- 6-phase-accumulator oscillators, integer arithmetic throughout (RP2040 has no FPU)
- Tuning ratio applied uniformly to all voices β no per-voice stepping on X knob or CV In 1
- Detune zone determined by physical Main knob position; CV In 2 cannot cross zone boundaries
- Stereo width via per-voice phase offsets on Audio Out 2 (0Β°, 15Β°, 30Β°, 45Β°, 60Β°, 75Β°)
- Waveform: W-shape β pulse (CCW extreme) β sine (9 o'clock) β saw (12 o'clock) β sine (3 o'clock) β pulse (CW extreme)
- Pulse Out 2: PWM square at root pitch β resets to 50% duty on each chord event, ramps to 20% at zone-determined rate (~250ms / ~100ms / ~500ms / ~3s)
- CV Out 1: (X knob + CV In 1) + voiced interval in 1V/oct β clamped to Β±5V; follows chord override
- CV Out 2: unipolar downward ramp β +5V on chord event, decays to 0V at the same rate as Pulse Out 2; retriggers on pitch semitone change, interval change, preset change, or chord recall
- Chord sequencer: stores pitch, interval, and preset β up to 8 chords; override breaks on >1 semitone movement from position at recall time
- Slew mode: per-voice IIR portamento on phase increment; rates: instant / ~200ms / ~700ms / ~3s
- 200ms startup holdoff before audio begins β eliminates power-on click
Credits
By Andy Jenkinson (uglifruit), developed with Claude Code.
Built on the Workshop Computer platform by Tom Whitwell (Music Thing Modular), using the ComputerCard framework.
V/oct lookup table (voct_vals) from Utility Pair by Chris Johnson, used with permission under the original licence.
Waveform morphing concept inspired by Mutable Instruments Braids (Γmilie Gillet).
Licensed under Creative Commons Attribution-ShareAlike 4.0.