[131] MIDI - język nie tylko instrumentów cz. 7
![[131] MIDI - język nie tylko instrumentów cz. 7](/_next/image?url=https%3A%2F%2Farduino.pl%2Fimgproxy%2FMozjn4YKSXerwQcT5MJAI0d3R-cw9B5V3VAPrMu0WSI%2Ff%3Awebp%2Fw%3A1200%2FbG9jYWw6Ly8vaW1hZ2VzLzAtNjhmLzMzNmU0L2YwOThhLzAtNjhmMzM2ZTRmMDk4YTk1Mzg5NDU4Ny5wbmc%3D.webp&w=3840&q=75)
Tworzenie muzyki to proces żywy, ciągły i polegający nie na gapieniu się na instrument, a na na manipulowaniu nim. Gdy jest nim syntezator, rzecz nie sprowadza się tylko do klawiatury, ale także do gałek, suwaków i wszystkiego tego, co wystaje i zachęca do dotknięcia. Kiedyś takich elementów nie było prawie w ogóle, od jakiegoś czasu jednak powracają, lecz im jest ich więcej, tym droższy jest sam instrument. Tymczasem elementów związanych z kreowaniem dźwięku mogą być dziesiątki i więcej. Byłoby dobrze móc kontrolować je potencjometrami na żywo. I dotyczy to zarówno syntezatorów sprzętowych jak i programowych, a zwłaszcza tych, bo do nich mamy dostęp jedynie za pomocą myszy. Podsumowując: by móc tworzyć nowe brzmienia, jak również zmieniać ich charakter podczas występów na żywo, potrzebny jest sterownik z potencjometrami. I taki dziś będę chciał zbudować. Ale zaczniemy od artykułu, który premierę miał już jakiś czas temu.
Co ciekawe, tam już idea się pojawiła, ale w wydaniu nieformalnym. Włamaliśmy się do taniego multiefektu, by móc nim sterować w czasie rzeczywistym. Dziś zrobimy to samo, ale bez włamywania się – za pomocą protokołu MIDI. Wyszczególniono w nim grupę rozkazów, które mogą wpływać na tor syntezy w czasie rzeczywistym. Czyli: dźwięk sobie trwa, ponieważ klawiatura została wciśnięta i w czasie tego trwania możemy zmieniać na przykład wibracje, poziom filtrowania, efektu, sprzężenia – jak tylko projektant instrumentu postanowił. Ważne jest to, że ze wszystkich 128 wartości zdefiniowano dosłownie kilka tylko, a resztę traktuje się zwyczajowo albo jak kto chce. Czyli możemy zbudować sterownik ze 128 potencjometrami maksymalnie, ale ich interpretacja będzie zależna od konkretnego instrumentu. Prawie nigdy nie wykorzystuje się aż takiej ilości nastaw.

Przypomnę to, o czym pisałem w pierwszym artykule serii o MIDI: komunikaty związane z owymi nastawami zaczynają się bajtem o wartości od 176 do 191 – określającym ten właśnie typ komunikatu, zwany Control Change i numer kanału midi. Następnie mamy drugi bajt – mówiący co chcemy zmienić i trzeci, zawierający wartość zmienianą. Spójrzmy w tabelę: numer jeden na przykład to modulacja.

Większość instrumentów ma taką wajchę i ona właśnie wysyła ten komunikat. Siedem to głośność. Często podłącza się pedał głośności, zwłaszcza w kościołach, gdzie organista ma zajęte obie ręce graniem i nogą reguluje sobie poziom dźwięku, w zależności od tego czy wierni śpiewają rześko, czy niemrawo.
Kilka komunikatów przyjmuje tylko skrajne wartości i są one związane z pedałami – działającymi podobnie jak w fortepianie. Tu po prostu nie wykorzystuje się pełnego potencjału i pedał wciśnięty wysyła wartość 127, a puszczony – zero, bez wartości pośrednich. Nas jednak będą interesować głównie komunikaty o wyższych numerach, zwłaszcza związane z filtrem. Zanim zbudujemy ambitniejszy sterownik, napiszmy prosty szkic, który ukaże ideę lepiej niż tysiąc słów. W tym celu wykorzystam potencjometr siedzący na mojej płytce edukacyjnej TME.
Zaczniemy jednak od wprawki: jeszcze nie będziemy nic wysyłać przez MIDI, a na monitor, by sprawdzić, czy aby algorytm zabezpieczający przed drganiami ślizgacza potencjometru poradzi sobie z niechcianym nadmiarem danych.
const byte potencjometr = A1; // Adres potencjometru.
int staryOdczytPotencjometru = 0; // Zmienna przechowująca odczytaną wartość.
void setup() {
Serial.begin(31250); // Inicjuj port z nietypową szybkością 31250 bps
}
void loop() {
int nowyOdczytPotencjometru = analogRead(potencjometr); // Odczytaj wartość napięcia ze ślizgacza potencjometru.
if (abs(staryOdczytPotencjometru - nowyOdczytPotencjometru) > 7) { // Jeśli odczytana wartość jest większa od 7 od wartości poprzedniej...
staryOdczytPotencjometru = nowyOdczytPotencjometru; // Uaktualnij wartość napięcia dla następnego porównania.
Serial.println(staryOdczytPotencjometru >> 3); // Przesuń wynik o trzy bity, czyli podziel go przez osiem.
}
}
A więc: deklarujemy port potencjometru potencjometr oraz jedyną zmienną, o nazwie staryOdczytPotencjometru. W głównej pętli będziemy bez końca odczytywać wartość z portu i ładować ją do zmiennej nowyOdczytPotencjometru. Następnie obliczamy wartość bezwzględną różnicy obu odczytów i tylko gdy przekroczy siedem przechodzimy do dalszej części. Co to oznacza?
Jak wiadomo, odczyt potencjometru da nam wartości od 0 do 1023. A nas interesuje zakres typowy dla MIDI: od 0 do 127. Oba mają się do siebie jak jeden do ośmiu, więc możemy spokojnie ignorować wszelkie zmiany mniejsze od ósemki i dopiero jeśli kolejne odczyty będą równe osiem lub więcej, zatwierdzimy je jako legalne. W ten właśnie sposób wyeliminujemy stany nieustalone, które mogłyby dać całe ciągi wartości sąsiadujących i zapychać nasz instrument zbędnymi danymi.
Gdy jednak wartości będą się różnić przynajmniej o osiem, najpierw przeładujemy do zmiennej staryOdczyt wartość odczytaną właśnie, a następnie wyślemy ją na monitor. Ale nie wprost, bo ona nadal należy do przedziału 0-1023, lecz po podzieleniu przez osiem. Dzielenie przez 8 to przesunięcie o trzy bity w prawo, a ponieważ tak jest szybciej, użyłem tej metody. Po kompilacji możemy poruszać potencjometrem na wszelkie sposoby i obserwować strumień danych. W każdym wypadku powinniśmy otrzymać sąsiadujące wartości bez powtórzeń. Skoro wszystko działa, zróbmy z tego sterownik MIDI.
const byte potencjometr = A1; // Adres potencjometru.
int staryOdczytPotencjometru = 0; // Zmienna przechowująca odczytaną wartość.
void setup() {
Serial.begin(31250); // Inicjuj port z nietypową szybkością 31250 bps
}
void loop() {
int nowyOdczytPotencjometru = analogRead(potencjometr); // Odczytaj wartość napięcia ze ślizgacza potencjometru.
if (abs(staryOdczytPotencjometru - nowyOdczytPotencjometru) > 7) { // Jeśli odczytana wartość jest większa od 7 od wartości poprzedniej...
staryOdczytPotencjometru = nowyOdczytPotencjometru; // Uaktualnij wartość napięcia dla następnego porównania.
Serial.write(176); // Wyślij komunikat "wyślij kontroler" na kanale pierwszym.
Serial.write(74); // Wyślij komunikat "reguluj filtr"
Serial.write(staryOdczytPotencjometru >> 3); // Reguluj filtr zgodnie z pozycją potencjometru.
}
}
Pracy wiele nie będzie: zmienimy tylko szybkość taktowania transmisji szeregowej na właściwą dla MIDI, czyli 31250 bps i w pętli będziemy wysyłać trzy bajty: dwa stałe, odpowiedzialne za aktywację kontrolera na kanale pierwszym i konkretnie już kontrolera numer 74, bo przyjęło się, iż on odpowiada za filtr, a trzecim bajtem będzie nasza wartość odczytana i przekonwertowana – będzie ona teraz sterować filtrem. Po kompilacji… Ano właśnie, zróbmy coś innego: postanowiłem tym razem sterować syntezatorem wirtualnym, czyli istniejącym tylko na ekranie peceta.

Tutaj nieskromnie pochwalę się własną produkcją, Muzykantem S3, który powstał już jakoś dwanaście lat temu w aplikacji SynthMaker. Jest to wspaniałe środowisko do budowy wirtualnych instrumentów, w którym możemy zrobić wszystko po swojemu – od struktury instrumentu, po grafikę. Ta odsłona udaje syntezatory z przełomu lat 70/80 i zawiera kilkadziesiąt nastaw. Te wszystkie, przy których znajdziemy niebieskie napisy, można regulować zdalnie za pomocą takiego na przykład urządzenia, jakie właśnie stworzyliśmy. Jeszcze słowo wyjaśnienia: w jaki sposób za pomocą MIDI dostać się do takiego istniejącego tylko w komputerze syntezatora? Potrzebny jest interfejs MIDI.

Może to być coś takiego albo też może to być taka klawiatura, która ma MIDI IN oraz USB, na które wystawia zmiksowane sygnały z gniazdka MIDI oraz własnych zasobów. Sterownik już zadba, by to zinterpretować jako sygnał MIDI, natomiast wirtualny instrument musi umieć go odczytać. Ta wersja ma po prostu możliwość otwarcia portu, zwykle jednak takie instrumenty wymagają tak zwanego hosta VST – programu pośredniczącego. Ale to już inna historia, do znalezienia w internecie.
Zagrajmy więc kilka nutek i pokręćmy gałką. Nie tylko słychać skutki tego kręcenia, ale także widać je – w postaci skaczącego słupka. Przybyło ekspresji; statyczne dotąd brzmienie mocno ożyło. A przy okazji dokonaliśmy właśnie brzemiennego odkrycia – możliwość sterowania komputerem za pomocą potencjometru – ale o tym napiszę za jakiś czas dopiero.
Już na tym etapie urządzenie może być przydatne. Jako pedał głośności midi na przykład albo w tych klawiaturach, gdzie poskąpiono manipulatora modulującego. Jednak zabawa zaczyna się dopiero wówczas, gdy gałek jest więcej, o czym napiszę w kolejnym artykule.