Arduino a MIDI out - akordy

Zápisník experimentátora

Hierarchy: MIDI

Pokračujeme v našich experimentech s MIDI. V předchozím článku jsme si ukázali, jak se zapojuje MIDI out a zahráli jsme si několik stupnic. Nyní je načase, abychom vytvořili nějakou hudbu. Proto se zaměříme na základ moderní populární hudby, kterým jsou akordy. 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.

Akord

Akord je definován jako souzvuk nejméně tří tónů různé výšky. Ale ne každé tři tóny, které zahrajete spolu, budou znít dobře. Musíte dodržet určitá pravidla. Ty pravidla určují, kolik polotónů mají být od sebe vzdáleny jednotlivé tóny. V hudební výchově se vám to snaží ztížit tím, že na to nejdou matematicky, ale pomocí pořadí tónu v konkrétní stupnici. Ale my budeme programovat Arduino a tam se nám matematické vyjádření akordu bude programovat jednodušší, protože MIDI má očíslované jednotlivé polotóny.

Ze tří tónů můžete vytvořit následující akordy. Ke každému akordu jsem napsal i počet jednotlivých půltónů, o které se musí posunout následující tón. Například akord C dur vytvoříte podle obrázku tak, že stisknete klávesy označené čísly 5, 7 a 9. odečtěte si mezi nimi vzdálenosti tak, že budete počítat i černé klávesy a dostanete čísla, které jsou uvedeny v prvním řádku následující tabulky.

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

V příkladech budu uvádět pouze první dva typy akordů, protože s těmi se v populární hudbě setkáte nejčastěji. Akordy lze vytvořit i z více tónů, ale Korg Volca FM má jen trojhlasní polyfonii a tak je pomocí tohoto syntezátoru nemůžeme zahrát.

Zapojení

Používám stejné zapojení jako v předchozím článku.

Příklady

Napsal jsem čtyři příklady, pomocí kterých si ukážeme akordy v akci. Příklady jsem napsal tak, abychom se postupně dostali ik jednoduché melodii. Melodie v těchto příkladech je jednoduchá, protože se v ní pouze obměňuje několik různých akordů, ale když si pustíte ukázky na YouTube, budete vidět, že ani mnoho hudebníků v populární hudbě si z toho těžkou hlavu nedělá a udělají z toho bez mrknutí oka píseň.

Stupnice C dur

V prvním příkladu si vezmeme všechny noty ze stupnice C dur a zahrajeme je jako akordy. Noty ze stupnice C dur se všechny nacházejí na bílých klávesách, to už ale neplatí při akordech. Pouze při akordech C (C E G), F (F A C) a G (G H D) dur se budou i ostatní tóny nacházet na bílých klávesách. Ostatní akordy budou vytvořeny jako kombinace bílých a černých kláves. Například akord D dur se hraje jako kombinace kláves D, F # a A.

S přesným umístěním jednotlivých kláves se ale nemusíme trápit, protože pro každý akord, který začíná některou notou ze stupnice C dur platí stejná pravidla. V programu jsem si proto připravil pouze seznam základních tónů v poli notes a pravidlo pro tvorbu durové akordu v poli interval_major. V programu pak pouze postupně procházím po jednotlivých základních tónech a vytvářím z nich akord, který přes MIDI odešlu do syntezátoru.

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

Stupnice C moll

Stupnice C mol je velmi podobná na stupnici C dur. Pouze druhý tón v pořadí se hraje o půl tónu níže. Experti na hudbu to popisují tak, že durové akordy znějí vesele a mollové zase znějí smutně. Můžete si to vyzkoušet v tomto příkladu, který se od předchozího liší pouze pravidlem pro tvorbu mollového akordu, které se nachází v poli interval_minor. Například akord C moll se bude hrát jako kombinace kláves C, Eb a G. Akord D moll se bude hrát jako kombinace 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 předchozích příkladech jste si všimli, že v poli notes jsem měl zapsány noty, které postupně prošly stupnicí nejprve směrem nahoru a pak se noty vrátili zase zpět. Co se stane, když tyto noty nebudou tvořit stupnici, ale si cíleně vybereme pouze několik not a budeme je postupně hrát jako akordy? Vznikne nám v podstatě píseň. Sice bude jednoduchá, když si ale vybereme vhodné akordy, bude to znít velmi dobře. Například v tomto příkladu jsem použil pouze akordy C dur, F dur a G dur. Každý akord zopakuji čtyřikrát, abych dosáhl dojem, že hraji v čtyřčtvrťovém taktu a jednotlivé noty hrám kratší, abych trošku přidal do kroku.

Tento program se v podstatě nijak neliší od předchozích dvou příkladů. Pouze změna v notách způsobuje, že už to není stupnice, ale je to píseň. Takto se dá s notami hrát, můžete měnit různé akordy a přeházet jejich pořadí. Sami uslyšíte, kdy jste dosáhli něco pěkné a kdy jste vytvořili něco 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, Fdur, A moll a G dur

Poslední příklad přidává z hudebního hlediska pouze drobnou změnu. Třetí akord v pořadí není C dur, ale je to A moll. Vzpomínáte si, co jsem říkal o veselých a smutných akordech? Toto je ten smutný akord, který ale přináší do posloupnosti akordů zajímavou změnu. Už to není nekonečné hraní stejných akordů, najednou se tam objevila dramatická změna. Kdyby někdo opravdu napsal takovou píseň, tak by ji určitě doplnil slovy tak, aby to ladilo s náladou, kterou vytvářejí akordy. Čili v první veselé části by se hrdina písně zamiloval, v druhé smutné části by se rozešel se svou láskou, chystal by si lano, přehozené přes větev, když vtom, v poslední veselé části by se zase všechno na dobré obrátilo, oba by si padli do náruče a měli spolu kopu malých dětiček.

Ale pojďme zpět k programu. Kód je mírně složitější, protože jsem musel rozlišit, kdy mají hrát durové akordy a kdy mají hrát mollové akordy. To zajišťuje pole inter. V něm mám uložené indexy do pole intervals. Zápis se může jevit na první pohled podivně, ale je to jen pole pointerů na pole celých čísel. Čili je to ve skutečnosti pouze dvourozměrné 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

Ve videu jsem se snažil ukázat z každého příkladu malou ukázku, abyste si mohli i bez programování poslechnout, o čem jsem v tomto článku tolik psal. Ne každý má doma syntezátor nebo hudební nástroj s MIDI vstupem a proto je toto nejlepší forma, jak vám zprostředkovat zážitek z poslechu akordů v ukázkách.

  • to-do

Zdrojový kód

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


20.08.2018


Menu