dc4cd78ac56dc85eccb4086ee3a0c833e10713ab
[sound-tools/ossmidi.git] / midiio.c
1 /* midiio.c
2  *
3  * author: hackbard
4  *
5  */
6
7 #include <stdio.h>
8 #include <string.h>
9 #include <stdlib.h>
10
11 #include <sys/types.h>
12 #include <sys/stat.h>
13 #include <fcntl.h>
14 #include <unistd.h>
15
16 #include <sys/soundcard.h>
17
18 #include "midiio.h"
19
20 /* soem defines */
21 #define MIDI_DEVICE /dev/midi
22 #define NOTE_ON 0x90
23 #define NOTE_OFF 0x80
24 #define NOTE_DATA 0x7F
25 #define CH_MASK 0x0F
26 #define VEL_MASK 0x7F
27
28
29 /* global, do we need sockets global? */
30 int midi_fd;
31
32 int all_stop(int fd) {
33  int i,j;
34  for(j=0;j<16;j++)
35   for(i=0;i<128;i++)
36    note_off(fd,j,i,(int)0x7F);
37  return 0;
38 }
39
40 int midi_write_msg3(int fd,unsigned char status,unsigned char data1,unsigned char data2) {
41  unsigned char buf[3];
42  buf[0]=status;
43  buf[1]=data1;
44  buf[2]=data2;
45  write(fd,buf,3);
46  return 0;
47 }
48
49 int midi_write_msg2(int fd,unsigned char status,unsigned char data1) {
50  unsigned char buf[2];
51  buf[0]=status;
52  buf[1]=data1;
53  write(fd,buf,2);
54  return 0;
55 }
56
57 int note_on(int fd,int chan,int note,int vel) {
58  midi_write_msg3(fd,NOTE_ON|(CH_MASK&chan),note&NOTE_DATA,vel&VEL_MASK);
59  return 0;
60 }
61
62 int note_off(int fd,int chan,int note,int vel) {
63  midi_write_msg3(fd,NOTE_OFF|(CH_MASK&chan),note&NOTE_DATA,vel&VEL_MASK);
64  return 0;
65 }
66
67 int midi_read_msg(int fd,char *buf) {
68  int bytes_read;
69  bytes_read=read(fd,buf,10);
70  return bytes_read;
71 }
72
73 #ifdef TEST_API
74 /* test the io api ... */
75
76 int main(int argc,char **argv) {
77
78  int note,channel,i,j;
79  char my_buf[10]="MIDIMIDI";
80
81  if(argc>1) {
82   note=atoi(argv[2]);
83   channel=atoi(argv[1]);
84  }
85
86  midi_fd=open("/dev/sound/midi",O_RDWR);
87
88  printf("reading ...\n");
89  i=midi_read_msg(midi_fd,my_buf);
90  for(j=0;j<i;j++) printf("%x ",my_buf[j]);
91  printf("\n");
92
93  all_stop(midi_fd);
94  sleep(2);
95
96  for(i=0;i<4;i++) {
97   note_off(midi_fd,0,38,127);
98   note_off(midi_fd,0,42,127);
99   note_on(midi_fd,0,42,127);
100   note_on(midi_fd,0,38,127);
101   sleep(1);
102   note_off(midi_fd,0,42,127);
103   note_on(midi_fd,0,42,127);
104   sleep(1);
105  }
106
107  close(midi_fd);
108 }
109 #endif TEST_API
110