IX. TavIR programozói verseny: Székely András - Gitárba szerelt MIDI effektvezérlő

Összefoglalás

Egy ismerősöm gitárépítésbe kezdett, Matthew Bellamy (a Muse gitárosának) MB-1-es modellje alapján. A gitár egyik különlegessége a testbe szerelt Touchsensor, amivel MIDI porton keresztül különböző effekteket lehet vezérelni a képernyő X-Y koordinátái alapján. A famunkákat és festést megoldotta, de az elektronikához nem értve a segítségemet kérte, mivel ilyen effektvezérlőt hangszerüzletekben nem lehet kapni. Felvetettem ötletnek, hogy megépítem. Itt jegyezném meg, hogy elektronikával és programozással és a kettő találkozásával AVR-ezéssel csak hobbiból foglalkozom, sohasem tanultam. Így valószínűleg sok megoldásom nem a megszokott, legelegánsabb módon lett kivitelezve.

A tervezés kezdetekor már sok minden meg volt határozva, részben az eredeti gitár miatt, részben pedig az ismereteim és a számunkra beszerezhető alkatrészek miatt.

  • 5,7”-os touch sensor (ekkora fér el a gitáron);
  • Szabványos MIDI kommunikáció, csak így használható effektek vezérlésére;
  • Atmel ATMega8-as mikrovezérlő, ezt ismertem és rendelkezett a szükséges paraméterekkel;
  • Bascom-AVR fejlesztőprogram;
  • RGB led a képernyő alá, az eredeti gitárhoz hasonlóan (a vezérlése PWM-el);
  • Forgó encoder, a vezérléshez szükséges;
  • Nyomógomb, szintén a vezérléshez szükséges.

Gitárba szerelt MIDI effektvezérlő

A vezérlőben a touch sensor használata volt az egyik legnagyobb feladat. Interneten olvasgatva arra jutottam, hogy rezisztív technológiát használok - annak egyszerű használhatósága miatt. Miután egy HT057A-NDOFG45 típusú „kijelzőt” megvásároltunk, nekiálltam a kód e részének a megírásához. Hogy a hibaforrásokat minimalizáljam, ekkor még csak a képernyővel foglalkoztam és a koordinátákat soros porton küldve számítógépen figyeltem. Nagy segítségemre volt az MCS electronics cég weboldalán lévő mintaprogram: http://www.mcselec.com/index.php?option=com_content&task=view&id=189&Itemid=57

A kiolvasás, - ahogyan a fenti linken is olvasható - rendkívül egyszerű. Az ábra jelöléseit használva: az X koordináta kiolvasásához az X(+) lábat 5V-ra húzzuk, az X(-) lábat pedig a földre kapcsoljuk; ekkor az Y(+) vagy Y(-) lábon feszültséget mérve és ezt a X(+) és X(-) közötti lineáris feszültség esést feltételezve megkapjuk az X koordinátát. Az Y koordináta kiolvasása hasonlóan működik, a lábakat értelemszerűen felcserélve.

 

A programban, - hogy a valós koordinátákat kapjuk, - szükség van utófeldolgozásra. Ez azért szükséges, mert a képernyő két végét nyomva nem 0 és 5 voltot mérhetünk, hanem például 0,5 és 4,5 voltot. Hogy a koordináták ehhez hasonlóan ne 24-től 230-ig változzanak (0-255 helyett) a mérhető szélső értékeket felhasználva számolással korrigáljuk a mért értéket. A szélső értékeket ezen számolós rész kihagyása nélkül lehet kiolvasni, amik bár idővel elvileg változhatnak: a programban ezek még is fix értékek, mert a tapasztalat azt mutatta, hogy így is megfelelően használható a vezérlő.

A kapott koordinátákat több dologhoz is használja a program. A legfontosabb ezek közül, hogy elküldi MIDI üzenetként.

Musical Instrument Digital Interface (röviden MIDI) szintetizátorok és stúdióeszközök összekötésére alkalmas, ami egy 1980-ban több szintetizátor gyártó szövetsége által létrehozott ajánlás, mely később szabvánnyá vált. Fizikailag egy aszinkron soros vonali kommunikáció.

Ez ugyan úgy történik, mint ha sima soros portra küldenénk az üzenetet, például egy számítógépre. A különbség mindössze annyi hogy a logikai 0 és 1 pont fordítva van feszültséghez rendelve, tehát ameddig a számítógépes soros portnál 0V logikailag is 0, MIDI-nél pont fordítva, tehát mikor nem folyik kommunikáció akkor folyamatosan 5V-on van a mikrovezérlő Transmit Data lába. Bascom-ban szerencsére ezt egy változóval (Clockpol) lehet állítani, így ennek a technikai oldalával nem volt sok dolgom. A konfigurálás így nézett ki:

Config Com1 = Dummy, Synchrone = 0, Parity = None, Stopbits = 1,
       Databits = 8, Clockpol = 1     

Hogy az üzenetben mit küldünk, azt már a MIDI szabványa és a használni kívánt eszköz határozza meg. Én ezt az effektünk, egy Korg Kaoss Pad kézi könyvéből kerestem ki. Általánosan egy MIDI üzenet 1-3 byte-ból áll, mindegyik start és stop bitekkel határolva. Hogy melyik byte-ban mi szerepel azt a következő táblázat jól összefoglalja: http://www.midimountain.com/midi/midi_status.htm

A Korg effekt megfelelő működéséhez nem csak az értékeket kell elküldeni, hanem külön jelet kell küldeni, amikor a képernyőhöz hozzáérünk, majd egy másikat mikor elengedjük. A koordinátákat csak a két jel között veszi figyelembe. Hogy a képernyő éppen érintve van-e, eldönthető a kiolvasott értékből. Mikor nem érünk hozzá, akkor viszonylag stabilan 0V körüli értékeket kapunk, tehát ha ettől eltérő a mért adat, akkor valami hozzáért. Ezt a dolgot bonyolítja, hogy van egy nyomógomb (HOLD), ami megnyomása után továbbra is azt az értéket küldi a vezérlő, amit utoljára beolvasott. Ez olyankor hasznos mikor egy effekt szükséges a gitárjáték során, de mivel ilyenkor mindkét kezünk foglalt, nem tudjuk a képernyőt nyomkodni. Hogy a vezérlő csak akkor küldjön üzenetet és olyat, amikor és amilyen szükséges, azt így az egymásba ágyazott HA függvények segítségével oldom meg.

Például, ha a HOLD aktív, de eddig még nem nyúltunk hozzá a képernyőhöz, akkor az első érintéskor először küldeni kell egy darab két byteból álló üzenetet arról, hogy a képernyő aktív, majd el kell küldeni az X és Y koordinátákat is. Miután elengedjük a képernyőt, a HOLD miatt a vezérlő nem küld záró üzenetet, így az effekt aktív marad az utolsó bemeneti értékekkel működve.

A koordinátáknak egy másik, inkább látványos, mint hasznos felhasználása a ledek vezérlése. Ez az eredeti gitár miatt került csak beépítésre, gyakorlati haszna nincsen. A lényege, hogy a képernyő minden pontjához különböző szín legyen hozzárendelve és annak megérintésekor a LED az adott színnel világítson. RGB LED-et használva és PWM vezérlést használva, a Piros, Zöld és Kék színek erősségét, egyszerűen a PWM kitöltési tényezőjével szabályozom. A mellékelt programban ez egyszerűen úgy van megoldva, hogy a koordináták arányosak a különböző színek erőségével. Mivel két koordináta van és három szín, így értelem szerűen az egyik koordinátához két szín van rendelve. A jövőben ezt a megoldást át fogjuk alakítani egy olyanra ahol a képernyő téglalapokra van osztva és mindegyik (képzeletbeli) téglalaphoz érve másik szín lesz aktív.

Végül, de nem utolsó sorban, a vezérlőhöz még tartozik egy „rotary encoder”, amivel a Korg különböző effektjeit váltogathatjuk. Egy egyszerű mechanikus enkódert használtunk, amit forgatva és figyelve a két kimenetét valami hasonló dolgot láthatnánk (a képen a programban használt jelölések és logikai összefüggések szerepelnek):

Egyszerűsége ellenére talán ezzel a résszel szenvedtem a legtöbbet, mert tapasztalat hiányában a programban kerestem a hibát: ami – mint utólag kiderült – csupán két 100nF-os kondenzátor hiánya volt a jeladó lábain. A jeladó egyik lába megszakításként van bekötve, mivel egy forgatás figyelmen kívül hagyása vagy késése nem kívánatos. A megszakításban csak azt jegyzi fel a program, hogy melyik irányba mennyit forgott a jeladó és a prellegés miatt vár 10ms-ot. A effektszám változását és ennek elküldését csak a főprogramban teszi meg.

A nyomtatott áramkört én terveztem és gyártottam lézernyomtatós technikával. Számomra a legnagyobb fejlődés - az első felület szerelt alkatrészem - a képernyő fóliakábel csatlakozója volt: 1mm-es raszterrel. Ha nem is lett szép a panel, az első verzió tökéletesen működött. Ez nagy megelégedettséggel töltött el.

A fejlesztés során a következő mintaprogramokból vettem át, vagy értettem meg dolgokat:

Fájlmelléklet: 

TavIR-Facebook