# Sistema de Gestión de Samples - AbletonMCP-AI Sistema completo de indexación, clasificación y selección inteligente de samples musicales. ## Componentes ### 1. `audio_analyzer.py` - Análisis de Audio Detecta automáticamente características de archivos de audio: - **BPM**: Detección de tempo mediante análisis de onset - **Key**: Detección de tonalidad mediante cromagrama - **Tipo**: Clasificación en kick, snare, bass, synth, etc. - **Características espectrales**: Centroide, rolloff, RMS **Uso básico:** ```python from audio_analyzer import analyze_sample result = analyze_sample("path/to/sample.wav") print(f"BPM: {result['bpm']}, Key: {result['key']}") print(f"Tipo: {result['sample_type']}") ``` **Backends:** - `librosa`: Análisis completo (requiere instalación) - `basic`: Análisis por nombre de archivo (sin dependencias) ### 2. `sample_manager.py` - Gestión de Librería Gestor completo de la librería de samples: - Indexación recursiva de directorios - Clasificación automática por categorías - Metadatos extensibles (tags, rating, géneros) - Búsqueda avanzada con múltiples filtros - Persistencia en JSON **Categorías principales:** - `drums`: kick, snare, clap, hat, perc, shaker, tom, cymbal - `bass`: sub, bassline, acid - `synths`: lead, pad, pluck, chord, fx - `vocals`: vocal, speech, chant - `loops`: drum_loop, bass_loop, synth_loop, full_loop - `one_shots`: hit, noise **Uso básico:** ```python from sample_manager import SampleManager # Inicializar manager = SampleManager(r"C:\Users\ren\embeddings\all_tracks") # Escanear stats = manager.scan_directory(analyze_audio=True) # Buscar kicks = manager.search(sample_type="kick", key="Am", bpm=128) house_samples = manager.search(genres=["house"], limit=10) # Obtener pack completo pack = manager.get_pack_for_genre("techno", key="F#m", bpm=130) ``` ### 3. `sample_selector.py` - Selección Inteligente Selección contextual basada en género, key y BPM: - Perfiles de género predefinidos - Matching armónico entre samples - Generación de kits de batería coherentes - Mapeo MIDI automático **Géneros soportados:** - Techno (industrial, minimal, acid) - House (deep, classic, progressive) - Tech-House - Trance (progressive, psy) - Drum & Bass (liquid, neuro) - Ambient **Uso básico:** ```python from sample_selector import SampleSelector selector = SampleSelector() # Seleccionar para un género group = selector.select_for_genre("techno", key="F#m", bpm=130) # Acceder a elementos group.drums.kick # Sample de kick group.bass # Lista de bass samples group.synths # Lista de synths # Mapeo MIDI mapping = selector.get_midi_mapping_for_kit(group.drums) # Cambio de key armónico new_key = selector.suggest_key_change("Am", "fifth_up") # Em ``` ## Integración con MCP Server El servidor MCP expone las siguientes herramientas: ### Gestión de Librería - `scan_sample_library` - Escanear directorio de samples - `get_sample_library_stats` - Estadísticas de la librería ### Búsqueda y Selección - `advanced_search_samples` - Búsqueda con filtros múltiples - `select_samples_for_genre` - Selección automática por género - `get_drum_kit_mapping` - Kit de batería con mapeo MIDI - `get_sample_pack_for_project` - Pack completo para proyecto ### Análisis y Compatibilidad - `analyze_audio_file` - Analizar archivo de audio - `find_compatible_samples` - Encontrar samples compatibles - `suggest_key_change` - Sugerir cambios de tonalidad ## Estructura de Datos ### Sample ```python @dataclass class Sample: id: str # ID único name: str # Nombre del archivo path: str # Ruta completa category: str # Categoría principal subcategory: str # Subcategoría sample_type: str # Tipo específico key: Optional[str] # Tonalidad (Am, F#m, C) bpm: Optional[float] # BPM duration: float # Duración en segundos genres: List[str] # Géneros asociados tags: List[str] # Tags rating: int # Rating 0-5 ``` ### DrumKit ```python @dataclass class DrumKit: name: str kick: Optional[Sample] snare: Optional[Sample] clap: Optional[Sample] hat_closed: Optional[Sample] hat_open: Optional[Sample] perc1: Optional[Sample] perc2: Optional[Sample] ``` ## Mapeo MIDI Notas estándar para drums: - `36` (C1): Kick - `38` (D1): Snare - `39` (D#1): Clap - `42` (F#1): Closed Hat - `46` (A#1): Open Hat - `41` (F1): Tom Low - `49` (C#2): Crash ## Ejemplos de Uso ### Crear un track completo ```python # Seleccionar samples para techno selector = get_selector() group = selector.select_for_genre("techno", key="F#m", bpm=130) # Usar con Ableton ableton = get_ableton_connection() # Crear tracks y cargar samples for i, sample in enumerate([group.drums.kick, group.drums.snare]): if sample: print(f"Cargar {sample.name} en track {i}") ``` ### Buscar samples compatibles ```python # Encontrar samples que combinen con un kick kick = manager.get_by_path("path/to/kick.wav") compatible = selector.find_compatible_samples(kick, max_results=5) for sample, score in compatible: print(f"{sample.name}: {score:.1%} compatible") ``` ## Archivos Generados - `.sample_cache/sample_library.json` - Índice de la librería - `.sample_cache/library_stats.json` - Estadísticas ## Dependencias Opcionales Para análisis de audio completo: ```bash pip install librosa soundfile numpy ``` Sin estas dependencias, el sistema funciona en modo "basic" usando metadatos de los nombres de archivo.