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,134 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: livepilot-devices
|
|
3
|
+
description: This skill should be used when the user asks to "load a device", "add an effect", "find a plugin", "device chain", "rack", "preset", "sound design setup", "load instrument", "find a synth", or wants to browse, load, and configure devices in Ableton Live.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Device Loading and Configuration
|
|
7
|
+
|
|
8
|
+
Load instruments, effects, and plugins into Ableton Live tracks. Every device operation follows one discipline: search first, verify after.
|
|
9
|
+
|
|
10
|
+
## Browser Workflow — The Safe Path
|
|
11
|
+
|
|
12
|
+
Always use the two-step browser workflow for loading devices:
|
|
13
|
+
|
|
14
|
+
1. **Search:** `search_browser(path, name_filter)` — returns a list of matching items with exact URIs
|
|
15
|
+
2. **Inspect:** Read the results. Confirm the item name, type, and path match what you need
|
|
16
|
+
3. **Load:** `load_browser_item(uri)` — pass the exact URI string from search results
|
|
17
|
+
|
|
18
|
+
Common search paths:
|
|
19
|
+
- `path="Instruments"` — synths, samplers, instrument racks
|
|
20
|
+
- `path="Drums"` — drum racks, drum kits, percussion
|
|
21
|
+
- `path="Audio Effects"` — reverb, delay, compressor, EQ, saturator
|
|
22
|
+
- `path="MIDI Effects"` — arpeggiator, chord, scale, random
|
|
23
|
+
- `path="Sounds"` — preset sounds organized by category
|
|
24
|
+
- `path="Samples"` — audio samples, one-shots, loops
|
|
25
|
+
|
|
26
|
+
Combine path with `name_filter` to narrow results. Example: `search_browser(path="Drums", name_filter="808 Kit")`.
|
|
27
|
+
|
|
28
|
+
NEVER invent device or preset names. A hallucinated name like "echomorph-hpf" or "Drift Pad Wonk" will crash the load. Always search first, then use the exact URI from results.
|
|
29
|
+
|
|
30
|
+
## find_and_load_device — The Shortcut
|
|
31
|
+
|
|
32
|
+
Use `find_and_load_device(name)` ONLY for these simple built-in effects:
|
|
33
|
+
- "Reverb"
|
|
34
|
+
- "Delay"
|
|
35
|
+
- "Compressor"
|
|
36
|
+
- "EQ Eight"
|
|
37
|
+
- "Saturator"
|
|
38
|
+
- "Utility"
|
|
39
|
+
|
|
40
|
+
For everything else — instruments, racks, presets, AU/VST plugins — use the browser workflow. The shortcut matches greedily and can load a sample file instead of a synth when names overlap (e.g., "Drift" matches "Synth Bass Drift Pad Wonk Bass.wav" before the Drift synthesizer).
|
|
41
|
+
|
|
42
|
+
## Plugin Health Verification
|
|
43
|
+
|
|
44
|
+
After loading any device, verify it actually works:
|
|
45
|
+
|
|
46
|
+
1. Call `get_device_info(track_index, device_index)` on the newly loaded device
|
|
47
|
+
2. Check `parameter_count` — if the device is an AU/VST plugin (`class_name` contains "PluginDevice") and `parameter_count` is 1 or less, the plugin is dead. The shell loaded but the DSP engine crashed.
|
|
48
|
+
3. Check `health_flags` for `opaque_or_failed_plugin` (dead or untweakable AU/VST) or `sample_dependent` (needs source audio)
|
|
49
|
+
4. Check `plugin_host_status` and `mcp_sound_design_ready`
|
|
50
|
+
5. If `mcp_sound_design_ready` is `false`: delete the device with `delete_device`, replace it with a native Ableton alternative, and report the failure to the user
|
|
51
|
+
|
|
52
|
+
Dead plugin recovery pattern:
|
|
53
|
+
```
|
|
54
|
+
get_device_info → parameter_count <= 1 on PluginDevice?
|
|
55
|
+
→ delete_device(track_index, device_index)
|
|
56
|
+
→ search_browser for native alternative
|
|
57
|
+
→ load_browser_item with replacement URI
|
|
58
|
+
→ report failure and substitution to user
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Rack Introspection
|
|
62
|
+
|
|
63
|
+
Use `walk_device_tree(track_index)` to see the full nested structure of racks on a track — Instrument Racks, Audio Effect Racks, and Drum Racks with all their chains and sub-devices.
|
|
64
|
+
|
|
65
|
+
Use `get_rack_chains(track_index, device_index)` to inspect individual rack chain contents. For Drum Racks, this reveals which pads have samples loaded and which chains exist. An empty Drum Rack (zero chains) produces silence.
|
|
66
|
+
|
|
67
|
+
Set chain volumes with `set_chain_volume(track_index, device_index, chain_index, volume)` to balance rack layers.
|
|
68
|
+
|
|
69
|
+
## Drum Rack Rule
|
|
70
|
+
|
|
71
|
+
NEVER load a bare "Drum Rack" — it is an empty container with zero chains and produces silence. Always load a kit preset through the browser:
|
|
72
|
+
|
|
73
|
+
```
|
|
74
|
+
search_browser(path="Drums", name_filter="Kit")
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Pick a real kit from results: "909 Core Kit", "808 Core Kit", "Boom Bap Kit", "Lo-Fi Kit", etc. These come pre-loaded with samples on their pads.
|
|
78
|
+
|
|
79
|
+
After loading any Drum Rack preset, verify with `get_rack_chains` that chains exist and have named pads like "Bass Drum", "Snare", "Hi-Hat".
|
|
80
|
+
|
|
81
|
+
## Sample-Dependent Devices
|
|
82
|
+
|
|
83
|
+
These devices load "successfully" with many parameters but produce zero audio without source material. Since MCP tools cannot load samples into third-party plugin UIs, NEVER use these as standalone instruments:
|
|
84
|
+
|
|
85
|
+
- **Granular synths:** iDensity, Tardigrain, Koala Sampler, Burns Audio Granular
|
|
86
|
+
- **Bare samplers:** Simpler (empty), Sampler (empty) — always load a preset, never the empty shell
|
|
87
|
+
- **Sample players:** AudioLayer, sEGments
|
|
88
|
+
|
|
89
|
+
Use self-contained synthesizers instead — these produce sound immediately from MIDI input alone:
|
|
90
|
+
- **Wavetable** — versatile wavetable synthesis
|
|
91
|
+
- **Operator** — FM synthesis, 4 operators
|
|
92
|
+
- **Drift** — analog-modeled, warm and organic
|
|
93
|
+
- **Analog** — subtractive analog modeling
|
|
94
|
+
- **Meld** — MPE-ready, two engines
|
|
95
|
+
- **Collision** — physical modeling, mallet/resonator
|
|
96
|
+
- **Tension** — physical modeling, string/exciter
|
|
97
|
+
|
|
98
|
+
If granular textures are needed: use Wavetable with aggressive wavetable position modulation, Operator with FM feedback and short envelopes, or load a Simpler/Sampler **preset** (not the bare instrument) from the Sounds browser.
|
|
99
|
+
|
|
100
|
+
## Simpler Operations
|
|
101
|
+
|
|
102
|
+
For Simpler devices that already have samples loaded:
|
|
103
|
+
|
|
104
|
+
- `load_sample_to_simpler(track_index, device_index, file_path)` — load audio into Simpler
|
|
105
|
+
- `replace_simpler_sample(track_index, device_index, file_path)` — swap the current sample. Only works on Simplers that already have a sample loaded.
|
|
106
|
+
- `crop_simpler(track_index, device_index)` — trim sample to current start/end points
|
|
107
|
+
- `reverse_simpler(track_index, device_index)` — reverse the loaded sample
|
|
108
|
+
- `get_simpler_slices(track_index, device_index)` — retrieve auto-detected slice points (Slice mode)
|
|
109
|
+
- `set_simpler_playback_mode(track_index, device_index, mode)` — switch between Classic, One-Shot, and Slice modes
|
|
110
|
+
|
|
111
|
+
Slice mode workflow: load sample, set playback mode to Slice, call `get_simpler_slices` to see slice points, then program MIDI notes targeting slice indices.
|
|
112
|
+
|
|
113
|
+
## Effect Chain Best Practices
|
|
114
|
+
|
|
115
|
+
After loading any effect, verify its key parameters are not at pass-through defaults:
|
|
116
|
+
- **Reverb:** `Dry/Wet` should be > 0 (typically 20-40% for subtle, 60-100% for creative)
|
|
117
|
+
- **Delay:** `Dry/Wet` > 0, `Feedback` set appropriately
|
|
118
|
+
- **Compressor:** `Threshold` below signal level, `Ratio` > 1:1
|
|
119
|
+
- **EQ Eight:** At least one band with non-zero gain
|
|
120
|
+
- **Saturator:** `Drive` > 0 dB
|
|
121
|
+
- **Utility:** `Gain` at target value, `Width` as needed
|
|
122
|
+
|
|
123
|
+
Use `get_device_parameters` to read current values, then `set_device_parameter` or `batch_set_parameters` to configure. Use `toggle_device` to bypass/enable devices for A/B comparison.
|
|
124
|
+
|
|
125
|
+
## Device Presets
|
|
126
|
+
|
|
127
|
+
- `get_device_presets(track_index, device_index)` — list available presets for the loaded device
|
|
128
|
+
- `get_plugin_parameters(track_index, device_index)` — see all AU/VST plugin parameters
|
|
129
|
+
- `get_plugin_presets(track_index, device_index)` — list presets for AU/VST plugins
|
|
130
|
+
- `map_plugin_parameter(track_index, device_index, parameter_index)` — map a plugin parameter for automation
|
|
131
|
+
|
|
132
|
+
## Device Atlas Reference
|
|
133
|
+
|
|
134
|
+
Consult `references/device-atlas/` in the livepilot-core skill for the full corpus of 280+ instruments, 139 drum kits, and 350+ impulse responses. The atlas contains real browser URIs, preset names, and sonic descriptions. Use it as your lookup table before loading any device — never guess a name that is not in the atlas or in browser search results.
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: livepilot-evaluation
|
|
3
|
+
description: This skill should be used when the user asks to "evaluate a change", "was that good", "keep or undo", "A/B compare", "rate my change", "check if that helped", or wants to use the universal evaluation loop to judge production moves.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Evaluation Engine — Universal Move Judgment
|
|
7
|
+
|
|
8
|
+
The evaluation engine is the shared decision layer used by all other engines (mix, sound design, composition, performance). It determines whether a change improved the session, and whether to keep it, undo it, or learn from it.
|
|
9
|
+
|
|
10
|
+
## The Universal Evaluation Loop
|
|
11
|
+
|
|
12
|
+
Every production move follows this loop regardless of which engine initiated it.
|
|
13
|
+
|
|
14
|
+
### Step 1 — Compile Goal Vector
|
|
15
|
+
|
|
16
|
+
Call `compile_goal_vector(goal, mode)` to establish what you are trying to achieve.
|
|
17
|
+
|
|
18
|
+
**Goal**: a plain-text description of the intended improvement (e.g., "reduce masking between bass and kick in 100-200 Hz range").
|
|
19
|
+
|
|
20
|
+
**Modes** control how aggressively you act:
|
|
21
|
+
|
|
22
|
+
- `observe` — read-only analysis, no changes. Use for diagnostics and status checks.
|
|
23
|
+
- `improve` — targeted fixes for specific issues. The default mode. Make the smallest change that addresses the problem.
|
|
24
|
+
- `explore` — creative experimentation. Wider parameter ranges, more tolerance for unexpected results. Use when the user says "try something", "experiment", or "surprise me".
|
|
25
|
+
- `finish` — polish and finalize. Conservative moves only, protect what already works. Use when the user says "almost done", "final touches", or "wrap it up".
|
|
26
|
+
- `diagnose` — identify problems without fixing them. Like observe but with critic analysis. Use when the user says "what's wrong" without asking for fixes.
|
|
27
|
+
|
|
28
|
+
### Step 2 — Build World Model
|
|
29
|
+
|
|
30
|
+
Call `build_world_model` to snapshot the current session state and available capabilities:
|
|
31
|
+
|
|
32
|
+
- Session info: tracks, clips, devices, tempo, time signature
|
|
33
|
+
- Capability state: analyzer connected, M4L bridge active, FluCoMa available
|
|
34
|
+
- Recent actions: last moves taken and their outcomes
|
|
35
|
+
- Active constraints: performance mode safety limits, user anti-preferences
|
|
36
|
+
|
|
37
|
+
The world model determines what tools are available and what measurements are possible.
|
|
38
|
+
|
|
39
|
+
### Step 3 — Get Turn Budget
|
|
40
|
+
|
|
41
|
+
Call `get_turn_budget(mode)` to determine how many moves you should make this turn:
|
|
42
|
+
|
|
43
|
+
- `observe` / `diagnose`: 0 moves (read-only)
|
|
44
|
+
- `improve`: 1-3 moves per turn, evaluate after each
|
|
45
|
+
- `explore`: 1-5 moves per turn, wider tolerance
|
|
46
|
+
- `finish`: 1 move per turn, strict evaluation
|
|
47
|
+
|
|
48
|
+
Do not exceed the turn budget. If more work is needed, complete the current turn, report progress, and start a new turn.
|
|
49
|
+
|
|
50
|
+
### Step 4 — Capture Before
|
|
51
|
+
|
|
52
|
+
Take measurements appropriate to the engine context:
|
|
53
|
+
|
|
54
|
+
- **Mix engine**: `get_master_spectrum` + `get_master_rms`
|
|
55
|
+
- **Sound design**: `get_device_parameters` + `get_master_spectrum`
|
|
56
|
+
- **Composition**: `get_notes` or `get_arrangement_notes` + `get_section_graph`
|
|
57
|
+
- **Universal**: `get_mix_snapshot` for full session state
|
|
58
|
+
|
|
59
|
+
Always capture before executing. Without a before snapshot, evaluation is meaningless.
|
|
60
|
+
|
|
61
|
+
### Step 5 — Execute Intervention
|
|
62
|
+
|
|
63
|
+
Apply the planned change using the appropriate tool. Execute exactly one move, then proceed to evaluation.
|
|
64
|
+
|
|
65
|
+
### Step 6 — Capture After
|
|
66
|
+
|
|
67
|
+
Repeat the same measurements from Step 4. Use identical tool calls to ensure comparable data.
|
|
68
|
+
|
|
69
|
+
### Step 7 — Evaluate
|
|
70
|
+
|
|
71
|
+
Call the appropriate evaluator:
|
|
72
|
+
|
|
73
|
+
- `evaluate_move(before_snapshot, after_snapshot, goal)` — universal evaluator, works for any engine
|
|
74
|
+
- `evaluate_mix_move(before_snapshot, after_snapshot, targets, protect)` — mix-specific with protection constraints
|
|
75
|
+
- `evaluate_composition_move(before_snapshot, after_snapshot, goal)` — composition-specific
|
|
76
|
+
- `evaluate_with_fabric(before_snapshot, after_snapshot, goal)` — uses memory fabric for taste-aware judgment
|
|
77
|
+
|
|
78
|
+
### Step 8 — Read the Verdict
|
|
79
|
+
|
|
80
|
+
Every evaluator returns:
|
|
81
|
+
|
|
82
|
+
- `keep_change` (bool): whether the change should stay
|
|
83
|
+
- `score` (0.0-1.0): magnitude of improvement (0.5 = neutral, >0.5 = better, <0.5 = worse)
|
|
84
|
+
- `goal_progress` (0.0-1.0): how much closer to the stated goal
|
|
85
|
+
- `collateral_damage` (list): things that got worse as a side effect
|
|
86
|
+
- `explanation` (string): human-readable judgment summary
|
|
87
|
+
|
|
88
|
+
### Step 9 — Keep or Undo
|
|
89
|
+
|
|
90
|
+
If `keep_change` is `false`:
|
|
91
|
+
1. Call `undo()` immediately
|
|
92
|
+
2. Report to the user: what was tried, why it was undone, citing `collateral_damage`
|
|
93
|
+
3. Consider an alternative approach for the same goal
|
|
94
|
+
|
|
95
|
+
If `keep_change` is `true`:
|
|
96
|
+
1. Report the improvement with score and explanation
|
|
97
|
+
2. If `score > 0.7`, this is a memory promotion candidate (see below)
|
|
98
|
+
|
|
99
|
+
### Step 10 — Repeat or Stop
|
|
100
|
+
|
|
101
|
+
Check turn budget remaining. If budget allows and goal_progress < 1.0, return to Step 4 for the next move. Otherwise, summarize progress and stop.
|
|
102
|
+
|
|
103
|
+
## Capability Modes
|
|
104
|
+
|
|
105
|
+
The world model includes a capability state that affects what measurements are available. Call `get_capability_state` to check.
|
|
106
|
+
|
|
107
|
+
### normal
|
|
108
|
+
Full measured evaluation. M4L analyzer connected, all spectral/RMS/key tools available. Critics use real data. This is the best mode.
|
|
109
|
+
|
|
110
|
+
### measured_degraded
|
|
111
|
+
Analyzer data is stale (older than 5 seconds) or intermittent. Measurements may not reflect current state. Re-trigger analysis before trusting cached values. Inform the user that data freshness is limited.
|
|
112
|
+
|
|
113
|
+
### judgment_only
|
|
114
|
+
No analyzer connected. Evaluation relies on device parameter changes, track structure, and role-based heuristics. Critics cannot use spectral evidence. Inform the user: "Evaluation is based on parameter analysis only — spectral verification unavailable."
|
|
115
|
+
|
|
116
|
+
### read_only
|
|
117
|
+
Session disconnected or in an error state. No tools can modify the session. Only read operations from cached data. Inform the user and suggest reconnecting.
|
|
118
|
+
|
|
119
|
+
## Action Ledger
|
|
120
|
+
|
|
121
|
+
Every move is recorded in the action ledger for accountability and learning.
|
|
122
|
+
|
|
123
|
+
- `get_action_ledger_summary` — summary of all actions taken this session with scores
|
|
124
|
+
- `get_recent_actions` — last N actions with full detail
|
|
125
|
+
- `get_last_move` — the most recent action and its evaluation result
|
|
126
|
+
|
|
127
|
+
Use the ledger to avoid repeating failed approaches. If a move type has been undone twice for the same issue, try a different strategy.
|
|
128
|
+
|
|
129
|
+
## Memory Promotion
|
|
130
|
+
|
|
131
|
+
Successful moves can be promoted to persistent memory for future sessions.
|
|
132
|
+
|
|
133
|
+
- `get_promotion_candidates` — list moves from this session that scored > 0.7 and are eligible for saving
|
|
134
|
+
- `memory_learn(type, data)` — save a technique to memory (mix_template, sound_design, composition, etc.)
|
|
135
|
+
- `record_anti_preference(description)` — record something the user explicitly rejected, so it is never suggested again
|
|
136
|
+
|
|
137
|
+
### Promotion Rules
|
|
138
|
+
|
|
139
|
+
1. Only promote moves the user confirmed satisfaction with — a high score alone is not enough
|
|
140
|
+
2. Anti-preferences are permanent until explicitly deleted
|
|
141
|
+
3. Check `get_anti_preferences` before suggesting any move to avoid repeating rejected ideas
|
|
142
|
+
4. Promotion is optional — never force it. Suggest when appropriate: "That scored 0.85 — want me to save this technique for future sessions?"
|
|
143
|
+
|
|
144
|
+
## A/B Comparison
|
|
145
|
+
|
|
146
|
+
When the user asks "was that good?" or "A/B compare":
|
|
147
|
+
|
|
148
|
+
1. The before snapshot is A, the after snapshot is B
|
|
149
|
+
2. Call the evaluator to get the score
|
|
150
|
+
3. Present the comparison: "Before: [metrics]. After: [metrics]. Score: [score]. [explanation]"
|
|
151
|
+
4. If the user prefers A, call `undo()` to revert to it
|
|
152
|
+
5. If the user prefers B, keep the current state
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
# Capability Modes Reference
|
|
2
|
+
|
|
3
|
+
The evaluation engine adapts its behavior based on what measurement capabilities are available. Call `get_capability_state` to determine the current mode.
|
|
4
|
+
|
|
5
|
+
## Mode: normal
|
|
6
|
+
|
|
7
|
+
Full measurement capabilities available.
|
|
8
|
+
|
|
9
|
+
**Requirements:**
|
|
10
|
+
- Ableton Live connected via TCP port 9878
|
|
11
|
+
- M4L analyzer bridge running on master track
|
|
12
|
+
- UDP 9880 (M4L -> Server) and OSC 9881 (Server -> M4L) active
|
|
13
|
+
- SpectralCache receiving fresh data (age < 5 seconds)
|
|
14
|
+
|
|
15
|
+
**Available measurements:**
|
|
16
|
+
- `get_master_spectrum` — 8-band spectral analysis, real-time
|
|
17
|
+
- `get_master_rms` — RMS and peak levels
|
|
18
|
+
- `get_detected_key` — key detection from audio
|
|
19
|
+
- `get_mel_spectrum` — mel-scaled spectral representation
|
|
20
|
+
- `get_chroma` — chromagram for harmonic analysis
|
|
21
|
+
- `get_onsets` — transient detection
|
|
22
|
+
- `get_momentary_loudness` — short-term loudness
|
|
23
|
+
- `get_spectral_shape` — centroid, spread, skewness, kurtosis
|
|
24
|
+
- All device parameter reads and session state tools
|
|
25
|
+
|
|
26
|
+
**Evaluation quality:** Highest. Critics use measured spectral evidence. Before/after comparisons are numerically precise.
|
|
27
|
+
|
|
28
|
+
## Mode: measured_degraded
|
|
29
|
+
|
|
30
|
+
Analyzer data is present but stale or intermittent.
|
|
31
|
+
|
|
32
|
+
**Indicators:**
|
|
33
|
+
- SpectralCache age > 5 seconds
|
|
34
|
+
- Intermittent UDP packet loss from M4L device
|
|
35
|
+
- M4L bridge loaded but analyzer section not receiving audio
|
|
36
|
+
|
|
37
|
+
**Available measurements:**
|
|
38
|
+
- All session state tools (tracks, clips, devices, parameters)
|
|
39
|
+
- Cached spectral data (may not reflect current audio)
|
|
40
|
+
- Device parameter reads (always fresh)
|
|
41
|
+
|
|
42
|
+
**Evaluation quality:** Moderate. Spectral comparisons may be inaccurate if data is stale. Always check cache age before trusting spectrum values.
|
|
43
|
+
|
|
44
|
+
**User notification:** "Analyzer data may be stale. For accurate spectral evaluation, play audio through the master bus and wait 2-3 seconds for the cache to refresh."
|
|
45
|
+
|
|
46
|
+
## Mode: judgment_only
|
|
47
|
+
|
|
48
|
+
No M4L analyzer connected. The evaluation engine operates on structural and parametric data only.
|
|
49
|
+
|
|
50
|
+
**Indicators:**
|
|
51
|
+
- M4L bridge not loaded on master track
|
|
52
|
+
- UDP 9880 not receiving data
|
|
53
|
+
- `get_master_spectrum` returns error or empty data
|
|
54
|
+
|
|
55
|
+
**Available measurements:**
|
|
56
|
+
- All session state tools
|
|
57
|
+
- Device parameter reads
|
|
58
|
+
- Track structure (names, types, device chains)
|
|
59
|
+
- Note and clip data
|
|
60
|
+
- Role-based heuristics (bass tracks should have low content, etc.)
|
|
61
|
+
|
|
62
|
+
**Evaluation quality:** Limited. No spectral evidence for masking, balance, or loudness judgments. Critics infer from:
|
|
63
|
+
- Track names and roles (a track named "Bass" should have low-frequency content)
|
|
64
|
+
- Device chains (a track with EQ Eight + Compressor is likely processed)
|
|
65
|
+
- Parameter values (filter cutoff position, compressor threshold)
|
|
66
|
+
- Volume/pan/send positions
|
|
67
|
+
|
|
68
|
+
**User notification:** "M4L analyzer is not connected. Evaluation is based on track structure and parameter analysis only. For spectral verification, load the LivePilot Bridge device on the master track."
|
|
69
|
+
|
|
70
|
+
## Mode: read_only
|
|
71
|
+
|
|
72
|
+
Session disconnected or in an error state.
|
|
73
|
+
|
|
74
|
+
**Indicators:**
|
|
75
|
+
- TCP connection to port 9878 failed or timed out
|
|
76
|
+
- Remote Script not responding
|
|
77
|
+
- Ableton Live not running or crashed
|
|
78
|
+
|
|
79
|
+
**Available measurements:**
|
|
80
|
+
- Cached session data from last successful connection
|
|
81
|
+
- Memory system (technique recall, preferences)
|
|
82
|
+
- No live reads from the session
|
|
83
|
+
|
|
84
|
+
**Evaluation quality:** None for current state. Can only reference cached data and memory.
|
|
85
|
+
|
|
86
|
+
**User notification:** "Session disconnected. Cannot evaluate current state. Reconnect to Ableton Live to resume."
|
|
87
|
+
|
|
88
|
+
## Capability Fallback Chain
|
|
89
|
+
|
|
90
|
+
When a measurement fails, fall back gracefully:
|
|
91
|
+
|
|
92
|
+
1. Try the primary measurement tool
|
|
93
|
+
2. If it fails, check if degraded data is available in cache
|
|
94
|
+
3. If no cache, use parametric/structural heuristics
|
|
95
|
+
4. If no session connection, report inability and suggest reconnection
|
|
96
|
+
|
|
97
|
+
Never silently skip evaluation. Always inform the user which capability mode is active and how it affects the quality of judgment.
|
|
98
|
+
|
|
99
|
+
## Checking Capability State
|
|
100
|
+
|
|
101
|
+
Call `get_capability_state` at the start of any evaluation session. The response includes:
|
|
102
|
+
|
|
103
|
+
```json
|
|
104
|
+
{
|
|
105
|
+
"mode": "normal",
|
|
106
|
+
"analyzer_connected": true,
|
|
107
|
+
"bridge_version": "1.9.18",
|
|
108
|
+
"spectral_cache_age_ms": 1200,
|
|
109
|
+
"flucoma_available": false,
|
|
110
|
+
"session_connected": true
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
- `mode`: one of "normal", "measured_degraded", "judgment_only", "read_only"
|
|
115
|
+
- `analyzer_connected`: whether M4L bridge is active
|
|
116
|
+
- `spectral_cache_age_ms`: milliseconds since last spectral update
|
|
117
|
+
- `flucoma_available`: whether FluCoMa analysis tools are installed
|
|
118
|
+
- `session_connected`: whether TCP connection to Ableton is active
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# Evaluation Contracts Reference
|
|
2
|
+
|
|
3
|
+
Every evaluator returns the same base contract. Engine-specific evaluators extend it with additional fields.
|
|
4
|
+
|
|
5
|
+
## Base Evaluation Contract
|
|
6
|
+
|
|
7
|
+
Returned by `evaluate_move`:
|
|
8
|
+
|
|
9
|
+
```json
|
|
10
|
+
{
|
|
11
|
+
"keep_change": true,
|
|
12
|
+
"score": 0.72,
|
|
13
|
+
"goal_progress": 0.6,
|
|
14
|
+
"collateral_damage": [],
|
|
15
|
+
"explanation": "Filter cut at 250 Hz reduced masking by 4 dB without affecting bass body.",
|
|
16
|
+
"before_metrics": {
|
|
17
|
+
"master_rms_db": -12.4,
|
|
18
|
+
"master_peak_db": -3.2,
|
|
19
|
+
"spectrum": [...]
|
|
20
|
+
},
|
|
21
|
+
"after_metrics": {
|
|
22
|
+
"master_rms_db": -12.8,
|
|
23
|
+
"master_peak_db": -3.5,
|
|
24
|
+
"spectrum": [...]
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### Field Definitions
|
|
30
|
+
|
|
31
|
+
- **keep_change** (bool): `true` if the change improved the target without unacceptable regression. `false` if the change should be undone.
|
|
32
|
+
- **score** (float 0.0-1.0): 0.0 = catastrophic regression, 0.5 = neutral (no change), 1.0 = perfect improvement. Scores below 0.4 trigger automatic undo recommendation.
|
|
33
|
+
- **goal_progress** (float 0.0-1.0): how much of the stated goal has been achieved. 1.0 means the goal is fully met. Use this to decide whether to continue iterating.
|
|
34
|
+
- **collateral_damage** (list of strings): side effects that got worse. Empty list means no regressions detected. Examples: "bass lost 2 dB of body", "stereo width narrowed by 15%".
|
|
35
|
+
- **explanation** (string): one-sentence human-readable summary of the judgment. Always report this to the user.
|
|
36
|
+
|
|
37
|
+
## Mix Evaluation Contract
|
|
38
|
+
|
|
39
|
+
Returned by `evaluate_mix_move`, extends base with:
|
|
40
|
+
|
|
41
|
+
```json
|
|
42
|
+
{
|
|
43
|
+
"targets": {
|
|
44
|
+
"reduce_masking": { "before": 0.72, "after": 0.35, "improved": true },
|
|
45
|
+
"maintain_headroom": { "before": -3.2, "after": -3.5, "ok": true }
|
|
46
|
+
},
|
|
47
|
+
"protect": {
|
|
48
|
+
"bass_body": { "before": -14.2, "after": -14.8, "ok": true },
|
|
49
|
+
"vocal_presence": { "before": -8.1, "after": -8.0, "ok": true }
|
|
50
|
+
},
|
|
51
|
+
"spectral_delta_db": {
|
|
52
|
+
"sub": 0.1, "low": -0.3, "low_mid": -2.1,
|
|
53
|
+
"mid": 0.2, "high_mid": 0.1, "high": 0.0
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
- **targets**: what the move aimed to improve, with before/after measurements
|
|
59
|
+
- **protect**: what must not get worse, with tolerance checking
|
|
60
|
+
- **spectral_delta_db**: per-band change in spectral energy
|
|
61
|
+
|
|
62
|
+
## Composition Evaluation Contract
|
|
63
|
+
|
|
64
|
+
Returned by `evaluate_composition_move`, extends base with:
|
|
65
|
+
|
|
66
|
+
```json
|
|
67
|
+
{
|
|
68
|
+
"structural_coherence": 0.85,
|
|
69
|
+
"thematic_continuity": 0.78,
|
|
70
|
+
"energy_delta": 0.15,
|
|
71
|
+
"transition_smoothness": 0.82,
|
|
72
|
+
"note_count_delta": 12
|
|
73
|
+
}
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
- **structural_coherence**: how well the change fits the overall form
|
|
77
|
+
- **thematic_continuity**: whether existing motifs are maintained or developed (not broken)
|
|
78
|
+
- **energy_delta**: change in section energy level
|
|
79
|
+
- **transition_smoothness**: quality of section boundaries after the change
|
|
80
|
+
|
|
81
|
+
## Fabric Evaluation Contract
|
|
82
|
+
|
|
83
|
+
Returned by `evaluate_with_fabric`, extends base with:
|
|
84
|
+
|
|
85
|
+
```json
|
|
86
|
+
{
|
|
87
|
+
"taste_alignment": 0.88,
|
|
88
|
+
"anti_preference_violations": [],
|
|
89
|
+
"similar_past_moves": [
|
|
90
|
+
{ "memory_id": "mix_001", "similarity": 0.91, "past_score": 0.85 }
|
|
91
|
+
],
|
|
92
|
+
"novelty_score": 0.3
|
|
93
|
+
}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
- **taste_alignment**: how well the move matches the user's saved taste profile
|
|
97
|
+
- **anti_preference_violations**: list of anti-preferences this move conflicts with (should be empty)
|
|
98
|
+
- **similar_past_moves**: techniques from memory that resemble this move, with their past scores
|
|
99
|
+
- **novelty_score**: how different this move is from past approaches (high = novel, low = familiar)
|
|
100
|
+
|
|
101
|
+
## Scoring Thresholds
|
|
102
|
+
|
|
103
|
+
| Score Range | Interpretation | Action |
|
|
104
|
+
|------------|---------------|--------|
|
|
105
|
+
| 0.0 - 0.3 | Significant regression | Auto-undo, explain damage |
|
|
106
|
+
| 0.3 - 0.45 | Mild regression | Undo recommended, ask user |
|
|
107
|
+
| 0.45 - 0.55 | Neutral / no effect | Keep but note it had no impact |
|
|
108
|
+
| 0.55 - 0.7 | Mild improvement | Keep, continue iterating |
|
|
109
|
+
| 0.7 - 0.85 | Clear improvement | Keep, suggest memory promotion |
|
|
110
|
+
| 0.85 - 1.0 | Excellent improvement | Keep, strongly suggest promotion |
|
|
111
|
+
|
|
112
|
+
## Collateral Damage Categories
|
|
113
|
+
|
|
114
|
+
Common side effects to check for:
|
|
115
|
+
|
|
116
|
+
- **bass_body_loss**: EQ cuts in the low-mid range reduced bass warmth
|
|
117
|
+
- **stereo_narrowing**: mono compatibility fix reduced perceived width
|
|
118
|
+
- **headroom_reduction**: boost increased master peak level
|
|
119
|
+
- **transient_loss**: compression removed punch from drums
|
|
120
|
+
- **vocal_masking**: frequency boost created new masking with vocal track
|
|
121
|
+
- **phase_issue**: stereo manipulation introduced phase cancellation
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# Memory Promotion Reference
|
|
2
|
+
|
|
3
|
+
Memory promotion saves successful production moves to persistent storage for recall in future sessions.
|
|
4
|
+
|
|
5
|
+
## Promotion Flow
|
|
6
|
+
|
|
7
|
+
1. A move scores > 0.7 in evaluation
|
|
8
|
+
2. Call `get_promotion_candidates` to list all eligible moves from this session
|
|
9
|
+
3. Present the candidate to the user with score and description
|
|
10
|
+
4. If the user confirms, call `memory_learn(type, data)` to save
|
|
11
|
+
5. The technique is now available via `memory_recall` in future sessions
|
|
12
|
+
|
|
13
|
+
## Promotion Candidates
|
|
14
|
+
|
|
15
|
+
`get_promotion_candidates` returns moves that meet all criteria:
|
|
16
|
+
|
|
17
|
+
- Evaluation score > 0.7
|
|
18
|
+
- `keep_change` was `true`
|
|
19
|
+
- The move has not already been promoted
|
|
20
|
+
- The move does not conflict with any anti-preference
|
|
21
|
+
|
|
22
|
+
Response format:
|
|
23
|
+
```json
|
|
24
|
+
{
|
|
25
|
+
"candidates": [
|
|
26
|
+
{
|
|
27
|
+
"action_id": "act_001",
|
|
28
|
+
"move_type": "eq_cut",
|
|
29
|
+
"score": 0.85,
|
|
30
|
+
"goal": "reduce masking between bass and kick",
|
|
31
|
+
"parameters": {
|
|
32
|
+
"track": "Bass",
|
|
33
|
+
"device": "EQ Eight",
|
|
34
|
+
"band": 3,
|
|
35
|
+
"frequency": 250,
|
|
36
|
+
"gain_db": -4.5,
|
|
37
|
+
"q": 2.0
|
|
38
|
+
},
|
|
39
|
+
"explanation": "4.5 dB cut at 250 Hz on bass cleared kick presence without losing bass warmth"
|
|
40
|
+
}
|
|
41
|
+
]
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Memory Types
|
|
46
|
+
|
|
47
|
+
When calling `memory_learn`, specify the type:
|
|
48
|
+
|
|
49
|
+
- `mix_template` — mixing techniques (EQ curves, compression settings, gain staging recipes)
|
|
50
|
+
- `sound_design` — patch design moves (modulation settings, filter configurations, oscillator tuning)
|
|
51
|
+
- `composition` — structural techniques (transition patterns, arrangement gestures, motif transformations)
|
|
52
|
+
- `automation` — automation curves and recipes
|
|
53
|
+
- `performance` — live performance patterns (scene orderings, safe macro ranges)
|
|
54
|
+
|
|
55
|
+
## Anti-Preferences
|
|
56
|
+
|
|
57
|
+
Anti-preferences are the inverse of promotion — they record moves the user explicitly rejected.
|
|
58
|
+
|
|
59
|
+
### Recording
|
|
60
|
+
|
|
61
|
+
Call `record_anti_preference(description)` when:
|
|
62
|
+
- The user says "I hate that", "never do that again", "that's wrong"
|
|
63
|
+
- A move is undone and the user expresses displeasure (not just neutral undo)
|
|
64
|
+
- The user explicitly states a preference against a technique
|
|
65
|
+
|
|
66
|
+
### Checking
|
|
67
|
+
|
|
68
|
+
Call `get_anti_preferences` before suggesting any move. The response lists all recorded anti-preferences with descriptions and creation dates.
|
|
69
|
+
|
|
70
|
+
### Format
|
|
71
|
+
```json
|
|
72
|
+
{
|
|
73
|
+
"anti_preferences": [
|
|
74
|
+
{
|
|
75
|
+
"id": "ap_001",
|
|
76
|
+
"description": "Never boost above 10 kHz on vocals — user finds it harsh",
|
|
77
|
+
"created": "2026-04-08T14:30:00Z"
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"id": "ap_002",
|
|
81
|
+
"description": "No sidechain compression on pads — user prefers volume automation for ducking",
|
|
82
|
+
"created": "2026-04-09T09:15:00Z"
|
|
83
|
+
}
|
|
84
|
+
]
|
|
85
|
+
}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### Rules
|
|
89
|
+
|
|
90
|
+
1. Always check anti-preferences before planning any move
|
|
91
|
+
2. If a planned move matches an anti-preference, skip it and choose an alternative
|
|
92
|
+
3. Anti-preferences are permanent until the user explicitly asks to remove one
|
|
93
|
+
4. When skipping a move due to anti-preference, tell the user: "Skipping [move] because you previously indicated [anti-preference]."
|
|
94
|
+
|
|
95
|
+
## Promotion Best Practices
|
|
96
|
+
|
|
97
|
+
1. **Do not auto-promote.** Always ask: "That scored [score] — want me to save this technique?"
|
|
98
|
+
2. **Include context in the saved data.** A raw parameter value without context (genre, source material, goal) is less useful on recall.
|
|
99
|
+
3. **Group related moves.** If three EQ cuts together solved a masking problem, save them as one technique, not three.
|
|
100
|
+
4. **Tag with genre and role.** A bass EQ technique for house music may not apply to jazz. Include tags for future filtering.
|
|
101
|
+
5. **Review periodically.** Suggest `memory_list` to the user occasionally to prune outdated techniques.
|
|
102
|
+
|
|
103
|
+
## Recall Integration
|
|
104
|
+
|
|
105
|
+
When starting a new production task:
|
|
106
|
+
|
|
107
|
+
1. Call `memory_recall(type, query)` to find relevant past techniques
|
|
108
|
+
2. Present matches with their past scores: "I found a similar technique from a past session (scored 0.85). Want me to try it here?"
|
|
109
|
+
3. If the user agrees, apply the recalled technique and evaluate as normal
|
|
110
|
+
4. If the recalled technique scores lower in the new context, note this — context sensitivity means not all techniques transfer
|