# Micro Stems Approach

Ultima revision: 2026-03-30

## Objetivo

Dejar de tratar la referencia como un bloque largo y pasar a leerla como una secuencia de gestos cortos.

La idea es:

1. partir `ejemplo.mp3` en ventanas chicas
2. inferir que rol cumple cada fragmento
3. comparar cada fragmento contra la libreria local
4. extraer familias y tokens dominantes
5. usar ese resumen para sesgar la seleccion global y dejar de mezclar material "correcto" pero sin identidad

## Lo que ya quedo implementado

Archivo principal:

- `C:\ProgramData\Ableton\Live 12 Suite\Resources\MIDI Remote Scripts\AbletonMCP_AI\AbletonMCP_AI\MCP_Server\reference_listener.py`

Cambios reales:

- existe `_build_micro_stem_plan(...)`
- existe `_apply_micro_stem_bias(...)`
- `build_arrangement_plan(...)` ahora agrega:
  - `micro_stems`
  - `micro_stem_summary`
- el rerank global de `matches` ahora puede recibir sesgo desde micro-fragmentos antes de elegir palette y layers

## Como funciona hoy

### Segmentacion

- usa el banco de segmentos ya existente de `reference_listener.py`
- trabaja con ventanas de hasta `4.0s`
- calcula importancia por:
  - energia
  - densidad de onsets
  - balance armonico/percusivo
  - tamaño de ventana

### Inferencia de roles

Cada micro-fragmento intenta inferir roles como:

- `kick`
- `snare`
- `hat`
- `bass_loop`
- `perc_loop`
- `top_loop`
- `synth_loop`
- `vocal_loop`
- `vocal_shot`
- `fill_fx`
- `snare_roll`
- `atmos_fx`

La inferencia se apoya en:

- `harmonic_ratio`
- `percussive_ratio`
- `spectral_centroid`
- `rms_mean`
- `onset_mean`
- `section kind`

### Matching

Para cada fragmento:

- toma candidatos top por rol desde `match_assets(...)`
- compara vector del fragmento contra bancos de segmentos de cada candidato
- combina:
  - similitud de segmento
  - tempo
  - key

### Resumen que produce

`micro_stem_summary` expone:

- `dominant_families`
- `dominant_tokens`
- `role_focus`
- cantidad de segmentos considerados y elegidos

## Lo que SI hace

- detecta familias repetidas reales dentro de la libreria
- encuentra mejor DNA ritmico que el scoring global promedio
- evita parte del ruido de "un sample bueno pero fuera de mundo"
- ayuda a que `reference_listener` prefiera material mas coherente con la referencia

## Lo que TODAVIA NO hace

- no reconstruye frase por frase en Arrangement
- no materializa literalmente micro-fragmentos de la referencia
- no usa aun `MIDI` ni presets `.fst` como parte del matching
- no decide instrumentos armonicos reales cuando esos activos existen solo en MIDI/presets

## Limitacion critica actual

La libreria del usuario tiene bastante material armonico importante en:

- `sounds presets`
- `MIDI PACK`
- subcarpetas `MIDI` dentro de sample packs

El matching micro actual es audio-first.

Eso significa:

- si el piano del estilo esta representado solo como `MIDI` o preset y no como loop de audio
- el sistema no lo va a seleccionar como `synth_loop`
- por eso el usuario sigue sintiendo que faltan pianos/keys aunque el analisis audio ya haya mejorado

## Bugs reales corregidos mientras se hacia esto

- `detect_reference_sections()` ya no rompe al convertir `librosa.feature.tempo(...)` a float
- `synth_loop` ya no acepta archivos vocales disfrazados
- `sample_selector.record_section_selection()` ya acepta dicts y no solo objetos con `.name`
- `_extract_pack()` ya no trata carpetas genericas como `20 One Shots` como si fueran un pack dominante

## Evidencia runtime local

- `C:\ProgramData\Ableton\Live 12 Suite\Resources\MIDI Remote Scripts\temp\ejemplo_micro_stems_report.json`
- `C:\ProgramData\Ableton\Live 12 Suite\Resources\MIDI Remote Scripts\temp\ejemplo_arrangement_plan_validation.json`

## Siguiente paso correcto

No es "sumar mas audio loops".

Es esto:

1. indexar `MIDI` y presets del mismo universo familiar
2. mapear familias de audio a siblings armonicos (`Piano`, `Keys`, `Rhode`, `Guitar`, `Pad`, `Pluck`)
3. materializar el remake desde una `phrase plan`, no solo desde loops globales
