home/ modules/ mini-notation-rhythm-construction

Mini-notation rhythm construction

  • learner can build rhythms with subdivision, multiplication, rest, replicate and elongate operators
  • learner can express polyrhythm and polymetre with bracket syntax
  • learner can generate Euclidean rhythms from (k,n) notation

From a blank Tidal/Strudel buffer, construct a polymetric drum pattern that combines nested subdivisions, replication, an elongated accent, and a Euclidean (k,n) hi-hat, then explain how cycle-orientation makes the cross-rhythm emerge.

This module builds the core motor skill of algorave drum programming: typing a full, groove-worthy drum pattern into a blank Tidal or Strudel buffer using mini-notation alone. On stage, the mini-notation string is your drum machine — there is no piano roll to fall back on, so tresillo hats, uneven accents, and drifting polymetres all have to flow from a handful of operators you can type without thinking, mid-set, while the previous pattern is still playing.

The arc starts supported: with a working groove from the prerequisite modules on screen, the learner edits single steps — subdividing one slot with square brackets (“square brackets subdivide one step into a nested sub-sequence”), adding a roll with the asterisk multiplier, punching a hole with the tilde rest. Next come the two operators beginners conflate with those: replicate (”! replicates a step n times at equal duration”) and elongate (”@ elongates a step proportionally”), drilled until the *, !, @ distinction is automatic. The learner then layers with commas, contrasts square-bracket polyrhythm against curly-bracket polymetre, and drops in a Euclidean hi-hat via the (k,n) parenthesis notation. The capstone strips the scaffolding away: a blank buffer, one polymetric pattern combining all of it, plus a spoken explanation of why the cross-rhythm emerges — which is gated by the cycle-as-time-unit and cycle-not-beat atoms, since the explanation only works if you understand that everything is rescaled into one shared cycle.

Supporting atoms enrich rather than gate: the / stretch operator, angle-bracket alternation, the euclid function form, Strudel’s polymeter variants, and the Bol Processor lineage that explains where this notation’s cyclic worldview comes from.

Walkthrough

Mini-notation is your drum machine on stage — no piano roll, just operators you type without thinking. At strudel.cc (Ctrl-Enter play, Ctrl-. stop) we drill each operator, then combine them. Everything sits in one cycle: more tokens = faster, not longer ([[tidal-cycle-as-time-unit]]). Each step is a complete, playable program.

1 — subdivide with [ ]. A bracket group packs several hits into one step’s time. Here beat 2 holds two snares and beat 4 holds three — the grid bends without changing the bar ([[mini-notation-sub-sequence]]).

sound("bd [sd sd] bd [sd sd sd]").bank("RolandTR909")

2 — multiply * and rest ~. *n repeats a step n times in its own slot (a roll); ~ is silence. hh*4 is a sixteenth-note roll on beat-4’s slot, ~ punches a hole ([[mini-notation-multiply]], [[mini-notation-rest]]).

sound("bd ~ sd hh*4").bank("RolandTR909")

3 — replicate ! vs elongate @ (the operators beginners conflate). !n makes n separate steps (each a full slot); @n holds one step across n slots. So bd!3 is three even kicks, sd@3 is one snare stretched over three — versus * which crams repeats into a single slot. Hear the difference ([[mini-notation-replicate]], [[mini-notation-elongate]]).

sound("bd!3 sd@3 hh").bank("RolandTR909")

4 — layer in parallel with , (polyrhythm). A comma inside one string stacks voices that share the cycle — three different subdivisions at once, a cross-rhythm from one line ([[tidal-polyrhythm-comma-syntax]]).

sound("bd*4, ~ sd ~ sd, hh*8").bank("RolandTR909")

5 — polymetre with { }%n. Curly braces align by step, not by cycle: {cp cp cp}%8 lays 3 claps onto an 8-step grid, so the phrase drifts against the 4/4 and slowly rotates — cheap evolution from one token group ([[tidal-polyrhythm-polymetre]]).

sound("bd*4, {cp cp cp}%8").bank("RolandTR909")

6 — a Euclidean hat and the whole polymetric groove (the capstone). Add (k,n) — k hits spread evenly over n steps — and combine every operator: replicated/subdivided kick, an elongated snare accent, a Euclidean hat, and a polymetric clap. It’s dense on the page but each voice is one idiom, and the cross-rhythm emerges because all of them are rescaled into the same cycle ([[tidal-euclidean-notation]], [[tidal-cycle-not-beat-orientation]]):

$: sound("bd!2 ~ [bd bd] ~").bank("RolandTR909")
$: sound("~ sd@2 ~").bank("RolandTR909")
$: sound("hh(5,8)").bank("RolandTR909").gain(0.5)
$: sound("{cp cp cp}%8").bank("RolandTR909").gain(0.4)

What good sounds like. A groove that drifts but stays legible — the kick-and-snare backbone holds while the Euclidean hats and polymetric clap rotate against it, so it sounds like it’s evolving without you editing. If it turns to mush, the polymetre or Euclid layer is too loud (drop its .gain) or too busy; the ear needs the plain backbone to hear the cross-rhythm against. The skill is typing these operators mid-set without looking. (Skill map: live-coder Domain B1 / A2 — mini-notation fluency.)

Now make it yours. Change the Euclid to hh(7,16) for busier hats. Push the clap polymetre to %6 and feel the drift speed up. Swap ! for * on the kick and hear replication become a roll. Add a fifth voice: sound("~ oh") for an offbeat open hat.

Runnable examples

Generated from the context/ instrument corpus by concept (redistributable idioms only). Do not edit — regenerate with gen-module-examples.mjs.

euclidean-rhythm

s("bd(3,8)")

strudel-0004 · CC0

d1 $ sound "bd(3,8)"

tidal-0004 · CC0

polymeter

s("{bd sd, hh hh hh}%4")

strudel-0007 · CC0

d1 $ sound "{bd sn, hh hh hh}%4"

tidal-0007 · CC0

polyrhythm

s("bd*3, hh*4")

strudel-0006 · CC0

d1 $ sound "bd*3, hh*4"

tidal-0006 · CC0

Atoms in this module

Required — these gate the capstone

Mini-notation specifies patterns tersely inside a string, with events spaced evenly across one fixed-length cycle
Concept L1 Foundations F
Tidal's fundamental time unit is the cycle, not the beat, so adding events packs them tighter rather than lengthening the bar
Concept L1 Foundations F
TidalCycles is oriented around cycles rather than beats, so mixing fractional steps yields cross-rhythms easily
Principle L2 First instrument FA
Square brackets in mini-notation subdivide one step into a nested sub-sequence
Concept L1 Foundations F
Asterisk in mini-notation speeds up a step, fitting n repetitions into its allotted time slot
Concept L1 Foundations F
! in mini-notation replicates a step n times at equal duration
Concept L2 First instrument F
A tilde or hyphen in mini-notation inserts a silent step that preserves the grid
Fact L1 Foundations F
@ in mini-notation elongates a step proportionally, weighting its duration relative to neighbours
Concept L2 First instrument F
Comma in mini-notation stacks patterns to play simultaneously in parallel
Concept L1 Foundations F
Square brackets in Tidal mini-notation create sub-patterns that fit multiple events into a single step
Procedure L2 First instrument F
Comma-separated patterns inside square brackets create polyrhythms in Tidal
Procedure L2 First instrument F
In Tidal mini-notation, [] stacks subsequences into one cycle (polyrhythm) while {} aligns them step-for-step (polymetre)
Concept L2 First instrument FA
Tidal's mini-notation parses polymetric rhythms from strings using square and curly bracket operators
Procedure L2 First instrument F
Tidal uses (k,n) notation inside a pattern to generate Euclidean rhythms — evenly distributing k onsets over n steps
Concept L1 Foundations FA
TidalCycles parenthesis notation (k,n) generates Euclidean rhythms directly in mini-notation
Procedure L2 First instrument FA

Supporting — enrichment, not gating

Forward slash in mini-notation stretches a sequence over n cycles
Concept L1 Foundations F
TidalCycles euclid k n places k onsets Euclideanly across n steps, the function form of the (k,n) mini-notation
Procedure L2 First instrument FA
Tidal mini-notation uses *, /, !, and <> to speed up, slow down, repeat, and rotate steps within a cycle
Concept L2 First instrument F
The * and / operators in Tidal mini-notation speed up or slow down individual events and groups
Procedure L2 First instrument F
Tidal * and / operators speed up or slow down pattern steps multiplicatively
Concept L1 Foundations F
Angle brackets in mini-notation pick one value per cycle, rotating through the list
Concept L1 Foundations F
Angle brackets in Tidal mini-notation select one element per cycle, creating slow-cycling pattern variation
Procedure L2 First instrument F
Tidal run and .. generate sequential integer patterns compactly
Concept L1 Foundations F
TidalCycles' pattern model originates from Indian tabla rhythm analysis via Bernard Bel's Bol Processor syntax
Fact L2 First instrument FA
TidalCycles is a live coding environment designed for exploring musical pattern
Fact L1 Foundations FO
TidalCycles was designed to be immediate, so a code change is audible within a few seconds
Concept L1 Foundations F
TidalCycles emerged from the need to make live music without minutes of dead air — Perl was too slow for real-time performance
Fact L1 Foundations FP
TidalCycles is designed exclusively for live coding algorithmic patterns, with a mini-notation for rhythms and an extensive combinator library for pattern manipulation
Fact L2 First instrument F
Tidal Cycles treats music as infinite cycles of patterns in a terse mini-notation manipulated live
Concept L2 First instrument F
TidalCycles step builds a pattern from a step-sequencer string, mapping x to a hit and digits to sample indices
Procedure L2 First instrument F
Curly-brace patterns in Strudel combine sequences of different step counts polymetrically
Concept L2 First instrument F
polymeter aligns patterns by step so patterns of different lengths phase against each other
Concept L3 Craft F
Curly brace syntax in Tidal creates polymeter patterns where sequences of different lengths share the same pulse
Procedure L3 Craft FA
TidalCycles is split across two repos: the Tidal pattern language (Codeberg) and SuperDirt sound engine (GitHub)
Fact L0 Orientation FP
Offsetting loop lengths in polymeter yields minutes of non-repeating combination from short loops with zero randomness
Principle L2 First instrument AF
In Strudel the tempo is set as cps (cycles per second), where bpm = cps × 60 × beats per cycle
Fact L2 First instrument FA
Polyrhythm sounds two conflicting subdivisions at once, creating a rolling tension that resolves periodically
Concept L2 First instrument AF
Polymeter is the cheapest way to make a loop evolve without writing more notes
Principle L2 First instrument AF