livepilot 1.26.0 → 1.26.1
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 +24 -0
- package/README.md +1 -1
- package/installer/codex.js +87 -9
- package/livepilot/.Codex-plugin/plugin.json +8 -0
- package/livepilot/.claude-plugin/plugin.json +8 -0
- package/livepilot/.mcp.json +8 -0
- package/livepilot/agents/livepilot-producer/AGENT.md +314 -0
- package/livepilot/commands/arrange.md +47 -0
- package/livepilot/commands/beat.md +81 -0
- package/livepilot/commands/evaluate.md +49 -0
- package/livepilot/commands/memory.md +22 -0
- package/livepilot/commands/mix.md +47 -0
- package/livepilot/commands/perform.md +42 -0
- package/livepilot/commands/session.md +13 -0
- package/livepilot/commands/sounddesign.md +58 -0
- package/livepilot/rubrics/default_preset_check.md +82 -0
- package/livepilot/rubrics/layer_accumulation.md +79 -0
- package/livepilot/rubrics/layer_precision.md +79 -0
- package/livepilot/rubrics/modulation_presence.md +63 -0
- package/livepilot/rubrics/sound_design_depth.md +40 -0
- package/livepilot/skills/livepilot-arrangement/SKILL.md +164 -0
- package/livepilot/skills/livepilot-composition-engine/SKILL.md +151 -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 +261 -0
- package/livepilot/skills/livepilot-core/references/ableton-workflow-patterns.md +831 -0
- package/livepilot/skills/livepilot-core/references/affordances/_schema.md +160 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/auto-filter.yaml +133 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/chorus-ensemble.yaml +91 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/compressor.yaml +98 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/convolution-reverb.yaml +113 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/corpus.yaml +84 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/drift.yaml +105 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/echo.yaml +108 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/eq-eight.yaml +95 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/glue-compressor.yaml +88 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/granulator-iii.yaml +104 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/hybrid-reverb.yaml +83 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/operator.yaml +98 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/ping-pong-delay.yaml +104 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/poli.yaml +98 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/saturator.yaml +98 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/shifter.yaml +77 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/simpler.yaml +113 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/utility.yaml +95 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/vinyl-distortion.yaml +92 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/wavetable.yaml +98 -0
- package/livepilot/skills/livepilot-core/references/artist-vocabularies.md +389 -0
- package/livepilot/skills/livepilot-core/references/automation-atlas.md +272 -0
- package/livepilot/skills/livepilot-core/references/concepts/_schema.md +158 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/akufen.yaml +116 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/aphex-twin.yaml +133 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/arca-sophie.yaml +131 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/autechre.yaml +130 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/basic-channel.yaml +140 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/basinski.yaml +126 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/boards-of-canada.yaml +124 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/burial.yaml +127 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/com-truise-tycho.yaml +121 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/daft-punk.yaml +117 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/dj-premier-rza.yaml +119 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/gas.yaml +134 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/hawtin.yaml +127 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/isolee-luomo.yaml +130 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/j-dilla.yaml +133 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/jeff-mills.yaml +120 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/johannsson-richter.yaml +132 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/madlib.yaml +124 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/moodymann-theo-parrish.yaml +121 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/oneohtrix-point-never.yaml +126 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/photek-source-direct.yaml +120 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/rashad-spinn-traxman.yaml +122 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/robert-henke.yaml +113 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/shackleton.yaml +124 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/skream-mala.yaml +119 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/stars-of-the-lid.yaml +119 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/tim-hecker.yaml +122 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/villalobos.yaml +135 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/ambient.yaml +137 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/boom_bap.yaml +124 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/deep-minimal.yaml +130 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/deep_house.yaml +130 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/detroit_techno.yaml +116 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/disco.yaml +123 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/downtempo.yaml +129 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/drone.yaml +133 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/drum-and-bass.yaml +119 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/dub-techno.yaml +132 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/dub.yaml +129 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/dubstep.yaml +120 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/experimental.yaml +136 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/footwork.yaml +119 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/hip-hop.yaml +132 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/house.yaml +126 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/hyperpop.yaml +128 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/idm.yaml +134 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/lo_fi.yaml +129 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/microhouse.yaml +138 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/minimal-techno.yaml +116 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/modern-classical.yaml +123 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/soul.yaml +125 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/synthwave.yaml +123 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/techno.yaml +123 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/trap.yaml +120 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/uk-garage.yaml +121 -0
- package/livepilot/skills/livepilot-core/references/device-atlas/00-index.md +110 -0
- package/livepilot/skills/livepilot-core/references/device-atlas/distortion-and-character.md +687 -0
- package/livepilot/skills/livepilot-core/references/device-atlas/drums-and-percussion.md +753 -0
- package/livepilot/skills/livepilot-core/references/device-atlas/dynamics-and-punch.md +525 -0
- package/livepilot/skills/livepilot-core/references/device-atlas/eq-and-filtering.md +402 -0
- package/livepilot/skills/livepilot-core/references/device-atlas/midi-tools.md +963 -0
- package/livepilot/skills/livepilot-core/references/device-atlas/movement-and-modulation.md +874 -0
- package/livepilot/skills/livepilot-core/references/device-atlas/space-and-depth.md +571 -0
- package/livepilot/skills/livepilot-core/references/device-atlas/spectral-and-weird.md +714 -0
- package/livepilot/skills/livepilot-core/references/device-atlas/synths-native.md +953 -0
- package/livepilot/skills/livepilot-core/references/device-knowledge/00-index.md +34 -0
- package/livepilot/skills/livepilot-core/references/device-knowledge/automation-as-music.md +204 -0
- package/livepilot/skills/livepilot-core/references/device-knowledge/chains-genre.md +173 -0
- package/livepilot/skills/livepilot-core/references/device-knowledge/creative-thinking.md +211 -0
- package/livepilot/skills/livepilot-core/references/device-knowledge/effects-distortion.md +188 -0
- package/livepilot/skills/livepilot-core/references/device-knowledge/effects-space.md +162 -0
- package/livepilot/skills/livepilot-core/references/device-knowledge/effects-spectral.md +229 -0
- package/livepilot/skills/livepilot-core/references/device-knowledge/instruments-synths.md +243 -0
- package/livepilot/skills/livepilot-core/references/genre-vocabularies.md +382 -0
- package/livepilot/skills/livepilot-core/references/m4l-devices.md +352 -0
- package/livepilot/skills/livepilot-core/references/memory-guide.md +178 -0
- package/livepilot/skills/livepilot-core/references/midi-recipes.md +402 -0
- package/livepilot/skills/livepilot-core/references/mixing-patterns.md +578 -0
- package/livepilot/skills/livepilot-core/references/overview.md +300 -0
- package/livepilot/skills/livepilot-core/references/pack-knowledge.md +319 -0
- package/livepilot/skills/livepilot-core/references/sample-manipulation.md +724 -0
- package/livepilot/skills/livepilot-core/references/sound-design-deep.md +140 -0
- package/livepilot/skills/livepilot-core/references/sound-design.md +393 -0
- package/livepilot/skills/livepilot-corpus-builder/SKILL.md +379 -0
- package/livepilot/skills/livepilot-creative-director/SKILL.md +455 -0
- package/livepilot/skills/livepilot-creative-director/references/anti-repetition-rules.md +214 -0
- package/livepilot/skills/livepilot-creative-director/references/creative-brief-template.md +222 -0
- package/livepilot/skills/livepilot-creative-director/references/hybrid-compilation.md +185 -0
- package/livepilot/skills/livepilot-creative-director/references/move-family-diversity-rule.md +258 -0
- package/livepilot/skills/livepilot-creative-director/references/phase-6-execution.md +409 -0
- package/livepilot/skills/livepilot-creative-director/references/the-four-move-rule.md +192 -0
- package/livepilot/skills/livepilot-devices/SKILL.md +213 -0
- package/livepilot/skills/livepilot-devices/references/load_browser_item-uri-grammar.md +82 -0
- package/livepilot/skills/livepilot-evaluation/SKILL.md +195 -0
- package/livepilot/skills/livepilot-evaluation/references/capability-modes.md +176 -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 +136 -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 +157 -0
- package/livepilot/skills/livepilot-notes/SKILL.md +130 -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 +151 -0
- package/livepilot/skills/livepilot-sample-engine/SKILL.md +117 -0
- package/livepilot/skills/livepilot-sample-engine/references/sample-critics.md +87 -0
- package/livepilot/skills/livepilot-sample-engine/references/sample-philosophy.md +51 -0
- package/livepilot/skills/livepilot-sample-engine/references/sample-techniques.md +131 -0
- package/livepilot/skills/livepilot-sound-design-engine/SKILL.md +225 -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/livepilot/skills/livepilot-wonder/SKILL.md +143 -0
- package/m4l_device/LivePilot_Analyzer.amxd +0 -0
- package/m4l_device/LivePilot_Elektron.amxd +0 -0
- package/m4l_device/LivePilot_Elektron.maxpat +758 -0
- package/m4l_device/livepilot_bridge.js +1 -1
- package/m4l_device/livepilot_elektron_bridge.js +82 -0
- package/mcp_server/__init__.py +1 -1
- package/mcp_server/composer/develop/apply.py +1 -1
- package/mcp_server/composer/full/apply.py +32 -6
- package/mcp_server/m4l_bridge.py +5 -0
- package/mcp_server/runtime/execution_router.py +6 -0
- package/mcp_server/runtime/mcp_dispatch.py +18 -0
- package/mcp_server/runtime/remote_commands.py +2 -0
- package/mcp_server/server.py +11 -7
- package/package.json +20 -5
- package/remote_script/LivePilot/__init__.py +1 -1
- package/remote_script/LivePilot/server.py +63 -2
- package/requirements.txt +3 -3
- package/server.json +3 -3
|
@@ -0,0 +1,176 @@
|
|
|
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` — 9-band spectral analysis (sub_low → air), 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 is a nested `domains` dict keyed by capability name — NOT the flat shape older docs described.
|
|
102
|
+
|
|
103
|
+
```json
|
|
104
|
+
{
|
|
105
|
+
"capability_state": {
|
|
106
|
+
"generated_at_ms": 1776929160866,
|
|
107
|
+
"overall_mode": "normal",
|
|
108
|
+
"domains": {
|
|
109
|
+
"session_access": {"name": "session_access", "available": true, "confidence": 1.0, "mode": "healthy", "reasons": []},
|
|
110
|
+
"analyzer": {"name": "analyzer", "available": true, "confidence": 0.9, "mode": "available", "reasons": []},
|
|
111
|
+
"memory": {"name": "memory", "available": true, "confidence": 1.0, "mode": "available", "reasons": []},
|
|
112
|
+
"web": {"name": "web", "available": true, "confidence": 0.7, "mode": "available", "reasons": []},
|
|
113
|
+
"research": {"name": "research", "available": true, "confidence": 0.9, "mode": "available", "reasons": []},
|
|
114
|
+
"flucoma": {"name": "flucoma", "available": false, "confidence": 0.0, "mode": "unavailable", "reasons": ["flucoma_not_installed"]}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### Top-level fields
|
|
121
|
+
|
|
122
|
+
- `capability_state.generated_at_ms`: Unix-ms timestamp of the probe.
|
|
123
|
+
- `capability_state.overall_mode`: one of `"normal"`, `"measured_degraded"`, `"judgment_only"`, `"read_only"` — the global evaluation-quality tier computed from the per-domain signals.
|
|
124
|
+
- `capability_state.domains`: dict keyed by domain name; each value is a capability-domain record.
|
|
125
|
+
|
|
126
|
+
### Per-domain fields
|
|
127
|
+
|
|
128
|
+
Every entry in `domains` has the same shape:
|
|
129
|
+
|
|
130
|
+
- `name`: the domain key (`"session_access"`, `"analyzer"`, `"memory"`, `"web"`, `"research"`, `"flucoma"`).
|
|
131
|
+
- `available`: boolean — is this capability ready to use right now?
|
|
132
|
+
- `confidence`: 0.0–1.0 — how much to trust the `available` flag (e.g. stale analyzer data lowers confidence).
|
|
133
|
+
- `mode`: short human label specific to the domain (`"healthy"`, `"available"`, `"measured"`, `"stale"`, `"targeted_only"`, `"full"`, `"unavailable"`).
|
|
134
|
+
- `reasons`: list of short machine-readable tokens explaining why the domain is in its current state (`"analyzer_offline"`, `"web_unavailable"`, `"flucoma_not_installed"`, …). Empty when healthy.
|
|
135
|
+
- `freshness_ms`: optional — milliseconds since the domain last received fresh data (currently only the analyzer domain populates this).
|
|
136
|
+
|
|
137
|
+
### Domain definitions
|
|
138
|
+
|
|
139
|
+
- **session_access** — live TCP connectivity to the Ableton Remote Script on port 9878. `available=true` means a `get_session_info` round-trip succeeded.
|
|
140
|
+
- **analyzer** — the M4L bridge + spectral cache. `available=true` requires the bridge to be connected AND the spectral cache to have recently received data.
|
|
141
|
+
- **memory** — the local technique-store / taste memory. `available=true` means the persistent stores can be read and written.
|
|
142
|
+
- **web** — server-side outbound HTTP capability. True when the MCP host can reach an arbitrary public URL (probed by a 500 ms HEAD request to `https://api.github.com`). Does NOT imply curated research corpora are installed — see the `research` domain for that.
|
|
143
|
+
- **research** — composite over `session_access`, `memory`, and `web`. `mode="full"` when all three are available; `"targeted_only"` when at least one source is up; `"unavailable"` when nothing is reachable.
|
|
144
|
+
- **flucoma** — whether the optional `flucoma` Python package is importable (probed via `importlib.util.find_spec`). FluCoMa-backed tools (`check_flucoma`, `extract_timbre_fingerprint`, etc.) degrade gracefully when this domain is unavailable.
|
|
145
|
+
|
|
146
|
+
## Collaborative Mode (Live 12.4+)
|
|
147
|
+
|
|
148
|
+
Live 12.4 introduces a new capability tier that unlocks native LOM access for sample replacement. This tier is separate from the evaluation modes above — it affects routing behavior in the MCP server, not spectral measurement.
|
|
149
|
+
|
|
150
|
+
**Version gate:** Live 12.4.0+
|
|
151
|
+
|
|
152
|
+
**Detection flag:** `LiveVersionCapabilities.has_replace_sample_native == True`
|
|
153
|
+
(exposed on `LiveVersionCapabilities.capability_tier == "collaborative"`)
|
|
154
|
+
|
|
155
|
+
**What changes at this tier:**
|
|
156
|
+
- `SimplerDevice.replace_sample(path)` is available as a native LOM call.
|
|
157
|
+
The MCP tools `replace_simpler_sample` and `load_sample_to_simpler`
|
|
158
|
+
route to this native path automatically.
|
|
159
|
+
- The native path handles empty Simplers — the long-standing limitation
|
|
160
|
+
(documented in `feedback_load_browser_item_is_source_of_truth.md`)
|
|
161
|
+
that required `load_browser_item` as a workaround no longer applies
|
|
162
|
+
on Live 12.4+.
|
|
163
|
+
|
|
164
|
+
**Backward compatibility:**
|
|
165
|
+
- Live 12.0–12.3.x: `has_replace_sample_native == False`. All sample
|
|
166
|
+
replacement still routes through the M4L bridge. Zero behavior change.
|
|
167
|
+
- Live 12.4+: native path preferred; M4L bridge used only on fallback.
|
|
168
|
+
|
|
169
|
+
**Tool signatures:** unchanged. Callers do not need to detect the tier —
|
|
170
|
+
routing is transparent.
|
|
171
|
+
|
|
172
|
+
**Follow-up plans (not yet shipped):**
|
|
173
|
+
- Link Audio (tempo-sync sharing between Live sets) — tracked as a
|
|
174
|
+
future Collaborative-tier feature.
|
|
175
|
+
- Stem Separation v2 — tracked as a future Collaborative-tier feature.
|
|
176
|
+
Neither is available in the 1.26.1 release — still pending.
|
|
@@ -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(name, type, qualities, payload)` 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(dimension, direction)` 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
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: livepilot-mix-engine
|
|
3
|
+
description: This skill should be used when the user asks to "analyze my mix", "find mix issues", "fix masking", "check frequency clashes", "improve dynamics", "check stereo width", "check headroom", or wants critic-driven mix analysis and evaluation. Provides the mix critic loop for iterative mix improvement.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Mix Engine — Critic-Driven Mix Improvement
|
|
7
|
+
|
|
8
|
+
The mix engine runs an iterative critic loop: analyze, plan, execute, measure, evaluate, keep or undo. Every mix change is measured before and after. Nothing stays unless it scores better than the original.
|
|
9
|
+
|
|
10
|
+
## The Mix Critic Loop
|
|
11
|
+
|
|
12
|
+
Follow these steps in order. Do not skip the evaluation step.
|
|
13
|
+
|
|
14
|
+
### Step 1 — Analyze
|
|
15
|
+
|
|
16
|
+
Call `analyze_mix` or `get_mix_issues` to build a MixState and run all critics against the current session. The response contains an `issues` array, each with a `critic`, `severity`, `track_index`, and `evidence` dict.
|
|
17
|
+
|
|
18
|
+
If the M4L analyzer bridge is absent, critics fall back to role-based heuristics only (track names, device chains, volume/pan positions). Inform the user that spectral analysis is unavailable and recommendations are less precise.
|
|
19
|
+
|
|
20
|
+
For detailed frequency collision data, call `get_masking_report`. For a quick status overview without the full critic pass, call `get_mix_summary`.
|
|
21
|
+
|
|
22
|
+
### Step 2 — Plan
|
|
23
|
+
|
|
24
|
+
Pick the highest-severity issue from the `issues` array. Call `plan_mix_move` with the issue data. The planner returns the smallest intervention that addresses the problem — a single parameter change, not a chain of edits.
|
|
25
|
+
|
|
26
|
+
Read the `move` object: it contains `move_type`, `target_track`, `target_device`, `target_parameter`, `target_value`, and `rationale`. Consult the move vocabulary in `references/mix-moves.md` for parameter ranges.
|
|
27
|
+
|
|
28
|
+
### Step 3 — Capture Before
|
|
29
|
+
|
|
30
|
+
Take a measurement snapshot before executing anything:
|
|
31
|
+
|
|
32
|
+
1. Call `get_master_spectrum` — save the 9-band spectral data (sub_low → air)
|
|
33
|
+
2. Call `get_master_rms` — save the RMS and peak values
|
|
34
|
+
|
|
35
|
+
Optionally call `get_mix_snapshot` if you need per-track volume/pan/send state for the evaluation.
|
|
36
|
+
|
|
37
|
+
### Step 4 — Execute
|
|
38
|
+
|
|
39
|
+
Execute the planned move. Use the appropriate tool for the move type:
|
|
40
|
+
|
|
41
|
+
- `set_device_parameter` for EQ cuts/boosts, compressor thresholds, saturation drives
|
|
42
|
+
- `set_track_volume` for gain staging
|
|
43
|
+
- `set_track_pan` for stereo placement
|
|
44
|
+
- `set_track_send` for bus routing levels
|
|
45
|
+
- `toggle_device` for bypassing/enabling processors
|
|
46
|
+
- `batch_set_parameters` when the move requires multiple related parameter changes on the same device
|
|
47
|
+
|
|
48
|
+
Execute exactly one move. Do not chain multiple interventions before measuring.
|
|
49
|
+
|
|
50
|
+
### Step 5 — Capture After
|
|
51
|
+
|
|
52
|
+
Repeat the same measurements from Step 3:
|
|
53
|
+
|
|
54
|
+
1. Call `get_master_spectrum` — save the post-change spectral data
|
|
55
|
+
2. Call `get_master_rms` — save the post-change RMS and peak values
|
|
56
|
+
|
|
57
|
+
### Step 6 — Evaluate
|
|
58
|
+
|
|
59
|
+
Call `evaluate_mix_move` with the before and after snapshots:
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
evaluate_mix_move(
|
|
63
|
+
before_snapshot: { spectrum: [...], rms: float, peak: float },
|
|
64
|
+
after_snapshot: { spectrum: [...], rms: float, peak: float },
|
|
65
|
+
targets: { ... }, # what the move aimed to improve
|
|
66
|
+
protect: { ... } # what must not get worse
|
|
67
|
+
)
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Read the response: `keep_change` (bool), `score` (0.0-1.0), `improvements` (list), `regressions` (list), `explanation` (string).
|
|
71
|
+
|
|
72
|
+
### Step 7 — Keep or Undo
|
|
73
|
+
|
|
74
|
+
If `keep_change` is `false`, call `undo()` immediately. Tell the user what was tried and why it was reverted, citing the `regressions` list.
|
|
75
|
+
|
|
76
|
+
If `keep_change` is `true`, report the improvement to the user with the score and explanation.
|
|
77
|
+
|
|
78
|
+
### Step 8 — Learn (Optional)
|
|
79
|
+
|
|
80
|
+
If the move scored above 0.7 and the user confirms satisfaction, call `memory_learn(name="...", type="mix_template", qualities={"summary": "..."}, payload={...})` to save the technique for future recall.
|
|
81
|
+
|
|
82
|
+
### Step 9 — Repeat
|
|
83
|
+
|
|
84
|
+
Return to Step 1 and re-analyze. The critic list updates after each change. Continue until no high-severity issues remain or the user says to stop.
|
|
85
|
+
|
|
86
|
+
## Quick Mix Checks
|
|
87
|
+
|
|
88
|
+
Not every request needs the full loop:
|
|
89
|
+
|
|
90
|
+
- **"How's my mix?"** — Call `get_mix_summary` for a one-shot status report with no changes
|
|
91
|
+
- **"What's clashing?"** — Call `get_masking_report` for detailed per-pair frequency collision data
|
|
92
|
+
- **"What are the issues?"** — Call `get_mix_issues` for the critic list without executing any fixes
|
|
93
|
+
|
|
94
|
+
## Critic Types
|
|
95
|
+
|
|
96
|
+
Six critics run during analysis. See `references/mix-critics.md` for thresholds and evidence format:
|
|
97
|
+
|
|
98
|
+
- **masking** — frequency collisions between overlapping tracks
|
|
99
|
+
- **over_compressed** — excessive compression reducing dynamic range
|
|
100
|
+
- **flat_dynamics** — insufficient volume variation across sections
|
|
101
|
+
- **low_headroom** — master peak too close to 0 dBFS
|
|
102
|
+
- **stereo_width** — mono collapse or excessive width on specific elements
|
|
103
|
+
- **spectral_balance** — overall tonal balance skew (too bright, too dark, mid-heavy)
|
|
104
|
+
|
|
105
|
+
## Move Vocabulary
|
|
106
|
+
|
|
107
|
+
The planner draws from six move types. See `references/mix-moves.md` for parameter ranges:
|
|
108
|
+
|
|
109
|
+
- **gain_staging** — volume adjustments to establish proper level hierarchy
|
|
110
|
+
- **bus_compression** — glue compression on groups or master
|
|
111
|
+
- **transient_shaping** — attack/sustain manipulation for punch or smoothness
|
|
112
|
+
- **eq_cut** — subtractive EQ to clear masking or remove resonances
|
|
113
|
+
- **eq_boost** — additive EQ to bring out character (use sparingly)
|
|
114
|
+
- **pan_spread** — stereo placement adjustments for width and separation
|
|
115
|
+
|
|
116
|
+
## Analyzer Dependency
|
|
117
|
+
|
|
118
|
+
The mix engine works in two modes:
|
|
119
|
+
|
|
120
|
+
- **Full mode** (M4L analyzer connected): spectral data, RMS, key detection available. Critics use measured evidence.
|
|
121
|
+
- **Heuristic mode** (no analyzer): critics infer from track names, device chains, and parameter positions. Always inform the user: "Spectral analysis unavailable — recommendations are based on track structure and device settings only."
|
|
122
|
+
|
|
123
|
+
Call `get_capability_state` to check which mode is active before starting the loop.
|
|
124
|
+
|
|
125
|
+
## Extended Perception Toolkit
|
|
126
|
+
|
|
127
|
+
Beyond `get_master_spectrum` / `get_master_rms` / `get_detected_key`, the analyzer domain exposes six more measurements that give finer evidence than the 9-band spectrum alone. Use them when the standard snapshot is too coarse for the move you are evaluating:
|
|
128
|
+
|
|
129
|
+
- **`get_spectral_shape`** — centroid, spread, skewness, kurtosis, rolloff, flatness, crest. Use for *tonal balance* judgments ("is this bright?", "is the energy concentrated or spread?") that 9 discrete bands cannot describe.
|
|
130
|
+
- **`get_mel_spectrum`** — perceptual mel-band energies. Use when an EQ move needs to be evaluated against how the change is *heard*, not against linear-frequency bin energies.
|
|
131
|
+
- **`get_chroma`** — 12-bin pitch-class energy. Use to detect harmonic clashes or to confirm a key without trusting `get_detected_key` alone.
|
|
132
|
+
- **`get_onsets`** — transient detection. Use for groove / rhythm evaluations where you need to know *when* hits land, not just how loud the average is.
|
|
133
|
+
- **`get_novelty`** — spectral change score with boundary flag. Use to confirm an arrangement boundary actually creates a perceived event, or to detect static sections that need disruption.
|
|
134
|
+
- **`get_momentary_loudness`** — momentary LUFS + true-peak dBTP. Use during mastering moves where peak/RMS is insufficient and EBU R128 is the gauge.
|
|
135
|
+
|
|
136
|
+
All six are bridge-dependent — they return helpful errors if the analyzer is not on master. They do not replace the before/after snapshot pattern; they enrich what "snapshot" means when the move warrants it.
|