Skip to content

7. Form-Specific Constraints

The previous chapters apply to every generated piece. This chapter covers the contracts that exist because of what kind of piece is being built: a passacaglia promises its ground will never change; a chorale prelude promises the hymn tune survives its decoration; a cello prelude promises that a single instrumental line implies coherent multi-voice counterpoint. The engine encodes each promise as material carriers plus a validating rule.

Immutable material: the ground

Immutable carrierGround bass replays unchanged
Passacaglia and chaconne are built on a ground: a bass theme that repeats unchanged underneath ever-richer variations. The engine marks the ground as immutable material — if any cycle alters even one note, the structural rule fails. Variation happens above the ground, never inside it.
ground_bass_immutablepassacaglia_ground_immutableThe bass line repeats verbatim each cycle while the upper voice varies.

Passacaglia and chaconne are ground-bass forms: a short bass theme repeats unchanged for the entire piece while the upper texture varies cycle by cycle. Two rules — ground_bass_immutable (chaconne, modeled on the BWV 1004 Chaconne) and passacaglia_ground_immutable (the organ passacaglia's 8-bar ground, modeled on BWV 582) — verify byte-exact replay of the ground on every cycle via provenance bits: the per-note origin tags the engine carries alongside each note, the same machinery that exports source: "material" | "compose" | "ornament" in the event JSON. They are StructuralFails: a changed ground is not bad counterpoint, it is a different piece.

BWV numbers

BWV (Bach-Werke-Verzeichnis) is the standard catalogue of Bach's works — BWV 582 is the C minor Passacaglia for organ, BWV 1004 the violin partita whose final movement is the Chaconne. When a rule says it is "modeled on" a BWV number, the engine's form template encodes the proportions of that specific piece.

A related rule keeps the variation layer honest: variation_role_ornament_constraint prevents a variation span that plays the ground role from subdividing below quarter notes — the ground must stay recognizable as a slow line even when restated by another voice.

The most famous ground in Bach is not in a passacaglia at all — it carries the Goldberg Variations. The Aria's bass walks a scheme that thirty variations then restate — switch the excerpt above the score to hear two of those variations walk the same skeleton:

From BachBach: Goldberg Variations — the Aria's groundvoices play in turn
over the same ground —
The first eight bars of the Aria of the Goldberg Variations (BWV 988): the actual bass voice above, its reduction to one tone per bar below. The famous descent G–F♯–E–D, then B–C–D–G closing the half-phrase. It is this scheme — not the ornamented melody — that every variation restates, which is exactly the relation the immutable-ground rules enforce between declared material and its replays. Bar 8's mordent is shown plain. Switch to a variation above to hear a completely different surface walk the same eight downbeats. The demo's Goldberg preset builds on the same idea.
ground_bass_immutablepassacaglia_ground_immutableStrip the passing notes from the Aria's bass and one scheme tone per bar remains — the skeleton all thirty variations keep.

Immutable material: the cantus firmus

Immutable carrierCantus firmus with figuration
In a chorale prelude the hymn melody (cantus firmus) moves in long notes while another voice embroiders around it. Two contracts hold: the downbeat of each bar must restate the skeleton tone exactly, and the figuration's bar-opening note must belong to the bar's chord. Between downbeats, the embellishment is free.
cantus_firmus_immutablefiguration_harmonic_consistencyThe chorale tone holds each downbeat; the fast voice must hit a chord tone there.

The chorale prelude carries a hymn tune (cantus firmus) in long notes while another voice embroiders. cantus_firmus_immutable checks each bar's downbeat against the declared skeleton tone — embellishment between downbeats is free, the skeleton is not. Like the grounds, the cantus-firmus voice is excluded from the ornament pass entirely.

That is precisely the Orgelbüchlein's plan. In "Ich ruf zu dir" the tune floats untouched above a sixteenth-note inner voice and a murmuring pedal:

From BachBach: "Ich ruf zu dir" (Orgelbüchlein) — a chorale carried in long notes
The first bar of "Ich ruf zu dir, Herr Jesu Christ" (BWV 639), the only chorale prelude in the Orgelbüchlein with this exact three-layer plan. The hymn tune sits on top in plain quarters — fixed material no ornament may touch, the engine's material source in its purest form. Beneath it an inner voice embroiders in unbroken sixteenths, and the pedal repeats its quiet eighth-note F, each layer on its own rhythmic grid. The tune is the contract, the other two voices are the realization: change a single melody note and it stops being the chorale. (The pedal's first two notes sound an octave lower in the source recording — kept as recorded.)
cantus_firmus_immutablefiguration_harmonic_consistencyThree voices, three speeds: the hymn tune in quarters, an embroidering inner line in sixteenths, a walking pedal in eighths.

Figuration harmony

The free-prelude style (think BWV 543's opening) runs continuous figuration over a slow harmonic rhythm — the rate at which the underlying chords change, here typically one chord per bar. figuration_harmonic_consistency anchors it: the note that opens each bar must be a chord tone of that bar's chord. Off-downbeat notes are unconstrained — that freedom is what makes it figuration and not chorale writing. Pedal notes are exempt.

Free preludeFiguration anchored at the downbeat
The free-prelude texture runs continuous figuration over a slow harmonic rhythm — here one chord per bar, I then V. The validator constrains exactly one note per bar: the downbeat must belong to the bar's chord. The scalework between downbeats is unconstrained; that freedom is what makes it figuration rather than chorale writing.
figuration_harmonic_consistencyEach bar-opening note is a chord tone of that bar's harmony; everything between is free.

The purest illustration in the repertoire opens WTC I — two bars of the C major prelude, where a single line of sixteenths over two held notes spells out one chord per bar:

From BachBach: WTC I Prelude in C — figuration over a slow harmony
The opening of the C major prelude (WTC I, BWV 846) — the most famous figuration in keyboard music, written on three rhythmic layers exactly as shown: a held bass, a held inner note, and a rising five-note figure. Nothing here is melody; everything is harmony drawn out in time, changing once per bar (the C major tonic, then ii⁴² over the same bass note). The bar-opening note is always a chord tone — the anchor figuration_harmonic_consistency checks — and the ear assembles five voices from a single written line.
figuration_harmonic_consistencyOne broken-chord figure per half bar, one chord per bar — each downbeat states a chord tone of that bar's harmony.

Solo strings: counterpoint inside one line

A solo cello or violin cannot sound four voices at once, but Bach's solo writing makes the ear hear several. The cello prelude is the engine's only single-voice form, and these rules are how one voice still gets counterpoint validation.

The reconstruction is three concrete steps. The engine collects the arpeggio line's notes in onset order, partitions them into contiguous cells of the declared group_size, then takes each cell's lowest pitch as the implied bass stream and its highest as the implied top stream. Register decides, not slot position — in the BWV 1007 figuration the perceived melody note sits in the middle of the written cell, and the min/max extraction still finds it:

Solo stringsOne line, two voices: extracting the streamsvoices play in turn
This is what the music actually looks like: one unbroken line of broken chords, BWV 1007-style. The engine partitions the line into cells of the declared group size, then takes each cell's lowest note (amber) as the implied bass and its highest (green) as the implied melody. Register decides, not position — here the top note sits in the middle of the cell, and the extraction still finds it. Play it in sequence: first the real line, then the bass your ear was already hearing.
implicit_voice_counterpointarpeggio_no_parallel_perfectEach 4-note cell contributes its lowest pitch to a bass stream and its highest to a top stream.

And here is the original behind that figure — the opening of the first cello suite, with the extraction the engine computes written out underneath:

From BachBach: Cello Suite No. 1 — the voices inside one linevoices play in turn
The opening of the G major cello suite (BWV 1007) — the most famous implied counterpoint ever written for one instrument. The cello plays nothing but sixteenths, yet every eight-note cell anchors G at the bottom and rings B (then C) at the top, so the ear hears a pedal bass under a slow upper line. And the melody note really does sit in the middle of the written cell — register finds it, position would not. The extraction below each line is exactly what the engine computes before checking the streams like real voices: here the top line steps up over a held bass — oblique motion, no parallel perfects, pass.
implicit_voice_counterpointarpeggio_no_parallel_perfectEach eight-note cell projects its lowest pitch into a pedal bass and its highest into a melody that steps B–B–C–C.

The extracted streams are then held to the same standards as real voices. The two reductions below show the streams alone — first failing, then passing:

Solo stringsImplied parallel perfects in arpeggio
Solo cello or violin writing can imply multiple voices. The validator reconstructs low and high streams and checks them like real counterpoint.
implicit_voice_counterpointarpeggio_no_parallel_perfectThe broken chord projects bass and top streams moving in parallel perfect intervals.
Solo stringsImplied streams in contrary motion
This is the shape the cello prelude generator aims for: when each broken-chord cell changes, its lowest and highest notes trace independent, contrary lines. The same intervals that failed in the previous example pass here because the streams never move in parallel perfects.
implicit_voice_counterpointarpeggio_no_parallel_perfectThe reconstructed bass stream rises while the top stream descends — real two-part counterpoint inside one instrument.
RuleContract
implicit_voice_counterpointBetween consecutive cells, the implied bass and top streams obey the melodic-leap rules from chapter 4 — the same forbidden-leap predicate that judges the organ's Compose voices.
arpeggio_no_parallel_perfectConsecutive cells must not frame the same perfect interval (fifth or octave) with both streams moving in the same direction. Oblique, contrary, and static motion are permitted — exactly the escape hatches real voices get in chapter 2.

The physical side of solo-string writing — each instrument's playable range — lives in Instruments.

Phrase architecture

Two rules keep generated music on the Baroque bar grid. An anacrusis (upbeat) is the short lead-in that sounds before a downbeat — the "and-a" pickup before bar 1:

Phrase gridAnacrusis: the upbeat lead-in
An anacrusis starts the music before the bar: a pickup that resolves into the first downbeat. The engine treats it as a declared property — if the piece declares an upbeat of a given length, every upbeat fragment must begin exactly that distance before a phrase start, and if no upbeat is declared, none may appear. Consistency, not existence, is what the rule checks.
anacrusis_consistentThe short note before the barline leads into the downbeat where the phrase really starts.

Bach's dance movements live on this gesture — the Courante of the first cello suite spends one eighth note getting airborne:

From BachBach: Cello Suite No. 1 Courante — starting before the bar
The Courante of the first cello suite (BWV 1007) begins one eighth note early: a single G whose only job is to launch the downbeat G that actually starts the phrase. This is the anacrusis as a declared property — the engine's contract says that once a piece declares an upbeat of a given length, every upbeat fragment must begin exactly that distance before a phrase start. anacrusis_consistent checks the consistency, not the existence.
anacrusis_consistentA single eighth note sounds before the first barline and leads into the downbeat where the phrase begins.
RuleContract
phrase_periodicity_4_or_8_barConsecutive declared phrase starts are exactly 4 or 8 bars apart — the dance-derived regularity underneath most Baroque movements.
anacrusis_consistentIf the piece declares an upbeat (anacrusis), every upbeat fragment begins exactly that distance before a phrase start; if not declared, no stray upbeat material exists.

Texture and instrument contracts

The trio sonata's independence contract is the one texture rule whose target can be drawn on staves. The violation itself is a property of whole sections, but this — three voices on three rhythmic grids — is the texture the engine scores toward:

Trio sonataThree voices, three rhythms
The trio sonata has exactly one job: three lines that stay audibly independent. The engine scores every voice pair on rhythmic offset and contrary/oblique motion at note boundaries and fails the piece if any pair drops below the threshold. This is the target texture: the melody sustains while the middle voice walks, and the bass moves in slow halves against both.
voice_independence_thresholdEach voice moves on its own rhythmic grid; where they meet, the motion is contrary or oblique.

The organ trio sonatas are this rule pursued for six works straight. Three bars in, the first of them already shows the full texture:

From BachBach: Trio Sonata No. 1 — three voices, three grids
Bar 3 of the E♭ major organ trio sonata (BWV 525): one manual takes the theme while the other spins the continuous sixteenth line, and the pedal walks underneath. Three voices, three rhythmic grids — at almost every note boundary the other voices are either holding or moving the other way. This is the texture voice_independence_threshold scores toward: every voice pair measured on rhythmic offset and contrary/oblique motion, failing the piece if any pair drops below the threshold. (The theme's last G is tied on into the next bar; the excerpt clips it at the barline.)
voice_independence_thresholdTheme in eighths and quarters, an unbroken sixteenth counterline, a walking eighth-note pedal — no voice shadows another.
RuleFormContract
pedal_range_soft_penaltyorgan formsPedal notes stay inside the physically playable compass (hard bounds MIDI 12–62; the comfortable C1–D3 target is preferred at scoring time).
voice_independence_thresholdtrio sonataThe two manual voices plus pedal stay pairwise independent (score ≥ 0.6), measured by rhythmic offset and contrary/oblique motion at note boundaries. A trio sonata whose voices shadow each other has failed at its one job.
section_contrast_requiredfantasiaAdjacent sections differ audibly in density (≥2 notes/bar) or register (≥5 semitones mean pitch) — the fantasia's defining drama of contrasts.
toccata_archetype_compatibletoccataThe selected sectional archetype fits the declared character (the noble character is rejected for toccata forms at config time; incompatible archetype pairings fail here).

The remaining structural rules have no single staff moment to point at — the violation is a property of whole sections — so they are documented as tables rather than examples. When one fires, inspect the section layout in the event JSON rather than individual notes.

How the validator sees this chapter

RuleFailKind
ground_bass_immutable, passacaglia_ground_immutable, cantus_firmus_immutableStructuralFail
variation_role_ornament_constraint, figuration_harmonic_consistency, toccata_archetype_compatibleMusicalFail
implicit_voice_counterpoint, arpeggio_no_parallel_perfectMusicalFail
phrase_periodicity_4_or_8_bar, anacrusis_consistentMusicalFail
pedal_range_soft_penalty, voice_independence_threshold, section_contrast_requiredMusicalFail

This concludes the course. For the flat rule index, see the Validator Rule Reference; for how these rules interact with the generation pipeline, see Generation Pipeline.

Dual-licensed: AGPL-3.0 · commercial licensing available. Generated MIDI is yours to use freely.