Zápisník experimentátora
Hierarchy: MIDI
Pripojenie Arduina k počítaču ako USB MIDI nie je vôbec zložité. Stačí na to len Arduino Pro Micro, ktoré obsahuje mikrokontrolér ATmega32U4. Tento mikrokontrolér možno priamo pripojiť k USB. Možno ho nastaviť tak, že sa bude správať ako MIDI zariadenie. Vďaka tomu je Arduino schopné odosielať alebo prijímať noty pomocou protokolu MIDI.
Pretože je témou tohto článku zasielanie MIDI nôt do Arduina, urobíte najlepšie, ak si najprv pustíte video. Vo videu uvidíte ukážku pripojenia Arduina k programu Ableton Live 10. V Abletone je stopa s niekoľkými notami, ktoré sú cez MIDI odoslané do Arduina. Arduino noty dekóduje a vypíše na sériový port. Sériový port funguje spolu s MIDI, takže ho môžete využiť napríklad na kontrolu toho, čo sa práve na MIDI deje. Program je nastavený tak, aby čítal MIDI správy v režime MIDI_CHANNEL_OMNI
. To umožňuje čítať MIDI správy na každom kanáli. Vo videu sú noty odosielané najprv na kanáli 1 a potom na kanáli 3.
S nastavením programu Abletom Live 10 sa nemusíte trápiť, pretože program okamžite po pripojení Arduina všetko nastaví tak, ako budete potrebovať.
Budete potrebovať tieto súčiastky:
Jediné, čo potrebujete urobiť, je nahrať do Arduina nasledujúci program a spustiť Serial Monitor.
V programe sa používajú tieto knižnice.
Program je len mierne upraveným vzorovým príkladom, ktorý je dodávaný ku knižnici. Za zmienku stojí funkcia printNoteName
, ktorá prekladá MIDI číslo noty na zrozumiteľnejšie pomenovanie. Funkcia vypočíta oktávu tak, ako ju počíta aj program Ableton Live 10. V skutočnosti ale číslo oktávy nie je nijako pevne určené a v rôznych programoch alebo rôznych hudobných nástrojoch sa môžete stretnúť aj s iným pomenovaním oktávy.
#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();
}
Zdrojový kód sa nachádza na serveri GitHub.
29.09.2019