415 lines
11 KiB
Markdown
415 lines
11 KiB
Markdown
# REPORTE CRÍTICO: PHANTOM CLIPS - DISCREPANCIA API vs UI
|
|
|
|
**Fecha:** 2026-04-07
|
|
**Proyecto:** AbletonMCP-AI Song Generation
|
|
**Tipo:** Bug crítico de sincronización API/UI
|
|
**Severidad:** P0 - Bloqueante para producción
|
|
|
|
---
|
|
|
|
## 1. RESUMEN EJECUTIVO
|
|
|
|
**Problema crítico descubierto:** La API de MCP reporta clips de audio como "creados y existentes" cuando en realidad **NO están materializados en Ableton Live**. Los clips son "fantasmas" - visibles para la API pero inexistentes en la UI y silenciosos en reproducción.
|
|
|
|
**Impacto:** Toda generación de canciones mediante MCP produce proyectos vacíos/incoherentes a pesar de reportar éxito.
|
|
|
|
---
|
|
|
|
## 2. EVIDENCIA IRREFUTABLE
|
|
|
|
### 2.1 Screenshot de Ableton Live (UI Real)
|
|
|
|
**Tracks mostrados en UI:**
|
|
- Track 2 (KICK): Vacío, sin clips visibles
|
|
- Track 3 (CLAP): Vacío, sin clips visibles
|
|
- Track 4 (HAT): Vacío, sin clips visibles
|
|
- Track 5 (BASS): Vacío, sin clips visibles
|
|
- Track 6 (SYNTH): 1 clip MIDI visible (únicamente este existe realmente)
|
|
|
|
**Estado:** Verde (armado) pero **sin contenido en arrangement**.
|
|
|
|
### 2.2 Respuesta de API MCP (Mismo momento)
|
|
|
|
```json
|
|
// GET /clips?track_index=2 (KICK)
|
|
{
|
|
"arrangement_clip_count": 17,
|
|
"arrangement_clips": [
|
|
{
|
|
"name": "@dastin.prod KICK 1",
|
|
"start_time": 8.0,
|
|
"length": 1.333,
|
|
"is_audio_clip": true
|
|
},
|
|
// ... 16 clips más reportados
|
|
]
|
|
}
|
|
```
|
|
|
|
```json
|
|
// GET /clips?track_index=3 (CLAP)
|
|
{
|
|
"arrangement_clip_count": 16,
|
|
"arrangement_clips": [
|
|
{
|
|
"name": "Snare @dastin (1)",
|
|
"start_time": 10.0,
|
|
"length": 0.458,
|
|
"is_audio_clip": true
|
|
},
|
|
// ... 15 clips más reportados
|
|
]
|
|
}
|
|
```
|
|
|
|
```json
|
|
// GET /clips?track_index=5 (BASS)
|
|
{
|
|
"arrangement_clip_count": 9,
|
|
"arrangement_clips": [
|
|
{
|
|
"name": "Midilatino_Sativa_A_Min_94BPM_Reese",
|
|
"start_time": 3.204,
|
|
"length": 64.0,
|
|
"is_audio_clip": true
|
|
},
|
|
// ... 8 clips más reportados
|
|
]
|
|
}
|
|
```
|
|
|
|
### 2.3 La Discrepancia
|
|
|
|
| Track | UI de Ableton | API de MCP | Estado Real |
|
|
|-------|---------------|------------|-------------|
|
|
| KICK | **0 clips** | 17 clips | ❌ **FANTASMA** |
|
|
| CLAP | **0 clips** | 16 clips | ❌ **FANTASMA** |
|
|
| BASS | **0 clips** | 9 clips | ❌ **FANTASMA** |
|
|
| SYNTH | 1 clip | 2 clips | ⚠️ **PARCIAL** |
|
|
|
|
**Conclusión:** La API está leyendo/escribiendo en un estado "virtual" que no se sincroniza con Ableton Live.
|
|
|
|
---
|
|
|
|
## 3. ANÁLISIS TÉCNICO
|
|
|
|
### 3.1 Hipótesis del Origen del Bug
|
|
|
|
#### **Hipótesis A: Session vs Arrangement Desincronización**
|
|
**Descripción:** Los clips se están creando en **Session View** pero la API los reporta como si estuvieran en **Arrangement View**.
|
|
|
|
**Evidencia:**
|
|
- SYNTH (MIDI) muestra 1 clip en UI - posiblemente porque los clips MIDI se crean en Arrangement por defecto
|
|
- Audio clips podrían estar creándose en Session y no "commiteándose" a Arrangement
|
|
- La API de Live tiene dos objetos diferentes: `session_clip` y `arrangement_clip`
|
|
|
|
**Verificación necesaria:**
|
|
```python
|
|
# En abletonmcp_init.py, verificar:
|
|
song.view.selected_track = track
|
|
for clip_slot in track.clip_slots:
|
|
if clip_slot.has_clip:
|
|
print(f"Session clip: {clip_slot.clip.name}")
|
|
|
|
for clip in track.arrangement_clips:
|
|
print(f"Arrangement clip: {clip.name}")
|
|
```
|
|
|
|
#### **Hipótesis B: Referencias Fantasma en Cache de MCP**
|
|
**Descripción:** MCP mantiene un diccionario interno de clips que no se sincroniza con el estado real de Live.
|
|
|
|
**Evidencia:**
|
|
- Los clips se crean exitosamente (sin errores)
|
|
- Se reportan en `get_clips` incluso después de tiempo
|
|
- Pero no son visibles ni audibles
|
|
|
|
**Posible código problemático:**
|
|
```python
|
|
# En server.py o abletonmcp_init.py
|
|
# El código podría estar manteniendo:
|
|
self._clip_cache = {
|
|
track_index: [clip1, clip2, ...] # Referencias locales
|
|
}
|
|
# Sin verificar si realmente existen en Live
|
|
```
|
|
|
|
#### **Hipótesis C: Commit Fallido de Audio Clips**
|
|
**Descripción:** La creación del clip "sucede" pero Ableton Live descarta el audio porque:
|
|
- El archivo de sample no existe en la ruta
|
|
- El sample tiene formato incompatible
|
|
- Ableton no tiene permisos para leer el archivo
|
|
- El clip se crea pero sin referencia al audio (clip vacío)
|
|
|
|
**Evidencia:**
|
|
- Los clips de MIDI (SYNTH) SÍ aparecen - solo audio falla
|
|
- Las rutas de samples son válidas (reportadas sin error)
|
|
- Pero posiblemente Ableton no puede resolverlas
|
|
|
|
**Verificación necesaria:**
|
|
```python
|
|
# Verificar que el archivo existe y es accesible
|
|
import os
|
|
sample_path = "C:\\...\\kick 1.wav"
|
|
if not os.path.exists(sample_path):
|
|
print("ERROR: Sample no existe")
|
|
# Verificar que Ableton puede cargarlo
|
|
```
|
|
|
|
#### **Hipótesis D: Problema de Timing y Sincronización**
|
|
**Descripción:** Los clips se crean pero Ableton los descarta porque:
|
|
- La operación asíncrona no completó antes del siguiente comando
|
|
- Race condition entre creación y lectura
|
|
- El clip existe "momentáneamente" pero luego se pierde
|
|
|
|
**Evidencia:**
|
|
- Fix de Codex agregó 100ms de espera - pero **NO funcionó**
|
|
- Los clips persisten en la API (no son temporales)
|
|
- Pero no están en la UI
|
|
|
|
**Conclusión:** No es un problema de timing, es de persistencia real.
|
|
|
|
---
|
|
|
|
## 4. COMPORTAMIENTO ANTES vs DESPUÉS DE FIXES
|
|
|
|
### 4.1 Antes de Fixes de Codex (2026-04-07 temprano)
|
|
- Clips se creaban y desaparecían
|
|
- `get_arrangement_timeline` mostraba clips → luego gaps
|
|
- Inconsistencia temporal
|
|
|
|
### 4.2 Después de Fixes de Codex (2026-04-07 tarde)
|
|
- Clips se crean y **persisten en la API**
|
|
- `get_arrangement_timeline` **SIEMPRE** muestra clips
|
|
- Pero **UI de Ableton NUNCA** los muestra
|
|
- **Situación peor:** Ahora tenemos "phantom clips" estables
|
|
|
|
---
|
|
|
|
## 5. DIAGNÓSTICO DIFERENCIAL
|
|
|
|
### 5.1 Qué Funciona ✅
|
|
- Creación de tracks ✅
|
|
- Asignación de nombres ✅
|
|
- Creación de clips MIDI (SYNTH visible en UI) ✅
|
|
- Returns y buses ✅
|
|
- Session info ✅
|
|
|
|
### 5.2 Qué NO Funciona ❌
|
|
- Materialización de clips de audio en Arrangement ❌
|
|
- Referencia a archivos de audio en clips ❌
|
|
- Sincronización API/UI para audio ❌
|
|
|
|
### 5.3 Patrón Identificado
|
|
**Audio Clips = Fantasmas**
|
|
**MIDI Clips = Reales**
|
|
|
|
Esto apunta a un problema específico en la creación de `AudioClip` vs `MidiClip` en la API de Live.
|
|
|
|
---
|
|
|
|
## 6. POSIBLES SOLUCIONES
|
|
|
|
### 6.1 Solución A: Forzar Commit a Arrangement
|
|
```python
|
|
# Después de crear el clip, llamar:
|
|
song.view.selected_track = track
|
|
song.view.follow_song = True
|
|
# O posiblemente:
|
|
track.flatten() # Commitear session a arrangement
|
|
```
|
|
|
|
### 6.2 Solución B: Verificación de Sample Path
|
|
```python
|
|
# Antes de crear clip, verificar:
|
|
import os
|
|
if not os.path.exists(sample_path):
|
|
return {"error": "Sample no existe"}
|
|
|
|
# Después de crear, verificar que el clip tiene audio:
|
|
if clip and clip.file_path != sample_path:
|
|
return {"error": "Clip no referencia sample correctamente"}
|
|
```
|
|
|
|
### 6.3 Solución C: Usar Método Nativo de Live
|
|
```python
|
|
# En lugar de crear clip directamente, usar:
|
|
track.create_audio_clip(start_time)
|
|
# O:
|
|
song.create_audio_track(insert_index)
|
|
# Y luego asignar sample
|
|
```
|
|
|
|
### 6.4 Solución D: Sincronización Forzada
|
|
```python
|
|
# Después de operaciones de creación:
|
|
song.request_show_in_browser() # Forzar refresh
|
|
# O:
|
|
song.view.selected_track = track # Trigger update
|
|
```
|
|
|
|
---
|
|
|
|
## 7. TESTS DE VERIFICACIÓN NECESARIOS
|
|
|
|
### Test 1: Creación Manual vs MCP
|
|
```
|
|
1. Crear clip de audio MANUALMENTE en Ableton
|
|
2. Leer con get_clips → ¿Se ve igual?
|
|
3. Comparar atributos: file_path, gain, warp_mode, etc.
|
|
```
|
|
|
|
### Test 2: Diferencia MIDI vs Audio
|
|
```
|
|
1. Crear clip MIDI con MCP
|
|
2. Verificar en UI → ¿Aparece?
|
|
3. Crear clip Audio con MCP
|
|
4. Verificar en UI → ¿Aparece?
|
|
5. Comparar diferencias en código
|
|
```
|
|
|
|
### Test 3: Persistencia Post-Guardado
|
|
```
|
|
1. Crear clips con MCP
|
|
2. Guardar proyecto (Ctrl+S)
|
|
3. Cerrar y reabrir Ableton
|
|
4. Verificar si clips persisten
|
|
```
|
|
|
|
---
|
|
|
|
## 8. REPRODUCCIÓN DEL BUG
|
|
|
|
### Pasos Exactos:
|
|
```bash
|
|
# 1. Iniciar Ableton Live 12 Suite
|
|
# 2. Ejecutar:
|
|
ableton-mcp-ai_create_audio_track(index=2, name="TEST")
|
|
|
|
# 3. Crear clip:
|
|
ableton-mcp-ai_create_arrangement_audio_pattern(
|
|
track_index=2,
|
|
start_time=0,
|
|
length=4.0,
|
|
sample_path="C:\\...\\kick 1.wav"
|
|
)
|
|
|
|
# 4. Verificar API:
|
|
ableton-mcp-ai_get_clips(track_index=2)
|
|
# → Reportará 1 clip
|
|
|
|
# 5. Verificar UI:
|
|
# → Ableton mostrará track vacío
|
|
|
|
# 6. Comparar:
|
|
# API dice clip existe, UI dice no existe
|
|
```
|
|
|
|
---
|
|
|
|
## 9. IMPACTO EN PRODUCCIÓN
|
|
|
|
### 9.1 Bugs Dependientes de Este
|
|
- Todos los `generate_song` fallan silenciosamente
|
|
- `create_arrangement_audio_pattern` reporta éxito pero no crea
|
|
- `audit_project_coherence` da métricas falsas
|
|
- `diagnose_generated_set` no detecta el problema real
|
|
|
|
### 9.2 Usuario Impactado
|
|
- No puede generar canciones automáticamente
|
|
- Tiempo perdido en debugging (como este caso)
|
|
- Frustración por discrepancia reporte vs realidad
|
|
|
|
---
|
|
|
|
## 10. RECOMENDACIONES PRIORITARIAS
|
|
|
|
### P0 - Crítico (Hoy)
|
|
1. **Debuggear creación de AudioClip en Live API**
|
|
- Comparar código de MIDI vs Audio clip creation
|
|
- Identificar diferencia que causa phantom
|
|
|
|
2. **Agregar verificación post-creación**
|
|
- Después de `create_arrangement_audio_pattern`, verificar con Live API (no cache)
|
|
- Si clip no existe realmente, retornar ERROR (no SUCCESS)
|
|
|
|
3. **Test unitario de persistencia**
|
|
- Crear clip → Guardar → Reabrir → Verificar
|
|
- Debe fallar si hay phantom clips
|
|
|
|
### P1 - Alto (Esta semana)
|
|
4. **Sistema de logs de debug detallado**
|
|
- Loggear cada paso de creación de clip
|
|
- Incluir referencias de memoria vs Live
|
|
|
|
5. **Modo "strict" para creación**
|
|
- Parámetro opcional: `verify_in_ui=True`
|
|
- Que la API espere y verifique que el clip aparece en UI
|
|
|
|
### P2 - Medio (Próxima sprint)
|
|
6. **Refactor de manejo de clips**
|
|
- Separar lógica de Session vs Arrangement
|
|
- Cache invalidation más agresivo
|
|
|
|
---
|
|
|
|
## 11. NOTAS PARA DESARROLLADOR
|
|
|
|
### Código Sospechoso (Revisar)
|
|
|
|
**Archivo:** `abletonmcp_init.py`
|
|
```python
|
|
# Líneas aproximadas 1800-1900
|
|
# Buscar función _create_arrangement_audio_pattern
|
|
|
|
# Posible problema:
|
|
clip = track.create_audio_clip(start_time) # ¿Esto existe en Live API?
|
|
clip.file_path = sample_path # ¿Se asigna correctamente?
|
|
|
|
# O alternativa:
|
|
audio_clip = track.create_clip(start_time, length) # ¿Crea clip vacío?
|
|
# ¿Falta asignar el sample?
|
|
```
|
|
|
|
**Archivo:** `abletonmcp_runtime.py`
|
|
```python
|
|
# Fix de Codex agregó:
|
|
for attempt in range(3):
|
|
time.sleep(0.1)
|
|
# Verificar persistencia...
|
|
|
|
# Pero la verificación podría estar leyendo cache, no Live real
|
|
```
|
|
|
|
### Diferencia Clave a Investigar
|
|
|
|
**MIDI Clip Creation (Funciona):**
|
|
```python
|
|
clip = track.create_midi_clip(start_time, length)
|
|
# ¿Live API tiene método específico?
|
|
```
|
|
|
|
**Audio Clip Creation (No funciona):**
|
|
```python
|
|
clip = track.create_audio_clip(start_time) # ¿Este método existe?
|
|
# ¿O debe ser?
|
|
audio_track.insert_audio_clip(sample_path, start_time)
|
|
```
|
|
|
|
---
|
|
|
|
## 12. CONCLUSIÓN
|
|
|
|
**Estado actual:** El sistema MCP está generando **phantom clips** - referencias vacías que la API reporta como existentes pero Ableton Live no reconoce.
|
|
|
|
**Fixes aplicados:** Los de Codex (persistencia y boundaries) NO resolvieron el problema fundamental.
|
|
|
|
**Acción requerida:** Debuggear la creación física de `AudioClip` en Ableton Live API y comparar con `MidiClip` que sí funciona.
|
|
|
|
**Severidad:** P0 - Bloquea toda generación de audio.
|
|
|
|
---
|
|
|
|
**Reporte generado por:** Claude (OpenCode GLM)
|
|
**Basado en:** Screenshot de usuario + logs de API
|
|
**Fecha:** 2026-04-07
|
|
**Estado:** Abierto - Requiere fix de desarrollador |