Strudel: effects, signals and pattern internals
Learning objectives
- learner can shape sound with Strudel's chainable effects and modulate them with signals
- learner can apply conditional/probabilistic transforms and scales/chords
- learner can reason about Haps, structure donation and custom methods
Capstone — one whole task that evidences the objectives
Build an evolving Strudel piece: melodic material via note()/scale()/chords, effects (lpf, room, delay, vowel, gain) modulated by signals, conditional transforms (every/sometimes/chunk), and one custom register()ed method — explaining how Haps and appLeft/appRight decide the structure.
Prerequisite modules
This module takes you from triggering patterns to performing them. In a real browser-based live set — a laptop, Strudel’s REPL projected behind you, no external synths or mixer — everything the audience hears is shaped by method chains on your patterns. The whole task is an evolving piece that breathes on its own: melody constrained to a scale so improvised edits stay consonant, a filter sweep riding a slow sine like an LFO, reverb and delay opening space in a drop, and periodic and probabilistic transforms mutating the material while you think about the next move.
Start supported: take a groove from the prerequisite module and bolt on one effect at a time, leaning on “lpf() applies a low-pass filter” and “gain() controls amplitude” as just-in-time references, then replace static values with continuous motion via “Strudel’s built-in signals (sine, saw, square, rand, perlin) continuously modulate effect parameters”. Next, add harmony with scale() and comma-built chords (transposed with add()), and layer variation with every, sometimes, and chunk. The final, unsupported step goes under the hood: write one method of your own with register(), and explain — using the Hap’s whole/part timespans and the appLeft/appRight structure-donation rules — why your combined patterns land where they do.
The required atoms are exactly what the capstone cannot be faked without: the five named effects, both signal atoms, the conditional-transform family, scale/chord/add for melodic material, and the internals chain from pure() through withValue to register(). Supporting atoms widen the palette — panning, off-echoes, ply rolls, polymeter, sample tricks like splice and loopAt, and deeper query-time internals — worth absorbing once the core piece runs, and natural next moves when the piece needs a second night’s worth of variation.
Runnable examples
Generated from the context/ instrument corpus by concept (redistributable idioms only). Do not edit — regenerate with gen-module-examples.mjs.
every-n-transform
s("bd sd hh cp").every(4, rev)
strudel-0028 · CC0
d1 $ iter 4 $ sound "bd sn hh cp"
tidal-0045 · CC0
sample-chop
s("breaks125:0").chop(8)
strudel-0020 · CC0
d1 $ chop 8 $ sound "break:0"
tidal-0019 · CC0
four-on-the-floor
s("bd*4")
strudel-0001 · CC0
setcps 0.52
tidal-0044 · CC0
reverb-space
s("cp").room(0.6).size(4)
strudel-0019 · CC0
out: mix ~a ~b >> plate 0.3
glicol-0008 · MIT
probabilistic-variation
s("hh*16").degradeBy(0.3)
strudel-0026 · CC0
d1 $ degradeBy 0.3 $ sound "hh*16"
tidal-0025 · CC0
adsr-envelope
note("c3").s("sawtooth").attack(0.01).decay(0.1).sustain(0.6).release(0.3)
strudel-0205 · CC0
{ Saw.ar(220) * EnvGen.kr(Env.perc(0.001, 0.2), Impulse.kr(2)) * 0.3 }.play
supercollider-0013 · CC0
polymeter
s("{bd sd, hh hh hh}%4")
strudel-0007 · CC0
d1 $ sound "{bd sn, hh hh hh}%4"
tidal-0007 · CC0
stereo-panning
d1 $ pan (slow 2 sine) # sound "hh*8"
tidal-0037 · CC0
SinOsc s => Pan2 p => dac; -0.7 => p.pan;
chuck-0042 · MIT
subdivision
seq [55, 82.5, 110, 82.5] & osc >> audio
punctual-0014 · CC0-1.0
d1 $ n "0 .. 7" # scale "minor" # sound "arpy"
tidal-0030 · CC0
formant-vowel
note("<c3 e3 g3>").vowel("<a e i o>")
strudel-0036 · CC0
d1 $ note "c e g" # sound "supersquare" # vowel "a e i"
tidal-0035 · CC0
Atoms in this module
Required — these gate the capstone
Supporting — enrichment, not gating
Part of curricula
- Live Coder — zero to performing live-coded music — Patterns, Grooves & Voices required