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.

Author: Shai Cohen Affiliation: Department of Music, Bar-Ilan University, Israel Version: 0.3.1 (2026) License: MIT License Repo: https://github.com/ShaiCohen-ops/Praat-plugin_AudioTools
Contents:

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:

Design principle: the script does not merely play a fixed serial passage. It treats serial organization as a generative system: pitch, rhythm, repetition, derived-set construction, timbre, and notation all originate from the same realized event stream.

Quick start

  1. In Praat, run Babbitt_s_Combinatorial_Arrays.praat.
  2. Choose a Preset. For a first run, use Opening Model (Semi-Simple Variations).
  3. Set Tempo_bpm and Register_centre_MIDI.
  4. Leave Edit_details off for preset defaults, or enable it to expose the full serial, rhythmic, synthesis, and export controls.
  5. Enable Draw_visualization to see the array, partitions, derived structures, and QC.
  6. Enable Play_result to audition the synthesized result.
  7. Leave Keep_MusicXML_Strings on to retain the score as a Praat Strings object.
  8. Click OK. The script creates a Sound named from the selected preset and, if requested, a MusicXML Strings object.
Quick tip: use Opening Model to understand the basic mechanism, Secondary Sets to hear the extension into 12-tone line forms, and Serial Synthesizer to hear the same serial logic projected into the spectrum.
Important: Opening Model is a model of the analyzed opening, not a score transcription. The pitch array, the 16-partition order, and the 32-attack count follow the analysis encoded in the script; voice assignment and the locations of the eight rearticulations are model rules.

Serial architecture

Opening array

🎼 Four-line combinatorial array

S = P 10 6 11 8 7 9 A = RI 2 4 3 0 5 1 T = R 9 7 8 11 6 10 B = I 1 5 0 3 4 2 (I = I11)

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

SourceBehavior
OpeningUses 10 6 11 8 7 9, the opening hexachord encoded by the script.
Type-A generatorUses 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 combinatorialGenerates 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:

Z 5 4 X 3 T 9 Y | 7 1 E 6 2 8 W 0 T=10, E=11, W=12, X=13, Y=14, Z=15

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.

ModeRule
StrictUses fixed slots 4/8/12/16 of each aggregate and repeats the previous attack.
GroupedPrefers quarter-note onsets and repeats the preceding attack.
AssociativeChooses 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.

Opening S: 10 6 11 8 7 9 | 3 1 2 5 0 4 Secondary forms identified by the script: RT6, I5, T6, RI5

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.

slot(pc) = pc + 2 weight(n) = 0.55 × (7 − n) / 6 spectral tilt = h^−0.6 upper-partial decay rate = (1 + 0.12 × (h−1)) / τ

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

ParameterDefaultDescription
PresetOpening ModelSelects one of the eight built-in configurations.
Tempo_bpm60Quarter-note tempo. Accepted range: 20–300 BPM.
Register_centre_MIDI60Global register center around which the four voice bands are placed.
Edit_detailsoffOpens the advanced serial, rhythmic, synthesis, and export controls.
Draw_visualizationonDraws the structural visualization and QC panel.
Play_resultonPlays the resulting Sound after synthesis.
Keep_MusicXML_StringsonRetains the generated MusicXML as a Praat Strings object without requiring disk writing.

Details dialog

ControlOptions / RangeDescription
Hexachord sourceOpening / Type-A / Any combinatorialSelects the source and constraints for P.
Basic set transpositioninteger, mod 12Transposes the chosen P content before array construction.
Array operationP RI R I / P I R RI / P Tk R RTk / P RTk R Tk / RandomSelects how P combines with its inversional or transpositional partner.
Entry orderRound robin / ShuffledControls assignment of new entries among S/A/T/B while preserving each line’s internal order.
Secondary sets cycleon/offAdds the secondary array cycle after the opening/basic array.
Derivation cycles0–7Number of additional trichord-derived cycles.
RhythmOriginal / Retrograde / Binary complement / Retrograde binary complement / New orderingSelects the 16-partition ordering or transform.
RearticulationStrict / Grouped / AssociativeControls placement and pitch choice for the eight repeated attacks per cycle.
Associative target015+012 / 025+014 / Segmental P / Current generatorTarget trichord class or family for associative repetition.
TimbrePure / Additive / Bright / Percussive / StructuralSelects the synthesis spectrum. Structural derives spectral slots from the serial line.
Trichord haloon/offAdds a soft chord when a line completes an aggregate trichord.
Register spread (st)0–18Distance between voice-band centers in semitones; constrained to keep the realized range within MIDI 21–108.
Decay scale> 0Global multiplier for synthesis decay time.
Sample rate (Hz)44100Output sample rate; minimum accepted value is 8000 Hz.
Output peak0.95Peak normalization target in the range (0,1].
Random seed00 = unpredictable; positive integer = reproducible random choices.
Write MusicXML fileoffOpens 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>.musicxml through 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.

FeatureMusicXML behavior
Pitch/registerUses the realized MIDI pitch of each synthesized attack.
DurationsUses the same sounding duration as the synthesis realization.
GapsWritten as rests.
Barline crossingsSplit into legal note values and tied across the barline.
Irregular spansDecomposed into available note values and tied as necessary.
RearticulationsMarked with parenthesized noteheads.
Cycle boundariesCarry a text label identifying the cycle kind and line form.
TempoWritten in the first measure of the soprano part.
ClefsChosen from the voice register center.
Trichord halos / Structural TimbreSound-only layers; they are not notated in MusicXML.
Praat workflow: the Strings output is designed to avoid temporary files and write-permission requirements. It can be saved later from Praat using Save as raw text file… if a physical MusicXML file is needed.

Visualization

When Draw_visualization is enabled, the script draws a process-faithful structural view rather than a generic waveform display.

A — Four-voice array score
Voice lanes, realized register, sounding durations, new entries, rearticulations, aggregate boundaries, and optional trichord halos.
B — Time-point partitions
The 16 partition codes and their four-bit attack/rest patterns on the same time axis.
C — Array / aggregate table
Shows current line forms, aggregate content, secondary arrays, and derived-set source labels.
D — Surface trichords
Histogram of three-consecutive-attack trichord classes, with selected targets highlighted.
E — Structural spectra
When Structural timbre is active, shows the serially derived spectral rows for each cycle and voice.
QC — Structural checks
Reports combinatoriality, interval-class exhaustion, aggregate completion, partition exhaustion, secondary-set completion, derived-set status, synthesis limits, and MusicXML status.

Complete workflow

🔄 Processing Pipeline

  1. Preset initialization: load the preset’s serial, rhythmic, timbral, and export defaults.
  2. Hexachord construction: use the opening P, generate a Type-A ordering, or search for any compatible combinatorial hexachord.
  3. Combinatorial partner search: find valid inversional and/or transpositional complements.
  4. Basic array: construct the four P/R/Y/RY lines and verify trichordal aggregate completion.
  5. Secondary array: if enabled, build a second cycle whose corresponding lines complete 12-tone secondary sets.
  6. Derived cycles: if requested, construct hybrid and fully derived aggregates from segmental trichords.
  7. Time-point engine: apply the selected exhaustive ordering or transformation of the 16 binary partitions.
  8. Rearticulation: distribute 24 new entries and resolve the 8 repeated attacks in every cycle.
  9. Register and duration: assign each event to its voice band and determine its sounding span.
  10. Synthesis: render pure/additive/bright/percussive or structural spectra with attack/decay/release envelopes.
  11. Normalization & QC: scale the result to the requested peak and measure structural/synthesis status.
  12. MusicXML: optionally build the four-part notation from the same realized event stream.
  13. Visualization: draw the serial/rhythmic/derived/timbral state if enabled.
  14. Playback: play the completed Sound if enabled.

Outputs

OutputDescription
SoundSynthesized realization named from the selected preset and normalized to Output_peak.
Picture windowStructural visualization and QC when drawing is enabled.
Info windowDetailed array, aggregate, partition, attack, synthesis, and MusicXML diagnostics.
StringsOptional in-memory MusicXML score, on by default.
.musicxml fileOptional disk output selected from the Details dialog.

Troubleshooting

Problem: “No combinatorial hexachord found”
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.
Problem: “Voice bands leave the piano range”
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.
Problem: Trichord derivation is unavailable
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.
Problem: MusicXML file is not written
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

Historical/analytical scope:
  • 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.
Recommended reading of the tool: treat the historical analysis as a set of compositional constraints and transformation principles. The script then exposes those principles as an experimental synthesis environment in which users can preserve, vary, or generalize the structure.