skills/strudel/SKILL.md
Use when writing, debugging, or explaining Strudel live-coding music patterns — mini-notation syntax, pattern functions (fast/slow/every/off/stack), synth/sample selection, audio effects, scale/chord/voicing API, or EDM production recipes. Triggers: "write a Strudel pattern", "how do I make a bassline in Strudel", "what does .every() do", "strudel drum beat", "strudel chord voicing", any Strudel code question.
npx skillsauth add ahgraber/skills strudelInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Reference skill for programming music with Strudel — a JavaScript live-coding environment based on TidalCycles patterns, running in-browser.
Cycle — the fundamental time unit (~2 seconds at the default 30 cpm). All events fit within cycles; adding events makes each shorter, not the total longer. One cycle = one bar of 4/4 at the default tempo.
Pattern — a pure function from time to events. Everything is a pattern. Transforming a pattern wraps it; the original is unchanged.
Mini-notation — a DSL written inside "double quotes" (single-line) or `backticks` (multi-line).
Single quotes '...' are plain JS strings and are NOT parsed as patterns.
Chaining — methods chain left-to-right: note("c e g").s("piano").lpf(800).room(0.4).
$: tracks — the REPL syntax for parallel patterns.
Each $: line is an independent stream.
_$: mutes a track.
Outside the REPL, use stack(...).
// First sound
s("bd sd hh cp")
// First note
note("c3 e3 g3 a3").s("piano")
// Stack drum + melody
stack(
s("bd*4, ~ cp ~ cp, hh*8"),
note("<c3 eb3 g3 bb3>/4").s("piano").room(0.4)
)
// Set BPM (default = 120 BPM in 4/4)
setcpm(120 / 4) // cycles per minute = BPM ÷ beats-per-cycle
setcpm(120 / 4) // 120 BPM, 4/4
setcpm(128 / 4) // house
setcpm(135 / 4) // techno
setcpm(174 / 4) // drum and bass
setCps(140/60/4) // cycles-per-second form
| Key | Action |
| ------------ | ------------------------- |
| Ctrl+Enter | Evaluate / update pattern |
| Ctrl+. | Stop all patterns |
Pull these when you need detail:
| File | Contents |
| -------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- |
| references/mini-notation.md | Complete DSL syntax — all operators, euclidean, alternation, polyrhythm |
| references/pattern-functions.md | All pattern combinators — time, conditional, random, accumulation, signals, stepwise |
| references/sound-sources.md | Synths, drum banks, GM samples, FM synthesis, samples loading, MIDI/OSC |
| references/audio-effects.md | Full effects chain — filters, ADSR, envelopes, delay, reverb, phaser, distortion, sidechain |
| references/tonal.md | Scale/chord/voicing API, transposition, xenharmonic |
| references/recipes.md | Production idioms — beats, bass, arpeggios, chord progressions, house/techno/D&B/trap |
| references/visual-feedback.md | Visualizers (pianoroll, scope, spectrum, spiral) — what each shows and when to suggest them |
stack() — combine independent streams.sine, rand, perlin for LFOs and continuous modulation.every, sometimes, chunk, arrange for variation over time.pianoroll(), scope(), or spectrum() when explaining or teaching.
See references/visual-feedback.md for when each applies."..." or `...` — not '...'.<a b c> alternates one element per cycle (3 cycles to complete) — the whole pattern isn't faster.delay feedback ≥ 1 creates an infinite loop; keep it < 1.roomsize is expensive to change while running; set it once..orbit(n) — each orbit has its own shared delay/reverb bus.
Default orbit = 1.development
Use when writing or reviewing tests for Python behavior, contracts, async lifecycles, or reliability paths. Also use when tests are flaky, coupled to implementation details, missing regression coverage, slow to run, or when unclear what tests a change needs. Use for multi-Python version testing (nox) and free-threaded Python thread-safety validation.
development
Use when the user wants rigorous, non-sycophantic editorial feedback on a draft, essay, blog post, or argument through back-and-forth dialogue — pressure-testing thesis, structure, argument, clarity, tone, and evidence. Triggers: "be my sparring partner", "pressure-test this draft", "poke holes in my argument", "is this ready to publish", "sharpen this post", "where is this weak". Not for one-shot copyediting, proofreading, or ghostwriting.
testing
Use when distilling the through-line gist of one or more sources — the spine, argument, tension, or recurring frame running through a set of documents, notes, research, or transcripts, OR across the ideas within a single rich piece — into a few concise paragraphs. Triggers: "synthesize", "what's the through-line/gist", "extract the insight", "pull these together". Not for faithful summary or condensation that covers what a source says, nor for comparisons or catalogs where enumeration is the deliverable.
development
Use when writing or reviewing tests in any language, or diagnosing a suite that is slow, brittle, or hard to read. Triggers: "write tests", "how should I test this", "what kind of test", "test is flaky/fragile", "should I mock this", "test is hard to read". For Python-specific guidance see `python-testing`.