/* * Programmer: Dominik Schmidt-Philipp * Filename: main.c * * Dedicated to seleomlivet * */ #include #include /* for threading */ // function declarations: void alsa_error (const char *format, ...); void* midiinfunction (void * arg); int main(int argc, char *argv[]) { int status; int mode = SND_RAWMIDI_SYNC; pthread_t midiinthread; snd_rawmidi_t* midiin = NULL; const char* portname = "virtual"; if ((status = snd_rawmidi_open(&midiin, NULL, portname, mode)) < 0) { alsa_error("Problem opening MIDI input: %s", snd_strerror(status)); exit(1); } status = pthread_create(&midiinthread, NULL, midiinfunction, midiin); pthread_join(midiinthread, NULL); snd_rawmidi_close(midiin); midiin=NULL; return 0; } ////////////////////////////// // // midiinfunction -- Thread function which waits around until a MIDI // input byte arrives and then react correspondingly // void *midiinfunction(void *arg) { snd_rawmidi_t* midiin = (snd_rawmidi_t*)arg; int status; int i = 0; char buffer[3]; unsigned char message[3]; while (1) { if ((status = snd_rawmidi_read(midiin, buffer, 3)) < 0) { alsa_error("Problem reading MIDI input: %s", snd_strerror(status)); } // in case of MIDI running status, value bytes need to not override status byte for (i=1; i<=status;i++) { message[3-i] = (unsigned char) buffer[status-i]; } printf("%d: %x %x %x\n", status, message[0], message[1], message[2]); fflush(stdout); } } ////////////////////////////// // // error -- print error message // void alsa_error(const char *format, ...) { va_list ap; va_start(ap, format); vfprintf(stderr, format, ap); va_end(ap); putc('\n', stderr); }