🎉 Sprint 7 COMPLETADO - MIDI instruments funcionando, clear_project agregado, drum loop + harmony test exitoso

AVANCES CLAVE:
 B001 FIX: MIDI instruments cargan correctamente (Wavetable/Operator)
 API fix: app.view.selected_track → self._song.view.selected_track
 clear_project: Nuevo comando para limpiar Session + Arrangement View
 Drum loop + Harmony: 100bpm gata con progresión Am-F-C-G funcionando
 13 scenes production: Sistema completo operativo

Estado: MUY FELIZ, todo funciona perfectamente 🚀
This commit is contained in:
Administrator
2026-04-13 13:56:19 -03:00
parent 8e6d5cec9f
commit 3f3866f32e
26 changed files with 26593 additions and 328 deletions

112
update_scenes.py Normal file
View File

@@ -0,0 +1,112 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""Update SCENES in __init__.py to Fases 56-61"""
import re
file_path = r'C:\ProgramData\Ableton\Live 12 Suite\Resources\MIDI Remote Scripts\AbletonMCP_AI\__init__.py'
with open(file_path, 'r', encoding='utf-8') as f:
content = f.read()
# The old SCENES definition (what we're replacing)
old_scenes_start = '# ================================================================'
old_scenes_marker1 = '# SCENE DEFINITIONS'
old_scenes_marker2 = 'SCENES = ['
# Find the start of SCENES section
start_idx = content.find('# SCENE DEFINITIONS (12 scenes for Fases 16-20)')
if start_idx == -1:
start_idx = content.find('# SCENE DEFINITIONS (Fases 56-61: Scenes 0-5)')
if start_idx != -1:
print('INFO: File already has Fases 56-61')
exit(0)
if start_idx == -1:
print('ERROR: Could not find SCENE DEFINITIONS section')
# Try to find any SCENE DEFINITIONS
idx = content.find('# SCENE DEFINITIONS')
if idx != -1:
print(f'Found SCENE DEFINITIONS at position {idx}')
print('Context:', content[idx:idx+100])
exit(1)
# Find the end of SCENES list (FX_BY_SCENE closing brace)
end_marker = '# FASE 19: NO_REPEAT'
end_idx = content.find(end_marker, start_idx)
if end_idx == -1:
end_idx = content.find('# FASE 20: Energy-based', start_idx)
if end_idx == -1:
print('ERROR: Could not find end of SCENES section')
exit(1)
# Extract the section to replace
old_section = content[start_idx:end_idx]
print(f'Found section from {start_idx} to {end_idx} ({len(old_section)} chars)')
# New SCENES definition
new_section = '''# ================================================================
# SCENE DEFINITIONS (Fases 56-61: Scenes 0-5)
# ================================================================
SCENES = [
# Fase 56: Scene 0 - Intro (NO drums)
("Intro", 4, 0.20, {
"drums": False, "bass": False, "lead": False,
"chords": "intro", "pad": True, "ambience": True, "hat": False,
"riser": False, "impact": False
}),
# Fase 57: Scene 1 - Verse A (sparse drums, intensity 0.6)
("Verse A", 8, 0.50, {
"drums": True, "bass": True, "lead": False,
"chords": "verse_standard", "pad": False, "ambience": False, "hat": True,
"drum_intensity": 0.6, "bass_style": "sub"
}),
# Fase 58: Scene 2 - Verse B (agrega lead melody)
("Verse B", 8, 0.60, {
"drums": True, "bass": True, "lead": True,
"chords": "verse_alt1", "pad": False, "ambience": False, "hat": True,
"drum_intensity": 0.7, "bass_style": "standard"
}),
# Fase 59: Scene 3 - Pre-Chorus (riser y anticipation)
("Pre-Chorus", 4, 0.75, {
"drums": True, "bass": True, "lead": False,
"chords": "prechorus", "pad": True, "ambience": False, "hat": True,
"riser": True, "drum_intensity": 0.8, "anticipation": True
}),
# Fase 60: Scene 4 - Chorus A (impact y maxima energia)
("Chorus A", 8, 0.95, {
"drums": True, "bass": True, "lead": True,
"chords": "chorus_power", "pad": True, "ambience": False, "hat": True,
"impact": True, "drum_intensity": 1.0, "bass_style": "melodic"
}),
# Fase 61: Scene 5 - Chorus B (modulacion +1 semitono)
("Chorus B", 8, 0.90, {
"drums": True, "bass": True, "lead": True,
"chords": "chorus_alternative", "pad": False, "ambience": False, "hat": True,
"drum_intensity": 0.95, "bass_style": "octaves", "modulation": "+1"
}),
]
# Scene indices with drums active (for Perc Loops, etc.)
PERC_LOOP_SCENES = [1, 2, 3, 4, 5] # All except Intro (0)
DRUMLOOP_SCENES = [1, 2, 3, 4, 5] # All except Intro (0)
PROTAGONIST_SCENES = [2, 4] # Main scenes for protagonist drumloop
# FX assignments by scene (extended params)
FX_BY_SCENE = {
3: "riser", # Pre-Chorus: Riser
4: "impact", # Chorus A: Impact
}
'''
# Replace
new_content = content[:start_idx] + new_section + content[end_idx:]
with open(file_path, 'w', encoding='utf-8') as f:
f.write(new_content)
print('SUCCESS: SCENES updated to Fases 56-61')
print('Scenes 0-5 configured: Intro, Verse A, Verse B, Pre-Chorus, Chorus A, Chorus B')