livepilot 1.9.16 → 1.9.18
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 +3 -3
- package/AGENTS.md +2 -2
- package/CHANGELOG.md +52 -1
- package/README.md +2 -2
- package/livepilot/.Codex-plugin/plugin.json +2 -2
- package/livepilot/.claude-plugin/plugin.json +2 -2
- package/livepilot/agents/livepilot-producer/AGENT.md +15 -1
- package/livepilot/commands/arrange.md +19 -0
- package/livepilot/commands/evaluate.md +39 -0
- package/livepilot/commands/mix.md +9 -4
- package/livepilot/commands/perform.md +30 -0
- package/livepilot/commands/sounddesign.md +9 -4
- package/livepilot/skills/livepilot-arrangement/SKILL.md +137 -0
- package/livepilot/skills/livepilot-composition-engine/SKILL.md +107 -0
- package/livepilot/skills/livepilot-composition-engine/references/form-patterns.md +97 -0
- package/livepilot/skills/livepilot-composition-engine/references/transition-archetypes.md +102 -0
- package/livepilot/skills/livepilot-core/SKILL.md +69 -449
- package/livepilot/skills/livepilot-core/references/overview.md +2 -2
- package/livepilot/skills/livepilot-devices/SKILL.md +134 -0
- package/livepilot/skills/livepilot-evaluation/SKILL.md +152 -0
- package/livepilot/skills/livepilot-evaluation/references/capability-modes.md +118 -0
- package/livepilot/skills/livepilot-evaluation/references/evaluation-contracts.md +121 -0
- package/livepilot/skills/livepilot-evaluation/references/memory-promotion.md +110 -0
- package/livepilot/skills/livepilot-mix-engine/SKILL.md +123 -0
- package/livepilot/skills/livepilot-mix-engine/references/mix-critics.md +143 -0
- package/livepilot/skills/livepilot-mix-engine/references/mix-moves.md +105 -0
- package/livepilot/skills/livepilot-mixing/SKILL.md +155 -0
- package/livepilot/skills/livepilot-notes/SKILL.md +129 -0
- package/livepilot/skills/livepilot-performance-engine/SKILL.md +122 -0
- package/livepilot/skills/livepilot-performance-engine/references/performance-safety.md +98 -0
- package/livepilot/skills/livepilot-release/SKILL.md +10 -10
- package/livepilot/skills/livepilot-sound-design-engine/SKILL.md +123 -0
- package/livepilot/skills/livepilot-sound-design-engine/references/patch-model.md +119 -0
- package/livepilot/skills/livepilot-sound-design-engine/references/sound-design-critics.md +118 -0
- package/m4l_device/livepilot_bridge.js +1 -1
- package/mcp_server/__init__.py +1 -1
- package/mcp_server/connection.py +29 -22
- package/mcp_server/evaluation/tools.py +1 -1
- package/mcp_server/m4l_bridge.py +7 -4
- package/mcp_server/mix_engine/tools.py +1 -1
- package/mcp_server/performance_engine/tools.py +1 -1
- package/mcp_server/reference_engine/tools.py +1 -1
- package/mcp_server/sound_design/tools.py +1 -1
- package/mcp_server/tools/analyzer.py +4 -3
- package/mcp_server/tools/tracks.py +3 -3
- package/mcp_server/translation_engine/tools.py +1 -1
- package/package.json +2 -2
- package/remote_script/LivePilot/__init__.py +1 -1
- package/remote_script/LivePilot/arrangement.py +9 -2
- package/remote_script/LivePilot/browser.py +1 -0
- package/remote_script/LivePilot/clip_automation.py +6 -0
- package/remote_script/LivePilot/clips.py +2 -0
- package/remote_script/LivePilot/devices.py +1 -0
- package/remote_script/LivePilot/utils.py +2 -2
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: livepilot-performance-engine
|
|
3
|
+
description: This skill should be used when the user asks to "perform live", "what's safe to do during a show", "scene handoff", "energy flow", "performance mode", "safe moves", or wants live performance support with safety constraints.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Performance Engine — Safety-First Live Performance
|
|
7
|
+
|
|
8
|
+
The performance engine enforces a strict safety model for live performance. Every action is classified before execution. Destructive operations are blocked. Risky operations require user confirmation. Only safe operations execute freely.
|
|
9
|
+
|
|
10
|
+
## Safety Classification
|
|
11
|
+
|
|
12
|
+
Every performance action falls into one of four tiers.
|
|
13
|
+
|
|
14
|
+
### Safe — Execute Freely
|
|
15
|
+
|
|
16
|
+
These actions are non-destructive and audience-invisible if they fail. Execute without asking.
|
|
17
|
+
|
|
18
|
+
- `fire_scene` / `fire_clip` — launch scenes or clips (the core of live performance)
|
|
19
|
+
- `set_track_send` with small delta — nudge send levels (reverb/delay throws)
|
|
20
|
+
- `set_device_parameter` on mapped macros — macro knob adjustments
|
|
21
|
+
- `set_track_mute` / `set_track_solo` — mute/solo toggles
|
|
22
|
+
- `set_track_volume` with delta <= 3 dB — volume nudges
|
|
23
|
+
- `set_track_pan` with delta <= 0.2 — subtle pan shifts
|
|
24
|
+
- Filter sweeps via `set_device_parameter` on Auto Filter — smooth frequency movement
|
|
25
|
+
|
|
26
|
+
### Caution — Require User Confirmation
|
|
27
|
+
|
|
28
|
+
These actions are audible and may cause a noticeable glitch if wrong. Always ask before executing.
|
|
29
|
+
|
|
30
|
+
- `set_tempo` with delta <= 5 BPM — tempo nudge (can destabilize synced elements)
|
|
31
|
+
- `toggle_device` — enable/disable effects (may cause pops or silence)
|
|
32
|
+
- `set_track_pan` with delta > 0.2 — large pan moves are disorienting live
|
|
33
|
+
- `set_track_volume` with delta > 3 dB — large volume jumps
|
|
34
|
+
|
|
35
|
+
Present the action to the user: "I will [action]. This may [risk]. Confirm?"
|
|
36
|
+
|
|
37
|
+
### Blocked — Never Execute During Performance
|
|
38
|
+
|
|
39
|
+
These actions risk audible disasters, data loss, or session corruption during a live show.
|
|
40
|
+
|
|
41
|
+
- `delete_device` / `find_and_load_device` — device chain surgery causes audio interruption
|
|
42
|
+
- `create_arrangement_clip` / `create_clip` / `delete_clip` — clip creation/deletion
|
|
43
|
+
- `create_midi_track` / `create_audio_track` / `delete_track` — track structure changes
|
|
44
|
+
- `add_notes` / `modify_notes` / `remove_notes` — note editing while playing
|
|
45
|
+
- `set_clip_loop` / `set_clip_warp_mode` — clip property changes while playing
|
|
46
|
+
- `flatten_track` / `freeze_track` — CPU-intensive operations
|
|
47
|
+
- Any arrangement-view editing tools
|
|
48
|
+
|
|
49
|
+
If the user requests a blocked action during performance mode, explain why it is blocked and suggest a safe alternative: "That requires editing the device chain, which can cause audio dropouts during a live show. Instead, try [safe alternative]."
|
|
50
|
+
|
|
51
|
+
### Unknown — Treat as Blocked
|
|
52
|
+
|
|
53
|
+
Any action not explicitly classified above defaults to blocked. Do not experiment with unclassified actions during a live performance.
|
|
54
|
+
|
|
55
|
+
## Performance Loop
|
|
56
|
+
|
|
57
|
+
### Step 1 — Get State
|
|
58
|
+
|
|
59
|
+
Call `get_performance_state` to read the current session state:
|
|
60
|
+
- Playing status, current tempo, time signature
|
|
61
|
+
- Which scenes and clips are currently playing
|
|
62
|
+
- Track arm states, solo/mute states
|
|
63
|
+
- Current energy level estimate
|
|
64
|
+
|
|
65
|
+
### Step 2 — Get Safe Moves
|
|
66
|
+
|
|
67
|
+
Call `get_performance_safe_moves` to get a list of contextually appropriate safe actions based on the current state. The response is filtered by what makes musical sense right now — not just what is technically safe.
|
|
68
|
+
|
|
69
|
+
### Step 3 — Check Safety
|
|
70
|
+
|
|
71
|
+
Before executing any user request, call `check_safety(move_type)` to verify the classification. The response confirms: `safe`, `caution`, or `blocked` with an explanation.
|
|
72
|
+
|
|
73
|
+
### Step 4 — Execute Safe/Caution Only
|
|
74
|
+
|
|
75
|
+
- Safe: execute immediately
|
|
76
|
+
- Caution: present to user, wait for confirmation, then execute
|
|
77
|
+
- Blocked: refuse with explanation and alternative
|
|
78
|
+
|
|
79
|
+
### Step 5 — Scene Handoff
|
|
80
|
+
|
|
81
|
+
For transitioning between scenes (the primary live performance action), call `plan_scene_handoff(from_scene, to_scene)` to get a transition plan:
|
|
82
|
+
|
|
83
|
+
- Which clips change between the scenes
|
|
84
|
+
- Recommended launch timing (quantization)
|
|
85
|
+
- Volume/send adjustments to smooth the handoff
|
|
86
|
+
- Any tempo changes between scenes
|
|
87
|
+
|
|
88
|
+
Execute the handoff plan using safe actions only.
|
|
89
|
+
|
|
90
|
+
## Energy Flow
|
|
91
|
+
|
|
92
|
+
During a live set, track the energy trajectory:
|
|
93
|
+
|
|
94
|
+
1. `get_performance_state` includes an `energy_estimate` (0.0-1.0)
|
|
95
|
+
2. Use scene ordering to build energy arcs: low-energy scenes for intros/breakdowns, high-energy for drops/peaks
|
|
96
|
+
3. `plan_scene_handoff` accounts for energy delta — large energy jumps get transition suggestions
|
|
97
|
+
|
|
98
|
+
## Performance Mode Entry
|
|
99
|
+
|
|
100
|
+
When the user says "performance mode", "going live", or "starting the show":
|
|
101
|
+
|
|
102
|
+
1. Call `get_performance_state` to verify the session is ready
|
|
103
|
+
2. Confirm the safety model with the user: "Performance mode active. I will only execute safe actions freely and ask before caution-level moves. Destructive edits are blocked."
|
|
104
|
+
3. Switch to a response style optimized for speed: short confirmations, no lengthy explanations mid-performance
|
|
105
|
+
4. Prioritize scene launches and safe parameter nudges
|
|
106
|
+
|
|
107
|
+
## Performance Mode Exit
|
|
108
|
+
|
|
109
|
+
When the user says "done performing", "show's over", or "exit performance mode":
|
|
110
|
+
|
|
111
|
+
1. Confirm: "Performance mode ended. Full editing capabilities restored."
|
|
112
|
+
2. Resume normal operation with all tools available
|
|
113
|
+
|
|
114
|
+
## Emergency Actions
|
|
115
|
+
|
|
116
|
+
If something goes wrong during a live show:
|
|
117
|
+
|
|
118
|
+
- `stop_all_clips` — emergency silence (use only if requested)
|
|
119
|
+
- `set_master_volume(0.0)` — fade to silence
|
|
120
|
+
- `set_track_mute` on the problem track — isolate the issue
|
|
121
|
+
|
|
122
|
+
Never call `undo` during a live performance — it may revert a scene launch or clip state in unpredictable ways.
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# Performance Safety Reference
|
|
2
|
+
|
|
3
|
+
Complete classification of every LivePilot action for live performance contexts.
|
|
4
|
+
|
|
5
|
+
## Safe Actions (No Confirmation Needed)
|
|
6
|
+
|
|
7
|
+
| Action | Tool | Notes |
|
|
8
|
+
|--------|------|-------|
|
|
9
|
+
| Launch scene | `fire_scene` | Core performance action |
|
|
10
|
+
| Launch clip | `fire_clip` | Individual clip triggering |
|
|
11
|
+
| Stop clip | `stop_clip` | Individual clip stop |
|
|
12
|
+
| Stop track clips | `stop_track_clips` | Clear a track |
|
|
13
|
+
| Volume nudge (small) | `set_track_volume` | Delta <= 3 dB only |
|
|
14
|
+
| Send nudge | `set_track_send` | Small adjustments to reverb/delay throws |
|
|
15
|
+
| Macro nudge | `set_device_parameter` | On mapped macro controls only |
|
|
16
|
+
| Filter sweep | `set_device_parameter` | On Auto Filter frequency parameter |
|
|
17
|
+
| Mute toggle | `set_track_mute` | Non-destructive, reversible |
|
|
18
|
+
| Solo toggle | `set_track_solo` | Non-destructive, reversible |
|
|
19
|
+
| Pan nudge (small) | `set_track_pan` | Delta <= 0.2 only |
|
|
20
|
+
| Master volume | `set_master_volume` | For overall level control |
|
|
21
|
+
| Continue playback | `continue_playback` | Resume from pause |
|
|
22
|
+
| Jump to cue | `jump_to_cue` | Navigate arrangement cue points |
|
|
23
|
+
| Get state | `get_performance_state` | Read-only, always safe |
|
|
24
|
+
| Get playing clips | `get_playing_clips` | Read-only |
|
|
25
|
+
| Get scene matrix | `get_scene_matrix` | Read-only |
|
|
26
|
+
| Any get_* tool | various | All read-only tools are safe |
|
|
27
|
+
|
|
28
|
+
## Caution Actions (Require Confirmation)
|
|
29
|
+
|
|
30
|
+
| Action | Tool | Risk |
|
|
31
|
+
|--------|------|------|
|
|
32
|
+
| Tempo nudge | `set_tempo` | May destabilize warped audio, synced plugins |
|
|
33
|
+
| Device toggle | `toggle_device` | May cause audio pop, click, or silence |
|
|
34
|
+
| Large pan move | `set_track_pan` | Disorienting for audience if sudden |
|
|
35
|
+
| Large volume jump | `set_track_volume` | Jarring if delta > 3 dB |
|
|
36
|
+
| Fire scene clips | `fire_scene_clips` | Selective scene launch, less predictable |
|
|
37
|
+
| Set scene tempo | `set_scene_tempo` | Changes tempo on next scene fire |
|
|
38
|
+
|
|
39
|
+
### Confirmation Protocol
|
|
40
|
+
|
|
41
|
+
Present as: "[Action description]. Risk: [what could go wrong]. Confirm?"
|
|
42
|
+
|
|
43
|
+
Keep confirmations short during performance. One line maximum.
|
|
44
|
+
|
|
45
|
+
## Blocked Actions (Never During Performance)
|
|
46
|
+
|
|
47
|
+
### Device Chain Surgery
|
|
48
|
+
- `find_and_load_device` — loading causes audio thread hiccup
|
|
49
|
+
- `delete_device` — removing active device causes dropout
|
|
50
|
+
- `load_device_by_uri` — same as find_and_load
|
|
51
|
+
- `load_browser_item` — browser loading is unpredictable latency
|
|
52
|
+
|
|
53
|
+
### Track Structure
|
|
54
|
+
- `create_midi_track` / `create_audio_track` / `create_return_track` — track creation pauses audio engine momentarily
|
|
55
|
+
- `delete_track` — data loss, audio interruption
|
|
56
|
+
- `duplicate_track` — CPU spike
|
|
57
|
+
- `set_track_routing` — routing changes can cause feedback or silence
|
|
58
|
+
|
|
59
|
+
### Clip Editing
|
|
60
|
+
- `create_clip` / `delete_clip` / `duplicate_clip` — structural changes while playing
|
|
61
|
+
- `set_clip_loop` / `set_clip_warp_mode` / `quantize_clip` — property changes on playing clips
|
|
62
|
+
- `add_notes` / `modify_notes` / `remove_notes` — note editing mid-playback
|
|
63
|
+
|
|
64
|
+
### Arrangement Editing
|
|
65
|
+
- All `*_arrangement_*` tools — arrangement view editing during performance
|
|
66
|
+
- `set_arrangement_automation` — automation lane changes
|
|
67
|
+
|
|
68
|
+
### Heavy Operations
|
|
69
|
+
- `freeze_track` / `flatten_track` — CPU-intensive, blocks audio thread
|
|
70
|
+
- `start_recording` — may cause unexpected monitoring behavior
|
|
71
|
+
- `capture_audio` / `capture_midi` — resource-intensive
|
|
72
|
+
|
|
73
|
+
### Data Operations
|
|
74
|
+
- `undo` / `redo` — unpredictable state reversion during live playback
|
|
75
|
+
- `memory_learn` / `memory_delete` — non-urgent, save for after the show
|
|
76
|
+
- `import_midi_to_clip` — file I/O during performance
|
|
77
|
+
|
|
78
|
+
## Emergency Procedures
|
|
79
|
+
|
|
80
|
+
### Audio Problem
|
|
81
|
+
1. `set_track_mute(track_index, true)` on the problem track
|
|
82
|
+
2. If problem persists: `set_master_volume(0.0)` for fade to silence
|
|
83
|
+
3. Last resort: `stop_all_clips` for emergency silence
|
|
84
|
+
|
|
85
|
+
### Feedback Loop
|
|
86
|
+
1. `set_track_mute` on the suspected track immediately
|
|
87
|
+
2. `set_track_send` to zero on all sends for that track
|
|
88
|
+
3. Gradually unmute after identifying the routing issue
|
|
89
|
+
|
|
90
|
+
### Wrong Scene Launched
|
|
91
|
+
1. Immediately `fire_scene` on the correct scene
|
|
92
|
+
2. Or `stop_all_clips` and restart from the correct point
|
|
93
|
+
3. Do not use `undo` — it may revert more than intended
|
|
94
|
+
|
|
95
|
+
### CPU Spike
|
|
96
|
+
1. `set_track_mute` on the most CPU-heavy tracks (check `get_session_info` for device counts)
|
|
97
|
+
2. `toggle_device` to bypass heavy effects (with caution confirmation skipped in emergency)
|
|
98
|
+
3. If critical: `stop_all_clips` and restart with fewer active tracks
|
|
@@ -28,21 +28,21 @@ Run this checklist EVERY time the user says "update everything", "push", "releas
|
|
|
28
28
|
|
|
29
29
|
## 2. Tool Count (must ALL match)
|
|
30
30
|
|
|
31
|
-
Current: **236 tools across
|
|
31
|
+
Current: **236 tools across 31 domains**.
|
|
32
32
|
Core (no M4L): **149**. Analyzer (M4L): **29**. Perception (offline): **4**.
|
|
33
33
|
|
|
34
34
|
Verify: `grep -rc "@mcp.tool" mcp_server/tools/ | grep -v ":0" | awk -F: '{sum+=$2} END{print sum}'`
|
|
35
35
|
|
|
36
36
|
Files that reference tool count:
|
|
37
37
|
- [ ] `README.md` — header, PERCEPTION section ("207 core...29 analyzer"), Analyzer table header "(29)", Perception table header "(4)"
|
|
38
|
-
- [ ] `package.json` → `"description"` (236 tools,
|
|
38
|
+
- [ ] `package.json` → `"description"` (236 tools, 31 domains)
|
|
39
39
|
- [ ] `server.json` → `"description"`
|
|
40
40
|
- [ ] `livepilot/.Codex-plugin/plugin.json` → `"description"` (primary Codex manifest)
|
|
41
41
|
- [ ] `livepilot/.claude-plugin/plugin.json` → `"description"` (must match Codex plugin)
|
|
42
42
|
- [ ] `.claude-plugin/marketplace.json` → `"description"`
|
|
43
|
-
- [ ] `CLAUDE.md` → "236 tools across
|
|
44
|
-
- [ ] `livepilot/skills/livepilot-core/SKILL.md` — "236 tools across
|
|
45
|
-
- [ ] `livepilot/skills/livepilot-core/references/overview.md` — "236 tools across
|
|
43
|
+
- [ ] `CLAUDE.md` → "236 tools across 31 domains"
|
|
44
|
+
- [ ] `livepilot/skills/livepilot-core/SKILL.md` — "236 tools across 31 domains", Analyzer (29), Perception (4)
|
|
45
|
+
- [ ] `livepilot/skills/livepilot-core/references/overview.md` — "236 tools across 31 domains"
|
|
46
46
|
- [ ] `docs/manual/index.md` — domain table: Analyzer (29), Perception (4)
|
|
47
47
|
- [ ] `docs/manual/getting-started.md` — "207 core tools...29 analyzer"
|
|
48
48
|
- [ ] `docs/manual/tool-reference.md` — all domains present with correct counts
|
|
@@ -56,10 +56,10 @@ Files that reference tool count:
|
|
|
56
56
|
|
|
57
57
|
## 3. Domain Count
|
|
58
58
|
|
|
59
|
-
Current: **
|
|
59
|
+
Current: **31 domains**: transport, tracks, clips, notes, devices, scenes, mixing, browser, arrangement, memory, analyzer, automation, theory, generative, harmony, midi_io, perception, agent_os, composition, motif, research, planner, project_brain, runtime, evaluation, mix_engine, sound_design, transition_engine, reference_engine, translation_engine, performance_engine.
|
|
60
60
|
|
|
61
|
-
- [ ] All files that mention domain count say "
|
|
62
|
-
- [ ] Domain lists include ALL
|
|
61
|
+
- [ ] All files that mention domain count say "31 domains"
|
|
62
|
+
- [ ] Domain lists include ALL 31 (especially newer domains — they're the most often omitted)
|
|
63
63
|
|
|
64
64
|
## 4. npm Registry
|
|
65
65
|
|
|
@@ -89,8 +89,8 @@ Current: **32 domains**: transport, tracks, clips, notes, devices, scenes, mixin
|
|
|
89
89
|
|
|
90
90
|
- [ ] `README.md` — features match current capabilities, "Coming" section is accurate
|
|
91
91
|
- [ ] `docs/manual/getting-started.md` — install instructions current
|
|
92
|
-
- [ ] `docs/manual/tool-reference.md` — all
|
|
93
|
-
- [ ] `docs/TOOL_REFERENCE.md` — all
|
|
92
|
+
- [ ] `docs/manual/tool-reference.md` — all 31 domains listed, all 236 tools present
|
|
93
|
+
- [ ] `docs/TOOL_REFERENCE.md` — all 31 domains present
|
|
94
94
|
- [ ] `docs/M4L_BRIDGE.md` — architecture accurate, core tool count correct
|
|
95
95
|
|
|
96
96
|
## 9. Derived Artifacts
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: livepilot-sound-design-engine
|
|
3
|
+
description: This skill should be used when the user asks to "design a sound", "analyze a patch", "fix a static sound", "add modulation", "check my timbre", "improve a synth patch", or wants critic-driven sound design feedback and iterative patch refinement.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Sound Design Engine — Critic-Driven Patch Refinement
|
|
7
|
+
|
|
8
|
+
The sound design engine analyzes synth patches, identifies timbral weaknesses, and iteratively refines them through a measured critic loop. Every change is evaluated against the before state.
|
|
9
|
+
|
|
10
|
+
## The Sound Design Critic Loop
|
|
11
|
+
|
|
12
|
+
### Step 1 — Build Patch Model
|
|
13
|
+
|
|
14
|
+
Call `get_patch_model(track_index)` to build a PatchModel for the target track. The PatchModel maps every device on the track into typed blocks (oscillator, filter, envelope, lfo, saturation, spatial, effect) and classifies each as `controllable` or `opaque`.
|
|
15
|
+
|
|
16
|
+
Read the response carefully:
|
|
17
|
+
- `blocks`: ordered list of processing blocks with types and parameter names
|
|
18
|
+
- `controllable_params`: parameters you can modify via `set_device_parameter`
|
|
19
|
+
- `opaque_blocks`: third-party plugins where parameters may not map cleanly
|
|
20
|
+
- `modulation_sources`: detected LFOs, envelopes, and macro mappings
|
|
21
|
+
- `signal_flow`: how blocks connect (serial, parallel, or rack chains)
|
|
22
|
+
|
|
23
|
+
See `references/patch-model.md` for the full PatchModel structure and native device block map.
|
|
24
|
+
|
|
25
|
+
### Step 2 — Analyze
|
|
26
|
+
|
|
27
|
+
Call `analyze_sound_design(track_index)` to run all sound design critics against the patch. The response contains an `issues` array with `critic`, `severity`, `block`, and `evidence`.
|
|
28
|
+
|
|
29
|
+
Five critics run during analysis. See `references/sound-design-critics.md` for thresholds:
|
|
30
|
+
|
|
31
|
+
- **static_timbre** — sound does not evolve over time, no movement
|
|
32
|
+
- **no_modulation_sources** — no LFOs, envelopes, or automation detected
|
|
33
|
+
- **modulation_flatness** — modulation exists but ranges are too narrow to hear
|
|
34
|
+
- **missing_filter** — raw oscillator output with no spectral shaping
|
|
35
|
+
- **spectral_imbalance** — too much energy in one frequency region, or gaps
|
|
36
|
+
|
|
37
|
+
### Step 3 — Plan
|
|
38
|
+
|
|
39
|
+
Pick the highest-severity issue. Call `plan_sound_design_move(track_index)` with the issue. The planner returns a single intervention:
|
|
40
|
+
|
|
41
|
+
- `move_type`: one of the move vocabulary entries
|
|
42
|
+
- `target_device`: device index on the track
|
|
43
|
+
- `target_parameter`: parameter name or index
|
|
44
|
+
- `target_value`: the new value
|
|
45
|
+
- `rationale`: why this move addresses the issue
|
|
46
|
+
|
|
47
|
+
Move vocabulary:
|
|
48
|
+
- **modulation_injection** — add or increase LFO/envelope depth on a parameter
|
|
49
|
+
- **filter_shaping** — adjust cutoff, resonance, or filter type
|
|
50
|
+
- **parameter_automation** — create clip automation for time-varying timbral change
|
|
51
|
+
- **oscillator_tuning** — adjust pitch, detune, waveform, or unison settings
|
|
52
|
+
|
|
53
|
+
### Step 4 — Capture Before
|
|
54
|
+
|
|
55
|
+
1. Call `get_device_parameters(track_index, device_index)` — save current parameter state
|
|
56
|
+
2. Call `get_master_spectrum` — save spectral snapshot (if analyzer available)
|
|
57
|
+
|
|
58
|
+
### Step 5 — Execute
|
|
59
|
+
|
|
60
|
+
Apply the planned move using the appropriate tool:
|
|
61
|
+
|
|
62
|
+
- `set_device_parameter` for direct parameter changes (filter cutoff, LFO rate, oscillator shape)
|
|
63
|
+
- `toggle_device` for enabling/disabling processing blocks
|
|
64
|
+
- `batch_set_parameters` when the move requires coordinated changes (e.g., LFO depth + rate together)
|
|
65
|
+
- `set_clip_automation` for parameter automation moves
|
|
66
|
+
- `find_and_load_device` when the fix requires adding a new device (e.g., adding an Auto Filter)
|
|
67
|
+
|
|
68
|
+
Execute one move at a time. Verify before continuing.
|
|
69
|
+
|
|
70
|
+
### Step 6 — Capture After
|
|
71
|
+
|
|
72
|
+
Repeat the same measurements:
|
|
73
|
+
|
|
74
|
+
1. Call `get_device_parameters(track_index, device_index)` — confirm the change took effect
|
|
75
|
+
2. Call `get_master_spectrum` — save post-change spectral snapshot
|
|
76
|
+
|
|
77
|
+
### Step 7 — Evaluate
|
|
78
|
+
|
|
79
|
+
Call `evaluate_move(engine="sound_design")` with the before and after snapshots. Read:
|
|
80
|
+
|
|
81
|
+
- `keep_change` (bool): whether the change improved the sound
|
|
82
|
+
- `score` (0.0-1.0): quality improvement magnitude
|
|
83
|
+
- `timbral_delta`: what changed spectrally
|
|
84
|
+
- `explanation`: human-readable summary
|
|
85
|
+
|
|
86
|
+
### Step 8 — Keep or Undo
|
|
87
|
+
|
|
88
|
+
If `keep_change` is `false`, call `undo()`. Explain what was tried and why it did not improve the sound.
|
|
89
|
+
|
|
90
|
+
If `keep_change` is `true`, report the improvement. If score > 0.7, consider calling `memory_learn(type="sound_design")` to save the technique.
|
|
91
|
+
|
|
92
|
+
### Step 9 — Repeat
|
|
93
|
+
|
|
94
|
+
Return to Step 2. Re-analyze after each kept change. The critic list updates as issues are resolved. Continue until the user is satisfied or no high-severity issues remain.
|
|
95
|
+
|
|
96
|
+
## Working with Opaque Plugins
|
|
97
|
+
|
|
98
|
+
Third-party AU/VST plugins may report as `opaque` in the PatchModel:
|
|
99
|
+
|
|
100
|
+
1. Check `get_plugin_parameters(track_index, device_index)` — some plugins expose parameters through the host
|
|
101
|
+
2. If `parameter_count <= 1`, the plugin is dead or unresponsive. Call `delete_device` and suggest a native alternative
|
|
102
|
+
3. If parameters are available but unnamed (Parameter 1, Parameter 2...), try `map_plugin_parameter` to identify them by ear
|
|
103
|
+
4. Report opaque status to the user — sound design critics cannot fully analyze what they cannot inspect
|
|
104
|
+
|
|
105
|
+
## Quick Sound Design Checks
|
|
106
|
+
|
|
107
|
+
- **"What's wrong with this sound?"** — Call `get_sound_design_issues(track_index)` for a diagnostic without executing fixes
|
|
108
|
+
- **"Show me the patch"** — Call `get_patch_model(track_index)` then `walk_device_tree(track_index)` for full device chain visibility
|
|
109
|
+
- **"What can I automate?"** — Read the `controllable_params` list from the PatchModel response
|
|
110
|
+
|
|
111
|
+
## Native Device Strengths
|
|
112
|
+
|
|
113
|
+
When adding processing blocks, prefer native Ableton devices for controllability:
|
|
114
|
+
|
|
115
|
+
- **Wavetable** — complex oscillator section with built-in modulation matrix
|
|
116
|
+
- **Operator** — FM synthesis with per-operator envelopes and LFO
|
|
117
|
+
- **Analog** — subtractive with two filters and two LFOs
|
|
118
|
+
- **Auto Filter** — standalone filter with envelope follower and LFO
|
|
119
|
+
- **Corpus** — resonant body modeling for physical character
|
|
120
|
+
- **Erosion** — high-frequency noise and distortion artifacts
|
|
121
|
+
- **Saturator** — waveshaping with multiple curve types
|
|
122
|
+
|
|
123
|
+
Always `search_browser` before loading — never guess device names.
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
# Patch Model Reference
|
|
2
|
+
|
|
3
|
+
The PatchModel is returned by `get_patch_model(track_index)` and represents the complete signal processing structure of a track's device chain.
|
|
4
|
+
|
|
5
|
+
## PatchModel Structure
|
|
6
|
+
|
|
7
|
+
```json
|
|
8
|
+
{
|
|
9
|
+
"track_index": 0,
|
|
10
|
+
"track_name": "Lead Synth",
|
|
11
|
+
"blocks": [
|
|
12
|
+
{
|
|
13
|
+
"device_index": 0,
|
|
14
|
+
"device_name": "Wavetable",
|
|
15
|
+
"block_type": "oscillator",
|
|
16
|
+
"controllable": true,
|
|
17
|
+
"parameters": ["Osc 1 Pos", "Osc 1 Gain", "Sub Gain", ...],
|
|
18
|
+
"sub_blocks": [
|
|
19
|
+
{ "block_type": "filter", "parameters": ["Filter Freq", "Filter Res", ...] },
|
|
20
|
+
{ "block_type": "lfo", "parameters": ["LFO 1 Rate", "LFO 1 Amount", ...] },
|
|
21
|
+
{ "block_type": "envelope", "parameters": ["Amp Attack", "Amp Decay", ...] }
|
|
22
|
+
]
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"device_index": 1,
|
|
26
|
+
"device_name": "Auto Filter",
|
|
27
|
+
"block_type": "filter",
|
|
28
|
+
"controllable": true,
|
|
29
|
+
"parameters": ["Frequency", "Resonance", "Env. Modulation", ...]
|
|
30
|
+
}
|
|
31
|
+
],
|
|
32
|
+
"controllable_params": [...],
|
|
33
|
+
"opaque_blocks": [],
|
|
34
|
+
"modulation_sources": [
|
|
35
|
+
{ "type": "lfo", "device_index": 0, "rate": "0.5 Hz", "targets": ["Filter Freq"] }
|
|
36
|
+
],
|
|
37
|
+
"signal_flow": "serial"
|
|
38
|
+
}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Block Types
|
|
42
|
+
|
|
43
|
+
### oscillator
|
|
44
|
+
Sound source generators. Found in synth instruments (Wavetable, Operator, Analog, Drift, Simpler, Sampler).
|
|
45
|
+
|
|
46
|
+
Key parameters: waveform/position, pitch/tune/detune, unison voices/spread, sub oscillator level, FM amount/ratio.
|
|
47
|
+
|
|
48
|
+
### filter
|
|
49
|
+
Spectral shaping. Found as sub-blocks inside instruments or as standalone devices (Auto Filter, EQ Eight).
|
|
50
|
+
|
|
51
|
+
Key parameters: cutoff frequency, resonance, filter type (LP/HP/BP/Notch), slope (12/24 dB), envelope modulation amount, drive.
|
|
52
|
+
|
|
53
|
+
### envelope
|
|
54
|
+
Time-shaping contour generators. Usually ADSR controlling amplitude or filter cutoff.
|
|
55
|
+
|
|
56
|
+
Key parameters: attack, decay, sustain, release. Some instruments offer additional envelopes with arbitrary targets.
|
|
57
|
+
|
|
58
|
+
### lfo
|
|
59
|
+
Low-frequency oscillators for cyclic modulation.
|
|
60
|
+
|
|
61
|
+
Key parameters: rate (Hz or synced), waveform (sine, triangle, square, saw, random), amount/depth, target parameter, phase, offset.
|
|
62
|
+
|
|
63
|
+
### saturation
|
|
64
|
+
Waveshaping, distortion, and harmonic generation.
|
|
65
|
+
|
|
66
|
+
Devices: Saturator, Overdrive, Pedal, Amp, Erosion, Dynamic Tube. Key parameters: drive, tone, type/curve, dry/wet.
|
|
67
|
+
|
|
68
|
+
### spatial
|
|
69
|
+
Stereo field and space processing.
|
|
70
|
+
|
|
71
|
+
Devices: Reverb, Delay, Chorus, Phaser, Flanger, Echo, Hybrid Reverb. Key parameters: decay/time, pre-delay, size, damping, dry/wet, feedback.
|
|
72
|
+
|
|
73
|
+
### effect
|
|
74
|
+
Catch-all for utility and dynamics processing.
|
|
75
|
+
|
|
76
|
+
Devices: Compressor, Glue Compressor, Limiter, Gate, Utility, Tuner, Spectrum. Key parameters vary by device.
|
|
77
|
+
|
|
78
|
+
## Controllable vs Opaque
|
|
79
|
+
|
|
80
|
+
- **Controllable**: native Ableton devices and well-behaved plugins where `get_device_parameters` returns named, ranged parameters. All LivePilot set/get parameter tools work reliably.
|
|
81
|
+
- **Opaque**: third-party AU/VST plugins where parameter inspection fails or returns generic names (Parameter 1, Parameter 2). The sound design engine can detect the block exists but cannot reason about individual parameters.
|
|
82
|
+
|
|
83
|
+
Check `parameter_count` on opaque blocks. If <= 1, the plugin failed to load — delete it and replace with a native alternative.
|
|
84
|
+
|
|
85
|
+
## Native Device Block Map
|
|
86
|
+
|
|
87
|
+
Quick reference for which block types each native device provides:
|
|
88
|
+
|
|
89
|
+
| Device | Primary Block | Sub-blocks |
|
|
90
|
+
|--------|--------------|------------|
|
|
91
|
+
| Wavetable | oscillator | filter, lfo, envelope |
|
|
92
|
+
| Operator | oscillator | filter, lfo, envelope |
|
|
93
|
+
| Analog | oscillator | filter, lfo, envelope |
|
|
94
|
+
| Drift | oscillator | filter, lfo, envelope |
|
|
95
|
+
| Simpler | oscillator | filter, lfo, envelope |
|
|
96
|
+
| Sampler | oscillator | filter, lfo, envelope |
|
|
97
|
+
| Auto Filter | filter | lfo, envelope |
|
|
98
|
+
| EQ Eight | filter | — |
|
|
99
|
+
| Compressor | effect | envelope (sidechain) |
|
|
100
|
+
| Glue Compressor | effect | — |
|
|
101
|
+
| Saturator | saturation | — |
|
|
102
|
+
| Overdrive | saturation | — |
|
|
103
|
+
| Pedal | saturation | — |
|
|
104
|
+
| Reverb | spatial | — |
|
|
105
|
+
| Delay | spatial | filter |
|
|
106
|
+
| Echo | spatial | filter, lfo |
|
|
107
|
+
| Chorus-Ensemble | spatial | — |
|
|
108
|
+
| Phaser-Flanger | spatial | lfo |
|
|
109
|
+
| Hybrid Reverb | spatial | — |
|
|
110
|
+
| Corpus | spatial | — |
|
|
111
|
+
| Utility | effect | — |
|
|
112
|
+
|
|
113
|
+
## Rack Detection
|
|
114
|
+
|
|
115
|
+
If a track contains an Instrument Rack or Audio Effect Rack, the PatchModel reports:
|
|
116
|
+
|
|
117
|
+
- `signal_flow`: "parallel" (rack chains run in parallel)
|
|
118
|
+
- Each chain appears as a nested block list
|
|
119
|
+
- Use `get_rack_chains(track_index, device_index)` for per-chain detail
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
# Sound Design Critics Reference
|
|
2
|
+
|
|
3
|
+
Each critic runs during `analyze_sound_design(track_index)` and produces an issue object with `critic`, `severity` (0.0-1.0), `block`, and `evidence`.
|
|
4
|
+
|
|
5
|
+
## static_timbre
|
|
6
|
+
|
|
7
|
+
Detects sounds that do not evolve over time. A static timbre lacks movement, making it sound flat and lifeless in a mix.
|
|
8
|
+
|
|
9
|
+
**Thresholds:**
|
|
10
|
+
- severity >= 0.7: No detectable spectral change over a 4-bar window. Crest factor of spectral flux < 0.5 dB
|
|
11
|
+
- severity >= 0.4: Minimal change (spectral flux < 1.5 dB). Some subtle movement present
|
|
12
|
+
- severity < 0.4: Adequate movement detected, likely intentional sustain character
|
|
13
|
+
|
|
14
|
+
**Evidence format:**
|
|
15
|
+
```json
|
|
16
|
+
{
|
|
17
|
+
"spectral_flux_db": 0.3,
|
|
18
|
+
"analysis_window_bars": 4,
|
|
19
|
+
"brightest_moment_db": -8.2,
|
|
20
|
+
"dullest_moment_db": -8.5
|
|
21
|
+
}
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
**Typical fix:** modulation_injection — add LFO to filter cutoff (rate 0.1-2 Hz, depth 20-40%).
|
|
25
|
+
|
|
26
|
+
## no_modulation_sources
|
|
27
|
+
|
|
28
|
+
Detects patches with zero modulation sources: no LFOs, no envelopes beyond amp/filter ADSR, no automation, no macro mappings.
|
|
29
|
+
|
|
30
|
+
**Thresholds:**
|
|
31
|
+
- severity >= 0.7: Zero modulation sources on a melodic/pad/lead instrument
|
|
32
|
+
- severity >= 0.4: No modulation on a bass or rhythmic element (some genres keep bass static intentionally)
|
|
33
|
+
- severity < 0.4: Drum hits and one-shots (modulation not expected)
|
|
34
|
+
|
|
35
|
+
**Evidence format:**
|
|
36
|
+
```json
|
|
37
|
+
{
|
|
38
|
+
"lfo_count": 0,
|
|
39
|
+
"envelope_count": 1,
|
|
40
|
+
"automation_lanes": 0,
|
|
41
|
+
"macro_mappings": 0,
|
|
42
|
+
"instrument_type": "pad"
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
**Typical fix:** modulation_injection — enable device LFO if available, or add Auto Filter with LFO. For pads, map LFO to filter cutoff and/or oscillator pitch (subtle detune).
|
|
47
|
+
|
|
48
|
+
## modulation_flatness
|
|
49
|
+
|
|
50
|
+
Detects modulation sources that exist but operate with such narrow ranges they produce no audible effect.
|
|
51
|
+
|
|
52
|
+
**Thresholds:**
|
|
53
|
+
- severity >= 0.7: Modulation depth < 5% of parameter range on all targets
|
|
54
|
+
- severity >= 0.4: Modulation depth 5-15% — present but barely perceptible
|
|
55
|
+
- severity < 0.4: Depth > 15%, audible modulation
|
|
56
|
+
|
|
57
|
+
**Evidence format:**
|
|
58
|
+
```json
|
|
59
|
+
{
|
|
60
|
+
"modulation_source": "LFO 1",
|
|
61
|
+
"target_parameter": "Filter Cutoff",
|
|
62
|
+
"depth_percent": 3.2,
|
|
63
|
+
"parameter_range": [20, 20000],
|
|
64
|
+
"effective_range": [850, 920]
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
**Typical fix:** Increase modulation depth to 20-40% for filter targets, 5-15% for pitch targets, 10-30% for amplitude targets.
|
|
69
|
+
|
|
70
|
+
## missing_filter
|
|
71
|
+
|
|
72
|
+
Detects raw oscillator output with no filter or spectral shaping in the signal path. Unfiltered signals often sound harsh and sit poorly in a mix.
|
|
73
|
+
|
|
74
|
+
**Thresholds:**
|
|
75
|
+
- severity >= 0.7: No filter device in the signal chain, and the source is a harmonically rich waveform (saw, square, FM)
|
|
76
|
+
- severity >= 0.4: Filter present but fully open (cutoff at maximum, no resonance)
|
|
77
|
+
- severity < 0.4: Filter active and shaping the spectrum
|
|
78
|
+
|
|
79
|
+
**Evidence format:**
|
|
80
|
+
```json
|
|
81
|
+
{
|
|
82
|
+
"has_filter": false,
|
|
83
|
+
"source_waveform": "sawtooth",
|
|
84
|
+
"harmonic_content": "rich",
|
|
85
|
+
"device_chain": ["Wavetable"]
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
**Typical fix:** filter_shaping — add Auto Filter (low-pass, cutoff around 2-5 kHz, resonance 20-40%) or enable the instrument's built-in filter.
|
|
90
|
+
|
|
91
|
+
## spectral_imbalance
|
|
92
|
+
|
|
93
|
+
Detects patches with too much energy concentrated in one frequency region, or significant spectral gaps.
|
|
94
|
+
|
|
95
|
+
**Thresholds:**
|
|
96
|
+
- severity >= 0.7: Single band > 12 dB above the mean, or a gap > 12 dB below
|
|
97
|
+
- severity >= 0.4: Imbalance 6-12 dB in one or more regions
|
|
98
|
+
- severity < 0.4: Balanced spectrum appropriate for the instrument role
|
|
99
|
+
|
|
100
|
+
**Evidence format:**
|
|
101
|
+
```json
|
|
102
|
+
{
|
|
103
|
+
"peak_band": "high_mid",
|
|
104
|
+
"peak_deviation_db": 14.2,
|
|
105
|
+
"gap_band": "low_mid",
|
|
106
|
+
"gap_deviation_db": -8.5,
|
|
107
|
+
"band_levels_db": {
|
|
108
|
+
"sub": -22.0,
|
|
109
|
+
"low": -14.5,
|
|
110
|
+
"low_mid": -20.1,
|
|
111
|
+
"mid": -11.6,
|
|
112
|
+
"high_mid": -2.4,
|
|
113
|
+
"high": -8.9
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
**Typical fix:** filter_shaping to tame the peak (EQ cut or filter sweep), or oscillator_tuning to fill the gap (add sub oscillator, adjust waveform).
|
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.18"
|