扩展你的电脑接口
让电脑变成电子琴(声卡MIDI接口应用实例)

🏠 首页 《无线电》杂志 2004年 🔗 第6期 🔗 第28页 分类:电脑与单片机 🔗 徐斌 🔗

随着计算机技术的发展,声卡已经成为普通计算机的标准设备,通过声卡的MIDI接口,可以连接各种各样的MIDI设备。连上专供输入的MIDI键盘,再配上相应的软件,计算机就可以完成电子琴的功能。有些计算机音序软件支持用电脑键盘模拟琴键,可通过计算机键盘将音符输入计算机,有的爱好者就用电脑键盘的控制芯片改装了玩具电子琴,将其并接在计算机键盘上,称之为电脑琴,但这种控制芯片本身并不是为演奏音乐开发的,单音演奏还可以,在多个按键压下时会出错。本文将介绍如何用单片机实现通过MIDI接口连接普通玩具琴键盘与电脑,把电脑变成可支持复音的电子琴。

MIDI信号及声卡的MIDI接口

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

图1
图1 🔍原图 (425×173)

计算机声卡的MIDI/GAME接口是15针的D型连接器,其中本文制作相关的有:

图4
图4 🔍原图 (341×142)

声卡上的 MIDI/GAME接口如图2所示。

图2
图2 🔍原图 (512×377)

单片机如何产生MIDI信号

大多数51系列单片机都有串行通信控制器(UART),配合合适的晶振,正确地设置UART的工作参数,就能够自动产生所需的串行数据。使用定时/计数器1(T/C1)作为波特率发生器,将串行口设置为方式1工作状态(10位异步收发,波特率由定时器控制),使用6MHz晶振,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信号是单向的数据流,输出设备不管接收设备的状态,只是连续发出命令, 因此,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口用来扫描键盘,可提供8×8的键盘扫描能力。绝大多数电子琴的键数小于64,这样的安排够用了。其他剩余的各脚,可用作工作参数预置,用来设置键值初值及所占MIDI通道号等。单片机采用89C51或其他兼容单片机,包括89S51、89F51、8751、97C51等。上拉电阻排选10kΩ, MIDI接口插头是15针的D型连接器,一般都标出了其引脚标号,按标号连接即可。该控制板的印制板图见图4。

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

图3
图3 🔍原图 (567×455)

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

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

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

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

用玩具琴键盘改装MIDI键盘

本人利用上述控制板,用玩具琴改装了多个MIDI键盘,均获成功,方法如下:

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

图5
图5 🔍原图 (709×289)

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

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

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

图6
图6 🔍原图 (432×197)

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

本文给出了MIDI命令简表(见本期配刊光盘的“本期程序”文件夹),表中所列命令是MIDI中很常用的命令,其中有开关量, 也有模拟量,有兴趣的读者可以利用芯片的剩余接口,扩展测量能力,增加更多的功能。

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

配合本文电路的单片机源程序和已编译的16进制代码文件,见本期配刊光盘的“本期程序”文件夹,读者也可到d-originality.51.net 网站的资料区免费下载。

(文/徐斌)