你的位置:首页 > 电子技术 > 电子制作/单片机

用通用单片机制作midi键盘

2008/4/23 23:29:39 浏览:5130

    midi 是电子乐器的语言,随着 midi 的诞生,数字化电子乐器已经越来越多, midi 的应用也越来越普遍,在电子乐队演奏,电子音乐制作等各个领域,发挥着越来越大的作用。随着计算机技术的发展,声卡已经成为普通计算机的标准设备,通过声卡的 midi 接口,可以连接各种各样的 midi 设备。连上专供输入的 midi 键盘,再配上相应的软件,计算机就可以完成电子琴的功能,甚至可以进行电子音乐的制作。由于 midi 自身的特点,它形成的音乐易于进行后期制作,越来越为广大音乐工作者所喜爱,而 midi 键盘作为输入最有效的工具,也越来越普及。

有些计算机音序软件支持用电脑键盘模拟琴键,可通过计算机键盘将音符输入计算机,有爱好者就用电脑键盘的控制芯片改装玩具电子琴,将其并接在计算机键盘上,称之为电脑琴,但这种控制芯片本身并不是为演奏音乐开发的,单音演奏还可以,在多个按键压下时会出错。本文将介绍如何用通用单片机实现 midi 键盘功能,并改装各种电子琴,与计算机连接,从而实现通过 midi 接口,把电脑变成真正的,可支持复音的电子琴。

 midi信号及声卡的midi接口

midi 是一种异步串行通讯协议,其传输速率为 31.25 k baud ( 每秒 31250 ) ,每个字节包括 10 位, 1 个起始位, 8 个数据位, 1 个停止位,每个音符的开(或关)命令有 3 个字节,经计算,不到 1ms 即可传输一个音符的开关命令。 midi 的数据流是单向的,不进行应答,设备发送音乐信息时,不管接收设备的状态,而接收设备收到的信息,经校验正确的则执行,错误的就忽略——这样规定是由音乐本身的特点决定的,可以丢掉音符,但不能搞错节拍,实时性最优先。从物理层面上看, midi 信号是电流传输的, 5ma 代表逻辑“ 0 ”, 0ma 代表逻辑“ 1 ”。 midi 设备连接时,必须将输出与另一设备的输入连接。

用通用单片机制作MIDI键盘

 1 典型的多个midi设备连接方式

 

  计算机声卡的 midi game 接口是15针的 d 型连接器,其中与 midi 相关的有:

1     +5v               +5 vdc

4     gnd                

12    miditxd             midi 输出     

15    midirxd             midi 输入    

用通用单片机制作MIDI键盘

声卡上的 midi/game 接口

二、 单片机如何产生 midi 信号

本节介绍如何用目前在国内处于最主流地位的51系列单片机产生 midi 信号。实际上,这包含了两层意思 :1.如何产生符合  midi 协议的串行数据。2.接口电路。

绝大多数51系列单片机都有串行通讯控制器( uart , 配合合适的晶振,正确地设置 uart 的工作参数,就能够自动产生所需的串行数据。使用定时/计数器1( t/c1 )作为波特率发生器。将串行口设置为方式1工作状态(10位异步收发,波特率由定时器控制),使用6 mhz 晶振, t/c1 设为自动装入8位计数器状态( tmod 置为 2xh ), smod 1 th=ffh ,此时正好发生 31.25k 的串行通讯数据,适用于 midi 协议。

串口及定时/计数器初始化如下:( c 语言例程,下同)

void format();

     {   tmod=0x21;      //t/c1 工作于8位自动装入状态 //

           tl1=0xff; th1=0xff ;  // t/c1 常数,确定波特率 //

            scon=0x50 ;       // 设串口工作于方式1, //

         pcon=0x80 ;         // 相当于 smod=1;//

         tr1=1;            //t/c1 开始计数 //

}

 

midi 协议中,每一次音符操作,命令包含3个字节,连续发送,依次为 “命令+通道号”,“音符”,“力度”。命令的第一个字节的最高位为1,通道为0-16,第二字节最高为位0,音符号为0-127,第三字节最高位为0,力度0-127。

发送一个音符命令:(参数  cc,kk,vv 分别为“命令+通道号”,“音符号”,“力度”)

 

void send(uchar cc,kk,vv)

 {   tr1=1;      // 开计数器 //

 sbuf=cc;    // 写入寄存器 //

 while(ti==0); // 等待发送结束 //

 ti=0;        // 清发送标志 //

    sbuf=kk;

 while(ti==0);

    ti=0;

    sbuf=vv;

 while(ti==0);

   ti=0;

tr1=0;

}

 

midi 命令简表

命令代码

cc

命令说明

数据 kk 含义及说明

数据 vv 含义及说明

8+ 通道号

关闭音符

 对应的midi音符0127

关闭音符的速度值

9+ 通道号     

开启音符

对应的 midi 音符 0 127

    压下琴键的速度值(力度)

a+ 通道号

触后压力

 对应的midi音符0127

    对应音符的触后压力值

b+ 通道号

控制器

 控制器号077

  77 7f 为通道模式信息

    控制器值

c+ 通道号

音色切换

 音色号 0127

    无该字节数据

d+ 通道号

通道压力

 该通道全部键盘的触后压力

    无该字节数据

e+ 通道号

弯音轮

 弯音轮低位数据

弯音轮高位数据

f

系统普通信息、实时信息、及高级信息代码

忽略

忽略

 

前面已经介绍过, midi 信号是单向的数据流,输出设备不管接收设备的状态,只是连续发出命令, 因此, midi 键盘作为发送设备,只需输出,对于 51 单片机,其 txd 即可作为 midi 信号的输出口,若不用转发别的 midi 设备信号, rxd 实际上就没必要使用了。用 51 单片机的 txd 脚,与声卡的 midi-in 脚(15脚)相连,就可以很好的产生所需的 midi 信号,驱动声卡。这种连接方式并不是  midi 协议中规定的标准的驱动方式,在 midi 协议中,采用了隔离传输的方式,两个设备不是共地的,本文介绍的电路,由于要从 midi 接口取电,必然形成共地的连接方式,这样,直接用单片机的高电平输出 5ma 电流,低电平电流接近 0 ,就能工作,但由于不是隔离传输,传输距离不能太长。 

三、控制板电路                       

电路原理图如 3 所示。采用 51 系列单片机最小系统的标准电路,声卡 midi 接口的 1 4 脚为供电输出,分别为 vcc gnd 15 脚为 midi-in ,接单片机串行输出脚  txd 。单片机的 p0 p2 口用来扫描键盘,可提供 8x8 的键盘扫描能力。绝大多数的电子琴的键数小于64,这样的安排够用了。其他剩余的各脚,可用作工作参数预置,用来设置键值初值及所占 midi 通道号等。单片机采用 89c51 或其他兼容单片机,包括 89s51,89f51,8751,97c51 等。上拉电阻排选 10k Ω, midi接口插头是15针的d型连接器,一般都标出了其引脚标号,按标号连接即可。给出的原理图及印制版图,都是完整的,可直接使用。

 

 用通用单片机制作MIDI键盘

 3  单片机midi控制器电路图

 

用通用单片机制作MIDI键盘     

控制部分印制板图    采用 89c51 或兼容单片机

四、用玩具琴键盘改装 midi 键盘

 要分辨数十个按键的状态,最简单经济的方式就是采用矩阵式扫描键盘,其电路原理图如图5所示

用通用单片机制作MIDI键盘

键盘的电路原理图

 

键盘以扫描方式工作,具体过程:

先由 p0 口发出段选通,每次选通一段,相应段选线被置为低电平,读 p2 口,被压下的键因与段选线接通,相应的端口输入为低电平,这样就完成了一段键盘( 8 个键)的状态读入过程,做 8 次循环,每次 p0 口的段扫移位一次,就完成了 64 个键的状态读入。由于乐器演奏时经常会有多个键同时压下的状态,若不加处理, 则可能出现几个段选通过按键短接在一起的情况,从而互相干扰导致逻辑不清,因此,在每个按键上串接二极管,用来阻隔无效的段选信号(高电平),使其不起作用, 这样就可完全分辨出每个键的状态, 而不会产生混乱。

乐器键盘的扫描与响应方式也有自己的特点,在扫描到键盘值后,与前一次的键盘状态比较,如不变,则不响应,有变化,则判断是被压下还是抬起,发出相应的 midi 命令,并纪录新的状态。

扫描 8x8 键盘的程序如下,程序中的 key_number[i] 是全局数组, 用来存贮按键状态, addition 是全局变量,是设定该键盘第一个按键对应的 midi 音符的键值,全局数组和全局变量要在主程序中定义,程序中调用了前面给出的 send(cc,kk,vv) 函数:

      void scan_key()

      { uchar i,j,k,r,mmm,xu;  

k=0xfe;             // k 值为段选输出初值,第一位为 0

       for (i=0;i<8;i++)

{  p2=0xff;

          p0=k;             // 输出段选值

           k=(k<<1)+1;        // 段选标志左移,末位补 1 ,为下一循环准备

          mmm=0x01;        // 设按键查询指针初值

           r=p2;             // 读入键值

         p0=0xff;             // 关闭段选输出

           xu=r^key_number[i];         // 查询键值是否改变, xu 1 的位为产生变化的按键

           key_number[i]=r;        // 新的键值存入数组

      for (j=0;j<8;j++)           // 8 次循环, 判断具体产生变化的键

{ if((xu&mmm)!=0)           // 用指针选择被测的键

        {  if ((r&mmm)!=0)   // 判断最终情况,以确定是被压下还是释放

              {send(0x80+chnal,i*8+j+addition,40);}  // 关闭声音,键值 =i*8+j+addition

             else{send(0x90+chnal,i*8+j+addition,127);}  // 开始发声

               }

    mmm=mmm<<1;            // 指针左移, 判断下个键

   }

}

}

 

midi 协议中规定,全部的音符共 128 个,中央 c 音符对应的键值为 60 ,为适合不同键数的键盘,必须为扫描到的键值加上相应的初值,使得第一个键正是所需的音符,程序中的变量 addition 就是这个初值。

主程序的工作过程是上电复位后初始化,随后循环调用键盘扫描程序,在本人提供的程序中还加进了诸如移调,通道号设置,初始值设定等功能,全部用单片机剩余的 i/o 口对地短路来设定,以适合各种不同的键盘,详见程序文件。将程序用 c51 编译软件编译成执行代码,烧录至 51 单片机芯片,和外围器件一起装到印制板上,就制成了 midi 键盘控制板。

本人利用上述控制板,分别用玩具琴和低档电子琴的键盘,改装了多个 midi 键盘,均获成功,受到好评,现一一介绍:

1. 钢片琴:老式的阻容震荡式电子琴,等效电路如图 6 ,它是用按键选通不同阻值的电阻, 改变振荡器的频率来产生音符的,当两键同时压下,将导致电阻并联,参数混乱,还有的采用串联电阻网络 , 多键压下时 , 只有与振荡电路最近的一个电阻有效 , 而其他的被短路 , 因此都不能支持复音,只能单键演奏,不能直接改成扫描式键盘,须作较大改动。

改装时,去除所有的振荡电阻,将钢片电极剪为数段,每 8 个键为一段,每段接一位段扫,从左至右对应单片机 p0 口,从低到高。每段按键都由 8 个键组成,经二极管( 1n4148 )按顺序将每段相应的按键连在一起,接入一路位扫 (p2) ,最后一段不足 8 个可空着,共 8 路,最终电路参考图 7

用通用单片机制作MIDI键盘

钢片琴改装示意

用通用单片机制作MIDI键盘

 改装后的玩具琴键盘电路图p0p2接在控制板相应的连线上

 

2 .扫描式电子琴:这类电子琴已经做好了键盘的电路板,多数的琴线路与图 7 类似,只是键数不等,断开原来的电路,按照图 7 p0,p2 连接到控制板上即可。

注意有些型号的电子琴扫描电路的工作逻辑不一样,为充分利用其线路板,可通过修改扫描程序来实现硬件最少的改变,这需要能充分分析原琴的电路,并弄懂键盘扫描原理,有编程能力的人做,否则,须对原板的线路按照图 7 电路改装,用本人的程序来实现。有能力编程的读者,对原程序稍加修改,把键值换算正确,就可以适合各种扫描式键盘,直接与控制板连上,而不需要对键盘硬件做改动。这些琴大致有两种情况:

一种情况是每段的按键少于 8 个,这种情况下,在换算键值时,按照具体情况,把算式中的常数改一下即可;

键值 = 段号 x 常数 + 键号 +addition

另一种是二极管的方向相反, 这种情况下,扫描方式可不变, 但按键的排列会产生变化,连接控制板的段选和位选接线对调,把计算键值的算式改变,同样可不用改动键盘硬件。

键值 = 键号 x 常数 + 段号 +addition

上两个算式中的“段号”“键号”分别是扫描程序中规定的变量 i j

改装好的 midi 键盘,直接插到计算机声卡的 midi/game 接口即可,安装好支持 midi 键盘输入的音序软件,你的电脑就变成了一台集演奏,制作于一身的 midi 音乐制作设备了。使用模拟电子琴软件,就是一台电子琴,而且可以直接利用电脑的强大功能进行录音,重放,或生成 midi 格式文件, 这是普通电子琴做不到的功能。如果使用音乐制作软件, 还可以进行后期制作,在不同的 midi 通道中用不同的音色演奏,编辑合成后可达到小型乐队的效果。

在这里,列出一些 midi 软件及其官方网站,可去下载软件的演示版,利用搜索引擎也可以找到其他的下载站点,它们都是本人试用过的,支持 midi 键盘的音序软件。

midirunner    英文软件,模拟电子琴

http://web.tiscali.it/midirunner/midirunner.htm

happyeo      国产软件,模拟电子琴,有自动伴奏风格组,界面漂亮

              http://www.happyeo.com

cakewalk      音乐编辑制作软件,功能强大

http://www.cakewalk.com

bbw       自动伴奏,功能强大

http://www.pgmusic.com/

还有其他一些电子琴模拟软件,从互联网上可以查到, 只要支持 midi 口输入,都可以使用。软件安装没有特别要求,需注意的是,电脑声卡的驱动程序要装好,软件使用时, 要设置允许外部 midi 设备输入,输入口选择为 mpu401 , 输出口要选择能让声卡演奏 midi 的选项,因声卡不同,名称各异,如果在使用软波表时有延迟,可选择频率合成输出。

在本文中给出了 midi 命令简表,表中所列的控制器( cc=b+ 通道号, kk,vv ),音色切换和弯音轮命令,也是 midi 中也很常用的命令,其中有开关量, 也有模拟量,有兴趣的读者, 可以利用芯片的剩余接口,扩展测量能力,给你的 midi 键盘增加更多的功能。

本文给出的程序,没有 midi 转发功能,所以只能发出在本键盘上演奏的 midi 命令,有兴趣的读者可以自编程序,加入转发部分,就可以把几个键盘串接在一起,利用不同的 midi 通道 共用一台电脑演奏。给本控制器单独提供 5v 电源后 , 还可以接入其他的 midi 设备,比如具有 midi 输入口的电子琴或合成器,变成双键盘,使其发挥更大的效能。

配合本文电路的单片机源程序和已编译的 16 进制代码文件,随本刊光盘提供,也可到 d-originality.51.net 网站的资料区免费下载,如果有烧写 51 系列芯片的设备,就可以自行编程。

扫描二维码手机端查看