Arduino a MIDI out

Zápisník experimentátora

Hierarchy: MIDI

V tomto článku si ukážeme, ako môžeme pomocou Arduina ovládať hudobné nástroje. Budeme na to používať MIDI protokol, čo je sériový protokol, pomocou ktorého sa posielajú správy hudobným nástrojom. Tie podľa zaslanej správy vedia, akú notu majú práve zahrať. Ja budem v ukážke používať syntetizátor Korg Volca FM. Môžete na to ale použiť ľubovoľný hudobný nástroj, ktorý má MIDI vstup.

MIDI

MIDI je skratka pre Musical Instrument Digital Interface. Podrobnejšie si môžete MIDI preštudovať na Wikipedii. Pre nás, ako užívateľov Arduina, stačí vedieť, že na odosielanie správ MIDI môžeme používať ten istý sériový protokol, pomocou ktorého komunikujeme s počítačom. Dôležitá je len nastavená rýchlosť, ktorá je 31250 b/s.

Na odosielanie MIDI správ existuje knižnica Arduino MIDI Library. Môžete si ju nainštalovať pomocou Správcu knižníc. Kniznica obsahuje všetky potrebné funkcie na odosielanie nôt do syntetizátora. Nemusíte sa starať o podrobnosti implementácie samotného protokolu MIDI. Preto sa môžeme sústrediť len na samotnú tvorbu hudby.

Zapojenie

MIDI používa DIN konektor. Zapojenie MIDI out je jednoduché. Použijete jeden rezistor, ktorý sa pripojí na pin 4 konektora. Pin 5 pripojíte priamo na TX v Arduine. Pôvodná schéma používa rezistor 220R. Ja som použil 330R. V dnešnej dobe to tak môžeme zapojiť, pretože na druhej strane bude mať pripojený hudobný nástroj optoizolátor a naša časť elektrického obvodu tvorí napájanie LED diódy v optoizolátore. Aj s rezistorom 330R bude dióda v integrovanom obvode dostatočne prenášať signál z Arduina do hudobného nástroja.

V článku nájdete niekoľko fotografií zapojenia na breadboarde, podľa ktorých si môžete rovnaký elektrický obvod zapojiť. MIDI in si zapojíme v niektorom ďalšom pokračovaní tohto článku.

Takéto zapojenie elektrického obvodu sa používa vtedy, keď pripojíte hardverový sériový port. Ten má Arduino Uno iba jeden a súčasne sa používa aj na programovanie samotného Arduina. To ale nepredstavuje problém, pretože programovanie Arduina cez bootloader funguje na inej rýchlosti a hudobný nástroj bude zasielané údaje ignorovať. Výnimočne sa môže stať, že hudobný nástroj v zasielaných dátach rozozná niektorú MIDI správu a občas môže pri programovaní Arduina zahrať náhodný tón.

Ak vám to prekáža, môžete to vyriešiť tak, že počas programovania Arduina odpojíte DIN konektor alebo použijete SoftwareSerial na inom pine. Všetky programy pre Arduino, ktoré sú súčasťou tohto článku predpokladajú, že to máte zapojené podľa tejto schémy.

Príklady

Pri výbere príkladov som dlho premýšľal, čo zvoliť ako ukážku. Nakoniec som si vybral dve stupnice. Jednu základnú, na ktorej si určite precvičoval prstoklad každý začínajúci hudobník a druhú tajomnú, bluesovú, ktorú chce každý poznať, ale na ktorú nemáme dosť času ani trpezlivosti a tak ju radšej prenechávame hudobníkom, ktorí sa hudbou živia. Stupnice majú výhodu v tom, že ich rýchlo pochopíte, viete, ktoré klávesy máte stláčať a potom ich nekonečne dlho trénujete. Prsty vás zo začiatku neposlúchajú, máte pocit, že nikam nepostupujete, ale jedného dňa sa vám prsty prestanú zapletať a konečne to zahráte.

Žiaci v hudobnej škole to majú ťažšie, tí musia stupnice trénovať a veľa si nezahrajú. Ak sa učíte sami, túto časť odfláknete a radšej si skúšate čosi zahrať a keď zo seba čo-to dostanete, vrátite sa k stupnici a budete ju aspoň trochu trénovať, pretože zistíte, že vám to pomáha v hraní a po čase sa prsty akosi samovoľne posúvajú na klávesy, kde by mali byť, aby dokázali zahrať noty v nejakej piesni.

Ale to bolo len tak naokraj, na stupnici je dobré najmä to, že je to v podstate samá matematika a dobre sa nám bude používať v príkladoch. Súčasťou tohoto článku bude aj video, kde si môžete obe stupnice, zahrané pomocou Arduina a syntetizátora, vypočuť.

Stupnica C dur

Stupnica C dur sa hrá tak, že postupne stláčate všetky biele klávesy. V programe je stupnica hraná najprv smerom hore a potom sa hrá smerom dolu. V programe som vyznačil konkrétne noty a k ním je uvedená hodnota MIDI noty. Tú musíme odoslať do hudobného nástroja. Všimnite si, že MIDI noty nejdú presne za sebou. Chýbajúce čísla predstavujú čierne klávesy, ktoré sa v C dur nepoužívajú.

Každá nota v programe trvá 400 ms. To znamená, že za jednu sekundu sa prehrajú približne 2 noty. To zodpovedá rýchlosti 120 BPM. Nie je to presne, ale na účely tohto experimentu to postačuje. Vo videu si všimnite, ktoré klávesy stláčam pri hraní stupnice prstami. Volca FM má dotykovú klávesnicu, čo nie je na živé hranie ideálne, ale dá sa naučiť hrať aj na takejto 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á stupnica

Táto stupnica znie trochu inak. Využívajú sa aj čierne klávesy. Dúfam, že som to nedoplietol, ale stupnica je označená ako šesťtónová C mol bluesová stupnica (hexatonic). Znie smutne, pretože sa jedná o molovú stupnicu. Aj túto stupnicu zahrám prstami na syntetizátore, aby ste mali dobrú predstavu o tom, ktoré tóny sa hrajú.

Obe stupnice sú dobré na to, aby ste si vyskúšali, či ste dobre zapojili elektrický obvod. V pokračovaní tohto článku sa pokúsime z môjho syntetizátora získať aj melódiu a ukážky budú voči týmto príkladom o čosi zložitejšie.

#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 bolo jasné, ktoré noty Arduino zahrá, najprv zahrám prstami na klaviatúre syntetizátora a potom to isté zahrá Arduino.

Zdrojový kód

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


28.06.2018


Menu