MÓDULO 1: Variedad de Samples (usa más de la librería) - Fix _find_sample_for_section(): rotación round-robin por sección * Intro: samples 0-2 (suaves) * Verse: samples 3-6 (rotación) * Chorus: samples 7-10 (energía) * Bridge: samples 11-14 (diferentes) * Outro: últimos samples - Nueva función _pick_variety() distribuye 12 samples entre secciones - generate_intelligent_track(): múltiples samples por rol (no 1 solo) - load_samples_for_genre(): hasta 3 bass tracks, 3 FX tracks (eliminados breaks) MÓDULO 2: Humanización Real (suena musical, no robótico) - Fix bug de escala: intensity 0.0-1.0 → timing 0-15ms audible - Perfiles por instrumento: * Kick: timing×5ms (sutil) * Snare: timing×10ms (medio) * HiHat: timing×15ms (expressivo) * Bass: timing×8ms * Melody: timing×12ms - Soporte Arrangement View: procesa arrangement_clips - Humanización de audio clips: gain variation + micro-timing - BPM-aware timing en HumanFeel (lee tempo real del proyecto) MÓDULO 3: Sistema de Coherencia (calidad profesional) - Fix validate_coherence: import roto CoherenceValidator → RealCoherenceValidator - Fix select_coherent_kit: mismo fix de import - Detección de frequency masking: identifica kick+bass colisión en sub-bass - Phase correlation real: calculado desde onsets coincidentes - Unificación _calculate_coherence(): usa RealCoherenceValidator como default Resultado: - Antes: 7-12 samples de 511 (6-12%) - Ahora: 20-40+ samples por producción (rotación automática) - Humanización: audible y por instrumento - Coherencia: detecta problemas kick/bass, phase issues Refs: Módulos 1, 2, 3 del plan de desarrollo
40 lines
1.3 KiB
Python
40 lines
1.3 KiB
Python
#!/usr/bin/env python
|
|
"""Check for unclosed docstrings in server.py"""
|
|
|
|
with open(r'C:\ProgramData\Ableton\Live 12 Suite\Resources\MIDI Remote Scripts\AbletonMCP_AI\mcp_server\server.py', 'r', encoding='utf-8') as f:
|
|
lines = f.readlines()
|
|
|
|
# Check for triple-quote balance
|
|
in_docstring = False
|
|
docstring_char = None
|
|
line_num = 0
|
|
|
|
for i, line in enumerate(lines, 1):
|
|
if not in_docstring:
|
|
if '"""' in line:
|
|
count = line.count('"""')
|
|
if count % 2 == 1:
|
|
in_docstring = True
|
|
docstring_char = '"""'
|
|
line_num = i
|
|
if "'''" in line:
|
|
count = line.count("'''")
|
|
if count % 2 == 1:
|
|
in_docstring = True
|
|
docstring_char = "'''"
|
|
line_num = i
|
|
else:
|
|
if docstring_char in line:
|
|
count = line.count(docstring_char)
|
|
if count % 2 == 1:
|
|
in_docstring = False
|
|
|
|
if in_docstring:
|
|
print(f'ERROR: Unclosed docstring starting at line {line_num}')
|
|
# Show context
|
|
print(f'Line {line_num-2}: {repr(lines[line_num-3])}')
|
|
print(f'Line {line_num-1}: {repr(lines[line_num-2])}')
|
|
print(f'Line {line_num}: {repr(lines[line_num-1])}')
|
|
else:
|
|
print('All docstrings properly closed')
|