内容
# 鲁宾
一款极简、零依赖的MCP服务器,能将Logic Pro变成AI可演奏的乐器:编写MIDI,加载任意出厂补丁(包括Alchemy),并驱动传输。

*此截图中的所有内容均由rubin放置:五轨及其区域(以标准MIDI文件编写),每个通道条带上的Alchemy补丁(通过库加载),速度和音调。*
## 为什么它有效
以UI自动化为首的工具(每次音符都点击Logic的界面)会默默失败并读取垃圾状态。rubin则颠倒了方法:
- **编曲是一份文件,不是点击。** 音符、CC自动化、音高弯曲、速度和时间签名被写入一个真正的标准MIDI文件——确定性、可测试、无需UI。Logic在导入时将每个音轨的GM程序映射到软件乐器上。
- **补丁发现是磁盘读取,不是猜测。** Logic的约6,000个出厂补丁存储在磁盘上,合成器引擎记录在每个包中;`find_patches`按名称、类别或引擎(`Alchemy`、`Retro Synth`、`ES2`、`Sculpture`...)过滤它们。
- **UI脚本是最后的手段,并且经过验证。** 只有补丁加载、导入和传输触及UI——锚定在稳定的可访问性地标(库的“搜索声音”字段、音轨标题字段),`list_tracks`读取真实状态以确保没有任何操作默默失败。
## 工具
| 工具 | 功能 |
|------|--------------|
| `compose_midi` | 从音符/CC/弯曲/音量/声像每轨写入.mid文件 |
| `open_midi_as_project` | 在Logic中打开.mid文件作为新项目(无对话框,最可靠) |
| `import_midi` | 将MIDI文件导入打开的项目中,在第1小节 |
| `compose_and_import` | 两步合并为一个调用 |
| `transcribe_audio` | 通过[basic-pitch](https://github.com/spotify/basic-pitch)将音频转为MIDI,内容哈希缓存 |
| `list_transcriptions` | 浏览转录缓存 |
| `analyze_midi` | 总结任意.mid文件:音调猜测、范围、密度、多音、速度 |
| `find_patches` | 搜索磁盘上的出厂补丁索引(名称/类别/引擎) |
| `find_channel_strips` | 发现出厂FX链设置(.cst)——设置菜单的名称;不可在库中加载 |
| `select_track` | 选择音轨N(基于1) |
| `load_patch` | 在选定音轨上加载库补丁;返回加载的名称 |
| `list_tracks` | 从打开的项目中读取`[{name, patch}]` |
| `save_project` | 保存项目(Cmd+S);如果项目未命名,则报告工作表 |
| `transport` | 播放/停止/录制/跳转到开始 |
| `answer_dialog` | 点击Logic工作表/对话框(例如速度导入提示) |
| `logic_status` | Logic是否运行+前窗口标题 |
音符格式:`{start, dur, pitch, vel}`——start/dur以拍为单位,音高0–127(60 = 中音C),速度1–127。第9通道是GM鼓(36低音鼓,38军鼓,39拍手,42闭合帽,46开放帽)。音轨也接受`cc`(`{beat, controller, value}`)、`bends`(`{beat, value}` −8192…8191)、`program`、`volume`、`pan`。编曲接受`time_sig`(`[3, 4]`)、`key`(`"Am"`、`"Eb"`、`"F#m"`)和`tempo_changes`(`[{beat, bpm}]`)。
### 示例:三步调用Alchemy垫
```
find_patches {category: "合成器/垫", plugin: "Alchemy"}
→ [{"name": "Drifting Away", ...}, ...]
select_track {index: 3}
load_patch {query: "Drifting Away"}
→ 在选定音轨上加载补丁'Drifting Away'
```
## 耳朵:音频输入,MIDI输出
`transcribe_audio`将任何录音——哼唱的旋律、吉他弹奏、采样——通过Spotify的basic-pitch转为MIDI,内容哈希缓存至`~/.cache/rubin/midi`,因此重复调用是免费的。`analyze_midi`然后读取结果(rubin有自己的SMF解析器)并报告乐器演奏的内容:音高范围、音符密度、多音。
## 安装
```sh
claude mcp add --scope user rubin -- /usr/bin/python3 ~/dev/rubin/server.py
# 可选,用于transcribe_audio:
cd ~/dev/rubin && python3 -m venv .venv-bp && .venv-bp/bin/pip install basic-pitch
```
需要主机应用(Claude /终端)的macOS可访问性和自动化权限——仅适用于UI触摸工具。`compose_midi`、`find_patches`和`open_midi_as_project`无需任何权限。
## 测试和演示
```sh
python3 -m unittest discover -s tests # 22个测试,大多数无需Logic
python3 server.py --demo # 在Logic中编写并打开演示节奏
python3 server.py --demo --write-only # 仅编写.mid文件
```
## 文件
- `server.py` — MCP_stdio服务器(手写的JSON-RPC,无SDK)
- `midi.py` — 标准MIDI文件编写器
- `midi_read.py` — SMF解析器+每轨分析器
- `transcribe.py` — basic-pitch包装器+内容寻址缓存
- `patches.py` — 出厂补丁索引读取器
- `logic_ctl.py` — 最小化AppleScript/AX层
- `demo_beat.py` — 8小节的黑暗R&B演示(85 BPM,Am–F–C–E)
- `tests/` — 单元测试+协议测试
## 已知限制
- 补丁加载、音轨选择和导入驱动Logic的UI;它们锚定在稳定的AX地标(有界子树扫描,绝非整个窗口——真正的项目有成千上万个AX元素)上,但未来的Logic重新设计可能会移动它们。`list_tracks`存在,以便失败是可见的,而不是沉默的。
- Logic在`load_patch`后自动将音轨重命名为其补丁名称,除非音轨已手动命名。
- 在Logic Pro X 10.x/11(“Logic Pro X.app”和“Logic Pro.app”均受支持)和macOS 14+上测试通过。