Kuźma Tomasz „Uniwersalny sterownik MIDI”
Transkrypt
Kuźma Tomasz „Uniwersalny sterownik MIDI”
Tomasz Kuźma – II rok Koło Naukowe Techniki Cyfrowej dr inż. Wojciech Mysiński – opiekun naukowy Universal MIDI controller Uniwersalny sterownik MIDI Keywords: MIDI controller, MIDI, control device Słowa kluczowe: sterownik MIDI, sterowanie urządzeniami, MIDI 1. Wstęp Sterownik (bądź kontroler) MIDI służy do zewnętrznego sterownia urządzeniami muzycznymi. Przykładami takich urządzeń mogą być: miksery cyfrowe, keyboardy, multiefekty gitarowe bądź wokalne. Generalnie każde urządzenie, które posiada interfejs MIDI może zostać obsłużone przez taki sterownik. Zakres kontroli parametrów zależy tylko i wyłącznie od sterowanego urządzenia, gdyż sterownik wysyła komunikaty odwołujące się bezpośrednio do parametrów urządzenia. 2. Protokół MIDI Do komunikacji z urządzeniami sterownik wykorzystuje protokół MIDI. MIDI (Musical Instrument Digital Interface), z ang. „cyfrowy interfejs instrumentów muzycznych”) – jest to system (interfejs, oprogramowanie i zestaw komend) służący do przekazywania informacji pomiędzy elektronicznymi instrumentami muzycznymi oraz do sterownia nimi. Standard MIDI został stworzony w 1983 roku w celu ujednolicenia komunikacji cyfrowych syntezatorów. Wraz z rozwojem komputerów osobistych i technologii multimedialnych standard MIDI został zaadaptowany do komunikacji między komputerem a kartą dźwiękową. Pozwoliło to komponować muzykę oraz odtwarzać ją korzystając wyłącznie z komputera (przy użyciu odpowiedniego oprogramowania). MIDI zawiera standard sprzętu oraz język komend. Informacje przesyłane są za pomocą połączenia szeregowego z prędkością 31250 bitów na sekundę. Pojedynczy komunikat MIDI składa się z trzech bajtów: Rys. 1 Ramka komunikatu MIDI Fig. 1 MIDI message frame 3. Budowa urządzenia Urządzenie zostało wykonane w oparciu o mikrokontrolery firmy Atmel. Jeden z nich (Atmega32) pełni rolę głównego mikrokontrolera. Obsługuje on wyświetlacz LCD, czteroprzyciskową klawiaturę, dzięki której poruszamy się po ustawieniach sterownika, sześć nożnych przełączników oraz transmisję komunikatu MIDI. Drugi mikrokontroler to Atmega8 i pełni on jedynie funkcję odbiorczo- nadawczą, gdyż wykonany przeze mnie sterownik ma możliwość przyłączenia do niego zewnętrznego sterownika. Można to było zrealizować na jednym mikrokontrolerze jednakże zależało mi aby sterownik obsługiwał niezależnie i w tym samym czasie przełączniki podłączone do niego jak również zewnętrzny sterownik. Dzięki temu nie ma możliwości żeby jakikolwiek komunikat został pominięty. Mikrokontrolery komunikują się ze sobą na zasadzie wystawiania sygnału logicznego „1” lub „0”. Jeśli jeden mikrokontroler wysyła komunikat MIDI to drugi czeka aż pierwszy skończy. W przeciwnym wypadku doszłoby do konfliktu komunikatów i urządzenie, którym sterujemy zostałoby błędnie obsłużone. Jeden jak i drugi mikrokontroler jest taktowany zewnętrznym kwarcem o częstotliwości 16 MHz. Jak wcześniej pisałem komunikacja MIDI wymaga szeregowego przesyłania bitów z prędkością 31250 b/s z maksymalnym błędem ±1%. Wewnętrzny oscylator nie sprostałby takim wymaganiom. Reszta elementów na płytce to układ zasilania oraz peryferia do sprzętowej obsługi MIDI. Układ zasilania jest oczywiście stabilizowany. Dzięki temu możemy podłączyć zasilacz z zakresu 6-18 V dbając jedynie o odpowiednią polaryzację. Rys. 2 Schemat układu Fig. 2 Device wiring diagram Rys. 3 Fotografia urządzenia Fig. 2 Photo of device Program sterownika został napisany w języku C, użyty kompilator to WinAVR. Po optymalizacji kod zawiera 700 linii. Przykładowa funkcja programu (obsługa menu): void switchs (uint8_t posx, uint8_t tabset[]) { if(sw3) { _delay_ms(300); while(!sw4) { if(sw3) { posx++; _delay_ms(300); } if(posx>6) posx=1; if(posx==1) { LCD_GoTo(0, 0); LCD_WriteText("FOOTSWITCH CHANNEL: "); LCD_GoTo(0, 1); LCD_WriteData(((tabset[0]+1)/10)+48); LCD_WriteData(((tabset[0]+1)%10)+48); LCD_WriteText(" "); sw1sw2(&tabset[0], 0, 15); } if(posx==2) { LCD_GoTo(0, 0); LCD_WriteText("FOOTSWITCH TYPE: "); if(tabset[1]==0) { LCD_GoTo(0, 1); LCD_WriteText("MOMENTARY "); } if(tabset[1]==1) { LCD_GoTo(0, 1); LCD_WriteText("LATCHING "); } sw1sw2(&tabset[1], 0, 1); } if(posx==3) { LCD_GoTo(0, 0); LCD_WriteText("FOOTSWITCH MODE: "); if(tabset[2]==0) { LCD_GoTo(0, 1); LCD_WriteText("PROGRAM CHANGE "); } if(tabset[2]==1) { LCD_GoTo(0, 1); LCD_WriteText("CONTROL CHANGE "); } sw1sw2(&tabset[2], 0, 1); } if(tabset[2]==0) { if(posx==4) { lcd3dig("PROG NUMBER OFF: ", tabset[3]); sw1sw2(&tabset[3], 0, 127); } if(posx==5) { lcd3dig("PROG NUMBER ON: ", tabset[4]); sw1sw2(&tabset[4], 0, 127); } if(posx>5) posx=1; } if(tabset[2]==1) { if(posx==4) { lcd3dig("CONTROL NUMBER: ", tabset[5]); sw1sw2(&tabset[5], 0, 127); } if(posx==5) { lcd3dig("CTRL VELOCITY OFF: ", tabset[6]); sw1sw2(&tabset[6], 0, 127); } if(posx==6) { lcd3dig("CTRL VELOCITY ON: ", tabset[7]); sw1sw2(&tabset[7], 0, 127); } } } _delay_ms(300); LCD_Clear(); } } 4. Zastosowanie sterownika Wykonany przeze mnie sterownik może działać z wieloma urządzeniami muzycznymi o czym była mowa we wstępnie. W zaprzyjaźnionym zespole muzycznym kontroler świetnie się spisuje według załączonego poniżej schematu: Rys. 3 Schemat zastosowania Fig. 4 Scheme of application 5. Podsumowanie Wykonany przeze mnie sterownik to stosunkowo proste urządzenie, jeśli chodzi o budowę elektroniczną, czego o kodzie programu nie można powiedzieć. Jest on dość obszerny oraz skomplikowany i niestety bez niego urządzenie byłoby bezużyteczne. Uważam, że mój kontroler może z powodzeniem konkurować z produktami komercyjnymi, gdyż ma wiele zalet, których inne sterowniki nie mają. Literatura [1] Summary of MIDI Messages www.midi.org/specifications/item/table-1-summary-of-midi-message [2] MIDI DIN Electrical Specification www.midi.org/specifications/item/midi-din-electrical-specification