Buzzer

boot.py
from machine import Pin, PWM
from utime import sleep
from time import sleep_ms
from song import Song
from buzzer import Buzzer, BuzzerLib
 
bz = PWM(Pin(23))
 
# Programming the Buzzer 
 
bz.freq(500) # volumne = 500
bz.duty_u16(1000)
sleep(1)
bz.duty_u16(0)
 
# Playing Music with a Buzzer
 
_song = Song(23)
 
_song.play_song_test()
sleep(1)
_song.play_song_mario()
sleep(1)
_song.play_song_jingle()
 
# Other Lib
 
bz = Buzzer(23)
 
print("Playing mario.")
bz.play(BuzzerLib.mario, 150, 32767)
sleep_ms(1000)
 
print("Playing jingle bells.")
bz.play(BuzzerLib.jingle, 250, 32767)
sleep_ms(1000)
 
print("Playing twinkle, twinkle little star.")
bz.play(BuzzerLib.twinkle, 600, 32767)
music.py
class Music:
    def __init__(self):
        pass
 
    def tones():
        return {
            "B0": 31,
            "C1": 33,
            "CS1": 35,
            "D1": 37,
            "DS1": 39,
            "E1": 41,
            "F1": 44,
            "FS1": 46,
            "G1": 49,
            "GS1": 52,
            "A1": 55,
            "AS1": 58,
            "B1": 62,
            "C2": 65,
            "CS2": 69,
            "D2": 73,
            "DS2": 78,
            "E2": 82,
            "F2": 87,
            "FS2": 93,
            "G2": 98,
            "GS2": 104,
            "A2": 110,
            "AS2": 117,
            "B2": 123,
            "C3": 131,
            "CS3": 139,
            "D3": 147,
            "DS3": 156,
            "E3": 165,
            "F3": 175,
            "FS3": 185,
            "G3": 196,
            "GS3": 208,
            "A3": 220,
            "AS3": 233,
            "B3": 247,
            "C4": 262,
            "CS4": 277,
            "D4": 294,
            "DS4": 311,
            "E4": 330,
            "F4": 349,
            "FS4": 370,
            "G4": 392,
            "GS4": 415,
            "A4": 440,
            "AS4": 466,
            "B4": 494,
            "C5": 523,
            "CS5": 554,
            "D5": 587,
            "DS5": 622,
            "E5": 659,
            "F5": 698,
            "FS5": 740,
            "G5": 784,
            "GS5": 831,
            "A5": 880,
            "AS5": 932,
            "B5": 988,
            "C6": 1047,
            "CS6": 1109,
            "D6": 1175,
            "DS6": 1245,
            "E6": 1319,
            "F6": 1397,
            "FS6": 1480,
            "G6": 1568,
            "GS6": 1661,
            "A6": 1760,
            "AS6": 1865,
            "B6": 1976,
            "C7": 2093,
            "CS7": 2217,
            "D7": 2349,
            "DS7": 2489,
            "E7": 2637,
            "F7": 2794,
            "FS7": 2960,
            "G7": 3136,
            "GS7": 3322,
            "A7": 3520,
            "AS7": 3729,
            "B7": 3951,
            "C8": 4186,
            "CS8": 4435,
            "D8": 4699,
            "DS8": 4978
        }
song.py
from machine import Pin, PWM
from time import sleep_ms
from music import Music
 
class Song:
    def __init__(self, sig_pin):
        self.buzzer = PWM(Pin(sig_pin), duty_u16=0)  
        self.tones = Music.tones()
 
    def test():
        # Create a list of notes for your song. Use the letter P to represent pauses in the music
        return ["E5","G5","A5","P","E5","G5","B5","A5","P","E5","G5","A5","P","G5","E5"]
 
    # Function called playtone that will take any frequency and play it at full volume
    def playtone(self, frequency, duty):
        self.buzzer.duty_u16(duty)
        self.buzzer.freq(frequency)
 
    # Function called bequiet that will silence the buzzer by change duty_u16 to 0
    def bequiet(self):
        self.buzzer.duty_u16(0)        
 
    def play_song(self, song, wait=150, duty=32767):
        for i in range(len(song)):
            if (song[i] == "P"):
                self.bequiet()
            else:
                self.playtone(self.tones[song[i]], duty)
            sleep_ms(wait)
 
        self.bequiet()   
 
    def play_song_test(self):        
        song = ["E5","G5","A5","P","E5","G5","B5","A5","P","E5","G5","A5","P","G5","E5"]
 
        self.play_song(song)
 
    def play_song_jingle(self):        
        song = [
            'E7', 'E7', 'E7', "P",
            'E7', 'E7', 'E7', "P",
            'E7', 'G7', 'C7', 'D7', 'E7', "P",
            'F7', 'F7', 'F7', 'F7', 'F7', 'E7', 'E7', 'E7', 'E7', 'D7', 'D7', 'E7', 'D7', "P", 'G7', "P",
            'E7', 'E7', 'E7', "P",
            'E7', 'E7', 'E7', "P",
            'E7', 'G7', 'C7', 'D7', 'E7', "P",
            'F7', 'F7', 'F7', 'F7', 'F7', 'E7', 'E7', 'E7', 'G7', 'G7', 'F7', 'D7', 'C7', "P" 
        ]
 
        self.play_song(song)
 
    def play_song_mario(self):        
        song = [
            'E7', 'E7',  "P", 'E7',  "P", 'C7', 'E7',  "P",
            'G7',  "P",  "P",  "P", 'G6',  "P",  "P",  "P",
            'C7',  "P",  "P", 'G6',  "P",  "P", 'E6',  "P",
            "P", 'A6',  "P", 'B6',  "P", 'AS6', 'A6',  "P",
            'G6', 'E7',  "P", 'G7', 'A7',  "P", 'F7', 'G7',
            "P", 'E7',  "P", 'C7', 'D7', 'B6',  "P",  "P",
            'C7',  "P",  "P", 'G6',  "P",  "P", 'E6',  "P",
            "P", 'A6',  "P", 'B6',  "P", 'AS6', 'A6',  "P",
            'G6', 'E7',  "P", 'G7', 'A7', "P", 'F7', 'G7',
            "P", 'E7',  "P", 'C7', 'D7', 'B6',  "P",  "P",
        ]
 
        self.play_song(song)
buzzer.py
from machine import Pin
from machine import PWM
from time import sleep_ms
 
# Notes and its equivalent frequency
           # Octave 0 ********************
B0  = 31   # B
           # Octave 1 ********************
C1  = 33   # C
CS1 = 35   # C#/Db
D1  = 37   # D
DS1 = 39   # D#/Eb
E1  = 41   # E
F1  = 44   # F
FS1 = 46   # F#/Gb
G1  = 49   # G
GS1 = 52   # G#/Ab
A1  = 55   # A
AS1 = 58   # A#/Bb
B1  = 62   # B
           # Octave 2 ********************
C2  = 65   # C
CS2 = 69   # C#/Db
D2  = 73   # D
DS2 = 78   # D#/Eb
E2  = 82   # E
F2  = 87   # F
FS2 = 93   # F#/Gb
G2  = 98   # G
GS2 = 104  # G#/Ab
A2  = 110  # A
AS2 = 117  # A#/Bb
B2  = 123  # B
           # Octave 3 ********************
C3  = 131  # C
CS3 = 139  # C#/Db
D3  = 147  # D
DS3 = 156  # D#/Eb
E3  = 165  # E
F3  = 175  # F
FS3 = 185  # F#/Gb
G3  = 196  # G
GS3 = 208  # G#/Ab
A3  = 220  # A
AS3 = 233  # A#/Bb
B3  = 247  # B
           # Octave 4 ********************
C4  = 262  # C
CS4 = 277  # C#/Db
D4  = 294  # D
DS4 = 311  # D#/Eb
E4  = 330  # E
F4  = 349  # F
FS4 = 370  # F#/Gb
G4  = 392  # G
GS4 = 415  # G#/Ab
A4  = 440  # A
AS4 = 466  # A#/Bb
B4  = 494  # B
           # Octave 5 ********************
C5  = 523  # C
CS5 = 554  # C#/Db
D5  = 587  # D
DS5 = 622  # D#/Eb
E5  = 659  # E
F5  = 698  # F
FS5 = 740  # F#/Gb
G5  = 784  # G
GS5 = 831  # G#/Ab
A5  = 880  # A
AS5 = 932  # A#/Bb
B5  = 988  # B
           # Octave 6 ********************
C6  = 1047 # C
CS6 = 1109 # C#/Db
D6  = 1175 # D
DS6 = 1245 # D#/Eb
E6  = 1319 # E
F6  = 1397 # F
FS6 = 1480 # F#/Gb
G6  = 1568 # G
GS6 = 1661 # G#/Ab
A6  = 1760 # A
AS6 = 1865 # A#/Bb
B6  = 1976 # B
           # Octave 7 ********************
C7  = 2093 # C
CS7 = 2217 # C#/Db
D7  = 2349 # D
DS7 = 2489 # D#/Eb
E7  = 2637 # E
F7  = 2794 # F
FS7 = 2960 # F#/Gb
G7  = 3136 # G
GS7 = 3322 # G#/Ab
A7  = 3520 # A
AS7 = 3729 # A#/Bb
B7  = 3951 # B
           # Octave 8 ********************
C8  = 4186 # C
CS8 = 4435 # C#/Db
D8  = 4699 # D
DS8 = 4978 # D#/Eb
 
class BuzzerLib: 
 
    # This is the list of notes for mario theme
    # 0 denotes rest notes
    mario = [
         E7, E7,  0, E7,  0, C7, E7,  0,
         G7,  0,  0,  0, G6,  0,  0,  0,
         C7,  0,  0, G6,  0,  0, E6,  0,
          0, A6,  0, B6,  0,AS6, A6,  0,
         G6, E7,  0, G7, A7,  0, F7, G7,
          0, E7,  0, C7, D7, B6,  0,  0,
         C7,  0,  0, G6,  0,  0, E6,  0,
          0, A6,  0, B6,  0,AS6, A6,  0,
         G6, E7,  0, G7, A7,  0, F7, G7,
          0, E7,  0, C7, D7, B6,  0,  0,
    ]
 
    # This is the list of notes for jingle bells
    jingle = [
        E7, E7, E7, 0,
        E7, E7, E7, 0,
        E7, G7, C7, D7, E7, 0,
        F7, F7, F7, F7, F7, E7, E7, E7, E7, D7, D7, E7, D7, 0, G7, 0,
        E7, E7, E7, 0,
        E7, E7, E7, 0,
        E7, G7, C7, D7, E7, 0,
        F7, F7, F7, F7, F7, E7, E7, E7, G7, G7, F7, D7, C7, 0 
    ]
 
    # This is the list of notes for Twinkle, Twinkle Little Star
    twinkle = [
        C6, C6, G6, G6, A6, A6, G6, 0,
        F6, F6, E6, E6, D6, D6, C6, 0,
        G6, G6, F6, F6, E6, E6, D6, 0,
        G6, G6, F6, F6, E6, E6, D6, 0,
        C6, C6, G6, G6, A6, A6, G6, 0,
        F6, F6, E6, E6, D6, D6, C6, 0,
    ]
 
class Buzzer: 
    def __init__(self, sig_pin):
        self.pwm = PWM(Pin(sig_pin),duty_u16=0)      
 
    def play(self, melodies, wait, duty=32767):
        for note in melodies:
            if note != 0:
                self.pwm.freq(note)
            self.pwm.duty_u16(duty)
            sleep_ms(wait)
        # Disable the pulse, setting the duty to 0
        self.pwm.duty_u16(0)
        # Disconnect the pwm driver
        #self.pwm.deinit() # remove to play the next melodies
 
    def tone(self, notes, wait, duty=32767):
        self.pwm.freq(notes)
        self.pwm.duty_u16(duty)
        sleep_ms(wait)
        self.pwm.duty_u16(0)
 
 
"""
bz = Buzzer(23)
 
print("Playing mario.")
bz.play(mario, 150, 32767)
sleep_ms(1000)
 
print("Playing jingle bells.")
bz.play(jingle, 250, 32767)
sleep_ms(1000)
 
print("Playing twinkle, twinkle little star.")
bz.play(twinkle, 600, 32767)
"""