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