|
【行空板 Python编程学习主控板】使用蜂鸣器和屏幕,将行空板变身MID播放器
[复制链接]
在行空板的屏幕背后,有一颗蜂鸣器,而官方的PinPong硬件库中,又专门提供了操作蜂鸣器的调用。
蜂鸣器具体的位置如下:
要让蜂鸣器想起来,基本的用法如下:
# -*- coding: utf-8 -*-
import time
from pinpong.board import Board,Pin
from pinpong.extension.unihiker import *
Board().begin()#初始化,选择板型和端口号,不输入端口号则进行自动识别
buzzer.set_tempo(4,60) #设置每一拍音符数,每分钟节拍数
buzzer.play(buzzer.DADADADUM, buzzer.OnceInBackground) #后台播放音乐一次
buzzer.pitch(494, 4) #播放音符
buzzer.pitch(494) #后台播放音符
time.sleep(4) #延时
buzzer.stop() #停止后台播放
buzzer.play(buzzer.ENTERTAINER, buzzer.ForeverInBackground) #后台永久播放音乐
如上面的演示代码所示,在扩展库中,提供了如下的预定于快捷码可以快速调用:
DADADADUM = 0
ENTERTAINER = 1
PRELUDE = 2
ODE = 3
NYAN = 4
RINGTONE = 5
FUNK = 6
BLUES = 7
BIRTHDAY = 8
WEDDING = 9
FUNERAL = 10
PUNCHLINE = 11
BADDY = 12
CHASE = 13
BA_DING = 14
WAWAWAWAA = 15
JUMP_UP = 16
JUMP_DOWN = 17
POWER_UP = 18
POWER_DOWN = 19
上述名称,代表了一段音符,可以直接使用buzzer.play(一段音符名称)来进行播放。
然后,还提供了一个对照表:
music_map = {
"C3": 131,
"D3": 147,
"E3": 165,
"F3": 175,
"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,
"B5": 988,
"C#3": 139,
"D#3": 156,
"F#3": 185,
"G#3": 208,
"A#3": 233,
"C#4": 277,
"D#4": 311,
"F#4": 370,
"G#4": 415,
"A#4": 466,
"C#5": 554,
"D#5": 622,
"F#5": 740,
"G#5": 831,
"A#5": 932
}
实际上,就是MID的频率。
然后,还提供了节拍数的定义:
BEAT_1 = 4
BEAT_1_2 = 2
BEAT_1_4 = 1
BEAT_3_4 = 3
BEAT_3_2 = 6
BEAT_2 = 8
BEAT_3 = 12
BEAT_4 = 16
例如,如果要播放出来哆来咪发索拉西,就可以使用:
buzzer.set_tempo(4,60) #设置每一拍音符数,每分钟节拍数
buzzer.pitch(buzzer.music_map["C3"], buzzer.BEAT_1) #后台播放音乐一次
buzzer.pitch(buzzer.music_map["D3"], buzzer.BEAT_1) #后台播放音乐一次
buzzer.pitch(buzzer.music_map["E3"], buzzer.BEAT_1) #后台播放音乐一次
buzzer.pitch(buzzer.music_map["F3"], buzzer.BEAT_1) #后台播放音乐一次
buzzer.pitch(buzzer.music_map["G3"], buzzer.BEAT_1) #后台播放音乐一次
buzzer.pitch(buzzer.music_map["A3"], buzzer.BEAT_1) #后台播放音乐一次
buzzer.pitch(buzzer.music_map["B3"], buzzer.BEAT_1) #后台播放音乐一次
有一首很有名的儿歌,一闪一闪亮晶晶,简谱如下:
那么使用蜂鸣器播放,就可以用如下的代码了:
# -*- coding: utf-8 -*-
import time
from pinpong.board import Board,Pin
from pinpong.extension.unihiker import *
from unihiker import GUI #导入包
Board().begin()#初始化
gui=GUI() #实例化GUI类
note_tone_map = dict()
note_tone_map[1] = buzzer.music_map["C3"]
note_tone_map[2] = buzzer.music_map["D3"]
note_tone_map[3] = buzzer.music_map["E3"]
note_tone_map[4] = buzzer.music_map["F3"]
note_tone_map[5] = buzzer.music_map["G3"]
note_tone_map[6] = buzzer.music_map["A3"]
note_tone_map[7] = buzzer.music_map["B3"]
note_beat_map = dict()
note_beat_map[1] = buzzer.BEAT_1_2
note_beat_map[2] = buzzer.BEAT_1
soundtone =(
1,1,5,5,6,6,5,4,4,3,3,2,2,1,
5,5,4,4,3,3,2,5,5,4,4,3,3,2,
1,1,5,5,6,6,5,4,4,3,3,2,2,1
)
soundlong = (
1,1,1,1,1,1,2,1,1,1,1,1,1,2,
1,1,1,1,1,1,2,1,1,1,1,1,1,2,
1,1,1,1,1,1,2,1,1,1,1,1,1,2
)
while True:
print("")
gui.clear()
print("一闪一闪亮晶晶 1=C 2/4")
gui.draw_text(x=10, y=20, text="一闪一闪亮晶晶 1=C 2/4", font_size=13)
buzzer.set_tempo(4,60) #设置每一拍音符数,每分钟节拍数
beat_total = 0
x=10
y=80
for i in range(0,len(soundtone)):
s_tone = soundtone[i]
s_long = soundlong[i]
freq = note_tone_map[s_tone]
beat = note_beat_map[s_long]
if beat == buzzer.BEAT_1:
str = "%d-" % s_tone
print(str, end="", flush=True)
gui.draw_text(x=x, y=y, text=str, font_size=8)
x = x + 16
else:
str = "%d" % s_tone
print(str, end="", flush=True)
gui.draw_text(x=x, y=y, text=str, font_size=8)
x = x + 8
beat_total = beat_total + beat
if beat_total % 4 == 0 :
str = "|"
if i == len(soundtone)-1:
str = "||"
print(str, end="", flush=True)
gui.draw_text(x=x+2, y=y-4, text=str, font_size=10)
x = x + 10
if beat_total % 32 == 0 :
print("")
y = y + 30
x = 10
buzzer.pitch(freq, beat) #后台播放音乐一次
time.sleep(5)
上述代码的主要逻辑,就是根据简谱,取对应的频率,然后播放一定的节拍市场。
当前所取得的简谱,会同步打印输出,并在屏幕显示,音乐和输出同步,将行空板变身MID播放器
具体效果如下:
mid
|
|