Initial commit: AbletonMCP-AI complete system

- MCP Server with audio fallback, sample management
- Song generator with bus routing
- Reference listener and audio resampler
- Vector-based sample search
- Master chain with limiter and calibration
- Fix: Audio fallback now works without M4L
- Fix: Full song detection in sample loader

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
renato97
2026-03-28 22:53:10 -03:00
commit 6ec8663954
120 changed files with 59101 additions and 0 deletions

View File

@@ -0,0 +1,215 @@
# AbletonMCP-AI — Tech House Professional DJ Roadmap
> Repositorio: AbletonMCP_AI | Foco: **Tech House** (122128 BPM)
> Última actualización: 2026-03-28
---
## Estado actual del sistema
El sistema tiene una base sólida:
- `song_generator.py` (~6k líneas): blueprints de secciones, perfiles de arrangement, bus system, gain calibration, device automation por sección
- `vector_manager.py`: semantic search + filtros de duración (evita canciones completas)
- `role_matcher.py`: validación de samples por rol con thresholds y penalizaciones
- `sample_selector.py`: selección de samples con compatibilidad BPM/key
- `audio_resampler.py`: resample layers y análisis
- `server.py` (~7k líneas): herramientas MCP expuestas al AI
---
## 🔴 BUG FIXES — Prioridad crítica
### BF-01: Track "AUDIO ATMOS 2" con canción completa
- **Problema**: El filtro de duración (max 45s) no se aplica consistentemente en todos los paths de carga
- **Causa**: `_build_audio_fallback_sample_paths` en `server.py` tiene glob patterns que ignoran el filtro de `vector_manager`
- **Fix**: Reindexar la librería con `reindex_library` y verificar que `_find_library_file` rechaza archivos donde `soundfile` lanza excepción (duración = -1)
- **Archivo**: `server.py``_find_library_file`, `_build_audio_fallback_sample_paths`
### BF-02: Embeddings desactualizados post-cambios
- **Problema**: Al agregar nuevos samples a la librería, el índice `.sample_embeddings.json` no se reconstruye automáticamente
- **Fix**: Agregar un hash de fingerprint del directorio (mtime o conteo) al índice y validar en cada arranque
- **Archivo**: `vector_manager.py``_load_or_build_index`
### BF-03: Colisión de nombres de track "AUDIO X 2"
- **Problema**: Cuando se crea un segundo track con el mismo nombre, Ableton le agrega "2" automáticamente y luego el sistema no lo encuentra por nombre
- **Fix**: Normalizar búsquedas de tracks usando índice numérico en vez de nombre como identificador primario
- **Archivo**: `server.py``_mute_tracks_for_audio_layers`, `_normalize_track_name`
### BF-04: Linting errors restantes
- **Problema**: Múltiples errores de ruff reportados en `ruff_errors.txt` (principalmente F821 undefined names, E501 line length)
- **Fix**: Pasar `ruff check --fix` y revisar los F821 manualmente
- **Archivos**: `server.py`, `song_generator.py`
### BF-05: `soundfile` excepción silenciosa permite archivos inválidos
- **Problema**: Si `soundfile` falla al leer un archivo, se asigna `duration = -1` pero el archivo igual puede ser insertado en escenarios de fallback
- **Fix**: En `_find_library_file`, `duration < 0` debe ser rechazado explícitamente también en el branch de fallback de `glob`
- **Archivo**: `server.py``_find_library_file`
---
## 🟠 MEJORAS CORE — Tech House específico
### MJ-01: Blueprints de sección optimizados para Tech House DJ
- **Qué**: Los blueprints actuales (`standard`, `extended`, `club`) son genéricos. Tech House DJ requiere intros/outros de 16-32 bars para beatmatching
- **Cambio**:
```python
'tech-house-dj': [
('INTRO DJ', 32, 8, 'intro', 1), # 32 bars solo kick+bass para mezcla
('GROOVE A', 16, 16, 'build', 2),
('VOX TEASE', 8, 20, 'build', 3),
('DROP A', 32, 30, 'drop', 5),
('BREAK', 8, 22, 'break', 1),
('BUILD', 8, 24, 'build', 3),
('DROP B', 32, 32, 'drop', 5),
('OUTRO DJ', 32, 8, 'outro', 1), # 32 bars solo kick+bass para salida
]
```
- **Archivo**: `song_generator.py` → `SECTION_BLUEPRINTS`
### MJ-02: Patrones rítmicos tech house propios
- **Qué**: Los patrones de kick/hat/perc están en `create_drum_pattern` (server.py) como presets genéricos. Tech House usa swing, offbeat hats, y kicks con ghost notes
- **Cambio**: Agregar presets `'tech-house-swing'`, `'tech-house-jackin'`, `'tech-house-minimal'` con:
- Kick en 1 y 3 con variaciones en 2.5 y 3.5
- Hi-hat con swing 16% y offbeats en 1/8
- Clap/snare en 2 y 4 con ghost notes
- **Archivo**: `server.py` → `create_drum_pattern`
### MJ-03: Bass lines tech house
- **Qué**: `create_bassline` genera 4 estilos genéricos. Tech House requiere basslines sincopadas y groovy
- **Cambio**: Agregar estilo `'tech-house'` con notas en posiciones off-beat, slides, y variaciones de velocidad para groove
- **Archivo**: `server.py` → `create_bassline`
### MJ-04: Chord progressions tech house
- **Qué**: `CHORD_PROGRESSIONS` en `song_generator.py` no tiene entradas específicas para tech house
- **Cambio**: Agregar progressiones:
- Am → Fm → Gm (oscura, hipnótica)
- Dm → Am → Dm (loop de dos acordes para drop)
- Cm → Gm (minimalista con tensión)
- **Archivo**: `song_generator.py` → `CHORD_PROGRESSIONS`
### MJ-05: Estilo Latin Tech House
- **Qué**: El sistema tiene menciones de `latin-industrial` (Eli Brown) pero no tiene patrones de percusión latina implementados
- **Cambio**: Agregar preset `'latin-tech-house'` con:
- Conga / bongo patterns como perc layer
- Bass con notas sincopadas al estilo afro-percusivo
- Vocal shots ("ey", "come on") en offbeats
- **Archivo**: `song_generator.py`, `server.py`
### MJ-06: Genre keyword expansion en VectorManager
- **Qué**: Las búsquedas semánticas usan strings genéricos. Tech house tiene vocabulario específico
- **Cambio**: Agregar diccionario de términos preferidos por género que enriquecen el query:
```python
GENRE_SEARCH_TERMS = {
'tech-house': ['groovy', 'driving', 'punchy', 'jackin', 'swinging', 'hypnotic'],
'house': ['deep', 'soulful', 'warm', 'classic'],
...
}
```
- **Archivo**: `vector_manager.py` o `server.py`
### MJ-07: Reindex automático al detectar cambios en librería
- **Qué**: El índice de embeddings solo se reconstruye manualmente. Si el usuario agrega samples, no se detectan
- **Cambio**: Al iniciar `VectorManager`, comparar el conteo de archivos actual vs el del índice. Si difieren, rebuild automático
- **Archivo**: `vector_manager.py` → `_load_or_build_index`
---
## 🟡 MEJORAS DJ PRO — Funcionalidades de DJ profesional
### DJ-01: Track Stems export / bus routing visible
- **Qué**: Un DJ profesional necesita poder exportar stems (kick, bass, music, fx) separados
- **Cambio**: Agregar herramienta `export_stems_config()` que configura los buses para exportación de stems individual, nombrando y coloreando cada bus consistentemente
- **Archivo**: `server.py` (nuevo tool)
### DJ-02: Harmonic mixing — Camelot wheel
- **Qué**: El sistema elige keys pero no verifica compatibilidad con Camelot wheel para mezcla armónica
- **Cambio**: Agregar función `get_compatible_keys(current_key)` que devuelve keys compatibles en la rueda de Camelot (±1 tono, relativo mayor/menor). Usar en `suggest_key_change`
- **Archivo**: `server.py` → `suggest_key_change`
### DJ-03: BPM grid automático — Sync markers
- **Qué**: Al generar una canción con intro DJ de 32 bars, colocar marcadores de Ableton (`locators`) en los puntos exactos de cada sección para que el DJ pueda saltar entre puntos
- **Cambio**: Usar el comando `create_arrangement_locator` de Ableton API para marcar cada sección
- **Archivo**: `server.py`, `Remote_Script.py` (agregar comando de socket)
### DJ-04: Loop regions automáticas
- **Qué**: Marcar los drops como loop regions en Ableton para que el DJ pueda activar el loop con un botón
- **Cambio**: Al generar la canción, colocar punch-in / punch-out en los drops principales
- **Archivo**: `server.py`
### DJ-05: Energy curve explícita
- **Qué**: El sistema tiene `ROLE_ACTIVITY` con valores de energía por sección pero no hay una curva visible para el usuario
- **Cambio**: Al terminar la generación, imprimir (en el manifest) la curva de energía sección a sección: `[INTRO: 25%] → [BUILD: 70%] → [DROP: 100%]...`
- **Archivo**: `server.py` → manifest / `get_generation_manifest`
### DJ-06: Referencia de track real — Eli Brown style
- **Qué**: `REFERENCE_TRACK_PROFILES` tiene "Eli Brown - Me Gusta" definido pero no se puede cargar automáticamente una referencia para análisis A/B
- **Cambio**: Hacer funcional el sistema de referencia: si el usuario pone un archivo en `librerias/reference/`, que sea analizable e influya en BPM, key, y energy curve de la generación
- **Archivo**: `server.py`, `audio_resampler.py`, `reference_listener.py`
---
## 🟢 NICE TO HAVE — Calidad de vida
### NTH-01: Preview de canción antes de generar
- **Qué**: El sistema genera todo de golpe sin preview. Poder ver primero el "blueprint" (qué tracks, qué samples, qué estructura) antes de ejecutar
- **Cambio**: Agregar `preview_generation(genre, style, key, bpm)` que devuelve el manifest sin crear nada en Ableton
- **Archivo**: `server.py`, `song_generator.py`
### NTH-02: Regeneración selectiva de secciones
- **Qué**: Si el drop no quedó bien, hay que regenerar todo. Debería poder regenerarse solo el drop
- **Cambio**: Agregar `regenerate_section(section_name)` que borra los clips de esa sección y los regenera
- **Archivo**: `server.py`
### NTH-03: Historial de generaciones
- **Qué**: Solo se guarda el último manifest. Debería haber un historial de las últimas 5 generaciones
- **Cambio**: Guardar manifests en archivos `.json` con timestamp en `librerias/generations/`
- **Archivo**: `server.py` → `_store_generation_manifest`
### NTH-04: Color coding consistente por género
- **Qué**: Los colores de tracks son estáticos. Tech House podría tener paleta propia (naranja, azul oscuro)
- **Cambio**: Agregar `GENRE_COLOR_PALETTES` y aplicar al generar tracks
- **Archivo**: `song_generator.py` → `TRACK_COLORS`
### NTH-05: Sample diversity mejorada
- **Qué**: Si la librería tiene 3 kicks, el sistema puede usar el mismo kick en 2 generaciones seguidas
- **Cambio**: Existe `reset_diversity_memory` pero no hay persistencia entre sesiones. Guardar el historial de samples usados en un JSON local
- **Archivo**: `sample_selector.py`
### NTH-06: Validación de routing en tiempo real
- **Qué**: `validate_set` existe pero no se llama automáticamente al generar
- **Cambio**: Al terminar `generate_track`, llamar automáticamente a `detect_common_issues` y mostrar resumen con numero de errores/warnings
- **Archivo**: `server.py` → `generate_track`
### NTH-07: howto.md actualizado para Tech House
- **Qué**: El `howto.md` documenta el sistema genérico. Agregar sección específica de "Cómo generar Tech House profesional" con ejemplos de prompts, flujos de trabajo DJ, y settings recomendados
- **Archivo**: `howto.md`
---
## Orden de ejecución recomendado
| Prioridad | ID | Nombre | Esfuerzo |
|---|---|---|---|
| 1 | BF-01 | Full song en ATMOS track | 1h |
| 2 | BF-02 | Embeddings auto-rebuild | 2h |
| 3 | BF-03 | Colisión de nombres | 2h |
| 4 | MJ-01 | Blueprints DJ 32-bar intro/outro | 1h |
| 5 | MJ-02 | Drum patterns tech house | 2h |
| 6 | DJ-02 | Camelot wheel | 2h |
| 7 | MJ-03 | Bassline tech house | 1h |
| 8 | MJ-05 | Latin tech house preset | 3h |
| 9 | DJ-03 | BPM locators automáticos | 4h |
| 10 | DJ-06 | Referencia de track real | 4h |
| 11 | NTH-01 | Preview pre-generación | 3h |
| 12 | NTH-06 | Auto-validación post-generación | 1h |
| 13 | BF-04 | Linting cleanup | 2h |
---
## Notas arquitectónicas para el salto a Tech House
1. **BPM default**: cambiar `default_bpm` de `tech-house` de 125 a **126** (sweet spot del género actual)
2. **Key pool**: priorizar `Am`, `Fm`, `Dm` → más oscuras y groovy que las opciones actuales
3. **Swing**: el swing del 8% actual en hats es insuficiente. Tech House moderno usa 12-16%
4. **Sidechain pump**: el threshold actual de -22dB en bass bus es correcto, pero el release de 0.12s es lento. Bajar a 0.08-0.10s para más pump
5. **Atmos tracks**: el vol de 0.50 en `ROLE_MIX['atmos']` es correcto, pero usar filtros HPF altos (>1kHz) para que no compitan con el sub