home/ modules/ tidal-to-strudel-porting-and-debugging

Tidal in a Strudel rig: porting patterns and debugging failures

  • 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

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.

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

Tidal does not run in this rig; every Tidal pattern must be compiled to Strudel to be heard
Fact L1 Foundations F
Tidal combines patterns with operators; Strudel chains methods, so pasting Tidal operator syntax into Strudel throws
Misconception L1 Foundations F
Tidal # keeps the left structure and takes the right value; |+| combines both structures and does arithmetic
Concept L1 Foundations F
Tidal's d1..d16 channels and p come from BootTidal.hs and have no Strudel equivalent
Fact L1 Foundations F
Tidal sets tempo with setcps (cycles per second); passing a raw BPM to setcps is absurdly fast
Misconception L1 Foundations F
Several Tidal functions like rot, whenmod, and layer throw undefined in installed Strudel 1.2.6
Fact L1 Foundations F
Tidal writes chords with the apostrophe form n "c'min7" and has no separate .voicing() step
Fact L1 Foundations FA
Tidal names a scale with a space-separated root — scale "c minor" — not Strudel's colon form
Fact L1 Foundations FA
In Tidal/Strudel mini-notation, * subdivides hits into one step while ! replicates a step across positions
Concept L1 Foundations FA
A comma inside a mini-notation string stacks two voices simultaneously; it is not a rest
Misconception L1 Foundations FA
Angle brackets in mini-notation advance one element per cycle, not per step
Concept L1 Foundations FA
Mini-notation polymeter requires the {…}%n form; without %n it uses the first group's length
Procedure L1 Foundations FA
A SuperDirt sample name must match a dirt-samples folder; sound "kick" is silent because the folder is bd
Fact L1 Foundations F
In SuperDirt, reverb and delay are shared across all voices on the same orbit
Concept L1 Foundations F
Tidal evaluates a block on the editor's eval keystroke, not on file-save like the rig hot-reload
Fact L1 Foundations F
Tidal parse and type errors appear in GHCi while sound problems appear in the SuperCollider post window
Concept L5 Voice F
An unknown sample name in Tidal produces no GHCi error but silences that voice via a SuperCollider post warning
Misconception L5 Voice F
Unbalanced brackets in Tidal mini-notation produce a GHCi parse error, leaving the old pattern playing
Fact L5 Voice F
Tidal uses prefix functions rather than method-chaining, so Strudel-isms cause GHCi scope or parse errors
Misconception L5 Voice F
Tidal's # operator applies a named control to a pattern; its right side must be a control name, not a bare string
Fact L5 Voice F
Tidal's hush command silences all channels immediately and is the primary panic-stop for gain runaway
Procedure L5 Voice F
When Tidal cannot run in a rig, the operative recovery is to emit equivalent Strudel code that produces sound immediately
Procedure L5 Voice F

Supporting — enrichment, not gating

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 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
Strudel mini-notation squishes a space-separated sequence of sounds into one cycle
Concept L1 Foundations F
A Tidal pattern is a function from a time arc to a list of events, not a stored sequence
Concept L2 First instrument FNA