This module allows you play sounds from a speaker attached to the Microbit. In order to use the audio module you will need to provide a sound source.
A sound source is an iterable (sequence, like list or tuple, or a generator) of
frames, each of 32 samples.
audio modules plays samples at the rate of 7812.5 samples per second,
which means that it can reproduce frequencies up to 3.9kHz.
play(source, wait=True, pin=pin0, return_pin=None)¶
Play the source to completion.
sourceis an iterable, each element of which must be an
True, this function will block until the source is exhausted.
pinspecifies which pin the speaker is connected to.
return_pinspecifies a differential pin to connect to the speaker instead of ground.
AudioFrameobject is a list of 32 samples each of which is a signed byte (whole number between -128 and 127).
It takes just over 4 ms to play a single frame.
You will need a sound source, as input to the
play function. You can generate your own, like in
examples/waveforms.py or you can use the sound sources provided by modules like
You don’t need to understand this section to use the
It is just here in case you wanted to know how it works.
audio module consumes samples at 7812.5 kHz, and uses linear interpolation to
output a PWM signal at 32.5 kHz, which gives tolerable sound quality.
play fully copies all data from each
AudioFrame before it
next() for the next frame, so a sound source can use the same
audio module has an internal 64 sample buffer from which it reads samples.
When reading reaches the start or the mid-point of the buffer, it triggers a callback to
fetch the next
AudioFrame which is then copied into the buffer.
This means that a sound source has under 4ms to compute the next
and for reliable operation needs to take less 2ms (which is 32000 cycles, so should be plenty).
from microbit import display, sleep, button_a import audio import math def repeated_frame(frame, count): for i in range(count): yield frame # Press button A to skip to next wave. def show_wave(name, frame, duration=1500): display.scroll(name + " wave", wait=False,delay=100) audio.play(repeated_frame(frame, duration),wait=False) for i in range(75): sleep(100) if button_a.is_pressed(): display.clear() audio.stop() break frame = audio.AudioFrame() for i in range(len(frame)): frame[i] = int(math.sin(math.pi*i/16)*124+128.5) show_wave("Sine", frame) triangle = audio.AudioFrame() QUARTER = len(triangle)//4 for i in range(QUARTER): triangle[i] = i*15 triangle[i+QUARTER] = 248-i*15 triangle[i+QUARTER*2] = 128-i*15 triangle[i+QUARTER*3] = i*15+8 show_wave("Triangle", triangle) square = audio.AudioFrame() HALF = len(square)//2 for i in range(HALF): square[i] = 8 square[i+HALF] = 248 show_wave("Square", square) sleep(1000) for i in range(len(frame)): frame[i] = 252-i*8 show_wave("Sawtooth", frame) del frame #Generate a waveform that goes from triangle to square wave, reasonably smoothly. frames = [ None ] * 32 for i in range(32): frames[i] = frame = audio.AudioFrame() for j in range(len(triangle)): frame[j] = (triangle[j]*(32-i) + square[j]*i)>>5 def repeated_frames(frames, count): for frame in frames: for i in range(count): yield frame display.scroll("Ascending wave", wait=False) audio.play(repeated_frames(frames, 60))