livepilot 1.4.4 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +151 -136
- package/README.md +136 -61
- package/m4l_device/BUILD_GUIDE.md +161 -0
- package/m4l_device/LivePilot_Analyzer.amxd +0 -0
- package/m4l_device/LivePilot_Analyzer.maxpat +680 -0
- package/m4l_device/livepilot_bridge.js +942 -0
- package/mcp_server/__init__.py +1 -1
- package/mcp_server/connection.py +22 -16
- package/mcp_server/m4l_bridge.py +285 -0
- package/mcp_server/server.py +28 -3
- package/mcp_server/tools/analyzer.py +508 -0
- package/mcp_server/tools/clips.py +16 -12
- package/mcp_server/tools/devices.py +2 -2
- package/mcp_server/tools/mixing.py +50 -14
- package/mcp_server/tools/tracks.py +2 -2
- package/package.json +2 -3
- package/plugin/plugin.json +2 -2
- package/plugin/skills/livepilot-core/SKILL.md +52 -11
- package/plugin/skills/livepilot-core/references/overview.md +51 -5
- package/remote_script/LivePilot/__init__.py +1 -1
- package/remote_script/LivePilot/mixing.py +90 -1
- package/.mcp.json +0 -9
- package/plugin/.mcp.json +0 -8
- package/plugin/skills/livepilot-core/references/device-atlas/plugins-synths.md +0 -2012
- package/plugin/skills/livepilot-core/references/device-atlas/presets-by-vibe.md +0 -727
- package/plugin/skills/livepilot-core/references/device-atlas/samples-and-irs.md +0 -598
- package/plugin/skills/livepilot-core/references/device-atlas/synths-m4l.md +0 -730
- package/plugin/skills/livepilot-core/references/device-atlas/utility-and-workflow.md +0 -843
package/plugin/plugin.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "livepilot",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "AI copilot for Ableton Live 12 —
|
|
3
|
+
"version": "1.5.0",
|
|
4
|
+
"description": "AI copilot for Ableton Live 12 — 127 tools, device atlas (280+ devices), real-time audio analysis, and technique memory",
|
|
5
5
|
"author": "Pilot Studio",
|
|
6
6
|
"skills": [
|
|
7
7
|
"skills/livepilot-core"
|
|
@@ -1,11 +1,17 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: livepilot-core
|
|
3
|
-
description: Core discipline for controlling Ableton Live 12 through LivePilot's
|
|
3
|
+
description: Core discipline for controlling Ableton Live 12 through LivePilot's 127 MCP tools, device atlas (280+ devices), M4L analyzer (spectrum/RMS/key detection), and technique memory. Use whenever working with Ableton Live through MCP tools.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# LivePilot Core — Ableton Live 12 AI Copilot
|
|
7
7
|
|
|
8
|
-
LivePilot
|
|
8
|
+
LivePilot is an agentic production system for Ableton Live 12. It combines 127 MCP tools with three layers of intelligence:
|
|
9
|
+
|
|
10
|
+
- **Device Atlas** — A structured knowledge corpus of 280+ instruments, 139 drum kits, and 350+ impulse responses. Consult the atlas before loading any device. It contains real browser URIs, preset names, and sonic descriptions. Never guess a device name — look it up.
|
|
11
|
+
- **M4L Analyzer** — Real-time audio analysis on the master bus (8-band spectrum, RMS/peak, key detection). Use it to verify mixing decisions, detect frequency problems, and find the key before writing harmonic content.
|
|
12
|
+
- **Technique Memory** — Persistent storage for production decisions. Consult `memory_recall` before creative tasks to understand the user's taste. Save techniques when the user likes something. The memory shapes future decisions without constraining them.
|
|
13
|
+
|
|
14
|
+
These layers sit on top of 127 deterministic tools across 11 domains: transport, tracks, clips, MIDI notes, devices, scenes, mixing, browser, arrangement, technique memory, and real-time DSP analysis.
|
|
9
15
|
|
|
10
16
|
## Golden Rules
|
|
11
17
|
|
|
@@ -58,7 +64,7 @@ LivePilot gives you 104 MCP tools to control Ableton Live 12 in real-time: trans
|
|
|
58
64
|
- MIDI track with no instrument loaded
|
|
59
65
|
- Notes programmed but clip not fired
|
|
60
66
|
|
|
61
|
-
## Tool Domains (
|
|
67
|
+
## Tool Domains (127 total)
|
|
62
68
|
|
|
63
69
|
### Transport (12)
|
|
64
70
|
`get_session_info` · `set_tempo` · `set_time_signature` · `start_playback` · `stop_playback` · `continue_playback` · `toggle_metronome` · `set_session_loop` · `undo` · `redo` · `get_recent_actions` · `get_session_diagnostics`
|
|
@@ -78,8 +84,8 @@ LivePilot gives you 104 MCP tools to control Ableton Live 12 in real-time: trans
|
|
|
78
84
|
### Scenes (8)
|
|
79
85
|
`get_scenes_info` · `create_scene` · `delete_scene` · `duplicate_scene` · `fire_scene` · `set_scene_name` · `set_scene_color` · `set_scene_tempo`
|
|
80
86
|
|
|
81
|
-
### Mixing (
|
|
82
|
-
`set_track_volume` · `set_track_pan` · `set_track_send` · `get_return_tracks` · `get_master_track` · `set_master_volume` · `get_track_routing` · `set_track_routing`
|
|
87
|
+
### Mixing (11)
|
|
88
|
+
`set_track_volume` · `set_track_pan` · `set_track_send` · `get_return_tracks` · `get_master_track` · `set_master_volume` · `get_track_routing` · `set_track_routing` · `get_track_meters` · `get_master_meters` · `get_mix_snapshot`
|
|
83
89
|
|
|
84
90
|
### Browser (4)
|
|
85
91
|
`get_browser_tree` · `get_browser_items` · `search_browser` · `load_browser_item`
|
|
@@ -90,6 +96,9 @@ LivePilot gives you 104 MCP tools to control Ableton Live 12 in real-time: trans
|
|
|
90
96
|
### Memory (8)
|
|
91
97
|
`memory_learn` · `memory_recall` · `memory_get` · `memory_replay` · `memory_list` · `memory_favorite` · `memory_update` · `memory_delete`
|
|
92
98
|
|
|
99
|
+
### Analyzer (20) — requires LivePilot Analyzer M4L device on master track
|
|
100
|
+
`get_master_spectrum` · `get_master_rms` · `get_detected_key` · `get_hidden_parameters` · `get_automation_state` · `walk_device_tree` · `get_clip_file_path` · `replace_simpler_sample` · `load_sample_to_simpler` · `get_simpler_slices` · `crop_simpler` · `reverse_simpler` · `warp_simpler` · `get_warp_markers` · `add_warp_marker` · `move_warp_marker` · `remove_warp_marker` · `scrub_clip` · `stop_scrub` · `get_display_values`
|
|
101
|
+
|
|
93
102
|
## Workflow: Building a Beat
|
|
94
103
|
|
|
95
104
|
1. `get_session_info` — check current state
|
|
@@ -120,11 +129,43 @@ LivePilot gives you 104 MCP tools to control Ableton Live 12 in real-time: trans
|
|
|
120
129
|
## Workflow: Mixing
|
|
121
130
|
|
|
122
131
|
1. `get_session_info` — see all tracks and current levels
|
|
123
|
-
2. `
|
|
124
|
-
3. `
|
|
125
|
-
4. `
|
|
126
|
-
5. `
|
|
127
|
-
6. `
|
|
132
|
+
2. `get_mix_snapshot` — one-call overview of all levels, panning, routing, mute/solo
|
|
133
|
+
3. `set_track_volume` / `set_track_pan` — set levels and stereo position
|
|
134
|
+
4. `set_track_send` — route to return tracks for shared effects
|
|
135
|
+
5. `get_return_tracks` — check return track setup
|
|
136
|
+
6. `set_master_volume` — final output level
|
|
137
|
+
7. `set_track_routing` — configure input/output routing
|
|
138
|
+
8. `get_track_meters` / `get_master_meters` — check real-time output levels
|
|
139
|
+
|
|
140
|
+
### With LivePilot Analyzer (M4L device on master):
|
|
141
|
+
9. `get_master_spectrum` — check frequency balance across 8 bands (sub → air)
|
|
142
|
+
10. `get_master_rms` — true RMS and peak levels
|
|
143
|
+
11. `get_detected_key` — detect musical key before writing harmonies/bass
|
|
144
|
+
12. `get_hidden_parameters` — see ALL device params including hidden ones
|
|
145
|
+
13. `get_automation_state` — check which params have automation before overwriting
|
|
146
|
+
14. `walk_device_tree` — inspect nested racks and drum pads
|
|
147
|
+
15. `get_display_values` — human-readable parameter values ("440 Hz", "-6 dB")
|
|
148
|
+
|
|
149
|
+
## Workflow: Sample Chopping
|
|
150
|
+
|
|
151
|
+
1. Resample your beat to an audio track (set input to Resampling, arm, record)
|
|
152
|
+
2. `get_clip_file_path` — get the audio file path of the recorded clip
|
|
153
|
+
3. Load Simpler on a new MIDI track (with any sample pre-loaded)
|
|
154
|
+
4. `replace_simpler_sample` — load the resampled audio into Simpler
|
|
155
|
+
5. `set_simpler_playback_mode` — set to Slice mode
|
|
156
|
+
6. `get_simpler_slices` — see all auto-detected slice points
|
|
157
|
+
7. Program MIDI patterns targeting slice indices
|
|
158
|
+
8. Use `reverse_simpler` / `crop_simpler` / `warp_simpler` for transformations
|
|
159
|
+
9. `get_master_spectrum` — verify the result through the analyzer
|
|
160
|
+
|
|
161
|
+
## Workflow: Time Manipulation
|
|
162
|
+
|
|
163
|
+
1. `get_warp_markers` — see current timing map of an audio clip
|
|
164
|
+
2. `add_warp_marker` — pin key beats (downbeats, snare hits)
|
|
165
|
+
3. `move_warp_marker` — stretch/compress specific segments for tempo effects
|
|
166
|
+
4. `scrub_clip` / `stop_scrub` — preview specific positions
|
|
167
|
+
5. `get_master_spectrum` — verify the result sounds right
|
|
168
|
+
6. `remove_warp_marker` — clean up if needed
|
|
128
169
|
|
|
129
170
|
## Live 12 Note API
|
|
130
171
|
|
|
@@ -199,7 +240,7 @@ Deep production knowledge lives in `references/`. Consult these when making crea
|
|
|
199
240
|
|
|
200
241
|
| File | What's inside | When to consult |
|
|
201
242
|
|------|--------------|-----------------|
|
|
202
|
-
| `references/overview.md` | All
|
|
243
|
+
| `references/overview.md` | All 127 tools mapped with params, units, ranges | Quick lookup for any tool |
|
|
203
244
|
| `references/midi-recipes.md` | Drum patterns by genre, chord voicings, scales, hi-hat techniques, humanization, polymetrics | Programming MIDI notes, building beats |
|
|
204
245
|
| `references/sound-design.md` | Stock instruments/effects, parameter recipes for bass/pad/lead/pluck, device chain patterns | Loading and configuring devices |
|
|
205
246
|
| `references/mixing-patterns.md` | Gain staging, parallel compression, sidechain, EQ by instrument, bus processing, stereo width | Setting volumes, panning, adding effects |
|
|
@@ -1,20 +1,38 @@
|
|
|
1
|
-
# LivePilot Architecture & Tool Reference
|
|
1
|
+
# LivePilot v1.5.0 — Architecture & Tool Reference
|
|
2
2
|
|
|
3
|
-
LivePilot is an
|
|
3
|
+
LivePilot is an agentic production system for Ableton Live 12. It combines 127 MCP tools with a device knowledge corpus, real-time audio analysis, and persistent technique memory.
|
|
4
4
|
|
|
5
5
|
## Architecture
|
|
6
6
|
|
|
7
7
|
```
|
|
8
|
-
|
|
8
|
+
AI Client ──MCP──► FastMCP Server ──TCP/9878──► Remote Script (inside Ableton)
|
|
9
9
|
(validates) (executes on main thread)
|
|
10
|
+
│
|
|
11
|
+
├── Device Atlas (280+ devices, 139 kits, 350+ IRs)
|
|
12
|
+
├── M4L Analyzer ──UDP/OSC──► LivePilot_Analyzer.amxd
|
|
13
|
+
└── Technique Memory (~/.livepilot/memory/)
|
|
10
14
|
```
|
|
11
15
|
|
|
12
16
|
- **MCP Server** validates inputs (ranges, types) before sending
|
|
13
17
|
- **Remote Script** runs inside Ableton's Python environment, executes on the main thread via `schedule_message`
|
|
18
|
+
- **Device Atlas** provides structured knowledge of Ableton's device library — real names, real URIs, sonic descriptions
|
|
19
|
+
- **M4L Analyzer** reads the master bus in real-time: 8-band spectrum, RMS/peak, pitch tracking, Krumhansl-Schmuckler key detection
|
|
20
|
+
- **Technique Memory** persists production decisions across sessions as typed, searchable, replayable data structures
|
|
14
21
|
- **Protocol**: JSON over TCP, newline-delimited. Every command gets a response.
|
|
15
22
|
- **Thread safety**: All Live Object Model (LOM) access happens on Ableton's main thread
|
|
16
23
|
|
|
17
|
-
## The
|
|
24
|
+
## The Agentic Difference
|
|
25
|
+
|
|
26
|
+
A flat tool list lets the AI press buttons. LivePilot's three layers give it context:
|
|
27
|
+
|
|
28
|
+
1. **Before loading a device** — the agent consults the atlas to find a real preset, not a hallucinated name
|
|
29
|
+
2. **Before writing harmonic content** — the agent reads the detected key from the analyzer
|
|
30
|
+
3. **Before making creative decisions** — the agent checks technique memory for the user's style preferences
|
|
31
|
+
4. **After every mixing move** — the agent reads the spectrum to verify the result
|
|
32
|
+
|
|
33
|
+
This turns "set EQ band 3 to -4 dB" into "cut 400 Hz by 4 dB, then read the spectrum to confirm the mud is actually reduced."
|
|
34
|
+
|
|
35
|
+
## The 127 Tools — What Each One Does
|
|
18
36
|
|
|
19
37
|
### Transport (12) — Playback, tempo, global state, diagnostics
|
|
20
38
|
|
|
@@ -122,7 +140,7 @@ Claude Code ──MCP──► FastMCP Server ──TCP/9878──► Remote
|
|
|
122
140
|
| `set_scene_color` | Sets scene color | `scene_index`, `color_index` (0-69) |
|
|
123
141
|
| `set_scene_tempo` | Sets tempo that triggers when scene fires | `scene_index`, `tempo` (20-999 BPM) |
|
|
124
142
|
|
|
125
|
-
### Mixing (
|
|
143
|
+
### Mixing (11) — Levels, panning, routing, metering
|
|
126
144
|
|
|
127
145
|
| Tool | What it does | Key params |
|
|
128
146
|
|------|-------------|------------|
|
|
@@ -134,6 +152,9 @@ Claude Code ──MCP──► FastMCP Server ──TCP/9878──► Remote
|
|
|
134
152
|
| `set_master_volume` | Sets master output level | `volume` (0.0-1.0) |
|
|
135
153
|
| `get_track_routing` | Returns input/output routing config | `track_index` |
|
|
136
154
|
| `set_track_routing` | Configures input/output routing | `track_index`, routing params |
|
|
155
|
+
| `get_track_meters` | Returns real-time output levels for a track | `track_index` |
|
|
156
|
+
| `get_master_meters` | Returns real-time output levels for the master | — |
|
|
157
|
+
| `get_mix_snapshot` | Returns all levels, panning, routing, mute/solo state for entire session | — |
|
|
137
158
|
|
|
138
159
|
### Browser (4) — Finding and loading presets/devices
|
|
139
160
|
|
|
@@ -181,6 +202,31 @@ Claude Code ──MCP──► FastMCP Server ──TCP/9878──► Remote
|
|
|
181
202
|
| `memory_update` | Updates name, tags, or qualities | `technique_id`, `name`, `tags`, `qualities` |
|
|
182
203
|
| `memory_delete` | Removes technique (backs up first) | `technique_id` |
|
|
183
204
|
|
|
205
|
+
### Analyzer (20) — Real-time DSP analysis (requires LivePilot Analyzer M4L device on master track)
|
|
206
|
+
|
|
207
|
+
| Tool | What it does | Key params |
|
|
208
|
+
|------|-------------|------------|
|
|
209
|
+
| `get_master_spectrum` | 8-band spectral analysis of master output | — |
|
|
210
|
+
| `get_master_rms` | True RMS and peak amplitude levels | — |
|
|
211
|
+
| `get_detected_key` | Detects musical key (Krumhansl-Schmuckler) | — |
|
|
212
|
+
| `get_hidden_parameters` | All device parameters including hidden ones | `track_index`, `device_index` |
|
|
213
|
+
| `get_automation_state` | Parameters with active automation | `track_index`, `device_index` |
|
|
214
|
+
| `walk_device_tree` | Recursive device tree (racks, drum pads, 6 levels) | `track_index`, `device_index` |
|
|
215
|
+
| `get_clip_file_path` | Audio file path on disk | `track_index`, `clip_index` |
|
|
216
|
+
| `replace_simpler_sample` | Replace sample in Simpler | `track_index`, `device_index`, `file_path` |
|
|
217
|
+
| `load_sample_to_simpler` | Bootstrap Simpler and load sample (full workflow) | `track_index`, `file_path` |
|
|
218
|
+
| `get_simpler_slices` | Slice points from Simpler | `track_index`, `device_index` |
|
|
219
|
+
| `crop_simpler` | Crop sample to active region | `track_index`, `device_index` |
|
|
220
|
+
| `reverse_simpler` | Reverse sample | `track_index`, `device_index` |
|
|
221
|
+
| `warp_simpler` | Warp sample to N beats | `track_index`, `device_index`, `beats` |
|
|
222
|
+
| `get_warp_markers` | All warp markers (beat_time + sample_time) | `track_index`, `clip_index` |
|
|
223
|
+
| `add_warp_marker` | Add warp marker | `track_index`, `clip_index`, `beat_time` |
|
|
224
|
+
| `move_warp_marker` | Move warp marker | `track_index`, `clip_index`, `old_beat`, `new_beat` |
|
|
225
|
+
| `remove_warp_marker` | Remove warp marker | `track_index`, `clip_index`, `beat_time` |
|
|
226
|
+
| `scrub_clip` | Preview audio at position | `track_index`, `clip_index`, `beat_time` |
|
|
227
|
+
| `stop_scrub` | Stop preview | `track_index`, `clip_index` |
|
|
228
|
+
| `get_display_values` | Human-readable parameter values ("440 Hz", "-6 dB") | `track_index`, `device_index` |
|
|
229
|
+
|
|
184
230
|
## Units & Ranges Quick Reference
|
|
185
231
|
|
|
186
232
|
| Concept | Unit/Range | Notes |
|
|
@@ -31,7 +31,7 @@ class LivePilot(ControlSurface):
|
|
|
31
31
|
ControlSurface.__init__(self, c_instance)
|
|
32
32
|
self._server = LivePilotServer(self)
|
|
33
33
|
self._server.start()
|
|
34
|
-
self.log_message("LivePilot v1.
|
|
34
|
+
self.log_message("LivePilot v1.5.0 initialized")
|
|
35
35
|
self.show_message("LivePilot: Listening on port 9878")
|
|
36
36
|
|
|
37
37
|
def disconnect(self):
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"""
|
|
2
|
-
LivePilot - Mixing domain handlers (
|
|
2
|
+
LivePilot - Mixing domain handlers (11 commands).
|
|
3
3
|
"""
|
|
4
4
|
|
|
5
5
|
from .router import register
|
|
@@ -114,6 +114,95 @@ def get_track_routing(song, params):
|
|
|
114
114
|
return result
|
|
115
115
|
|
|
116
116
|
|
|
117
|
+
@register("get_track_meters")
|
|
118
|
+
def get_track_meters(song, params):
|
|
119
|
+
"""Read output meter levels for one or all tracks.
|
|
120
|
+
|
|
121
|
+
Returns peak level (0.0-1.0) for each track. When track_index is
|
|
122
|
+
provided, returns a single track. Otherwise returns all tracks.
|
|
123
|
+
|
|
124
|
+
The 'level' value is the hold-peak of max(L, R). It's cheap to read.
|
|
125
|
+
The 'left'/'right' values add GUI load — only included when
|
|
126
|
+
include_stereo=True.
|
|
127
|
+
"""
|
|
128
|
+
include_stereo = bool(params.get("include_stereo", False))
|
|
129
|
+
track_index = params.get("track_index")
|
|
130
|
+
|
|
131
|
+
def read_meters(track, idx):
|
|
132
|
+
entry = {
|
|
133
|
+
"index": idx,
|
|
134
|
+
"name": track.name,
|
|
135
|
+
"level": track.output_meter_level,
|
|
136
|
+
}
|
|
137
|
+
if include_stereo:
|
|
138
|
+
entry["left"] = track.output_meter_left
|
|
139
|
+
entry["right"] = track.output_meter_right
|
|
140
|
+
return entry
|
|
141
|
+
|
|
142
|
+
if track_index is not None:
|
|
143
|
+
track = get_track(song, int(track_index))
|
|
144
|
+
return {"tracks": [read_meters(track, int(track_index))]}
|
|
145
|
+
|
|
146
|
+
tracks = []
|
|
147
|
+
for i, track in enumerate(song.tracks):
|
|
148
|
+
tracks.append(read_meters(track, i))
|
|
149
|
+
return {"tracks": tracks}
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
@register("get_master_meters")
|
|
153
|
+
def get_master_meters(song, params):
|
|
154
|
+
"""Read output meter levels for the master track."""
|
|
155
|
+
master = song.master_track
|
|
156
|
+
result = {
|
|
157
|
+
"level": master.output_meter_level,
|
|
158
|
+
"left": master.output_meter_left,
|
|
159
|
+
"right": master.output_meter_right,
|
|
160
|
+
}
|
|
161
|
+
return result
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
@register("get_mix_snapshot")
|
|
165
|
+
def get_mix_snapshot(song, params):
|
|
166
|
+
"""Get a complete snapshot of the mix: all track levels, volumes, pans,
|
|
167
|
+
mute/solo states, and master meters. One call to assess the full mix."""
|
|
168
|
+
tracks = []
|
|
169
|
+
for i, track in enumerate(song.tracks):
|
|
170
|
+
tracks.append({
|
|
171
|
+
"index": i,
|
|
172
|
+
"name": track.name,
|
|
173
|
+
"meter_level": track.output_meter_level,
|
|
174
|
+
"volume": track.mixer_device.volume.value,
|
|
175
|
+
"pan": track.mixer_device.panning.value,
|
|
176
|
+
"mute": track.mute,
|
|
177
|
+
"solo": track.solo,
|
|
178
|
+
"has_audio_output": track.has_audio_output,
|
|
179
|
+
})
|
|
180
|
+
returns = []
|
|
181
|
+
for i, track in enumerate(song.return_tracks):
|
|
182
|
+
returns.append({
|
|
183
|
+
"index": i,
|
|
184
|
+
"name": track.name,
|
|
185
|
+
"meter_level": track.output_meter_level,
|
|
186
|
+
"volume": track.mixer_device.volume.value,
|
|
187
|
+
"pan": track.mixer_device.panning.value,
|
|
188
|
+
"mute": track.mute,
|
|
189
|
+
"solo": track.solo,
|
|
190
|
+
})
|
|
191
|
+
master = song.master_track
|
|
192
|
+
return {
|
|
193
|
+
"tracks": tracks,
|
|
194
|
+
"return_tracks": returns,
|
|
195
|
+
"master": {
|
|
196
|
+
"level": master.output_meter_level,
|
|
197
|
+
"left": master.output_meter_left,
|
|
198
|
+
"right": master.output_meter_right,
|
|
199
|
+
"volume": master.mixer_device.volume.value,
|
|
200
|
+
},
|
|
201
|
+
"is_playing": song.is_playing,
|
|
202
|
+
"tempo": song.tempo,
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
|
|
117
206
|
@register("set_track_routing")
|
|
118
207
|
def set_track_routing(song, params):
|
|
119
208
|
"""Set input/output routing for a track by display name."""
|
package/.mcp.json
DELETED