Local HTTP + MCP tool for AI agents to write/edit Strudel code, offline-render WAV audio, and get a structured “hearing” report (waveform, spectrogram, dB envelopes, bands, onsets, estimated BPM).
Sibling project to cryptid-crawler — finished sounds can be copied into the game later.
License: AGPL-3.0-or-later (inherits from Strudel / superdough).
cd ~/Projects/strudel-ai
npm install
npm run smoke # render + analyze a tiny pattern
npm start # HTTP on http://127.0.0.1:8787
npm run mcp # MCP stdio server for CursorPOST /sessions→ create sessionPUT /sessions/:id/code→ write StrudelPOST /sessions/:id/render-analyze→ WAV + hearing report- Read
hearing.summary/ artifacts;PATCH /sessions/:id/codeto edit GET /sessions/:id/diff?from=1&to=2→ code + metric deltas
Same ops exist as MCP tools: session_create, code_set, code_patch, render_analyze, hearing_get, session_diff, artifact_paths, …
| Method | Path | Purpose |
|---|---|---|
| GET | /health |
liveness |
| POST | /sessions |
create |
| GET | /sessions |
list |
| GET | /sessions/:id |
meta |
| PUT | /sessions/:id/code |
new full revision |
| PATCH | /sessions/:id/code |
search/replace or unified diff |
| GET | /sessions/:id/code |
read code |
| POST | /sessions/:id/render |
offline WAV |
| POST | /sessions/:id/analyze |
hearing pack |
| POST | /sessions/:id/render-analyze |
both |
| GET | /sessions/:id/revisions/:n/hearing |
JSON report |
| GET | /sessions/:id/revisions/:n/artifacts/:name |
png/wav/json |
| GET | /sessions/:id/diff?from=&to= |
code + hearing delta |
| POST | /sessions/:id/open |
open Strudel.cc REPL + play WAV (mpv/xdg-open) |
Pass "open": true on render-analyze to do that automatically when finished.
# CLI: open code in Strudel editor + play media
npm run open -- out/ps1_pistol.strudel.js out/ps1_pistol.wav
npm run open -- <sessionId>SID=$(curl -s -X POST http://127.0.0.1:8787/sessions -H 'content-type: application/json' -d '{"title":"demo"}' | jq -r .id)
curl -s -X PUT http://127.0.0.1:8787/sessions/$SID/code \
-H 'content-type: application/json' \
-d '{"code":"note(\"c3 e3 g3 c4\").s(\"sawtooth\").gain(0.4)"}' | jq .currentRevision
curl -s -X POST http://127.0.0.1:8787/sessions/$SID/render-analyze \
-H 'content-type: application/json' \
-d '{"cycles":2,"cps":0.5}' | jq '.hearing.summary'Add to your MCP settings (stdio):
{
"mcpServers": {
"strudel-ai": {
"command": "npx",
"args": ["tsx", "src/cli.ts", "mcp"],
"cwd": "/home/agbowman99/Projects/strudel-ai"
}
}
}- Default sample bank is
github:tidalcycles/dirt-samples(override withSTRUDEL_AI_SAMPLES). Synths (sawtooth,sine, …) come fromsuperdough. @kabelsalat/webis patched onpostinstallso Node can importSalatRepl.- Session data lives in
./sessions/(gitignored). - Architecture diagram: mermaid-lite project Strudel AI (
ml show "Strudel AI").