プログラムコード
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()関数を使うと、鳴らす音と鳴らす長さ、音を鳴らさない長さが指定できるので、音楽のように聞こえます。
分かりやすかったです。