from machine import Pin, PWM
import time
# Configuración del buzzer
buzzer = PWM(Pin(15))
buzzer.duty_u16(0)
# Función para tocar nota
def play_note(freq, duration):
if freq == 0:
buzzer.duty_u16(0)
else:
buzzer.freq(int(freq))
buzzer.duty_u16(32768) # 50%
time.sleep(duration)
buzzer.duty_u16(0)
time.sleep(0.01)
# Frecuencias de notas básicas (en C mayor / tonalidad de la canción)
NOTES = {
"C4": 261.63,
"D4": 293.66,
"E4": 329.63,
"F4": 349.23,
"G4": 392.00,
"A4": 440.00,
"B3": 246.94,
}
# Melodía basada en la partitura / notas de Pianokeyboardnotes
# (verso + primer estribillo, simplificado)
# Usamos duraciones relativas: en 82 BPM, una negra ≈ 0.73 seg, corchea ≈ 0.36 seg
melody = [
# Verso: "Slip inside the eye of your mind"
("E4", 0.5), ("D4", 0.5), ("D4", 1.0), ("C4", 1.0),
("D4", 0.5), ("C4", 0.5), ("E4", 0.5), ("D4", 1.0),
("C4", 1.5), ("A4", 0.5), # continua frase
# Parte hacia el estribillo
("G4", 1.0), ("E4", 1.0), ("F4", 1.0), ("E4", 1.0),
("D4", 0.5), ("C4", 0.5), ("D4", 0.5), ("C4", 1.5),
# Estribillo: "So Sally can wait, she knows it's too late…"
("C4", 0.5), ("G4", 0.5), ("A4", 0.5), ("E4", 0.5),
("F4", 1.0), ("G4", 1.0),
("C4", 0.5), ("A4", 0.5), ("G4", 1.0),
# "…as we're walking on by"
("E4", 1.0), ("D4", 0.5), ("C4", 0.5),
# "Her soul slides away, but don't look back in anger"
("G4", 0.5), ("A4", 0.5), ("G4", 1.0),
("F4", 0.5), ("E4", 0.5), ("D4", 1.0),
("C4", 1.5), ("G4", 0.5), # final aproximado del estribillo
]
# Ajuste para tempo (BPM)
BPM = 82
beat_duration = 60 / BPM # duración de la negra en segundos
# Convertir las duraciones relativas a tiempo real
melody_time = [(note, dur * beat_duration) for note, dur in melody]
def play_melody(mel):
for note, dur in mel:
freq = NOTES.get(note, 0)
play_note(freq, dur)
try:
play_melody(melody_time)
finally:
buzzer.deinit()