如何使用通用单片机制作MIDI键盘

发布者:山宝宝最新更新时间:2020-02-02 来源: elecfans关键字:单片机  MIDI键盘  51系列 手机看文章 扫描二维码
随时随地手机看文章

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设备连接时,必须将输出与另一设备的输入连接。

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


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

1 +5V +5 VDC

4 GND 地

12 MIDITXD MIDI 输出

15 MIDIRXD MIDI 输入

图 2 声卡上的 MIDI/GAME接口


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

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

绝大多数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命令简表

命令代码

(cc)命令说明数据kk含义及说明数据vv含义及说明

8+ 通道号关闭音符 对应的MIDI音符0-127关闭音符的速度值

9+ 通道号 开启音符对应的MIDI音符0-127 压下琴键的速度值(力度)

A+ 通道号触后压力 对应的MIDI音符0-127 对应音符的触后压力值

B+ 通道号控制器 控制器号0-77

77-7F为通道模式信息 控制器值

C+ 通道号音色切换 音色号 0-127 无该字节数据

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型连接器,一般都标出了其引脚标号,按标号连接即可。给出的原理图及印制版图,都是完整的,可直接使用。

图3 单片机MIDI控制器电路图

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


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

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

图5 键盘的电路原理图


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

先由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 就是这个初值。


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


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


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

图6 钢片琴改装示意

图7 改装后的玩具琴键盘电路图 ,P0与P2接在控制板相应的连线上


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系列芯片的设备,就可以自行编程。

关键字:单片机  MIDI键盘  51系列 引用地址:如何使用通用单片机制作MIDI键盘

上一篇:如何使用单片机驱动标准PC机键盘?C51程序详细说明
下一篇:基于AT89S52与总线技术实现小区周界防越报警系统的设计

推荐阅读最新更新时间:2024-11-10 07:22

单片机试验二:闪烁的发光二极管
一次我们的程序实在是没什么用,要灯亮还要重写一下片子,下面我们要让灯不断地闪烁,这就有一定的实用价值了,比如可以把它当成汽车上的一个信号灯用了。怎样才能让灯不断地闪烁呢?实际上就是要灯亮一段时间,再灭一段时间,也就是说要P10不断地输出高和低电平。怎样实现这个要求呢?请考虑用下面的指令是否可行: SETB P1.0 CLR P1.0 这是不行的,有两个问题,第一,计算机执行指令的时间很快,执行完SETB P10后,灯是灭了,但在极短时间(微秒级)后,计算机又执行了CLR P10指令,灯又亮了,所以根本分辨不出灯曾灭过。第二,在执行完CLR P10后,不会再去执行SETB P10指令,所以以后再也没有机会让灭了。   为了解
[单片机]
c51单片机浮点数及其汇编程序设计
在 单片机 应用系统的数据处理过程中,经常会遇到小数的运算问题,如求解BCD的增量算式、线性化处理等。因此,需要用二进制数来表示小数。表示小数的方法一般有两种,定点数和浮点数。定点数结构简单,与整数的运算过程相同,运算速度快。但随着所表示数的范围的扩大,其位数成倍增加,给运算和存储带来不便,而且也不能保证相对精度不变。浮点数的结构相对复杂,但它能够以固定的字节长度保持相对精度不变,用较少的字节表示很大的数的范围,便于存储和运算,在处理的数据范围较大和要求精度较高时,采用浮点数。 浮点数的概念 常用的科学计数法来表示一个十进制数如 l234.75=1.23475E3=1.23475 103 在数据很大或很小时,采用科学计数避免了
[单片机]
可穿戴电子产品该如何选择MCU
可穿戴设备是指人体可穿戴的微型电子产品,通常与现有配饰(如手表)集成或者取而代之。在物联网技术的支持下,该细分市场正迅猛发展,因此对于更小型化、更直观的设备的需求也在快速提升。目前,智能手表、智能眼镜以及体育与健身活动跟踪器等体现出这一发展趋势。除了消费类市场之外,医疗行业也对身体状况与功能的监控设备有着更高的需求。 可穿戴设备中最重要的电子组件就是微控制器(MCU)。由于这些MCU不但需要尺寸小,而且还需要执行更多功能,因此,集成成为了另一大要素。我们将会在本文中探讨可穿戴电子系统的不同需求、如何根据有关需求细分市场、典型可穿戴设备中的不同组件和MCU如何满足相关需求。 可穿戴设备的需求 美观:可穿戴设备需要时尚漂亮,而
[安防电子]
可穿戴电子产品该如何选择<font color='red'>MCU</font>?
单片机为什么要晶振_51单片机晶振频率
首先解释一下单片机为什么需要晶振。 晶振是什么?全称是石英晶体振荡器,是一种高精度和高稳定度的振荡器。通过一定的外接电路来,可以生成频率和峰值稳定的正弦波。而单片机在运行的时候,需要一个脉冲信号,做为自己执行指令的触发信号,可以简单的想象为:单片机收到一个脉冲,就执行一次或多次指令。 第二个问题,是不是外接晶体的值可以随意选择呢? 当然不是,这就像不同的发动机有不同的最大功率一样,每种型号的的单片机都有最大能接受的晶体频率。先说51,它能够外接的最大晶体是24M,AVR单片机能够外接的最大晶振是16M。更高级的可编程芯片,例如FPGA,ARM,可以达到几百M,不过暂时不在我们的考虑范围之内。 第三个问题,为什么5
[单片机]
<font color='red'>单片机</font>为什么要晶振_<font color='red'>51</font><font color='red'>单片机</font>晶振频率
51单片机输入接口的扩展
  51单片机的数据总线是一种公用的总线,不能被独占使用,这就要求接在上面的芯片必须具备 三态 功能,因此扩展输入接口实际上就是要找一个能够控制的、具备三态输出的芯片。      当输入设备被选通时,它使输入设备的数据线和单片机的数据总线直接接通;当输入设备没有被选通时,它隔离数据源和数据总线(即三态缓冲器为高阻抗状态)。      1.用典型电路芯片扩展输入接口      如果输入的数据可以保持比较长的时间(比如键盘),简单输入接口扩展通常使用的典型芯片为74HC244,由该芯片构成三态数据缓冲器。右图是74HC244芯片的引脚示意图。      74HC244内部共有两个四位三态缓冲器,分别以/1G和/2G作为它们的选通工作信
[单片机]
<font color='red'>51</font><font color='red'>单片机</font>输入接口的扩展
单片机反汇编是什么?
工程师编写单片机程序的时候一般是采用用汇编语言或高级语言(C或C++)编写的,这些程序代码叫原代码,当程序编写完成后,经过编译软件或编译器 的编译生成可以烧录到单片机ROM存储区里的文件,不同型号的单片机的编译器生成的文件后缀是不同的,但是常用的BIN和HEX文件,这些生成的文件在解 密行业里叫机器代码,及机器码,这样的机器码是在单片机里运行的,也可以说是只有机器能够读懂的。而反汇编即是指将这些执行文件,即机器码反编译还原成汇 编语言。但通常反编译出来的程序与原程序会存在许多不同,虽然执行效果相同,但程序代码会发生很大的变化,如果是语句比较多的汇编,一般人很难读懂,需要 自己加注释,然后去一条一条的读,是需要一定的毅力的,我曾经为
[单片机]
德州仪器通过集成的智能模拟拓展其工业级微控制器产品组合MSP430i204x
德州仪器(TI)宣布推出集成了智能模拟的全新系列MSP430工业级微控制器(MCU),以实现高准确度、高精密度并节约成本。MSP430i204x MCU可满足工业和智能电网应用所需的-40℃至+105℃宽泛温度范围要求。全新MSP430 i系列MCU非常适用于占位传感器、远程温度与压力变送器、电源监控等各种成本敏感型工业领域。   全新MSP430i204x工业级MCU具有集成的智能模拟设置,包括多达四个集成式Σ-Δ模数转换器(ADC),这些转换器所提供的准确度可在2000:1的动态范围内将智能型计量产品的误差降低至0.5%。MSP430i204x MCU也包括无需外部晶体的内部数控振荡器(DCO)。此外,小型封装尺寸还能
[单片机]
GD32 MCU内部温度传感器如何使用,以及适合哪种应用场景?
GD32 MCU全系列产品均内置温度传感器,内部温度传感器可以用于测量器件周围温度及变化,传感器的输出电压连接到ADC的第16通道,可被ADC转换成数字量。 温度传感器输出电压随温度线性变化,由于生产过程中的多样化,温度变化曲线的偏移在不同的芯片上会存在不同,但斜率基本一致,因而内部温度传感器更适合测量温度变化,即相对温度,而不太适合测量绝对温度。如果需要测量绝对温度,且对温度的精度要求并不是很高的情况下,可以使用外置温度传感器来校准不同芯片出厂的偏移误差,这样就可以用于环境温度的测量。 下面为大家介绍内置温度传感器参数以及如何使用。 内置温度传感器参数如下图所示,其中TL为温度线性误差,Avg_Slope为斜率,V25为
[单片机]
GD32 <font color='red'>MCU</font>内部温度传感器如何使用,以及适合哪种应用场景?
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved