Arduino USB MIDI in - Ableton Live 10

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ť.

Zoznam súčiastok

Budete potrebovať tieto súčiastky:

  • Arduino Pro Micro {linkArduino}

Jediné, čo potrebujete urobiť, je nahrať do Arduina nasledujúci program a spustiť Serial Monitor.

Použité knižnice

V programe sa používajú tieto knižnice.

  • MIDI Library - Univerzálna knižnica na ovládanie MIDI.
  • MIDIUSB - Predchádzajúca knižnica využíva na svoju činnosť túto knižnicu.

Program

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

Zdrojový kód sa nachádza na serveri GitHub.



Video


29.09.2019


Menu