原创 不收费的钢琴教师

2010-12-22 10:31 1920 11 11 分类: 工程师职场

这是我在爱折腾上面翻译的一篇文章,爱折腾网址见下方


 


爱折腾网址


http://www.izheteng.com/diy/midi-piano-instructor.html


 


原文网址


http://www.5volt.eu/archives/94


 


MIDI钢琴教师其实从本质上来讲,是一个很特殊的演奏谱,通过它,你弹奏电子琴时可以不用抬头看着曲谱,我觉得它更可贵的一点在于,提高学习电子琴的初学者的信心与兴趣。


 


它将我们演奏电子琴的状态改变


b1b92f43-d60d-4500-a45c-00377426322d.jpg



以前弹奏需要抬头看曲谱,可能对于老练的人来讲不是问题,但是对于初学者来讲绝对是一种打击,除非你很有天赋。(这个结论是笔者就自己刚开始弹吉他的情景总结的。)而现在只需要弹奏亮着的LED灯所对应的按键(它们在位置上是一一对应的,如下图。)


172d9c64-881b-4554-a8de-b4d96bef88f8.jpg



我相信这样的话,对于初学者来说肯定很轻松了。(不过从音乐素养的角度来讲,熟练后最好还是按五线谱来弹奏,这样能培养对音高的一种感觉。这也就是为什么吉他大师们总在对大家说的:摒弃方便的六线谱,回归五线谱,找寻真正的音乐。)


 


 


 


那这个MIDI钢琴教师的原理是什么呢?


它的原理其实不复杂,简单来说就是解码电脑发出的MIDI信号,读出其中弹奏的音符,以及弹奏时间等等信息,然后输出到LED显示


 


 


这时候就涉及到MIDI的知识了。


首先是MIDI设备接口分为三种:IN(输入), OUT(输出)和THRU(穿越)。


MIDI数据流通常由MIDI控制器(MIDI controller)产生,如乐器键盘(musical instrument keyboard),或者由MIDI音序器(MIDI sequencer)产生。


通常,MIDI数据流的接收设备是MIDI声音发生器(MIDI sound generator)或者MIDI声音模块(MIDI sound module),它们在MIDI IN端口接收MIDI信息(MIDI messages),然后播放声音。


当然我们这里的MIDI钢琴教师也作为MIDI接收设备,不过它不是发出声音,而是解码MIDI,然后将其中的音乐用LED可视化的展现出来,也就形成了LED可视化乐谱。


单个物理MIDI通道(MIDI channel)分成16个逻辑通道,每个逻辑通道可指定一种乐器,用4个二进制位来表示这16个逻辑通道。音乐键盘可设置在这16个通道之中的任何一个,而MIDI声源或者声音模块可被设置在指定的MIDI通道上接收。


而在这里我们需要的仅仅是MIDI数据流中音符的信息,对它的通道并不关注。(当然,如果你想把这个MIDI钢琴教师扩展为MIDI乐队教师,那就另当别论了。)


 


下面让我们来简单的了解下MIDI数据流的格式


MIDI数据流的格式其实和串口协议是一样的,31250的波特率,一位起始位,八位数据位,一位结束位,无奇偶校验。(注意以下讲的MIDI的知识是比较初级的,现代MIDI的数据流比这个复杂,因为庞大的音色库,各种丰富的音乐表情,扩大了MIDI数据流。


 




状态字节


数据字节1


数据字节2


Message


Legend


1000nnnn


0kkkkkkk


0vvvvvvv


Note Off


n=channel number;  k=key 0-127(60=middle C); v=velocity (0-127)


1001nnnn


0kkkkkkk


0vvvvvvv


Note On


n=channel number;  k=key 0-127(60=middle C); v=velocity (0-127)


 


状态字节以1开头。


状态字节中第四位表示的是,当前音符奏响(1),静止(0)


状态字节后面四位也就是选择MIDI通道,4位二进制,代表16个逻辑通道。


 


数据字节以0开头。


数据字节1


后面7位一起表示所按的键的音高(或者简单来说就是音高),7位也就是有127个音符,60代表中央C,加1代表升一个半音,减1代表降一个半音,具体多少可以自己推导


 


数据字节2


同样的以0开头。


后面7位一起表示力度


举个例子吧




status byte


data byte1


data byte2


1001 0100


00111100


01111111


 


奏响音符,


通道5


 


 


 


60


中央C


 


最大力度


status byte


data byte1


data byte2


1000 0100


00111100


01111111


 


 


关闭音符,


通道5


 


 


60


中央C


 


最大力度


 


 


硬件电路



 771e0a9c-d33d-46d6-b903-b17c21bba0b7.jpg


整个电路见电路图,还有程序代码。


这里讲讲电路模块。


1.MIDI解码电路。


  这里由AVR单片机实现,当然你也可以采用其他的单片机,8051,PIC。。。


主要就是一个单片机最小系统。这里用到了AVR单片机自带的ADC,ADC采集一个电位器调节点电压,然后控制LED的亮度。


 


 


2.LED驱动电路


硬件电路需要那么多LED显示(88标准琴键对应88个LED),当然少不了矩阵形式的电路来帮忙了。


LED矩阵驱动,实质类似于矩阵键盘,相信玩过单片机的朋友们都不陌生,这里选用的LED驱动属于大电流驱动器(毕竟那么多LED,不要用74HC04这样的非门驱动,除非你只驱动几个LED)。行列均选中的LED才亮。


注意,电路里面的LED限流电阻的阻值的选取是建立在所选LED为蓝色的超高亮度LED,如果你使用红色,或者绿色,建议将限流电阻改为470 Ohm。


 


3.MIDI接口


接口比较简单,但是注意2点


两个MIDI接口。MIDI IN 用来连接电脑的游戏接口传来的MIDI信号,MIDI Though则用来连接到电子琴的MIDI输入端,MIDI Though的信号与电脑输出的MIDI信号是相同的(相当于把电脑的输出分流。)


 


电脑输出,要经过光耦隔离,不能与后级共地,如果共地的话,电子琴的音乐将会有“hums”的杂音。因为如果共地的话,MIDI THRU将会与MIDI IN等效去驱动光耦中的LED,产生噪音。


 


软件


这个软件其实也比较简单,等效于串口协议,加上矩阵键盘,再加一个LED亮度控制。


软件里面其实还写了一个升调,就是按一下键,升半音。


bd46f25b-573a-425e-a941-bc89f777ba42.jpg



最后控制器的外观,从左至右,第一个是MIDI接口,第二个是LED亮度控制,第三个是升调按键,第四个是电源接口。


d7fce682-0f0d-4e17-ac17-35e54c441381.jpg



这个就是放在电子琴上面的MIDI钢琴教师。


 


Translate By Gibson


 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
11
关闭 站长推荐上一条 /3 下一条