Page Title

阅读材料:当创客怀念青葱岁月时,也可以如此“文艺”(下)——怀若谷


2019-11-06 11:06:25

No.3

编写程序

blob.png


编写程序前,我们再看看原理图。
(一)琴弦控制
当手指触碰了用铜箔包裹的木棒后,电信号会传导至Micro:bit的引脚,主控板读取到的对应的模拟值大于指定值(比如400),则通过无线通讯方式发送一个数值。6根木棒代表6根琴弦,被触碰后,发送的数值分别为:10、11、12、13、14、15。当收到信号后,徽章板会根据相应的数值结合收到的和弦值进行判断控制HaoddaMIDI发出相应的声音。
(二)音色控制
当按下接到引脚P0的按键开关后,向徽章板发出数值“50”。徽章板收到信息后,记录收到数值的次数,并根据次数为指定通道(通道1~6,一个通道负责一根琴弦的发声)选择相应的音色。
(三)和弦控制
接到引脚P1-P8的8个按键各代表一个和弦,当按下某个按键时,向徽章板发送相应的数值(51~58)。徽章板收到这些数值后,根据数值结合代表琴弦的数值控制HadaoMIDI发出相应和弦下的声音。
分解到3块Micro:bit和徽章板,要实现的功能如下:
(一)第一块和第二块Micro:bit实现的功能大致相同,所以程序基本相同,只是个别参数不同。第三块Micro:bit接了很多按键开关,触发条件变得更多,但是仍然是通过无线通讯发送数字信息而已;和前两块板子的程序流程还是基本相同的。
(二)徽章板端,可以接收到的15种不同的数字信号,大致可分为三类:控制琴弦、控制音色、控制和弦。除了处理的信息多外,在编程上也有一定的技巧。比如,单纯收到一个“50”后,就要实现在4种不同的音色间切换(当然,还可以加入更多音色),这需要使用一些基本算法。播放音乐的部分需要对和弦和弦号进行匹配以选择某一个音符,会涉及到一些吉他方面的知识。
3.1 琴弦端Micro:bit程序
3.1.1  吉他的弦序


blob.png


当吉他面对我们竖直放置时,6根弦从左往右依次为:6弦、5弦、4弦、3弦、2弦、1弦。
3.1.2  Micro:bit引脚与琴弦的对应关系


blob.png

第1块Micro:bit:P0—6弦,P1—5弦,P2—4弦


第2块Micro:bit:P0—3弦,P1—2弦,P2—1弦
3.1.3 编写程序


Micro:bit端使用MakeCode(好搭版)在线编程平台,

网址:http://haohaodada.com/haodabit/#editor

*不要直接使用官方的MakeCode for Micro:bit编程平台

blob.png

第1块Micro:bit上的程序


当第1块Micro:bit的三个引脚被触碰时(模拟值大于400),分别通过无线发送数字10、11、12。10,代表6弦被触碰;11,代表5弦被触碰;12,代表4弦被触碰。
模拟值参数可根据测试结果进行调整,数值越小,越灵敏,但是手没有进行触碰时一般也会有一定的数值,不一定为0。我们可以使用下面的程序测试不触碰和触碰时的数值变化,以作为编程的依据。


blob.png


测试引脚模拟值的程序


blob.png


第2块Micro:bit上的程序
当第2块Micro:bit的三个引脚被触碰时(模拟值大于400),分别通过无线发送数字13、14、15。13,代表3弦被触碰;14,代表2弦被触碰;15,代表1弦被触碰。


3.2 第3块Micro:bit程序

3.2.1  换音色按键开关

blob.png

blob.png


接在第3块Micro:bit P0引脚的按键开关为换音色按键,当该按键开关被按下时,无线发送数字“50”,作为换音色的信号。为了防止按下动作不利落,程序中设置了循环等待的指令,只有当按键开关在释放后才看成是一次触发。
3.2.2  和弦按键开关
blob.png
继续在上面的程序中增加按下其他按键开关后的相应指令。


blob.png


接在第3块Micro:bit P1~P8 八个引脚的按键开关为切换和弦按键,当这些按键开关被按下时,无线发送数字“51”~“58”。由于一个按键对应一个和弦,而且弹奏时必须用手按住某个按键不放才能触弦,所以不需要和控制音色的程序一样使用循环等待的指令。上图为接在引脚P1上的按键开关的程序,其他按键的都是同样的结构,所以只要进行重复复制、修改参数即可。需要注意的是,有些按键开关是低电平触发的,也就是不按时值为“1”,按下时值为“0”,那就需要将程序中的“1”改为“0”,以实际测试为准。
第3块Micro:bit完整程序如下图所示:



1573009237399592.png


第3块Micro:bit完程序
如果不需要这么多和弦或者需要更多的和弦,可以进行按键开关的增减及相应程序的修改。
3.2 徽章板程序
徽章板端使用好好搭搭徽章板在线编程平台,
网址:http://haohaodada.com/hz/    
3.2.1  初始化部分


blob.png


3.2.2  音色切换


blob.png

当收到无线数据后,先判断其数值是否为“50”。如果为“50”,说明需要更换音色。每收到一次“50”,则将变量“YINSE”的值增加1,再根据这个数值匹配相应的吉他音色,将通道1-6的音色都设置为该音色。由于程序较长,不便于截图,上图仅展示按下一次按键后切换为“尼龙弦吉他”的部分程序。我在这个项目中,共设有4种音色,分别是:YINSE=1(或5)-->钢弦吉他;YINSE=2-->尼龙弦吉他YINSE=3-->电吉他;YINSE=4-->失真效果电吉他。当“YINSE”的值为“5”时,需要将值重置为“1”,因为音色要回到“钢弦吉他”。程序如下图所示:

blob.png


需要完整程序的朋友,可关注公众号后在文章下方留言告知您的电子邮箱,也可以加我微信联系。


3.2.3  和弦变换

blob.png


当收到无线数据后,判断数值是否大于“51”(因为跟和弦对应的8个无线数值是51~58,还可以排除控制琴弦和控制音色的10~15、50),将变量“HEXIAN”的值设为收到无线数值。每个数值对应了一个和弦类型。本项目中,我设置的八个和弦和对应的无线数值为:C-->51、F-->52、G-->53、Am-->54、Dm-->55、Em-->56、E-->57、D7-->58。
3.2.4 琴弦发声
编写控制琴弦的程序,需要对吉他的和弦有一些来了解。以上面提到的8个和弦为例,我们需要知道每根弦在不同的和弦下所发的音符。


blob.png


下面以第6弦为例,首先我们需要将第6弦在各个和弦下的音符整理出来。


blob.png


将第6弦在不同和弦下的音符圈起来,如上图所示。


blob.png


为了方便查看,将圈起来的音符按顺序填入表中。再根据音符的表示法将数字转换为对应的字母,标记在单元格的右下方。在徽章板的编程软件中,音阶3对应的是中音组,那么低音1组应为音阶2,所以上表中的音符字母前都加了一个2。这都是为了编程时更加方便。
上面曾提到过,六根弦分别对应一个通道,可以同时发声。第6弦对应的是第6通道,下面的程序中都要进行相应设置。


blob.png


当收到无线信号后,判断数值是否为“10”;如果为“10”,说明第6弦被触碰,那么将根据当前的和弦类型发出相应的声音。
以变量“HEXIAN=51”那一条为例,D0表示HaodaMIDI 与徽章板连接的接口,通道号为6,音阶和音符号参见上面整理的表格,音量设置为100。
其他5根弦的程序只要照此方法编写即可。
需要完整程序的朋友可在文章下留言索取。
      吉他制作好后,在测试的过程中,发现只能进行分解和弦演奏,扫弦效果很不理想。我想,可能与制作弦的材料有关,木棒硬度较大,使用软质材料或者使用真的吉他弦是否会更好?也可能经过程序的优化后就能改进。这都需要时间继续摸索。也欢迎朋友们和我探讨!
有时间的话,还想做一个吹奏类的乐器,敬请期待!