21391浏览
查看: 21391|回复: 7

[M10教程] 【行空板图形化Python入门教程】第08课:智慧钢琴

[复制链接]


第08课:智慧钢琴


你是否想象过自己成为一名钢琴家,让音符在指尖飞舞?弹钢琴的过程,如同在平静的湖面上,用指腹敲起的一个个音符,坠落荡起的一阵涟漪,震撼着聆听者的内心。因为种种原因,或许我们没能学习过钢琴也没能拥有一台钢琴,但这些都阻碍不了对钢琴的喜爱。接下来,利用行空板制作一台专属的智慧钢琴吧!

【行空板图形化Python入门教程】第08课:智慧钢琴图1



任务目标

行空板下半部分显示钢琴按键,并为每个琴键附上一个音符,琴键的上方在演奏过程中自动移动琴谱图。



知识点

1. 认识蜂鸣器

2. 掌握蜂鸣器的使用方法

材料清单

1. 硬件清单

【行空板图形化Python入门教程】第08课:智慧钢琴图2

行空板x1


【行空板图形化Python入门教程】第08课:智慧钢琴图3

Type-C&Micro二合一USB线x1


2. 软件使用

Mind+编程软件,下载地址:https://www.mindplus.cc

【行空板图形化Python入门教程】第08课:智慧钢琴图4



动手实践


这个项目中,主要是在行空板屏幕上显示一个简易的钢琴琴键,然后为每个琴键都赋一个蜂鸣器的音符。按下不同的琴键,播放不同的音符。在琴键上面会有一个辅助琴谱,琴谱可以自动移动,对于初学者来说辅助琴谱降低了演奏者的表演难度。接下来,从下面两个任务来实现智慧钢琴项目。

任务一:设置琴键布局

利用图片素材,完成行空板屏幕上的琴键布局,并为每个琴键设置一个蜂鸣器音符。

任务二:设置辅助琴谱

做一个辅助琴谱,让琴谱自动移动。


任务一 设置琴键布局

1. 硬件搭建

使用USB连接线将行空板连接到计算机。

【行空板图形化Python入门教程】第08课:智慧钢琴图5


2.软件准备

打开Mind+,按照下面图示完成软件准备过程。

【行空板图形化Python入门教程】第08课:智慧钢琴图6


3. 编写程序

开始编写程序之前,先分析一下布置琴键这个任务中要具体实现哪些功能。首先需要在行空板左侧部分显示1-7的琴键,然后为每个琴键赋一个音符。

【行空板图形化Python入门教程】第08课:智慧钢琴图7


(1) 确定琴键大小

将图片素材文件中的琴键图片,加载进项目中。

【行空板图形化Python入门教程】第08课:智慧钢琴图8


行空板的屏幕高为320,要放置7个相同的琴键,每个琴键占的宽大约为45,每个琴键之间再留个1的间距,因此将琴键的高设置为44比较合理。

【行空板图形化Python入门教程】第08课:智慧钢琴图9


(2) 确定琴键位置

七个琴键的大小相同,但是放置的位置应该是从上到下,依次放置。并且琴键之间需要留个“1”的间距,因此第二个琴键的位置就是x坐标不变,初始坐标3的基础上,加琴键高(44)再加间距1,第二个琴键坐标为(0,48)。

【行空板图形化Python入门教程】第08课:智慧钢琴图10


第三个琴键的位置就应该在第二个琴键Y坐标(48)的基础上,加上琴键宽度(44),再加上琴键之间的间距1,即48+44+1=93。因此第三个琴键的坐标为(0,93)。

【行空板图形化Python入门教程】第08课:智慧钢琴图11


以此类推,下一个琴键的位置同样是X坐标不变,Y坐标在现在的Y坐标基础上,加上琴键宽度(44),再加上琴键之间的间距1。

【行空板图形化Python入门教程】第08课:智慧钢琴图12


(3) 设置音符

按下琴键,触发的对象是琴键。所以要给每个琴键对象设置一个回调函数,需要使用指令 对象名 的点击回调函数为button_click1

注意:对象名 的点击回调函数为button_click1 需要和 当点击回调函数button_click1 搭配使用,并且回调函数名要保持一致。

【行空板图形化Python入门教程】第08课:智慧钢琴图13


怎样才能在按下琴键后,发出对应的音符呢?这就需要用到板载蜂鸣器中的指令,按节拍播放音符

注意:板载蜂鸣器硬件相关介绍见“知识园地”

【行空板图形化Python入门教程】第08课:智慧钢琴图14


这个指令的音符下拉框里,提供三个音区的音符,节拍下拉框里提供八种节拍。不同音区的音符与节拍具体使用方法如下:

【行空板图形化Python入门教程】第08课:智慧钢琴图15


关于节拍的选择,一般都是根据琴谱中节拍进行选择,当然也可以根据自己的喜好来设置。以《小星星》琴谱为例,这首歌设定是4/4拍,他的意思是每小节有4拍,琴谱中每拍里面有4个音符,因此每个音符对应的节拍就该为1/4拍,所以在程序指令中选择1/4拍。

【行空板图形化Python入门教程】第08课:智慧钢琴图16


接下来就给每个琴键设置一个对应的音符吧!当按下琴键后,才会发出音符,因此需要在琴键的回调函数中添加 按节拍播放音符 指令,完整程序如下:

【行空板图形化Python入门教程】第08课:智慧钢琴图17


4. 程序运行

点击运行,程序运行成功后,行空板屏幕显示效果如下图,快根据《小星星》琴谱来演奏吧!

【行空板图形化Python入门教程】第08课:智慧钢琴图18



任务二 设置辅助琴谱

1. 编写程序

任务一演奏过程中,要一边盯着琴键一边看着琴谱,稍不留神就忘了自己弹哪里了,对于初学者来说,弹奏一首完整的曲子简直太难了。如果在我们演奏过程中,琴谱可以自己在行空板的屏幕上显示,这样就变得更加容易了。在上一个任务基础上增加一个辅助琴谱的功能,让琴谱自己在琴键上方移动。

【行空板图形化Python入门教程】第08课:智慧钢琴图19


(1) 显示琴谱

将图片素材文件中的琴谱图片,加载进项目中。

【行空板图形化Python入门教程】第08课:智慧钢琴图20


使用 显示图片 指令,设置图片在行空板(160,300)的位置显示。由于琴键占的宽度大约为160,因此琴谱的宽度不能超过80,所以使用 更新对象的数字参数 指令,设置琴谱图片的数字参数宽为80。

【行空板图形化Python入门教程】第08课:智慧钢琴图21


(2) 琴谱移动

琴谱移动,其实就是让图片循环向上移动,大家还记得怎样让图片向上移动吗?新建一个 变量img_y 用来改变图片的Y坐标值。

【行空板图形化Python入门教程】第08课:智慧钢琴图22


要实现琴谱图片连续向上移动,将图片移动的程序放到循环执行里即可。

【行空板图形化Python入门教程】第08课:智慧钢琴图23


完整程序如下:

【行空板图形化Python入门教程】第08课:智慧钢琴图24


2. 程序运行

点击运行,程序运行成功后,就可以开始演奏啦!演奏过程中,有了辅助琴谱,再也不用盯着琴键的同时,再去查看琴谱了。

【行空板图形化Python入门教程】第08课:智慧钢琴图25


3. 试一试

琴谱移动到末尾时,如果我们想再弹一次,只能重新上传程序,这样就太麻烦了。能不能在屏幕上加一个辅助琴谱按键,当我们想再弹一次时,按下辅助琴谱琴键,琴谱重新出现,并且循环向上移动。

【行空板图形化Python入门教程】第08课:智慧钢琴图26



知识园地

1. 蜂鸣器

行空板之所以能发声,是因为背部板载了蜂鸣器,简单地说,就是行空板上板载了一个可以发声的电子元件,给这个元件写不同的程序,就可以控制它发出声音。

【行空板图形化Python入门教程】第08课:智慧钢琴图27


为什么行空板上的蜂鸣器可以发出不同的音符,而有的蜂鸣器只能发出一种声音?其实蜂鸣器按驱动方式的原理分为有源蜂鸣器和无源蜂鸣器,下面一起来了解一下这两种蜂鸣器有什么区别。

(1) 有源蜂鸣器

有源蜂鸣器和无源蜂鸣器最根本的区别是输入信号的要求不一样,这里的“源”不是指电源,而是指振荡源。有源蜂鸣器内部带振荡源,只要一通电就会有声音输出,并且输出的声音是固定的,不能改变。

【行空板图形化Python入门教程】第08课:智慧钢琴图28


(2) 无源蜂鸣器

无源蜂鸣器的内部是没有这样的振荡源,所以仅用这样的直流信号,是不能让它发出声音的,必须方波信号去驱动振动装置,然后输出声音。

【行空板图形化Python入门教程】第08课:智慧钢琴图29


你知道什么是方波信号吗?

大家都有直尺吧,将直尺的一端用手固定在桌上,然后用另一只手去拨动直尺。拨动过程中你会发现拨动的力度不一样,直尺的振动频率和发出的声音也不一样。我们可以将拨动直尺的力度,理解为无源蜂鸣器中的方波信号输入。输入的方波信号不同,输出的声音也就不一样。

【行空板图形化Python入门教程】第08课:智慧钢琴图30


通过对有源蜂鸣器和无源蜂鸣器的学习,现在是否明白了行空板上的蜂鸣器可以发出不同音符的原因?

行空板上板载的就是这种无源蜂鸣器,程序按节拍播放音符指令中,选择不同的琴键,其实就是在给蜂鸣器设置不同的方波信号输入,所以蜂鸣器可以输出各种不同的音符。

2. 指令学习

【行空板图形化Python入门教程】第08课:智慧钢琴图31


【行空板图形化Python入门教程】第08课:智慧钢琴图32


该指令用于控制蜂鸣器播放音符,音符分为中高低三个音区,共36种音符,同时还提供8种不同的节拍。


挑战自我

在一些难一点的琴谱中,会出现了“#”和“b”这两种符号。琴谱中加了“#”和“b”的音符,代表该音符是变化音符,“#”代表升音,“b”代表降音。

【行空板图形化Python入门教程】第08课:智慧钢琴图33


而钢琴中的白色琴键用于弹奏基本音符,黑色琴键用于弹奏变化音符。变化音与黑色琴键的对应关系如下图:

【行空板图形化Python入门教程】第08课:智慧钢琴图34


如果要弹奏有变化音符的琴谱,就需要将黑色琴键也加上去。接下来,大家一起想一想怎样才能在行空板上添加黑色琴键,并且让蜂鸣器发出变化音符?

提示1:使用绘制矩形的方式,绘制钢琴黑白琴键。

提示2:按节拍播放音符指令中,点击黑色琴键可以选择变化音符。

【行空板图形化Python入门教程】第08课:智慧钢琴图35


附件下载
下载附件第八课 智慧钢琴.zip



Bincoco  学徒

发表于 2023-8-17 10:17:21

运行本案例程序出现如下错误,为什么?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?
回复

使用道具 举报

DFEDU  高级技师

发表于 2023-8-17 19:23:51

Bincoco 发表于 2023-8-17 10:17
运行本案例程序出现如下错误,为什么?raise RuntimeError('*** Analog map retrieval timed out. ***' Runt ...

看下这里的解决方法https://mc.dfrobot.com.cn/thread-314045-1-1.html
回复

使用道具 举报

Bincoco  学徒

发表于 2023-8-18 20:11:57

谢谢,方法b解决了问题。
回复

使用道具 举报

我不会功夫AA  学徒

发表于 2023-12-27 13:53:47

学会了!
回复

使用道具 举报

时木时木  见习技师

发表于 2023-12-28 15:00:27

一地鸡毛 发表于 2023-12-28 08:49
运行本案例程序出现如下错误,为什么?raise RuntimeError('*** Analog map retrieval timed out. ***' Runt ...

看下这里的解决方法https://mc.dfrobot.com.cn/thread-314045-1-1.html
回复

使用道具 举报

cowcoding  学徒

发表于 2024-8-13 22:30:38

怎么调大音量?或者外接喇叭?
回复

使用道具 举报

卖兜  学徒

发表于 2024-10-5 15:32:03

请问有无办法,播放指定的音频?(格式:.wav、.mp3等等...

请问有无办法,播放指定的音频?(格式:.wav、.mp3等等都行)
字数补丁字数补丁字数补丁字数补丁字数补丁字数补丁
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail