实验室有人买了一大堆蜂鸣器,手边正好又有pico,就写了个库
class Play_music:
'''
使用蜂鸣器来在pico上面播放最多八个声道的音乐
using buzzer to play music on raspberry pico
channel_1~8的gpio引脚将设置为0,2,4,6,8,10,12,14
the channel_1~8 is for gpio 0,2,4,6,8,10,12,14
请确保列表长度相同(我懒了)
please make sure that the len of list is same
'''
def __init__(self, play_speed=120, channel_1=0, channel_2=0, channel_3=0, channel_4=0, channel_5=0, channel_6=0, channel_7=0, channel_8=0):
from time import sleep
from machine import Pin, PWM
self.one_time = 60/play_speed
self.c1 =channel_1
self.c2 =channel_2
self.c3 =channel_3
self.c4 =channel_4
self.c5 =channel_5
self.c6 =channel_6
self.c7 =channel_7
self.c8 =channel_8
#l means low,h means high ,s means #
self.ldo = 262
self.ldos = 277
self.lre = 294
self.lres = 311
self.lmi = 330
self.lmis = 340
self.lfa = 349
self.lfas = 370
self.lso = 392
self.lsos = 415
self.lla = 440
self.llas = 466
self.lsi = 494
self.lsis = 524
self.do = 523
self.dos = 554
self.re = 578
self.res = 622
self.mi = 659
self.mis = 682
self.fa = 698
self.fas = 740
self.so = 784
self.sos = 831
self.la = 880
self.las = 932
self.si = 988
self.sis = 1046
self.hdo = 1046
self.hdos = 1109
self.hre = 1175
self.hres = 1245
self.hmi = 1318
self.hmis = 1356
self.hfa = 1397
self.hfas = 1480
self.hso = 1568
self.hsos = 1661
self.hla = 1760
self.hlas = 1865
self.hsi = 1976
self.hsis = 2066
self.stop = 20000
self.f_liist = [self.ldo,self.ldos,self.lre,self.lres,self.lmi,self.lmis,self.lfa,self.lfas,self.lso,self.lsos,self.lla,self.llas,self.lsi,self.lsis,
self.do,self.dos,self.re,self.res,self.mi,self.mis,self.fa,self.fas,self.so,self.sos,self.la,self.las,self.si,self.sis,
self.hdo,self.hdos,self.hre,self.hres,self.hmi,self.hmis,self.hfa,self.hfas,self.hso,self.hsos,self.hla,self.hlas,self.hsi,self.hsis,
self.stop]
self.test_sb = -1
self.length = 0
if type(self.c1).__name__=='list':
self.pwm1 = PWM(Pin(0))
self.pwm1.duty_u16(32768)
self.length = len(self.c1)
self.test_sb = 1
else:
pass
if type(self.c2).__name__=='list':
self.pwm2 = PWM(Pin(2))
self.pwm2.duty_u16(32768)
self.length = len(self.c2)
self.test_sb = 2
else:
pass
if type(self.c3).__name__=='list':
self.pwm3 = PWM(Pin(4))
self.pwm3.duty_u16(32768)
self.length = len(self.c3)
self.test_sb = 3
else:
pass
if type(self.c4).__name__=='list':
self.pwm4 = PWM(Pin(6))
self.pwm4.duty_u16(32768)
self.length = len(self.c4)
self.test_sb = 4
else:
pass
if type(self.c5).__name__=='list':
self.pwm5 = PWM(Pin(8))
self.pwm5.duty_u16(32768)
self.length = len(self.c5)
self.test_sb = 5
else:
pass
if type(self.c6).__name__=='list':
self.pwm6 = PWM(Pin(10))
self.pwm6.duty_u16(32768)
self.length = len(self.c6)
self.test_sb = 6
else:
pass
if type(self.c7).__name__=='list':
self.pwm7 = PWM(Pin(12))
self.pwm7.duty_u16(32768)
self.length = len(self.c7)
self.test_sb = 7
else:
pass
if type(self.c8).__name__=='list':
self.pwm8 = PWM(Pin(14))
self.pwm8.duty_u16(32768)
self.length = len(self.c8)
self.test_sb = 8
else:
pass
if self.test_sb == -1:
raise Exception('please make sure there has least one list has been there')
def play_music(self):
import time
i = 1
while i <= self.length:
j = i - 1
if type(self.c1).__name__=='list':
self.pwm1.freq(self.f_liist[int(12 + self.c1[j] * 2)])
if type(self.c2).__name__=='list':
self.pwm2.freq(self.f_liist[int(12 + self.c2[j] * 2)])
if type(self.c3).__name__=='list':
self.pwm3.freq(self.f_liist[int(12 + self.c3[j] * 2)])
if type(self.c4).__name__=='list':
self.pwm4.freq(self.f_liist[int(12 + self.c4[j] * 2)])
if type(self.c5).__name__=='list':
self.pwm5.freq(self.f_liist[int(12 + self.c5[j] * 2)])
if type(self.c6).__name__=='list':
self.pwm6.freq(self.f_liist[int(12 + self.c6[j] * 2)])
if type(self.c7).__name__=='list':
self.pwm7.freq(self.f_liist[int(12 + self.c7[j] * 2)])
if type(self.c8).__name__=='list':
self.pwm8.freq(self.f_liist[int(12 + self.c8[j] * 2)])
i = i+1
time.sleep(self.one_time)
if type(self.c1).__name__=='list':
self.pwm1.duty_u16(0)
if type(self.c2).__name__=='list':
self.pwm2.duty_u16(0)
if type(self.c3).__name__=='list':
self.pwm3.duty_u16(0)
if type(self.c4).__name__=='list':
self.pwm4.duty_u16(0)
if type(self.c5).__name__=='list':
self.pwm5.duty_u16(0)
if type(self.c6).__name__=='list':
self.pwm6.duty_u16(0)
if type(self.c7).__name__=='list':
self.pwm7.duty_u16(0)
if type(self.c8).__name__=='list':
self.pwm8.duty_u16(0)
def play_always(self):
while True:
self.play_music()
if __name__ == '__main__':
channel_1 = [15,15,15,15,15,15,6,7,8,8,8,7,8,8,10,10,7,7,7,7,7,7,3,3,6,6,6,5,6,6,8,8,
5,5,5,5,5,5,3,3,4,4,4,3,4,8,8,8,3,3,3,3,15,8,8,8,7,7,7,4.5,4,4,7,7,
7,7,7,7,7,7,6,7,8,8,8,7,8,8,10,10,7,7,7,7,7,7,3,3,6,6,6,5,6,6,8,8
,5,5,5,5,5,5,3,3,4,4,8,7,7,7,8,8,9,9,10,8,8,8,8,8,8,7,6,6,7,7,5.5,5.5
,6,6,6,6,6,6,8,9,10,10,10,9,10,10,12,12,9,9,9,9,9,9,5,5,8,8,8,7,8,8,10,10,
10,10,10,10,10,10,5,5,6,7,8,8,7,8,9,9,8,8,8,5,5,5,5,5,11,11,10,10,9,9,8,8]
channel_2 = [15,15,15,15,15,15,15,15,-1,1,3,3,3,3,3,3,-4,-2,0,0,0,0,0,0,-3,-1,1,1,1,1,1,1
-7,-4,-2,-2,-2,-2,-2,-2,-5,-3,-1,-1,-1,-1,-1,-1,-6,-4,-2,-2,-2,-2,-2,-2,-6,-2.5,0,0,0,0,0,0
-6,-6,-3.5,-2,0,0,3,3,-1,1,3,3,3,3,3,3,-4,-2,0,0,0,0,0,0,-3,-1,1,1,1,1,1,1,
0,-4,-2,-2,-2,-2,-2,-5,-5,-3,-1,-1,-1,-1,-1,-1,-6,-6,-4,-4,-4,-4,-4,-4,-5,-1,2,2,-4,-4,-4,-4,
-1,-1,-1,-1,-1,-1,15,15,-6,-4,-2,-2,-2,-2,1,1,-6,-6,-5,-5,-5,-5,15,15,-6,-4,-1,-1,-1,-1,1,1,
-6,-6,-4,-4,-2,-2,-2,-2,1,1,1,1,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
channel_3 = [15,15,15,15,15,15,6,7,8,8,8,7,8,8,10,10,7,7,7,7,7,7,3,3,6,6,6,5,6,6,8,8,
5,5,5,5,5,5,3,3,4,4,4,3,4,8,8,8,3,3,3,3,15,8,8,8,7,7,7,4.5,4,4,7,7,
7,7,7,7,7,7,6,7,8,8,8,7,8,8,10,10,7,7,7,7,7,7,3,3,6,6,6,5,6,6,8,8
,5,5,5,5,5,5,3,3,4,4,8,7,7,7,8,8,9,9,10,8,8,8,8,8,8,8,7,6,6,7,7,5.5,5.5
,6,6,6,6,6,6,8,9,10,10,10,9,10,10,12,12,9,9,9,9,9,9,5,5,8,8,7,8,8,10,10,
10,10,10,10,10,10,5,5,6,7,8,8,7,8,9,9,8,8,8,5,5,5,5,5,9,9,8,8,7,7,6,6]
channel_4 = [15,15,15,15,15,15,15,15,-1,1,3,3,3,3,3,3,-4,-2,0,0,0,0,0,0,-3,-1,1,1,1,1,1,1,
-7,-4,-2,-2,-2,-2,-2,-2,-5,-3,-1,-1,-1,-1,-1,-1,-6,-4,-2,-2,-2,-2,-2,-2,-6,-2.5,0,0,0,0,0,0,
-6,-6,-3.5,-2,0,0,3,3,-1,1,3,3,3,3,3,3,-4,-2,0,0,0,0,0,0,-3,-1,1,1,1,1,1,1,
0,-4,-2,-2,-2,-2,-2,-5,-5,-3,-1,-1,-1,-1,-1,-1,-6,-6,-4,-4,-4,-4,-4,-4,-5,-1,2,2,-1.5,-1.5,-1.5,-1.5,
1,1,1,1,1,1,15,15,-6,-4,-2,-2,-2,-2,1,1,-6,-6,-5,-5,-5,-5,15,15,-6,-4,-1,-1,-1,-1,1,1,
-6,-6,-4,-4,-2,-2,-2,-2,-1,-1,-1,-1,0,0,0,0,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1,-1,-1,-1,-1,-1,-1]
channel_5 = [15,15,15,15,15,15,15,15,-1,1,3,3,3,3,3,3,-4,-2,0,0,0,0,0,0,-3,-1,1,1,1,1,1,1,
-7,-4,-2,-2,-2,-2,-2,-2,-5,-3,-1,-1,-1,-1,-1,-1,-6,-4,-2,-2,-2,-2,-2,-2,-6,-2.5,0,0,0,0,0,0,
-6,-6,-3.5,-2,0,0,3,3,-1,1,3,3,3,3,3,3,-4,-2,0,0,0,0,0,0,-3,-1,1,1,1,1,1,1,
0,-4,-2,-2,-2,-2,-2,-5,-5,-3,-1,-1,-1,-1,-1,-1,-6,-6,-4,-4,-4,-4,-4,-4,-5,-1,2,2,0,0,0,0,
3,3,3,3,3,3,15,15,-6,-4,-2,-2,-2,-2,1,1,-6,-6,-5,-5,-5,-5,15,15,-6,-4,-1,-1,-1,-1,1,1,
-6,-6,-4,-4,-2,-2,-2,-2,-1,-1,-1,-1,0,0,0,0,-2,-2,-2,-2,-2,-2,-2,-2,-5,-5,-5,-5,-5,-5,-5,-5]
a = Play_music(120,channel_2,channel_3,channel_5,channel_4,channel_3,channel_1,channel_1,channel_1,)
a.play_music()
else:
pass
你需要给库初始化的时候传递乐谱的速度(节拍/分钟),以及可选的八个声道,分别控制GPIO0,2,4,6,8,10,12,14,需要以列表的形式传递 列表的内容包括从-6到15的数字1,2,3,4,5(do,ri,mi,fa,so),1.5即为#do,休止符代表是15,往下也是如此 请务必确保多通道列表长度相同,不然可能会不工作sorry