内容
# Ableton AI
通过像Claude这样的AI助手控制Ableton Live。你用日常语言描述你想要的效果,它就会在你的Live集合中构建:音轨、乐器、效果、MIDI剪辑、自动化和混音。涵盖了Live对象模型的大部分,约有130个命令。
你描述,它构建,你聆听并评判。助手没有耳朵,所以它处理机械工作,而你保持品味。
## 你可以做的事情
要求一个声音并让它构建:
```text
在新音轨上创建一个黑暗的环境垫。缓慢的攻击,长时间的释放,
在其后添加一个带有缓慢LFO的滤波器来控制截止频率。播放小调和弦。
```
要求你手动不愿做的事情:
```text
编写六个剪辑,长度分别为3、5、7、11、13和17个小节。它们是互质的,
所以循环不会重复超过一百万个小节。
```
```text
绘制一个12分钟的滤波器扫描,包含200个自动化点,然后为军鼓添加每个音符的概率,
使它们闪烁而不是重复。
```
要求以某种风格创作一整段音乐:
```text
制作一个史蒂夫·赖希风格的相位作品。两条钢琴音轨播放相同的短单元;
让一个剪辑比另一个长一小节,以便它们逐渐失去同步并慢慢重新同步。
添加一个马林巴琴和一个倍音阶铃声,重复播放单元的片段,
使各部分相互连接且永不完全重复。
```
要求它修复你刚刚听到的内容:
```text
低音太安静了,混响太湿了。把它们拉回来。
```
## 工作原理
助手通过[模型上下文协议](https://modelcontextprotocol.io)(MCP)与Ableton通信,这是一个开放的标准,允许AI工具访问外部系统。该项目是一个MCP服务器,通过一组工具暴露Ableton的Live对象模型,供助手调用。
有两个部分:
MCP服务器作为自己的进程在您的机器上运行。您的AI客户端(Claude Code、Claude Desktop、Cursor)启动它并调用其工具。
一个远程脚本在Ableton内部运行。Ableton的控制表面系统允许您在Live中运行Python,该脚本打开一个本地套接字,MCP服务器通过它进行通信。这是进入Live API的唯一支持方式,因此它必须是Python,并且必须在Ableton的设置中启用。
当您请求某些内容时,助手调用一个工具,服务器通过套接字发送命令,远程脚本针对Live API运行它,结果返回。您可以在Ableton中实时看到它发生。
## 安装
您需要Ableton Live 11或更新版本,以及[uv](https://docs.astral.sh/uv/)。
首先,将远程脚本安装到Live中。这是运行在Ableton内部的部分:
```bash
uvx --from ableton-ai install-remote-script
```
然后连接您的AI客户端。
对于Claude Code:
```bash
claude mcp add ableton -s user -- uvx ableton-ai
```
对于Claude Desktop,请在`claude_desktop_config.json`中添加以下内容(在设置、开发者、编辑配置下找到):
```json
{
"mcpServers": {
"ableton": {
"command": "uvx",
"args": ["ableton-ai"]
}
}
}
```
在任一情况下,请重新启动您的AI客户端,以便它拾取新的服务器。
最后,在Ableton中启用远程脚本。打开设置,然后链接、速度和MIDI。在控制表面下,选择AbletonMCP。输入和输出均设置为无。
Ableton的状态栏应该会闪烁`AbletonMCP: Listening for commands on port 9877`。如果它没有出现,远程脚本就没有安装,所以请重新运行第一步并重新启动Live。
## 入门
打开一个Live集合,您不介意弄乱,然后向您的助手提供以下信息:
```text
您正在控制我的Ableton Live集合。您制作的任何内容我都听不到,
所以不要告诉我它听起来很好。构建我要求的内容,读取设置以检查它们是否生效,
让我来判断。
Live中的某些内容是下拉菜单,您无法通过API设置:LFO映射按钮,
压缩器的侧链源,Drift的调制矩阵路由。如果您需要其中之一,请告诉我,我会点击它。
开始吧:创建一个MIDI音轨,加载Drift,并使用缓慢的攻击和长时间的释放构建环境垫。
在其后添加一个带有缓慢LFO的滤波器来控制截止频率。播放小调和弦并循环它。
```
第一段话值得保存。它可以帮助您避免每次会话都重复解释相同的事情。更好的是,安装下面的技能,它教会您的助手如何使用这些工具:每个命令期望的参数名称,如何验证更改实际生效,如何访问鼓组,以及如何使用互质循环和音符概率构建生成性补丁。
## 技能
如果您使用Claude Code,`skills/ableton`目录中有一个技能,可以教会助手如何熟练使用这些工具:每个命令期望的参数名称,如何验证更改实际生效,如何访问鼓组,以及如何使用互质循环和音符概率构建生成性补丁。
安装它:
```bash
mkdir -p ~/.claude/skills
cp -R skills/ableton ~/.claude/skills/
```
重启Claude Code。它会在您请求音乐时自动加载技能。
## 使用本地模型代替Claude
如果您不想使用MCP客户端,有一个HTTP服务器提供相同的命令。这样,您可以使用本地模型(如Ollama)或可以发出HTTP请求的任何内容驱动Ableton。
在单独的终端中启动它:
```bash
uv run python rest_api/rest_api_server.py
```
它监听`http://127.0.0.1:8000`。每个命令都是一个POST到`/api/command`,带有`command`和`params`,与工具使用的名称相同。例如,创建MIDI音轨:
```bash
curl -X POST http://127.0.0.1:8000/api/command \
-H "Content-Type: application/json" \
-d '{"command": "create_midi_track", "params": {"index": -1}}'
```
要将其连接到本地模型,请为模型提供一个发布到该端点的工具,然后让它填写命令和参数。Python中的最小循环:
```python
import requests
def ableton(command, params=None):
return requests.post(
"http://127.0.0.1:8000/api/command",
json={"command": command, "params": params or {}},
).json()
ableton("set_tempo", {"tempo": 124})
ableton("create_midi_track", {"index": -1})
```
`GET /api/commands`列出服务器接受的每个命令,`GET /health`告诉您Ableton是否连接。服务器需要远程脚本安装并启用,与MCP路径相同。
## 编辑远程脚本
如果您更改了远程脚本,Ableton需要重启才能加载它,因为Live缓存了编译后的字节码。保存您的集合,将更新的文件复制到位,然后重启Live。切换控制表面开/关不可靠。
## 安全
远程脚本在`localhost:9877`打开一个未经身份验证的套接字。它在网络上无法访问,但任何以您的身份运行的进程都可以通过它控制Ableton。
更实际的一点:助手有130个更改您项目的命令,它听不到它正在执行的操作。它偶尔会清除您关心的某些内容。请在副本上工作,经常保存,并依赖Cmd+Z,它涵盖了大多数操作。
## 测试
```bash
uv sync --all-extras
uv run pytest
uv run ruff check src tests
uv run mypy
```
## 架构
如果您想使用它,以下是各个部分如何组合。早些时候的“工作原理”部分是简短的版本;这是更长的版本。
有两个进程,它们不共享内存。第一个是MCP服务器,是[src/ableton_ai](https://github.com/freekmurze/ableton-ai/tree/main/src/ableton_ai)下的一个普通的Python包。第二个是远程脚本,位于[remote_script](https://github.com/freekmurze/ableton-ai/blob/main/remote_script/__init__.py),它在Ableton自己的嵌入式Python解释器中运行。它们通过localhost:9877上的TCP套接字相互通信,相互传递JSON。
MCP服务器是您的AI客户端通信的对象。 [server.py](https://github.com/freekmurze/ableton-ai/blob/main/src/ableton_ai/server.py)构建了一个[FastMCP](https://modelcontextprotocol.io)服务器,并注册了每个工具。工具位于[src/ableton_ai/tools](https://github.com/freekmurze/ableton-ai/tree/main/src/ableton_ai/tools),按它们所影响的内容分开: [tracks](https://github.com/freekmurze/ableton-ai/blob/main/src/ableton_ai/tools/tracks.py), [clips](https://github.com/freekmurze/ableton-ai/blob/main/src/ableton_ai/tools/clips.py), [notes](https://github.com/freekmurze/ableton-ai/blob/main/src/ableton_ai/tools/notes.py), [devices](https://github.com/freekmurze/ableton-ai/blob/main/src/ableton_ai/tools/devices.py), [browser](https://github.com/freekmurze/ableton-ai/blob/main/src/ableton_ai/tools/browser.py), [automation](https://github.com/freekmurze/ableton-ai/blob/main/src/ableton_ai/tools/automation.py), [arrangement](https://github.com/freekmurze/ableton-ai/blob/main/src/ableton_ai/tools/arrangement.py), [session](https://github.com/freekmurze/ableton-ai/blob/main/src/ableton_ai/tools/session.py),以及一些音乐辅助工具。每个工具都是一个小的函数,用[@tool](https://github.com/freekmurze/ableton-ai/blob/main/src/ableton_ai/tools/_base.py)装饰,注册它并用统一的错误处理包装它,因此工具体通常只有两行:发送命令,格式化结果。没有工具持有状态。它们都通过[connection.py](https://github.com/freekmurze/ableton-ai/blob/main/src/ableton_ai/connection.py)中的共享`AbletonConnection`进行,拥有套接字并在锁后面序列化每个交换,因为套接字一次处理一个命令。
远程脚本是可以实际触摸Live的部分。Ableton的控制表面系统是唯一支持的方式 在Live中运行代码并访问其API,它只运行Python,这就是为什么这部分是Python,无论是什么。 当Live加载脚本时,它打开套接字并等待。 命令以JSON形式传入,脚本查找,运行它对抗Live的API,并发送结果。
值得注意的一点是线程。套接字在后台线程上运行,但Live的API只能安全地从Live的主线程访问。 因此,任何更改某些内容(创建音轨,设置参数,写入音符)的命令都会被放入队列并在主线程上运行,而只读命令可以直接从套接字线程回答。 这不是装饰。 从错误线程进行状态更改会直接导致Live崩溃,这是此代码库已经发生并修复的错误。
一个请求从头到尾:您请求一个音轨,助手调用[`create_midi_track`](https://github.com/freekmurze/ableton-ai/blob/main/src/ableton_ai/tools/tracks.py)工具,服务器发送`{"type": "create_midi_track", ...}`通过套接字,远程脚本将其排队到Live的主线程,Live创建音轨,结果通过套接字返回工具,工具返回助手读取的句子。 当它发生时,您在Ableton中看到音轨的出现。
最后一部分是[`rest_api`](https://github.com/freekmurze/ableton-ai/tree/main/rest_api),一个可选的HTTP服务器,它将相同的命令暴露给不支持MCP的客户端,如本地Ollama模型。 除非您想要它,否则它不需要用于Claude工作流程。
## 致谢
基于Siddharth Ahuja和Jason Poindexter的原始AbletonMCP,并感谢calclavia和Ronbalt。
## 许可证
MIT。 见[LICENSE](LICENSE)。