livepilot 1.9.20 → 1.9.21
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/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +8 -0
- package/livepilot/.Codex-plugin/plugin.json +1 -1
- package/livepilot/.claude-plugin/plugin.json +1 -1
- package/livepilot/skills/livepilot-core/SKILL.md +7 -0
- package/livepilot/skills/livepilot-core/references/overview.md +1 -1
- package/m4l_device/livepilot_bridge.js +1 -1
- package/mcp_server/__init__.py +1 -1
- package/mcp_server/tools/automation.py +26 -0
- package/package.json +1 -1
- package/remote_script/LivePilot/__init__.py +1 -1
- package/remote_script/LivePilot/devices.py +12 -2
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
{
|
|
11
11
|
"name": "livepilot",
|
|
12
12
|
"description": "Agentic production system for Ableton Live 12 — 237 tools, 32 domains, device atlas, spectral perception, technique memory, neo-Riemannian harmony, Euclidean rhythm, species counterpoint, MIDI I/O",
|
|
13
|
-
"version": "1.9.
|
|
13
|
+
"version": "1.9.21",
|
|
14
14
|
"author": {
|
|
15
15
|
"name": "Pilot Studio"
|
|
16
16
|
},
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.9.21 — Verification Discipline Pass (April 2026)
|
|
4
|
+
|
|
5
|
+
### Systemic Fixes
|
|
6
|
+
- **fix(devices):** `set_device_parameter` and `batch_set_parameters` now return `value_string`, `min`, `max` in response — the agent can immediately see "26.0 Hz" instead of just "75" and catch nonsensical values
|
|
7
|
+
- **fix(automation):** `apply_automation_recipe` now auto-scales 0-1 recipe curves to the target parameter's actual native range (e.g., Auto Filter 20-135, Bit Depth 1-16). Previously, a "0.3 center" vinyl_crackle on a 20-135 range wrote 0.3 literally, killing audio
|
|
8
|
+
- **fix(automation):** `auto_pan` recipe pan values now clamped to ±0.6 to prevent full L/R swing that makes tracks disappear from one channel
|
|
9
|
+
- **docs(skill):** Added Golden Rules 15-16 — mandatory post-write verification protocol: always read `value_string`, always check track meters after filter/effect changes, never apply automation recipes without understanding the target parameter's range
|
|
10
|
+
|
|
3
11
|
## 1.9.20 — Deep Production Test Pass (April 2026)
|
|
4
12
|
|
|
5
13
|
### New Tool
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "livepilot",
|
|
3
|
-
"version": "1.9.
|
|
3
|
+
"version": "1.9.21",
|
|
4
4
|
"description": "Agentic production system for Ableton Live 12 — 237 tools, 32 domains, device atlas, spectral perception, technique memory, neo-Riemannian harmony, Euclidean rhythm, species counterpoint, MIDI I/O",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Pilot Studio"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "livepilot",
|
|
3
|
-
"version": "1.9.
|
|
3
|
+
"version": "1.9.21",
|
|
4
4
|
"description": "Agentic production system for Ableton Live 12 — 237 tools, 32 domains, device atlas, spectral perception, technique memory, neo-Riemannian harmony, Euclidean rhythm, species counterpoint, MIDI I/O",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Pilot Studio"
|
|
@@ -27,6 +27,13 @@ Agentic production system for Ableton Live 12. 237 tools across 32 domains, thre
|
|
|
27
27
|
12. **ALWAYS report tool errors** — never silently swallow errors. Include: tool name, error message, fallback plan
|
|
28
28
|
13. **Verify plugin health after loading** — check `health_flags`, `mcp_sound_design_ready`, `plugin_host_status`. If `parameter_count` <= 1 on AU/VST → dead plugin, delete and replace
|
|
29
29
|
14. **Use `C hijaz` for Hijaz/Phrygian Dominant keys** — avoids false out-of-key warnings
|
|
30
|
+
15. **VERIFY AFTER EVERY WRITE** — mandatory, non-negotiable:
|
|
31
|
+
- After `set_device_parameter` or `batch_set_parameters`: read `value_string` in the response to confirm the actual Hz/dB/% value makes sense
|
|
32
|
+
- After any filter, EQ, or effect parameter change: call `get_track_meters(include_stereo=true)` and verify the target track has non-zero left AND right levels
|
|
33
|
+
- After `apply_automation_recipe`: check that the recipe didn't push the parameter to an extreme that kills audio
|
|
34
|
+
- If a track's stereo output drops to 0: the effect is killing the signal — check `get_device_parameters` for `value_string`, fix, re-verify
|
|
35
|
+
- **Parameter ranges are NOT always 0-1.** Auto Filter Frequency is 20-135. Bit Depth is 1-16. Always read `value_string` to see actual units.
|
|
36
|
+
16. **NEVER apply automation recipes without understanding the target parameter's range** — recipes generate 0-1 curves that get auto-scaled for device parameters, but always verify the result
|
|
30
37
|
|
|
31
38
|
## Tool Speed Tiers
|
|
32
39
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# LivePilot v1.9.
|
|
1
|
+
# LivePilot v1.9.21 — Architecture & Tool Reference
|
|
2
2
|
|
|
3
3
|
Agentic production system for Ableton Live 12. 237 tools across 32 domains. Device atlas (280+ devices), spectral perception (M4L analyzer), technique memory, automation intelligence (16 curve types, 15 recipes), music theory (Krumhansl-Schmuckler, species counterpoint), generative algorithms (Euclidean rhythm, tintinnabuli, phase shift, additive process), neo-Riemannian harmony (PRL transforms, Tonnetz), MIDI file I/O.
|
|
4
4
|
|
package/mcp_server/__init__.py
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"""LivePilot MCP Server — bridges MCP protocol to Ableton Live."""
|
|
2
|
-
__version__ = "1.9.
|
|
2
|
+
__version__ = "1.9.21"
|
|
@@ -341,6 +341,32 @@ def apply_automation_recipe(
|
|
|
341
341
|
|
|
342
342
|
points = generate_from_recipe(recipe, duration=duration, density=density)
|
|
343
343
|
|
|
344
|
+
# Scale recipe's 0.0-1.0 curves to the parameter's actual native range.
|
|
345
|
+
# Without this, a "0.3" center on a 20-135 range parameter writes 0.3
|
|
346
|
+
# literally instead of scaling to the 20-135 range — killing the signal.
|
|
347
|
+
if parameter_type == "device" and device_index is not None and parameter_index is not None:
|
|
348
|
+
try:
|
|
349
|
+
dev_info = _get_ableton(ctx).send_command("get_device_parameters", {
|
|
350
|
+
"track_index": track_index,
|
|
351
|
+
"device_index": device_index,
|
|
352
|
+
})
|
|
353
|
+
params_list = dev_info.get("parameters", [])
|
|
354
|
+
if parameter_index < len(params_list):
|
|
355
|
+
p_info = params_list[parameter_index]
|
|
356
|
+
p_min = float(p_info.get("min", 0))
|
|
357
|
+
p_max = float(p_info.get("max", 1))
|
|
358
|
+
# Only scale if the range is NOT already 0-1
|
|
359
|
+
if abs(p_max - p_min) > 1.5 or p_min < -0.5:
|
|
360
|
+
for pt in points:
|
|
361
|
+
pt["value"] = p_min + pt["value"] * (p_max - p_min)
|
|
362
|
+
except Exception:
|
|
363
|
+
pass # Fail open — write values as-is if we can't read the range
|
|
364
|
+
|
|
365
|
+
# Safety clamp: auto_pan amplitude should be limited to avoid full L/R swing
|
|
366
|
+
if recipe == "auto_pan" and parameter_type == "panning":
|
|
367
|
+
for pt in points:
|
|
368
|
+
pt["value"] = max(-0.6, min(0.6, pt["value"]))
|
|
369
|
+
|
|
344
370
|
if time_offset > 0:
|
|
345
371
|
for p in points:
|
|
346
372
|
p["time"] += time_offset
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "livepilot",
|
|
3
|
-
"version": "1.9.
|
|
3
|
+
"version": "1.9.21",
|
|
4
4
|
"mcpName": "io.github.dreamrec/livepilot",
|
|
5
5
|
"description": "Agentic production system for Ableton Live 12 — 237 tools, 32 domains, device atlas, spectral perception, technique memory, neo-Riemannian harmony, Euclidean rhythm, species counterpoint, MIDI I/O",
|
|
6
6
|
"author": "Pilot Studio",
|
|
@@ -5,7 +5,7 @@ Entry point for the ControlSurface. Ableton calls create_instance(c_instance)
|
|
|
5
5
|
when this script is selected in Preferences > Link, Tempo & MIDI.
|
|
6
6
|
"""
|
|
7
7
|
|
|
8
|
-
__version__ = "1.9.
|
|
8
|
+
__version__ = "1.9.21"
|
|
9
9
|
|
|
10
10
|
from _Framework.ControlSurface import ControlSurface
|
|
11
11
|
from .server import LivePilotServer
|
|
@@ -104,7 +104,13 @@ def set_device_parameter(song, params):
|
|
|
104
104
|
raise ValueError("Must provide parameter_name or parameter_index")
|
|
105
105
|
|
|
106
106
|
param.value = value
|
|
107
|
-
return {
|
|
107
|
+
return {
|
|
108
|
+
"name": param.name,
|
|
109
|
+
"value": param.value,
|
|
110
|
+
"value_string": param.str_for_value(param.value),
|
|
111
|
+
"min": param.min,
|
|
112
|
+
"max": param.max,
|
|
113
|
+
}
|
|
108
114
|
|
|
109
115
|
|
|
110
116
|
@register("batch_set_parameters")
|
|
@@ -157,7 +163,11 @@ def batch_set_parameters(song, params):
|
|
|
157
163
|
)
|
|
158
164
|
|
|
159
165
|
param.value = value
|
|
160
|
-
results.append({
|
|
166
|
+
results.append({
|
|
167
|
+
"name": param.name,
|
|
168
|
+
"value": param.value,
|
|
169
|
+
"value_string": param.str_for_value(param.value),
|
|
170
|
+
})
|
|
161
171
|
|
|
162
172
|
return {"parameters": results}
|
|
163
173
|
|