声音的¶
该模块允许您播放自己的声音。如果您使用的是 micro:bit
V2, audio
它也是 microbit
模块的一部分。
默认情况下,声音输出将通过引脚 0 上的边缘连接器和 内置扬声器 V2。您可以将有线耳机或扬声器连接到边缘连接器上的引脚 0 和 GND 以听到声音。
职能¶
-
audio.
play
(source, wait=True, pin=pin0, return_pin=None)¶ 播放源完成。
- source:
Sound
- 该microbit
模块包含您可以传递给的内置声音列表audio.play()
。 - source:
AudioFrame
- source agrument 也可以是AudioFrame
元素的迭代,如下所述。 - wait: 如果
wait
是True
,则此函数将阻塞,直到源耗尽。 - pin: 指定输出引脚的可选参数可用于
覆盖默认值
pin0
。如果我们不想播放任何声音,我们可以使用pin=None
.- return_pin: 指定一个差分边缘连接器引脚以连接到外部扬声器而不是接地。V2修订版忽略了这一点。
- source:
-
audio.
is_playing
()¶ 返回
True
如果音频播放,否则返回False
.
-
audio.
stop
()¶ 停止所有音频播放。
班级¶
-
class
audio.
AudioFrame
¶ 一个
AudioFrame
对象是一个包含 32 个样本的列表,每个样本都是一个有符号字节(-128 到 127 之间的整数)。播放一帧只需要 4 毫秒多一点。
使用音频¶
您将需要一个声源,作为 play
函数的输入。您可以使用内置的声音V2从 microbit
模块, microbit.Sound
或生成自己的,像examples/waveforms.py
。
内置声音 V2¶
可以使用 调用内置声音 audio.play(Sound.NAME)
。
Sound.GIGGLE
Sound.HAPPY
Sound.HELLO
Sound.MYSTERIOUS
Sound.SAD
Sound.SLIDE
Sound.SOARING
Sound.SPRING
Sound.TWINKLE
Sound.YAWN
技术细节¶
笔记
您无需了解本节即可使用该 audio
模块。它只是在这里以防您想知道它是如何工作的。
该 audio
模块AudioFrame
以 7812.5 Hz 的频率消耗样本,并使用线性插值以 32.5 kHz 的频率输出 PWM 信号,音质尚可。
该函数在调用下一帧之前 play
完全复制每个数据的所有数据,因此声源可以重复使用相同的数据 。AudioFrame
before it
calls next()
AudioFrame
该 audio
模块有一个内部 64 个样本缓冲区,从中读取样本。当读取到达缓冲区的开始或中点时,它会触发回调以获取下一个AudioFrame
,然后将其复制到缓冲区中。这意味着声源有不到 4ms 的时间来计算下一个
AudioFrame
,并且为了可靠的操作需要花费更少的 2ms(这是 32000 个周期,所以应该足够了)。
例子¶
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))