Arduino内置教程-通讯-Midi

MIDI 音符播放器

  • 这个教程展示怎么从Arduino或者Genuino开发板通过一个5极DIN电缆来发送MIDI音符到一个MIDI乐器。

  • MIDI,乐器的数字接口,一个用于控制合成器,音序器,和其他音乐设备的协议。MIDI设备通常分为两大类:控制器(基于人的动作来产生MIDI信号的设备)和合成器(包括采样器,音序器等等)。后者输入MIDI数据,就会产生声音,光,或者其他的东西。

  • MIDI使一个串口协议,可以每秒钟操作31,250字节。开发板的内置串口接口(所有在Mega上的串口接口都一样)可以在那个速率上发送数据。

  • MIDI字节被分成两类型:命令字节和数据字节。命令字节通常是大于128,或者0x80到0xFF(十六进制)。数据字节通常少于127,或者0x00到0x7F(十六进制)。命令包括类似note on, note off, pitch bend等等。数据字节包括弹奏音符的音高,速率,或者,音符音量,弯音等等。更多细节,查看MIDI特性或者MIDI Protocol Guides on the Web

  • MIDI数据通常用十六进制符号表示,因为MIDI音阶和乐器被分成16组。

  • 更多介绍,看introduction to MIDI或者这个例子

硬件要求

  • Arduino or Genuino Uno
  • MIDI母座
  • 2 220 ohm 电阻
  • 连接线
  • MIDI 启动设备(可选, 测试用)

电路
根据MIDI说明书,所有MIDI连接器都是母座。这里是怎样把连接器连接到开发板。

  • MIDI插座pin5通过220 ohm电阻连接到数字引脚pin1。
  • MIDI插座pin2连接到地。
  • MIDI插座pin4通过220 ohm电阻连接到+5V。

请输入图片描述

原理图

请输入图片描述

样例代码

注意:如果你用带有ATmega3U4的开发板(如DUE或者Leonardo),请根据下面程序用Serial1来替换Serial。

/*
 MIDI note player

 This sketch shows how to use the serial transmit pin (pin 1) to send MIDI note data.
 If this circuit is connected to a MIDI synth, it will play
 the notes F#-0 (0x1E) to F#-5 (0x5A) in sequence.


 The circuit:
 * digital in 1 connected to MIDI jack pin 5
 * MIDI jack pin 2 connected to ground
 * MIDI jack pin 4 connected to +5V through 220-ohm resistor
 Attach a MIDI cable to the jack, then to a MIDI synth, and play music.

 created 13 Jun 2006
 modified 13 Aug 2012
 by Tom Igoe

 This example code is in the public domain.

 http://www.arduino.cc/en/Tutorial/Midi

 */

void setup() {
  //  Set MIDI baud rate:
  Serial.begin(31250);
}

void loop() {
  // play notes from F#-0 (0x1E) to F#-5 (0x5A):
  for (int note = 0x1E; note < 0x5A; note ++) {
    //Note on channel 1 (0x90), some note value (note), middle velocity (0x45):
    noteOn(0x90, note, 0x45);
    delay(100);
    //Note on channel 1 (0x90), some note value (note), silent velocity (0x00):
    noteOn(0x90, note, 0x00);
    delay(100);
  }
}

//  plays a MIDI note.  Doesn't check to see that
//  cmd is greater than 127, or that data values are  less than 127:
void noteOn(int cmd, int pitch, int velocity) {
  Serial.write(cmd);
  Serial.write(pitch);
  Serial.write(velocity);
}

[Get Code]

更多

  • serial.begin()
  • for() loop
  • ASCIITable - 示范使用Arduino的高等的串口输出函数。
  • Dimmer - 移动鼠标来改变LED灯的亮度
  • Graph - 发送数据到电脑,然后在Processing里画出它的图表。
  • MultiSerialMega - 使能Arduino Mega上2个串口。
  • PhysicalPixel - 通过从Processing或者Max/MSP发送数据到Arduino上,使LED开关。
  • ReadASCIIString - 分析整数里一个用逗号分隔的字符串,来使一个LED灯褪色。
  • SerialCallResponse - 通过一个呼-应的方法(握手)来发送多个变数
  • SerialCallResponseASCII - 通过一个呼-应的方法(握手)来发送多个变数,并在发送前解码(ASCII)这些数值。
  • SerialEvent - 使用SerialEvent()函数
  • VirtualColorMixer - 从Arduino发送多个变数到你的电脑,然后在Processing或者Max/MSP上读取这些数据

标签: arduino内置教程, arduino midi