############################
# E015_DAC_BUZZ.PY: Genera melodía usando un DAC y un buzz pasivo
# ENTRADAS: Notas de la canción "Happy Birthday"
# SALIDAS: Sonidos en un buzz pasivo conectado al DAC
############################
import machine
import time
# Configura el pin GPIO25 como DAC y GPIO26 para un LED
dac = machine.DAC(machine.Pin(25))
led1 = machine.Pin(26, machine.Pin.OUT) # LED verde
# Define el diccionario de notas y sus frecuencias
notas = {
'do': 261.63, 're': 293.66, 'mi': 329.63, 'fa': 349.23, 'sol': 392.00, 'la': 440.00, 'si': 493.88,
'do#': 277.18, 're#': 311.13, 'mi#': 369.99, 'fa#': 415.30, 'sol#': 466.16,
'reb': 277.18, 'mib': 311.13, 'fab': 349.23, 'solb': 369.99, 'lab': 415.30, 'sib': 466.16, 'doa': 523.26}
# Genera onda cuadrada con cada nota
def generar_onda_cuadrada(frecuencia, duracion):
# Calcula el periodo en microsegundos
periodo = int(1e6 / frecuencia)
# Calcula el número de ciclos para la duración especificada
num_ciclos = int(duracion * 1e6 / periodo)
# Genera la onda cuadrada durante la duración especificada
for _ in range(num_ciclos): # no necesito nombre, uso _
# Establece la salida del DAC a un valor alto
dac.write(255)
# Espera la mitad del periodo (Duty Cycle=50%)
time.sleep_us(periodo // 2)
# Establece la salida del DAC a un valor bajo
dac.write(0)
# Espera la otra mitad del periodo
time.sleep_us(periodo // 2)
# Melodía "Happy Birthday" con duración de cada nota en segundos
melodia = [
('do', 0.5), ('do', 0.5), ('re', 1), ('do', 1), ('fa', 1), ('mi', 2),
('do', 0.5), ('do', 0.5), ('re', 1), ('do', 1), ('sol', 1), ('fa', 2),
('do', 0.5), ('do', 0.5), ('doa',1), ('la', 1), ('fa', 1), ('mi', 1), ('re', 2),
('sib', 0.5), ('sib', 0.5), ('la', 1), ('fa', 1), ('sol', 1), ('fa', 2)]
# Ajustar la velocidad de reproducción (1.0 es la velocidad original)
velocidad = 2
# Genera la melodía
print ('\n'*50) # Borra la pantalla
print ('Happy Birthday...!!!')
for nota, duracion in melodia: # Recorre las tuplas de la melodía
if nota in notas: # Si la nota es correcta la reproduce
led1.on()
print (nota, end=' ')
generar_onda_cuadrada(notas[nota], duracion / velocidad)
led1.off()
else:
# Si la nota no esta en el diccionario, lo indico
print('La nota no existe')
# Separación entre notas
time.sleep(0.1 / velocidad) # Ajusta este valor según sea necesario