[實作紀錄] 聖誕播放板

今天12/24要接待來自日本的高中生,因此想了一下,決定來做一個小的播放板,讓他們能將Jingle bells這首曲子帶在身上。

整體來說做了兩個版本,一個是上課正在給同學實作的Arduino 版本,搭配無源蜂鳴器、2顆三號電池;另一種是raspberry pi pico 2(身上找得到的板子)。

下面就分享pi pico上面的程式碼囉:

import machine
import utime

# 設定硬體
buzzer = machine.PWM(machine.Pin(3))
led = machine.Pin(25, machine.Pin.OUT)

# 音高頻率定義
NOTES = {
‘G3’: 196, ‘A3’: 220, ‘B3’: 247,
‘C4’: 262, ‘D4’: 294, ‘E4’: 330, ‘F4’: 349, ‘G4’: 392, ‘A4’: 440, ‘B4’: 494,
‘C5’: 523, ‘D5’: 587, ‘E5’: 659, ‘F5’: 698, ‘G5’: 784, ‘A5’: 880, ‘0’: 0
}

# 完整旋律資料 (音名, 拍子)
# 1 = 四分音符, 2 = 半音符, 0.5 = 八分音符
melody = [
# — 主歌 Verse 1 —
(‘G4’, 1), (‘E4’, 1), (‘D4’, 1), (‘C4’, 1), (‘G3’, 3), (‘G3’, 0.5), (‘G3’, 0.5),
(‘G4’, 1), (‘E4’, 1), (‘D4’, 1), (‘C4’, 1), (‘A3’, 4),
(‘A4’, 1), (‘F4’, 1), (‘E4’, 1), (‘D4’, 1), (‘B3’, 4),
(‘G5’, 1), (‘G5’, 1), (‘F5’, 1), (‘D5’, 1), (‘E5’, 4),

(‘G4’, 1), (‘E4’, 1), (‘D4’, 1), (‘C4’, 1), (‘G3’, 4),
(‘G4’, 1), (‘E4’, 1), (‘D4’, 1), (‘C4’, 1), (‘A3’, 3), (‘A3’, 1),
(‘A4’, 1), (‘F4’, 1), (‘E4’, 1), (‘D4’, 1), (‘G5’, 1), (‘G5’, 1), (‘G5’, 1), (‘G5’, 1),
(‘A5’, 1), (‘G5’, 1), (‘F5’, 1), (‘D5’, 1), (‘C5’, 2), (‘G5’, 2),

# — 副歌 Chorus —
(‘E5’, 1), (‘E5’, 1), (‘E5’, 2), (‘E5’, 1), (‘E5’, 1), (‘E5’, 2),
(‘E5’, 1), (‘G5’, 1), (‘C5’, 1.5), (‘D5’, 0.5), (‘E5’, 4),
(‘F5’, 1), (‘F5’, 1), (‘F5’, 1.5), (‘F5’, 0.5), (‘F5’, 1), (‘E5’, 1), (‘E5’, 1), (‘E5’, 0.5), (‘E5’, 0.5),
(‘E5’, 1), (‘D5’, 1), (‘D5’, 1), (‘E5’, 1), (‘D5’, 2), (‘G5’, 2),

(‘E5’, 1), (‘E5’, 1), (‘E5’, 2), (‘E5’, 1), (‘E5’, 1), (‘E5’, 2),
(‘E5’, 1), (‘G5’, 1), (‘C5’, 1.5), (‘D5’, 0.5), (‘E5’, 4),
(‘F5’, 1), (‘F5’, 1), (‘F5’, 1.5), (‘F5’, 0.5), (‘F5’, 1), (‘E5’, 1), (‘E5’, 1), (‘E5’, 0.5), (‘E5’, 0.5),
(‘G5’, 1), (‘G5’, 1), (‘F5’, 1), (‘D5’, 1), (‘C5’, 4)
]

def play_song():
tempo = 0.15 # 調整這個數值可以改變整首歌的速度
for note, duration in melody:
freq = NOTES.get(note, 0)
if freq > 0:
buzzer.freq(freq)
buzzer.duty_u16(2000) # 設定適中的音量
led.value(1)

utime.sleep(duration * tempo)

buzzer.duty_u16(0) # 音符間短暫停頓
led.value(0)
utime.sleep(0.02)

# 執行播放
try:
print(“正在播放完整版 Jingle Bells…")
while True:
play_song()
utime.sleep(2) # 唱完一遍停兩秒
except KeyboardInterrupt:
buzzer.duty_u16(0)
led.value(0)
print(“已停止")

發表留言