# AGENTS.md - AbletonMCP_AI ## Project MCP-based system that lets AI agents control Ableton Live 12 Suite via TCP socket. > **Note:** This project uses the **Senior Architecture (v3.0)**. See below for migration details. ## Critical Rules 1. **NEVER touch `libreria/` or `librerias/`** — user's 511 sample library 2. **Overwrite files, never delete+create** — prevents accidental data loss 3. **No debug .md files in project root** — all go to `AbletonMCP_AI/docs/` 4. **Compile after every change**: `python -m py_compile ""` 5. **Restart Ableton Live** after changes to `__init__.py` (no hot-reload) ## Commands ```powershell # Compile check (always after edits) python -m py_compile "C:\ProgramData\Ableton\Live 12 Suite\Resources\MIDI Remote Scripts\AbletonMCP_AI\__init__.py" python -m py_compile "C:\ProgramData\Ableton\Live 12 Suite\Resources\MIDI Remote Scripts\AbletonMCP_AI\mcp_server\server.py" # Verify Ableton is listening netstat -an | findstr 9877 # Test MCP server directly python "C:\ProgramData\Ableton\Live 12 Suite\Resources\MIDI Remote Scripts\mcp_wrapper.py" ``` ## Skills Reference ### Skill 1: Reinicio Correcto de Ableton **File:** `AbletonMCP_AI/docs/skill_reinicio_ableton.md` Proceso de 3 pasos para reiniciar Ableton limpiamente: 1. **Kill processes** (Live, Index, Push) 2. **Delete recovery files** (`CrashDetection.cfg`, `CrashRecoveryInfo.cfg`, `Undo.cfg`) 3. **Start Ableton** + verify TCP 9877 **When to use:** After modifying `__init__.py`, when changes don't reflect, after crashes. --- ### Skill 2: Producción Senior de Audio **File:** `AbletonMCP_AI/docs/skill_produccion_audio.md` Flujo profesional completo para producción con inyección automática: **5 Métodos Automáticos:** - M1: `track.insert_arrangement_clip()` (Live 12+ direct) - M2: `track.create_audio_clip()` (Live 11+ direct) - M3: `arrangement_clips.add_new_clip()` (Live 12+ API) - M4: Session → `duplicate_clip_to_arrangement` (legacy) - M5: Session → Recording (universal fallback) **Zero configuración manual** - Sistema elige automáticamente. **Usage:** ```python ableton-live-mcp_create_arrangement_audio_pattern( track_index=3, file_path="C:\\...\\kick 1.wav", positions=[0, 4, 8, 12], name="KickPattern" ) ``` **Workflow:** Health check → Library scan → Create tracks → Inject audio → Verify arrangement. --- **Critical:** Always use Skill 1 (restart) before starting production with Skill 2 if `__init__.py` was modified. ## Architecture ### Legacy Architecture (v2.x - Deprecated) The original architecture focused on Session View as the primary workflow: ``` AbletonMCP_AI/ ├── __init__.py # Remote Script — ALL Live API code here (~300 lines) ├── README.md # Project documentation ├── docs/ # Sprints and project docs only └── mcp_server/ ├── server.py # FastMCP server over stdio (~300 lines) └── engines/ # Music logic (sample_selector, song_generator) mcp_wrapper.py # Launcher for OpenCode ``` **Legacy workflow:** 1. **Ableton** loads `__init__.py` as a Control Surface → starts TCP server on port 9877 2. **MCP Server** (`server.py`) runs via `mcp_wrapper.py` (stdio transport) 3. Each MCP tool opens a **new TCP connection** to Ableton, sends JSON command, gets response, closes 4. Mutations to Live are queued in `_pending_tasks` and drained by `update_display()` --- ## Senior Architecture (v3.0) ### Overview The Senior Architecture represents a complete redesign of AbletonMCP_AI with: - Arrangement View as primary workflow (not Session View) - SQLite-based metadata store (no numpy required for production) - Robust state machine for arrangement recording - LiveBridge for real execution of engine configurations - Explicit API design without ambiguous names ### Key Principles 1. **No Placeholders**: Every component does exactly what it claims 2. **No Silent Failures**: Errors are explicit and actionable 3. **Arrangement-First**: All high-level tools create in Arrangement View by default 4. **Dependency Isolation**: Production workflow doesn't require numpy/librosa 5. **Musical Timing**: All timing uses bars/beats, not wall-clock ### New Components #### 1. Metadata Store (metadata_store.py) SQLite database storing pre-analyzed sample features: - 511 samples analyzed once, reused forever - 0 runtime dependency on numpy/librosa for queries - Fast BPM/key/spectral feature lookups #### 2. Hybrid Extractor (abstract_analyzer.py) Abstract feature extraction with multiple implementations: - `LibrosaExtractor`: Full analysis (requires numpy) - `DatabaseExtractor`: Fast lookups (no dependencies) - `HybridExtractor`: Cache-first with fallback analysis #### 3. Arrangement Recorder (arrangement_recorder.py) Robust state machine for Session→Arrangement recording: - 7 states: IDLE → ARMED → PRE_ROLL → RECORDING → COOLDOWN → COMPLETED/FAILED - Musical quantization (waits for bar boundaries) - Verification: Compares before/after clip sets - Progress callbacks and error handling #### 4. LiveBridge (live_bridge.py) Direct Ableton Live API execution: - Applies mixing_engine configurations for real - Writes automation envelopes to clips - Creates Arrangement clips directly - Bus/return routing with actual track modifications #### 5. Integration Coordinator (integration.py) Central coordinator wiring all components: - Dependency detection and auto-configuration - High-level operations (build_timeline, record_session) - Graceful degradation with clear mode reporting ### API Changes #### Deprecated (Session-View-First) - `produce_with_library()` - Old: Creates Session, optional Arrangement - `produce_reggaeton()` - Old: Session View only - `build_arrangement_structure()` - Old: Actually builds Session scenes #### New (Arrangement-First) - `build_arrangement_timeline()` - Creates clips directly at bar positions - `create_section_at_bar()` - Places intro/verse/chorus at specific bars - `create_arrangement_track()` - Timeline-ready track creation - `arrange_record_start()` - Robust recording with state machine ### Migration Guide #### For Users 1. Run migration: `python migrate_to_senior.py --analyze full` 2. Update workflow: Use `build_arrangement_timeline()` instead of `produce_with_library()` 3. Verify: Run `get_arrangement_status()` to confirm clips appear #### For Developers 1. Use `HybridExtractor` for sample analysis (cache-first) 2. Use `ArrangementRecorder` for any recording operations 3. Use `LiveBridge` to execute engine configs 4. Query `SampleMetadataStore` for sample features (no numpy) ### File Structure Changes ``` AbletonMCP_AI/ ├── mcp_server/ │ ├── engines/ │ │ ├── __init__.py (updated exports) │ │ ├── metadata_store.py (NEW) │ │ ├── abstract_analyzer.py (NEW) │ │ ├── arrangement_recorder.py (NEW) │ │ ├── live_bridge.py (NEW) │ │ ├── sample_selector.py (updated) │ │ └── ... │ ├── integration.py (NEW) │ ├── migrate_library.py (NEW) │ ├── migrate_to_senior.py (NEW) │ ├── test_arrangement.py (NEW) │ └── server.py (updated) ├── __init__.py (updated) └── AGENTS.md (this file) ``` ### Testing Run verification: ```python python -m test_arrangement --test-all ``` Expected results: - ✓ Arrangement clips created directly (no Session intermediate) - ✓ No numpy required for sample queries - ✓ Recording uses musical timing (bars/beats) - ✓ Post-recording verification confirms clips exist --- ### Backward Compatibility The Senior Architecture maintains backward compatibility with existing workflows: - **Old tools still work**: `produce_with_library()`, `produce_reggaeton()`, etc. continue to function - **Session View not removed**: Clips can still be created and fired in Session View - **Gradual migration**: Users can mix old and new API calls during transition **However, old tools are deprecated and will be removed in v4.0:** - They may have reduced performance compared to new Arrangement-first tools - They won't benefit from new features like the metadata store - Documentation and examples will focus on new API **Recommended approach:** 1. Continue using existing projects without changes 2. For new projects, use `build_arrangement_timeline()` and related new tools 3. Migrate critical existing projects when convenient ### Current Status **Completed:** - ✅ SQLite metadata store - ✅ Hybrid extractor architecture - ✅ ArrangementRecorder state machine - ✅ LiveBridge implementation - ✅ New Arrangement-first API tools - ✅ Integration coordinator - ✅ Migration tools - ✅ Extended EQ and Compressor presets (Agente 10) **In Progress:** - 🔄 Comprehensive testing - 🔄 Performance optimization **Migration Path:** 1. Immediate: Use `build_arrangement_timeline()` for new projects 2. Short-term: Update existing scripts to use new API 3. Long-term: Deprecate Session-View-first tools --- ## Extended EQ and Compressor Presets (Agente 10) ### EQ Presets **Drum Presets:** - `kick` - Standard kick drum EQ - `kick_sub` - Sub-bass emphasis at 60Hz (for heavy kicks) - `kick_punch` - Beater punch at 3kHz (for clicky kicks) - `snare` - Standard snare EQ - `snare_body` - Body emphasis at 200Hz (full snare) - `snare_crack` - Crack at 5kHz (snappy snare) **Bass Presets:** - `bass` - Standard bass EQ - `bass_clean` - Clean bass with controlled mids - `bass_dirty` - Bass with midrange grit **Synth & Melodic Presets:** - `synth` - Standard synth EQ - `synth_air` - 10kHz air boost (bright synths) - `pad_warm` - Low shelf boost (warm pads) - `vocal_presence` - 3-5kHz presence boost (vocals/adlibs) **Master Presets:** - `master` - Standard master EQ - `master_tame` - High shelf taming (for bright mixes) ### Compressor Presets **Drum Presets:** - `kick_punch` - Punchy kick compression - `parallel_drum` - Fast attack, auto release (for parallel processing) **Bass Presets:** - `bass_glue` - Glue bass compression **Vocal Presets:** - `aggressive_vocal` - Medium attack, fast release **Bus/Group Presets:** - `buss_glue` - Standard buss glue - `buss_tight` - Slow attack, medium release (tight groups) - `glue_light` - Subtle cohesion - `glue_heavy` - Strong cohesion **Master Presets:** - `master_loud` - Loud master compression **Special Effects:** - `pumping_sidechain` - Aggressive pumping effect - `transparent_leveling` - Subtle, natural dynamics ### Usage Example ```python # Configure EQ using extended preset eq_config = EQConfiguration(device_manager) eq_config.configure_eq_eight(track_index=0, settings={"preset": "kick_sub"}) # Configure compressor using extended preset comp_settings = CompressionSettings(device_manager) comp_settings.configure_compressor(track_index=0, preset="parallel_drum") ``` --- ## Legacy Design Decisions (v2.x) - `__init__.py` is all-in-one — Ableton's discovery only reads this file - One TCP connection per command — no persistent state, no thread queue bugs - No `request_refresh()` in `update_display()` — causes CPU loop that blocks Ableton ## Workflow **Kimi** codes features → **Qwen** verifies/compiles/debugs/assigns next sprint All sprints saved to `AbletonMCP_AI/docs/sprint_N_description.md` ## What NOT to modify - `libreria/` — user samples (read-only) - `librerias/` — organized samples (read-only) - `_Framework/`, `_APC/`, `_Komplete_Kontrol/`, etc. — Ableton's built-in scripts - Any directory not under `AbletonMCP_AI/` ## OpenCode config MCP server configured in `~/.config/opencode/opencode.json` pointing to `mcp_wrapper.py`.