from machine import Pin, PWM
import time
# ── ハード設定 ──────────────────────────────────────────
BUZZER_PIN = 16 # 好きな GPIO に
VOLUME = 32768 # 0〜65535(≈50 %)
# ── 音階(A4 = 440 Hz)─────────────────────────────────
FREQ = {
"ド": 261, "ド#": 277, "レ♭": 277,
"レ": 293, "レ#": 311, "ミ♭": 311,
"ミ": 329,
"ファ": 349, "ファ#": 370, "ソ♭": 370,
"ソ": 392, "ソ#": 415, "ラ♭": 415,
"ラ": 440, "ラ#": 466, "シ♭": 466,
"シ": 493,
"ド2": 523,
"休": 0
}
# ── テンポ設定 ────────────────────────────────────────
BEAT_MS = 400 # ♪ = 400 ms → 150 BPM
LONG_MS = BEAT_MS * 2 # 伸ばす音(2 拍 = 800 ms)
HALF_MS = BEAT_MS // 2 # 休符の 0.5 拍 = 200 ms
# 3/2 拍 = 1.5 拍 = 600 ms(整数で用意しておく)
TRIPLET_MS = BEAT_MS * 3 // 2
# ── 1. 上昇スケール ───────────────────────────────────
scale_up = [
("ド", BEAT_MS), ("レ", BEAT_MS), ("ミ", BEAT_MS), ("ファ", BEAT_MS),
("ソ", BEAT_MS), ("ラ", BEAT_MS), ("シ", BEAT_MS), ("ド2", TRIPLET_MS)
]
# ── 2. かえるの歌 ───────────────────────────────────
frog_song = [
# ドーレーミーファーミーレードー.
("ド", LONG_MS), ("レ", LONG_MS), ("ミ", LONG_MS), ("ファ", LONG_MS),
("ミ", LONG_MS), ("レ", LONG_MS), ("ド", BEAT_MS), ("休", HALF_MS),
# ミーファーソーラーソーファーミー.
("ミ", LONG_MS), ("ファ", LONG_MS), ("ソ", LONG_MS), ("ラ", LONG_MS),
("ソ", LONG_MS), ("ファ", LONG_MS), ("ミ", BEAT_MS), ("休", HALF_MS),
# ドー ドー ドー ドー.
("ド", BEAT_MS), ("休", HALF_MS),
("ド", BEAT_MS), ("休", HALF_MS),
("ド", BEAT_MS), ("休", HALF_MS),
("ド", BEAT_MS), ("休", HALF_MS),
# ドドレレミミファファミーレードー.
("ド", BEAT_MS), ("ド", BEAT_MS),
("レ", BEAT_MS), ("レ", BEAT_MS),
("ミ", BEAT_MS), ("ミ", BEAT_MS),
("ファ", BEAT_MS), ("ファ", BEAT_MS),
("ミ", LONG_MS), ("レ", LONG_MS), ("ド", TRIPLET_MS)
]
# ── 再生関数 ─────────────────────────────────────────
def play(pwm: PWM, score):
"""score = [(note, duration_ms), ...]"""
for note, dur in score:
freq = FREQ.get(note, 0)
if freq:
pwm.freq(freq)
pwm.duty_u16(VOLUME)
else: # 休符
pwm.duty_u16(0)
time.sleep_ms(int(dur)) # ← 必ず整数で渡す
pwm.duty_u16(0) # 余韻カット
time.sleep_ms(20) # 最小インターバル
# ── メイン ──────────────────────────────────────────
pwm = PWM(Pin(BUZZER_PIN))
try:
play(pwm, scale_up) # 1. ドレミファソラシド
time.sleep_ms(300) # 小休止
play(pwm, frog_song) # 2. かえるの歌
finally:
pwm.deinit()
0 件のコメント:
コメントを投稿