Arduino a MIDI out - akordy

Zápisník experimentátora

Hierarchy: MIDI

Pokračujeme v našich experimentoch s MIDI. V predchádzajúcom článku sme si ukázali, ako sa zapája MIDI out a zahrali sme si niekoľko stupníc. Teraz je načase, aby sme vytvorili nejakú hudbu. Preto sa zameriame na základ modernej populárnej hudby, ktorým sú akordy. 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.

Akord

Akord je definovaný ako súzvuk najmenej troch tónov rôznej výšky. Ale nie každé tri tóny, ktoré zahráte spolu, budú znieť dobre. Musíte dodržať určité pravidlá. Tie pravidlá určujú, koľko poltónov majú byť od seba vzdialené jednotlivé tóny. V hudobnej výchove sa vám to snažia sťažiť tým, že na to nejdú matematicky, ale pomocou poradia tónu v konkrétnej stupnici. Ale my budeme programovať Arduino a tam sa nám matematické vyjadrenie akordu bude programovať jednoduchšie, pretože MIDI má očíslované jednotlivé poltóny.

Z troch tónov môžete vytvoriť nasledovné akordy. Ku každému akordu som napísal aj počet jednotlivých poltónov, o ktoré sa musí posunúť nasledujúci tón. Napŕiklad akord C dur vytvoríte podľa obrázku tak, že stlačíte klávesy označené číslami 5, 7 a 9. Odrátajte si medzi nimi vzdialenosti tak, že budete rátať aj čierne klávesy a dostanete čísla, ktoré sú uvedené v prvom riadku nasledujúcej tabuľky.

  • dur - 0, 4, 7
  • mol - 0, 3, 7
  • zväčšený - 0, 4, 8
  • zmenšený - 0, 3, 6

V príkladoch budem uvádzať iba prvé dva typy akordov, pretože s tými sa v populárnej hudbe stretnete najčastejšie. Akordy možno vytvoriť aj z viac tónov, ale Korg Volca FM má len trojhlasú polyfóniu a tak ich pomocou tohto syntetizátora nemôžeme zahrať.

Zapojenie

Používam rovnaké zapojenie ako v predchádzajúcom článku.

Príklady

Napísal som štyri príklady, pomocou ktorých si ukážeme akordy v akcii. Príklady som napísal tak, aby sme sa postupne dostali aj k jednoduchej melódii. Melódia v týchto príkladoch je jednoduchá, pretože sa v nej iba obmieňa niekoľko rôznych akordov, ale keď si pustíte ukážky na YouTube, budete vidieť, že ani veľa hudobníkov v populárnej hudbe si z toho ťažkú hlavu nerobí a urobia z toho bez mihnutia oka pieseň.

Stupnica C dur

V prvom príklade si zoberieme všetky noty zo stupnice C dur a zahráme ich ako akordy. Noty zo stupnice C dur sa všetky nachádzajú na bielych klávesách, to už ale neplatí pri akordoch. Iba pri akordoch C (C E G), F (F A C) a G (G H D) dur sa budú aj ostatné tóny nachádzať na bielych klávesách. Ostatné akordy budú vytvorené ako kombinácie bielych a čiernych kláves. Napríklad akord D dur sa hrá ako kombinácia kláves D, F# a A.

S presným umiestnením jednotlivých kláves sa ale nemusíme trápiť, pretože pre každý akord, ktorý sa začína niektorou notou zo stupnice C dur platia rovnaké pravidlá. V programe som si preto pripravil iba zoznam základných tónov v poli notes a pravidlo pre tvorbu durového akordu v poli interval_major. V programe potom iba postupne prechádzam po jednotlivých základných tónoch a vytváram z nich akord, ktorý cez MIDI odošlem do syntetizátora.

#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);

const int interval_major[] = {0, 4, 7};

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

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

Stupnica C mol

Stupnica C mol je veľmi podobná na stupnicu C dur. Iba druhý tón v poradí sa hrá o pol tónu nižšie. Experti na hudbu to popisujú tak, že durové akordy znejú veselo a molové zase znejú smutne. Môžete si to vyskúšať v tomto príklade, ktorý sa od predchádzajúceho líši iba pravidlom na tvorbu molového akordu, ktoré sa nachádza v poli interval_minor. Napríklad akord C mol sa bude hrať ako kombinácia kláves C, Eb a G. Akord D mol sa bude hrať ako kombinácia kláves D, F a A.

#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);

const int interval_minor[] = {0, 3, 7};

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

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

C dur, F dur a G dur

V predchádzajúcich príkladoch ste si všimli, že v poli notes som mal zapísané noty, ktoré postupne prešli stupnicou najprv smerom nahor a potom sa noty vrátili zase naspäť. Čo sa udeje, keď tieto noty nebudú tvoriť stupnicu, ale si cielene vyberieme iba niekoľko nôt a budeme ich postupne hrať ako akordy? Vznikne nám v podstate pieseň. Síce bude jednoduchá, keď si ale vyberieme vhodné akordy, bude to znieť veľmi dobre. Napríklad v tomto príklade som použil iba akordy C dur, F dur a G dur. Každý akord zopakujem štyrikrát, aby som dosiahol dojem, že hrám v štvorštvrťovom takte a jednotlivé noty hrám kratšie, aby som trošku pridal do kroku.

Tento program sa v podstate nijako nelíši od predchádzajúcich dvoch príkladov. Iba zmena v notách spôsobuje, že už to nie je stupnica, ale je to pieseň. Takto sa dá s notami hrať, môžete meniť rôzne akordy a poprehadzovať ich poradie. Sami budete počuť, kedy ste dosiahli niečo pekné a kedy ste vytvorili niečo hrozné.

#include <MIDI.h>

MIDI_CREATE_DEFAULT_INSTANCE();
const int channel = 1;
//                   C   C   C   C   F   F   F   F   C   C   C   C   G   G   G   G
const int notes[] = {60, 60, 60, 60, 65, 65, 65, 65, 60, 60, 60, 60, 67, 67, 67, 67};
const int cnt = sizeof(notes) / sizeof(int);

const int interval_major[] = {0, 4, 7};

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

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

C dur, F dur, A mol a G dur

Posledný príklad pridáva z hudobného hľadiska iba drobnú zmenu. Tretí akord v poradí nie je C dur, ale je to A mol. Spomínate si, čo som hovoril o veselých a smutných akordoch? Toto je ten smutný akord, ktorý ale prináša do postupnosti akordov zaujímavú zmenu. Už to nie je nekonečné hranie rovnakých akordov, odrazu sa tam objavila dramatická zmena. Keby niekto naozaj napísal takúto pieseň, tak by ju určite doplnil slovami tak, aby to ladilo s náladou, ktorú vytvárajú akordy. Čiže v prvej veselej časti by sa hrdina piesne zaľúbil, v druhej smutnej časti by sa rozišiel so svojou láskou, chystal by si lano, prehodené cez konár, keď vtom, v poslednej veselej časti by sa zase všetko na dobré obrátilo, obaja by si padli do náruče a mali spolu kopu malých detičiek.

Ale poďme naspäť k programu. Kód je mierne zložitejší, pretože som musel rozlíšiť, kedy majú hrať durové akordy a kedy majú hrať molové akordy. To zabezpečuje pole inter. V ňom mám uložené indexy do poľa intervals. Zápis sa môže javiť na prvý pohľad podivne, ale je to len pole pointrov na polia celých čísel. Čiže je to v skutočnosti iba dvojrozmerné pole celých čísel.

#include <MIDI.h>

MIDI_CREATE_DEFAULT_INSTANCE();
const int channel = 1;
//                   C   C   C   C   F   F   F   F   A   A   A   A   G   G   G   G
const int notes[] = {60, 60, 60, 60, 65, 65, 65, 65, 69, 69, 69, 69, 67, 67, 67, 67};
const int inter[] = {0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,  0,  0,  0,  0};
const int cnt = sizeof(notes) / sizeof(int);

const int interval_major[] = {0, 4, 7};
const int interval_minor[] = {0, 3, 7};
const int *intervals[] = {interval_major, interval_minor};

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

void loop() {
  int note;
  for (int i = 0; i < cnt; i++) {
    note = notes[i];
    for (int j = 0; j < 3; j++)
      MIDI.sendNoteOn(note + intervals[ inter[i] ][j], 64, channel);
    delay(160);
    for (int j = 0; j < 3; j++)
      MIDI.sendNoteOff(note + intervals[ inter[i] ][j], 64, channel);
    delay(40);
  }
}

Video

Vo videu som sa snažil ukázať z každého príkladu malú ukážku, aby ste si mohli aj bez programovania vypočuť, o čom som v tomto článku toľko písal. Nie každý má doma syntetizátor alebo hudobný nástroj s MIDI vstupom a preto je toto najlepšia forma, ako vám sprostredkovať zážitok z počúvania akordov v ukážkach.

  • to-do

Zdrojový kód

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


20.08.2018


Menu