Babbitt’s Combinatorial Arrays — User Guide
A serial-array synthesizer after the opening of Milton Babbitt’s Semi-Simple Variations (1956): combinatorial hexachords, exhaustive time-point partitions, associative trichords, secondary sets, trichord-derived arrays, structural timbre, visualization, and MusicXML output.
What this does
Babbitt’s Combinatorial Arrays is a synthesis and compositional-generation tool built around a serial architecture modeled on the opening of Milton Babbitt’s Semi-Simple Variations. Pitch organization, rhythmic attacks, rearticulation, associative harmony, synthesis, and optional score output are handled as connected but separable layers. The opening model can be used directly, or the same structural principles can generate new arrays and new realizations.
Key Features:
- Four-line serial arrays — P, R, and an inversional or transpositional combinatorial partner.
- Three hexachord sources — the opening hexachord, a Type-A generator, or any compatible combinatorial hexachord.
- Exhaustive time-point rhythm — all 16 four-bit partitions occur once, yielding 32 attacks per cycle.
- Controlled rearticulation — 24 array entries plus 8 repeated attacks per cycle.
- Associative trichords — surface repetition can target 015/012, 025/014, the segmental trichords of P, or the current derived generator.
- Secondary sets — a second cycle extends each line into a 12-tone secondary set.
- Trichord derivation — later cycles may be generated from the contiguous trichords of P.
- Structural timbre — pitch-class structure can be mapped into spectral partial slots.
- Integrated visualization and QC — array score, partition strip, derived-set tables, trichord statistics, spectral rows, and structural checks.
- MusicXML output — the realized event stream can be retained as a Praat Strings object and optionally written as a four-part score.
Quick start
- In Praat, run
Babbitt_s_Combinatorial_Arrays.praat. - Choose a Preset. For a first run, use Opening Model (Semi-Simple Variations).
- Set Tempo_bpm and Register_centre_MIDI.
- Leave Edit_details off for preset defaults, or enable it to expose the full serial, rhythmic, synthesis, and export controls.
- Enable Draw_visualization to see the array, partitions, derived structures, and QC.
- Enable Play_result to audition the synthesized result.
- Leave Keep_MusicXML_Strings on to retain the score as a Praat Strings object.
- Click OK. The script creates a Sound named from the selected preset and, if requested, a MusicXML Strings object.
Serial architecture
Opening array
🎼 Four-line combinatorial array
The ordered P hexachord uses adjacent interval classes 4, 5, 3, 1, 2, exhausting ICs 1–5 exactly once. Its four contiguous segmental trichords are 015, 025, 014, 012.
Hexachord sources
| Source | Behavior |
|---|---|
| Opening | Uses 10 6 11 8 7 9, the opening hexachord encoded by the script. |
| Type-A generator | Uses chromatic Type-A content and enumerates orderings whose five adjacent interval classes exhaust ICs 1–5 once each. The script records 24 orderings per transposition level. |
| Any combinatorial | Generates a six-pitch-class hexachord whose complement is available through an inversional or transpositional partner compatible with the selected array operation. |
Time-point engine
⏱ Exhaustive 4-bit partition rhythm
Each quarter note contains four sixteenth-note time points. A partition code from 0–15 determines which of those four positions attack. The opening ordering is:
Because all 16 binary partitions occur exactly once, the total number of attacks is fixed at 32 per cycle.
Rearticulation
The four-line array supplies 24 new entries per cycle, while the time-point engine supplies 32 attacks. The remaining eight attacks become rearticulations.
| Mode | Rule |
|---|---|
| Strict | Uses fixed slots 4/8/12/16 of each aggregate and repeats the previous attack. |
| Grouped | Prefers quarter-note onsets and repeats the preceding attack. |
| Associative | Chooses a previously available pitch class so that three consecutive surface attacks favor the selected trichord class. |
Secondary sets
🔁 Opening array → secondary cycle
When Secondary sets cycle is enabled, a second cycle transforms each line by the combinatorial operation applied to its retrograde. For Type-A content this uses the tritone relation. Each line in cycle 1 followed by its corresponding line in cycle 2 forms a 12-tone secondary set.
Trichord derivation
Derived-set construction
For each eligible segmental trichord g of P, the script searches for three further transposition/inversion forms of the same trichord that are mutually disjoint and, together with g, complete the aggregate. The first derived cycle is hybrid: its first aggregate comes from the preceding array and its second is derived. Later derived cycles use derived material in both aggregates.
Structural timbre
🔊 Serial structure mapped to the spectrum
Structural timbre retains partial 1 as an anchor and assigns pitch class x to partial slot x+2 (partials 2–13). In each cycle and voice, the six pitch classes of the current line determine which slots are emphasized.
The mapping transfers the serial transformations symbolically to spectral slots: transposition rotates emphasized slots, inversion reflects them, retrograde reverses the order of emphasis, and a combinatorial partner activates complementary slots.
Presets
1. Opening Model
Purpose: basic realization of the analyzed opening mechanism. Uses the opening hexachord, opening array, original partition ordering, grouped rearticulation, and additive timbre.
2. Type-A Generator
Purpose: generate a new ordered Type-A hexachord that retains the IC 1–5 exhaustion property. Uses shuffled entry order and a new exhaustive rhythmic ordering.
3. Rhythmic Transformations
Purpose: retain the opening pitch organization while applying the retrograde binary-complement rhythmic option.
4. Associative Trichords
Purpose: foreground the segmental trichord classes through associative rearticulation, bright timbre, and trichord halos.
5. Secondary Sets
Purpose: append the secondary-set cycle so that each voice extends into a 12-tone secondary set.
6. Trichord Derivation
Purpose: move from opening array to secondary cycle and then through four derived cycles. Uses associative rearticulation, targets the current generator, and enables trichord halos.
7. Serial Synthesizer
Purpose: use the same multi-cycle plan as Trichord Derivation while also deriving the spectral organization from the current serial line.
8. Free Serial Field
Purpose: the most open generative mode: any combinatorial hexachord, random valid array operation, shuffled entry order, new exhaustive rhythm, associative rearticulation, bright/percussive synthesis behavior, and halos.
Parameters & controls
Main form
| Parameter | Default | Description |
|---|---|---|
| Preset | Opening Model | Selects one of the eight built-in configurations. |
| Tempo_bpm | 60 | Quarter-note tempo. Accepted range: 20–300 BPM. |
| Register_centre_MIDI | 60 | Global register center around which the four voice bands are placed. |
| Edit_details | off | Opens the advanced serial, rhythmic, synthesis, and export controls. |
| Draw_visualization | on | Draws the structural visualization and QC panel. |
| Play_result | on | Plays the resulting Sound after synthesis. |
| Keep_MusicXML_Strings | on | Retains the generated MusicXML as a Praat Strings object without requiring disk writing. |
Details dialog
| Control | Options / Range | Description |
|---|---|---|
| Hexachord source | Opening / Type-A / Any combinatorial | Selects the source and constraints for P. |
| Basic set transposition | integer, mod 12 | Transposes the chosen P content before array construction. |
| Array operation | P RI R I / P I R RI / P Tk R RTk / P RTk R Tk / Random | Selects how P combines with its inversional or transpositional partner. |
| Entry order | Round robin / Shuffled | Controls assignment of new entries among S/A/T/B while preserving each line’s internal order. |
| Secondary sets cycle | on/off | Adds the secondary array cycle after the opening/basic array. |
| Derivation cycles | 0–7 | Number of additional trichord-derived cycles. |
| Rhythm | Original / Retrograde / Binary complement / Retrograde binary complement / New ordering | Selects the 16-partition ordering or transform. |
| Rearticulation | Strict / Grouped / Associative | Controls placement and pitch choice for the eight repeated attacks per cycle. |
| Associative target | 015+012 / 025+014 / Segmental P / Current generator | Target trichord class or family for associative repetition. |
| Timbre | Pure / Additive / Bright / Percussive / Structural | Selects the synthesis spectrum. Structural derives spectral slots from the serial line. |
| Trichord halo | on/off | Adds a soft chord when a line completes an aggregate trichord. |
| Register spread (st) | 0–18 | Distance between voice-band centers in semitones; constrained to keep the realized range within MIDI 21–108. |
| Decay scale | > 0 | Global multiplier for synthesis decay time. |
| Sample rate (Hz) | 44100 | Output sample rate; minimum accepted value is 8000 Hz. |
| Output peak | 0.95 | Peak normalization target in the range (0,1]. |
| Random seed | 0 | 0 = unpredictable; positive integer = reproducible random choices. |
| Write MusicXML file | off | Opens a save-file dialog for a MusicXML file. Praat 7.0 requests write permission before file creation. |
MusicXML output
🎼 One realization, two MusicXML sinks
The MusicXML writer uses the same realized event stream that drives the synthesis. A shared line buffer feeds both outputs, so the in-memory and written versions cannot diverge.
- Keep MusicXML Strings: creates
musicxml_babbitt_arrays_<preset>, one score line per string, entirely in memory. - Write MusicXML file: optionally writes
babbitt_arrays_<preset>.musicxmlthrough a save-file dialog.
The score is written as four monophonic parts — Soprano, Alto, Tenor, Bass — in 4/4 with divisions=4, so one MusicXML division equals one sixteenth-note time point.
| Feature | MusicXML behavior |
|---|---|
| Pitch/register | Uses the realized MIDI pitch of each synthesized attack. |
| Durations | Uses the same sounding duration as the synthesis realization. |
| Gaps | Written as rests. |
| Barline crossings | Split into legal note values and tied across the barline. |
| Irregular spans | Decomposed into available note values and tied as necessary. |
| Rearticulations | Marked with parenthesized noteheads. |
| Cycle boundaries | Carry a text label identifying the cycle kind and line form. |
| Tempo | Written in the first measure of the soprano part. |
| Clefs | Chosen from the voice register center. |
| Trichord halos / Structural Timbre | Sound-only layers; they are not notated in MusicXML. |
Visualization
When Draw_visualization is enabled, the script draws a process-faithful structural view rather than a generic waveform display.
Voice lanes, realized register, sounding durations, new entries, rearticulations, aggregate boundaries, and optional trichord halos.
The 16 partition codes and their four-bit attack/rest patterns on the same time axis.
Shows current line forms, aggregate content, secondary arrays, and derived-set source labels.
Histogram of three-consecutive-attack trichord classes, with selected targets highlighted.
When Structural timbre is active, shows the serially derived spectral rows for each cycle and voice.
Reports combinatoriality, interval-class exhaustion, aggregate completion, partition exhaustion, secondary-set completion, derived-set status, synthesis limits, and MusicXML status.
Complete workflow
🔄 Processing Pipeline
- Preset initialization: load the preset’s serial, rhythmic, timbral, and export defaults.
- Hexachord construction: use the opening P, generate a Type-A ordering, or search for any compatible combinatorial hexachord.
- Combinatorial partner search: find valid inversional and/or transpositional complements.
- Basic array: construct the four P/R/Y/RY lines and verify trichordal aggregate completion.
- Secondary array: if enabled, build a second cycle whose corresponding lines complete 12-tone secondary sets.
- Derived cycles: if requested, construct hybrid and fully derived aggregates from segmental trichords.
- Time-point engine: apply the selected exhaustive ordering or transformation of the 16 binary partitions.
- Rearticulation: distribute 24 new entries and resolve the 8 repeated attacks in every cycle.
- Register and duration: assign each event to its voice band and determine its sounding span.
- Synthesis: render pure/additive/bright/percussive or structural spectra with attack/decay/release envelopes.
- Normalization & QC: scale the result to the requested peak and measure structural/synthesis status.
- MusicXML: optionally build the four-part notation from the same realized event stream.
- Visualization: draw the serial/rhythmic/derived/timbral state if enabled.
- Playback: play the completed Sound if enabled.
Outputs
| Output | Description |
|---|---|
| Sound | Synthesized realization named from the selected preset and normalized to Output_peak. |
| Picture window | Structural visualization and QC when drawing is enabled. |
| Info window | Detailed array, aggregate, partition, attack, synthesis, and MusicXML diagnostics. |
| Strings | Optional in-memory MusicXML score, on by default. |
| .musicxml file | Optional disk output selected from the Details dialog. |
Troubleshooting
Cause: the generated hexachord does not support the requested partner family within the search limit.
Solution: use the Type-A source, change Array operation, or choose Random valid operation.
Cause: Register centre and Register spread place one or more bands outside MIDI 21–108.
Solution: move the register center toward the middle or reduce the spread.
Cause: no segmental trichord of the chosen P can partition the aggregate under the script’s T/I search rule.
Solution: choose another hexachord or reduce/disable derivation cycles.
Cause: the file picker was cancelled or Praat 7.0 write permission was refused.
Solution: keep Keep_MusicXML_Strings enabled and save the resulting Strings object later, or rerun with write permission.
Scope & interpretation
- Opening Model preserves the encoded pitch array, 16-partition order, and 32-attack count, but its voice scheduling and rearticulation placement are model rules rather than a score transcription.
- Binary complement is the script’s attack/rest complement of the four-bit partition representation; it is not Babbitt’s modular time-point inversion.
- Trichord derivation uses one segmental trichord at a time. The script explicitly distinguishes this from the paired-trichord description of later variations.
- Secondary Sets follows the encoded Variation-1 idea of retrograde plus combinatorial transformation, but does not reproduce the original variation’s rhythm or register.
- Structural Timbre is an original extension of the script, not a historical Babbitt technique.