11 #include <sys/types.h>
16 #include <sys/soundcard.h>
21 #define MIDI_DEVICE "/dev/midi"
24 #define NOTE_DATA 0x7F
32 /* global, do we need sockets global? */
35 int all_stop(int fd) {
39 note_off(fd,j,i,(int)0x7F);
43 int midi_write_msg3(int fd,unsigned char status,unsigned char data1,unsigned char data2) {
52 int midi_write_msg2(int fd,unsigned char status,unsigned char data1) {
60 int note_on(int fd,int chan,int note,int vel) {
61 midi_write_msg3(fd,NOTE_ON|(CH_MASK&chan),note&NOTE_DATA,vel&VEL_MASK);
65 int note_off(int fd,int chan,int note,int vel) {
66 midi_write_msg3(fd,NOTE_OFF|(CH_MASK&chan),note&NOTE_DATA,vel&VEL_MASK);
70 int midi_read(int fd,char *buf) {
71 return(read(fd,buf,1));
74 int midi_read_msg(int fd,char *buf) {
77 midi_read(fd,tmp_buf);
78 printf("debug: %x\n",tmp_buf);
81 /* decide how much to read */
82 if(((buf[0]&MSB_MASK)==PROGRAM_CHANGE) || ((buf[0]&MSB_MASK)==CHANNEL_PRESSURE)) {
83 printf("debug: program change or channel pressure event detected\n");
84 midi_read(fd,tmp_buf);
88 printf("debug: none program change or channel pressure event detected\n");
90 midi_read(fd,tmp_buf);
101 /* test the io api ... */
103 int main(int argc,char **argv) {
105 int note,channel,i,j,k;
110 channel=atoi(argv[1]);
113 midi_fd=open(MIDI_DEVICE,O_RDWR);
114 printf("debug: midi_fd = %d\n",midi_fd);
116 printf("reading ...\n");
117 i=midi_read_msg(midi_fd,my_buf);
118 printf("debug: i = %d\n",i);
120 for(j=7;j>=0;j--) printf("%s%d%s",(j==7?"|":""),
121 (((int)my_buf[k] & (1<<j))>0?1:0),
125 printf("sleep for 3 secs ...\n");
132 note_off(midi_fd,0,38,127);
133 note_off(midi_fd,0,42,127);
134 note_on(midi_fd,0,42,127);
135 note_on(midi_fd,0,38,127);
137 note_off(midi_fd,0,42,127);
138 note_on(midi_fd,0,42,127);