initial commit
[midikeys] / midi.c
1 #include <conio.h>
2 #include "midi.h"
3
4 static int iobase = 0x330;
5
6 #define MPU_PORT_DATA   iobase
7 #define MPU_PORT_STAT   (iobase | 1)
8 #define MPU_PORT_CMD    (iobase | 1)
9
10 #define MPU_STAT_ORDY   0x40
11 #define MPU_STAT_IRDY   0x80
12
13 #define MPU_ACK                         0xfe
14 #define MPU_CMD_RESET           0xff
15 #define MPU_CMD_UARTMODE        0x3f
16
17 #define MIDI_CMD_NOTEON         0x90
18 #define MIDI_CMD_NOTEOFF        0x80
19 #define MIDI_CMD_CHANMSG        0xb0
20 #define MIDI_CMD_CHPROG         0xc0
21
22 #define MIDI_CHANMSG_NOTESOFF   0x7b
23
24 int midi_init(int port)
25 {
26         iobase = port;
27
28         if(midi_send_cmd(MPU_CMD_RESET) == -1) {
29                 return -1;
30         }
31         if(midi_send_cmd(MPU_CMD_UARTMODE) == -1) {
32                 return -1;
33         }
34         midi_alloff();
35         return 0;
36 }
37
38 void midi_shutdown(void)
39 {
40         midi_alloff();
41         midi_send_cmd(MPU_CMD_RESET);
42 }
43
44 void midi_note(int chan, int note, int vel)
45 {
46         if(vel > 0) {
47                 midi_send_data(MIDI_CMD_NOTEON | chan);
48         } else {
49                 midi_send_data(MIDI_CMD_NOTEOFF | chan);
50         }
51         midi_send_data(note);
52         midi_send_data(vel);
53 }
54
55 void midi_chprog(int chan, int prog)
56 {
57         midi_send_data(MIDI_CMD_CHPROG | chan);
58         midi_send_data(prog);
59 }
60
61 void midi_alloff(void)
62 {
63         midi_send_data(MIDI_CMD_CHANMSG);
64         midi_send_data(MIDI_CHANMSG_NOTESOFF);
65 }
66
67 static int wait_ordy(void)
68 {
69         int i;
70         for(i=0; i<1024; i++) {
71                 if((inp(MPU_PORT_STAT) & MPU_STAT_ORDY) == 0) {
72                         return 0;
73                 }
74         }
75         return -1;
76 }
77
78 int midi_send_cmd(int cmd)
79 {
80         if(wait_ordy() == -1) {
81                 return -1;
82         }
83         outp(MPU_PORT_CMD, cmd);
84         return 0;
85 }
86
87 int midi_send_data(int data)
88 {
89         if(wait_ordy() == -1) {
90                 return -1;
91         }
92         outp(MPU_PORT_DATA, data);
93         return 0;
94 }