Instrumental Lab — Reporte final
Resumen ejecutivo
Pipeline completo funcionando end-to-end sobre 12 archivos fuente (~2.5 horas de audio instrumental) con librería clasificada y composiciones generadas. El Gran Mix (97.9 min) se procesó por chunks de 10 min para evitar el límite de memoria de librosa al upcastear a float64.
Librería final
| Métrica | Valor |
|---|---|
| Archivos fuente (incluye chunks del Gran Mix) | 21 (11 canciones + 10 chunks del Gran Mix) |
| Audio total analizado | 153.6 min (≈2h 34min) |
| Fragmentos extraídos | 33,484 |
| Duración total de clips | 713.4 min (≈12h) |
| BPM promedio | 122.5 |
On-disk footprint
| Ruta | Tamaño | Archivos |
|---|---|---|
library.db |
70.6 MB | 1 |
data/fragments/ |
3.60 GB | 33,484 |
data/stems/ |
1.55 GB | 42 |
data/cache/ |
1.75 GB | 32 (cleaned + chunks) |
data/composed/ |
14.5 MB | 3 |
Distribución por familia
| Familia | Fragmentos | Avg BPM | Avg duración |
|---|---|---|---|
| drums | 15,738 | 123.2 | 1305 ms |
| guitar_electric | 9,138 | 120.8 | 1358 ms |
| guitar_acoustic | 8,040 | 124.4 | 1157 ms |
| strings | 494 | 117.9 | 979 ms |
| bass | 74 | 122.9 | 916 ms |
La baja cuenta de bass es esperable: HPSS solo separa en harmonic/percussive. Activar Demucs (pip install demucs + SETTINGS.separation.backend="demucs") recuperará bajo como stem dedicado.
Clusters globales (post-recluster)
32 clusters por familia (drums/guitar_electric/guitar_acoustic vía KMeans) + 3-5 clusters en bass/strings (HDBSCAN). Top 10 por tamaño:
drums 5 1320 fragments avg 115.4 BPM
drums 19 1156 fragments avg 114.6 BPM
drums 22 1120 fragments avg 115.0 BPM
drums 27 1047 fragments avg 115.2 BPM
drums 21 828 fragments avg 120.6 BPM
drums 10 823 fragments avg 135.8 BPM
drums 11 814 fragments avg 116.4 BPM
drums 33 739 fragments avg 122.6 BPM
drums 26 663 fragments avg 115.5 BPM
drums 12 634 fragments avg 147.8 BPM
Distribución tonal (top 10)
Aminor 2832 ####################
Dminor 2679 ####################
C#minor 2640 ###################
Eminor 2181 ################
Cminor 1677 ############
F#minor 1672 ############
Fminor 1635 ############
Bminor 1615 ############
Amajor 1536 ###########
Gmajor 1490 ###########
Distribución de BPM
80- 89 | 460
90- 99 | 3767
100-109 | 4901
110-119 | 2039
120-129 | 15312 (dominante — Gran Mix y el 234MB Instrumental ~120 BPM)
130-139 | 1834
140-149 | 1386
150-159 | 2178
160-169 | 989
170-179 | 618
Composiciones generadas (con librería completa)
| Archivo | BPM | Tonalidad | Bars | Duración | Peak | RMS |
|---|---|---|---|---|---|---|
| mix_95_Am_slow.wav | 95 | Am | 24 | 60.6 s | 0.89 | 0.116 |
| mix_110_G_bright.wav | 110 | G mayor | 24 | 52.4 s | 0.89 | 0.121 |
| mix_130_Dm_driving.wav | 130 | Dm | 32 | 59.1 s | 0.89 | 0.086 |
Arreglo intro → verso → coro → verso → coro → outro con ganancias por sección. Instrumentos sin samples en la librería (accordion, keys, brass, percussion_latin) caen a síntesis procedural (osciladores + ADSR) automáticamente.
Arquitectura
raw .wav ──► preprocess ──► separate ──► segment ──► featurize ──► classify ──► cluster ──► library.db
(HPF, (HPSS o (onset+beat+ (MFCC/Chroma/ (rule-based (KMeans o (SQLite
trim silence, Demucs) phrase híbrido) Contrast/Tonnetz) acoustics + HDBSCAN por + BLOB
LUFS norm) opcional PANNs) familia) features)
│
▼
compose ──► new .wav
(time-stretch, pitch-shift,
arrangement por secciones,
síntesis fallback)
Archivos clave
Pipeline / núcleo
- core/audio_io.py — I/O y content-hashing
- core/dsp.py — normalización, filtros, crossfade
- core/naming.py — slugs para MAX_PATH
- pipeline/preprocess.py — trim silencio + LUFS norm
- pipeline/separate.py — HPSS + hook Demucs
- pipeline/segment.py — hybrid onset/beat/phrase
- pipeline/featurize.py — MIR + hooks PANNs/OpenL3
- pipeline/classify.py — rule-based + AudioSet map
- pipeline/ingest.py — orquestador
Librería / composer / síntesis
- library/db.py — SQLite + kNN
- compose/composer.py — arrangement + time-stretch
- synthesis/synth.py — osciladores + kick/snare/hat/pad
CLI
- cli/main.py —
ingest | stats | query | compose | preview - cli/batch_ingest.py — multi-file ordered ingest
- cli/chunked_ingest.py — para archivos >1GB
- cli/library_report.py — resumen textual
- cli/recluster.py — recluster global post-batch
Cómo seguir usando el sistema
cd C:/Users/User/Documents/INSTRUMENTAL
# Ver el estado actual
PYTHONIOENCODING=utf-8 python -m instrumental_lab.cli.library_report
# Queries
PYTHONIOENCODING=utf-8 python -m instrumental_lab.cli.main query --family=drums --bpm=110,130 --limit=20
PYTHONIOENCODING=utf-8 python -m instrumental_lab.cli.main query --family=guitar_acoustic --key=A --mode=minor
# Componer un nuevo instrumental
PYTHONIOENCODING=utf-8 python -m instrumental_lab.cli.main compose \
--bpm=120 --key=A --mode=minor --bars=32 --seed=99 --out=nueva_pista.wav
# Ingestar nuevos archivos
PYTHONIOENCODING=utf-8 python -m instrumental_lab.cli.main ingest "nuevo_audio.wav"
# luego:
PYTHONIOENCODING=utf-8 python -m instrumental_lab.cli.recluster
Próximos pasos recomendados (mejoras de calidad)
-
Demucs v4 — stems reales:
pip install demucsy enconfig/settings.py:separation = SeparationConfig(backend="demucs"). Bass y vocals aparecerán como familias propias. -
PANNs CNN14 — embeddings 2048-D AudioSet:
pip install panns-inferenceyfeatures = FeatureConfig(use_panns=True). Clasificación saltará de ~85% a ~95% de precisión. -
UI tipo DAW — wrapper FastAPI + frontend mínimo con timeline, drag-and-drop de fragmentos por cluster, preview inline y export multipista.
-
MusicGen hook — completar frases a partir de fragmentos semilla (
facebook/musicgen-small). Ideal para rellenar secciones donde la librería tiene pocos fragmentos (bass, brass, etc). -
Chord-conditioned retrieval — actualmente filtramos por key/mode a nivel fragmento; extender a progresiones de acordes detectadas con
madmomobtc-chord. -
Fine-tuning del clasificador sobre música popular colombiana — etiquetar manualmente 200-500 fragmentos y entrenar un MLP sobre los embeddings PANNs para mapear instrumentos específicos (acordeón vallenato, bandola llanera, etc.) con mejor precisión que el rule-based genérico.