Tidal in a Strudel rig: porting patterns and debugging failures
Learning objectives
- learner can explain why Tidal patterns cannot run directly in this rig and apply the correct Tidal-to-Strudel translation workflow for operators, tempo, channels, and sample names
- learner can read mini-notation without misreading * vs !, comma stacks, angle-bracket per-cycle advance, and polymeter {…}%n semantics that differ silently between Tidal and Strudel
- learner can diagnose Tidal failures by consulting the correct error surface — GHCi for parse/type errors, SuperCollider post window for sound failures — and distinguish them from Strudel's single-window model
- learner can execute a live recovery from any Tidal failure in the rig: hush all channels, translate the broken pattern to Strudel, and restore sound within two minutes
Capstone — one whole task that evidences the objectives
Port a broken multi-voice Tidal session into a working Strudel set for this rig. The session cannot run here (no GHC/SuperCollider/SuperDirt), so every voice must be translated and every seeded failure resolved. Structural bugs to fix: Tidal infix/ prefix operator syntax pasted into Strudel that throws; a `#` control-application whose right side is a bare string, and a `#` vs `|+|` pair where you must keep the right structure vs. combine structures correctly; a raw BPM passed to setcps (state the corrected cycles-per-second value); d1..d16 channels rewritten as bare `$:` voice blocks; and at least two Tidal functions absent from Strudel 1.2.6 (e.g. rot, whenmod, layer) that you must substitute or drop. Notation bugs to repair, each producing plausible-but-wrong output: a `*`-vs-`!` mix-up, a comma the author believed was a rest but that stacks voices, an angle-bracket group advancing per-cycle not per-step, and a polymeter `{…}` missing its `%n`. Sound/routing bugs: a chord written `n "c'min7"` and a scale named `"c minor"` (space-separated root) ported to Strudel's forms; an unknown sample name (`sound "kick"` when the folder is `bd`) that silences a voice; and orbit-shared reverb bleeding across voices that should be independent, reassigned to separate orbits. For each failure, first name the error surface it WOULD show on in a native Tidal setup (GHCi parse/type vs. SuperCollider post-window vs. — here — Strudel's single console), and note which failures throw versus which run silently wrong (including that Tidal evaluates on the eval keystroke, not on file-save like this rig's hot-reload, so a stale block can keep playing). Finally write a hush-then-rebuild panic block — call hush to silence all voices, then a minimal runnable Strudel groove at confirmed tempo and safe gain — as the closing recovery move. Annotate each fix with the rule it satisfies and verify every rig-runnable snippet runs without error.
Prerequisite modules
This module closes the gap between knowing Tidal conceptually and being able to work with Tidal patterns in a rig that only runs Strudel. The rig has no GHC, no SuperCollider, and no SuperDirt — so a Tidal file is dead weight until someone translates it. The whole-task goal is rapid, confident porting under performance pressure: given a Tidal session, every obstacle from syntax paradigm to sample-name conventions is identified and resolved, and when something still breaks, the recovery takes under two minutes.
The arc runs in three layers. First, the structural translation layer: Tidal uses Haskell infix operators (#, |+|, |>|, the dollar sign) and prefix functions; Strudel uses JavaScript method chains. These are not cosmetic differences — # controls which pattern donates its structure, and pasting # into Strudel throws immediately. The tempo system differs too: setcps takes cycles per second, so passing a raw BPM of 120 produces 7200 cycles per minute, not 120. Channels (d1..d16) are defined in BootTidal.hs and simply do not exist in Strudel — the Strudel equivalent is a bare $: block per voice. And several Tidal functions (rot, whenmod, layer) are absent from the installed Strudel 1.2.6 build and must be substituted or dropped.
Second, the mini-notation hazard layer: both languages share the same notation string format, but four constructs behave in ways that look right but are subtly wrong. * subdivides hits within one step; ! replicates the step across positions — using one when you mean the other produces the right number of events with the wrong rhythm. A comma inside the string stacks two simultaneous voices, not a pause; angle brackets advance one element per full cycle, not per step; and polymeter requires {…}%n — without the %n the first group’s length silently governs. These are exactly the errors that look plausible, run without throwing, and produce wrong musical output.
Third, the error-surface and recovery layer: in a native Tidal setup, parse and type errors appear in GHCi while missing-sample and synth-name failures appear in the SuperCollider post window — two separate diagnostic surfaces. Because the rig has neither, all failure signals come through Strudel’s single console. Knowing the origin of each class of error matters both for native Tidal debugging and for understanding which Strudel console message maps to which Tidal concept. Unbalanced brackets in mini-notation, unknown sample names (sound “kick” is silent because the folder is bd), and orbit-shared reverb that bleeds across independent voices are all Tidal gotchas that survive translation if the porter does not know to check them.
The supported exercises build the translation reflex: take a minimal Tidal pattern, port it operator by operator, verify it runs. Then introduce one bug class at a time — first notation bugs, then function-not-in-strudel substitutions, then sample-name lookups, then orbit assignments — before the capstone combines all eight categories simultaneously. The hush-then-rebuild panic block is drilled as a required closing move at each stage: hush (or, in Strudel, hush()) stops everything; a minimal three-voice groove at confirmed tempo and safe gain restores sound fast.
Atoms in this module
Required — these gate the capstone
Supporting — enrichment, not gating
Part of curricula
- Audio-Visual Performer — integrated, synced live AV — Pair sound and image (unsynced, side by side) optional
- Live Coder — zero to performing live-coded music — Performing Live recommended