Arduino a MIDI out

Zápisník experimentátora

Hierarchy: MIDI

V tomto článku si ukážeme, jak můžeme pomocí Arduina ovládat hudební nástroje. Budeme na to používat MIDI protokol, což je sériový protokol, pomocí kterého se posílají zprávy hudebním nástrojem. Ty podle zaslané zprávy vědí, jakou notu mají právě zahrát. Já budu v ukázce používat syntezátor Korg Volca FM. Můžete na to ale použít libovolný hudební nástroj, který má MIDI vstup.

MIDI

MIDI je zkratka pro Musical Instrument Digital Interface. Podrobněji si můžete MIDI prostudovat na Wikipedii. Pro nás, jako uživatelé Arduina, stačí vědět, že k odesílání zpráv MIDI můžeme používat stejný sériový protokol, pomocí kterého komunikujeme s počítačem. Důležitá je pouze nastavená rychlost, která je 31250 b/s.

Na odesílání MIDI zpráv existuje knihovna Arduino MIDI Library. Můžete si ji nainstalovat pomocí Správce knihoven. Knihovna obsahuje všechny potřebné funkce pro odesílání not do syntetizátoru. Nemusíte se starat o podrobnosti implementace samotného protokolu MIDI. Proto se můžeme soustředit jen na samotnou tvorbu hudby.

Zapojení

MIDI používá DIN konektor. Zapojení MIDI out je jednoduché. Použijete jeden rezistor, který se připojí na pin 4 konektoru. Pin 5 připojíte přímo na TX v Arduinu. Původní schéma používá rezistor 220R. Já jsem použil 330R. V dnešní době to tak můžeme zapojit, protože na druhé straně bude mít připojen hudební nástroj optoizolátor a naše část elektrického obvodu tvoří napájení LED diody v optoizolátoru. I s rezistorem 330R bude dioda v integrovaném obvodu dostatečně přenášet signál z Arduina do hudebního nástroje.

V článku najdete několik fotografií zapojení na breadboardu, podle kterých si můžete stejný elektrický obvod zapojit. MIDI in si zapojíme v některém dalším pokračování tohoto článku.

Takové zapojení elektrického obvodu se používá tehdy, když připojíte hardwarový sériový port. Ten má Arduino Uno pouze jeden a současně se používá i na programování samotného Arduina. To ale nepředstavuje problém, protože programování Arduina přes bootloader funguje na jiné rychlosti a hudební nástroj bude zasílány údaje ignorovat. Výjimečně se může stát, že hudební nástroj v zasílaných datech rozezná některou MIDI zprávu a občas může při programování Arduina zahrát náhodný tón.

Pokud vám to vadí, můžete to vyřešit tak, že během programování Arduina odpojíte DIN konektor nebo použijete SoftwareSerial na jiném pinu. Všechny programy pro Arduino, které jsou součástí tohoto článku předpokládají, že to máte zapojené podle tohoto schématu.

Příklady

Při výběru příkladů jsem dlouho přemýšlel, co zvolit jako ukázku. Nakonec jsem si vybral dvě stupnice. Jednu základní, na níž si určitě procvičoval prstoklad každý začínající hudebník a druhou tajemnou, bluesovou, kterou chce každý znát, ale na kterou nemáme dost času ani trpělivosti a tak ji raději přenecháváme hudebníkem, kteří se hudbou živí. Stupnice mají výhodu v tom, že je rychle pochopíte, víte, které klávesy máte mačkat a pak je nekonečně dlouho trénujete. Prsty vás zpočátku neposlouchají, máte pocit, že nikam nepostupujete, ale jednoho dne se vám prsty přestanou zaplétat a konečně to zahrajete.

Žáci v hudební škole to mají těžší, ti musí stupnice trénovat a moc si nezahrají. Pokud se učíte sami, tuto část odfláknete a raději si zkoušíte cosi zahrát a když ze sebe co-to dostanete, vrátíte se k stupnici a budete ji alespoň trochu trénovat, protože zjistíte, že vám to pomáhá v hraní a po čase se prsty jaksi samovolně posouvají na klávesy, kde by měly být, aby dokázali zahrát noty v nějaké písni.

Ale to bylo jen tak naokraj, na stupnici je dobré zejména to, že je to v podstatě samá matematika a dobře se nám bude používat v příkladech. Součástí tohoto článku bude i video, kde si můžete obě stupnice, zahrané pomocí Arduina a syntetizátoru, poslechnout.

Stupnice C dur

Stupnice C dur se hraje tak, že postupně mačkáte všechny bílé klávesy. V programu je stupnice hrána nejprve směrem nahoru a pak se hraje směrem dolů. V programu jsem vyznačil konkrétně noty a k ním je uvedena hodnota MIDI noty. Tu musíme odeslat do hudebního nástroje. Všimněte si, že MIDI noty nejdou přesně za sebou. Chybějící čísla představují černé klávesy, které se v C dur nepoužívají.

Každá nota v programu trvá 400 ms. To znamená, že za jednu sekundu se přehrají přibližně 2 noty. To odpovídá rychlosti 120 BPM. Není to přesně, ale pro účely tohoto experimentu to postačuje. Ve videu si všimněte, které klávesy mačkám při hraní stupnice prsty. Volca FM má dotykovou klávesnici, což není na živé hraní ideální, ale dá se naučit hrát i na takové klávesnici.

#include <MIDI.h>

MIDI_CREATE_DEFAULT_INSTANCE();
const int channel = 1;
//                   C   D   E   F   G   A   H   C   C   H   A   G   F   E   D   C
const int notes[] = {60, 62, 64, 65, 67, 69, 71, 72, 72, 71, 69, 67, 65, 64, 62, 60};
const int cnt = sizeof(notes) / sizeof(int);

void setup() {
  MIDI.begin();
}

void loop() {
  int note;
  for (int i = 0; i < cnt; i++) {
    note = notes[i];
    MIDI.sendNoteOn(note, 64, channel);
    delay(400);
    MIDI.sendNoteOff(note, 64, channel);
  }
}

Bluesová stupnice

Tato stupnice zní trochu jinak. Využívají se i černé klávesy. Doufám, že jsem to nepopletl, ale stupnice je označena jako šestitónová C mol bluesová stupnice (hexatonic). Zní smutně, protože se jedná o molová stupnice. I tuto stupnici zahraju prsty na syntezátory, abyste měli dobrou představu o tom, které tóny se hrají.

Obě stupnice jsou dobré na to, abyste si vyzkoušeli, zda jste dobře zapojili elektrický obvod. V pokračování tohoto článku se pokusíme z mého syntetizátoru získat i melodii a ukázky budou vůči těmto příkladem o něco složitější.

#include <MIDI.h>

MIDI_CREATE_DEFAULT_INSTANCE();
const int channel = 1;
//                   C   Eb  F   Gb  G   Hb  C   C   Hb  G   Gb  F   Eb  C
const int notes[] = {60, 63, 65, 66, 67, 70, 72, 72, 70, 67, 66, 65, 63, 60};
const int cnt = sizeof(notes) / sizeof(int);

void setup() {
  MIDI.begin();
}

void loop() {
  int note;
  for (int i = 0; i < cnt; i++) {
    note = notes[i];
    MIDI.sendNoteOn(note, 64, channel);
    delay(400);
    MIDI.sendNoteOff(note, 64, channel);
  }
}

Video

Aby bylo jasné, které noty Arduino zahraje, nejprve zahraju prsty na klaviatuře syntetizátoru a potom totéž zahraje Arduino.

Zdrojový kód

Zdrojový kód se nachází na serveru GitHub.


16.07.2018


Menu