import machine
import utime
from machine import Pin
from time import sleep

# Pines
buzzer = Pin(18, Pin.OUT)

# Configuración PWM
buzzer_pwm = machine.PWM(buzzer)

# Notas de la escala en frecuencias (Hz)
NOTAS = {
    'C4': 262, 'D4': 294, 'E4': 330, 'F4': 349, 'G4': 392, 'A4': 440,
    'C5': 523, 'D5': 587, 'E5': 659, 'F5': 698, 'G5': 784, 'A5': 880,
}

# Duraciones de las notas
NEGRA = 500
CORCHEA = 250
BLANCA = 1000

# Melodía de Jingle Bells (fragmento famoso)
melodia_jingle_bells = [    
    ('E4', NEGRA), ('E4', NEGRA), ('E4', BLANCA), # Jingle
    ('E4', NEGRA), ('E4', NEGRA), ('E4', BLANCA), # Bells
    ('E4', NEGRA), ('G4', NEGRA), ('C4', NEGRA), ('D4', NEGRA), ('E4', BLANCA), 
    ('F4', NEGRA), ('F4', NEGRA), ('F4', NEGRA), ('F4', NEGRA), ('F4', NEGRA), 
    ('E4', NEGRA), ('E4', NEGRA), ('E4', NEGRA), ('D4', NEGRA), ('D4', NEGRA),
    ('E4', NEGRA), ('E4', NEGRA), ('E4', BLANCA), # Jingle
    ('E4', NEGRA), ('E4', NEGRA), ('E4', BLANCA), # Bells
    ('E4', NEGRA), ('G4', NEGRA), ('C4', NEGRA), ('D4', NEGRA), ('E4', BLANCA), 
    ('F4', NEGRA), ('F4', NEGRA), ('F4', NEGRA), ('F4', NEGRA), ('F4', NEGRA), 
    ('E4', NEGRA), ('E4', NEGRA), ('E4', NEGRA), ('D4', NEGRA), ('D4', NEGRA),
]

# Melodía de Ode to Joy
melodia_ode_to_joy = [
    ('E4', NEGRA), ('E4', NEGRA), ('F4', NEGRA), ('G4', NEGRA), 
    ('G4', NEGRA), ('F4', NEGRA), ('E4', NEGRA), ('D4', NEGRA), 
    ('D4', NEGRA), ('E4', NEGRA), ('E4', NEGRA), ('F4', NEGRA), 
    ('G4', NEGRA), ('G4', NEGRA), ('F4', NEGRA), ('E4', NEGRA),
    ('E4', NEGRA), ('E4', NEGRA), ('F4', NEGRA), ('G4', NEGRA), 
    ('G4', NEGRA), ('F4', NEGRA), ('E4', NEGRA), ('D4', NEGRA), 
    ('D4', NEGRA), ('E4', NEGRA), ('E4', NEGRA), ('F4', NEGRA), 
    ('G4', NEGRA), ('G4', NEGRA), ('F4', NEGRA), ('E4', NEGRA)
]

# Melodía de Twinkle Twinkle Little Star
melodia_twinkle_twinkle = [
    ('C4', NEGRA), ('C4', NEGRA), ('G4', NEGRA), ('G4', NEGRA),
    ('A4', NEGRA), ('A4', NEGRA), ('G4', BLANCA),
    ('F4', NEGRA), ('F4', NEGRA), ('E4', NEGRA), ('E4', NEGRA),
    ('D4', NEGRA), ('D4', NEGRA), ('C4', BLANCA),
    ('G4', NEGRA), ('G4', NEGRA), ('F4', NEGRA), ('F4', NEGRA),
    ('E4', NEGRA), ('E4', NEGRA), ('D4', BLANCA),
    ('G4', NEGRA), ('G4', NEGRA), ('F4', NEGRA), ('F4', NEGRA),
    ('E4', NEGRA), ('E4', NEGRA), ('D4', BLANCA)
]

# Configuración del teclado matricial (4x4)
from machine import Pin

# Mapeo de las teclas del teclado matricial
keys = [
    ['1', '2', '3', 'A'],
    ['4', '5', '6', 'B'],
    ['7', '8', '9', 'C'],
    ['*', '0', '#', 'D']
]

# Pines para el teclado matricial
row_pins = [Pin(i, Pin.OUT) for i in range(10, 14)]  # Pines para las filas
col_pins = [Pin(i, Pin.IN, Pin.PULL_UP) for i in range(14, 18)]  # Pines para las columnas

def leer_tecla():
    for i, row in enumerate(row_pins):
        row.value(0)  # Activa la fila
        for j, col in enumerate(col_pins):
            if col.value() == 0:  # Si la tecla está presionada
                utime.sleep_ms(200)  # Espera un poco para evitar rebotes
                return keys[i][j]
        row.value(1)  # Desactiva la fila
    return None

# Función para tocar una nota
def tocar_nota(frecuencia, duracion):
    if frecuencia == 0:  # Pausa (silencio)
        utime.sleep_ms(duracion)
    else:
        buzzer_pwm.freq(frecuencia)
        buzzer_pwm.duty_u16(32768)  # 50% duty cycle
        utime.sleep_ms(duracion)
        buzzer_pwm.duty_u16(0)  # 50% duty cycle
        utime.sleep_ms(30)  # Pausa entre notas

# Función para reproducir una melodía completa
def reproducir_melodia(melodia):
    for nota, duracion in melodia:
        # Verifica si se presiona la tecla '*' para interrumpir
        tecla = leer_tecla()
        if tecla == 'D':  # Si la tecla '*' es presionada, se interrumpe la melodía
            print("Reproducción interrumpida.")
            break
        tocar_nota(NOTAS[nota], duracion)

# Reproduce la melodía cuando la tecla '1', '2' o '3' es presionada
print("Presiona la tecla '1' para reproducir Jingle Bells...")
print("Presiona la tecla '2' para reproducir Ode to Joy...")
print("Presiona la tecla '3' para reproducir Twinkle Twinkle Little Star...")

while True:
    tecla = leer_tecla()
    if tecla == '1':  # Cuando se presiona la tecla '1'
        print("Reproduciendo Jingle Bells...")
        reproducir_melodia(melodia_jingle_bells)
    elif tecla == '2':  # Cuando se presiona la tecla '2'
        print("Reproduciendo Ode to Joy...")
        reproducir_melodia(melodia_ode_to_joy)
    elif tecla == '3':  # Cuando se presiona la tecla '3'
        print("Reproduciendo Twinkle Twinkle Little Star...")
        reproducir_melodia(melodia_twinkle_twinkle)
    elif tecla:
        print(f"Tecla presionada: {tecla}")
    sleep(0.1)  # Espera pequeña para no saturar el procesador

# Apaga el buzzer al finalizar
buzzer_pwm.deinit()

print("Canción terminada")

$abcdeabcde151015202530fghijfghij
BOOTSELLED1239USBRaspberryPiPico©2020RP2-8020/21P64M15.00TTT