音乐

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

取示例代码并更改旋律。你最喜欢哪一个?你会如何使用这样的曲调作为信号或提示?

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 确切知道要运行哪些代码来处理各个项目。