这里会显示出您选择的修订版和当前版本之间的差别。
— | learing:examples:midi [2023/06/07 04:23] (当前版本) – 创建 - 外部编辑 127.0.0.1 | ||
---|---|---|---|
行 1: | 行 1: | ||
+ | ====== 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 | ||
+ | |||
+ | |||
+ | <code cpp>/* | ||
+ | MIDI note player | ||
+ | |||
+ | 使用1号脚串口发送MIDI音符数据 | ||
+ | 如果电路里连接了MIDI合成器,它将会连续播放F# | ||
+ | 的音符。 | ||
+ | */ | ||
+ | |||
+ | 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, | ||
+ | delay(100); | ||
+ | // 通道 1上的音符 (0x90), 键值 (note), 力度 (0x00): | ||
+ | noteOn(0x90, | ||
+ | delay(100); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // 播放MIDI音符 。不用检查cmd是否超过127, 数据符是否小于127 | ||
+ | void noteOn(int cmd, int pitch, int velocity) { | ||
+ | Serial.write(cmd); | ||
+ | Serial.write(pitch); | ||
+ | Serial.write(velocity); | ||
+ | }</ |