Micro:bit 的聲音控制

Micro:bit 可以搭配蜂鳴器,喇叭或耳機做出發出聲音,演奏甚至是模擬人聲說話的效果。這時候我們會利用Micro:bit 下方的Pin 腳把資料與電源送至發聲設備,內建的發聲方式可以是單純的對蜂鳴器發送on 或off 的訊號,也可以使用music 模組或是speech 模組作更複雜的聲音表現。

首先介紹蜂鳴器的使用,蜂鳴器的發聲較為單調,所以我們只利用Pin腳控制訊號的On 和 Off,On 的時候有聲音,Off 的時候沒聲音,搭配On 與 Off 持續的時間,就可以做出一些聲音上的變化。舉例如下:

from microbit import *

while True:
    pin0.write_digital(1)
    sleep(50)
    pin0.write_digital(0)
    sleep(70)

Pin0 是Micro:bit 下方最左邊的接腳,透過write_digital() 做出訊號輸出的控制,1 是On,0 是Off,蜂鳴器會有兩個正負接腳,正的連接Pin0,負的連接GND 就可以透過此程式讓蜂鳴器發出聲音。

 

除了內建的方法之外,我們可以從外部引入Music 的套件讓Micro:bit 作更豐富的聲音表現。在Music 套件中有許多內建的音樂,我們可以直接引用。例如:

from microbit import *
import music

while True:
   music.play(music.BIRTHDAY)
   display.show(Image.HEART)
   sleep(5000)

這個程式會讓Micro:bit 先演奏生日快樂歌,然後顯示一個愛心符號,五秒後重複。

除了內建的歌曲之外,我們也可以自訂自己的音樂。例如:

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)

顧名思義"C4:4"在冒號前面是音高,冒號之後是節拍。這些音高與節拍的組合就可以製作出一個曲調,取名為tune,再透過music.play() 這個函數就可以播放音樂。

使用music 模組還有一種發聲的方法就是用music.pitch() 函數。函數的使用方式為:

music.pitch(頻率,延時)

如果要使用某個函數變化(例如線性遞增和遞減函數)來做出對應的聲音變化,我們可以用下列程式:

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)

 

這裡的range(880,1760,16) 是一個range 物件,range 是一個有序的物件,range(a,b,d) 的意思是從a 開始,公差為d 的一個等差數列,b 為不會出現的上界。舉例來說,range(880,1760,16) 就是880, 896, 912, ... , 1744。雖然1744+16=1760,但是1760是不會出現的上界,所以只到1744。 

在speech 這個套件下實現了更豐富的聲音效果,除了能發出聲音,做出旋律之外,還可以模擬人聲,特別是英文的部分。透過特別的對照表,speech 可以做出對應kk音標的發音,例如:

speech.pronounce("/HEHLOW")  # "Hello"

"/H" 是發"H" 的音,"EH" 是發出"ㄜ" 的音,完整的對照表可參考這裡。 同樣地關於旋律也有對應的發音方式,例如:

import speech

solfa = [
    "#115DOWWWWWW",   # Doh
    "#103REYYYYYY",   # Re
    "#94MIYYYYYY",    # Mi
    "#88FAOAOAOAOR",  # Fa
    "#78SOHWWWWW",    # Soh
    "#70LAOAOAOAOR",  # La
    "#62TIYYYYYY",    # Ti
    "#58DOWWWWWW",    # Doh
]
song = ''.join(solfa)
speech.sing(song, speed=100)

這個程式會讓Micro:bit 唱出Do Re Mi Fa So La Ti Do,然而要利用這些發音符號拼湊出人說話的樣子,真的會發瘋。還好speech 模組有say() 這個函數,只要把要說的句子直接輸入,他就可以發出人可以辨識的聲音。例如:

import speech
from microbit import sleep
# You need a reason to do it.
speech.say("Listen to me!")
sleep(1000)
speech.say("You are so beautiful!")
sleep(1000)
speech.say("No Way!")
sleep(1000)

聽聽看,很好玩的。