Raspberry Pi Pico
Using A Buzzer

I wanted to recreate the functionality with the buzzer that I had managed with MicroPython. That meant writing a library to play tunes. I delieberately chose not to look for one before trying to do a simple conversion of my MicroPython library. CircuitPython plays tunes in a very similar way. Clearly, you could look to download a better one or make some improvements to what I have done here.

The idea was to have a notation that I could use for describing a tune. I loosely based it on the way that it is done for the micro:bit.

The buzzer has two pins. One of them is connected to GND (directly in this photograph). The other pin is connected to GP16.

Pico Circuit

This is the library that I saved to the libraries folder as music.py

from pwmio import PWMOut 
from time import sleep 

# the duty cycle to use when the note is on 
on = 32768 

# the silence after a note is played 
artic = 0.01 

# dictionary of notes 
notes = { 
"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 
} 
 
# buzzer, frequency, duration 
def tone(buzzer, frequency, duration): 
    buzzer.duty_cycle = on 
    buzzer.frequency = frequency 
    sleep(duration) 
    buzzer.duty_cycle = 0 
 
# buzzer, frequency - until stopped 
def note_on(buzzer, frequency): 
    buzzer.duty_cycle = on 
    buzz.frequency = frequency 
 
# stop the noise 
def note_off(buzzer): 
    buzzer.duty_cycle = 0 
 
def play_tune(buzzer, melody): 
    for itm in melody: 
        n,d = tuple(itm.split(":")) 
        d = float(d) 
        n = notes.get(n,0) 
        if n==0: 
            sleep(d) 
        else: 
            tone(buzzer,n,d) 
        sleep(artic) 

And here is a short program defining a tune to play.

import board 
from time import sleep 
from pwmio import PWMOut 
from music import play_tune 
 
# set up buzzer with variable frequency 
buzzer = PWMOut(board.GP16, variable_frequency = True) 
 
 
tune = [ 
'FS4:0.2','G4:0.2','A4:0.2','B4:0.6','A4:0.2','B4:0.2','E5:0.2', 
'D5:0.2','B4:0.2','A4:0.2','G4:0.2','E4:0.6','G4:0.2','B4:0.2', 
'C5:0.2','D5:0.6','E5:0.2','D5:0.2','B4:0.2','G4:0.2','B4:0.2', 
'A4:0.8','R:0.2','FS4:0.2','G4:0.2','A4:0.2','B4:0.6','A4:0.2', 
'B4:0.2','E5:0.2','D5:0.2','B4:0.2','A4:0.2','G4:0.2','E4:0.6', 
'FS4:0.2','G4:0.2','A4:0.2','B4:0.6','C5:0.2','B4:0.2','A4:0.2', 
'G4:0.2','A4:0.2','G4:0.8','R:0.2','D5:0.2','E5:0.2','FS5:0.2', 
'G5:0.6','FS5:0.2','FS5:0.2','E5:0.2','D5:0.2','E5:0.2','D5:0.2', 
'B4:0.2','G4:0.6','D5:0.2','E5:0.2','FS5:0.2','G5:0.6','FS5:0.2', 
'FS5:0.2','E5:0.2','D5:0.2','B4:0.2','A4:0.8','R:0.2','D5:0.2', 
'D5:0.2','D5:0.2','B5:0.6','A5:0.2','A5:0.2','G5:0.2','E5:0.2', 
'G5:0.2','D5:0.2','B4:0.2','G4:0.6','FS4:0.2','G4:0.2','A4:0.2', 
'B4:0.2','E5:0.2','D5:0.2','B4:0.2','A4:0.2','G4:0.2','E4:0.2', 
'FS4:0.2','G4:0.8','R:0.2'] 
 
play_tune(buzzer, tune)