72 lines
1.6 KiB
Python
72 lines
1.6 KiB
Python
"""Library for speaker related functions"""
|
|
|
|
from machine import Pin, PWM
|
|
from math import log, pow
|
|
from time import sleep_ms
|
|
|
|
_enabled = True
|
|
_amp_pin = Pin(Pin.GPIO_AMP_SHUTDOWN)
|
|
_speaker_pwm = None
|
|
|
|
def enabled(value=None):
|
|
"""Sets the internal amplifier. This is entirely independent from the PWM"""
|
|
global _enabled
|
|
if value == None:
|
|
return _enabled
|
|
else:
|
|
_enabled = value
|
|
_set_amp()
|
|
|
|
def _set_amp():
|
|
if enabled():
|
|
_amp_pin.on()
|
|
else:
|
|
_amp_pin.off()
|
|
|
|
def speaker_pwm():
|
|
global _speaker_pwm
|
|
if not _speaker_pwm:
|
|
_speaker_pwm = PWM(PWM.PWM_SPEAKER)
|
|
return _speaker_pwm
|
|
|
|
_frequency = None
|
|
def frequency(value = None):
|
|
global _frequency
|
|
if value == None:
|
|
return _frequency
|
|
_frequency = value
|
|
_set_amp()
|
|
speaker_pwm().init(duty=1, freq=_frequency)
|
|
|
|
def stop():
|
|
global _frequency
|
|
# todo: maybe we should deinit the PWM?
|
|
_frequency = None
|
|
_set_amp()
|
|
speaker_pwm().duty(0)
|
|
|
|
# Music
|
|
NOTES = {"C":0, "C#":1, "D":2, "D#":3, "E":4, "F":5, "F#":6, "G":7, "G#":8, "A":9, "A#":10, "B":11}
|
|
|
|
def note_to_frequency(note):
|
|
if (len(note) == 2) and note[1].isdigit():
|
|
octave = int(note[1])
|
|
note = note[0].upper()
|
|
elif len(note) == 3:
|
|
octave = int(note[2])
|
|
note = note[0:2].upper()
|
|
else:
|
|
octave = 4
|
|
note = note.upper()
|
|
|
|
if note not in NOTES:
|
|
raise Exception("%s it not a valid note" % note)
|
|
|
|
halftones = NOTES[note] + 12 * (octave - 4)
|
|
freq = 440 * pow(1.059, halftones)
|
|
return round(freq)
|
|
|
|
def note(note):
|
|
frequency(note_to_frequency(note))
|
|
|