音频应用

 找回密码
 快速注册

QQ登录

只需一步,快速开始

阅读: 11289|回复: 2

[键盘] Arduino模拟MIDI键盘

[复制链接]

13

帖子

0

听众

414

积分

音频应用新手发布

Rank: 1

积分
414
发表于 2019-9-26 23:13:16 | 显示全部楼层 |阅读模式
音频应用公众号
今天介绍一种用Arduino模拟MIDI键盘的方法。在具体实现之前,我先介绍一下MIDI和MIDI键盘。

简介
MIDI(Musical Instrument Digital Interface)中文是乐器数字接口,通过MIDI协议可以解决电声乐器之间的通信,MIDI也是一种广泛应用于编曲的音乐格式。
fa7819e3ca3105ad76b0afb42293517d.jpg
MIDI传输的不是声音信号,而是一些指令,比如音色、音量、通道以及一些其他的参数,合成器接收到这些指令后会根据这些指令合成声音。MIDI规定了16个轨道,也表示MIDI支持16个轨道同时发声。MIDI键盘可以通过MIDI接口发出MIDI指令,但有些MIDI键盘需要外接电脑或合成器才能发出声音。通过MIDI协议我们就可以用一个键盘模拟多种乐器的音色。

MIDI指令
MIDI指令需要遵循MIDI协议,具体的内容可以去查阅《MIDI 1.0版的细节规定》,我在这里只是简单介绍一下用到的部分。一条MIDI指令通常由三个字节构成,第一个字节为状态字节,第二第三字节为数据字节,我们要做的MIDI键盘实际就是给电脑或合成器发送这三个字节的设备。那就必须要讲一下这三个字节的格式。
首先是状态字节的格式,状态字节的8个位可以分为3部分,最高位是状态识别位,这一位为1说明这1字节为状态位。第6、5、4这3位用于表示命令,第3、2、1、0这4位用于MIDI协议中16个轨道的选择。

上表列举了一些状态字节的格式,可以跟据这个表编写状态字节,例如1001 0000就表示第1轨道开始演奏。
数据字节的8个位可以分为两部分,同样最高位用于状态识别,当最高位为0说明这是数据字节。剩余的7位是资料位,共可以表示128个数值。这128个数值可以用来表示音调或者按键力度或者其他数据。
当表示音调时可以查看文章后面附带的MIDI音符代码表。
之前讲过一条MIDI指令是由一个状态字节和两个数据字节组成的,状态字节的几种格式我在之前已经给出对照表了,对于数据字节目前只知道能表示128个数,但是具体后面跟着的两个数据字节应该表示什么还需要看第一个状态字节表示什么功能。
上面的功能表列出来了8种功能,在这里我只说一下其中两种的格式,剩余的大家可以自行查阅MIDI指令状态位与数据位的关系了解一下。Note Off为停止发音,后面跟的两个数据位依次表示音调和音量。Note On为开始发音,后面两位数据位依次为音调和音量。
5ce626d5854f0fa8a019c0891fe39ccf.png
具体实现
通过上面的简单介绍我们已经知道了应该向电脑发送什么数据了,接下来就应该考虑如何将数据从Arduino发送到电脑。
MIDI设备一般带有MIDI接口和USB接口,但是由于我的电脑上没有MIDI接口,所以MIDI指令传输就依靠开发板自带的USB接口了。这里我用的开发板是Arduino UNO,这一块开发板上的USB接口应该是通过ATmega8U2或者ATmega16U2连接到主控芯片的,我们可以通过更换芯片里的固件,将开发版配置为一个HID MIDI设备。
但由于部分开发板生产厂家为节省成本,选择了CH340代替了这两块芯片,这种开发板是不能进行上述操作的,由于我目前的开发板上的芯片就是CH340的所以就要选择其他方法。
然后我选择通过两个软件让电脑将开发板识别为一个MIDI设备。首先我们需要安装一个名为loopMIDI的软件。
29a0a7e27cd4076ce5f73ec7427048d8.png
这个软件可以可以在电脑上创建一个MIDI端口,安装好后我们打开这个软件。
482fad90700a1adae7d6a3c686befb3f.png
点击界面左下角的“+”号,我们就可以创建一个MIDI端口了。
bdc502b0f33f44c854f7490f11ec9c44.png
如图所示,我们已经创建了一个名为loopMIDI Port的MIDI接口。不过由于我的Arduino开发板上带的是CH340,所以我还需要将CH340传输过来的信号转换为符合MIDI协议的信号。我们可以通过Hairless MIDI这个软件实现这个转换。
d3c66f8e1d0221369cddfe72fe8ee787.png
这个软件可以前往GitHub下载。
安装好这两个软件后就可以开始编写Arduino的程序了。Arduino程序的编写就很简单了,我们只需要开启串口通信,然后把我们需要的三个字节的MIDI命令发送出去就可以了。

例如这段程序就是发送MIDI指令的一个例子,这条指令的意思就是第一个轨道发B音调。程序写好后我们就要测试一下电脑能否成功接收我们发送的MIDI指令。首先我们打开loopMIDI开启我们虚拟的MIDI端口,然后再打开Hairless MIDI这个软件。
886bb47b359709120ce4968a8ccbad95.png
在Serial port这一栏我们选择开发板的端口号,在MIDI Out这一栏我们选择由loopMIDI创建的MIDI端口。选择好后我们再勾选Serial<—>MIDI Bridge On和Debug MIDI messages这两个选项,我们就可以接收Arduino发来的消息了。
8fa849e2f5e277c7f943dd32a273b469.png
如上图所示,我们就成功接收到了Arduino发送来的MIDI指令。我们可以给Arduino外接一个矩阵键盘,并给每个按键设置一条MIDI指令,当按下按键后就发送指令。
最后我们需要安装一个音乐软件来合成声音。可以选择的音乐软件有很多,这里我选择的是EOPmidi这个软件。
51b913cfd408ff9fbd61ad55f451f1dc.png
这个软件可以模拟钢琴的音色,操作也比较简单,我们也可以选择其他更全面的音乐软件比如FL Studio等等。
我们首先打开EOPmidi,它的界面是一个键盘的形状。

我们首先要开启loopMIDI和Hairless MIDI这两个软件将Arduino模拟为一个MIDI键盘。然后点击EOPmidi界面右上角的倒三角标志,点击选项。在设置界面我们就可以看到我们模拟的MIDI键盘了。
aea02fb8c56739a007c3ac29edfa9b5f.png
将右边的OFF开关打开后就连接上我们的MIDI键盘了。
e0103e0e86f8ee99a577658201c290c8.png
开启后关闭设置界面,现在当我们按下设置好的按键后,电脑就会发出对应的音调了。MIDI键盘的制作到这里就完成了。

6639e0df083b7e55245da14b06216334.png
10fabcd7949c73eb9c7688d08f17b2a0.png
关注音频应用官网公众号免费发布硬件产品

13

帖子

0

听众

414

积分

音频应用新手发布

Rank: 1

积分
414
 楼主| 发表于 2019-9-26 23:19:51 | 显示全部楼层
MIDI音符代码表
编号 二进制音符代码 十六进制音符代码 所在的音阶 音调
0 0000000 00 -1 C
1 0000001 01 -1 C#
2 0000010 02 -1 D
3 0000011 03 -1 D#
4 0000100 04 -1 E
5 0000101 05 -1 F
6 0000110 06 -1 F#
7 0000111 07 -1 G
8 0001000 08 -1 G#
9 0001001 09 -1 A
10 0001010 0A -1 A#
11 0001011 0B -1 B
12 0001100 0C 0 C
13 0001101 0D 0 C#
14 0001110 0E 0 D
15 0001111 0F 0 D#
16 0010000 10 0 E
17 0010001 11 0 F
18 0010010 12 0 F#
19 0010011 13 0 G
20 0010100 14 0 G#
21 0010101 15 0 A
22 0010110 16 0 A#
23 0010111 17 0 B
24 0011000 18 1 C
25 0011001 19 1 C#
26 0011010 1A 1 D
27 0011011 1B 1 D#
28 0011100 1C 1 E
29 0011101 1D 1 F
30 0011110 1E 1 F#
31 0011111 1F 1 G
32 0100000 20 1 G#
33 0100001 21 1 A
34 0100010 22 1 A#
35 0100011 23 1 B
36 0100100 24 2 C
37 0100101 25 2 C#
38 0100110 26 2 D
39 0100111 27 2 D#
40 0101000 28 2 E
41 0101001 29 2 F
42 0101010 2A 2 F#
43 0101011 2B 2 G
44 0101100 2C 2 G#
45 0101101 2D 2 A
46 0101110 2E 2 A#
47 0101111 2F 2 B
48 0110000 30 3 C
49 0110001 31 3 C#
50 0110010 32 3 D
51 0110011 33 3 D#
52 0110100 34 3 E
53 0110101 35 3 F
54 0110110 36 3 F#
55 0110111 37 3 G
56 0111000 38 3 G#
57 0111001 39 3 A
58 0111010 3A 3 A#
59 0111011 3B 3 B
60 0111100 3C 4 C
61 0111101 3D 4 C#
62 0111110 3E 4 D
63 0111111 3F 4 D#
64 1000000 40 4 E
65 1000001 41 4 F
66 1000010 42 4 F#
67 1000011 43 4 G
68 1000100 44 4 G#
69 1000101 45 4 A
70 1000110 46 4 A#
71 1000111 47 4 B
72 1001000 48 5 C
73 1001001 49 5 C#
74 1001010 4A 5 D
75 1001011 4B 5 D#
76 1001100 4C 5 E
77 1001101 4D 5 F
78 1001110 4E 5 F#
79 1001111 4F 5 G
80 1010000 50 5 G#
81 1010001 51 5 A
82 1010010 52 5 A#
83 1010011 53 5 B
84 1010100 54 6 C
85 1010101 55 6 C#
86 1010110 56 6 D
87 1010111 57 6 D#
88 1011000 58 6 E
89 1011001 59 6 F
90 1011010 5A 6 F#
91 1011011 5B 6 G
92 1011100 5C 6 G#
93 1011101 5D 6 A
94 1011110 5E 6 A#
95 1011111 5F 6 B
96 1100000 60 7 C
97 1100001 61 7 C#
98 1100010 62 7 D
99 1100011 63 7 D#
100 1100100 64 7 E
101 1100101 65 7 F
102 1100110 66 7 F#
103 1100111 67 7 G
104 1101000 68 7 G#
105 1101001 69 7 A
106 1101010 6A 7 A#
107 1101011 6B 7 B
108 1101100 6C 8 C
109 1101101 6D 8 C#
110 1101110 6E 8 D
111 1101111 6F 8 D#
112 1110000 70 8 E
113 1110001 71 8 F
114 1110010 72 8 F#
115 1110011 73 8 G
116 1110100 74 8 G#
117 1110101 75 8 A
118 1110110 76 8 A#
119 1110111 77 8 B
120 1111000 78 9 C
121 1111001 79 9 C#
122 1111010 7A 9 D
123 1111011 7B 9 D#
124 1111100 7C 9 E
125 1111101 7D 9 F
126 1111110 7E 9 F#
127 1111111 7F 9 G
关注音频应用官网公众号免费发布硬件产品
回复 支持 反对

使用道具 举报

269

帖子

2

听众

2276

积分

音频应用注册会员

Rank: 2Rank: 2

积分
2276
发表于 2019-9-27 19:23:21 来自手机音频应用 | 显示全部楼层
分享,谢谢楼主
关注音频应用官网公众号免费发布硬件产品
回复 支持 反对

使用道具 举报

高级模式 自动排版
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

小黑屋|手机版|Archiver|音频应用 ( 鄂ICP备16002437号-6)

Powered by Audio app

快速回复 返回顶部 返回列表