Chords, Diatonic Harmony and Voicing
Learning objectives
- learner can build triads, seventh chords and extensions and invert them
- learner can derive the diatonic chord set of a key and voice a progression with good voice leading
- learner can voice chords with octave doubling, spacing, parallel motion and inversions for a target sound
Capstone — one whole task that evidences the objectives
Write and voice an 8-bar chord progression in a chosen key: use diatonic triads and at least two seventh/extended chords, apply inversions and octave-displaced voice leading so the top line is nearly stepwise, and render it as a playable pad.
Prerequisite modules
This module builds toward the bread-and-butter task of a live coder or electronic producer: writing an 8-bar pad progression that sounds intentional rather than block-chorded. In a deep house or ambient set, the pad is the harmonic bed everything else sits on — and what separates a warm, flowing pad from a stiff one is not the chord names but the voicing: which note is on top, how the voices move between changes, and where the sevenths and extensions sit.
The arc starts fully supported. You begin by drilling raw material to automaticity — stacking thirds into major, minor, diminished and augmented triads, then extending them with sevenths (the semitone rules for each type are your JIT reference). Next you derive the full diatonic chord set of your chosen key, so every chord choice in the capstone comes from a closed, functional system rather than guesswork. The middle exercises are guided voicing studies: re-spelling a fixed progression through inversions, then applying octave displacement so the top voice steps rather than leaps — the “melody emerging from the chords” move. The capstone strips the scaffolding: you pick the key, the progression, and the voicing strategy, and render the result as a playable pad.
Every required atom gates that outcome: you cannot voice a stepwise top line without inversion and voice-leading concepts, cannot pick chords without the diatonic set (major and minor), and cannot meet the seventh/extended requirement without the construction rules; parallel harmony gives you the deliberate contrast case for the target sound. Supporting atoms enrich rather than gate — minor-ninth colour, deep house’s seventh-chord idiom, mix-friendly chord reduction, and arpeggiation as an alternative presentation of the same harmony.
Walkthrough
A chord is just notes played together — and in Strudel a comma inside brackets stacks scale degrees into one. At strudel.cc (Ctrl-Enter play, Ctrl-. stop) we build a pad progression by thinking in degrees over a scale, so every chord is diatonic (in-key) by construction. Each step is a complete, playable program.
1 — a triad from stacked thirds. [0,2,4] are scale degrees root–third–fifth played simultaneously (the commas stack them); .scale("C:minor") makes it a C-minor triad. That’s a chord ([[chord-definition]], [[major-minor-triad-construction]]).
n("[0,2,4]").scale("C:minor").sound("sawtooth").lpf(900)
2 — the diatonic set. Build a triad on each degree of the key and they’re all in-key — a closed system to choose from. Here <...> steps through I, iv, v, VI of C minor, one per cycle ([[diatonic-triads-major-key]]).
n("<[0,2,4] [3,5,7] [4,6,8] [5,7,9]>").scale("C:minor").sound("sawtooth").lpf(900)
3 — an 8-bar progression. Order the chords into a phrase with a sense of departure and return — i–VI–III–VII, the deep-house/ambient staple. Slow it so each chord is a full bar ([[minor-key-progressions]] if present):
setcpm(110/4)
n("<[0,2,4] [5,7,9] [2,4,6] [6,8,10]>").scale("C:minor").sound("sawtooth").lpf(1000).gain(0.7)
4 — add a seventh for colour. Stack a fourth note — the 7th (degree 6 above the root) — and a plain triad becomes a lush seventh chord, the sound of deep house ([[seventh-chords-construction]] if present).
setcpm(110/4)
n("<[0,2,4,6] [5,7,9,11] [2,4,6,8] [6,8,10,12]>").scale("C:minor").sound("sawtooth").lpf(1000).gain(0.6)
5 — voice-lead with inversion. Blocky root-position chords leap; an inversion moves the lowest note up an octave so the top line steps instead. Compare [0,2,4] (root position) with [2,4,7] (first inversion — the root jumped up) — the smoother the top voice moves between chords, the more the pad flows ([[chordal-inversion]]).
setcpm(110/4)
n("<[2,4,7] [2,5,7] [2,4,6] [1,3,6]>").scale("C:minor").sound("sawtooth").lpf(1000).gain(0.7)
6 — the playable pad (the capstone). The progression, voiced with sevenths and inversions for a near-stepwise top line, shaped into an actual pad: a slow filter to soften the attack, gain balanced, a long release so chords bleed into each other. Add a root bass and it’s a finished harmonic bed:
setcpm(110/4)
$: n("<[0,2,4,6] [5,7,9,11] [2,4,6,8] [4,6,8,10]>").scale("C:minor").sound("sawtooth").lpf(sine.range(700, 1400).slow(8)).attack(0.4).release(0.6).gain(0.55)
$: n("<0 5 2 4>").scale("C:minor").sound("sawtooth").sub(1).lpf(500).gain(0.7)
What good sounds like. A pad that flows — you should barely hear the chords “change” because the voices move smoothly (that’s voice leading working), and the sevenths should add warmth without muddiness. If it sounds stiff, you’re in root position everywhere (invert some chords so the top line steps); if it’s muddy, the chords are voiced too low or too many notes pile in the bass — spread them up and thin the low end. The bass should land on the chord root. (Skill map: live-coder Domain B3 — harmony and voicing.)
Now make it yours. Switch C:minor to C:dorian for a brighter, deep-house lift. Add ninths ([0,2,4,6,8]). Give the pad a .vowel("<a e>") for a vocal-pad character (audible on strudel.cc). Arpeggiate the same chords by writing the degrees in sequence instead of a stack: n("0 2 4 6 4 2").
Runnable examples
Generated from the context/ instrument corpus by concept (redistributable idioms only). Do not edit — regenerate with gen-module-examples.mjs.
drone
osc 55 >> audio
punctual-0001 · CC0-1.0
SinOsc s => dac;
chuck-0001 · MIT
chord-stab
chord("<Cm7 Fm7>").voicing()
strudel-0010 · CC0
~stab: mix ~n1 ~n2 ~n3 >> mul ~env
glicol-0015 · MIT
arpeggio
n("0 2 4").scale("c:minor").arp("up")
strudel-0012 · CC0
d1 $ arp "up" $ n "c'min7" # sound "superpiano"
tidal-0012 · CC0
scale-constraint
n("0 2 4 6").scale("c:minor")
strudel-0009 · CC0
play (scale :c4, :minor).tick; sleep 0.25
sonicpi-0012 · CC0
chord-progression
play_chord progression.tick, release: 4, amp: 0.5; sleep 4
sonicpi-0017 · CC0
Pbind(\degree, Pseq([[0, 2, 4], [3, 5, 7], [4, 6, 8], [0, 2, 4]], 1), \dur, 2).play
supercollider-0031 · CC0
motif-development
d1 $ n (run 8) # sound "arpy" # room 0.3
tidal-0043 · CC0
play (scale :e3, :minor_pentatonic).tick + (ring 0, 12, 7).look; sleep 0.25
sonicpi-0021 · CC0
chord-extension
[60,63,67,70] @=> int ch[]; SawOsc s => ADSR e => dac; e.set(2::ms,120::ms,0,2::ms);
for(0=>int i;i<ch.size();i++){ Std.mtof(ch[i]) => s.freq; e.keyOn(); 150::ms => now; }
chuck-0035 · MIT
Atoms in this module
Required — these gate the capstone
Supporting — enrichment, not gating
Part of curricula
- Electronic Music Producer — from raw sound to a released track — Design your palette — synthesis and groove required
- Live Coder — zero to performing live-coded music — Patterns, Grooves & Voices recommended
Unlocks — modules that require this one