MIDIswitch - przełącznik MIDI do wzmacniacza lampowego

MIDIswitch - przełącznik MIDI do wzmacniacza lampowego
Pobierz PDF Download icon

W praktyce każdego elektronika konstruktora są takie projekty, gdzie mariaż starego i nowego daje zupełnie nową jakość. Dotyczy to zwłaszcza tych urządzeń, w których implementację zaangażowanych jest kilka osób posiadających doświadczenie na różnych płaszczyznach sprzętowych. Tak właśnie jest za każdym razem, gdy do współpracy zapraszam mojego kolegę, który ma duże doświadczenie przy naprawach i projektowaniu układów z szeroko pojętej elektroniki estradowej. Tym razem postanowiliśmy wstrzyknąć sporą dawkę świeżości we wzmacniacze lampowe. Z jednej strony może to nieco dziwić, gdyż czasy największej popularności urządzeń lampowych już dawno minęły, z drugiej strony jest kilka grup urządzeń, w których układy lampowe są nadal bardzo popularne.

Podstawowe parametry:

  • cztery przekaźniki działające na zasadzie "jeden z czterech",
  • cztery przekaźniki działające na zasadzie "dowolny z czterech",
  • automatyczne wyciszanie przy zmianie kanału wejściowego,
  • sterowanie poprzez interfejs MIDI,
  • praca jako sterownik wzmacniacza lub jako tzw. looper,
  • zasilanie z przedziału 8…20 V, max. 200 mA.

Wzmacniacze lampowe są bardzo popularne jako wzmacniacze gitarowe. Większość dobrych gitarzystów (zwłaszcza bluesowych i rockowych) używa wzmacniaczy tego typu. Powód jest prosty - przesterowane lampy dają znacznie przyjemniejszy dźwięk niż układy tranzystorowe. Z tego powodu nadal powstaje wiele wzmacniaczy lampowych, których konstruktorzy próbują powielić brzmienie kultowych modeli sprzed lat. Co więcej, konstrukcje tych wzmacniaczy przypominają budowę wzmacniaczy oryginalnych, nawet jeśli chodzi o sposób montażu elementów ("point-to-point"). Nie przeszkadza to jednak w użyciu w tychże konstrukcjach elementów techniki cyfrowej, jak procesory sygnałowe DSP czy sterowanie MIDI. W praktyce właściwie każdy wzmacniacz wyższej klasy zawiera rozwiązania tego typu. Jednym z powodów stosowania technologii MIDI jest szeroka dostępność i uniwersalność sterowników.

MIDI - podstawowe informacje

Zanim przejdziemy do opisu prezentowanego urządzenia, należy przypomnieć sobie podstawowe informacje na temat tego dość leciwego, jednak świetnie pomyślanego standardu. Interfejs MIDI jest szeregowym interfejsem komunikacyjnym pracującym z szybkością 31250 (±1%) bits/s, w którym dane przesyłane są w paczkach po 8 bitów, z jednym bitem startu i jednym bitem stopu, bez bitów kontroli parzystości. Układ wejściowy interfejsu MIDI wykonuje się zwykle przy użyciu szybkiego transoptora (6N138), który zamienia prąd w linii (ok. 5 mA) na przebiegi napięciowe, zaś interfejs wyjściowy, z wykorzystaniem pary rezystorów ograniczających prąd diody LED w urządzeniu odbiorczym.

W standardzie MIDI dane przesyłane są grupowo w formie tzw. komunikatów (Messages), przy czym wprowadzono bardzo prosty sposób na odróżnienie bajtów poleceń sterujących (Status Byte) od bajtów danych (Data Byte): bajty poleceń mają ustawiony najstarszy bit (0xFF...0x80) a bajty danych najstarszy bit mają wyzerowany (0x7F...0x00). Zwykle informacje przesyłane są w kolejności: bajt polecenia i po nim jeden lub dwa bajty danych (w zależności od rodzaju polecenia). Polecenia wysyłane są tylko przy zmianie danego elementu sterującego. Bajt polecenia określa jedną ze standardowo zdefiniowanych funkcji, którą instrument ma wykonać (4 najstarsze bity), np. Note On/Off (włącz/wyłącz nutę), Control Change (zmień parametr urządzenia), Program Change (zmień rodzaj brzmienia) oraz numer kanału MIDI, na którym informacja ma być odebrana (pozostałe 4 bity określające jeden z 16 kanałów MIDI).

Dla porządku należy wspomnieć o możliwości ograniczenia transferu danych poprzez usunięcie redundancji, z której korzysta metoda Running Status. Polega ona na wysłaniu jednego bajta polecenia i wielu bajtów danych (bez każdorazowego ponawiania bajta polecenia) w przypadku przesyłania tego samego rodzaju sygnałów sterujących jeden za drugim, np. sygnały wywołane zmianą jednego i tego samego regulatora. Przy projektowaniu programu obsługi naszego urządzenia metoda ta nie została zaimplementowana. Tyle w kwestii MIDI, powróćmy zatem do tytułowego urządzenia.

Założenia konstrukcyjne i sposób funkcjonowania

Prezentowany układ pozwala na sterowanie wzmacniaczem (lub przedwzmacniaczem) lampowym za pomocą dowolnego sterownika MIDI. Takim sterownikiem może być komputer z odpowiednim oprogramowaniem, klawiatura MIDI, sekwencer lub sterownik MIDI (np. MP-100 firmy Harley Benton lub jeden z produktów naszego rodzimego producenta GLAB). Co więcej, poza sterowaniem z poziom.in.erfejsu MIDI układ może być również sterowany klasycznym sterownikiem nożnym (tzw. footswitchem) i przyciskami zamocowanymi na panelu czołowym wzmacniacza.

To pozwala na kompleksową obsługę większości funkcji wzmacniacza. Dodatkowym argumentem przemawiającym za użyciem sterownika MIDI jest fakt, że przy coraz bardziej rozbudowanych wzmacniaczach przełączniki nożne muszą być odpowiednie dla danego modelu przez co zwiększa się koszt całego systemu. Sterownik MIDI pozwala niejako rozwiązać ten problem. Jakby tego było mało, programy typu DAW (producentów takich jak Ableton, Avid, Cakewalk, Steinberg) pozwalają w sesji nagraniowej utworzyć ścieżkę z poleceniami MIDI, a to z kolei pozwala zautomatyzować również przełączanie kanałów i efektów we wzmacniaczu użytym w nagraniu. To oznacza, że ustawienia kanałów i efektów można zapisać w sesji nagraniowej. W przypadku konieczności powtórzenia nagrania może być to bardzo przydatne.

Opisywane urządzenie z założenia ma być uniwersalne, więc jego projekt powinien uwzględniać możliwość implementacji w typowych wzmacniaczach lampowych. Jednocześnie powinien pozwalać na zastosowanie w najbardziej rozbudowanych konstrukcjach. Takiego rodzaju wzmacniacze mają do czterech kanałów, które można dowolnie przełączać i jednocześnie mogą mieć pogłos (sprężynowy lub elektroniczny), jedną lub dwie pętle efektów (z których każda może być oddzielnie włączana lub wyłączana), efekty typu chorus, distorion, itp. Stosownie do tych wymagań założenia projektowe przy konstruowaniu niniejszego sterownika zostały zdefiniowane następująco:

  • możliwość zamontowania sterownika w istniejącym wzmacniaczu przy minimalnych modyfikacjach oryginalnego schematu urządzenia,
  • cztery przekaźniki działające na zasadzie "jeden z czterech" (K1 do K4) pozwalające na wybranie jednego z czterech kanałów,
  • cztery przekaźniki działające na zasadzie "dowolny z czterech" (K5 do K8) pozwalające na niezależne sterowanie dodatkowymi możliwościami wzmacniacza takimi, jak: pogłos, pętle efektów, przester, chorus, itp.,
  • możliwość wyciszania wzmacniacza (np. aby gitarzysta mógł nastroić gitarę) przyciskiem na panelu czołowym lub footswitchem,
  • automatyczne wyciszanie wzmacniacza w momencie przełączania kanałów. Pozwala to uniknąć niepożądanych efektów dźwiękowych w głośniku wzmacniacza w chwili przełączania kanałów,
  • możliwość zapisania bieżącej konfiguracji pracy wzmacniacza w nieulotnej pamięci sterownika, np. w celu jej późniejszego przywołania jednym rozkazem MIDI.

Układ jest bardzo elastyczny - pozwala na sterowanie bardzo skomplikowanymi wzmacniaczami, ale równocześnie można go użyć do kontroli bardzo prostego urządzenia składającego się jedynie z dwóch kanałów. Aby to zrobić, można zastosować pierwsze dwa przekaźniki z pierwszej grupy lub pojedynczy przekaźnik z drugiej grupy. Zaletą tego drugiego rozwiązania jest możliwość przełączania dwóch kanałów za pomocą wyłącznie jednego przycisku. Co więcej, implementując nasz sterownik w prostym wzmacniaczu, można zwyczajnie nie montować części elementów, które nie będą użyte, co zmniejszy sumaryczny koszt systemu.

Dodatkowo nasz układ można zastosować do budowy zupełnie innego urządzenia, niż pierwotnie zakładano. Można z niego zbudować tzw. looper - czyli przełącznik pętli efektów. Jedyną wymaganą zmianą w takim wypadku jest umieszczenie przełącznika w oddzielnej obudowie, z zewnętrznym zasilaczem i dodatkowymi gniazdami podłączeniowymi. Pozwoli to na wybranie jednej z 4 pętli (przekaźniki K1 do K4) i dowolnej kombinacji z pozostałych pętli (przekaźniki K5 do K8). Oprogramowanie sterownika pozwala ponadto zmienić zasadę działania urządzenia, a mianowicie daje możliwość wybierania dowolnej kombinacji przekaźników (przekaźniki K1 do K8). Funkcjonalność tą wybieramy, zwierając pole lutownicze looper na płytce głównej sterownika (warstwa BOTTOM).

W przypadku pracy przełącznika w trybie looper warto przyjrzeć się istniejącym konstrukcjom, chociażby FXL8 Pro firmy Harley Benton (przeszukując witryny sklepów takich jak www.thomman.de, znajdziemy wiele więcej urządzeń tego typu).

Warto podkreślić, że nazwy symboliczne przypisane do wejść z drugiej grupy przycisków na panelu przednim (sterujące przekaźnikami od K5 do K8) są umowne i sugerują wyłącznie, do czego dany przekaźnik może zostać użyty. Nie ma przecież powodu, aby nie użyć wejścia FX2 do sterowania włączaniem dowolnej, innej funkcji wzmacniacza, jak np. efekt chorus (jeśli wzmacniacz takowy ma, a nie ma drugiej pętli efektów). Tyle, jeśli chodzi o założenia konstrukcyjne i sposób funkcjonowania naszego sterownika.

Budowa

Sterownik MIDIswitch składa się z dwóch płytek: wykonawczej, z przekaźnikami i sterującej, z procesorem odbierającym i interpretującym polecenia MIDI.

Zacznijmy od części wykonawczej, której schemat ideowy pokazano na rysunku 1. Układ wykonawczy jest bardzo prosty i składa się w zasadzie wyłącznie z bufora sterującego przekaźnikami i samych przekaźników. Dodatkowo załączenie każdego z przekaźników może być sygnalizowane zaświeceniem diody LED, którą można umieścić na przednim panelu modyfikowanego wzmacniacza. Jest to zalecane rozwiązanie, gdyż użytkownik musi wiedzieć, który kanał jest aktualnie wybrany.

Rysunek 1. Schemat ideowy części wykonawczej

Schemat ideowy części sterującej pokazano na rysunku 2. Zaprojektowano bardzo prosty system mikroprocesorowy z użyciem popularnego mikrokontrolera firmy Microchip (dawniej Atmel) o oznaczeniu ATmega16, który taktowany rezonatorem kwarcowym o częstotliwości 12 MHz odpowiada za obsługę interfejsu MIDI (obwód wejściowy z wykorzystaniem transoptora 6N138), obsługę przycisków na panelu czołowym urządzenia (gniazda: CH1…CH4, CH1/CH2, REV, FX1, FX2, MUTE), obsługę przycisków nożnych tzw. footswitchy (gniazda: FTSW1…FTSW3), obsługę wyjść przekaźników (złącze REL) oraz obsługę dodatkowych wejść/wyjść MUTE_CTL, STORE_CTL.

Rysunek 2. Schemat ideowy części sterującej

Obsługa wszelkich wejść odbywa się z użyciem programowego mechanizmu eliminacji drgań styków, co jest wyjątkowo istotne dla wejść footswitchy, gdzie zintegrowano dodatkowe rozwiązanie sprzętowe w postaci obwodów RC (należy pamiętać, że kabel łączący przełącznik nożny z gniazdem może mieć długość nawet kilkunastu metrów). Wybór tego konkretnego modelu mikrokontrolera nie był podyktowany komplikacją programu obsługi aplikacji, bo ten jest dość prosty, a wynikał wyłącznie z konieczności obsługi wielu sygnałów wejściowych i wyjściowych a zatem koniecznych portów I/O.

Zastosowanie rezonatora kwarcowego, jako źródła taktowania mikrokontrolera wynikało z kolei z potrzeby zapewnienia dużej dokładności prędkości transmisji MIDI.

W zakresie części sterującej urządzenia, zaprojektowano również kompletny układ zasilacza z wykorzystaniem scalonej przetwornicy LM2734 w konfiguracji step-down. Zintegrowany zasilacz jest istotną częścią niniejszego sterownika. Nie można przecież oczekiwać, że we wzmacniaczu dostępne będzie napięcie +5 VDC do zasilania sterownika, więc przyjęto założenie, że układ zasilany będzie z uzwojenia żarzenia lamp (6,3 V lub 12,6 V napięcia zmiennego). Szacowany pobór prądu sterownika jest rzędu 100...200 mA (może zależeć od użytych diod LED), więc uzwojenie żarzenia powinno być w stanie dostarczyć prąd o takiej wartości.

Co szczególnie istotne, masa sterownika nie może być połączona z masą wzmacniacza, gdyż powodowałoby to zwarcie uzwojenia żarzenia wzmacniacza. Jeśli sterownik nasz chcielibyśmy zasilać z zasilacza należy pamiętać, że zakres napięć wejściowych pokrywa przedział od 8 V do 20 V, zaś sama przetwornica teoretycznie może dostarczyć prąd rzędu 1 A, ale jak wspomniano, potrzebny prąd jest znacznie mniejszy. Wracając zaś do samego sterownika, należy pamiętać, że aby wzmacniacz można było sterować z dowolnej grupy wejść, przełączniki, zarówno te użyte w przełączniku nożnym, jak i na przednim panelu wzmacniacza, powinny być chwilowe.

Funkcje dodatkowe

Urządzenie dysponuje dodatkowymi funkcjami, które wymagają kilku słów komentarza.

Pierwsza z nich pozwala na zapisanie bieżącej konfiguracji urządzenia (stanu przekaźników), by można ją było przywołać z pomocą polecenia MIDI.

Funkcjonalność tę uzyskujemy dzięki implementacji wejścia STORE_CTL, do którego podłączamy chwilowy przycisk sterujący oraz diodę sygnalizacyjną LED.

Naciśnięcie wspomnianego przycisku powoduje zapisanie bieżącej konfiguracji urządzenia i sygnalizację tego stanu, przy pomocy diody LED podłączonej do tego wejścia. Sposób podłączenia przycisku sterującego i diody LED do gniazda STORE_CTL pokazano na rysunku 3.

Rysunek 3. Sposób podłączenia przycisku sterującego i diody LED do gniazda STORE_CTL

Kolejną, przydatną funkcjonalnością jest możliwość wyciszenia wzmacniacza (np. aby pozwolić gitarzyście nastroić gitarę). Dostęp do niej uzyskujemy dzięki wykorzystaniu wyjścia MUTE_CTL, które integruje w sobie dwa sygnały: sygnał sterujący wyciszaniem (MUTE-signal) i wyjście sygnalizacyjne diody LED (MUTE LED). Działanie tej funkcjonalności przedstawia się następująco: pojawienie się niskiego poziomu sygnału na wejściu MUTE (panel przedni) lub FTSW3 (przełącznik nożny) powoduje pojawienie się wysokiego stanu na wyjściu MUTE_CTL i jednocześnie włączenie diody LED podłączonej do tego wyjścia.

Wysoki stan na wyjściu MUTE_CTL pozwala na użycie przekaźnika typu MOSFET (np. AQY212EH mającego bardzo małą oporność w stanie włączonym) pozwalającego na wyciszenie wzmacniacza (poprzez zwarcie sygnału do masy). Przekaźnik taki powinien być zamontowany jak najbliżej miejsca we wzmacniaczu, gdzie zwarcie sygnału spowoduje jego wyciszenie. Właśnie z tego powodu nie jest on zamontowany na obwodzie drukowanym naszego sterownika, a powinien być raczej zamontowany na małej płytce uniwersalnej i umieszczony np. blisko wejścia końcówki mocy (w przypadku wzmacniacza) lub wyjścia przedwzmacniacza (w przypadku, gdy sterownika użyto do sterowania przedwzmacniaczem lampowym). Sposób podłączenia gniazda MUTE_CTL pokazano na rysunku 4.

Rysunek 4. Sposób podłączenia do gniazda MUTE_CTL

W przypadku urządzenia lampowego przekaźnik taki powinien zwierać do masy siatkę lampy. Może to być lampa w przedwzmacniaczu, we wzmacniaczu pogłosu lub na wejściu końcówki mocy. Ponieważ wspomniany przekaźnik ma bardzo małą oporność w stanie ON, może on również zwierać wyjście przedwzmacniacza lub stopień wzmocnienia pętli efektów. Jednocześnie możliwe jest zastosowanie kilku takich układów (wejścia połączone równolegle), tak aby uzyskać efekt wyciszenia w kilku miejscach przedwzmacniacza. Należy wtedy dobrać odpowiednio opornik ustalający prąd sterujący przekaźnikiem (tak by dla jednego przekaźnika był to prąd rzędu 5 mA i aby nie przekroczyć wydajności prądowej portu procesora).

Ustawienia Fusebitów (ważniejszych):
CKSEL3…0: 1111
SUT1…0: 11
CKOPT: 0
OCDEN: 1
JTAGEN: 1
Ostatnią, dodatkową funkcjonalnością sterownika MIDIswitch jest możliwość budowy zupełnie innego urządzenia niż sterownik wzmacniacza lampowego, a mianowicie można z niego zbudować tzw. looper - czyli przełącznik efektów, często używany przez gitarzystów. W takim przypadku należy zamontować przełącznik w oddzielnej obudowie, podłączyć do niego zewnętrzny zasilacz (można użyć typowego zasilacza 9 V stosowanego do efektów). Obudowę należy wyposażyć w gniazda typu Jack dla wejścia i wyjścia instrumentu oraz do podłączenia pętli efektów (2 gniazda dla jednej pętli).

Jak napisano wcześniej, standardowe oprogramowanie przełącznika pozwala na wybranie jednej z 4 pętli (przekaźniki K1 do K4) i dowolnej kombinacji z pozostałych pętli (przekaźniki K5 do K8). Opcjonalnie, po zwarciu punktów lutowniczych oznaczonych jako looper, oprogramowanie sterownika pozwala również zmienić zasadę działania urządzenia i wybierać dowolną kombinację pętli (przekaźniki K1 do K8). Sposób podłączenia sterownika w wersji looper pokazano na rysunku 5.

Rysunek 5. Sposób podłączenia sterownika w wersji looper

Montaż

Montaż urządzenia rozpoczynamy od obwodu drukowanego części wykonawczej, który pokazano na rysunku 6. Montaż części wykonawczej sterownika rozpoczynamy od określenia jego funkcjonalności, czyli liczby montowanych przekaźników i gniazd. Należy również zdecydować, czy montujemy gniazda wyjściowe (pozwalające na wygodne odłączanie wejść-wyjść i diod LED) lub czy zdajemy się na połączenia lutowane (przewody połączeniowe lutowane bezpośrednio do płytki sterownika). Ostatnie rozwiązanie jest mniej elastyczne, jednak pewniejsze w przypadku drgań wzmacniacza (wzmacniacz postawiony na kolumnie głośnikowej). Po zamontowaniu wybranych przekaźników i gniazd połączeniowych montujemy układ scalony sterownika przekaźników, następnie montujemy elementy bierne, zaś na samym końcu gniazdo połączeniowe REL.

Rysunek 6. Schemat montażowy części wykonawczej

Schemat montażowy części sterującej naszego urządzenia pokazano na rysunku 7. Zaprojektowano dość zwarty obwód drukowany ze zdecydowaną przewagą elementów SMD. Montaż rozpoczynamy od przylutowania mikrokontrolera, następnie lutujemy pozostałe półprzewodniki, dalej elementy pasywne a na samym końcu montujemy elementy przewlekane, czyli wszelkiego rodzaju gniazda przyłączeniowe (jeśli, podobnie jak dla części wykonawczej, zdecydujemy się na korzystanie z gniazd, a nie połączeń lutowanych - nie dotyczy gniazda REL). W kolejnym kroku należy połączyć układ sterujący z układem wykonawczym, korzystając z odpowiednich gniazd i 16-żyłowej taśmy połączeniowej oraz sprawdzić działanie całości. Poprawnie zmontowane urządzenie nie wymaga żadnych regulacji i powinno działać tuż po włączeniu zasilania.

Rysunek 7. Schemat montażowy części sterującej

Jeśli wszystko działa poprawnie, przystępujemy do montażu obu płytek we wzmacniaczu poddawanemu modyfikacji. Płytka sterująca powinna być zamontowana blisko gniazda wejściowego MIDI, które prawdopodobnie będzie zamontowane na tylnym panelu wzmacniacza. Płytka wykonawcza powinna być zamontowana tak, by przewody podłączone do przekaźników były jak najkrótsze. Właściwym miejscem są okolice przedwzmacniaczy. Oczywiście, w przypadku przełączania sygnału audio zalecane są przewody ekranowane. Masy przewodów (ekrany) powinny być podłączone do masy modyfikowanego wzmacniacza. Sposób podłączenia gniazda połączeniowego MIDI_IN z gniazdem MIDI pokazano na rysunku 8.

Rysunek 8. Sposób podłączenia gniazda połączeniowego MIDI_IN z gniazdem MIDI

Widok zmontowanego obwodu drukowanego modułu wykonawczego pokazano na fotografii 9, zaś na fotografii 10 pokazano wygląd zmontowanego obwodu drukowanego modułu sterującego.

Fotografia 9. Widok zmontowanego obwodu drukowanego modułu wykonawczego
Fotografia 10. Widok zmontowanego obwodu drukowanego modułu sterującego

Specyfikacja MIDI

Implementując program obsługi aplikacji, chciałem, by sterowanie naszym urządzeniem było jak najprostsze. Zgodnie z tym założeniem domyślnie nasz sterownik odbiera komunikaty MIDI na kanale 1. Oczywiście, ustawienie to może być zmodyfikowane dzięki przesłaniu odpowiedniego komunikatu MIDI i zapamiętaniu w nieulotnej pamięci EEPROM sterownika. Co ważne, wszystkie obsługiwane przez układ MIDIswitch komunikaty MIDI to komunikaty typu Control Change, zatem oprócz konieczności przesłania numeru kontrolera Control Change zachodzi potrzeba wysłania również jego wartości.

W takim przypadku komunikat MIDI składa się z 3 bajtów: identyfikatora komunikatu typu Control Change (0xB0), bajta zawierającego numer kontrolera i bajta zawierającego wartość danego kontrolera (nawet wtedy, gdy wartość ta jest bez znaczenia, jeśli chodzi o funkcjonowanie sterownika). Co warto podkreślić, niektóre z poleceń można wydawać na dwa sposoby: w zależności od przekazanej wartości można włączyć lub wyłączyć dany przekaźnik (kontrolery 85…88) lub innym poleceniem zmienić stan przekaźnika na przeciwny (kontrolery 89…92). W ostatnim przypadku przekazywana wartość nie jest brana pod uwagę. Opis wszystkich kontrolerów MIDI wraz ze znaczeniem ich wartości dla funkcjonowania urządzenia pokazano w tabeli 1.

Program sterujący

Na koniec nieco szczegółów implementacyjnych, ponieważ MIDI to ciekawe, a mimo wszystko rzadko prezentowane zagadnienie. Wszystkie komunikaty MIDI przesyłane do naszego sterownika odbierane są w procedurze obsługi przerwania interfejsu USART (USART_RXC_vect) i ładowane do specjalnego bufora kołowego. W ten sposób mamy pewność, że żaden taki komunikat nie zostanie pominięty. Całość procedury obsługi przerwania odpowiedzialnej za odbiór komunikatów MIDI wraz z deklaracją zmiennych pokazano na listingu 1.

Listing 1. Funkcja obsługi przerwania interfejsu USART odpowiedzialna za odbiór komunikatów MIDI (wraz z deklaracją niezbędnych zmiennych)
//Definicje zmiennych bufora odbiorczego MIDI
volatile char MIDIbuffer[MIDI_RX_BUF_SIZE];
// indeks oznaczający „głowę węża” dla bufora MIDI
volatile uint8_t MIDIbufferHead;
// indeks oznaczający „ogon węża” dla bufora MIDI
volatile uint8_t MIDIbufferTail;
//Liczba odebranych danych MIDI będąca jednocześnie flagą odebrania danych
volatile uint8_t MIDIbytes;
//Definicje bufora odbiorczego MIDI
#define MIDI_RX_BUF_SIZE 64
#define MIDI_RX_BUF_MASK (MIDI_RX_BUF_SIZE - 1)

ISR(USART_RXC_vect){
uint8_t newHead, Data;
//Pobieramy bajt danych z bufora sprzętowego USART
Data = UDR;

//Obliczamy nowy indeks „głowy węża”
newHead = (MIDIbufferHead + 1) & MIDI_RX_BUF_MASK;

//Sprawdzamy, czy wąż nie zacznie zjadać własnego ogona
if (newHead == MIDIbufferTail){
//Przepełnienie bufora - można obsłużyć ten błąd
} else {
//Zapamiętujemy nowy indeks „głowy węża”
MIDIbufferHead = newHead;
//Wpisujemy odebrany bajt do bufora FIFO MIDI
MIDIbuffer[newHead] = Data;
++MIDIbytes;
}
}

Całość prostej funkcji pobierającej bajt z bufora danych pokazano na listingu 2. Funkcja inicjalizująca interfejs USART, by można go było użyć jako sprzęg MIDI, została pokazana na listingu 3.

Listing 2. Funkcja pobierająca bajt z bufora kołowego MIDI
uint8_t MIDIgetByte(void){
uint8_t Byte;
ATOMIC_BLOCK(ATOMIC_RESTORESTATE){
//Obliczamy i zapamiętujemy nowy indeks „ogona węża” bufora MIDI
MIDIbufferTail = (MIDIbufferTail + 1) & MIDI_RX_BUF_MASK;
//Zwracamy bajt pobrany z bufora jako rezultat wykonania funkcji
Byte = MIDIbuffer[MIDIbufferTail];
--MIDIbytes;
}
return Byte;
}
Listing 3. Funkcja inicjalizująca interfejs USART do użycia jako sprzęg MIDI
//Definicja prędkości interfejsu MIDI
#define MIDI_BAUD 31250
#define CALCULATED_UBRR F_CPU/16/MIDI_BAUD-1

void MIDIinit(void) {
//Ustawienie prędkości interfejsu MIDI
UBRRH = (CALCULATED_UBRR)>>8;
UBRRL = CALCULATED_UBRR;
//Załączenie odbiornika oraz
//aktywacja przerwania od odbioru danych
UCSRB = (1<<RXEN)|(1<<RXCIE);
//Ustawienie formatu ramki:
//8bitów danych, 1 bit stopu
UCSRC = (3<<UCSZ0);
}

Znając niezbędne funkcje narzędziowe związane z MIDI, możemy przystąpić do implementacji funkcji analizującej nadchodzące dane i sterującej zasobami sprzętowymi urządzenia. Kod takiej funkcji przedstawiono na listingu 4.

Listing 4. Funkcja analizująca nadchodzące komunikaty MIDI
void MIDIhandling(void){
uint8_t receivedByte;
static uint8_t CCnumber, CCvalue;
static uint8_t MIDIstatus = WAIT_FOR_CTRL_CHANGE;

//Sprawdzamy czy odebrano nowe dane MIDI
if(MIDIisReady()){
receivedByte = MIDIgetByte(); //Odczytujemy znak z bufora MIDI

switch(MIDIstatus){
//Sprawdzamy odebranie CC na aktywnym kanale MIDI
case WAIT_FOR_CTRL_CHANGE:
if(((receivedByte & 0xF0) == MIDI_CTRL_CHANGE)
&& ((receivedByte & 0x0F) == eeprom_read_byte(&activeMIDIchannelEE)))
MIDIstatus = WAIT_FOR_CTRL_NUMBER;
break;

//Sprawdzamy, czy nadeszły dane - numer kontrolera MIDI
//(gdy dane to bit7 wyzerowany)
case WAIT_FOR_CTRL_NUMBER:
if(!(receivedByte & 0x80)){
CCnumber = receivedByte;
MIDIstatus = WAIT_FOR_CTRL_VALUE;
} else {
MIDIstatus = WAIT_FOR_CTRL_CHANGE;
}
break;

//Sprawdzamy, czy nadeszły dane - wartość kontrolera MIDI
//(gdy dane to bit7 wyzerowany)
case WAIT_FOR_CTRL_VALUE:
if(!(receivedByte & 0x80)){
CCvalue = receivedByte;
//W zależności od numeru kontrolera CC i jego wartości
//podejmujemy stosowne akcje
switch(CCnumber){
//Obsługa kolejnych kontrolerów MIDI…
}
}
MIDIstatus = WAIT_FOR_CTRL_CHANGE;
break;
}
}
}

Funkcja wywoływana jest każdorazowo w pętli głównej programu aplikacji i przez swoje działanie powoduje stosowną zmianę na portach wyjściowych mikrokontrolera, do których podłączono przekaźniki K1…K8 czy też na wyjściu MUTE. Innymi słowy, wspomniana funkcja realizuje obsługę wszystkich komunikatów MIDI, jakie przedstawiono wcześniej w tabeli 1.

Robert Wołgajew, EP

 

Artykuł ukazał się w
Elektronika Praktyczna
listopad 2019
DO POBRANIA
Pobierz PDF Download icon
Elektronika Praktyczna Plus lipiec - grudzień 2012

Elektronika Praktyczna Plus

Monograficzne wydania specjalne

Elektronik listopad 2024

Elektronik

Magazyn elektroniki profesjonalnej

Raspberry Pi 2015

Raspberry Pi

Wykorzystaj wszystkie możliwości wyjątkowego minikomputera

Świat Radio listopad - grudzień 2024

Świat Radio

Magazyn krótkofalowców i amatorów CB

Automatyka, Podzespoły, Aplikacje październik 2024

Automatyka, Podzespoły, Aplikacje

Technika i rynek systemów automatyki

Elektronika Praktyczna listopad 2024

Elektronika Praktyczna

Międzynarodowy magazyn elektroników konstruktorów

Elektronika dla Wszystkich listopad 2024

Elektronika dla Wszystkich

Interesująca elektronika dla pasjonatów