from machine import Pin, PWM
import utime

# Configuración del buzzer en el pin GP18
buzzer = PWM(Pin(18))

# Frecuencias de las notas musicales en Hz
NOTES = {
    "C4": 262,  # Do
    "D4": 294,  # Re
    "E4": 330,  # Mi
    "F4": 349,  # Fa
    "G4": 392,  # Sol
    "A4": 440,  # La
    "B4": 494,  # Si
    "C5": 523,  # Do (octava superior)
    "D5": 587,  # Re (octava superior)
    "E5": 659,  # Mi (octava superior)
    "F5": 698,  # Fa (octava superior)
    "G5": 784   # Sol (octava superior)
}

# Canciones - Coros principales y partes más representativas
songs = {
    "Sabes Una Cosa": [
        ("E4", 0.4), ("G4", 0.4), ("A4", 0.4), ("G4", 0.4),
        ("F4", 0.4), ("E4", 0.4), ("D4", 0.4), ("E4", 0.4),
    ],
    "Mario Bros": [
        ("E5", 0.2), ("E5", 0.2), ("pause", 0.2), ("E5", 0.2),
        ("pause", 0.2), ("C5", 0.2), ("E5", 0.2), ("G5", 0.4),
    ],
    "Himno a la Alegría": [
        ("E4", 0.4), ("E4", 0.4), ("F4", 0.4), ("G4", 0.4),
        ("G4", 0.4), ("F4", 0.4), ("E4", 0.4), ("D4", 0.4),
        ("C4", 0.4), ("C4", 0.4), ("D4", 0.4), ("E4", 0.4),
    ]
}

# Función para ajustar la duración total de una canción
def adjust_song_duration(song, target_duration):
    total_duration = sum(duration for _, duration in song)
    factor = target_duration / total_duration
    return [(note, duration * factor) for note, duration in song]

# Función para reproducir una nota
def play_note(note, duration):
    if note == "pause":  # Silencio
        buzzer.duty_u16(0)
    else:
        frequency = NOTES[note]
        buzzer.freq(frequency)
        buzzer.duty_u16(32768)  # 50% de ciclo de trabajo (volumen)
    utime.sleep(duration)
    buzzer.duty_u16(0)  # Apagar buzzer entre notas
    utime.sleep(0.05)  # Pausa entre notas

# Orden específico para las canciones
song_order = [
    "Sabes Una Cosa",
    "Mario Bros",
    "Himno a la Alegría"
]

# Reproducir las canciones en el orden especificado
for song_name in song_order:
    print(f"Reproduciendo: {song_name}")
    adjusted_song = adjust_song_duration(songs[song_name], 10)  # Ajuste de duración más corto
    for note, duration in adjusted_song:
        play_note(note, duration)
    utime.sleep(1)  # Pausa entre canciones

print("¡Todas las canciones han terminado!")