用户工具

站点工具


learing:examples:midi

MIDI Note Player(MIDI音乐播放器)

这个教程演示了使用标准5口的DIN线从OCROBOT控制器发送MIDI音符到MIDI乐器。

MIDI是乐器数字接口,是合成器、音序器和别的乐器的有效的协议标准。MIDI设备一般由两大类组成:控制器(也就是基于人的动作产生MIDI信号的设备)和合成器(包括采样器,音序器等等)。后者接收MIDI信数据并且发声,发光或者其它的效果。

MIDI是通信速率在31250的串口协议。arduino板内置的串口(MEGA板所有的串口)可以以这个波特率发送数据。

MIDI字符分为两种类型:命令符和数据符。命令符是128或者更大的,或者16进制从0x80 到 0xFF 。数据符是127以下的,16进制的0x00 到 0x7F。命令包含了音符开,音符关,音频范围等等。数据符包含要播放的音高,音符力度或者音量,音频的总数等等。更多的详细信息可以去网页上查找MIDI协议说明。

MIDI数据通常以16进制表示,因为MIDI音色库和MIDI设备是16通道的

硬件要求

Arduino板
MIDI母头
220欧姆电阻
连接线
MIDI 设备 (可选,测试用)
导线

All MIDI connectors are female, by definition of the MIDI spec. Here's how to wire the connector to the board: 根据MIDI说明书上说的,所有的MIDI接头都是母头,下面是连线方式。

数字脚1链接到MIDI接口5号脚 MIDI接头2号脚接gnd MIDI MIDI接头4号脚接220欧姆电阻连接到+5v

代码

如果你使用了ATMEGA32U4核心的DUE或者LEONARDO板,替换下面程序里的serial为serial1

/*
 MIDI note player
 
使用1号脚串口发送MIDI音符数据
如果电路里连接了MIDI合成器,它将会连续播放F#-0 (0x1E) 到 F#-5 (0x5A)
的音符。
*/
 
void setup() {
  //  设置MIDI波特率 :
  Serial.begin(31250);
}
 
void loop() {
  // 播放从 F#-0 (0x1E) 到 F#-5 (0x5A)的音符 
  for (int note = 0x1E; note < 0x5A; note ++) {
    //通道 1上的音符 (0x90), 键值 (note), 力度(0x45):
    noteOn(0x90, note, 0x45);
    delay(100);
    // 通道 1上的音符 (0x90), 键值 (note), 力度 (0x00):
    noteOn(0x90, note, 0x00);
    delay(100);
  }
}
 
// 播放MIDI音符 。不用检查cmd是否超过127, 数据符是否小于127 
void noteOn(int cmd, int pitch, int velocity) {
  Serial.write(cmd);
  Serial.write(pitch);
  Serial.write(velocity);
}
learing/examples/midi.txt · 最后更改: 2017/04/07 10:03 (外部编辑)