7.7 KiB
Strudel Syntax Reference
Complete reference for the Strudel live coding language (strudel.cc).
1. Tempo & Timing
setcps(BPM/60/4) // cycles per second — PREFERRED method
setcpm(BPM/4) // cycles per minute — alternative
// Default: 0.5 cps = 120 BPM = 1 cycle every 2 seconds
BPM to CPS conversion: cps = BPM / 60 / 4 (assuming 4 beats per cycle).
2. Mini-Notation (Pattern Language)
Used inside quotes in functions like sound("..."), note("..."), n("...").
Sequencing
| Syntax | Meaning | Example |
|---|---|---|
a b c |
Sequence (space-separated) | sound("bd sd hh") |
[a b] |
Sub-sequence (squish into parent slot) | sound("bd [hh hh] sd hh") |
a , b |
Play in parallel (polyrhythm) | sound("bd sd, hh*4") |
< a b > |
Alternate: one per cycle | sound("<bd sd hh>") |
~ or - |
Rest / silence | sound("bd ~ sd ~") |
Speed & Duration
| Syntax | Meaning | Example |
|---|---|---|
a*N |
Repeat N times (speed up) | sound("hh*16") — 16 hi-hats per cycle |
a/N |
Slow down by factor N | note("[c e g b]/2") — over 2 cycles |
a@N |
Elongate: take N time units | note("c@3 e") — c is 3/4, e is 1/4 |
a!N |
Replicate N times (copy) | note("c!3 e") — c c c e |
Sample Selection
| Syntax | Meaning | Example |
|---|---|---|
name:N |
Sample number N | sound("bd:0 bd:1 bd:2") |
Advanced Mini-Notation
| Syntax | Meaning | Example |
|---|---|---|
a? |
50% chance of playing | sound("hh hh? hh hh?") |
a?0.3 |
30% chance of playing | sound("hh?0.3") |
{a b c}%N |
Euclidean rhythm | sound("{bd bd bd}%8") |
3. Core Functions
Sound Sources
sound("bd sd hh cp") // play samples by name (alias: s)
note("c3 e3 g3 b3") // play pitched notes (letter or MIDI number)
n("0 2 4 6") // play by index (useful with .scale())
Sound Selection
.sound("piano") // set instrument/sample
.s("piano") // shorthand for .sound()
.bank("RolandTR909") // select drum machine bank
.n("0 1 2 3") // sample number within a sound
Drum Sound Names
bd (bass drum), sd (snare), hh (hi-hat closed), oh (open hi-hat),
cp (clap), rim (rimshot), lt (low tom), mt (mid tom), ht (high tom),
rd (ride), cr (crash)
Drum Machine Banks
RolandTR808, RolandTR909, RolandTR707, RolandTR505,
RolandCompurhythm1000, AkaiLinn, RhythmAce, ViscoSpaceDrum, CasioRZ1
Synth Waveforms (use as sound name)
sawtooth, square, triangle, sine, white, pink, brown
GM Instrument Sounds (selection)
piano, gm_electric_guitar_muted, gm_acoustic_bass, gm_synth_bass_1,
gm_synth_bass_2, gm_voice_oohs, gm_blown_bottle, gm_synth_strings_1,
gm_synth_strings_2, gm_xylophone, gm_accordion, gm_electric_piano_1
4. Effects
Filter
.lpf(800) // low-pass filter cutoff in Hz
.hpf(200) // high-pass filter cutoff in Hz
.bpf(1000) // band-pass filter
.lpq(5) // filter resonance (Q) — higher = more resonant
.vowel("a e i o") // vowel formant filter
Amplitude
.gain(0.8) // volume 0-1+
.velocity(0.7) // MIDI-style velocity
Envelope (ADSR)
.attack(0.1) // fade in time (seconds)
.decay(0.2) // fade to sustain time
.sustain(0.5) // sustain level 0-1
.release(0.3) // fade out time after note ends
.adsr(".1:.2:.5:.3") // shorthand: attack:decay:sustain:release
Space
.room(0.5) // reverb amount 0-1+
.size(0.9) // reverb room size 0-1
.delay(0.5) // delay amount 0-1
.delaytime(0.25) // delay time in seconds (or pattern)
.delayfeedback(0.5) // delay feedback 0-1
.pan(0.5) // stereo position 0=left, 0.5=center, 1=right
Playback
.speed(2) // playback speed (negative = reverse)
.begin(0.25) // start position in sample 0-1
.end(0.75) // end position in sample 0-1
.cut(1) // cut group — stops previous sound in same group
.loop(1) // loop the sample
Distortion & Character
.distort(0.5) // distortion amount
.crush(8) // bit crush (lower = crunchier)
.coarse(8) // sample rate reduction
.shape(0.5) // waveshaping distortion
5. Signals (Continuous Modulation)
Signals produce smooth continuous values for automating parameters.
sine // smooth wave 0-1
saw // ramp up 0-1
tri // triangle 0-1
square // on/off 0-1
cosine // cosine wave 0-1
rand // random values
perlin // smooth random (Perlin noise)
Signal Modifiers
sine.range(200, 2000) // remap to range
sine.range(200, 2000).slow(4) // slow down the LFO
sine.range(200, 2000).fast(2) // speed up the LFO
sine.segment(8) // quantize to 8 steps
Usage
.lpf(sine.range(300, 3000).slow(4)) // sweeping filter
.gain(sine.range(0.2, 0.8)) // pulsing volume
.pan(sine.range(0, 1).slow(2)) // auto-pan
6. Pattern Manipulation Functions
Time
.fast(2) // speed up pattern 2x
.slow(2) // slow down pattern 2x
.early(0.25) // shift pattern earlier by 1/4 cycle
.late(0.25) // shift pattern later
Structural
.rev() // reverse the pattern
.palindrome() // play forward then backward
.ply(2) // repeat each event N times
.chop(8) // chop each sample into N pieces
.striate(8) // similar to chop but interleaved
Conditional
.every(4, x => x.rev()) // apply every 4th cycle
.every(3, x => x.fast(2)) // double speed every 3rd cycle
.sometimes(x => x.speed(2)) // 50% chance
.sometimesBy(0.3, x => x.rev()) // 30% chance
.when(x => x % 2 === 0, x => x.rev()) // conditional
Combination
.jux(rev) // play original left, modified right
.off(1/8, x => x.add(7)) // offset copy + modify
.add(2) // add to note values
.sub(1) // subtract from note values
Stacking Patterns
// Method 1: $: prefix (PREFERRED for multi-pattern)
$: sound("bd sd")
$: note("c3 e3 g3")
// Method 2: stack() function (single expression)
stack(
sound("bd sd"),
note("c3 e3 g3")
)
// Method 3: comma in mini-notation (within one function)
sound("bd sd, hh*8")
7. Scales & Tonal System
n("0 2 4 6").scale("C:minor") // scale degrees
n("0 2 4 6").scale("C4:minor") // with octave
n("0 2 4 6").scale("<C:minor D:dorian>/4") // changing scales
Available Scales
major, minor, dorian, phrygian, lydian, mixolydian, locrian,
minor:pentatonic, major:pentatonic, blues, chromatic,
harmonicMinor, melodicMinor, whole, diminished
Voicings (Chord Shorthand)
voicing("<Cm7 Fm7 G7 Cm7>").sound("piano")
8. Sample Loading
samples('github:tidalcycles/dirt-samples') // load from GitHub
samples({ mySound: ['url1.wav', 'url2.wav'] }) // custom
9. Muting & Soloing
$: sound("bd sd") // playing
_$: sound("hh*8") // muted (prefix with _)
// .hush() // append to mute one pattern
// hush() // global mute
10. Variables & JavaScript
Strudel is JavaScript — you can use variables, functions, arrays:
const drums = s("bd sd [~ bd] sd").bank("RolandTR909")
const hats = s("hh*8").bank("RolandTR909").gain(0.3)
const bass = note("c2 ~ c2 ~ eb2 ~ g1 ~").sound("sawtooth").lpf(600)
$: drums
$: hats
$: bass