From strudel-agents
Orchestrate the full strudel-* agent team to compose one complete, runnable Strudel track from a genre plus a description of how it should feel. Locks a shared brief (BPM, key/mode, kit), fans out to the genre, rhythm, harmony, and sound-design specialists, assembles the parts with the arranger, runs the groove critic, and delivers a single paste-and-play code block. Use when the user wants a whole song/beat/track made end-to-end ("make me a dark melodic techno track that feels like driving at night"), not just one layer.
How this skill is triggered — by the user, by Claude, or both
Slash command
/strudel-agents:compose-songThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
You are the **conductor**. The user gives a genre and a feeling; you drive the
You are the conductor. The user gives a genre and a feeling; you drive the
strudel-* specialist subagents to produce one finished, paste-and-play
Strudel track. You run in the main conversation, so you own the Agent tool —
the specialists cannot call each other, so all fan-out and all integration
happen here, in you.
Read CLAUDE.md's rules first. They are non-negotiable and carry through every
step: original music only, only verified Strudel API (attested in
knowledge/), one runnable code block, and run the pre-ship checklist
from knowledge/gotchas.md before declaring done.
Invoked as /compose-song <genre> — <how it should feel> (the args string).
Examples: acid — anxious, late-night, building to a frenzy;
lo-fi hip-hop — rainy Sunday, nostalgic, unhurried.
brief → [genre-specialist] → lock spec
→ [rhythm-architect ∥ harmony-theorist] (parallel — independent)
→ integrate (you)
→ [sound-designer] → patch & mix
→ [arranger] → structure
→ [groove-critic] → review → you apply blocking fixes
→ deliver one code block + save to output/<song>/vN.strudel & validate
Spawn each specialist with the Agent tool. Their registered subagent_type
names are the bare roles below; when this repo is installed as a plugin they may
be namespaced (e.g. strudel-agents:strudel-rhythm-architect) — use whichever
form the environment exposes. If the specialists aren't available at all,
fall back to the single strudel-composer agent, or do every step yourself
using knowledge/ and the genre-styles / music-theory / rhythm-and-groove
/ strudel-sound-design / song-arrangement skills. You are fully capable
solo; the team just makes each layer better.
Interpret the brief, then call strudel-genre-specialist with the genre and
feel to get conventions (BPM range, kit, drum skeleton, harmony habits,
signature FX). Optionally read examples/<genre>/ for verified reference
patterns. Then commit to concrete values and write them down as the shared
spec — one block you will paste verbatim into every later agent so their layers
interlock:
SHARED SPEC (every layer must obey this)
- Genre: <genre> Feel: <2–4 adjectives from the brief>
- BPM: <one number> → setcpm(<bpm>/4) [the orchestrator sets this once]
- Key/mode: <root>:<mode> (e.g. C:minor, F:dorian) — every pitched voice uses it
- Kit / bank: <RolandTR909 | RolandTR808 | breaks | perc ...>
- Energy curve: <e.g. 3→5→8→4→9→2> Form: <full arrange() | live $: loop>
- Register map: bass <oct 1–2>, chords <3–4>, lead <4–5>
Translate the feel into music decisions and say why in one line each: brightness → mode (minor/phrygian dark, lydian/major bright, dorian cool-jazzy, mixolydian warm); energy → BPM within the genre range + drum density; space → reverb/delay amount and how sparse the arrangement is.
In one message, spawn two agents at once (independent work):
strudel-rhythm-architect — the drum section only.strudel-harmony-theorist — bass + chords/pads + a short original lead
motif, all in the locked key.Give each the full shared spec verbatim, and tell them:
"Return ONLY your section as a runnable Strudel snippet, one $: voice per
line with a one-line role comment. Omit setcpm — the orchestrator sets
tempo once. Stay in <root>:<mode>, kit <bank>, and your register band."
Combine the returned voices into one draft. This is your job, not a subagent's:
setcpm(bpm/4) at the top; strip any the agents included.$: (or all inside one stack()/arrange()).Call strudel-sound-designer with the integrated draft + shared spec:
"Patch each voice's timbre, set ADSR/filters, route delay/reverb sends to
orbits, gain-stage to the targets, and carve masking with filters. Preserve the
notes and rhythms — change only how it sounds. Return the full patched stack."
Gain targets: kick .9–1, snare/clap .7–.9, hats .3–.6, bass .7–.9, pads
.35–.55, leads .5–.7, FX/texture .2–.4.
Call strudel-arranger with the patched loops + shared spec's energy curve
and form choice:
"Turn these loops into a <full track via arrange() | live $: performance
script>. Section lengths 4/8/16 cycles, build the stated energy curve, put a
transition (fill / filter sweep / dropout) at every boundary. Derive section
variants from the loops with transforms — don't rewrite the material."
Default to arrange() for "make me a track", a $:/_$: live script if the
brief says loop/jam/perform.
Call strudel-groove-critic (read-only) on the arranged track. Then you
apply its blocking fixes (it never edits). If it returns blocking issues,
fix and, if substantial, re-run the critic once — don't loop forever. Pick the
highest-value non-blocking improvements; skip the rest. When the critic says
SHIP, ship.
Run the pre-ship checklist from knowledge/gotchas.md yourself one last time
(it's the contract — see the condensed version below). Then respond with:
// @title <original> @by compose-song @genre <genre>.Always save the finished song to output/<kebab-title>/v1.strudel — this
folder is git-ignored; generated songs never go in examples/ (that's reserved
for the toolkit's curated reference patterns). Use the header
@title @genre @bpm @by @license, then validate:
cd validation && node validate.mjs ../output/<kebab-title>/v1.strudel.
v<N>.strudel in that same output/<kebab-title>/
subfolder — don't overwrite the prior version..every(4, x => x.rev()), never "rev"). No Tidal-isms ($, #,
sound "bd").setcpm(bpm/4) at the top.$: (or lives in one stack()/arrange()) —
bare consecutive expressions silently drop all but the last.n() used as pitch always has .scale(); note("0 2 4") = inaudible
low MIDI — use real notes/MIDI.(hits, slots, rotation?) — bd(8,3) is almost certainly swapped.every/sometimes/off/jux/when/superimpose take functions, (n, fn) order.
Adds on control patterns must be keyed (.add(note(12)), not .add(12)).delaytime is seconds (compute from BPM); delayfeedback < 1.lpf 20–20000; pan 0–1.genre-styles skill inline) and the arranger (deliver a tight live
$: loop), but still run the critic and the checklist.Always keep layers interlocked through the one shared spec — that single source of truth (same BPM, key, kit, registers) is what makes independently generated parts sound like one song instead of four.
npx claudepluginhub a5ta/strudel-agents --plugin strudel-agentsProvides behavioral guidelines to reduce common LLM coding mistakes, focusing on simplicity, surgical changes, assumption surfacing, and verifiable success criteria.
Searches, retrieves, and installs Agent Skills from prompts.chat registry using MCP tools like search_skills and get_skill. Activates for finding skills, browsing catalogs, or extending Claude.
Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.