Arduino USB MIDI in - Ableton Live 10

Zápisník experimentátora

Hierarchy: MIDI

Připojení Arduina k počítači jako USB MIDI není vůbec složité. Stačí na to jen Arduino Pro Micro, které obsahuje mikrokontrolér ATmega32U4. Tento mikrokontrolér lze přímo připojit k USB. Lze ho nastavit tak, že se bude chovat jako MIDI zařízení. Díky tomu je Arduino schopné odesílat nebo přijímat noty pomocí protokolu MIDI.

Protože je tématem tohoto článku zasílání MIDI not do Arduina, uděláte nejlépe, pokud si nejprve pustíte video. Ve videu uvidíte ukázku připojení Arduina k programu Ableton Live 10. V Abletonu je stopa s několika notami, které jsou přes MIDI odeslány do Arduina. Arduino noty dekóduje a vypíše na sériový port. Sériový port funguje spolu s MIDI, takže jej můžete využít například na kontrolu toho, co se právě na MIDI děje. Program je nastaven tak, aby četl MIDI zprávy v režimu MIDI_CHANNEL_OMNI. To umožňuje číst MIDI zprávy na každém kanálu. Ve videu jsou noty odesílány nejprve na kanálu 1 a poté na kanálu 3.

S nastavením programu Ableton Live 10 se nemusíte trápit, protože program okamžitě po připojení Arduina vše nastaví tak, jak budete potřebovat.

Seznam součástek

Budete potřebovat tyto součástky:

  • Arduino Pro Micro {linkArduino}

Jediné, co potřebujete udělat, je nahrát do Arduina následující program a spustit Serial Monitor.

Použité knihovny

V programu se používají tyto knihovny.

  • MIDI Library - Univerzální knihovna na ovládání MIDI.
  • MIDIUSB - Předchozí knihovna využívá na svou činnost tuto knihovnu.

Program

Program je jen mírně upraveným vzorovým příkladem, který je dodáván ke knihovně. Za zmínku stojí funkce printNoteName, která překládá MIDI číslo noty na srozumitelnější pojmenování. Funkce vypočte oktávu tak, jak ji počítá i program Ableton Live 10. Ve skutečnosti ale číslo oktávy není nijak pevně určeno a v různých programech nebo různých hudebních nástrojích se můžete setkat i s jiným pojmenování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 se nachází na serveru GitHub.



Video


30.09.2019


Menu