用户工具

站点工具


learing:examples:midi

差别

这里会显示出您选择的修订版和当前版本之间的差别。


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#-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);
 +}</code>