51单片机MIDI键盘
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
TR1=1;
//T/C1 开始计数//
}
由 51 系列单片机 UART 的工作方式可推知,当外部晶振的频率为 6MHz 的倍数时, 正确地设置特殊功能寄存器,可以精确的发生 31.25K 的波特率,见表 5-3:
表 5-3 用不同的晶振频率产生波特率 31.25K 的寄存器值
晶振频率 TMOD
SCON PCON
图 5-1 标准的 MIDI 接口电路 典型的 MIDI 系统连接方式如 图 5-2 所示,每一个数据链路里, 最多可以支 持 16 个 MIDI 设备,各自设置好所占用的 MIDI 通道, 不能重复。
图 5-2 典型的 MIDI 联接方式示意图
绝大多数的 PC 机的声卡,都是带有 MIDI 接口的,但并不是使用 MIDI 协议中规定的 5DIN 插孔, 而是与游戏杆接口共用一个 15 针 D 型插座,其定义如表 5-1 。插座的 12 脚 为 MIDI OUT,15 脚为 MIDI IN。
5.2.1 如何产生符合 MIDI 协议的串行信号
绝大多数51系列单片机都有串行通讯控制器(UART),配合合适的晶振,正确地设 置 UART 的工作参数,就能够自动产生所需的串行数据。
在51单片机做串行通讯时,可以用定时/计数器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;//
表 5-1 MIDI/GAME 接口定义
管脚 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
名称 +5V
/B1 X1 GND GND Y1 /B2 +5V +5V /B4 X2 MIDITXD Y2 /B3 MIDIRXD
注释 +5 VDC Button 1 Joystick 1 - X Ground Ground Joystick 1 - Y Button 2 +5 VDC +5 VDC Button 4 Joystick 2 - X MIDI 输出 Joystick 2 - Y Button 3 MIDI 接收
5.1.3 MIDI 命令介绍
MIDI 命令包括如下几类:
1 通道音符信息――包括音符的发声,停止,音量等 2 通道模式信息――MIDI 控制器信息 3 系统实时信息――MIDI 音序器使用的同步信息 4 系统普通信息――音序器信息 5 系统高级信息――一般用于 MIDI 协议扩展, 由设备生产厂家特别规定的信息。
5.1 MIDI 键盘介绍
MIDI 键盘是一种通过键盘将音乐输入电脑或其他设备的装置,它包括标准电子乐 器键盘、键盘扫描装置和信号产生电路,扫描从键盘上得到的音符,力度等信息,向后级设 备发出标准的 MIDI 信号,驱动电脑或标准的 MIDI 音序器发声。实现 MIDI 键盘, 需要用 单片机扫描键盘信息,包括按键的压下,抬起,力度等, 并按照 MIDI 协议发送信号。
5.2.2 键盘扫描
电子乐器的键盘, 动辄就是数十个琴键,而且经常出现多个按键同时压下的情况, 单片机系统必须能够准确判断哪个键被压下,哪个键保持,哪个键被释放,考虑到经济性, 矩阵式动态扫描是乐器键盘最理想的工作方式,图 5-3 给出了 64 键无力度感应的键盘原 理图,配合 89c51 单片机, 能很好的完成 64 键的扫描工作。
对应的 MIDI 音符 0-127 对应的 MIDI 音符 0-127 对应的 MIDI 音符 0-127 控制器号 0-77 77-7F 为通道模式信息 音色号 0-127 该通道全部键盘的触后压力 弯音轮低位数据
忽略
数据 vv 含义及说明
关闭音符的速度值 压下琴键的速度值(力度) 对应音符的触后压力值 控制器值
当该音符演奏结束,按键被以 40(16 进制)的值释放, 设备将发出如下命令: 83,3C,40
在对释放速度不检测的设备中, 一般以 40(16 进制)为默认值。
当 9 号命令中, 速度值为 0 时, 其效果等价于以 40 的值释放按键。
5.2 如何用单片机实现 MIDI 键盘功能
用 51 系列单片机实现 MIDI 键盘功能,实际上就是要解决 3 个方面的问提,那就是: 如何产生符合 MIDI 协议的串行通讯数据,如何扫描键盘和实现力度响应,如何适当的进行 电器连接,本节将介绍前两个问题, 最后一个问题将放在下一节介绍。
无该字节数据 无该字节数据 弯音轮高位数据
忽略
说明:标准乐器中的中央 C,对应 MIDI 音符的 60 号键值。 通道号为 1-16, 而在命令中表示为 0-F,为习惯的号减1 本表中B号控制器命令及F号命令,对应数十种控制器的操作,需另作详细说明,
由于本章介绍的 MIDI 键盘中很少用到,故忽略。
用于 MIDI 键盘的命令,包括“通道音符信息”和“通道模式信息”,其命令包括如下 3 部分:
cc kk vv cc,kk,vv 分别代表一个字节(8bit)的数据,依次发送。 cc 是命令类型代码, 其高 4 位表示命令的类型,范围从 16 进制数 8-F, 低 4 位是 设备占用的通道号,范围是0-F。 kk 是键值,在“通道音符信息”中代表演奏的琴键,范围 0-127,对应 128 个琴键。 在某些控制信息中, 并不需要含有按键的信息, 则 kk 另有他用。 vv 在“通道音符信息”中,代表音量值,范围从 0 -127,在其他信息中另有规定。
5.1.1 MIDI 协议简介
MIDI 协议是一种特殊的串行通讯协议,是专门为数字音乐传输制订的,因此,它 有着自己的特点:每一条线路允许连接 16 个 MIDI 设备,每个设备有各自的通道号,数据 流是单向的,不进行应答,演奏设备只管发出 MIDI 命令而不检测接收设备是否准确收到, 由于音乐自身的特点,接收设备判断收到正确的信号则响应,而错误的信号将被忽略-音乐 演奏时,允许丢掉音符,但不能搞乱节奏。
常用的 MIDI 命令见表 5-2。
表 5-2 命令代码 (cc) 8+ 通道号 9+ 通道号 A+ 通道号 B+ 通道号
C+ 通道号 D+ 通道号 E+ 通道号 F
MIDI 命令简表
命令说明
数据 kk 含义及说明
关闭音符 开启音符 触后压力 控制器
音色切换 通道压力 弯音轮 系统普通 信息、实 时信息、 及高级信 息代码
MIDI 协议规定, MIDI 信号以波特率 31.25K 的串行异步信号传输,每字节数据包 括 10 位,一个起始位,8 位数据, 一个停止位,无校验位。每个音符的开(或关)命令有 3 个字节,经计算,不到 1mS 即可传输一个音符的开关命令,一条 MIDI 命令一般为 1-3 字节, 连续发送。
TL1
6MHz
0x21
0x50
0x80
0xFF
12MHz
0x21
0x50
0x80
0xFE
0x00
0xFF
24MHz
0x21
0x50
Baidu Nhomakorabea
0x80
0xFD
0x00
0xFE
TH1 0xFF 0xFE 0xFF 0xFD
0xFE
上一节已经介绍了 MIDI 命令的格式,发送一个音符的开关命令,可调用如下函数:
void send(uchar cc,kk,vv)
键盘在演奏时,有三个动作,被压下、保持压下状态、被释放,在被压下并保持时, 每次扫描都会判断出该键的压下状态,但在实际工作中, 并不需要每次扫描到这种状态都 发出 MIDI 命令,因此,要进行按键状态的存贮,每次扫描后,与存贮的状态比较,发现有 改变,再作相应的处理,并将新的状态存入。
在 MIDI 协议中, 规定了包括按键的压下/释放,力度,触后压力,各种 MIDI 控制 器等命令和一些系统信息。实际上,存在数种不同的 MIDI 协议,1991 年制订了 通用 MIDI 协议(GM)后 ,经实践检验, 并不能解决所有的问题,于是 Roland 和 Yamaha 两个公司 分别开发了自己的协议称为 GS 和 XG, 试图更好的解决问题,但这两个协议不完全兼 容。这几种协议中不兼容部分, 主要是针对比较高级的 MIDI 应用,一般性的键盘和 控制命令是兼容的。
举例: 当 4 号通道的设备要求音序器演奏中央 C,音量最大, 则该设备将发出如下命令 (16 进制):
93,3C, 7f (逗号不是命令内容) 命令中,第一字节为 93, 9 为命令号(开启),3 为通道号(4-1),
第二字节为 3C, 是中央 C(60)的 16 进制值 第三字节为 7F, 是最大音量 127 的 16 进制值
5.1.2 MIDI 接口及物理层链路介绍 与 RS232 口不同的是,MIDI 信号用电流的差异代表不同的逻辑,MIDI 设备的输出 与另一台接收设备的输入连成一个回路,在这条回路里,5mA 的电流代表逻辑“0”,0mA 代表逻辑“1”,标准的 MIDI 设备之间,采用光隔离连接,设备之间没有握手信号。 标准的 MIDI 接口电路图见 图 5-1,按照 MIDI 协议,MIDI 信号的输入输出均采 用 5 针的 DIN 插头,每个设备的输出接另一个设备的输入,在多个设备接入的系统里,每 个中间设备要负责转发接在其输入口的 MIDI 信号。
{ TR1=1;
//开计数器//
SBUF=cc; //发送 cc// while(TI==0); //等待发送结束//
TI=0;
//清发送标志//
SBUF=kk;
while(TI==0);
TI=0;
SBUF=vv;
while(TI==0);
TI=0;
TR1=0;
}
参数 cc,kk,vv 的含义已在 MIDI 协议中介绍,不再重复。 对于 1 字节和 2 字节命令,只需将上述函数简化即可,由于在演奏中主要执行的都是 3 字节命令,为提高运行速度,不在发送函数中判断命令长度,因为那样做的话固然可以减 少一两个函数,但让单片机过多执行不必要的代码,得不偿失。
图 5-3 中, 每行按键为连续的 8 个键,称为一个段,每段的 8 个键通过二极管共同 接在一根段选线上,按键的另外一端,分别按顺序接在各自的读入线(51 单片机的 P2 口) 上,段选线(P0)为单片机输出,为低电平有效,工作时,单片机向 P0 口某根线发出低电平, 选中该段,然后读 P2 口,当有相应的按键被压下时,该输入线与段选线接通, 通过二极 管拉到低电平,单片机即可判断是该段的哪一个按键被压下。改变段选线,则判断另一段的 按键。做一个 8 次循环的函数,每一次循环改变一次段选线,每次读入 8 个键值,则可完成 64 个按键的扫描工作。图中的二极管非常重要,它们起到阻隔无效段选线的高电平的作用, 如不加二极管,在有按键压下时,将发生有效的段选线(低电平)与无效的段选线(其他线 的高电平)通过按键短路的情况,将产生混乱。
第5章 用通用单片机实现 MIDI 键盘
MIDI (Musical Instrument Digital Interface) 是乐器数据接口,是数字化电声乐器的语 言,随着计算机技术的发展,大量的用数字化电声乐器制作的音乐作品深入人们的生活,很 多人把 MIDI 当成数字化电子音乐的代名词,由于 MIDI 格式的音乐是以音符的形式存贮, 具有格式统一, 修改方便,可分音轨创作等特点,使得 MIDI 在音乐创作中越来越普及。 当今世界,个人电脑的配置越来越高, 功能也越来越强大,声卡也成了个人电脑的标准配 置,绝大多数的声卡上,除各种音频信号的接口之外,都配有一个 15 针的 MIDI/GAME 接 口,可以接游戏杆和 MIDI 设备,在 MIDI 设备中,使用最频繁,灵活的,莫过于 MIDI 键盘,一台带声卡的电脑,配上 MIDI 键盘,就可以实现中高档电子琴的功能,使用合适的 软件,还可以用来进行音乐的创作。本章就介绍如何用 51 系列单片机制作 MIDI 键盘。