livepilot 1.25.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 +80 -0
- package/README.md +9 -9
- 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/atlas/tools.py +63 -12
- package/mcp_server/audit/checks.py +167 -6
- package/mcp_server/audit/state.py +88 -0
- package/mcp_server/audit/tools.py +6 -69
- package/mcp_server/composer/develop/apply.py +2 -2
- package/mcp_server/composer/full/apply.py +32 -6
- package/mcp_server/grader/__init__.py +17 -0
- package/mcp_server/grader/client.py +647 -0
- package/mcp_server/grader/iterator.py +57 -0
- package/mcp_server/grader/tools.py +263 -0
- 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 +12 -7
- package/mcp_server/tools/browser.py +68 -0
- package/package.json +20 -5
- package/remote_script/LivePilot/__init__.py +1 -1
- package/remote_script/LivePilot/server.py +63 -2
- package/requirements.txt +24 -3
- package/server.json +3 -3
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: arrange
|
|
3
|
+
description: Guided arrangement — build song structure with sections, transitions, and energy flow
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Guide the user through arranging their session using the V2 orchestration pipeline.
|
|
7
|
+
|
|
8
|
+
## Orchestration Flow
|
|
9
|
+
|
|
10
|
+
1. **Session kernel** — `get_session_kernel(request_text=<user's request>, mode="improve")`
|
|
11
|
+
2. **Route** — `route_request(<user's request>)` for engine routes + semantic moves
|
|
12
|
+
|
|
13
|
+
## Analysis Phase
|
|
14
|
+
|
|
15
|
+
3. **Scene matrix** — `get_scene_matrix` for the full clip grid
|
|
16
|
+
4. **Section purposes** — `infer_section_purposes` to understand what each scene is doing
|
|
17
|
+
5. **Emotional arc** — `score_emotional_arc` — does the song have build → climax → resolve?
|
|
18
|
+
6. **Repetition check** — `detect_repetition_fatigue` — are patterns overused?
|
|
19
|
+
7. **Motif analysis** — `get_motif_graph` for recurring patterns and fatigue risk
|
|
20
|
+
8. **Role conflicts** — `detect_role_conflicts` to find competing tracks
|
|
21
|
+
|
|
22
|
+
## Planning Phase
|
|
23
|
+
|
|
24
|
+
9. **Ask about target** — what form? (verse-chorus, build-drop, through-composed). What energy arc?
|
|
25
|
+
10. **Plan arrangement** — `plan_arrangement(target_bars, style)` for section blueprint
|
|
26
|
+
11. **Propose moves** — `propose_next_best_move(request_text)` for arrangement semantic moves (e.g., `create_buildup_tension`, `smooth_scene_handoff`)
|
|
27
|
+
12. **Preview** — `preview_semantic_move(move_id)` to see the gesture plan
|
|
28
|
+
|
|
29
|
+
## Execution Phase
|
|
30
|
+
|
|
31
|
+
13. **Build sections** — duplicate scenes, set names/colors, use `transform_motif` for melodic development
|
|
32
|
+
14. **Apply gestures** — `apply_gesture_template` for transitions:
|
|
33
|
+
- `pre_arrival_vacuum` — energy suck before drops
|
|
34
|
+
- `harmonic_tint_rise` — filter opening for intros
|
|
35
|
+
- `re_entry_spotlight` — highlight returning elements
|
|
36
|
+
- `tension_ratchet` — stepped energy build
|
|
37
|
+
- `outro_decay_dissolve` — gradual dissolution
|
|
38
|
+
15. **Add organic movement** — `apply_automation_shape(curve_type="perlin")` on filters/sends
|
|
39
|
+
16. **Verify arc** — `score_emotional_arc` again to confirm improvement
|
|
40
|
+
17. **Perception check** — `capture_audio` + `analyze_loudness` to verify LRA > 2 LU
|
|
41
|
+
|
|
42
|
+
## Summary
|
|
43
|
+
|
|
44
|
+
18. **Report** — "What I did / what improved / what I protected / what remains"
|
|
45
|
+
19. **Session memory** — `add_session_memory` for arrangement decisions
|
|
46
|
+
|
|
47
|
+
For exploratory arrangement, use the branch-native experiment path (see livepilot-core SKILL.md, Flow B). Each section-ordering variant becomes one `composer`-source seed; attach pre-compiled plans via `compiled_plans`. When the user's request is vague or exploratory ("what would you do?", "surprise me with a structure"), bias `get_session_kernel(freshness=0.7-0.9)` to surface less-conservative branches.
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: beat
|
|
3
|
+
description: Guided beat creation — create a beat from scratch with genre, tempo, and instrumentation choices
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Guide the user through creating a beat from scratch. Follow these steps:
|
|
7
|
+
|
|
8
|
+
## Step 0: Session Prep (fresh projects only)
|
|
9
|
+
|
|
10
|
+
If the user asks for a **fresh start** (new track, clean slate, start from scratch):
|
|
11
|
+
|
|
12
|
+
1. **Read the session** — `get_session_info` to see what exists
|
|
13
|
+
2. **Delete all existing tracks** — loop through all tracks with `delete_track`, starting from the highest index down to 0 (deleting from the top prevents index shifts)
|
|
14
|
+
3. **Load the M4L Analyzer on master** — `find_and_load_device(track_index=-1000, device_name="LivePilot_Analyzer")`. This enables real-time spectral analysis, RMS metering, and key detection for the entire session. If it fails, try `search_browser(path="max_for_live", name_filter="LivePilot")` to find the URI and load manually.
|
|
15
|
+
4. **Set up master chain** — load Glue Compressor + EQ Eight + Utility on master for bus processing
|
|
16
|
+
5. **Verify analyzer** — wait 2 seconds, then call `get_master_spectrum`. If it returns data, the bridge is connected. If it errors with "UDP bridge not connected", call `reconnect_bridge` to rebind.
|
|
17
|
+
|
|
18
|
+
If the user is adding to an **existing project**, skip step 0 — just call `get_session_info` and work with what's there.
|
|
19
|
+
|
|
20
|
+
## Step 1: Ask about the vibe
|
|
21
|
+
Genre, tempo range, mood, reference tracks.
|
|
22
|
+
|
|
23
|
+
## Step 2: Set up the session
|
|
24
|
+
`set_tempo`, create tracks for drums/bass/harmony/melody with `create_midi_track`, name and color them.
|
|
25
|
+
|
|
26
|
+
## Step 3: Load instruments
|
|
27
|
+
Use `search_browser` to find devices by name, `load_browser_item` or `find_and_load_device` to load them.
|
|
28
|
+
|
|
29
|
+
## Step 4: Verify device health
|
|
30
|
+
After loading, run `get_device_info` on each loaded device. A `parameter_count` of 0 or 1 on AU/VST plugins means the plugin failed to initialize (dead plugin). If detected:
|
|
31
|
+
- Delete the dead plugin with `delete_device`
|
|
32
|
+
- Replace with a native Ableton alternative (e.g., Saturator instead of tape plugins, Operator instead of failed FM synths)
|
|
33
|
+
- Run `get_session_diagnostics` for any other issues (armed tracks, missing instruments)
|
|
34
|
+
- Inform the user which plugin failed and what replacement was used
|
|
35
|
+
|
|
36
|
+
## Step 5: Program drums first
|
|
37
|
+
Create a clip, add kick/snare/hat patterns with `add_notes`.
|
|
38
|
+
|
|
39
|
+
## Step 6: Add bass
|
|
40
|
+
Create clip, program a bassline that locks with the kick.
|
|
41
|
+
|
|
42
|
+
## Step 7: Add harmony
|
|
43
|
+
Chords or pads that set the mood.
|
|
44
|
+
|
|
45
|
+
## Step 8: Add melody
|
|
46
|
+
Top-line or lead element.
|
|
47
|
+
|
|
48
|
+
## Step 9: Mix + VERIFY
|
|
49
|
+
Balance levels with `set_track_volume` and `set_track_pan`.
|
|
50
|
+
|
|
51
|
+
**MANDATORY after every parameter change:**
|
|
52
|
+
- Read `value_string` in the response to confirm the actual Hz/dB/% value makes sense
|
|
53
|
+
- Call `get_track_meters(include_stereo=true)` and verify each track has non-zero output
|
|
54
|
+
- If a track's stereo output drops to 0, the effect is killing the signal — check `get_device_parameters` for `value_string`, fix, re-verify
|
|
55
|
+
- Parameter ranges are NOT always 0-1. Always read `value_string`.
|
|
56
|
+
|
|
57
|
+
## Step 10: Pitch & tuning audit
|
|
58
|
+
MANDATORY before firing. Run on every melodic track (skip drums):
|
|
59
|
+
- `identify_scale` on each track — verify all tracks agree on the same tonal center
|
|
60
|
+
- `analyze_harmony` on chordal tracks — verify chord quality
|
|
61
|
+
- `detect_theory_issues` with `strict=true` on each track — check for out-of-key notes, parallel fifths, voice crossing
|
|
62
|
+
- **Interpret results against the intended scale**, not just C major
|
|
63
|
+
- Report a clear tuning table to the user: which tracks are clean, which have issues
|
|
64
|
+
- Fix wrong notes with `modify_notes` before proceeding
|
|
65
|
+
|
|
66
|
+
## Step 11: Perception check
|
|
67
|
+
If the M4L Analyzer is connected:
|
|
68
|
+
- `get_master_spectrum` — check spectral balance (sub should be present but not >60% for most genres)
|
|
69
|
+
- `get_master_rms` — check levels aren't clipping
|
|
70
|
+
- `get_detected_key` — verify the analyzer agrees with the intended key
|
|
71
|
+
|
|
72
|
+
If not connected, use `capture_audio` + `analyze_loudness` + `analyze_spectrum_offline` for offline analysis.
|
|
73
|
+
|
|
74
|
+
## Step 12: Fire the scene
|
|
75
|
+
Fire to listen, iterate based on feedback.
|
|
76
|
+
|
|
77
|
+
Use the livepilot-core skill for all tool calls. Verify after each step. Keep the user informed of what you're doing and why.
|
|
78
|
+
|
|
79
|
+
## Branch-Native Variations
|
|
80
|
+
|
|
81
|
+
When the user wants options instead of a single committed beat ("try a few variants", "surprise me with the drum feel", "what else could this be?"), use the exploratory flow from livepilot-core SKILL.md (Flow B). Emit 2-3 seeds that differ in *how* they interpret the vibe — for example one `semantic_move` seed with `make_punchier`, one `freeform` seed describing a swung / pushed-beat variation with a pre-compiled plan, one `synthesis` seed that changes the kick's synthesis rather than its pattern. Set `get_session_kernel(freshness=0.6-0.8)` and `creativity_profile="alchemist"` when the user hasn't given concrete parameters.
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: evaluate
|
|
3
|
+
description: Evaluate recent changes — run the full before/after evaluation loop and recommend keep or undo
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Run the universal evaluation loop on recent production changes.
|
|
7
|
+
|
|
8
|
+
1. **Check capability state** — `get_capability_state` to see what evaluation modes are available:
|
|
9
|
+
- `normal` — full measured evaluation with analyzer data
|
|
10
|
+
- `measured_degraded` — analyzer online but stale data
|
|
11
|
+
- `judgment_only` — no analyzer, parameter-level heuristics only
|
|
12
|
+
- `read_only` — session disconnected
|
|
13
|
+
|
|
14
|
+
2. **Ensure analyzer** — if mode is `judgment_only`, try to get full perception:
|
|
15
|
+
- `find_and_load_device(track_index=-1000, device_name="LivePilot_Analyzer")`
|
|
16
|
+
- Wait 2s, then `get_master_spectrum` to test the bridge
|
|
17
|
+
- If bridge disconnected: `reconnect_bridge`
|
|
18
|
+
- If still unavailable: proceed with `judgment_only` but tell the user
|
|
19
|
+
|
|
20
|
+
3. **Get the last move** — `get_last_move` to understand what was changed. If no recent move, `get_recent_actions` for history.
|
|
21
|
+
|
|
22
|
+
4. **Ask what the goal was** — what were they trying to achieve? More clarity? Wider stereo? Punchier drums?
|
|
23
|
+
|
|
24
|
+
5. **Compile the goal** — `compile_goal_vector(goal_description, mode="improve")`
|
|
25
|
+
|
|
26
|
+
6. **Capture current state** — full perception snapshot:
|
|
27
|
+
- `get_master_spectrum` + `get_master_rms` (if analyzer available)
|
|
28
|
+
- `get_track_meters(include_stereo=true)` — verify all tracks producing audio
|
|
29
|
+
- `get_mix_snapshot` — full volume/pan/send state
|
|
30
|
+
- Optionally: `capture_audio` + `analyze_loudness` + `analyze_spectrum_offline` for ground truth
|
|
31
|
+
|
|
32
|
+
7. **Undo the change** — `undo()` to restore the before state
|
|
33
|
+
|
|
34
|
+
8. **Capture before state** — same reads as step 6
|
|
35
|
+
|
|
36
|
+
9. **Redo the change** — `redo()` to restore the after state
|
|
37
|
+
|
|
38
|
+
10. **Evaluate** — `evaluate_move(before_snapshot, after_snapshot, goal)` or use engine-specific:
|
|
39
|
+
- Mix changes: `evaluate_mix_move`
|
|
40
|
+
- Composition changes: `evaluate_composition_move`
|
|
41
|
+
- Multi-dimensional: `evaluate_with_fabric`
|
|
42
|
+
|
|
43
|
+
11. **Report results** — show: score (0-1), keep_change recommendation, goal_progress, collateral_damage, dimension changes
|
|
44
|
+
|
|
45
|
+
12. **Act on recommendation:**
|
|
46
|
+
- If `keep_change=true` — keep, suggest `memory_learn` if score > 0.7
|
|
47
|
+
- If `keep_change=false` — `undo()`, explain why (collateral damage, goal regression)
|
|
48
|
+
|
|
49
|
+
Use the livepilot-evaluation skill for the full evaluation loop details.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: memory
|
|
3
|
+
description: Browse, search, and manage your saved technique library
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Show the user's technique memory library. Follow these steps:
|
|
7
|
+
|
|
8
|
+
1. Call `memory_list(limit=20)` to get an overview of saved techniques
|
|
9
|
+
2. Format as an organized list grouped by type:
|
|
10
|
+
- **Beats** — beat_pattern techniques
|
|
11
|
+
- **Device Chains** — device_chain techniques
|
|
12
|
+
- **Mix Templates** — mix_template techniques
|
|
13
|
+
- **Browser Pins** — browser_pin techniques
|
|
14
|
+
- **Preferences** — preference techniques
|
|
15
|
+
3. For each technique show: name, summary, rating (stars), favorite marker, tags
|
|
16
|
+
4. Show total count and breakdown by type
|
|
17
|
+
|
|
18
|
+
After presenting, ask if the user wants to:
|
|
19
|
+
- **Search** — "search for [query]" → use memory_recall
|
|
20
|
+
- **View details** — "show me [name]" → use memory_get
|
|
21
|
+
- **Delete** — "delete [name]" → use memory_delete (confirm first)
|
|
22
|
+
- **Rate** — "rate [name] 5 stars" → use memory_favorite
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: mix
|
|
3
|
+
description: Mixing assistant — analyze and balance track levels, panning, and sends
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Help the user mix their session using the V2 orchestration pipeline.
|
|
7
|
+
|
|
8
|
+
## Orchestration Flow
|
|
9
|
+
|
|
10
|
+
1. **Session kernel** — `get_session_kernel(request_text=<user's request>, mode="improve")` for the full turn snapshot
|
|
11
|
+
2. **Route** — `route_request(<user's request>)` to get engine routes + semantic move recommendations
|
|
12
|
+
3. **Ensure analyzer** — if `get_master_spectrum` errors, load it: `find_and_load_device(track_index=-1000, device_name="LivePilot_Analyzer")`. If bridge disconnected, try `reconnect_bridge`.
|
|
13
|
+
|
|
14
|
+
## Analysis Phase
|
|
15
|
+
|
|
16
|
+
4. **Quick status** — `get_mix_summary` for track count, dynamics, stereo, issues
|
|
17
|
+
5. **Run critics** — `get_mix_issues` for problems. `get_masking_report` for frequency collisions.
|
|
18
|
+
6. **Spectral check** — `get_master_spectrum` for 9-band balance (sub_low → air). Genre targets:
|
|
19
|
+
- Hip-hop: sub/sub_low dominant, centroid 400-800 Hz
|
|
20
|
+
- Electronic / microhouse: sub_low carries the kick (Villalobos), centroid 800-1500 Hz
|
|
21
|
+
- Ambient: mid-focused, low sub_low + sub, centroid 500-1000 Hz
|
|
22
|
+
7. **Musical intelligence** — `detect_role_conflicts` to find tracks competing for the same space. `detect_repetition_fatigue` if arrangement feels stale.
|
|
23
|
+
|
|
24
|
+
## Decision Phase
|
|
25
|
+
|
|
26
|
+
8. **Propose semantic moves** — `propose_next_best_move(request_text=<user's request>)` for ranked suggestions (e.g., `make_punchier`, `widen_stereo`, `tighten_low_end`)
|
|
27
|
+
9. **Preview chosen move** — `preview_semantic_move(move_id)` to see the full compile plan before executing
|
|
28
|
+
10. **Rank by taste** — if user has history, `rank_moves_by_taste(move_specs)` to personalize ordering
|
|
29
|
+
|
|
30
|
+
## Execution Phase
|
|
31
|
+
|
|
32
|
+
11. **Apply with approval** — `apply_semantic_move(move_id, mode="improve")` returns the compiled plan. Present it to the user: "I'd suggest: push Drums to 0.75, pull Pad to 0.25. Shall I do it?"
|
|
33
|
+
12. **Verify after EVERY change** — read `value_string` in response, call `get_track_meters(include_stereo=true)`, check no track went silent
|
|
34
|
+
13. **Capture + analyze** — `capture_audio` then `analyze_loudness` for LUFS/LRA, `analyze_spectrum_offline` for centroid/balance
|
|
35
|
+
14. **Evaluate** — `evaluate_mix_move` with before/after snapshots. If `keep_change` is false, `undo` immediately.
|
|
36
|
+
|
|
37
|
+
## Summary
|
|
38
|
+
|
|
39
|
+
15. **Report** — "What I did / what improved / what I protected / what remains"
|
|
40
|
+
16. **Session memory** — `add_session_memory` for notable decisions
|
|
41
|
+
17. **Taste update** — successful moves update the TasteGraph automatically
|
|
42
|
+
|
|
43
|
+
For deeper critic-driven iterative improvement, use the livepilot-mix-engine skill.
|
|
44
|
+
|
|
45
|
+
## Branch-Native Exploratory Mode
|
|
46
|
+
|
|
47
|
+
When the user asks for multiple options or is vague about direction ("try a few things", "I don't know what's wrong — just make it better", "what would you do?"), use Flow B from livepilot-core SKILL.md. Build 2-3 `create_experiment` seeds with different angles — for example one `semantic_move` seed for a conventional fix, one `freeform` seed for an unconventional approach (sidechain from an unexpected source, mid/side EQ instead of stereo EQ, etc.), one `synthesis` seed if the root cause is instrument-level (PR9+). Set `get_session_kernel(freshness=0.7)` to nudge branches away from the safest option.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: perform
|
|
3
|
+
description: Performance mode — enter a safety-constrained live performance context with energy tracking and safe moves
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Enter performance mode with safety constraints and energy tracking.
|
|
7
|
+
|
|
8
|
+
## Orchestration Flow
|
|
9
|
+
|
|
10
|
+
1. **Session kernel** — `get_session_kernel(request_text="live performance", mode="improve")`
|
|
11
|
+
2. **Route** — `route_request("live performance")` → workflow_mode should be `performance_safe`
|
|
12
|
+
3. **Performance state** — `get_performance_state` for current scene, energy level, and safe moves
|
|
13
|
+
|
|
14
|
+
## Safety-First Rules
|
|
15
|
+
|
|
16
|
+
- **NEVER** execute moves rated "high risk" during performance
|
|
17
|
+
- **ALWAYS** use `get_performance_safe_moves` before ANY change
|
|
18
|
+
- Only fire scenes, adjust volumes, and trigger safe effects
|
|
19
|
+
- No device loading, track creation, or destructive operations
|
|
20
|
+
|
|
21
|
+
## Performance Tools
|
|
22
|
+
|
|
23
|
+
4. **Safe moves** — `get_performance_safe_moves` for available actions
|
|
24
|
+
5. **Scene handoff** — `plan_scene_handoff` for safe transitions between scenes
|
|
25
|
+
6. **Energy tracking** — monitor energy level across scene transitions
|
|
26
|
+
7. **Semantic moves** — only performance-safe semantic moves:
|
|
27
|
+
- `smooth_scene_handoff` — safe transition between scenes
|
|
28
|
+
- Gesture templates: `pre_arrival_vacuum`, `re_entry_spotlight`
|
|
29
|
+
|
|
30
|
+
## Live Dashboard
|
|
31
|
+
|
|
32
|
+
8. **Monitor** — `get_track_meters(include_stereo=true)` for real-time levels
|
|
33
|
+
9. **Spectrum** — `get_master_spectrum` for frequency balance during performance
|
|
34
|
+
10. **Playing clips** — `get_playing_clips` to see what's active
|
|
35
|
+
|
|
36
|
+
## Recovery
|
|
37
|
+
|
|
38
|
+
11. **If something goes wrong** — `undo` immediately
|
|
39
|
+
12. **Emergency** — `stop_all_clips` if audio goes haywire
|
|
40
|
+
13. **Check safety** — `check_safety` to verify constraints are holding
|
|
41
|
+
|
|
42
|
+
Keep the user informed of what's happening. Never make surprise changes during a live set.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: session
|
|
3
|
+
description: Get a full overview of the current Ableton Live session
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Get a comprehensive overview of the current Ableton Live session by calling `get_session_info`. Format the results as an organized report showing:
|
|
7
|
+
|
|
8
|
+
1. **Transport** — tempo, time signature, playing state, loop settings
|
|
9
|
+
2. **Tracks** — list all tracks with type, name, color, arm/mute/solo state
|
|
10
|
+
3. **Scenes** — scene names and clip occupancy
|
|
11
|
+
4. **Master** — master volume and devices
|
|
12
|
+
|
|
13
|
+
After presenting the overview, ask if the user wants to dive deeper into any specific track, device, or area.
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sounddesign
|
|
3
|
+
description: Sound design workflow — load instruments and effects, shape parameters for a target sound
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Guide the user through designing a sound using the V2 orchestration pipeline.
|
|
7
|
+
|
|
8
|
+
## Orchestration Flow
|
|
9
|
+
|
|
10
|
+
1. **Session kernel** — `get_session_kernel(request_text=<user's request>, mode="improve")`
|
|
11
|
+
2. **Route** — `route_request(<user's request>)` for engine routes + semantic moves
|
|
12
|
+
|
|
13
|
+
## Design Phase
|
|
14
|
+
|
|
15
|
+
3. **Ask about target** — what character? (warm pad, aggressive bass, shimmering lead, etc.)
|
|
16
|
+
4. **Choose instrument** — `search_browser` to find devices, `load_browser_item` to load
|
|
17
|
+
5. **Verify health** — `get_device_info` to confirm plugin initialized. Read `value_string` from `get_device_parameters` to understand actual units.
|
|
18
|
+
6. **Shape sound** — `set_device_parameter` or `batch_set_parameters`. **ALWAYS read `value_string` in response** to confirm Hz/dB/% values make sense.
|
|
19
|
+
7. **Verify after every change** — `get_track_meters(include_stereo=true)` — if stereo drops to 0, the effect killed the signal.
|
|
20
|
+
|
|
21
|
+
## Critic Phase
|
|
22
|
+
|
|
23
|
+
8. **Run critics** — `analyze_sound_design(track_index)` for static timbre, missing modulation, spectral imbalance
|
|
24
|
+
9. **Plan improvements** — `plan_sound_design_move(track_index)` for suggested changes
|
|
25
|
+
10. **Patch model** — `get_patch_model(track_index)` to see chain structure and controllable blocks
|
|
26
|
+
|
|
27
|
+
## Effects & Automation
|
|
28
|
+
|
|
29
|
+
11. **Add effects** — load with `find_and_load_device(track_index, device_name)`. Verify health.
|
|
30
|
+
12. **Organic movement** — `apply_automation_shape(curve_type="perlin")` for filter/send drift
|
|
31
|
+
13. **Automation recipes** — `apply_automation_recipe` for breathing, vinyl_crackle, auto_pan. Verify after applying.
|
|
32
|
+
|
|
33
|
+
## Evaluation
|
|
34
|
+
|
|
35
|
+
14. **Perception check** — `get_master_spectrum` or `capture_audio` + `analyze_spectrum_offline`
|
|
36
|
+
15. **Evaluate** — `evaluate_move(goal_vector, before_snapshot, after_snapshot)` to score improvement
|
|
37
|
+
|
|
38
|
+
## Summary
|
|
39
|
+
|
|
40
|
+
16. **Report** — "What I changed / what improved / what I protected"
|
|
41
|
+
17. **Memory** — if score > 0.7, suggest `memory_learn` to save the technique
|
|
42
|
+
|
|
43
|
+
For critic-driven iterative refinement, use the livepilot-sound-design-engine skill.
|
|
44
|
+
|
|
45
|
+
## Branch-Native Exploratory Mode
|
|
46
|
+
|
|
47
|
+
For open-ended sound design ("design me something that feels like X", "make this more interesting", "surprise me"), use Flow B from livepilot-core SKILL.md. Prefer `source="synthesis"` seeds for any request that calls for genuinely different timbres — PR9+ introduces native-synth adapters (Wavetable, Operator, Analog, Drift, Meld) that can propose per-device parameter branches. Pass `synth_hints` on `get_session_kernel` when you know which tracks or devices to focus on:
|
|
48
|
+
|
|
49
|
+
```
|
|
50
|
+
get_session_kernel(
|
|
51
|
+
request_text="make the pad more alive",
|
|
52
|
+
freshness=0.75,
|
|
53
|
+
creativity_profile="sculptor",
|
|
54
|
+
synth_hints={"track_indices": [pad_track_idx], "preferred_devices": ["Wavetable", "Operator"]},
|
|
55
|
+
)
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Seeds with `source="synthesis"` that arrive without a compiled plan will (post-PR9) be compiled by the synthesis_brain; pre-PR9 they must ship with a freeform plan attached via `compiled_plans`.
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# §1 — Default Preset Energy is Forbidden
|
|
2
|
+
|
|
3
|
+
Mechanical check: when a melodic-role track (bass / pad / lead) is loaded
|
|
4
|
+
with a banned default synth and no preset has been applied, flag it.
|
|
5
|
+
|
|
6
|
+
CLAUDE.md §1: "Never reach for Analog / Poli / Drift / Meld as a default for
|
|
7
|
+
bass / pad / lead. They read as 'generic AI synth' and have been rejected
|
|
8
|
+
multiple times."
|
|
9
|
+
|
|
10
|
+
This rubric does NOT ban these synths outright — it bans them in their
|
|
11
|
+
**factory-default state** for melodic roles. A programmed Drift bass with a
|
|
12
|
+
preset name and modulated parameters is fine. A naked `Drift` device with
|
|
13
|
+
display name `"Drift"` is the chronic anti-pattern.
|
|
14
|
+
|
|
15
|
+
## Inputs
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
{
|
|
19
|
+
"tracks": [
|
|
20
|
+
{
|
|
21
|
+
"index": int,
|
|
22
|
+
"name": str,
|
|
23
|
+
"devices": [
|
|
24
|
+
{"class_name": str, "name": str, ...},
|
|
25
|
+
...
|
|
26
|
+
],
|
|
27
|
+
}, ...
|
|
28
|
+
],
|
|
29
|
+
}
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
The first instrument-class device on each track is the candidate. `name` is
|
|
33
|
+
Ableton's display name for the device — for a freshly-loaded Drift it
|
|
34
|
+
equals `"Drift"`; for a preset-loaded Drift it equals the preset stem.
|
|
35
|
+
|
|
36
|
+
## Banned default class names
|
|
37
|
+
|
|
38
|
+
| Class name | Reason |
|
|
39
|
+
|------------|--------|
|
|
40
|
+
| Drift | Generic subtractive — reach for Granulator III / Wavetable / sample-based instead |
|
|
41
|
+
| Analog | Same reason |
|
|
42
|
+
| Poli | M4L opaque — sound-design critic can't analyze |
|
|
43
|
+
| Meld | M4L opaque — sound-design critic can't analyze |
|
|
44
|
+
|
|
45
|
+
## Trigger conditions for banned roles
|
|
46
|
+
|
|
47
|
+
| Role | Triggers |
|
|
48
|
+
|------|----------|
|
|
49
|
+
| bass | banned class + default name |
|
|
50
|
+
| pad | banned class + default name |
|
|
51
|
+
| lead | banned class + default name |
|
|
52
|
+
|
|
53
|
+
Other roles (kick, snare, hat, perc, vox, atmos, fx, unknown) are
|
|
54
|
+
**not flagged** by this rubric.
|
|
55
|
+
|
|
56
|
+
## Default-name detection
|
|
57
|
+
|
|
58
|
+
A device is considered "default-loaded" when its display `name` matches its
|
|
59
|
+
`class_name` exactly (case-insensitive). For example:
|
|
60
|
+
- `class_name="Drift", name="Drift"` → default
|
|
61
|
+
- `class_name="Drift", name="BoC Wash"` → preset applied → not default
|
|
62
|
+
|
|
63
|
+
## Criteria
|
|
64
|
+
|
|
65
|
+
### `no_banned_default_instruments`
|
|
66
|
+
|
|
67
|
+
- All tracks pass → **pass**
|
|
68
|
+
- One or more banned-default + banned-role tracks → **fail**
|
|
69
|
+
|
|
70
|
+
### `prefer_curated_or_under_used`
|
|
71
|
+
|
|
72
|
+
Advisory: when the first instrument is on the user's under-used list
|
|
73
|
+
(Operator, Wavetable, Sampler, Simpler, Granulator III, Tension, Collision,
|
|
74
|
+
Electric, Drum Synths, Inspired-by-Nature variants), praise it. This is a
|
|
75
|
+
**signal-only** check, never blocks — it surfaces in evidence.
|
|
76
|
+
|
|
77
|
+
## What this rubric does NOT check
|
|
78
|
+
|
|
79
|
+
- Sound-design depth — see §2 rubric (Phase 2b)
|
|
80
|
+
- Whether the preset is musically right for the genre — that's taste
|
|
81
|
+
- Whether the player has been told to use a banned class explicitly
|
|
82
|
+
("subtractive" / "analog texture") — context lives outside the snapshot
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# §7.3 — Layer Accumulation Rubric
|
|
2
|
+
|
|
3
|
+
Mechanical checks on track count and per-role volume balance, derived from
|
|
4
|
+
CLAUDE.md §7.3 ("no layer accumulation with low volume — 5–6 GREAT layers
|
|
5
|
+
prominent > 12 mediocre layers buried") and the track-meter hierarchy
|
|
6
|
+
feedback memory.
|
|
7
|
+
|
|
8
|
+
This rubric is graded by `mcp_server.grader.client.evaluate("layer_accumulation", state)`.
|
|
9
|
+
All checks are pure Python — zero LLM calls, zero token cost.
|
|
10
|
+
|
|
11
|
+
## Inputs
|
|
12
|
+
|
|
13
|
+
The grader expects a `state` dict shaped like:
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
{
|
|
17
|
+
"tracks": [
|
|
18
|
+
{
|
|
19
|
+
"index": int,
|
|
20
|
+
"name": str,
|
|
21
|
+
"mixer": {"volume": 0.0–1.0, "panning": -1.0–1.0},
|
|
22
|
+
"devices": [{"class_name": str, ...}, ...],
|
|
23
|
+
"meter": {"peak": 0.0–1.0} | None, # optional
|
|
24
|
+
}, ...
|
|
25
|
+
],
|
|
26
|
+
}
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
In production this comes from `get_session_info` + per-track `get_track_info`
|
|
30
|
+
+ optional `get_track_meters`. In tests, synthesize the dict directly.
|
|
31
|
+
|
|
32
|
+
## Criteria
|
|
33
|
+
|
|
34
|
+
### `track_count_within_limit`
|
|
35
|
+
|
|
36
|
+
Total non-master, non-return tracks under the sustainable threshold.
|
|
37
|
+
|
|
38
|
+
- ≤ 8 tracks → **pass**
|
|
39
|
+
- 9–11 tracks → **warn** (approaching the §7.3 ceiling)
|
|
40
|
+
- ≥ 12 tracks → **fail** (delete buried layers, feature 5–6 great ones)
|
|
41
|
+
|
|
42
|
+
### `no_extreme_buried_track`
|
|
43
|
+
|
|
44
|
+
Any track with `mixer.volume < 0.15` is a buried layer that should be
|
|
45
|
+
deleted unless it's explicitly tagged ghost. Track-name keyword match:
|
|
46
|
+
`ghost`, `_g`, `gh `.
|
|
47
|
+
|
|
48
|
+
- All buried tracks are ghost-tagged → **pass**
|
|
49
|
+
- Any non-ghost track at volume < 0.15 → **fail** with track names
|
|
50
|
+
|
|
51
|
+
### `role_volume_hierarchy`
|
|
52
|
+
|
|
53
|
+
Per-track role inferred via `infer_role` from `audit/checks.py`. Volume
|
|
54
|
+
must land within the role's permitted band:
|
|
55
|
+
|
|
56
|
+
| Role | Band | Why |
|
|
57
|
+
|-------|--------------|-----|
|
|
58
|
+
| kick | [0.60, 0.85] | anchor — must dominate |
|
|
59
|
+
| bass | [0.60, 0.85] | anchor — must carry |
|
|
60
|
+
| snare | [0.55, 0.80] | groove |
|
|
61
|
+
| hat | [0.40, 0.70] | groove — often quieter |
|
|
62
|
+
| perc | [0.40, 0.65] | groove |
|
|
63
|
+
| lead | [0.50, 0.80] | accent / anchor |
|
|
64
|
+
| vox | [0.55, 0.85] | anchor |
|
|
65
|
+
| pad | [0.25, 0.50] | atmosphere — hide, don't dominate |
|
|
66
|
+
| atmos | [0.25, 0.45] | atmosphere |
|
|
67
|
+
| fx | [0.30, 0.70] | variable |
|
|
68
|
+
| unknown | [0.30, 0.80] | generous default |
|
|
69
|
+
|
|
70
|
+
- All tracks within role band → **pass**
|
|
71
|
+
- Any track outside band → **warn** (not blocking — could be deliberate;
|
|
72
|
+
the grader flags it for review, not auto-undo)
|
|
73
|
+
|
|
74
|
+
## What this rubric does NOT check
|
|
75
|
+
|
|
76
|
+
§5 layer-by-layer precision (timbre, sequence, stereo, modulation, automation)
|
|
77
|
+
— that's `audit_layer` territory and gets its own rubric in Phase 2. This
|
|
78
|
+
rubric is intentionally narrow: it catches the **layer accumulation**
|
|
79
|
+
anti-pattern only.
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# §5 — Layer-by-Layer Precision
|
|
2
|
+
|
|
3
|
+
Wraps the seven `audit/checks.py` functions into one rubric. Each criterion
|
|
4
|
+
runs the relevant audit check across every track and aggregates per-track
|
|
5
|
+
results into a single criterion verdict (worst-case severity).
|
|
6
|
+
|
|
7
|
+
CLAUDE.md §5: "For EVERY layer (drums, bass, lead, pad, vox, perc): solo +
|
|
8
|
+
spectrum check tone, critique sequence (swing/humanization/ghosts/per-bar
|
|
9
|
+
variation/micro-timing), check stereo image, plan automation/pitch-bends/
|
|
10
|
+
filter sweeps. Same depth as the 2026-04-25 hi-hat critique. No layer is
|
|
11
|
+
'done' without this checklist."
|
|
12
|
+
|
|
13
|
+
This rubric is the most data-hungry of the set. Each criterion degrades to
|
|
14
|
+
n/a gracefully when the corresponding signal is missing on every track.
|
|
15
|
+
|
|
16
|
+
## Criteria
|
|
17
|
+
|
|
18
|
+
### `timbre_per_track` (§5.1)
|
|
19
|
+
Calls `audit_checks.check_timbre(role, fingerprint)`. Requires per-track
|
|
20
|
+
`fingerprint` (from `get_master_spectrum` after solo).
|
|
21
|
+
|
|
22
|
+
- All tracks pass → **pass**
|
|
23
|
+
- Any track has wrong-band dominance → **fail** (sample is wrong for role)
|
|
24
|
+
- Off-band but secondary in expected range → **warn**
|
|
25
|
+
|
|
26
|
+
### `sequence_per_track` (§5.2)
|
|
27
|
+
Calls `audit_checks.check_sequence(role, notes_per_clip)`. Requires per-track
|
|
28
|
+
`notes_per_clip` (from `get_notes` per clip slot).
|
|
29
|
+
|
|
30
|
+
- Drum-role tracks need humanization + ghost notes
|
|
31
|
+
- Pad/lead/bass need pitch + duration variation
|
|
32
|
+
- Audio tracks → n/a (no notes)
|
|
33
|
+
|
|
34
|
+
### `stereo_per_track` (§5.3)
|
|
35
|
+
Calls `audit_checks.check_stereo(role, track)`. Pure pan-position check.
|
|
36
|
+
|
|
37
|
+
- Bass panned > 0.05 → **warn** (sub should be center for translation)
|
|
38
|
+
- Kick/snare panned > 0.15 → **warn**
|
|
39
|
+
|
|
40
|
+
### `masking_per_track` (§5.4)
|
|
41
|
+
Calls `audit_checks.check_masking(track_index, masking_report)`. Requires
|
|
42
|
+
session-level `masking_report` from `get_masking_report`.
|
|
43
|
+
|
|
44
|
+
- Any high-severity collision → **fail**
|
|
45
|
+
- Mid-severity collision → **warn**
|
|
46
|
+
- No `masking_report` provided → criterion **n/a** (whole rubric still runs)
|
|
47
|
+
|
|
48
|
+
### `modulation_per_track` (§5.5 + §4)
|
|
49
|
+
Calls `audit_checks.check_modulation(role, devices, has_clip_automation,
|
|
50
|
+
wavetable_mod_routings)`. More accurate than the standalone
|
|
51
|
+
`modulation_presence` rubric — analyzes parameter routings (`Fe < Env`,
|
|
52
|
+
`Pe < Env`, etc.) on the actual instrument.
|
|
53
|
+
|
|
54
|
+
### `params_per_track` (§5.6 + §2)
|
|
55
|
+
Calls `audit_checks.check_params(role, devices)`. Detects "unprogrammed"
|
|
56
|
+
instruments — pad/lead/bass with ≥3 key shaping parameters at default values.
|
|
57
|
+
Drum roles auto-pass (single-sample minimal-shaping is correct by design).
|
|
58
|
+
|
|
59
|
+
### `effects_per_track` (§5.8)
|
|
60
|
+
Calls `audit_checks.check_effects(role, devices)`. Verifies role-appropriate
|
|
61
|
+
effect chain coverage:
|
|
62
|
+
- kick / snare / bass / vox / lead → EQ required
|
|
63
|
+
- bass / vox / lead → compressor required
|
|
64
|
+
- pad / atmos / vox / lead → reverb or delay required
|
|
65
|
+
|
|
66
|
+
## Aggregation
|
|
67
|
+
|
|
68
|
+
Per criterion: worst severity wins. If any track fails → criterion fails.
|
|
69
|
+
Otherwise if any warns → warns. Otherwise pass. Tracks where the audit
|
|
70
|
+
returns n/a (data missing, role doesn't apply) are filtered before
|
|
71
|
+
aggregation — they don't drag the criterion to n/a unless every track is n/a.
|
|
72
|
+
|
|
73
|
+
Whole-rubric `passed` is False iff any criterion is fail (blocking).
|
|
74
|
+
|
|
75
|
+
## What this rubric does NOT cover
|
|
76
|
+
|
|
77
|
+
- Sample audition (§5.7) — slice classification — niche, separate rubric later
|
|
78
|
+
- Aesthetic register (§8) — taste, never rubric-graded
|
|
79
|
+
- Per-track meter levels — that's the §7.3 `layer_accumulation` rubric
|