Open Sound System |
Do you have problems with sound/audio application development? Don't panic! Click here for help! |
Copyright (C) 4Front Technologies, 2002-2004. Released under GPLv2/CDDL.
This program was supposed to be a sample program for doing MIDI input with the /dev/music interface. However it has not much use since the /dev/music interface is now obsoleted.
The /dev/midi interface is recommended in the new applications. Please see the "OSS MIDI Programming" section of the OSS Developer's manual.
#include <soundcard.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> void decode_event (unsigned char *ev) { int i; for (i = 0; i < 8; i++) { printf ("%02x ", ev[i]); } printf (": "); switch (ev[0]) { case EV_CHN_VOICE: printf ("EV_CHN_VOICE(%d)\t| ", ev[1]); switch (ev[2]) { case MIDI_NOTEON: printf ("Note On ch%d note%d vel%d", ev[3], ev[4], ev[5]); break; case MIDI_NOTEOFF: printf ("Note Off ch%d note%d vel%d", ev[3], ev[4], ev[5]); break; case MIDI_KEY_PRESSURE: printf ("KPressure ch%d note%d vel%d", ev[3], ev[4], ev[5]); break; default: printf ("*** Unknown ***"); } break; case EV_CHN_COMMON: printf ("EV_CHN_COMMON\tdev%d\t| ", ev[1]); switch (ev[2]) { case MIDI_CHN_PRESSURE: printf ("MIDI_CHN_PRESSURE ch%d %d", ev[3], ev[4]); break; case MIDI_PGM_CHANGE: printf ("MIDI_PGM_CHANGE ch%d %d", ev[3], ev[4]); break; case MIDI_CTL_CHANGE: printf ("MIDI_CTL_CHANGE ch%d %d,%d", ev[3], ev[4], *(short *) &ev[6]); break; case MIDI_PITCH_BEND: printf ("MIDI_CTL_CHANGE ch%d %d", ev[3], *(short *) &ev[6]); break; default: printf ("*** Unknown ***"); } break; case EV_SYSEX: printf ("EV_SYSEX\tdev%d: ", ev[1]); for (i = 2; i < 8; i++) printf ("%02x ", ev[i]); break; case EV_TIMING: printf ("EV_TIMING\t\t| "); switch (ev[1]) { case TMR_START: printf ("TMR_START\t"); break; case TMR_STOP: printf ("TMR_STOP\t"); break; case TMR_CONTINUE: printf ("TMR_CONTINUE\t"); break; case TMR_WAIT_ABS: printf ("TMR_WAIT_ABS\t%10u", *(unsigned int *) &ev[4]); break; case TMR_WAIT_REL: printf ("TMR_WAIT_REL\t%10u", *(unsigned int *) &ev[4]); break; case TMR_ECHO: printf ("TMR_ECHO\t%10u", *(unsigned int *) &ev[4]); break; case TMR_TEMPO: printf ("TMR_TEMPO\t%10u", *(unsigned int *) &ev[4]); break; case TMR_SPP: printf ("TMR_SPP\t%10u", *(unsigned int *) &ev[4]); break; case TMR_TIMESIG: printf ("TMR_TIMESIG\t%10u", *(unsigned int *) &ev[4]); break; } break; case EV_SEQ_LOCAL: printf ("EV_SEQ_LOCAL\t*** Should not happen ***"); break; case EV_SYSTEM: printf ("EV_SYSTEM(%d)\t\t| ", ev[1]); switch (ev[2]) { case 0xf0: printf ("SysEx *** Should not happen ***"); break; case 0xf1: printf ("MTC Qframe %02x", ev[3]); break; case 0xf2: printf ("Songpos ptr %02x,%02x", ev[3], ev[4]); break; case 0xf3: printf ("Song select %02x", ev[3]); break; case 0xf4: case 0xf5: printf ("*** Undefined ***"); break; case 0xf6: printf ("Tune request"); break; case 0xf7: printf ("EOX"); break; case 0xf8: printf ("Timing clock"); break; case 0xf9: printf ("** Undefined ***"); break; case 0xfa: printf ("Start"); break; case 0xfb: printf ("Continue"); break; case 0xfc: printf ("Stop"); break; case 0xfd: printf ("** Undefined ***"); break; case 0xfe: printf ("Active sensing"); break; case 0xff: printf ("SYSTEM RESET"); break; } break; default: printf ("*** Unknown event type ***"); } printf ("\n"); } int main (int argc, int *argv[]) { int fd, l, i; unsigned char buf[4096]; if ((fd = open ("/dev/music", O_RDONLY, 0)) == -1) { perror ("/dev/music"); exit (-1); } if (ioctl (fd, SNDCTL_SEQ_ACTSENSE_ENABLE, 0) == -1) { perror ("/dev/music ACTSENSE_ENABLE"); exit (-1); } if (ioctl (fd, SNDCTL_SEQ_TIMING_ENABLE, 0) == -1) { perror ("/dev/music TIMING_ENABLE"); exit (-1); } if (ioctl (fd, SNDCTL_SEQ_RT_ENABLE, 0) == -1) { perror ("/dev/music RT_ENABLE"); exit (-1); } while ((l = read (fd, buf, sizeof (buf))) != -1) { for (i = 0; i < l; i += 8) { decode_event (&buf[i]); } } }