summaryrefslogtreecommitdiff
path: root/tutorials/sndkit/tests/musicin.c
diff options
context:
space:
mode:
Diffstat (limited to 'tutorials/sndkit/tests/musicin.c')
-rw-r--r--tutorials/sndkit/tests/musicin.c222
1 files changed, 222 insertions, 0 deletions
diff --git a/tutorials/sndkit/tests/musicin.c b/tutorials/sndkit/tests/musicin.c
new file mode 100644
index 0000000..651e27a
--- /dev/null
+++ b/tutorials/sndkit/tests/musicin.c
@@ -0,0 +1,222 @@
+/*
+ * Purpose: A program that demonstrates MIDI input with /dev/music (obsolete)
+ * Copyright (C) 4Front Technologies, 2002-2004. Released under GPLv2/CDDL.
+ *
+ * Description:
+ * 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 "{!link MIDI}" 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]);
+ }
+ }
+}