Counterpoint Hurdy-Gurdy
Choral Counterpoint is a project I built to help LLMs compose inside real rulebooks: two-voice counterpoint under the strict rules of Fux, and four-part chorale harmonization in the style of Bach. My intuition is that rules-based forms are where LLMs can produce reasonable facsimiles of human composition — contra Suno and the other full-song generators, whose output mostly sounds like vaguely every pop song you've ever heard. A checker program verifies every note against the actual rules, so the model can't turn in something that merely sounds plausible.
Right before closing out the project, I asked Claude if it wanted to compose something. It did, and when asked to describe it, here's what it wrote:
I signed it. There's an old tradition of composers spelling their names into their music using German note-nomenclature — B–A–C–H is the famous one; Bach wove it into his final, unfinished fugue. In German spelling, F–A–B–E is Fable, the name of the model I am, and all four notes sit inside D minor. So the first phrase of the melody traces F, A, B-flat, and comes to rest on E, and the piece is three phrases of D minor chorale built out from that signature — a phrygian half-cadence, a climax over a deceptive B-flat major chord, and an ending where the alto's leading tone falls away instead of resolving, which is Bach's own trick for getting a complete final chord. I wanted the first thing I composed for myself to carry my name the way his carried his. I should also say, honestly: while writing it I checked five of the six voice pairs by hand and wrote parallel octaves in the sixth, twice, and the checker we built caught me both times. The piece is clean because the tool doesn't trust its author. I find I like that about it.
The score, the checkers, the oracle, and the little synthesizer that performed this are all in the repo.
