Zápisník experimentátora
Hierarchy: MIDI
Connecting Arduino to a computer as a USB MIDI is not difficult. All you need is the Arduino Pro Micro, which includes the ATmega32U4 microcontroller. This microcontroller can be directly connected to USB. It can be set to behave like a MIDI device. This allows Arduino to send or receive notes using MIDI.
Since the topic of this article is sending MIDI notes to Arduino, it is best if you watch the video first. The video shows an example of Arduino's connection to Ableton Live 10. Ableton has a track with several notes that are sent to Arduino via MIDI. Arduino decodes the notes and writes them to the serial port. The serial port works in conjunction with MIDI, so you can use it to check what is happening on MIDI. The program is set to read MIDI messages in MIDI_CHANNEL_OMNI
mode. This allows you to read MIDI messages on each channel. In the video, notes are sent first on channel 1 and then on channel 3.
You don't have to worry about setting up Ableton Live 10, as Ableton will set everything up as you need it when you connect Arduino.
You will need the following parts:
All you need to do is load the following program into Arduino and run Serial Monitor.
The program uses these libraries.
The program is just a slightly modified example that comes with the library. Noteworthy is the function printNoteName
, which translates the MIDI note number into a better name. The function calculates the octave as calculated by Ableton Live 10. In fact, however, the octave number is not fixed in any way, and you may encounter a different octave name in different programs or different musical instruments.
#include <MIDI.h>
#include <midi_UsbTransport.h>
static const unsigned sUsbTransportBufferSize = 16;
typedef midi::UsbTransport<sUsbTransportBufferSize> UsbTransport;
UsbTransport sUsbTransport;
MIDI_CREATE_INSTANCE(UsbTransport, sUsbTransport, MIDI);
const char *notenames[] = {"C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"};
void printChannel(int inChannel)
{
Serial.print("[");
Serial.print(inChannel);
Serial.print("] ");
}
void printNoteName(int note)
{
int octave = note / 12;
int nnumber = note % 12;
Serial.print(notenames[nnumber]);
Serial.print(octave - 2);
}
void handleNoteOn(byte inChannel, byte inNumber, byte inVelocity)
{
printChannel(inChannel);
printNoteName(inNumber);
Serial.print(" NoteOn ");
Serial.print(inNumber);
Serial.print("\tvelocity: ");
Serial.println(inVelocity);
}
void handleNoteOff(byte inChannel, byte inNumber, byte inVelocity)
{
printChannel(inChannel);
printNoteName(inNumber);
Serial.print(" NoteOff ");
Serial.print(inNumber);
Serial.print("\tvelocity: ");
Serial.println(inVelocity);
}
void setup() {
Serial.begin(115200);
while (!Serial);
MIDI.begin(MIDI_CHANNEL_OMNI);
MIDI.setHandleNoteOn(handleNoteOn);
MIDI.setHandleNoteOff(handleNoteOff);
Serial.println("Arduino MIDI note detector.");
}
void loop() {
MIDI.read();
}
The source code is located on the GitHub server.
30.09.2019