音乐¶
BBC micro:bit 上的 MicroPython 带有强大的音乐和声音模块。如果您连接扬声器或无源压电蜂鸣器,很容易从设备中产生哔哔声和哔哔声。使用鳄鱼夹将引脚 0 和 GND 连接到扬声器/蜂鸣器的正负输入端 - 它们连接到扬声器的方向无关紧要,但压电蜂鸣器可能会极化(检查“+”标记正极)。
笔记
不要尝试使用有源压电蜂鸣器 - 这种蜂鸣器只能播放一种音调。
让我们播放一些音乐:
import music
music.play(music.NYAN)
请注意,我们导入了music
模块。它包含用于制作和控制声音的方法。
MicroPython 有相当多的内置旋律。这是一个完整的列表:
music.DADADADUM
music.ENTERTAINER
music.PRELUDE
music.ODE
music.NYAN
music.RINGTONE
music.FUNK
music.BLUES
music.BIRTHDAY
music.WEDDING
music.FUNERAL
music.PUNCHLINE
music.PYTHON
music.BADDY
music.CHASE
music.BA_DING
music.WAWAWAWAA
music.JUMP_UP
music.JUMP_DOWN
music.POWER_UP
music.POWER_DOWN
取示例代码并更改旋律。你最喜欢哪一个?你会如何使用这样的曲调作为信号或提示?
Wolfgang Amadeus Microbit¶
创建自己的音乐很容易!
每个音符都有一个名称(如C#
或 F
)、一个八度音程(告诉 MicroPython 音符应该演奏多高或多低)和一个持续时间(随着时间的推移持续多长时间)。八度由数字表示 ~ 0 是最低八度,4 包含中间 C,8 大约是您需要的最高八度,除非您为狗制作音乐。持续时间也用数字表示。持续时间的值越高,持续的时间就越长。这些值彼此相关 - 例如,持续时间4
将是持续时间的两倍2
(等等)。如果您使用音符名称,R
则 MicroPython 将在指定的持续时间内播放休止符(即静音)。
每个音符都表示为一串字符,如下所示:
NOTE[octave][:duration]
例如,"A1:4"
指以 A
八度数命名的音符1
,要播放的持续时间为 4
。
做一个笔记列表来创建旋律(这相当于用图像列表创建动画)。例如,以下是如何让 MicroPython 播放“Frere Jaques”的开场:
import music
tune = ["C4:4", "D4:4", "E4:4", "C4:4", "C4:4", "D4:4", "E4:4", "C4:4",
"E4:4", "F4:4", "G4:8", "E4:4", "F4:4", "G4:8"]
music.play(tune)
笔记
MicroPython 可帮助您简化此类旋律。它会记住八度和持续时间值,直到您下次更改它们。因此,上面的例子可以改写为:
import music
tune = ["C4:4", "D", "E", "C", "C", "D", "E", "C", "E", "F", "G:8",
"E:4", "F", "G:8"]
music.play(tune)
请注意八度音程和持续时间值如何仅在必须更改时更改。打字少得多,阅读起来也更简单。
声音特效¶
MicroPython 可让您制作非音符的音调。例如,以下是创建警笛效果的方法:
import music
while True:
for freq in range(880, 1760, 16):
music.pitch(freq, 6)
for freq in range(1760, 880, -16):
music.pitch(freq, 6)
请注意在此实例中如何使用该music.pitch
方法。它期望一个频率。例如, 的频率与 用于为交响乐团调音的440
音乐会相同 A
。
在上面的示例中,该 range
函数用于生成数值范围。这些数字用于定义音调。该range
函数的三个参数是起始值、结束值和步长。因此,第一个用法range
是用英语说“以 16 为步长创建 880 到 1760 之间的数字范围”。的第二个用法
range
是说,“以 -16 的步长创建 1760 到 880 之间的值范围”。这就是我们如何获得像警笛一样在音高上上下波动的频率范围。
因为警报器应该永远持续下去,所以它被包裹在一个无限while
循环中。
重要的是,我们在循环内部引入了一种新的while
循环: for
循环。在英语中,这就像说,“对于某个集合中的每个项目,用它做一些活动”。特别是在上面的例子中,它是说,“对于指定频率范围内的每个频率,播放该频率的音高 6 毫秒”。请注意 for 循环中的每个项目是如何缩进的(如前所述),因此 Python 确切知道要运行哪些代码来处理各个项目。