【行空板图形化Python入门教程】第08课:智慧钢琴
第08课:智慧钢琴
你是否想象过自己成为一名钢琴家,让音符在指尖飞舞?弹钢琴的过程,如同在平静的湖面上,用指腹敲起的一个个音符,坠落荡起的一阵涟漪,震撼着聆听者的内心。因为种种原因,或许我们没能学习过钢琴也没能拥有一台钢琴,但这些都阻碍不了对钢琴的喜爱。接下来,利用行空板制作一台专属的智慧钢琴吧!
任务目标
行空板下半部分显示钢琴按键,并为每个琴键附上一个音符,琴键的上方在演奏过程中自动移动琴谱图。
https://www.bilibili.com/video/BV1tK411S73K/?vd_source=27fedd3ac40d3e58da0788477833f7ac
知识点
1. 认识蜂鸣器
2. 掌握蜂鸣器的使用方法
材料清单
1. 硬件清单
行空板x1
Type-C&Micro二合一USB线x1
2. 软件使用
Mind+编程软件,下载地址:https://www.mindplus.cc
动手实践
这个项目中,主要是在行空板屏幕上显示一个简易的钢琴琴键,然后为每个琴键都赋一个蜂鸣器的音符。按下不同的琴键,播放不同的音符。在琴键上面会有一个辅助琴谱,琴谱可以自动移动,对于初学者来说辅助琴谱降低了演奏者的表演难度。接下来,从下面两个任务来实现智慧钢琴项目。
任务一:设置琴键布局
利用图片素材,完成行空板屏幕上的琴键布局,并为每个琴键设置一个蜂鸣器音符。
任务二:设置辅助琴谱
做一个辅助琴谱,让琴谱自动移动。
任务一 设置琴键布局
1. 硬件搭建
使用USB连接线将行空板连接到计算机。
2.软件准备
打开Mind+,按照下面图示完成软件准备过程。
3. 编写程序
开始编写程序之前,先分析一下布置琴键这个任务中要具体实现哪些功能。首先需要在行空板左侧部分显示1-7的琴键,然后为每个琴键赋一个音符。
(1) 确定琴键大小
将图片素材文件中的琴键图片,加载进项目中。
行空板的屏幕高为320,要放置7个相同的琴键,每个琴键占的宽大约为45,每个琴键之间再留个1的间距,因此将琴键的高设置为44比较合理。
(2) 确定琴键位置
七个琴键的大小相同,但是放置的位置应该是从上到下,依次放置。并且琴键之间需要留个“1”的间距,因此第二个琴键的位置就是x坐标不变,初始坐标3的基础上,加琴键高(44)再加间距1,第二个琴键坐标为(0,48)。
第三个琴键的位置就应该在第二个琴键Y坐标(48)的基础上,加上琴键宽度(44),再加上琴键之间的间距1,即48+44+1=93。因此第三个琴键的坐标为(0,93)。
以此类推,下一个琴键的位置同样是X坐标不变,Y坐标在现在的Y坐标基础上,加上琴键宽度(44),再加上琴键之间的间距1。
(3) 设置音符
按下琴键,触发的对象是琴键。所以要给每个琴键对象设置一个回调函数,需要使用指令 对象名 的点击回调函数为button_click1。
注意:对象名 的点击回调函数为button_click1 需要和 当点击回调函数button_click1 搭配使用,并且回调函数名要保持一致。
怎样才能在按下琴键后,发出对应的音符呢?这就需要用到板载蜂鸣器中的指令,按节拍播放音符。
注意:板载蜂鸣器硬件相关介绍见“知识园地”。
这个指令的音符下拉框里,提供三个音区的音符,节拍下拉框里提供八种节拍。不同音区的音符与节拍具体使用方法如下:
关于节拍的选择,一般都是根据琴谱中节拍进行选择,当然也可以根据自己的喜好来设置。以《小星星》琴谱为例,这首歌设定是4/4拍,他的意思是每小节有4拍,琴谱中每拍里面有4个音符,因此每个音符对应的节拍就该为1/4拍,所以在程序指令中选择1/4拍。
接下来就给每个琴键设置一个对应的音符吧!当按下琴键后,才会发出音符,因此需要在琴键的回调函数中添加 按节拍播放音符 指令,完整程序如下:
4. 程序运行
点击运行,程序运行成功后,行空板屏幕显示效果如下图,快根据《小星星》琴谱来演奏吧!
任务二 设置辅助琴谱
1. 编写程序
任务一演奏过程中,要一边盯着琴键一边看着琴谱,稍不留神就忘了自己弹哪里了,对于初学者来说,弹奏一首完整的曲子简直太难了。如果在我们演奏过程中,琴谱可以自己在行空板的屏幕上显示,这样就变得更加容易了。在上一个任务基础上增加一个辅助琴谱的功能,让琴谱自己在琴键上方移动。
(1) 显示琴谱
将图片素材文件中的琴谱图片,加载进项目中。
使用 显示图片 指令,设置图片在行空板(160,300)的位置显示。由于琴键占的宽度大约为160,因此琴谱的宽度不能超过80,所以使用 更新对象的数字参数 指令,设置琴谱图片的数字参数宽为80。
(2) 琴谱移动
琴谱移动,其实就是让图片循环向上移动,大家还记得怎样让图片向上移动吗?新建一个 变量img_y 用来改变图片的Y坐标值。
要实现琴谱图片连续向上移动,将图片移动的程序放到循环执行里即可。
完整程序如下:
2. 程序运行
点击运行,程序运行成功后,就可以开始演奏啦!演奏过程中,有了辅助琴谱,再也不用盯着琴键的同时,再去查看琴谱了。
3. 试一试
琴谱移动到末尾时,如果我们想再弹一次,只能重新上传程序,这样就太麻烦了。能不能在屏幕上加一个辅助琴谱按键,当我们想再弹一次时,按下辅助琴谱琴键,琴谱重新出现,并且循环向上移动。
知识园地
1. 蜂鸣器
行空板之所以能发声,是因为背部板载了蜂鸣器,简单地说,就是行空板上板载了一个可以发声的电子元件,给这个元件写不同的程序,就可以控制它发出声音。
为什么行空板上的蜂鸣器可以发出不同的音符,而有的蜂鸣器只能发出一种声音?其实蜂鸣器按驱动方式的原理分为有源蜂鸣器和无源蜂鸣器,下面一起来了解一下这两种蜂鸣器有什么区别。
(1) 有源蜂鸣器
有源蜂鸣器和无源蜂鸣器最根本的区别是输入信号的要求不一样,这里的“源”不是指电源,而是指振荡源。有源蜂鸣器内部带振荡源,只要一通电就会有声音输出,并且输出的声音是固定的,不能改变。
(2) 无源蜂鸣器
无源蜂鸣器的内部是没有这样的振荡源,所以仅用这样的直流信号,是不能让它发出声音的,必须方波信号去驱动振动装置,然后输出声音。
你知道什么是方波信号吗?
大家都有直尺吧,将直尺的一端用手固定在桌上,然后用另一只手去拨动直尺。拨动过程中你会发现拨动的力度不一样,直尺的振动频率和发出的声音也不一样。我们可以将拨动直尺的力度,理解为无源蜂鸣器中的方波信号输入。输入的方波信号不同,输出的声音也就不一样。
通过对有源蜂鸣器和无源蜂鸣器的学习,现在是否明白了行空板上的蜂鸣器可以发出不同音符的原因?
行空板上板载的就是这种无源蜂鸣器,程序按节拍播放音符指令中,选择不同的琴键,其实就是在给蜂鸣器设置不同的方波信号输入,所以蜂鸣器可以输出各种不同的音符。
2. 指令学习
该指令用于控制蜂鸣器播放音符,音符分为中高低三个音区,共36种音符,同时还提供8种不同的节拍。
挑战自我
在一些难一点的琴谱中,会出现了“#”和“b”这两种符号。琴谱中加了“#”和“b”的音符,代表该音符是变化音符,“#”代表升音,“b”代表降音。
而钢琴中的白色琴键用于弹奏基本音符,黑色琴键用于弹奏变化音符。变化音与黑色琴键的对应关系如下图:
如果要弹奏有变化音符的琴谱,就需要将黑色琴键也加上去。接下来,大家一起想一想怎样才能在行空板上添加黑色琴键,并且让蜂鸣器发出变化音符?
提示1:使用绘制矩形的方式,绘制钢琴黑白琴键。
提示2:按节拍播放音符指令中,点击黑色琴键可以选择变化音符。
附件下载
运行本案例程序出现如下错误,为什么?raise RuntimeError('*** Analog map retrieval timed out. ***' RuntimeError: *** Analog map retrieval timed out. *** Do you have Arduino connectivity and do you have the correct Firmata sketch uploaded to the board? Bincoco 发表于 2023-8-17 10:17
运行本案例程序出现如下错误,为什么?raise RuntimeError('*** Analog map retrieval timed out. ***' Runt ...
看下这里的解决方法https://mc.dfrobot.com.cn/thread-314045-1-1.html 谢谢,方法b解决了问题。 学会了! 一地鸡毛 发表于 2023-12-28 08:49
运行本案例程序出现如下错误,为什么?raise RuntimeError('*** Analog map retrieval timed out. ***' Runt ...
看下这里的解决方法https://mc.dfrobot.com.cn/thread-314045-1-1.html 怎么调大音量?或者外接喇叭?
请问有无办法,播放指定的音频?(格式:.wav、.mp3等等...
请问有无办法,播放指定的音频?(格式:.wav、.mp3等等都行)字数补丁字数补丁字数补丁字数补丁字数补丁字数补丁
页:
[1]