Skip to main content
← Lab

Human-AI music lab / Ableton MCP / 2026

Claude Could Write MIDI. It Could Not Read It.

On August 13, 2026, I used Claude Code through a forked Ableton MCP to work on a 184-bar minimal techno arrangement in G minor at 134 BPM. The first limitation was not musical ambition. Claude could change the set, but it could not read enough state back to understand what it had already done.

Claude Code produced the MIDI edits, MCP changes, and supporting tooling under my direction and review. Clarence supplied the production-context skill. I made the listening decisions and rejected the bland output.

Verified evidence

22
upstream tools
52
implemented fork tools
28
generated snare notes across 8 bars
23
arrangement snare clips rebuilt
8
phased pad cycles
0
audio-return channels in this run

The ceiling was state access

The upstream Ableton MCP exposed 22 tools. The fork exposed 52 implemented tools out of 55 defined commands, including reads for notes, arrangement clips, devices, parameters, automation, groove, mixer state, and probability, plus undo, redo, and track and device management.

Claude could write MIDI. It could not read enough of the set back to know what the kick was doing before proposing a hat pattern, or see the velocity it was about to adjust. More prompting did not solve that. The model was not under-specified. It was under-informed.

State access set the ceiling.

Capability comparison55 commands defined
Read access moved the system from a narrow write surface to an inspectable one.

Randomness is not groove

The first attempt at making the drums feel alive used random velocity and random note probability. Both changes were technically valid. Both were bland. Variation that has no relationship to the events around it is noise with a respectable label.

I rejected the output and kept the lesson. Groove is a relationship between events. It requires knowing what came before and what the next hit is preparing.

Named rules beat dice.

Timing became grammar

The replacement was explicit. Anchor hits stayed on the grid. Ghost hits used a quintuplet offset at beat +0.600 followed by a septuplet offset at beat +0.571. The second ghost pulled slightly ahead of the expectation established by the first. Fills used sextuplet timing, which marked departure without reading as an arbitrary error.

A generator check on the call-and-response snare grammar produced 28 notes across 8 bars. The snare was rebuilt as two voices across 23 arrangement clips. The kit kept its groove template (129) while the snare remained deliberately ungrooved, so its written timing did not fight a second template.

The grammar was inspectable.

Call-and-response snare grammar8 bars / 28 notes
The offsets are named relationships, not random humanization.

Phrase structure became visible

A pad used 12-bar cycles against 8-bar material. Those phrase lengths realign every 24 bars, producing slow movement without an obvious reset. Eight phased 12-bar pad cycles covered bars 57 through 152.

Read access did more than prevent mistakes. It changed the kind of musical idea Claude could extend because the model could reason about arrangement form instead of isolated bars.

Context changed the available ideas.

Phrase phaserealignment every 24 bars
Eight phased 12-bar pad cycles covered bars 57 through 152.

The system became versioned

The MCP fork, production-context skill, timing grammars, provenance patterns, deploy script, and documentation were versioned together. Pattern files preserved examples from outside sources. Grammars encoded reusable production rules. The distinction matters because evidence and instruction are not the same artifact.

A deployment check passed for both Ableton remote-script targets, the local MCP server, and the Claude Code skill. The project can be reconstructed instead of remembered approximately in the next session.

The method now survives the session.

What remains unresolved

A page that only shows wins is a sales document.

  • The bass octave may be wrong and still needs a real listening decision.
  • Session and Arrangement drums diverged; the correct source is unresolved.
  • Pad presence in the drops and at the peak needs listening.
  • One arrangement automation read path reported false despite an envelope being present.

This run had no audio-return path. I remained the ears; Claude had structural eyes and hands. The structural changes above are verified. Claims about how the final arrangement sounds are pending.

What this changes

Better music did not come from a larger prompt or more random variation. It came from better state access, explicit musical grammar, and a human willing to reject technically valid blandness.

I will keep building the read side before adding more write operations. I will keep recording musical rules as testable grammars instead of hoping for emergent taste. The open question is whether an audio-return path lets Claude connect those structural decisions to what is actually coming out of the speakers.

That is the next honest test.