Audio¶
This module allows you play sounds from a speaker attached to the micro:bit.
The audio
module can be imported as import audio
or accessed via
the microbit
module as microbit.audio
.
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.
The audio
modules plays samples at the rate of 7812.5 samples per second,
which means that it can reproduce frequencies up to 3.9kHz.
Functions¶
-
audio.
play
(source, wait=True, pin=pin0, return_pin=None)¶ Play the source to completion.
Parameters: - source – An iterable sound source, each element of which must be
an
AudioFrame
. - wait – If
wait
isTrue
, this function will block until the source is exhausted. - pin – Specifies which pin the speaker is connected to.
- return_pin – Specifies a differential pin to connect to the speaker instead of ground.
- source – An iterable sound source, each element of which must be
an
Classes¶
-
class
audio.
AudioFrame
¶ An
AudioFrame
object is a list of 32 samples each of which is an unsigned byte (whole number between 0 and 255).It takes just over 4 ms to play a single frame.
-
copyfrom
(other)¶ Overwrite the data in this
AudioFrame
with the data from anotherAudioFrame
instance.Parameters: other – AudioFrame
instance from which to copy the data.
-
Using audio¶
You will need a sound source, as input to the play
function. You can generate your own, like in
examples/waveforms.py
.
Technical Details¶
Note
You don’t need to understand this section to use the audio
module.
It is just here in case you wanted to know how it works.
The audio
module can consumes an iterable (sequence, like list or tuple, or
generator) of AudioFrame
instances, each 32 samples at 7812.5 Hz, and uses
linear interpolation to output a PWM signal at 32.5 kHz, which gives tolerable
sound quality.
The function play
fully copies all data from each AudioFrame
before it
calls next()
for the next frame, so a sound source can use the same
AudioFrame
repeatedly.
The 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
AudioFrame
, and for reliable operation needs to take less 2ms (which is
32000 cycles, so should be plenty).
Example¶
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))