Files
AbletonMCP_AI/QWEN.md
Administrator 602676ac87 Checkpoint: 6-phase upgrade — DB-aware samples, auto-warp, pattern engines, harmonic coherence, SentimientoLatino2025
Fase 1: Populate BPM in sample_metadata.db (283/511 samples from filenames)
Fase 2: DB-aware sample selection (_pick_best_db) with BPM±5 and key matching
Fase 3: Auto-warp samples to project tempo via warp_clip_to_bpm
Fase 4: Connect pattern_library engines (BassPatterns, ChordProgressions, MelodyGenerator)
Fase 5: Harmonic coherence — detect key from drumloop and transpose MIDI
Fase 6: SentimientoLatino2025 + reggaeton3 integrated — 616 samples, 19 clean categories

New files:
- engines/bpm_key_parser.py — robust BPM+key parser for filenames
- engines/populate_bpm_from_filenames.py — DB population script
- engines/recategorize_samples.py — category normalization (19 categories)

Modified:
- score_renderer.py — DB selection, auto-warp, engine patterns, key detection, 18 categories
- ai_loop.py — SYSTEM_PROMPT with full category list
2026-04-14 16:53:06 -03:00

541 lines
21 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# QWEN.md - AbletonMCP_AI v3.2 (Score → Render)
> **Context**: MCP-based system for controlling Ableton Live 12 from AI agents.
> **Architecture**: Compose-then-Render v3.2 (**STRICT SESSION VIEW**).
> **Team**: Qwen (verify/debug/architecture) + Kimi (fast coding).
## CRITICAL RULES (READ FIRST)
1. **NEVER touch `libreria/` or `librerias/`** - User's sample library. NEVER delete, move, or modify. These are read-only.
2. **NEVER delete project files** - Overwrite, don't delete then create.
3. **NEVER create debug .md files in project root** - All docs go in `AbletonMCP_AI/docs/`.
4. **STRICT SESSION VIEW ONLY** - Arrangement View and its commands (`create_arrangement_*`) are DISCARDED for this sprint. All production goes to scenes and clip slots.
5. **NEVER modify Ableton's built-in scripts** - `_Framework`, `_APC`, `_Komplete_Kontrol`, etc. are not yours.
6. **ALWAYS compile after changes**: `python -m py_compile "<file_path>"`
7. **ALWAYS restart Ableton Live** after changes to `__init__.py` (no hot-reload for Remote Scripts).
## Project Overview
**AbletonMCP_AI** is an AI-powered music production system that lets you create complete professional tracks in Ableton Live using **natural language prompts only**. It uses the Model Context Protocol (MCP) to bridge AI agents with Ableton Live's Python API.
### How It Works
```
AI Agent (OpenCode/Claude/Kimi)
↓ Natural language prompts
SongScore Engine (Pure Python Data Model)
↓ JSON score representation
Score Renderer (Session View Translator)
↓ JSON commands via TCP socket
LiveBridge (TCP → Ableton Live API)
Ableton Live 12 Suite → Session View Scenes & Clip Slots
```
### Key Architecture Components
| Component | File | Purpose |
|-----------|------|---------|
| **Remote Script** | `AbletonMCP_AI/__init__.py` | Ableton Control Surface. TCP server on port 9877. Handles all Live API calls. |
| **Score Engine** | `mcp_server/score_engine.py` | [Sprint 9] JSON data model for songs. Decoupled from Ableton logic. |
| **Score Renderer** | `mcp_server/score_renderer.py` | [Sprint 9] Translates JSON Score to Session View Scenes/Clips. |
| **AI Loop** | `mcp_server/ai_loop.py` | [Sprint 9] Autonomous production loop (Anthropic-compatible). |
| **Metadata Store** | `mcp_server/engines/metadata_store.py` | SQLite database of pre-analyzed sample features. No numpy required for queries. |
| **Sample Selector** | `mcp_server/engines/sample_selector.py` | Smart sample selection with coherence scoring. |
| **Mixing Engine** | `mcp_server/engines/mixing_engine.py` | Professional mixing chains (EQ, compression). |
| **LiveBridge** | `mcp_server/engines/live_bridge.py` | Direct Ableton Live API execution engine. |
### Directory Structure
```
MIDI Remote Scripts/
├── AbletonMCP_AI/ # Main project
│ ├── __init__.py # Remote Script entry point
│ ├── runtime.py # TCP server runtime
│ ├── README.md # Project documentation
│ ├── docs/ # Sprints, skills, API reference
│ ├── examples/ # Usage examples
│ ├── presets/ # Saved configurations (.json)
│ └── mcp_server/
│ ├── server.py # MCP FastMCP server (130+ tools)
│ ├── score_engine.py # SongScore model
│ ├── score_renderer.py # Session View renderer
│ ├── ai_loop.py # AI production loop
│ ├── scores/ # [NEW] JSON songs folder
│ └── engines/ # Specialized production engines
├── libreria/ # User samples (READ-ONLY, git-ignored)
├── librerias/ # Organized samples (READ-ONLY, git-ignored)
├── mcp_wrapper.py # MCP server launcher
├── AGENTS.md # Agent instructions
├── CLAUDE.md # Claude-specific docs
└── QWEN.md # This file
```
## Building and Running
### Compile Check (ALWAYS after edits)
```powershell
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"
python -m py_compile "C:\ProgramData\Ableton\Live 12 Suite\Resources\MIDI Remote Scripts\mcp_wrapper.py"
```
### Verify Ableton is Listening
```powershell
netstat -an | findstr 9877
```
Expected output: `TCP 127.0.0.1:9877 0.0.0.0:0 LISTENING`
### Test MCP Server Directly
```powershell
python "C:\ProgramData\Ableton\Live 12 Suite\Resources\MIDI Remote Scripts\mcp_wrapper.py"
```
### Restart Ableton (After __init__.py Changes)
1. **Kill all Ableton processes:**
```powershell
Get-Process | Where-Object { $_.ProcessName -like "*Ableton*" } | ForEach-Object { Stop-Process -Id $_.Id -Force }
```
2. **Delete recovery files:**
```powershell
# Check both locations
Remove-Item "$env:APPDATA\Ableton\Live*\Preferences\CrashRecoveryInfo.cfg" -ErrorAction SilentlyContinue
Remove-Item "$env:LOCALAPPDATA\Ableton\Live*\CrashRecoveryInfo.cfg" -ErrorAction SilentlyContinue
```
3. **Start Ableton Live** and verify TCP 9877 is listening.
### OpenCode MCP Configuration
Located in `~/.config/opencode/opencode.json`:
```json
{
"mcp": {
"ableton-live-mcp": {
"type": "local",
"command": ["python", "C:\\ProgramData\\Ableton\\Live 12 Suite\\Resources\\MIDI Remote Scripts\\mcp_wrapper.py"],
"enabled": true,
"timeout": 300000
}
}
}
```
### Session View First Workflow (v3.1)
Primary production workflow:
1. **Generate in Session View:**
```python
ableton-live-mcp_produce_13_scenes(
genre="reggaeton",
tempo=95,
key="Am"
)
```
2. **Verify MIDI instruments loaded:**
```python
ableton-live-mcp_validate_session()
# If needed: ableton-live-mcp_fix_session_midi_tracks()
```
3. **Test scenes:**
```python
ableton-live-mcp_fire_scene(scene_index=4) # Jump to Chorus
ableton-live-mcp_start_playback()
```
4. **Record to Arrangement (manual):**
- User presses **F9** in Ableton Live
- Or use: `ableton-live-mcp_record_to_arrangement(duration_bars=70)
## Available MCP Tools (114+)
### Project Info
- `get_session_info` - Tempo, tracks, scenes, playback state
- `get_tracks` / `get_scenes` - List all elements
- `get_arrangement_clips` - Timeline content
- `get_master_info` - Master track settings
- `health_check` - Verify all systems operational
### Transport & Settings
- `start_playback` / `stop_playback` / `toggle_playback`
- `set_tempo` (20-300 BPM) / `set_time_signature` / `set_metronome`
### Tracks & Mixing
- `create_midi_track` / `create_audio_track`
- `set_track_name` / `set_track_volume` / `set_track_pan`
- `set_track_mute` / `set_track_solo`
- `set_master_volume`
- `create_bus_track` / `route_track_to_bus`
- `configure_eq` / `configure_compressor` / `setup_sidechain`
### Clip Creation
- `create_clip` - MIDI clips in Session View
- `add_notes_to_clip` - Add MIDI note data
- `create_arrangement_audio_pattern` - Load audio files to timeline
- `load_sample_to_clip` / `load_sample_to_drum_rack`
### AI Generation (Key Tools)
- `generate_intelligent_track` - One-prompt complete track
- `generate_expansive_track` - 12+ samples per category
- `build_song` - Full arrangement with sections
- `produce_13_scenes` - **Sprint 7**: 13 scenes, 20 tracks, 100+ samples
- `produce_reggaeton` - Complete reggaeton production
- `produce_from_reference` - Match reference audio style
### BPM & Coherence (Sprint 7)
- `analyze_all_bpm` - Analyze 800+ samples with librosa
- `select_bpm_coherent_pool` - Select samples matching target BPM ±tolerance
- `warp_clip_to_bpm` - Auto-warp audio to project tempo (Complex Pro)
- `validate_session` - Verify MIDI tracks have instruments
- `fix_session_midi_tracks` - Auto-load instruments by track name
### Score → Render Pipeline (Sprint 9)
- `new_score` / `get_score` - Score lifecycle
- `compose_from_template` - Quick song generation
- `compose_audio_track` / `compose_midi_track` - Direct composition
- `compose_pattern` - MIDI pattern application
- `save_score` / `load_score` - JSON persistence
- `render_score` - Inject score into Session View (Scene-by-scene)
- `render_all_scores` - Batch autonomous production
See `AbletonMCP_AI/docs/API_REFERENCE_PRO.md` for complete documentation.
## Development Conventions
### Coding Style
- **Python 3.7+** compatible (uses `from __future__ import` for Python 2/3 compatibility in `__init__.py`)
- **All-in-one `__init__.py`** - Ableton's discovery mechanism only reads this file, so all Remote Script code lives here
- **One TCP connection per command** - MCP server opens a new TCP connection to Ableton for each tool call, sends JSON, gets response, closes
- **No `request_refresh()` in `update_display()`** - Causes CPU loop that blocks Ableton
### File Organization
- `__init__.py`: ONLY Ableton Live API code (ControlSurface subclass)
- `mcp_server/server.py`: ONLY MCP tool definitions and TCP client logic
- `mcp_server/engines/`: Music logic (sample selection, generation, mixing)
- **No cross-imports** from `__init__.py` into engines (Ableton's Python environment is isolated)
### Testing Practices
- Always compile-check after edits: `python -m py_compile "<file>"`
- Run `health_check()` after Ableton restart to verify connectivity
- Test new tools individually before integrating
- Use `netstat -an | findstr 9877` to verify TCP port availability
### Error Handling
- **No silent failures** - Errors must be explicit and actionable
- **Musical timing** - All timing uses bars/beats, not wall-clock
- **Coherence scoring** - Sample compatibility threshold at 0.90+
## Sample Library
### Location
- `libreria/` - User's raw samples (git-ignored, READ-ONLY)
- `librerias/` - Organized/analyzed samples (git-ignored, READ-ONLY)
### Expected Structure
```
libreria/reggaeton/
├── kick/
├── snare/
├── hihat/
├── bass/
├── chords/
├── melody/
├── fx/
└── drumloops/
```
### Metadata Store
- SQLite database at `AbletonMCP_AI/mcp_server/engines/sample_metadata.db`
- 800+ total samples (735+ analyzed with BPM, key, spectral features)
- **SentimientoLatino2025 collection**: 658 samples (26 kicks, 26 snares, 34 drumloops, 34 percs, 24 fx, 84 oneshots)
- Librosa-powered BPM analysis for accurate tempo detection
- Spectral embeddings (MFCC) for coherence matching
- Analysis cached on first scan, reused forever
## Key Skills
### Skill 1: Reinicio Correcto de Ableton
**File:** `AbletonMCP_AI/docs/skill_reinicio_ableton.md`
3-step process to cleanly restart Ableton:
1. Kill all Ableton processes
2. Delete recovery files (`CrashRecoveryInfo.cfg`, `CrashDetection.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`
Professional production workflow with 5 automatic injection methods:
- 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 manual configuration** - System chooses automatically.
### Skill 3: Session View Máster (Sprint 7)
**Status:** ✅ Completed 2026-04-13
Complete Session View production system:
- **13 scenes**: Intro → Verse A/B/C → Pre-Chorus → Chorus A/B/C → Bridge → Build Up → Final Chorus → Outro → End
- **20 tracks**: 14 audio + 6 MIDI (Kick layers, Snare layers, Drum Loop, Piano/Chords, Lead, Bass)
- **100+ samples**: Unique per scene with energy-based selection
- **BPM coherence**: Librosa analysis + spectral embeddings
- **Humanization**: Per-instrument profiles with timing/velocity variation
- **Warp automation**: Complex Pro for non-matching samples
**Usage:**
```python
ableton-live-mcp_produce_13_scenes(
genre="reggaeton",
tempo=95,
key="Am",
auto_play=True
)
# Then press F9 in Ableton to record to Arrangement
```
## EQ and Compressor Presets (Agente 10)
### EQ Presets
| Category | Preset | Description |
|----------|--------|-------------|
| Drums | `kick`, `kick_sub`, `kick_punch` | Kick variations |
| Drums | `snare`, `snare_body`, `snare_crack` | Snare variations |
| Bass | `bass`, `bass_clean`, `bass_dirty` | Bass variations |
| Synth | `synth`, `synth_air`, `pad_warm` | Synth/pad variations |
| Vocal | `vocal_presence` | 3-5kHz presence boost |
| Master | `master`, `master_tame` | Master EQ variations |
### Compressor Presets
| Category | Preset | Description |
|----------|--------|-------------|
| Drums | `kick_punch`, `parallel_drum` | Drum compression |
| Bass | `bass_glue` | Glue compression |
| Vocal | `aggressive_vocal` | Vocal compression |
| Bus | `buss_glue`, `buss_tight`, `glue_light`, `glue_heavy` | Bus compression |
| Master | `master_loud` | Loud master |
| FX | `pumping_sidechain`, `transparent_leveling` | Special effects |
## Known Issues & Workarounds
### Issue 1: MIDI Instrument Loading (Async Timing)
**Status:** ⚠️ Workaround available
**Problem:** `browser.load_item()` is asynchronous; devices may not appear immediately after call
**Fix Applied:** Polling loop with 3-second timeout, 15 attempts × 200ms
**Workaround:** If automatic loading fails, use `insert_device` manually or verify in Ableton UI
**Note:** Track will show `device_count=0` until instrument actually loads
### Issue 2: analyze_library Cache Attribute
**Status:** ✅ Fixed
**Problem:** Typo in server.py line 738: `analyzer._cache_file` vs `analyzer.cache_path`
**Fix:** Corrected to `analyzer.cache_path`
**Verification:** `analyze_all_bpm` tool now functional
### Issue 3: Drum Loop BPM Mismatch
**Status:** ✅ Auto-handled
**Problem:** "100bpm gata only drumloop" vs project at 95 BPM
**Solution:** `warp_clip_to_bpm` automatically applies Complex Pro warp mode
**Result:** Seamless tempo matching without pitch shift artifacts
## Troubleshooting
| Problem | Solution |
|---------|----------|
| Connection refused | Check Ableton has AbletonMCP_AI loaded in Preferences → Link/Tempo/MIDI → Control Surfaces |
| Port 9877 blocked | Run: `netstat -an \| findstr 9877` |
| Changes not reflecting | Restart Ableton (delete `CrashRecoveryInfo.cfg` first) |
| Sample selection empty | Verify `libreria/reggaeton/` has .wav files |
| Timeout on generation | Check Ableton log for errors |
| MCP server won't start | Run `mcp_wrapper.py` manually to see error output |
## Project Statistics
| Metric | Value |
|--------|-------|
| Total Files | 125+ |
| Lines of Code | ~110,000 |
| Python Engines | 53+ |
| MCP Tools | 114+ |
| Documentation | 32+ pages |
| Sample Library | 800+ total, 735+ analyzed |
| Presets | 7+ saved |
| Sprints Completed | 7 |
## 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/`
## Workflow
**Kimi** codes features → **Qwen** verifies/compiles/debugs/assigns next sprint
All sprints saved to `AbletonMCP_AI/docs/sprint_N_description.md`
---
## 🗺️ Roadmap & Future Work (TODO)
### **Critical Priority (Sprint 8)**
#### 1. MIDI Instrument Loading - Robust Solution
**Status:** ⚠️ Partial - Polling implemented but unreliable
**Problem:** `browser.load_item()` is async, no callback when device actually loads
**Current workaround:** 3-second polling loop
**Needed solution:**
- [ ] Implement device presence verification with retry logic (10 attempts × 500ms)
- [ ] Add fallback: if Wavetable fails, try Operator, then Analog, then Simpler
- [ ] Create "Instrument Rack" preset approach - load rack with default chain
- [ ] Alternative: Use `live.object` API if available for direct device creation
- [ ] Max for Live bridge (last resort) - create M4L device that receives OSC commands
**Acceptance Criteria:**
- `insert_device` returns `device_inserted: true` AND `device_count > 0` in track
- Works for: Wavetable, Operator, Analog, Electric, Tension, Collision
- Max 5 seconds total wait time
#### 2. BPM Analyzer Integration
**Status:** ✅ Engine created, NOT integrated into production pipeline
**Files ready:** `bpm_analyzer.py`, `spectral_coherence.py`
**Integration needed:**
- [ ] Run `analyze_all_bpm()` on full library (800 samples) - takes ~30 min
- [ ] Store results in `metadata_store` table `samples_bpm`
- [ ] Modify `produce_13_scenes` to use BPM-coherent samples by default
- [ ] Add `force_bpm_coherence` parameter to all production tools
- [ ] Create `get_bpm_recommendations()` tool for user queries
**Acceptance Criteria:**
- All 800 samples have BPM in database
- Producing at 95 BPM uses only 90-100 BPM samples (±5 tolerance)
- Samples outside tolerance auto-warp with Complex Pro
#### 3. Single Drum Loop Architecture
**Status:** 📝 Planned
**Current:** Multiple drum loops rotate across scenes
**Desired:** ONE drum loop stretched 1:30 min + harmony variations
**Implementation:**
- [ ] Create `extend_loop_to_duration()` function
- [ ] Use `clip.loop_end` to extend without re-triggering
- [ ] Disable sample rotation for drumloop category
- [ ] Add harmony layers (piano, pads) that change per scene
- [ ] Keep drum loop constant, vary harmony/progressions
**Acceptance Criteria:**
- Single drum loop plays continuously for full song duration
- Harmony/progressions change per scene (Intro≠Verse≠Chorus)
- No audible cuts/glitches in drum loop
---
### **High Priority (Sprint 9)**
#### 4. Max for Live Integration (Optional)
**Status:** 📋 Evaluated, not implemented
**Use case:** If Python `browser.load_item()` remains unreliable
**Approach:**
- [ ] Create simple M4L device "InstrumentLoader" that listens to OSC
- [ ] Python sends OSC message: `/loadinstrument track_index, instrument_name`
- [ ] M4L device uses `live.object` to insert device directly (more reliable)
- [ ] M4L confirms back via OSC when done
**Pros:** More reliable device insertion
**Cons:** Requires M4L license, additional complexity
**Decision:** Only implement if Python solution fails consistently
#### 5. Arrangement Recording Automation
**Status:** 📝 Planned - Currently manual (F9)
**Goal:** Auto-record Session View to Arrangement
**Implementation:**
- [ ] `arrangement_overdub` + scene firing + time-based stop
- [ ] Or: `duplicate_clip_to_arrangement` for each clip (if API available)
- [ ] Create `auto_record_session(duration_bars=70)` tool
- [ ] Post-recording: verify all clips appeared in Arrangement
**Current workaround:** User presses F9 manually
---
### **Medium Priority (Backlog)**
#### 6. Advanced Warp Modes
- [ ] Auto-detect best warp mode (Complex Pro vs Beats vs Tones)
- [ ] Per-sample warp configuration stored in metadata
- [ ] Real-time warp quality monitoring
#### 7. Vocal Placeholder Tracks
- [ ] Create empty audio track labeled "VOCALS" for user recording
- [ ] Add sidechain ducking from vocals to music
- [ ] Pre-configure compressor for vocal riding
#### 8. Stem Export Automation
- [ ] `render_stems()` with track groups (Drums, Bass, Music, FX)
- [ ] Individual stems + mixed stem option
- [ ] Naming convention: `ProjectName_StemName.wav`
#### 9. Reference Track Matching
- [ ] Finish `produce_from_reference()` implementation
- [ ] Spectral analysis of reference vs generated
- [ ] Auto-adjust EQ/compression to match reference
#### 10. Batch Production
- [ ] `batch_produce(count=5)` - Generate 5 variations of same prompt
- [ ] Each with different random seed for samples
- [ ] Compare and rank by coherence score
---
### **Bug Fixes Needed**
| Bug | Severity | Status | Notes |
|-----|----------|--------|-------|
| `device_count` stays 0 after `insert_device` | **Critical** | Workaround | Polling helps but not 100% |
| `analyze_library` needs OpenCode restart | Low | Fixed | Cache path typo corrected |
| Humanization needs numpy | Medium | Broken | `apply_human_feel` fails without numpy |
| Time stretch clip API mismatch | Medium | Broken | Signature mismatch in `get_notes` |
| `duplicate_project` renames tracks weirdly | Low | Working | Cosmetic issue only |
---
### **Performance Optimizations**
- [ ] Parallel sample analysis (4 threads for 800 samples)
- [ ] Lazy loading of heavy engines (librosa, sklearn)
- [ ] Cache embeddings as binary blobs not JSON
- [ ] Incremental BPM analysis (only new samples)
---
### **Documentation TODO**
- [ ] Create `docs/sprint_8_midi_loading.md` - Technical deep dive
- [ ] Create `docs/sprint_8_bpm_integration.md` - BPM system guide
- [ ] Update `API_REFERENCE_PRO.md` with 5 new tools
- [ ] Create troubleshooting guide for MIDI issues
- [ ] Video/gif demos of Session View workflow
---
## Current Sprint Assignment
**Sprint 9 (Active):** Score → Render Pipeline (Compose-then-Render)
**Goal:** 50+ songs generated and rendered autonomously via ai_loop.py
**Status:** ✅ Completed 2026-04-14 (Strict Session View Implementation)
**Key Dev:** Refer to `docs/SYSTEM_SCORE_RENDER.md` for JSON schema and rendering logic.