フィジカルコンピューティング with Raspberry PI Pico
10 ブザーでドレミ

フィジカルコンピューティング with Raspberry PI Pico 9 防犯アラーム」で使ったアクティブブザーは、電気をオンにすると音が鳴り、オフにすると音が止まるという単純な作りです。これに対し、パッシブブザーは、与えられた周波数で音が鳴るので、音階、つまりドレミが作成できます。

音楽では、A音(真ん中のラ音)を440Hzとしてチューニング(音合わせ)することが標準となっています。ドレミの周波数を表にすると、次のようになります。


(引用:Frequencies of Musical Notes, A4 = 440 Hz)

この周波数の数値をパッシブブザーに与えると、ブザーはその音で鳴ります。これはコンピュータミュージックの原点だと言えます。

ドレミを鳴らす

上記の表に示した周波数を使って、ドレミを鳴らしてみます。

配線

パッシブブザーの(+)の線をPicoのGP15につなぎます。

Raspberry Pi Pico パッシブブザー
GP15 VCC(+)
GND GND(-)

プログラムコード
from machine import Pin, PWM
import utime

buzzer = PWM(Pin(15))

# ドレミの周波数のリスト
freqs = [262,293,329,349,392,440,493,523]

for i in range(8):
    buzzer.freq(freqs[i])	# 音をfreqsリストの周波数で1秒間鳴らす
    buzzer.duty_u16(12000)	# ブザーを有効化
    utime.sleep(1)
    buzzer.duty_u16(0)		# ブザーを無効化
    utime.sleep(0.2)

* PWM()は「パルス幅変調」を行う関数で、次の「ポテンショメータでモーターを回す」で見ていきます。またfreq()やduty_u16()メソッドについてもそこで取り上げます。

「かえるの合唱(かえるの歌)」を鳴らす

音を鳴らしておく時間と、鳴らさないで休む時間を曲に合わせて調整すると、その曲に聞こえるような音になります。たとえば1小節を4秒とすると、四分音符の長さは1秒になります。

ドの周波数で1秒間鳴らして、レの周波数で1秒間鳴らし、ミの周波数で1秒間鳴らして、1秒間鳴らさないで休むと、下図のような楽譜を表すことができます。

1小節にかける秒数はその曲のスピード(テンポ)に当たると考えられます。1小節4秒が遅いなら2秒にすると、四分音符の長さは0.5秒になり、テンポは2倍速くなります。八分音符の長さは0.25秒になります。

「かえるの合唱」はこの1小節2秒が適当に思えるので、次のコードでは四分音符の長さを0.5秒にしています。

プログラムコード
from machine import Pin, PWM
import utime

buzzer = PWM(Pin(15))
# 点灯の音の長さを表す
led = Pin(14,Pin.OUT)

# ドレミに対応した周波数の辞書オブジェクト
notes = {"C":262,"D":293,"E":329,"F":349,"G":392,"A":440,"B":493,"Ch":523}

# 指定された周波数で、指定された長さだけ音を鳴らす
def play_sound(note,note_length):
    buzzer.freq(note)
    buzzer.duty_u16(12000)
    led.on() 	# LED点灯
    utime.sleep(note_length)
    buzzer.duty_u16(0)
    led.off()	# LED消灯
    utime.sleep(0.02)
    
def rest(len):
    buzzer.duty_u16(0)
    utime.sleep(len)

# 前奏:ド(休)ド(休み)の1小節
play_sound(notes["C"],0.5)
rest(0.5)
play_sound(notes["C"],0.5)
rest(0.5)
# 前奏:繰り返し
play_sound(notes["C"],0.5)
rest(0.5)
play_sound(notes["C"],0.5)
rest(0.5)

# かえるの
play_sound(notes["C"],0.5)
play_sound(notes["D"],0.5)
play_sound(notes["E"],0.5)
play_sound(notes["F"],0.5)
# 歌が(休)
play_sound(notes["E"],0.5)
play_sound(notes["D"],0.5)
play_sound(notes["C"],0.5)
rest(0.5)
# 聞こえて
play_sound(notes["E"],0.5)
play_sound(notes["F"],0.5)
play_sound(notes["G"],0.5)
play_sound(notes["A"],0.5)
# くるよ(休)
play_sound(notes["G"],0.5)
play_sound(notes["F"],0.5)
play_sound(notes["E"],0.5)
rest(0.5)
# クワ(休)クワ(休み)クワ(休)クワ(休み)
play_sound(notes["C"],0.5)
rest(0.5)
play_sound(notes["C"],0.5)
rest(0.5)
play_sound(notes["C"],0.5)
rest(0.5)
play_sound(notes["C"],0.5)
rest(0.5)
# ゲロゲロゲロゲロ
# 0.25は八分音符に当たる
play_sound(notes["C"],0.25)
play_sound(notes["C"],0.25)
play_sound(notes["D"],0.25)
play_sound(notes["D"],0.25)
play_sound(notes["E"],0.25)
play_sound(notes["E"],0.25)
play_sound(notes["F"],0.25)
play_sound(notes["F"],0.25)
# # クワクワクワ(休)
play_sound(notes["E"],0.5)
play_sound(notes["D"],0.5)
play_sound(notes["C"],0.5)
rest(1)
print("終わり")

notesはPythonの辞書と呼ばれるオブジェクトで、データの保持によく使用されます。全体を{}で囲み、キーと値のペアを:で区切って指定します。項目同士は,で区切ります。キーのデータ型には文字列や数値などが使われます。

notes = {"C":262,"D":293,"E":329,"F":349,"G":392,"A":440,"B":493,"Ch":523}

データを辞書オブジェクトで保持すると、変数名[キー]の形式で、そのキーの値にアクセスできます。ここでは音を鳴らすplay_sound()関数に渡す引数で、この形式を使っています。

play_sound(notes["C"],0.5)

play_sound()とrest()関数を使うと、鳴らす音と鳴らす長さ、音を鳴らさない長さが指定できるので、音楽のように聞こえます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


2023年7月
 12
3456789
10111213141516
17181920212223
24252627282930
31