- 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
6.3 KiB
SPRINT 1 - Análisis Espectral de Librería + Embeddings
Date: 2026-04-11 Assigned: Kimi K2 Reviewed by: Qwen (después de completar) Priority: CRÍTICA - Base para generación inteligente
OBJETIVO
Analizar TODOS los samples de libreria/reggaeton/ (509 samples) con técnicas de análisis de audio avanzado para poder:
- Encontrar samples similares entre sí
- Comparar contra
reggaeton_ejemplo.mp3como referencia - Generar canciones que suenen similar a la biblioteca del usuario
ARCHIVOS A CREAR
1. libreria_analyzer.py
Ubicación: C:\ProgramData\Ableton\Live 12 Suite\Resources\MIDI Remote Scripts\AbletonMCP_AI\mcp_server\engines\libreria_analyzer.py
Funcionalidad:
- Escanea recursivamente
libreria/reggaeton/buscando TODOS los .wav, .mp3, .aif, .flac - Para CADA sample extraer:
- BPM (tempo detection via onset detection)
- Key (key detection via chromagram)
- RMS (nivel de energía/promedio)
- Spectral Centroid (brillo del sample)
- Spectral Rolloff (frecuencia de corte)
- Zero Crossing Rate (percutivo vs sostenido)
- MFCCs (13 coeficientes - timbre/fingerprint)
- Onset Strength (qué tan rítmico/percutivo es)
- Duration (duración en segundos)
- Sample Rate
- Channels (mono/stereo)
- Guardar todo en cache:
libreria/reggaeton/.features_cache.json - Formato del JSON:
{
"version": "1.0",
"total_samples": 509,
"scan_date": "2026-04-11T...",
"samples": {
"C:/.../libreria/reggaeton/kick/kick_808.wav": {
"name": "kick_808.wav",
"pack": "kick",
"bpm": 0,
"key": "",
"rms": -12.5,
"spectral_centroid": 2500.0,
"spectral_rolloff": 8000.0,
"zero_crossing_rate": 0.15,
"mfccs": [0.5, -0.3, 0.1, ...],
"onset_strength": 0.85,
"duration": 0.5,
"sample_rate": 44100,
"channels": 1,
"role": "kick"
}
}
}
2. embedding_engine.py
Ubicación: C:\ProgramData\Ableton\Live 12 Suite\Resources\MIDI Remote Scripts\AbletonMCP_AI\mcp_server\engines\embedding_engine.py
Funcionalidad:
- Crear embedding vectorial para cada sample (numpy array de ~20 dimensiones)
- El embedding combina: BPM, Key, RMS, Spectral Centroid, Spectral Rolloff, ZCR, MFCCs(13), Onset Strength, Duration
- Normalizar todos los embeddings (min-max scaling) para que sean comparables
- Guardar en:
libreria/reggaeton/.embeddings_index.json(como arrays serializados) - Función
find_similar(sample_path, top_n=10)→ retorna samples más similares por distancia coseno o euclidiana - Función
find_by_audio_reference(audio_file_path, top_n=20)→ analiza un archivo de audio completo y encuentra los samples más similares
3. reference_matcher.py
Ubicación: C:\ProgramData\Ableton\Live 12 Suite\Resources\MIDI Remote Scripts\AbletonMCP_AI\mcp_server\engines\reference_matcher.py
Funcionalidad:
- Analizar
libreria/reggaeton_ejemplo.mp3como track de referencia - Extraer su fingerprint espectral completo (BPM, Key, energy curve, timbre promedio)
- Comparar TODA la librería contra esta referencia
- Generar ranking: qué samples son más similares al estilo del usuario
- Crear "perfil de sonido" del usuario:
- BPM preferido
- Key preferida
- Timbre promedio (MFCCs medios)
- Energy curve
- Roles de samples más usados (kick, snare, etc.)
- Guardar en:
libreria/reggaeton/.user_sound_profile.json
DETALLES DE IMPLEMENTACIÓN
Librerías a usar
import numpy as np
import librosa # Análisis espectral principal
import librosa.feature # MFCCs, spectral centroid, etc.
import json
import os
from pathlib import Path
Si librosa NO está disponible, usar fallback con:
scipy.io.wavfilepara leer WAVs- Estimación de BPM por onset detection simple
- Sin MFCCs (usar spectral centroid básico)
Estructura de la librería
libreria/reggaeton/
├── reggaeton_ejemplo.mp3 ← Referencia PRINCIPAL
├── kick/
├── snare/
├── bass/
├── fx/
├── drumloops/
├── hi-hat (para percs normalmente)/
├── oneshots/
├── perc loop/
├── reggaeton 3/
├── SentimientoLatino2025/
├── sounds presets/
├── (extra)/
└── flp/
Detección de rol por carpeta
El rol de cada sample se infiere de la carpeta donde está:
kick/→ "kick"snare/→ "snare"bass/→ "bass"fx/→ "fx"drumloops/→ "drum_loop"hi-hat*/→ "hat_closed"oneshots/→ "oneshot"perc loop/→ "perc_loop"reggaeton 3/→ "synth" (default)SentimientoLatino2025/→ "multi" (pack completo)
ARCHIVOS A MODIFICAR
sample_selector.py
Agregar método select_by_similarity(reference_path, top_n=10) que:
- Usa
embedding_engine.find_similar()para encontrar samples similares - Retorna un InstrumentGroup con los samples más parecidos a la referencia
ARCHIVOS DE SALIDA GENERADOS
| Archivo | Contenido |
|---|---|
libreria/reggaeton/.features_cache.json |
Features de los 509 samples |
libreria/reggaeton/.embeddings_index.json |
Embeddings vectoriales normalizados |
libreria/reggaeton/.user_sound_profile.json |
Perfil de sonido del usuario |
RESTRICCIONES
- NO MODIFICAR ningún sample .wav/.mp3 - solo lectura
- NO ELIMINAR nada de
libreria/ - El análisis puede tardar varios minutos (509 samples) - mostrar progreso
- Usar caché: si
.features_cache.jsonexiste y es reciente, no re-analizar - Todos los paths en los JSON deben ser absolutos (Windows)
- Compilar cada archivo después de crear:
python -m py_compile "<path>"
VERIFICACIÓN (Qwen hará esto después)
# Compilar
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"
# Test rápido
python -c "from engines.libreria_analyzer import LibreriaAnalyzer; a = LibreriaAnalyzer(); print(f'Scanned {len(a.features)} samples')"
Cuando termines, avisale a Qwen para que revise, compile y cree el Sprint 2.