Subversion Repositories svn.mios32

Rev

Rev 2644 | Rev 2648 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
32 tk 1
// $Id: mios32_midi.h 2647 2019-01-08 11:34:00Z Antichambre $
2
/*
3
 * Header file for MIDI layer
4
 *
5
 * ==========================================================================
6
 *
7
 *  Copyright (C) 2008 Thorsten Klose (tk@midibox.org)
8
 *  Licensed for personal non-commercial use only.
9
 *  All other rights reserved.
843 philetaylo 10
 *
32 tk 11
 * ==========================================================================
12
 */
13
 
14
#ifndef _MIOS32_MIDI_H
15
#define _MIOS32_MIDI_H
16
 
17
/////////////////////////////////////////////////////////////////////////////
18
// Global definitions
19
/////////////////////////////////////////////////////////////////////////////
20
 
78 tk 21
// the default MIDI port for MIDI output
22
#ifndef MIOS32_MIDI_DEFAULT_PORT
23
#define MIOS32_MIDI_DEFAULT_PORT USB0
24
#endif
33 tk 25
 
78 tk 26
 
307 tk 27
// the default MIDI port for debugging output via MIOS32_MIDI_SendDebugMessage
28
#ifndef MIOS32_MIDI_DEBUG_PORT
29
#define MIOS32_MIDI_DEBUG_PORT USB0
30
#endif
31
 
32
 
69 tk 33
/////////////////////////////////////////////////////////////////////////////
225 tk 34
// Uses by MIOS32 SysEx parser
35
/////////////////////////////////////////////////////////////////////////////
36
 
582 tk 37
// MIDI commands and acknowledge reply codes
307 tk 38
#define MIOS32_MIDI_SYSEX_DEBUG    0x0d
225 tk 39
#define MIOS32_MIDI_SYSEX_DISACK   0x0e
40
#define MIOS32_MIDI_SYSEX_ACK      0x0f
41
 
42
// disacknowledge arguments
43
#define MIOS32_MIDI_SYSEX_DISACK_LESS_BYTES_THAN_EXP  0x01
44
#define MIOS32_MIDI_SYSEX_DISACK_MORE_BYTES_THAN_EXP  0x02
45
#define MIOS32_MIDI_SYSEX_DISACK_WRONG_CHECKSUM       0x03
46
#define MIOS32_MIDI_SYSEX_DISACK_WRITE_FAILED         0x04
47
#define MIOS32_MIDI_SYSEX_DISACK_WRITE_ACCESS         0x05
48
#define MIOS32_MIDI_SYSEX_DISACK_MIDI_TIMEOUT         0x06
49
#define MIOS32_MIDI_SYSEX_DISACK_WRONG_DEBUG_CMD      0x07
50
#define MIOS32_MIDI_SYSEX_DISACK_WRONG_ADDR_RANGE     0x08
51
#define MIOS32_MIDI_SYSEX_DISACK_ADDR_NOT_ALIGNED     0x09
52
#define MIOS32_MIDI_SYSEX_DISACK_BS_NOT_AVAILABLE     0x0a
53
#define MIOS32_MIDI_SYSEX_DISACK_OVERRUN              0x0b
54
#define MIOS32_MIDI_SYSEX_DISACK_FRAME_ERROR          0x0c
230 tk 55
#define MIOS32_MIDI_SYSEX_DISACK_UNKNOWN_QUERY        0x0d
225 tk 56
#define MIOS32_MIDI_SYSEX_DISACK_INVALID_COMMAND      0x0e
558 tk 57
#define MIOS32_MIDI_SYSEX_DISACK_PROG_ID_NOT_ALLOWED  0x0f
582 tk 58
#define MIOS32_MIDI_SYSEX_DISACK_UNSUPPORTED_DEBUG    0x10
225 tk 59
 
60
 
61
/////////////////////////////////////////////////////////////////////////////
69 tk 62
// Global Types
63
/////////////////////////////////////////////////////////////////////////////
33 tk 64
 
65
 
69 tk 66
typedef enum {
307 tk 67
  DEFAULT    = 0x00,
68
  MIDI_DEBUG = 0x01,
33 tk 69
 
78 tk 70
  USB0 = 0x10,
71
  USB1 = 0x11,
72
  USB2 = 0x12,
73
  USB3 = 0x13,
74
  USB4 = 0x14,
75
  USB5 = 0x15,
76
  USB6 = 0x16,
77
  USB7 = 0x17,
2647 Antichambr 78
  USB8 = 0x10,
79
  USB9 = 0x11,
80
  USB10 = 0x12,
81
  USB11 = 0x13,
82
  USB12 = 0x14,
83
  USB13 = 0x15,
84
  USB14 = 0x16,
85
  USB15 = 0x17,
32 tk 86
 
78 tk 87
  UART0 = 0x20,
88
  UART1 = 0x21,
284 tk 89
  UART2 = 0x22,
90
  UART3 = 0x23,
78 tk 91
 
92
  IIC0 = 0x30,
93
  IIC1 = 0x31,
94
  IIC2 = 0x32,
95
  IIC3 = 0x33,
96
  IIC4 = 0x34,
97
  IIC5 = 0x35,
98
  IIC6 = 0x36,
1045 tk 99
  IIC7 = 0x37,
100
 
101
  OSC0 = 0x40,
102
  OSC1 = 0x41,
103
  OSC2 = 0x42,
104
  OSC3 = 0x43,
105
  OSC4 = 0x44,
106
  OSC5 = 0x45,
107
  OSC6 = 0x46,
1921 tk 108
  OSC7 = 0x47,
109
 
1923 tk 110
  SPIM0 = 0x50,
111
  SPIM1 = 0x51,
112
  SPIM2 = 0x52,
113
  SPIM3 = 0x53,
114
  SPIM4 = 0x54,
115
  SPIM5 = 0x55,
116
  SPIM6 = 0x56,
2647 Antichambr 117
  SPIM7 = 0x57,
118
  SPIM8 = 0x58,
119
  SPIM9 = 0x59,
120
  SPIM10 = 0x5a,
121
  SPIM11 = 0x5b,
122
  SPIM12 = 0x5c,
123
  SPIM13 = 0x5d,
124
  SPIM14 = 0x5e,
125
  SPIM15 = 0x5f,
1921 tk 126
 
2647 Antichambr 127
  MCAN0 = 0x60,
128
  MCAN1 = 0x61,
129
  MCAN2 = 0x62,
130
  MCAN3 = 0x63,
131
  MCAN4 = 0x64,
132
  MCAN5 = 0x65,
133
  MCAN6 = 0x66,
134
  MCAN7 = 0x67,
135
  MCAN8 = 0x68,
136
  MCAN9 = 0x69,
137
  MCAN10 = 0x6a,
138
  MCAN11 = 0x6b,
139
  MCAN12 = 0x6c,
140
  MCAN13 = 0x6d,
141
  MCAN14 = 0x6e,
142
  MCAN15 = 0x6f
143
 
69 tk 144
} mios32_midi_port_t;
32 tk 145
 
146
 
69 tk 147
typedef enum {
148
  NoteOff       = 0x8,
149
  NoteOn        = 0x9,
150
  PolyPressure  = 0xa,
151
  CC            = 0xb,
152
  ProgramChange = 0xc,
153
  Aftertouch    = 0xd,
154
  PitchBend     = 0xe
155
} mios32_midi_event_t;
32 tk 156
 
69 tk 157
 
158
typedef enum {
159
  Chn1,
160
  Chn2,
161
  Chn3,
162
  Chn4,
163
  Chn5,
164
  Chn6,
165
  Chn7,
166
  Chn8,
167
  Chn9,
168
  Chn10,
169
  Chn11,
170
  Chn12,
171
  Chn13,
172
  Chn14,
173
  Chn15,
174
  Chn16
175
} mios32_midi_chn_t;
176
 
177
 
32 tk 178
typedef union {
179
  struct {
848 tk 180
    u32 ALL;
32 tk 181
  };
182
  struct {
2647 Antichambr 183
    u8 bytes[4];
184
  };
185
  struct {
848 tk 186
    u8 cin_cable;
187
    u8 evnt0;
188
    u8 evnt1;
189
    u8 evnt2;
32 tk 190
  };
69 tk 191
  struct {
848 tk 192
    u8 type:4;
193
    u8 cable:4;
851 tk 194
    u8 chn:4; // mios32_midi_chn_t
195
    u8 event:4; // mios32_midi_event_t
848 tk 196
    u8 value1;
197
    u8 value2;
69 tk 198
  };
446 tk 199
 
844 tk 200
  // C++ doesn't allow to redefine names in anonymous unions
201
  // as a simple workaround, we rename these redundant names
69 tk 202
  struct {
848 tk 203
    u8 cin:4;
204
    u8 dummy1_cable:4;
851 tk 205
    u8 dummy1_chn:4; // mios32_midi_chn_t 
206
    u8 dummy1_event:4; // mios32_midi_event_t 
848 tk 207
    u8 note:8;
208
    u8 velocity:8;
69 tk 209
  };
210
  struct {
848 tk 211
    u8 dummy2_cin:4;
212
    u8 dummy2_cable:4;
851 tk 213
    u8 dummy2_chn:4; // mios32_midi_chn_t 
214
    u8 dummy2_event:4; // mios32_midi_event_t 
848 tk 215
    u8 cc_number:8;
216
    u8 value:8;
69 tk 217
  };
218
  struct {
848 tk 219
    u8 dummy3_cin:4;
220
    u8 dummy3_cable:4;
851 tk 221
    u8 dummy3_chn:4; // mios32_midi_chn_t 
222
    u8 dummy3_event:4; // mios32_midi_event_t
848 tk 223
    u8 program_change:8;
224
    u8 dummy3:8;
69 tk 225
  };
33 tk 226
} mios32_midi_package_t;
32 tk 227
 
228
 
225 tk 229
// command states
230
typedef enum {
231
  MIOS32_MIDI_SYSEX_CMD_STATE_BEGIN,
232
  MIOS32_MIDI_SYSEX_CMD_STATE_CONT,
233
  MIOS32_MIDI_SYSEX_CMD_STATE_END
234
} mios32_midi_sysex_cmd_state_t;
235
 
236
 
32 tk 237
/////////////////////////////////////////////////////////////////////////////
238
// Prototypes
239
/////////////////////////////////////////////////////////////////////////////
240
 
241
extern s32 MIOS32_MIDI_Init(u32 mode);
242
 
78 tk 243
extern s32 MIOS32_MIDI_CheckAvailable(mios32_midi_port_t port);
244
 
528 tk 245
extern s32 MIOS32_MIDI_RS_OptimisationSet(mios32_midi_port_t port, u8 enable);
246
extern s32 MIOS32_MIDI_RS_OptimisationGet(mios32_midi_port_t port);
247
extern s32 MIOS32_MIDI_RS_Reset(mios32_midi_port_t port);
248
 
110 tk 249
extern s32 MIOS32_MIDI_SendPackage_NonBlocking(mios32_midi_port_t port, mios32_midi_package_t package);
69 tk 250
extern s32 MIOS32_MIDI_SendPackage(mios32_midi_port_t port, mios32_midi_package_t package);
32 tk 251
 
69 tk 252
extern s32 MIOS32_MIDI_SendEvent(mios32_midi_port_t port, u8 evnt0, u8 evnt1, u8 evnt2);
253
extern s32 MIOS32_MIDI_SendNoteOff(mios32_midi_port_t port, mios32_midi_chn_t chn, u8 note, u8 vel);
254
extern s32 MIOS32_MIDI_SendNoteOn(mios32_midi_port_t port, mios32_midi_chn_t chn, u8 note, u8 vel);
255
extern s32 MIOS32_MIDI_SendPolyPressure(mios32_midi_port_t port, mios32_midi_chn_t chn, u8 note, u8 val);
681 tk 256
extern s32 MIOS32_MIDI_SendCC(mios32_midi_port_t port, mios32_midi_chn_t chn, u8 cc_number, u8 val);
69 tk 257
extern s32 MIOS32_MIDI_SendProgramChange(mios32_midi_port_t port, mios32_midi_chn_t chn, u8 prg);
258
extern s32 MIOS32_MIDI_SendAftertouch(mios32_midi_port_t port, mios32_midi_chn_t chn, u8 val);
259
extern s32 MIOS32_MIDI_SendPitchBend(mios32_midi_port_t port, mios32_midi_chn_t chn, u16 val);
260
 
261
extern s32 MIOS32_MIDI_SendSysEx(mios32_midi_port_t port, u8 *stream, u32 count);
262
extern s32 MIOS32_MIDI_SendMTC(mios32_midi_port_t port, u8 val);
263
extern s32 MIOS32_MIDI_SendSongPosition(mios32_midi_port_t port, u16 val);
264
extern s32 MIOS32_MIDI_SendSongSelect(mios32_midi_port_t port, u8 val);
265
extern s32 MIOS32_MIDI_SendTuneRequest(mios32_midi_port_t port);
266
extern s32 MIOS32_MIDI_SendClock(mios32_midi_port_t port);
267
extern s32 MIOS32_MIDI_SendTick(mios32_midi_port_t port);
268
extern s32 MIOS32_MIDI_SendStart(mios32_midi_port_t port);
269
extern s32 MIOS32_MIDI_SendStop(mios32_midi_port_t port);
270
extern s32 MIOS32_MIDI_SendContinue(mios32_midi_port_t port);
271
extern s32 MIOS32_MIDI_SendActiveSense(mios32_midi_port_t port);
272
extern s32 MIOS32_MIDI_SendReset(mios32_midi_port_t port);
273
 
1541 tk 274
extern s32 MIOS32_MIDI_SendDebugStringHeader(mios32_midi_port_t port, char command, char first_byte);
275
extern s32 MIOS32_MIDI_SendDebugStringBody(mios32_midi_port_t port, char *str_from_second_byte, u32 len);
276
extern s32 MIOS32_MIDI_SendDebugStringFooter(mios32_midi_port_t port);
277
 
1994 tk 278
extern s32 MIOS32_MIDI_SendDebugMessage(const char *format, ...);
279
extern s32 MIOS32_MIDI_SendDebugString(const char *str);
280
extern s32 MIOS32_MIDI_SendDebugHexDump(const u8 *src, u32 len);
69 tk 281
 
1921 tk 282
extern s32 MIOS32_MIDI_ReceivePackage(mios32_midi_port_t port, mios32_midi_package_t package, void *_callback_package);
674 tk 283
extern s32 MIOS32_MIDI_Receive_Handler(void *callback_event);
32 tk 284
 
528 tk 285
extern s32 MIOS32_MIDI_Periodic_mS(void);
286
 
1327 tk 287
extern s32 MIOS32_MIDI_DirectTxCallback_Init(s32 (*callback_tx)(mios32_midi_port_t port, mios32_midi_package_t package));
288
extern s32 MIOS32_MIDI_DirectRxCallback_Init(s32 (*callback_rx)(mios32_midi_port_t port, u8 midi_byte));
281 tk 289
 
155 tk 290
extern s32 MIOS32_MIDI_SendByteToRxCallback(mios32_midi_port_t port, u8 midi_byte);
291
extern s32 MIOS32_MIDI_SendPackageToRxCallback(mios32_midi_port_t port, mios32_midi_package_t midi_package);
33 tk 292
 
225 tk 293
extern s32 MIOS32_MIDI_DefaultPortSet(mios32_midi_port_t port);
294
extern mios32_midi_port_t MIOS32_MIDI_DefaultPortGet(void);
155 tk 295
 
307 tk 296
extern s32 MIOS32_MIDI_DebugPortSet(mios32_midi_port_t port);
297
extern mios32_midi_port_t MIOS32_MIDI_DebugPortGet(void);
298
 
225 tk 299
extern s32 MIOS32_MIDI_DeviceIDSet(u8 device_id);
300
extern u8  MIOS32_MIDI_DeviceIDGet(void);
301
 
1327 tk 302
extern s32 MIOS32_MIDI_SysExCallback_Init(s32 (*callback_sysex)(mios32_midi_port_t port, u8 sysex_byte));
674 tk 303
 
1327 tk 304
extern s32 MIOS32_MIDI_DebugCommandCallback_Init(s32 (*callback_debug_command)(mios32_midi_port_t port, char c));
1541 tk 305
extern s32 MIOS32_MIDI_FilebrowserCommandCallback_Init(s32 (*callback_filebrowser_command)(mios32_midi_port_t port, char c));
582 tk 306
 
1327 tk 307
extern s32 MIOS32_MIDI_TimeOutCallback_Init(s32 (*callback_timeout)(mios32_midi_port_t port));
225 tk 308
 
529 tk 309
 
32 tk 310
/////////////////////////////////////////////////////////////////////////////
311
// Export global variables
312
/////////////////////////////////////////////////////////////////////////////
313
 
80 tk 314
extern const u8 mios32_midi_pcktype_num_bytes[16];
89 tk 315
extern const u8 mios32_midi_expected_bytes_common[8];
316
extern const u8 mios32_midi_expected_bytes_system[16];
32 tk 317
 
225 tk 318
extern const u8 mios32_midi_sysex_header[5];
319
 
32 tk 320
#endif /* _MIOS32_MIDI_H */