音乐

在BBC micro:bit设备中MicroPython配有强大的音乐和声音模块。一旦连接扬声器,很容易发出哔哔声和杂音。你需要做的是用鳄鱼夹将引脚0和GND连接到扬声器的正负极输入端(连接扬声器的方式没有要求)。

../_images/pin0-gnd.png

注解

请勿尝试使用压电式蜂鸣器 - 这种蜂鸣器只能播放单音调。

我们来播放一些音乐:

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

改变下例子中的旋律,你最喜欢哪个呢?你将如何使用这些音调来作为信号或者线索呢?

“作曲家” Microbit

创作你自己的音调非常容易!

每个音都有它的名称(比如 C#F ),八度音阶(告诉MicroPython播放高音还是低音)和音长(播放的音持续的时间)。八度音阶是用数字表示的,其中0表示最低;4表示中音八度音阶;8表示高音,除非是为狗作曲,不然用不到。音长也是用数字表示的。数字越大,音长越长。音长的数值是相互联系的,比如,音长 4 的持续时间是音长 2 的二倍。如果使用名为 R 的音,MicroPython会在指定的时间内播放休止符(即静音),

每个音都由字符串表达:

NOTE[octave][:duration]

比如, "A1:4" 指的是八度音阶为 1 的名为 A 的音将在音长 4 期间播放。

就像图像列表可以做动画一样,你也可以通过音符列表来创作一段旋律。举个例子来说,下面是《雅各兄弟》的开头:

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之间创建范围值”。 第二种用法是“以-16步为单位在1760和880之间创建范围值”。 这就是获得一系列波动频率,从而发出警笛声的方法。

由于警笛声应持续,因此用了永久 while 循环。

重要的是,我们在 while 循环中引入了一种新的循环— for 循环。 就像“藏品中的每件商品,都应有其相应的活动”一样,特别要指出,上面例子的意思是,“特定频率范围内的频率,播放每个频率的音调应持续6毫秒”。 请注意,for循环中的每个数据项的缩进(如前所述),以便Python能确切地知道要运行哪些代码来处理单个事项。