Pokazujemy jak prosto zbudować magiczne pudełeczko dzięki któremu będzie można połączyć urządzenia MIDI USB z klasycznymi sprzętami MIDI 5 DIN. Zysk jest spory, bo wydamy ok. 120 zł zamiast 400 zł.
For English speaking visitors: PDF plus some info how to opto-isolate 5 DIN MIDI input.
Potrzeba zbudowania takiego urządzenia pojawiła się, kiedy w moje ręce trafił Fishman Triple Play. Świetny kontroler, ale w formie takiej jakiej jest sprzedawany może być wykorzystany tylko z komputerem. A szkoda przecież marnować jego potencjału, kiedy w racku zajmują miejsce sprzętowe syntezatory. Na szczęście TriplePlay jaki i sporo innych urządzeń (np. seria kontrolerów Korg Nano), w których producent zrezygnował z klasycznego MIDI, nie wymagają żadnych sterowników do działania z jakimkolwiek komputerem, tabletem czy telefonem. Oznacza to, że są zgodne z tzw. specyfikacją MIDI Class Compilant Device.
Komercyjnie dostępne rozwiązanie Kenton MIDI USB Host kosztuje 400 zł. Można jednak zbudować projekt bazujący na platformie Arduino, którego sercem jest jednoukładowy kontroler AT Mega 328. Jej główną zaletą jest cena: za oryginalne Arduino ok. 95 zł, a gdy sięgniemy po zgodne z nim projekty typu Funduino, koszty będą jeszcze niższe (ok. 50 zł). W sumie na realizację wydamy od 120 do 200 zł plus cena obudowy.
Komponenty
Zanim zaczniemy warto jednak zapoznać się z Arduino korzystając choćby z „łopatologicznego” wprowadzenia jakie można znaleźć na stronie Majsterkowo.pl . Konieczna także będzie także podstawowa umiejętność lutowania. Do zbudowania własnego Hosta MIDI USB potrzebować będziemy poniższych komponentów:
- 1x płytka Arduino Uno lub Uno R3 (np.: http://nettigo.pl/products/251)
- 1x USB Host Shield dla Arduino (np.: ze sklepu dx.com, gdzie są darmowe przesyłki do Polski)
- 2x gniazda 5 DIN dla wejścia i wyjścia MIDI
- 2x rezystory 220 Ohm
- kable, płytki prototypowe (te znajdziemy w zestawie startowym Arduino, który kosztuje ok. 30-40 zł)
Przygotowania
Rozpoczynamy od zainstalowania środowiska programistycznego Arduino IDE 1.0.5 oraz potrzebnych bibliotek.
- USB Host shield 2.0, która służy do obsługi płytki-tarczy USB. Pobieramy ją ze strony github.com/felis/USB_Host_Shield_2.0,
- Arduino MIDI 4.0, odpowiada za obsługę MIDI przez platformę Arduino (playground.arduino.cc/Main/MIDILibrary)
- USBH_MIDI z gałęzi (branch) IOP_ArduinoMIDI, którą po moich sugestiach przygotował Yuuichi Akagawa, tak by obsługiwała dwukierunkową komunikację MIDI 5 DIN < > USB Host. (https://github.com/YuuichiAkagawa/USBH_MIDI/tree/IOP_ArduinoMIDI).
Na przykładzie USB Host Shielda pokaże jak należy zainstalować biblioteki. Z GitHuba ściągamy plik master.zip, rozpakowujemy do katalogu, który nazywamy np. USB_Host_Shield_20 (nazwa nie może mieć żadnych znaków specjalnych). W aplikacji IDE sprawdzamy w Plik | Preferencje, gdzie na dysku znajduje się katalog ze szkicami Arduino. Otwieramy go i jeżeli to konieczne tworzymy w nim folder o nazwie „libraries”. Następnie przenosimy do niego katalog USB_Host_Shield_20. Podobny proces powtarzamy dla dwóch kolejnych bibliotek. Aby zainstalowane biblioteki były widoczne dla środowiska programistycznego konieczne jest ponowne uruchomienie Arduino IDE.
Składamy projekt
Łączymy Arduino z tarczą USB Host. W gniazdach 5 DIN do złączy 5, 2, 4 przylutowujemy przewody, którymi według poniższego schematu podłączymy je do Arduino.
- 5 – podłączamy do gniazd TX lub RX; Wyjście MIDI będzie połączone z portem TX (transmisja), a wejście MIDI z portem RX (odbiór)
- 2 – łączymy z masą (GND)
- 3 – do tego złącza podajemy napięcie +5 V, które musi popłynąć przez rezystor 220 Ohm.
W montażu powinien pomóc poniższy schemat przygotowany we Fritzingu. Kable czarne oznaczają masę (GND), czerwone napięcie +5 V, a zielony i żółty odpowiednio porty TX i RX.
Uwaga! Żeby nasza konstrukcja była zgodna ze sztuką i wymaganiami specyfikacji MIDI, wejście MIDI powinno zostać odseparowane galwanicznie od reszty układu (lub nie powinniśmy go podłączać). W tym celu stosuje się szybkie transoptory (optoizolatory) Sharp PC-900 albo HP 6N138. Z kolei, żeby kabel MIDI nie zamienił się w antenę nadawczą, powinno się zastosować dla każdej z linii przewodów tzw. kondensator sprzęgający. Układ wciąż pozostaje prosty, a koszt wykonania wzrasta o dodatkowe 5-10 zł. Schemat jak to zrobić znajdziecie tutaj.
Programujemy
Uruchamiamy Arduino IDE i z biblioteki szkiców (sketch) wybieramy „biderctional_converter” (Menu File > Examples > USBH> biderctional_converter). Kompilujemy szkic i tym samym sprawdzamy czy mam odpowiednie biblioteki i czy są one dobrze zainstalowane.
Podłączamy płytkę Arduino do komputera i ładujemy do niej szkic. Arduino możemy odłączyć od komputera i zasilać je albo przez USB (np. z ładowarki do telefonu) albo korzystając z zasilacza 7-12 V.
Jeśli wszystko zostało wykonanie poprawnie to możemy podłączyć do naszego projektu urządzenie USB MIDI Class Compilant (np. Fishman TriplePlay), a do gniazd MIDI 5 „klasyczne” urządzenie MIDI, takie jak np. syntezator. Biblioteka autorstwa Yuuichi Akagawy nie wspiera komunikacji pomiędzy podłączonymi urządzeniami a komputerem. Nie oferuje tego również urządzenie Kentona, ale taką funkcjonalność znajdziemy np. w iConnectMIDI i w warunkach studyjnych bywa to przydatne.
Można tez użyć hub-a na USB i telefonu Iphone albo Ipada z aplikacja Midibridge
https://itunes.apple.com/us/app/midibridge/id449160859?mt=8.
Pozwala to krosować więcej urządzeń.
Wielkie Dzieki!
Super projekt i biore sie do roboty zaraz jak tylko wroce z wakacji! Biorac pod uwage, ze jest wrzesien 2014 a projekt jest z kwietnia 2014 chyba nic sie nie zmienilo jesli chodzi o soft. Pozdrawiam!
Karol jak będzie problem to napisz.
Hi I tried it but ,I have nanokontrol and no boot.
What I doing wrong,
here is code
USB Usb;
USBH_MIDI Midi(&Usb);
void MIDI_poll();
void doDelay(unsigned long t1, unsigned long t2, unsigned long delayTime);
void setup()
{
Serial1.begin(31250);
//Workaround for non UHS2.0 Shield
pinMode(7,OUTPUT);
digitalWrite(7,HIGH);
if (Usb.Init() == -1) {
while(1); //halt
}//if (Usb.Init() == -1…
delay( 200 );
}
void loop()
{
unsigned long t1;
Usb.Task();
t1 = micros();
if( Usb.getUsbTaskState() == USB_STATE_RUNNING )
{
MIDI_poll();
}
//delay(1ms)
doDelay(t1, micros(), 1000);
}
// Poll USB MIDI Controler and send to serial MIDI
void MIDI_poll()
{
byte outBuf[ 3 ];
uint8_t size;
do {
if( (size=Midi.RecvData(outBuf)) > 0 ){
//MIDI Output
Serial1.write(outBuf, size);
}
}while(size>0);
}
// Delay time (max 16383 us)
void doDelay(unsigned long t1, unsigned long t2, unsigned long delayTime)
{
unsigned long t3;
if( t1 > t2 ){
t3 = (4294967295 – t1 + t2);
}else{
t3 = t2 – t1;
}
if( t3 < delayTime ){
delayMicroseconds(delayTime – t3);
}
Thank you Mirek
Witam
Jestem skłonny kupić taki wynalazek za podaną w artykule cenę + koszty roboty. Zapraszam do kontaktu email: j.piotrek198@gmail.com. Pozdrawiam
Zrob. To naprawde jest proste.
A gdzie jest wymagana specyfikacją MIDI separacja optyczna pętli prądowej na wejściu MIDI IN?
Czy bez tego nie popalę sobie portów MIDI w syntezatorze?
Osobiście nie uzywałem, ale separacja jest opisana tuż pod wstępem, drugi link.
Czy można w podobny sposób wykonać transmisję midi poprzez BT?
Midi 5DIN –> BT –> iPhone
Czy można to zrealizować na samym HC-08?