跳到主要内容

03-节奏大师

通过8个引脚实现一台可调音的指尖钢琴,将其中7个引脚作为Do~Xi的7个音调,只有1个八度的钢琴说什么弹起来都没啥意思,所以特意抽出其中一个模拟脚作为八度调整,一起来成为节奏大师吧!

硬件结构


搭建图纸

节奏大师搭建.pdf

硬件接线

注意模块和板子上的丝印,一一对应切勿接错电源引脚
10钢琴.png



节奏大师基础版

案例实现

信息

由于程序段比较长,且每段程序都有比较明确的功能,所以索性我们导入子函数的概念。子函数的好处有很多,它不仅能够方便对程序段进行功能上的名称规范,在复用率较高的程序中可反复调用,大量减少程序长度

  1. 这一部分作为按键检测对应音调响起的判断程序,采用了持续播放和停止播放结合的方式,这就实现了短触短音,长触长音这种自由控制发声的模式

play_tone

  1. 将上面制作好的2段子函数放到主程序下,我们的初始化只需要执行1次所以放在重复执行上边,而对于按键的逻辑判断则需要无时无刻进行,所以放置在重复执行内部

主程序

程序文件

节奏大师—基础版.zip



节奏大师进阶版

进阶版为八度可调的指弹琴,只要你手速快,就能实现出酷炫的效果噢

案例实现

进阶版的节奏大师与基础版的差异主要在于

  • 增加了滑动电位器用于调节3个八度,为此我们特地增加了一个子函数用于判断滑块的位置
  • 3个八度共21个声音对应的频率,我们需要能够自由切换,因此引入了列表,列表的操作还是很自由的
  1. 对滑动电位器滑块位置的判断,分成3部分滑动电位器位置

  2. 将3个八度共21个频率顺序添加到列表

blocksSvg-1727600802595

  1. 蜂鸣器播放使用数组和滑块位置变量的运算结果来替代基础版中写死的频率

蜂鸣器播放

将上面制作好的3段子函数放到主程序内

blocksSvg-1728980484479

程序文件

Python进阶程序

危险

参考链接:
local函方法:动态生成变量名
https://blog.csdn.net/s740556472/article/details/80928849

from meowbit import *
import array
import time

C3 = 131
CS3 = 139
D3 = 147
DS3 = 156
E3 = 165
F3 = 175
FS3 = 185
G3 = 196
GS3 = 208
A3 = 220
AS3 = 233
B3 = 247
C4 = 262
CS4 = 277
D4 = 294
DS4 = 311
E4 = 330
F4 = 349
FS4 = 370
G4 = 392
GS4 = 415
A4 = 440
AS4 = 466
B4 = 494
C5 = 523
CS5 = 554
D5 = 587
DS5 = 622
E5 = 659
F5 = 698
FS5 = 740
G5 = 784
GS5 = 831
A5 = 880
AS5 = 932
B5 = 988

index = 0
octave = 1

note = [C3, D3, E3, F3, G3, A3, B3, C4, D4, E4, F4, G4, A4, B4,C5, D5, E5, F5, G5, A5, B5]
PinList = ['P1', 'P2', 'P8', 'P12', 'P13', 'P14', 'C12']
val = []
p7 = MeowPin('P0', ANALOG)
for i in range(len(PinList)):
locals()['p'+str(i)] = MeowPin(PinList[i], IN)
print(locals()['p'+str(i)])

def play_tone():
for i in range(len(PinList)):
if not(locals()['p'+str(i)].getDigital()):
buzzer.tone(note[i+octave*7], -1)

def octave_tune():
global octave
if p7.getAnalog()<(4096*1/3):
octave = 2
elif p7.getAnalog()<(4096*2/3):
octave = 1
else:
octave = 0

while 1:
octave_tune()
val = val.clear()
val = []
for i in range(len(PinList)):
val.append(locals()['p'+str(i)].getDigital())
val.sort()
if val[0]:
buzzer.stop()
else:
play_tone()

附件

频率转音调对照表.txt