feat: Implement senior audio injection with 5 fallback methods

- Add _cmd_create_arrangement_audio_pattern with 5-method fallback chain
- Method 1: track.insert_arrangement_clip() [Live 12+]
- Method 2: track.create_audio_clip() [Live 11+]
- Method 3: arrangement_clips.add_new_clip() [Live 12+]
- Method 4: Session->duplicate_clip_to_arrangement [Legacy]
- Method 5: Session->Recording [Universal]

- Add _cmd_duplicate_clip_to_arrangement for session-to-arrangement workflow
- Update skills documentation
- Verified: 3 clips created at positions [0, 4, 8] in Arrangement View

Closes: Audio injection in Arrangement View
This commit is contained in:
OpenCode Agent
2026-04-12 14:02:32 -03:00
commit 5ce8187c65
118 changed files with 55075 additions and 0 deletions

View File

@@ -0,0 +1,279 @@
# INFORME SPRINT 1 - Completado por Kimi K2
**Fecha**: 2026-04-11
**Sprint**: Análisis Espectral de Librería + Embeddings
**Estado**: ✅ COMPLETADO
**Revisión**: Pendiente (Qwen)
---
## RESUMEN EJECUTIVO
Se completó la implementación del sistema de análisis espectral para la librería de 509 samples de reggaeton. El sistema ahora puede:
1. Analizar cada sample y extraer 12+ características espectrales
2. Crear embeddings vectoriales de 20 dimensiones para comparación
3. Comparar samples por similitud usando distancia coseno
4. Generar un perfil de sonido del usuario basado en `reggaeton_ejemplo.mp3`
5. Seleccionar samples inteligentemente según el estilo del usuario
**Total de código nuevo**: ~2,500 líneas
**Archivos compilados**: 5 (sin errores)
---
## ARCHIVOS CREADOS
### 1. `libreria_analyzer.py` (639 líneas)
**Ubicación**: `C:\ProgramData\Ableton\Live 12 Suite\Resources\MIDI Remote Scripts\AbletonMCP_AI\mcp_server\engines\`
**Funcionalidad**:
- Clase `LibreriaAnalyzer` - motor principal de análisis
- Escaneo recursivo de `libreria/reggaeton/` buscando .wav, .mp3, .aif, .flac
- Para cada sample extrae:
- **BPM**: Tempo detection via librosa.beat.beat_track()
- **Key**: Key detection via chromagram analysis
- **RMS**: Nivel de energía en dB
- **Spectral Centroid**: Brillo del sample (Hz)
- **Spectral Rolloff**: Frecuencia de corte (Hz)
- **Zero Crossing Rate**: Percutivo vs sostenido
- **MFCCs**: 13 coeficientes de timbre/fingerprint
- **Onset Strength**: Qué tan rítmico/percutivo es
- **Duration**: Duración en segundos
- **Sample Rate**: Frecuencia de muestreo
- **Channels**: Mono (1) o Stereo (2)
- **Role**: kick/snare/bass/etc. (detectado por carpeta)
**Métodos públicos**:
- `analyze_all()` - Analiza toda la librería con progreso
- `get_features(sample_path)` - Consulta features de un sample
- `get_stats()` - Estadísticas globales de la librería
**Cache**:
- Guarda en: `libreria/reggaeton/.features_cache.json`
- Validación: 7 días (no re-analiza si es reciente)
**Fallback**:
- Si librosa no está disponible, usa scipy para WAV básico
- Features reducidas: RMS, ZCR, Duration básicos
---
### 2. `embedding_engine.py` (625 líneas)
**Ubicación**: `C:\ProgramData\Ableton\Live 12 Suite\Resources\MIDI Remote Scripts\AbletonMCP_AI\mcp_server\engines\`
**Funcionalidad**:
- Clase `EmbeddingEngine` - crea embeddings vectoriales
- Vector de **20 dimensiones** por sample:
1. Duration (normalizado 0-10s)
2. BPM (normalizado 60-200)
3. Key (0-11 normalizado)
4. RMS (normalizado -60 a 0 dB)
5. Spectral Centroid (0-10000 Hz)
6. Spectral Rolloff (0-20000 Hz)
7. Zero Crossing Rate (0-1)
8-20. MFCCs (13 coeficientes, -100 a 100)
21. Onset Strength (0-1)
**Normalización**:
- Min-max scaling por dimensión para embeddings comparables
**Persistencia**:
- Guarda en: `libreria/reggaeton/.embeddings_index.json`
**Métodos públicos**:
- `get_embedding(sample_path)` - Genera embedding de un sample
- `find_similar(sample_path, top_n=10)` - Encuentra samples similares por distancia coseno
- `find_by_audio_reference(audio_path, top_n=20)` - Analiza audio externo y encuentra matches
**Funciones de conveniencia**:
- `cosine_similarity(v1, v2)` - Calcula similitud coseno
- `euclidean_distance(v1, v2)` - Calcula distancia euclidiana
---
### 3. `reference_matcher.py` (922 líneas)
**Ubicación**: `C:\ProgramData\Ableton\Live 12 Suite\Resources\MIDI Remote Scripts\AbletonMCP_AI\mcp_server\engines\`
**Funcionalidad**:
- Clase `ReferenceMatcher` - motor de matching contra referencia
**Clases auxiliares**:
- `AudioAnalyzer` - Analiza archivos MP3/WAV de referencia
- BPM, Key, Energy Curve, MFCCs, Spectral Centroid, Onset Strength
- Fallback a modo simulado si librosa no está disponible
- `SimilarityEngine` - Compara fingerprints
- Pesos de similitud: BPM (25%), Key (15%), Energy (25%), Timbre (20%), Centroid (10%), Onset (5%)
**Métodos públicos**:
- `analyze_reference(path)` - Analiza archivo de referencia
- `index_library()` - Indexa toda la librería
- `find_similar_samples(top_n=50)` - Ranking de similitud
- `generate_user_profile()` - Crea perfil completo del usuario
- `get_user_profile()` - Carga perfil o lo genera si no existe
- `get_recommended_samples(role, count=5)` - Samples recomendados por rol
**Perfil de sonido del usuario** (`.user_sound_profile.json`):
```json
{
"bpm_preferred": 95.0,
"key_preferred": "Am",
"timbre_profile": [0.5, -0.3, 0.1, ...],
"energy_curve": [...],
"roles_distribution": {"kick": 15, "snare": 12, ...},
"top_matches": [...]
}
```
---
## ARCHIVOS MODIFICADOS
### 4. `sample_selector.py` (238 líneas, +62 nuevas)
**Ubicación**: `C:\ProgramData\Ableton\Live 12 Suite\Resources\MIDI Remote Scripts\AbletonMCP_AI\mcp_server\engines\`
**Modificación**: Agregado método `select_by_similarity()`
**Código agregado** (líneas 118-175):
```python
def select_by_similarity(self, reference_path: str, top_n: int = 10) -> InstrumentGroup:
"""Select samples similar to a reference audio file.
Uses embedding_engine to find samples with similar spectral characteristics.
Returns an InstrumentGroup with the most similar samples by role.
"""
```
**Funcionalidad**:
- Integra con `embedding_engine.find_similar()`
- Retorna `InstrumentGroup` con samples por rol (kick, snare, bass, etc.)
- Fallback a `select_for_genre("reggaeton")` si falla
**Integración**: Import dinámico de `embedding_engine` y `libreria_analyzer` para evitar circular imports
---
### 5. `engines/__init__.py` (100 líneas, +50 nuevas)
**Ubicación**: `C:\ProgramData\Ableton\Live 12 Suite\Resources\MIDI Remote Scripts\AbletonMCP_AI\mcp_server\engines\`
**Modificación**: Agregados exports de los 3 nuevos módulos
**Nuevos exports**:
- `LibreriaAnalyzer`, `analyze_sample`, `get_features`, `analyze_library`, `get_library_stats`
- `EmbeddingEngine`, `get_embedding`, `find_similar`, `find_by_audio_reference`
- `ReferenceMatcher`, `AudioAnalyzer`, `SimilarityEngine`, `get_matcher`, `get_user_profile`
---
## ESTRUCTURA DE ARCHIVOS DE SALIDA
Cuando se ejecute el sistema, generará estos archivos en `libreria/reggaeton/`:
| Archivo | Contenido | Tamaño estimado |
|---------|-----------|-----------------|
| `.features_cache.json` | Features de los 509 samples | ~2-5 MB |
| `.embeddings_index.json` | Embeddings vectoriales (20 dims) | ~1-2 MB |
| `.user_sound_profile.json` | Perfil del usuario basado en ejemplo.mp3 | ~50-100 KB |
---
## COMPILACIÓN VERIFICADA
Todos los archivos compilan sin errores:
```powershell
libreria_analyzer.py - Sin errores
embedding_engine.py - Sin errores
reference_matcher.py - Sin errores
sample_selector.py - Sin errores
__init__.py - Sin errores
```
**Comandos usados**:
```powershell
python -m py_compile "C:\ProgramData\Ableton\Live 12 Suite\Resources\MIDI Remote Scripts\AbletonMCP_AI\mcp_server\engines\libreria_analyzer.py"
python -m py_compile "C:\ProgramData\Ableton\Live 12 Suite\Resources\MIDI Remote Scripts\AbletonMCP_AI\mcp_server\engines\embedding_engine.py"
python -m py_compile "C:\ProgramData\Ableton\Live 12 Suite\Resources\MIDI Remote Scripts\AbletonMCP_AI\mcp_server\engines\reference_matcher.py"
python -m py_compile "C:\ProgramData\Ableton\Live 12 Suite\Resources\MIDI Remote Scripts\AbletonMCP_AI\mcp_server\engines\sample_selector.py"
python -m py_compile "C:\ProgramData\Ableton\Live 12 Suite\Resources\MIDI Remote Scripts\AbletonMCP_AI\mcp_server\engines\__init__.py"
```
---
## DEPENDENCIAS
**Requeridas**:
- `numpy` - Cálculos vectoriales y embeddings
- `librosa` - Análisis espectral (BPM, Key, MFCCs, etc.)
**Opcional (fallback)**:
- `scipy` - Para lectura básica de WAV si librosa no está
**Nota**: Si las dependencias no están instaladas, los módulos tienen fallback a modo "simulado" o básico.
---
## FLUJO DE USO ESPERADO
1. **Primera ejecución**:
```python
from engines import get_user_profile
profile = get_user_profile() # Analiza 509 samples + ejemplo.mp3
```
- Tarda varios minutos (análisis de 509 samples)
- Genera `.features_cache.json`, `.embeddings_index.json`, `.user_sound_profile.json`
2. **Selección inteligente**:
```python
from engines import get_selector
selector = get_selector()
group = selector.select_by_similarity("reggaeton_ejemplo.mp3", top_n=10)
```
- Usa embeddings para encontrar samples similares
- Retorna InstrumentGroup con drums, bass, synths, fx
3. **Recomendaciones**:
```python
from engines import get_recommended_samples
kicks = get_recommended_samples("kick", count=5)
```
- Retorna los 5 kicks más similares al estilo del usuario
---
## PRÓXIMOS PASOS SUGERIDOS (Sprint 2)
1. **Integrar con MCP Server**: Agregar herramientas MCP como:
- `analyze_library()` - Fuerza re-análisis de la librería
- `get_similar_samples(reference_path)` - Retorna samples similares
- `refresh_user_profile()` - Regenera perfil del usuario
2. **Mejorar song_generator.py**: Usar el nuevo sistema de selección inteligente en lugar de selección aleatoria
3. **Testing real**: Ejecutar el análisis con los 509 samples reales y verificar que los embeddings generen matches coherentes
4. **Optimización**: Si el análisis es muy lento, agregar procesamiento paralelo (multiprocessing) para samples
---
## NOTAS PARA QWEN
- **NO MODIFICAR** los archivos de cache generados (`.features_cache.json`, etc.) - son de solo lectura
- **NO REANALIZAR** a menos que se solicite explícitamente (usar cache por defecto)
- **VERIFICAR** que las dependencias (librosa, numpy) estén instaladas en el entorno de ejecución
- **PROBAR** con un subset de samples primero si se quiere testear rápido
- **REINICIAR ABLETON** si se modifican los archivos y se quiere usar el MCP
---
**Informe generado por**: Kimi K2 (Writer)
**Para revisión por**: Qwen (Reviewer/Arquitecto)
**Fecha**: 2026-04-11
**Estado**: ✅ Listo para revisión y Sprint 2