MIDI to system komunikacji wykorzystywany w instrumentach muzycznych. Nie każdy jednak wie, że jest to system wykorzystywany do sterowania w ogóle. Na przykład sterowania światłami w czasie koncertów itp. Jest to o tyle istotne, że powstało naprawdę bardzo dużo różnych sterowników MIDI – od klawiatur i innych instrumentów muzycznych, przez sterowniki nożne (np. Behringer FCB1010) wyposażone w całą serię przełączników nożnych, oraz dwa pedały do płynnego ustawiania… czegokolwiek, aż do całych stołów mikserskich z dziesiątkami różnych gałek i suwaków.

MIDI idealnie nadaje się do sterowania naszą malinką – ponieważ sterowniki są łatwo wykrywalne przez USB (ew. kartę MIDI->USB)

Dodatkowo oprogramowanie takiego sterownika jest banalnie proste w języku C z biblioteką ALSA, kompilujemy:

1
2
sudo apt-get install libasound2
gcc cymbalki.c -o cymbalki -lasound

UWAGA! Wejście MIDI ustawiłem w programie jako „hw:1,0,0”, aby odczytać na jakim porcie zainstalował się nasz sterownik użyjcie polecenia

1
amidi -l

cymbalki.c:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <stdio.h>
#include <alsa/asoundlib.h>
#include <signal.h>
int stop=0;
void sighandler(int dum)
{
        stop=1;
}

int main(int argc,char** argv)
{
        int err;
        char *device_in = "hw:1,0,0";
        snd_rawmidi_t *handle_in = 0;  
        struct sigaction act; //przejęcie przerwania Ctrl+C (trzy linijki kodu)
        act.sa_handler = sighandler;
        sigaction(SIGINT, &act, NULL);      
 
       err = snd_rawmidi_open(&handle_in,NULL,device_in,0);    
       if (err)  fprintf(stderr,"snd_rawmidi_open %s błąd: %d\n",device_in,err);  
       if (handle_in) {
           fprintf(stderr,"Czytanie z wejścia MIDI hw:1,0,0\n");
           fprintf(stderr,"Aby przerwać: Ctrl+C\n");    
           unsigned char ch; //wczytanie bajtu
           while (!stop) {
                                snd_rawmidi_read(handle_in,&ch,1);
                                fprintf(stderr,"wczytane %02x\n",ch);
                        }
           fprintf(stderr,"\nZamykanie portu MIDI\n");
           snd_rawmidi_drain(handle_in);
           snd_rawmidi_close(handle_in);  
        }
        return 0;
}