# 🎛️ AbletonMCP AI — Roadmap a Calidad DJ Profesional

> **Documento Maestro** | 28-Mar-2026
> Basado en: `server.py`, `sample_selector.py`, `glm_coherence_diversity.md`, `glm_sample_intelligence.md`, `human_feel.md`
>
> Objetivo: evolucionar el sistema desde un generador MIDI funcional a una herramienta de producción Tech House de **calidad de lanzamiento DJ profesional (DJ Hertz, Innervisions, Get Physical)**.

---

## 🗺️ Mapa de fases

| Fase | Nombre | Estado | Tareas |
|------|--------|--------|--------|
| **0** | Fundación y estabilidad | ✅ DONE | T001–T010 |
| **1** | Inteligencia de samples | 🔴 P1 | T011–T024 |
| **2** | Coherencia musical & Paleta | 🔴 P1 | T025–T039 |
| **3** | Human Feel & Dinámicas | 🟠 P2 | T040–T050 |
| **4** | Soundscape & Tonal | 🟠 P2 | T051–T062 |
| **5** | Arranjo y estructura DJ | 🟡 P3 | T063–T077 |
| **6** | Masterización & Lanzamiento | 🟡 P3 | T078–T090 |
| **7** | IA Autónoma y Aprendizaje | 🔵 FUTURO | T091–T110 |

---

## FASE 0 — Fundación y Estabilidad ✅

- [x] **T001** — Migrar proyecto a `C:\Users\ren\AbletonMCP_AI` con junction a `ProgramData`
- [x] **T002** — Crear `start_server.bat` con `PYTHONPATH` correcto
- [x] **T003** — Sincronizar `opencode.json` y `.opencode.json` apuntando a ruta nueva
- [x] **T004** — Verificar que `server.py` arranca sin errores en log
- [x] **T005** — Confirmar que `SampleManager` carga la librería completa en `librerias\all_tracks`
- [x] **T006** — Confirmar conexión MCP activa y visible en cliente AI
- [x] **T007** — Resolver permisos NTFS en `ProgramData` para edición directa
- [x] **T008** — Configurar logging a nivel INFO en producción
- [x] **T009** — Integrar estructura de errores: `MCPError`, `ValidationError`, `TimeoutError`
- [x] **T010** — Pipeline end-to-end: generar 1 canción y verificar que carga en Ableton

---

## FASE 1 — Inteligencia de Samples 🔴 PRIORIDAD MÁXIMA

> **Goal**: De 800 samples disponibles, el sistema usa todos inteligentemente, sin repetir, con coherencia tonal.

### 1.A — Fix de repetición (impacto inmediato)

- [ ] **T011** — `server.py → _find_library_file()`: aumentar `limit` de semantic search de `10` a `50`
  - Bug actual: solo se evalúan 10 resultados; si tienen penalización de diversidad, el sistema queda atascado en los mismos archivos.

- [ ] **T012** — `sample_selector.py → select_sample()`: shuffled candidate pool con `session_seed`
  - Antes de scorear, aplicar `random.shuffle()` al pool con seed basado en timestamp de la generación.

- [ ] **T013** — `server.py → _build_audio_fallback_sample_paths()`: bucket sampling por subcarpeta
  - Limitar a máximo 15 archivos por subcarpeta. Garantiza que samples de distintas colecciones entren al pool.

- [ ] **T014** — Verificar y reparar persistencia de `sample_history.json` entre reinicios del servidor
  - Si el archivo no existe al arrancar: inicializar con diccionario vacío (no con None).

- [ ] **T015** — Herramienta MCP `get_sample_coverage_report()`
  - Devolver: % de cobertura por subcarpeta, samples más usados, samples nunca usados.

### 1.B — Análisis espectral en indexado

- [ ] **T016** — `vector_manager.py → _build_index()`: agregar llamada a `AudioAnalyzer.analyze()` para cada sample
  - Extraer y guardar en `.sample_embeddings.json`: `key`, `key_confidence`, `spectral_centroid`, `is_harmonic`.
  - Flag `--skip-audio-analysis` para rebuild rápido en desarrollo.

- [ ] **T017** — `sample_selector.py → _calculate_sample_score()`: agregar factor `brightness_fit` (peso 0.10)
  - `atmos`, `pad`, `drone`: penalizar `spectral_centroid > 8000 Hz`.
  - `bass`, `sub_bass`: penalizar `spectral_centroid > 3000 Hz`.
  - `lead`, `chord`: preferir key dentro de ±1 quinta de la key del proyecto.

- [ ] **T018** — Mejorar el embed de texto en `vector_manager.py` para incluir info espectral
  - Formato: `"kick 808 drums bright=low harmonic=no key=None"`

- [ ] **T019** — Validar que `audio_analyzer.py` con `librosa` detecta key en ≥70% de samples
  - Script de prueba: analizar 50 archivos aleatorios y reportar `key`, `confidence`.

- [ ] **T020** — Agregar campo `is_tonal` al metadata del índice
  - `True` para: chords, pad, lead, bass, pluck, arp, drone.
  - `False` para: kick, snare, hat, crash, fill.

### 1.C — Sistema de fatiga persistente

- [ ] **T021** — Crear `sample_fatigue.json` en `~/.abletonmcp_ai/`
  - Estructura: `{path: {role: {uses: int, last_used: timestamp}}}`
  - Reemplaza gradualmente `_recent_sample_diversity_memory`.

- [ ] **T022** — Factor de fatiga continuo (vs. binario actual)
  - 0 usos: sin penalización → `fatigue_factor = 1.0`
  - 1-3 usos: `fatigue_factor = 0.75`
  - 4-10 usos: `fatigue_factor = 0.50`
  - 10+ usos: `fatigue_factor = 0.20` (casi bloqueado)

- [ ] **T023** — Herramienta MCP `reset_sample_fatigue(role=None)`
  - Sin `role`: resetear toda la fatiga. Con `role`: resetear solo ese rol.

- [ ] **T024** — Herramienta MCP `get_sample_fatigue_report()`
  - Top-10 samples más usados por rol con conteos y timestamps.

---

## FASE 2 — Coherencia Musical & Sistema de Paleta 🔴 PRIORIDAD MÁXIMA

> **Goal**: Cada canción tiene una "identidad sonora" coherente. Drums, bass y music suenan como si vinieran de la misma sesión.

### 2.A — Palette Lock

- [ ] **T025** — Selección de "folder ancla" por bus al inicio de cada generación
  - Elegir aleatoriamente de las carpetas **menos usadas** (via Coverage Wheel).
  - Mapear: `drums_anchor`, `bass_anchor`, `music_anchor` (FX libre).

- [ ] **T026** — `sample_selector.py → _calculate_sample_score()`: agregar factor `palette_bonus`
  - Folder ancla: `score *= 1.4` | Folder compatible: `score *= 1.2` | Diferente: `score *= 0.9`

- [ ] **T027** — Guardar la palette en el manifest de generación
  - Formato: `{"palette": {"drums": "Splice/Techno/Kit_A", "bass": "SM/TechHouse/Bass"}}`

- [ ] **T028** — Herramienta `set_palette_lock(drums, bass, music)` para override manual

### 2.B — Coverage Wheel

- [ ] **T029** — Crear `collection_coverage.json` en `~/.abletonmcp_ai/`
  - Estructura: `{folder_path: {uses: int, last_used: timestamp}}`

- [ ] **T030** — Al terminar cada generación: actualizar Coverage Wheel con carpetas usadas

- [ ] **T031** — Lógica de selección de ancla: weighted random sampling por frescura
  - `freshness = max(0, 10 - uses_last_10_gens)` → elegir ancla con mayor freshness.

- [ ] **T032** — Herramienta MCP `get_coverage_wheel_report()` → heatmap de uso por carpeta

### 2.C — Wild Card Injection

- [ ] **T033** — Seleccionar 2-3 roles "wild card" por generación
  - Para wild cards: solo 2 filtros duros (rol correcto + duración válida), sin penalización.

- [ ] **T034** — `select_sample_wildcard(role, seed)` en `SampleSelector`
  - Log: `"Wild card selected: {path} for role {role}"`

### 2.D — Section Casting

- [ ] **T035** — Definir `ROLE_SECTION_VARIANTS` en `song_generator.py`
  ```python
  ROLE_SECTION_VARIANTS = {
    'top_loop':   {'intro': 'minimal filtered subtle', 'drop': 'full punchy driving', 'break': 'sparse reversed'},
    'atmos':      {'intro': 'atmospheric wide', 'drop': 'driving textured', 'break': 'deep long ambient'},
    'pad':        {'intro': 'soft subtle', 'drop': 'full wide powerful', 'break': 'evolving textured'},
    'vocal_chop': {'intro': 'minimal', 'drop': 'aggressive chopped', 'break': 'reversed distant'},
  }
  ```

- [ ] **T036** — `server.py → _find_library_file()`: pasar `section` como modificador del query
  - `query_modified = f"{base_query} {ROLE_SECTION_VARIANTS[role][section]}"`

- [ ] **T037** — Seleccionar samples distintos por sección para roles con variantes

### 2.E — Fingerprint tonal de la canción

- [ ] **T038** — Al seleccionar el primer sample armónico: extraer fingerprint
  - `fingerprint = {key, spectral_centroid, is_major, brightness_category}` → guardar en contexto de generación.

- [ ] **T039** — Penalización de fingerprint mismatch para samples armónicos subsiguientes
  - Key a más de 2 quintas: `score *= 0.6` | Brightness muy diferente (>3000 Hz): `score *= 0.8`

---

## FASE 3 — Human Feel & Dinámicas 🟠 PRIORIDAD ALTA

> **Goal**: La música respira. Hay tensión-release, fades naturales, groove humano.

- [ ] **T040** — `Remote_Script.py`: agregar comando `write_clip_envelope`
  - Parámetros: `track_index`, `clip_index`, `points: List[(time_beats, value)]`

- [ ] **T041** — Herramienta `apply_clip_fades(track_index, section, fade_in_bars, fade_out_bars)`
  - Intro: fade-in 4-8 bars en kick, bass, top loops.
  - Outro: fade-out simétrico. Break: fade-down al inicio + fade-up antes del drop.

- [ ] **T042** — Herramienta `write_volume_automation(track_index, curve_type, section_map)`
  - Curves: `linear`, `exponential`, `s_curve`, `punch`.
  - Build: curva exponencial 0.5 → 0.85 en bus de music.

- [ ] **T043** — Implementar curvas de volumen por sección en `song_generator.py`
  - Intro: music al 60% → building → 100% en drop. Break: drums 30%, music+atmos 70%.

- [ ] **T044** — Herramienta `inject_dynamic_variation(track_index, role)`
  - Ghost notes MIDI: velocidad 20-40. Downbeats: 90-110. Upbeats: 60-80.
  - Para audio clips: micro-automatizaciones de ±3dB en forma de LFO lento.

- [ ] **T045** — Herramienta `apply_sidechain_pump(intensity, style)`
  - `'subtle'`: pump mínimo solo en drop.
  - `'jackin'`: pump pronunciado cada beat (tech house clásico).
  - `'breathing'`: pump lento cada 2 beats.

- [ ] **T046** — Variación de velocidad MIDI por sección
  - Intro: velocidades −15%. Drop: plenas + ghost notes.

- [ ] **T047** — Herramienta `apply_loop_variation(role, sections_map)`
  - Intro: top loop filtrado/suave. Drop: agresivo/abierto. Break: swing alto.

- [ ] **T048** — Herramienta `inject_pattern_fills(track_index, fill_density, section)`
  - Snare rolls, flams, tom fills, hi-hat busteos.
  - Densidad: `'sparse'` (1 cada 8 bars), `'medium'`, `'heavy'` (cada 2 bars).

- [ ] **T049** — Herramienta `apply_swing_to_clip(track_index, clip_index, swing_percent)`
  - Por sección: intro 8%, drop 14%, break 18%.

- [ ] **T050** — Herramienta paraguas `humanize_set(intensity)` (0.3 / 0.6 / 1.0)

---

## FASE 4 — Soundscape & Tonal 🟠 PRIORIDAD ALTA

> **Goal**: Identidad harmónica y espectral definida. No hay samples que "rompen" el ambiente.

- [ ] **T051** — Análisis masivo de key con Krumhansl-Schmuckler durante el indexado
- [ ] **T052** — `KEY_COMPATIBILITY_MATRIX` con scores 0-1 para cada par de keys
- [ ] **T053** — Integrar `KEY_COMPATIBILITY_MATRIX` en `_calculate_sample_score()` (factor 0.25)
- [ ] **T054** — Detección de `project_key` al iniciar generación (manual o inferida)
- [ ] **T055** — Rechazar samples con `key_compatibility < 0.40` para roles críticos (chords, lead, pad)
- [ ] **T056** — Definir `BRIGHTNESS_RANGES` óptimas por rol (sub_bass, bass, kick, pad, lead, atmos…)
- [ ] **T057** — Factor `spectral_fit` en `_calculate_sample_score()` (peso 0.10)
- [ ] **T058** — Paneo espectral inteligente por sección (dinámico según `AUDIO_LAYER_MIX_PROFILES`)
- [ ] **T059** — Filtros de frecuencia automáticos por sección (high-pass en intro, high-cut en break)
- [ ] **T060** — Brightness embedding de 8 bandas por sample en el índice
- [ ] **T061** — Tags automáticos de color espectral: `dark`, `neutral`, `bright`, `warm`, `harsh`
- [ ] **T062** — Herramienta `analyze_mix_spectrum()` → análisis del master en tiempo real

---

## FASE 5 — Arranjo y Estructura DJ Profesional 🟡 PRIORIDAD P3

> **Goal**: Estructura DJ real: intro largo para mezclar, drops definidos, breaks tensos, outro largo.

- [ ] **T063** — Definir `DJ_ARRANGEMENT_TEMPLATES` por subgénero (tech_house, deep_house, techno_minimal)
  ```python
  'tech_house': {
    'intro':   {'bars': 16, 'elements': ['kick','bass','hat'], 'energy': 0.4},
    'build_1': {'bars': 8,  'elements': ['+perc','+top_loop'], 'energy': 0.6},
    'drop_1':  {'bars': 16, 'elements': ['full'], 'energy': 1.0},
    'break':   {'bars': 8,  'elements': ['-kick','+atmos','filter_bass'], 'energy': 0.5},
    'drop_2':  {'bars': 16, 'elements': ['full','+vocal_peak'], 'energy': 1.0},
    'outro':   {'bars': 16, 'elements': ['-vocal','-music'], 'energy': 0.4},
  }
  ```

- [ ] **T064** — `generate_arrangement(template, length_bars)` → genera toda la sesión en Arrangement view
- [ ] **T065** — Intro DJ-compatible de mínimo 16 bars (solo kick + bass + hat)
- [ ] **T066** — Outro DJ-compatible de mínimo 16 bars (misma lógica inversa)
- [ ] **T067** — Loop markers automáticos en puntos clave (drop marcado como loop 16 bars)
- [ ] **T068** — Variación de pattern de kick por sección (ghost notes en build, reverse en break)
- [ ] **T069** — Hi-hat evolution: de closed a open gradualmente por sección
- [ ] **T070** — Bassline evolution: de root-note en intro a melodic walk en drop_2
- [ ] **T071** — Herramienta `inject_transition_fx(type, position_bar)` (riser / crash / snare_roll)
- [ ] **T072** — Filter sweep automation en transiciones (high-pass sube 8 bars antes del drop)
- [ ] **T073** — Reverb tail automation en breaks (reverb 0% → 40% → 0%)
- [ ] **T074** — Pitch automation: riser en últimos 4 beats del break, snap al drop
- [ ] **T075** — Micro-timing "push" del groove (kick −5ms, bass +8ms) para feel orgánico
- [ ] **T076** — `GROOVE_TEMPLATES` por subgénero: `tech_house_drop`, `tech_house_break`, `deep_house_drop`
- [ ] **T077** — `apply_groove_template(section, template_name)` aplicado automáticamente al arrangement

---

## FASE 6 — Masterización & Lanzamiento 🟡 PRIORIDAD P3

> **Goal**: La canción suena a promo de label internacional, lista para Beatport.

- [ ] **T078** — Validar `ROLE_GAIN_CALIBRATION` prácticamente: kick −8 LUFS, bass −10 LUFS
- [ ] **T079** — Herramienta `calibrate_gain_staging()` → medir LUFS de cada bus y ajustar faders
- [ ] **T080** — Verificar headroom en Master Track (≥ −6 dBFS antes del limitador)
- [ ] **T081** — `BUS DRUMS`: parallel compression calibrada (attack 30ms, release 100ms)
- [ ] **T082** — `BUS BASS`: sub en mono, high-cut automático por encima de 300Hz
- [ ] **T083** — `BUS MUSIC`: glue compressor 2:1 + stereo widener solo en mid-high
- [ ] **T084** — Verificar sends de FX (Space/Echo/Heat/Glue) coherentes con `AUDIO_LAYER_MIX_PROFILES`
- [ ] **T085** — Herramienta `run_mix_quality_check()`: LUFS, peak, RMS, balance L/R, correlation mono
- [ ] **T086** — Flags automáticos de issues críticos (clip, desbalance L/R, kick muy silencioso)
- [ ] **T087** — Herramienta `export_stem_mixdown(stem_config)` → stems 24-bit / 44.1kHz WAV
- [ ] **T088** — Generación automática de metadata Beatport (BPM, key, género desde el manifest)
- [ ] **T089** — A/B testing: generar 3 variantes del mismo drop con diferentes palette locks
- [ ] **T090** — Herramienta `analyze_reference_track(file_path)` → extraer BPM, key, LUFS, spectral balance del track de referencia

---

## FASE 7 — IA Autónoma y Aprendizaje 🔵 FUTURO

> **Goal**: El sistema aprende de las preferencias del usuario y mejora con cada sesión.

- [ ] **T091** — Sistema de rating `rate_generation(session_id, score: 1-5, notes)`
- [ ] **T092** — Feedback loop: samples de sesiones bien puntuadas tienen menor fatiga futura
- [ ] **T093** — Predicción de preferencias de palette por BPM/key (con 20+ generaciones)
- [ ] **T094** — Análisis de tendencias de la librería: identificar carpetas con mala performance histórica
- [ ] **T095** — Modo "Autopilot DJ": 16 tracks concatenados con Palette Lock linked entre sí
- [ ] **T096** — Herramienta `generate_dj_set(duration_hours, style_evolution)` → set de 4 horas completo
- [ ] **T097** — Análisis de referencia de Beatport top-100 Tech House (BPM, keys, spectral profiles)
- [ ] **T098** — Hot zone detection: identificar características comunes de drops con mejor rating
- [ ] **T099** — Medir si el set "mueve" via detección de variación de volumen en Ableton (proxy energía)
- [ ] **T100** — Herramienta `auto_improve_set(feedback_json)` → regenerar secciones con bajo score sin tocar las exitosas

---

## 🛠️ Infraestructura y Soporte

- [ ] **T101** — Tests de regresión para `sample_selector.py` (repetición, palette lock, key match)
- [ ] **T102** — Benchmark de performance del indexado (base: 800 samples < 20 min)
- [ ] **T103** — Hot reload de configuración sin reiniciar el servidor
- [ ] **T104** — `howto.md` actualizado con ejemplos JSON-RPC explícitos por herramienta
- [ ] **T105** — CI automático en Gitea con webhooks + badge de status
- [ ] **T106** — `CHANGELOG.md` con versiones del sistema
- [ ] **T107** — Backup diario de `~/.abletonmcp_ai/` (sample_history, fatigue, coverage)
- [ ] **T108** — Dashboard de métricas: `get_system_metrics()` → generaciones totales, cobertura %, promedio estrellas
- [ ] **T109** — Soporte para Deep House, Minimal Techno, Afro House en `STYLE_CONFIGS`
- [ ] **T110** — Script `import_sample_pack(folder, genre_tag, collection_name)` → indexa + actualiza Coverage Wheel

---

## 📊 Métricas de éxito por Fase

| Fase | KPI | Target |
|------|-----|--------|
| 1 | % samples únicos en 20 generaciones | > 85% |
| 1 | % samples con key detectada | > 60% |
| 2 | Coherencia de palette (% samples del folder ancla) | > 65% |
| 2 | Coverage de librería en 20 generaciones | > 80% carpetas usadas |
| 3 | Diferencia de energía drop vs break | > 6 dB LUFS |
| 4 | Key mismatch rate en samples armónicos | < 10% |
| 5 | Intro/Outro duration DJ-compatible | ≥ 16 bars |
| 6 | LUFS integrado del master | −10 a −8 LUFS |
| 6 | Headroom en master | ≥ 0.3 dBTP |

---

## 🚀 Orden de implementación recomendado

| Sprint | Tareas | Objetivo |
|--------|--------|----------|
| **1** (inmediato) | T011 → T015 | Fix de repetición de samples |
| **2** | T025 → T032 | Palette Lock + Coverage Wheel |
| **3** | T040 → T050 | Human Feel básico |
| **4** | T016 → T020, T051 → T055 | Tonal intelligence |
| **5** | T063 → T072 | Estructura DJ |
| **6** | T078 → T087 | Gain staging + export |

---

*Documento vivo — actualizar con cada sprint completado.*
