Skip to content

7. Form-Specific Constraints ​

The previous chapters apply to every generated piece. This chapter covers contracts that arise from what kind of piece is being built. Historically, passacaglia and chaconne labels can describe an ostinato scheme realized through varied voicings; this engine chooses stricter carrier contracts. A chorale prelude keeps its cantus-firmus skeleton, and a cello prelude uses one instrumental line to imply coherent multi-voice counterpoint. The engine encodes each promise as material carriers plus a validating rule.

Immutable material: the ground ​

Engine carrierEngine ground carrier preserves bar-head skeleton
Passacaglia and chaconne traditions can use recurring bass or harmonic frameworks whose voicing and surface realization change. This engine compares the replayed ground with its canonical material at cycle-relative bar heads; off-downbeat pitches and rhythmic subdivision can vary, so the rule is not byte-exact replay of every event. The default form builder still emits its carrier as immutable material, and a changed bar-head pitch fails the structural rule. Variation happens above this engine carrier.
ground_bass_immutablepassacaglia_ground_immutableThe engine compares the canonical ground's pitch skeleton at each bar head while the upper voice varies.

Passacaglia and chaconne are historically related ostinato forms: a bass scheme may be transferred, voiced, varied, or ornamented in actual repertoire. This engine deliberately tightens that idea into a carrier contract. ground_bass_immutable (the solo-string form inspired by the BWV 1004 Chaconne) and passacaglia_ground_immutable (the organ form inspired by BWV 582) compare the replayed ground's bar-head pitch skeleton with the canonical material at the same cycle-relative positions. Off-downbeat pitches are not part of this skeleton, and rhythmic subdivision can be admitted; this is not byte-exact replay of every sounding event. The comparison uses provenance bits, the origin tags carried beside each note. The provenance.v1 sidecar serializes them as source: "Material" | "Compose" | "Ornament"; generated.v1 note records omit provenance/source, while observations and other validation metadata are exported separately. These violations are StructuralFails because they break the engine's declared carrier identity.

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 "inspired by" a BWV number, the engine's form template borrows selected proportions or surface material; it does not claim to reproduce the work's historical instrumentation or every sounding event.

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 Goldberg Variations preserve the Aria's underlying bass and harmonic scheme, while their written bass events can vary in pitch placement and duration. The engine represents that distinction with a dedicated goldberg_aria_bass_immutable declaration for each non-coda variation block. Switch the excerpt above the score to hear two variations walk the same scheme:

From BachBach: Goldberg Variations — the Aria's bass schemevoices play in turn
over the same declared carrier —
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. The variations preserve this bass and harmonic scheme rather than the ornamented melody, while their sounding bass notes and durations can change. This display is a schematic reduction of Bach's bass and harmonic scheme, not a byte-exact replay of the engine carrier. The dedicated goldberg_aria_bass_immutable rule checks each declared carrier onset, duration, and pitch exactly in every non-coda variation block. Bar 8's mordent is shown plain. Switch to a variation above to hear a different surface over the same scheme. The demo's Goldberg preset uses the same distinction.
goldberg_aria_bass_immutableStrip the passing notes from the Aria's bass and one scheme tone per bar remains — a compact reduction of the harmonic plan underlying the variations.

The Bach excerpt below shows a return to the passacaglia bass after a variation cycle; it illustrates scheme-level continuity alongside the engine's stricter bar-head carrier check.

From BachBach: Passacaglia in C minor (BWV 582) — the pedal returnsvoices play in turn
Bach’s organ Passacaglia in C minor (BWV 582) begins with a quarter-note pickup. The upper staff shows the first four full bars of the pedal after that pickup (corpus beats 1–13); the lower staff shows the corresponding four bars at the first return (beats 25–37). Both excerpts contain the same eight attacks in 3/4. The pickup and the final four bars of the eight-bar ground are omitted. The staves are aligned for comparison and play sequentially, not as simultaneous parts. An exact corpus search finds the full 24-beat ground at beats 0, 24, 48, 72, and 96; later variations can move or decorate it.
passacaglia_ground_immutableThe pedal repeats the same pitches and durations in the opening and at the first return.

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 — bar-head pitches are fixed, while eligible within-bar notes may be embellished. The ornament pass therefore keeps cantus bar heads plain; under the Severe character the whole cantus line stays plain, while other characters can decorate eligible within-bar tones.

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 cantus firmus sits on top in long values; this excerpt includes a dotted eighth and a sixteenth at the end of the bar. The engine's cantus_firmus_immutable contract fixes the cantus bar heads; eligible within-bar notes can receive decoration under other characters, while Severe keeps the full cantus plain. Beneath it an inner voice embroiders in sixteenths, and the pedal follows the actual displayed line F–F–F–F–F–E–F–F. (The pedal's first two notes sound an octave lower in the source recording — kept as recorded.)
cantus_firmus_immutablefiguration_harmonic_consistencyThree voices, three layers: a long-note hymn tune, an embroidering inner line, and a moving pedal line.

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 tone of that bar's chord, including a declared seventh. Off-downbeat notes are unconstrained — that freedom is what makes it figuration and not chorale writing. Pedal notes are exempt, as are FigurationAnchorRelaxed notes when the builder has proved that no playable chord tone satisfied the full set of constraints.

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 can sound a four-note chord, but it cannot sustain four independent lines at once; Bach's solo writing nevertheless 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 used for scored Compose notes.
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 3 through 8 whole bars apart. The stable rule ID keeps its older, narrower name, but every integer bar gap in that inclusive range passes.
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.

A declared doubling is checked before any exemption is applied. It must name two distinct voices and a valid, nonempty half-open [start_tick, end_tick) window containing at least one lead note. Inside that window, the doubled voice must have the same note count, onsets, and durations as the lead voice, with every pitch offset by the declared semitones. A mismatch emits declared_doubling_integrity as a StructuralFail. A verified window treats only two-voice vertical findings inside it as one line; linear checks and vertical findings outside the window still apply.

How the validator sees this chapter ​

RuleFailKind
declared_doubling_integrityStructuralFail
ground_bass_immutable, passacaglia_ground_immutable, goldberg_aria_bass_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.