Strudel est basé sur des cycles : chaque pattern tourne en boucle. Par défaut un cycle dure 2 secondes (30 cycles/min). Plus une séquence contient d'éléments, plus elle s'accélère pour tenir dans le cycle.
Mini-Notation
Séquence
espace
sound("bd bd sd hh")
Numéro de sample
:x
sound("hh:0 hh:1 hh:2")
Silence / pause
- ou ~
sound("bd - sd -")
Alternance (1/cycle)
< >
sound("<bd hh rim oh>")
Sous-séquence
[ ]
sound("bd [hh hh] sd")
Sous-sous-séquence
[[ ]]
sound("bd [[rim rim] hh]")
Accélération
*n
sound("bd sd*2 cp*3")
Parallèle
,
sound("bd*2, hh*4, - cp")
Fonctions
sound()
Joue un son par son nom
sound("bd sd [- bd] sd")
n()
Sélectionne le numéro de sample (plus lisible que :x)
n("0 1 4 2").sound("jazz")
.bank()
Change la drum machine
sound("bd sd").bank("RolandTR909")
setcpm()
Tempo en cycles par minute — 120bpm en 4/4 = 30 cpm
setcpm(90/4); sound("bd hh sd hh")
Sons de batterie
bdbass drum
sdsnare drum
hhhihat
ohopen hihat
rimrimshot
ltlow tom
mtmiddle tom
hthigh tom
rdride cymbal
crcrash cymbal
Raccourcis & Drum Machines
Jouer / Mettre à jour
Ctrl + Enter
RolandTR909 · RolandTR808 · RolandTR707
AkaiLinn · RhythmAce · ViscoSpaceDrum
Exemples interactifs
Sous-séquences & parallèle
Notes via note() : chiffres MIDI (60 = C4) ou lettres a à g. Dièse avec #, bémol avec b. Octave avec un chiffre après la lettre (ex: c3). La fonction n() + .scale() permet de travailler par degrés — tous les numéros sonnent juste.
Mini-Notation — nouveautés
Ralentir
/n
note("[c a f e]/2")
Alternance (rappel)
< >
note("c a f <e g>")
Allonger (durée relative)
@n
note("c@3 e") — c dure 3x plus
Répliquer
!n
note("c!3 e") — c répété 3 fois
Fonctions
note()
Joue une note en MIDI ou lettre
note("b g e c").sound("piano")
.scale()
Interprète n() comme un degré de gamme
n("0 2 4 6").scale("C:minor").sound("piano")
$:
Joue plusieurs patterns en parallèle. _$: pour muter un pattern.
$: sound("bd*4") $: note("c e g")
Gammes
C:major
A:minor
D:dorian
G:mixolydian
A:minor:pentatonic
F:major:pentatonic
Format : Note:gamme — peut inclure une octave (A2:minor). La gamme peut être un pattern :
n("0 2 4").scale("<C:major D:mixolydian>/4")
@ vs ! vs *
@n — Allonger
note("c@3 e") → c occupe 3 unités, e occupe 1. Durée totale inchangée.
!n — Répliquer
note("c!3 e") → équivalent à "c c c e".
*n — Accélérer
note("c*3 e") → c répété 3x en sous-séquence compressée.
Exemples interactifs
Notes par lettres + .sound()
Gamme — explorer les degrés
Shuffle avec @ (groove blues/jazz)
Multi-patterns $: — Basse + Mélodie + Batterie
Les effets s'appliquent en chaîne avec .nomEffet(valeur). La valeur peut être un nombre fixe, un pattern mini-notation, ou un signal (sine, saw, rand…). Les signaux oscillent entre 0 et 1 par défaut — utiliser .range(min, max) pour ajuster.
Effets audio
.lpf()
Low-pass filter — filtre les aigus. Bas = sourd (porte fermée), haut = brillant.
note("c2 c3").sound("sawtooth").lpf("200 1000 200 1000")
.vowel()
Formant vocal — simule des voyelles. Valeurs : a e i o u
note("c3 eb3 g3").sound("sawtooth").vowel("<a e i o>")
.gain()
Volume entre 0 et 1. Patternable pour créer de la dynamique.
sound("hh*16").gain("[.25 1]*4")
.delay()
Délai. Format .delay("vol:temps:feedback") — chaque paramètre optionnel.
sound("bd rim").delay(".5:.125:.8")
.room()
Réverbération. Plus la valeur est grande, plus la réverb est longue.
sound("bd rim").room(2)
.pan()
Panoramique stéréo. 0 = gauche, 1 = droite, 0.5 = centre.
sound("bd rim cp oh").pan("0 0.3 .6 1")
.speed()
Vitesse de lecture du sample. Négatif = lecture à l'envers.
sound("bd rim").speed("<1 2 -1 -2>")
.fast() .slow()
Accélère ou ralentit le pattern entier hors mini-notation.
sound("bd*4, ~ rim ~ cp").slow(2)
Enveloppe ADSR
attack
Temps pour monter au volume max
decay
Temps pour descendre au sustain
sustain
Niveau tenu pendant la note (0 à 1)
release
Temps pour s'éteindre après la note
.adsr(".1:.1:.25:.2") // attack:decay:sustain:release
Ou chaque paramètre séparément :
.attack(.1)
.decay(.1)
.sustain(.25)
.release(.2)
Signaux de modulation
Les signaux remplacent une valeur fixe par une oscillation continue. Ils s'utilisent directement comme valeur d'un effet.
sine
saw
square
tri
rand
perlin
sound("hh*16").gain(sine) // volume ondule avec sinus
sound("hh*16").lpf(saw.range(500, 2000)) // plage personnalisée
note("c2 bb2 f2").sound("sawtooth").lpf(sine.range(100,2000).slow(4))
Exemples interactifs
Gain + dynamique rythmique
Signal — lpf avec saw modulé lentement
Les Pattern Effects sont propres à Tidal/Strudel — ils manipulent la structure temporelle des patterns eux-mêmes, pas seulement le son. Ce sont des outils puissants pour générer de la complexité à partir de peu de code.
Fonctions de pattern
.rev()
Inverse l'ordre du pattern.
n("0 1 [4 3] 2").sound("jazz").rev()
.jux(fn)
Duplique le pattern : gauche = original, droite = version modifiée par fn.
n("0 1 [4 3] 2").sound("jazz").jux(rev)
.add()
Ajoute des valeurs aux notes/degrés. Peut être patterné. Fonctionne aussi sur les chaînes mini-notation.
n("0 2 4 6".add("<0 1 2 1>")).scale("C:minor")
.ply(n)
Répète chaque événement n fois dans son slot. Patternable.
sound("hh hh, bd rim").ply("<1 2 1 3>")
.off(t, fn)
Copie le pattern, le décale de t cycles, applique fn à la copie. Empilable.
n("0 [4 <3 2>]").scale("C5:minor").off(1/16, x=>x.add(4))
.slow(n)
Ralentit le pattern d'un facteur n. Peut être patterné lui-même.
note("c2, eb3 g3").sound("piano").slow("0.5,1,1.5")
.fast(n)
Accélère le pattern d'un facteur n.
sound("bd sd [~ bd] sd").fast("<1 [2 4]>")
Exemples interactifs
.jux(rev) — gauche original / droite inversé
.slow() en pattern — polytempos
.add() — décalage harmonique
.ply() — chaque événement répété n fois
.off() — copie décalée et modifiée
Stack complet — Xylophone + Basse + Jazz
Synthèse complète du workshop. Toutes les notions en un seul endroit pour référence rapide.
Mini-Notation — toute la syntaxe
| Concept | Syntaxe | Exemple |
| Séquence | espace | sound("bd bd sd hh") |
| Numéro sample | :x | sound("hh:0 hh:1 hh:2") |
| Silence | - ou ~ | sound("metal ~ jazz jazz:1") |
| Sous-séquence | [ ] | sound("bd wind [metal jazz] hh") |
| Sous-sous-séquence | [[ ]] | sound("bd [metal [jazz sd]]") |
| Accélération | *n | sound("bd sd*2 cp*3") |
| Parallèle | , | sound("bd*2, hh*2 [hh oh]") |
| Ralentir | /n | note("[c a f e]/2") |
| Alternance | < > | note("c <e g>") |
| Allonger | @n | note("c@3 e") |
| Répliquer | !n | note("c!3 e") |
Sons
| Fonction | Rôle |
| sound() | Joue un son |
| .bank() | Drum machine |
| n() | Numéro de sample |
| setcpm() | Tempo cycles/min |
Notes
| Fonction | Rôle |
| note() | MIDI ou lettre |
| n() + .scale() | Degré de gamme |
| $: | Patterns parallèles |
| _$: | Muter un pattern |
Effets audio
| Effet | Rôle |
| .lpf() | Filtre passe-bas |
| .vowel() | Formant vocal |
| .gain() | Volume (0 à 1) |
| .delay() | Délai (vol:t:fb) |
| .room() | Réverb |
| .pan() | Panoramique 0–1 |
| .speed() | Vitesse sample |
| .adsr() | Enveloppe |
Pattern Effects
| Fonction | Description | Exemple |
| setcpm | Tempo cycles/min | setcpm(45); sound("bd sd [~ bd] sd") |
| .fast(n) | Accélère le pattern | sound("bd sd [~ bd] sd").fast(2) |
| .slow(n) | Ralentit le pattern | sound("bd sd [~ bd] sd").slow(2) |
| .rev() | Inverse le pattern | n("0 2 4 6").scale("C:minor").rev() |
| .jux(fn) | L = original / R = modifié | n("0 2 4 6").scale("C:minor").jux(rev) |
| .add(n) | Ajoute aux notes/degrés | n("0 2 4".add("<0 1 2 1>")).scale("C:minor") |
| .ply(n) | Répète chaque event n fois | s("bd sd").ply("<1 2 3>") |
| .off(t, fn) | Copie décalée et modifiée | s("bd sd, hh*4").off(1/8, x=>x.speed(2)) |
Signaux
Signaux de base (oscillent entre 0 et 1) :
sine
saw
square
tri
rand
perlin
signal.range(min, max) // ajuste la plage
signal.slow(n) // ralentit la modulation
sound("hh*16").lpf(sine.range(200, 4000).slow(4))
Bac à sable — tout combiner
Zone libre — modifie et expérimente (stack workshop)