Skip to content

Polymeter & Euclidean Rhythm

Two parts of mini-notation generate rhythm rather than spell it out note by note. This page explains how each one arrives at its onsets. Polymetric patterns let groups of different lengths cycle at different rates, phasing against each other like Steve Reich loops. Euclidean rhythms distribute hits as evenly as possible across steps, producing many of the world’s classic rhythmic cells from two numbers.

Curly braces {...} give each element one step. Without a subdivision modifier, one step equals one full cycle:

let slow = {C4 D4 E4}; // One note per cycle — spans 3 cycles
let fast = [C4 D4 E4]; // All three notes in one cycle

%N packs N steps into each cycle. A group of L elements then runs at N/L times the speed of one pass per cycle: {C4 D4 E4}%3 is the same as [C4 D4 E4], and {C4 D4 E4}%6 plays it twice a cycle.

When N and L don’t divide evenly, the content wraps — and this is where it gets musical. {C4 D4}%3 has factor 3/2: three onsets per cycle at 0, 1/3, 2/3, but only two notes of content. Cycle 0 plays C4 D4 C4; cycle 1 picks up where it left off with D4 C4 D4. The content shifts by one position each cycle, phasing against the meter until it realigns after L cycles.

Comma-separated groups inside {...} are the heart of polymetric writing. All groups land on the same onset grid, but each group’s content cycles at its own rate:

let poly = {C4 E4 G4, F4 A4};

Without an explicit %N, N defaults to the first group’s length — here 3. Each group is sped up by its own N/L factor so every voice produces exactly N onsets per cycle:

time 0 1/3 2/3 │ 1 4/3 5/3
voice 1 C4 E4 G4 │ C4 E4 G4
voice 2 F4 A4 F4 │ A4 F4 A4

Voice 1 repeats identically every cycle. Voice 2’s two-note content takes only 2/3 of a cycle per pass, so it drifts one position per cycle and realigns with voice 1 every 2 cycles. That slow churn of two loops sliding past each other is the polymetric sound.

An explicit %N sets the grid density for all groups at once:

let dense = {C4 D4 E4, F4 G4}%6; // 6 onsets/cycle; factors 2 and 3

Both layer voices, but they divide time differently. In a parallel group [a b c, d e], each voice divides the cycle by its own length: three onsets against two, a rhythmic cross within every cycle. In a polymetric group {a b c, d e}, both voices share one grid of three onsets, and what differs is the content: the two-note voice runs out early and wraps, so the voices line up differently from one cycle to the next. Parallel groups cross rhythms; polymetric groups phase melodies.

Give the euclidean algorithm a number of hits and a number of steps, and it spaces the hits as evenly as possible. Three hits over eight steps:

x . . x . . x .

That’s the Cuban tresillo — the 3+3+2 cell underneath son, reggaeton, EDM, and half of pop music. Many traditional cells fall out of this one algorithm; the cinquillo, for one, is five hits over eight steps.

Written inline as bd(3,8), an element sounds on the hit positions and rests on the others, all inside its own slot — so a euclidean element is still one element of its sequence.

A third parameter rotates the hit pattern, wrapping around: the same spacing, starting from a different point in it. Because a rotation keeps the spacing and moves only the downbeat, rotations of one cell played together interlock: each fills gaps the others leave.

The rhythm and its content are separate. euclid() takes a whole pattern as the source and deals its events onto the hits in order, so the same rhythm can carry a melody — and the order in which a rhythm and a speed change are applied decides which of the two gets faster.