Files
Cagire/docs/tutorials/harmony.md

6.8 KiB

Notes & Harmony

Cagire speaks music theory. Notes, intervals, chords, and scales are all first-class words that compile to stack operations on MIDI values. This tutorial covers every pitch-related feature.

MIDI Notes

Write a note name followed by an octave number. It compiles to a MIDI integer:

c4        ;; 60 (middle C)
a4        ;; 69 (concert A)
e3        ;; 52

Sharps use s or #. Flats use b:

fs4       ;; 66 (F sharp 4)
f#4       ;; 66 (same thing)
bb3       ;; 58 (B flat 3)
eb4       ;; 63

Octave range is -1 to 9. The formula is (octave + 1) * 12 + base + modifier, where C=0, D=2, E=4, F=5, G=7, A=9, B=11.

Note literals push a single integer onto the stack, just like writing 60 directly. They work everywhere an integer works:

c4 note sine s .            ;; play middle C as a sine
a4 note 0.5 gain modal s .  ;; concert A, quieter

Intervals

An interval duplicates the top of the stack and adds semitones. This lets you build chords by stacking:

c4 M3 P5       ;; stack: 60 64 67 (C major triad)
c4 m3 P5       ;; stack: 60 63 67 (C minor triad)
a3 P5           ;; stack: 57 64 (A plus a fifth)

Simple intervals (within one octave):

Interval Semitones Name
P1 / unison 0 Perfect unison
m2 1 Minor 2nd
M2 2 Major 2nd
m3 3 Minor 3rd
M3 4 Major 3rd
P4 5 Perfect 4th
aug4 / dim5 / tritone 6 Tritone
P5 7 Perfect 5th
m6 8 Minor 6th
M6 9 Major 6th
m7 10 Minor 7th
M7 11 Major 7th
P8 12 Octave

Compound intervals (beyond one octave):

Interval Semitones
m9 13
M9 14
m10 15
M10 16
P11 17
aug11 18
P12 19
m13 20
M13 21
m14 22
M14 23
P15 24

Chords

Chord words take a root note and push all the chord tones. They eat the root and replace it with the full voicing:

c4 maj        ;; stack: 60 64 67
c4 min7       ;; stack: 60 63 67 70
c4 dom9       ;; stack: 60 64 67 70 74

Triads:

Word Intervals Example (C4)
maj 0 4 7 60 64 67
m 0 3 7 60 63 67
dim 0 3 6 60 63 66
aug 0 4 8 60 64 68
sus2 0 2 7 60 62 67
sus4 0 5 7 60 65 67

Seventh chords:

Word Intervals Example (C4)
maj7 0 4 7 11 60 64 67 71
min7 0 3 7 10 60 63 67 70
dom7 0 4 7 10 60 64 67 70
dim7 0 3 6 9 60 63 66 69
m7b5 0 3 6 10 60 63 66 70
minmaj7 0 3 7 11 60 63 67 71
aug7 0 4 8 10 60 64 68 70

Sixth chords:

Word Intervals Example (C4)
maj6 0 4 7 9 60 64 67 69
min6 0 3 7 9 60 63 67 69

Extended chords:

Word Intervals Example (C4)
dom9 0 4 7 10 14 60 64 67 70 74
maj9 0 4 7 11 14 60 64 67 71 74
min9 0 3 7 10 14 60 63 67 70 74
dom11 0 4 7 10 14 17 60 64 67 70 74 77
min11 0 3 7 10 14 17 60 63 67 70 74 77
dom13 0 4 7 10 14 21 60 64 67 70 74 81

Add chords:

Word Intervals Example (C4)
add9 0 4 7 14 60 64 67 74
add11 0 4 7 17 60 64 67 77
madd9 0 3 7 14 60 63 67 74

Altered dominants:

Word Intervals Example (C4)
dom7b9 0 4 7 10 13 60 64 67 70 73
dom7s9 0 4 7 10 15 60 64 67 70 75
dom7b5 0 4 6 10 60 64 66 70
dom7s5 0 4 8 10 60 64 68 70

Chord tones are varargs -- they eat the entire stack. So a chord word should come right after the root note:

c4 maj note sine s .    ;; plays all 3 notes as one chord

Scales

Scale words convert a degree index into a MIDI note. The base note is C4 (MIDI 60). Degrees wrap around with octave transposition:

0 major       ;; 60 (C4 -- degree 0)
4 major       ;; 67 (G4 -- degree 4)
7 major       ;; 72 (C5 -- degree 7, wraps to next octave)
-1 major      ;; 59 (B3 -- negative degrees go down)

Use scales with cycle or rand to walk through pitches:

0 1 2 3 4 5 6 7 8 cycle minor note sine s .

Standard modes:

Word Pattern (semitones)
major 0 2 4 5 7 9 11
minor 0 2 3 5 7 8 10
dorian 0 2 3 5 7 9 10
phrygian 0 1 3 5 7 8 10
lydian 0 2 4 6 7 9 11
mixolydian 0 2 4 5 7 9 10
aeolian 0 2 3 5 7 8 10
locrian 0 1 3 5 6 8 10

Pentatonic and blues:

Word Pattern
pentatonic 0 2 4 7 9
minpent 0 3 5 7 10
blues 0 3 5 6 7 10

Chromatic and whole tone:

Word Pattern
chromatic 0 1 2 3 4 5 6 7 8 9 10 11
wholetone 0 2 4 6 8 10

Harmonic and melodic minor:

Word Pattern
harmonicminor 0 2 3 5 7 8 11
melodicminor 0 2 3 5 7 9 11

Jazz / Bebop:

Word Pattern
bebop 0 2 4 5 7 9 10 11
bebopmaj 0 2 4 5 7 8 9 11
bebopmin 0 2 3 5 7 8 9 10
altered 0 1 3 4 6 8 10
lyddom 0 2 4 6 7 9 10

Symmetric:

Word Pattern
halfwhole 0 1 3 4 6 7 9 10
wholehalf 0 2 3 5 6 8 9 11
augmented 0 3 4 7 8 11
tritone 0 1 4 6 7 10
prometheus 0 2 4 6 9 10

Modal variants (from melodic minor):

Word Pattern
dorianb2 0 1 3 5 7 9 10
lydianaug 0 2 4 6 8 9 11
mixb6 0 2 4 5 7 8 10
locrian2 0 2 3 5 6 8 10

Octave Shifting

oct transposes a note by octaves:

c4 1 oct      ;; 72 (C5)
c4 -1 oct     ;; 48 (C3)
c4 2 oct      ;; 84 (C6)

Stack effect: (note shift -- transposed). The shift is multiplied by 12 and added to the note.

Frequency Conversion

mtof converts a MIDI note to frequency in Hz. ftom does the reverse:

69 mtof       ;; 440.0 (A4)
60 mtof       ;; 261.63 (C4)
440 ftom      ;; 69.0

Useful when a synth parameter expects Hz rather than MIDI:

c4 mtof freq sine s .

Putting It Together

A chord progression cycling every pattern iteration:

{ c3 maj7 } { f3 maj7 } { g3 dom7 } { c3 maj7 } 4 pcycle
note sine s .

Arpeggiate a chord across the step's time divisions:

c4 min7 arp note 0.5 decay sine s .

Random notes from a scale:

0 7 rand minor note sine s .

A bass line walking scale degrees:

0 2 4 5 7 5 4 2 8 cycle minor note
-2 oct 0.8 gain sine s .

Chord voicings with random inversion:

e3 min9
{ } { 1 oct } 2 choose
note modal s .

Stacked intervals for custom voicings:

c3 P5 P8 M10    ;; C3, G3, C4, E4
note sine s .