- 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
280 lines
9.9 KiB
Markdown
280 lines
9.9 KiB
Markdown
# 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
|