所有分类
主题 主题
平台 平台
我的工作台
userHead
注册时间 [[userInfo.create_time]]
创造力 [[userInfo.creativity]]
[[userInfo.remark]]
[[d.project_title]]
articleThumb
[[d.material_name]]
timelineThumb
进入工作台
折叠
所有分类 我的工作台
展开

我是自由行走的车(一)

仔爸 仔爸 2020-07-07 13:39:08
1
1
简单

最近歌手周深很流行,而他与萨顶顶合作了一首歌,更是被人们誉为神仙在打架,首先让我们欣赏一下这首合唱曲。

没错,这首歌的名字就叫《自由行走的花》。想到前几天到手的麦昆,仔爸突发奇想,不如用麦昆Plus+Micro:bit来创作一个“自由行走的车”项目。说干就干 。 考虑到麦昆Plus自带一个蜂鸣器,播放的声音效果还是比较简陋的,那就让它作为播放MIDI的设备吧!

projectImage

 从网上找到自由行走的花的简谱,考虑到篇幅问题,我就选择了最熟悉的一段,如下,其中黄色就是我们要谱曲的部分。

projectImage

准备妥当,我们就开始创作吧!

步骤1 步骤1
打开Mind+软件,调用micro:bit和麦昆扩展模块。
projectImage
步骤2 步骤2
演奏音符小测验
projectImage

根据上面的简谱,编写如下的脚本。有没有感觉到天旋地转 :〉,没办法,有时候编程就是需要耐心和细心。

projectImage
步骤3 步骤3
优化。

通过观察,我们发现下图中左边的红框和右边蓝框中的脚本(曲谱)是一样的。那么我们就把这部分脚本写成一个自定义积木。

projectImage

然后脚本就变成下面这样的了。其实就就是模块化编程。

projectImage
步骤4 步骤4
用变量代替拍号(音长)

细心的朋友一定发现,播放音符的积木中设置音长只提供了4拍,2拍,1拍,1/2拍,1/4拍,那么如果是3拍子,只能用下面的方法来表示了。

projectImage
步骤5 步骤5
用变量代替音调。

根据上面用变量代替音长的想法,仔爸进一步构想,是不是可以用变量来代替调号呢? 然后编写了如下的脚本进行测试,发现无法播放。如下图1


难道要输入含有中文的表示音符的方法,或者用字母来表示?如下图2


通过尝试发现这个方法行不通,因为在上传模式下,变量的定义分为数字型变量和字符型变量,而上面红框部分是可以放入数字型变量,而无法放入字符型变量如下图3

projectImage

研究到这儿感觉已经无法实现了。其实,当我们单击积木中调号部分,然后在琴键上选择一个音调时,参数框变成一个比较大的数字,这个数字是不是可以放入变量呢?如下图1


发现下面的脚本居然成功播放音乐了。如下图2


但是这样也并没有简化多少。仔爸想,如果能将这些表示曲谱的数字存储在列表中,然后通过程序来读取列表中的内容,那样就只需要一个播放积木就能完成一整首歌的播放。可惜通过试验,发现列表存储的都是文字,而无法存储数字,幸好还有一个积木可以完成字符串转字数的转换。那么只要事先把文字类型的数字存储列表,然后取出来后转成数字再进行播放就OK了。如下图3


不过,在Scratch中,我们可以通过舞台上的列表进入输入或导入,但在Mind+的上传模式下,列表的批量操作感觉有点弱。DFROBOT的工程师看到的话,是不是可以增强一下这个导入功能啊! 当然,这个目前还不能把仔爸难倒,仔爸发现可以利用一下右侧的代码区中的代码,将自动生成的代码复制后,粘贴到手动编辑区,然后通过CV大法(Ctrl+C和Ctrl+V)来完成谱曲。如下图4

projectImage
projectImage

仔爸摘录了在C大调下简谱1~7与其对应的播放数字之间的关系,如下表1


还有一个需要解决的问题是音长,通过观察Arduino C代码,发现音长都是用BEAT_1表示1拍,其实我们不用管这个表示,我们只要用0.25表示1/4拍,用0.5表示1/2拍,以及用1-4的数字表示相应的拍数即可。请注意,如果填入5则表示1拍。 因此,我们也可以建立两个列表,一个是音长的列表,另一个是调号列表,根据调号对应表,在Arduino C代码编辑窗口将曲子的每个音符以及它的音长手工录入到列表中。 mind_l_YinFu.push_back(调号数字) mind_l_YinChang.push_back(音长数字),如下图2

projectImage

再用下面的代码来完成播放,请注意,当我们手工编辑代码后,单击上传到设备时会将手工编辑窗口的代码上传。

projectImage

好了,这个项目暂时讲解到这儿,有兴趣的朋友也可以找一些网上的其他简谱练练手。

Makelog作者原创文章,未经授权禁止转载。
1
1
评论
[[c.user_name]] [[c.create_time]]
[[c.parent_comment.count]]
[[c.comment_content]]