An AI music co-production workflow. Claude Code, running interactively on a Claude subscription,
is the producer agent; the artist makes the creative calls and does the listening. Everything
else is free, open source and local: SoundCraft is the
DAW, driven through its MCP server; Surge XT is the synth,
and Surge XT Effects brings its effects in as a plugin; Python scripts in tools/ handle analysis
and MIDI generation. No API keys, no paid services.
| Path | Contents |
|---|---|
CLAUDE.md |
The producer brief every Claude Code session loads |
.mcp.json |
Registers SoundCraft's MCP server, sandboxed (see MCP sandbox) |
projects/<song>/ |
One folder per song: notes.md, <song>.scraft, MIDI, bounces/, vocals |
projects/_template/ |
Starting point for a new song |
references/ |
Reference tracks to compare against (kept out of git) |
tools/ |
Python scripts and their uv project (pyproject.toml, uv.lock, .venv/) |
mcp/ |
Reserved for MCP servers we build next (ACE-Step, audio analysis) |
- Linux x86_64 (set up on Ubuntu 26.04), with
~/.local/binonPATH - Claude Code, started from this folder
- uv; Python 3.14 is pinned in
tools/.python-version, and uv fetches it if the machine doesn't have it - SoundCraft and Surge XT, installed user-local as below
- ffmpeg (optional, for an independent loudness cross-check)
Pinned versions. Everything is user-local: nothing was installed with sudo, apt or dpkg.
| Source | https://github.com/storytold/soundcraft/releases/tag/v0.7.0 |
| Artifact | soundcraft-0.7.0-linux-x86_64.tar.gz |
| Checksum | SHA256 8d7afbe5fe433cb338b7ccee0820285d6ce1bfc8c006d551ca8840c27a911ab2, verified against the release's SHA256SUMS.txt |
| Install path | ~/.local/opt/soundcraft-0.7.0/ (bin/, share/) |
| Symlinks | ~/.local/bin/soundcraft, ~/.local/bin/soundcraft-cli |
| Check | soundcraft-cli --version prints SoundCraft CLI 0.7.0 |
SoundCraft releases every day or two and its MCP surface is still moving (the sandbox flags first shipped in 0.7.0), so stay on this version until an upgrade is deliberate.
| Source | https://github.com/surge-synthesizer/releases-xt/releases/tag/1.3.4 |
| Artifact | surge-xt-linux-x64-1.3.4.deb, unpacked with dpkg-deb -x rather than installed (its xclip dependency was skipped) |
| Checksum | MD5 209543b5dc9a614b3d47c5ec1bfbc13a, verified against the release's md5sum.txt (the only checksum it publishes); SHA256 a6e55064487f624147d515b9ae5fc79a568b69746675b2083abde628ca7bb151, computed locally |
| Install path | ~/.local/opt/surge-xt-1.3.4/ (the package's /usr tree: bin/, lib/, share/) |
| CLAP plugins | ~/.clap/Surge XT.clap and ~/.clap/Surge XT Effects.clap (copies from the install folder); SoundCraft ids clap:org.surge-synth-team.surge-xt (instrument) and clap:org.surge-synth-team.surge-xt-fx (effect, for mix.insert) |
| Factory data | ~/.local/share/surge-xt → ~/.local/opt/surge-xt-1.3.4/share/surge-xt (Surge looks there before /usr/share) |
| Standalone | ~/.local/bin/surge-xt → ~/.local/opt/surge-xt-1.3.4/bin/Surge XT |
| User data | ~/Documents/Surge XT/, created by Surge the first time it loads (user patches and settings) |
| Left in the install folder | The Surge XT Effects standalone, surge-xt-cli, the LV2 and VST3 builds |
| Check | soundcraft-cli run --cmd engine.clap_plugins lists Surge XT and Surge XT Effects, both 1.3.4 |
| uv | 0.11.21, already at ~/.local/bin/uv |
| Python | 3.14 (tools/.python-version); on this machine the venv uses /usr/bin/python3.14 (3.14.4) |
| venv | tools/.venv/, rebuilt with uv sync --project tools |
| Packages | locked in tools/uv.lock: librosa 1.0.0, pyloudnorm 0.2.0, pretty-midi 0.2.11.post0, music21 10.5.0, numpy 2.5.4, scipy 1.18.1, soundfile 0.14.0 |
cd ~/Documents/projects/TakeTwo # always start Claude Code from the repo root
uv sync --project tools # first time on a machine: build the Python venv
claude # approve the `soundcraft` MCP server when asked; /mcp shows itThen work in Claude Code, for example "start a new song called night-drive". Every bounce reports its peak, true peak and integrated loudness; to re-measure a file yourself:
uv run --project tools tools/loudness.py projects/<song>/bounces/<file>.wav.mcp.json runs soundcraft-cli mcp --automation-read-root . --automation-write-root ./projects.
SoundCraft 0.7.0 takes exactly one read root and one write root (a repeated flag is an error), so
the server can read anywhere in this repo (projects, references, tools and so on) and can write
only under projects/. A path outside its root comes back as a tool error. The roots are relative
to the folder Claude Code starts in: started anywhere else, a root is missing and the server
refuses to start. The desktop app (soundcraft --control) has no such flags, so it is not confined.
SoundCraft (set V to the new version). Re-read docs/mcp.md and docs/control-protocol.md at
the new tag first, since flags and commands change, then update the tables above and CLAUDE.md:
V=0.7.1
D=$(mktemp -d) && cd "$D"
gh release download "v$V" -R storytold/soundcraft -p SHA256SUMS.txt -p "soundcraft-$V-linux-x86_64.tar.gz"
grep " soundcraft-$V-linux-x86_64.tar.gz\$" SHA256SUMS.txt | sha256sum -c -
mkdir ~/.local/opt/soundcraft-$V
tar -xzf "soundcraft-$V-linux-x86_64.tar.gz" -C ~/.local/opt/soundcraft-$V --strip-components=1
ln -sfn ~/.local/opt/soundcraft-$V/bin/soundcraft ~/.local/bin/soundcraft
ln -sfn ~/.local/opt/soundcraft-$V/bin/soundcraft-cli ~/.local/bin/soundcraft-cli
soundcraft-cli --versionSurge XT: download the new .deb and md5sum.txt, verify, dpkg-deb -x it into an empty
folder, copy its usr/ tree to ~/.local/opt/surge-xt-<version>/, copy lib/clap/Surge XT.clap
and lib/clap/Surge XT Effects.clap over the copies in ~/.clap/, and re-point
~/.local/share/surge-xt and ~/.local/bin/surge-xt with ln -sfn. Update the table, then
remove the old folder.
rm ~/.local/bin/soundcraft ~/.local/bin/soundcraft-cli
rm -r ~/.local/opt/soundcraft-0.7.0
rm ~/.local/bin/surge-xt ~/.local/share/surge-xt
rm "$HOME/.clap/Surge XT.clap" "$HOME/.clap/Surge XT Effects.clap"
rm -r ~/.local/opt/surge-xt-1.3.4
rm -r "$HOME/Documents/Surge XT" # Surge's user data, only if nothing in it is wantedClone the repo, install the tools above the same way, run uv sync --project tools, and start
Claude Code from the repo root. Nothing machine-specific is hard-coded: SoundCraft runs headless
with no audio device, sample rate is a per-session setting, and every path is relative. Hardware
settings for the GPU tools coming next (device, precision, batch size) will live in a config file,
not in code.
Not in git, so back these up separately: audio of any kind (bounces, renders, vocal recordings,
and the Audio Files/ folder SoundCraft writes beside a saved session), reference tracks, session
Backups/, the venv, and model weights or other large binaries.