Subversion Repositories svn.mios32

Rev

Rev 2648 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
32 tk 1
// $Id: mios32_midi.h 2650 2019-01-08 11:51:36Z 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,
32 tk 78
 
78 tk 79
  UART0 = 0x20,
80
  UART1 = 0x21,
284 tk 81
  UART2 = 0x22,
82
  UART3 = 0x23,
78 tk 83
 
84
  IIC0 = 0x30,
85
  IIC1 = 0x31,
86
  IIC2 = 0x32,
87
  IIC3 = 0x33,
88
  IIC4 = 0x34,
89
  IIC5 = 0x35,
90
  IIC6 = 0x36,
1045 tk 91
  IIC7 = 0x37,
92
 
93
  OSC0 = 0x40,
94
  OSC1 = 0x41,
95
  OSC2 = 0x42,
96
  OSC3 = 0x43,
97
  OSC4 = 0x44,
98
  OSC5 = 0x45,
99
  OSC6 = 0x46,
1921 tk 100
  OSC7 = 0x47,
101
 
1923 tk 102
  SPIM0 = 0x50,
103
  SPIM1 = 0x51,
104
  SPIM2 = 0x52,
105
  SPIM3 = 0x53,
106
  SPIM4 = 0x54,
107
  SPIM5 = 0x55,
108
  SPIM6 = 0x56,
2650 Antichambr 109
  SPIM7 = 0x57,
1921 tk 110
 
2647 Antichambr 111
  MCAN0 = 0x60,
112
  MCAN1 = 0x61,
113
  MCAN2 = 0x62,
114
  MCAN3 = 0x63,
115
  MCAN4 = 0x64,
116
  MCAN5 = 0x65,
117
  MCAN6 = 0x66,
118
  MCAN7 = 0x67,
119
  MCAN8 = 0x68,
120
  MCAN9 = 0x69,
121
  MCAN10 = 0x6a,
122
  MCAN11 = 0x6b,
123
  MCAN12 = 0x6c,
124
  MCAN13 = 0x6d,
125
  MCAN14 = 0x6e,
126
  MCAN15 = 0x6f
127
 
69 tk 128
} mios32_midi_port_t;
32 tk 129
 
130
 
69 tk 131
typedef enum {
132
  NoteOff       = 0x8,
133
  NoteOn        = 0x9,
134
  PolyPressure  = 0xa,
135
  CC            = 0xb,
136
  ProgramChange = 0xc,
137
  Aftertouch    = 0xd,
138
  PitchBend     = 0xe
139
} mios32_midi_event_t;
32 tk 140
 
69 tk 141
 
142
typedef enum {
143
  Chn1,
144
  Chn2,
145
  Chn3,
146
  Chn4,
147
  Chn5,
148
  Chn6,
149
  Chn7,
150
  Chn8,
151
  Chn9,
152
  Chn10,
153
  Chn11,
154
  Chn12,
155
  Chn13,
156
  Chn14,
157
  Chn15,
158
  Chn16
159
} mios32_midi_chn_t;
160
 
161
 
32 tk 162
typedef union {
163
  struct {
848 tk 164
    u32 ALL;
32 tk 165
  };
166
  struct {
2647 Antichambr 167
    u8 bytes[4];
168
  };
169
  struct {
848 tk 170
    u8 cin_cable;
171
    u8 evnt0;
172
    u8 evnt1;
173
    u8 evnt2;
32 tk 174
  };
69 tk 175
  struct {
848 tk 176
    u8 type:4;
177
    u8 cable:4;
851 tk 178
    u8 chn:4; // mios32_midi_chn_t
179
    u8 event:4; // mios32_midi_event_t
848 tk 180
    u8 value1;
181
    u8 value2;
69 tk 182
  };
446 tk 183
 
844 tk 184
  // C++ doesn't allow to redefine names in anonymous unions
185
  // as a simple workaround, we rename these redundant names
69 tk 186
  struct {
848 tk 187
    u8 cin:4;
188
    u8 dummy1_cable:4;
851 tk 189
    u8 dummy1_chn:4; // mios32_midi_chn_t 
190
    u8 dummy1_event:4; // mios32_midi_event_t 
848 tk 191
    u8 note:8;
192
    u8 velocity:8;
69 tk 193
  };
194
  struct {
848 tk 195
    u8 dummy2_cin:4;
196
    u8 dummy2_cable:4;
851 tk 197
    u8 dummy2_chn:4; // mios32_midi_chn_t 
198
    u8 dummy2_event:4; // mios32_midi_event_t 
848 tk 199
    u8 cc_number:8;
200
    u8 value:8;
69 tk 201
  };
202
  struct {
848 tk 203
    u8 dummy3_cin:4;
204
    u8 dummy3_cable:4;
851 tk 205
    u8 dummy3_chn:4; // mios32_midi_chn_t 
206
    u8 dummy3_event:4; // mios32_midi_event_t
848 tk 207
    u8 program_change:8;
208
    u8 dummy3:8;
69 tk 209
  };
33 tk 210
} mios32_midi_package_t;
32 tk 211
 
212
 
225 tk 213
// command states
214
typedef enum {
215
  MIOS32_MIDI_SYSEX_CMD_STATE_BEGIN,
216
  MIOS32_MIDI_SYSEX_CMD_STATE_CONT,
217
  MIOS32_MIDI_SYSEX_CMD_STATE_END
218
} mios32_midi_sysex_cmd_state_t;
219
 
220
 
32 tk 221
/////////////////////////////////////////////////////////////////////////////
222
// Prototypes
223
/////////////////////////////////////////////////////////////////////////////
224
 
225
extern s32 MIOS32_MIDI_Init(u32 mode);
226
 
78 tk 227
extern s32 MIOS32_MIDI_CheckAvailable(mios32_midi_port_t port);
228
 
528 tk 229
extern s32 MIOS32_MIDI_RS_OptimisationSet(mios32_midi_port_t port, u8 enable);
230
extern s32 MIOS32_MIDI_RS_OptimisationGet(mios32_midi_port_t port);
231
extern s32 MIOS32_MIDI_RS_Reset(mios32_midi_port_t port);
232
 
110 tk 233
extern s32 MIOS32_MIDI_SendPackage_NonBlocking(mios32_midi_port_t port, mios32_midi_package_t package);
69 tk 234
extern s32 MIOS32_MIDI_SendPackage(mios32_midi_port_t port, mios32_midi_package_t package);
32 tk 235
 
69 tk 236
extern s32 MIOS32_MIDI_SendEvent(mios32_midi_port_t port, u8 evnt0, u8 evnt1, u8 evnt2);
237
extern s32 MIOS32_MIDI_SendNoteOff(mios32_midi_port_t port, mios32_midi_chn_t chn, u8 note, u8 vel);
238
extern s32 MIOS32_MIDI_SendNoteOn(mios32_midi_port_t port, mios32_midi_chn_t chn, u8 note, u8 vel);
239
extern s32 MIOS32_MIDI_SendPolyPressure(mios32_midi_port_t port, mios32_midi_chn_t chn, u8 note, u8 val);
681 tk 240
extern s32 MIOS32_MIDI_SendCC(mios32_midi_port_t port, mios32_midi_chn_t chn, u8 cc_number, u8 val);
69 tk 241
extern s32 MIOS32_MIDI_SendProgramChange(mios32_midi_port_t port, mios32_midi_chn_t chn, u8 prg);
242
extern s32 MIOS32_MIDI_SendAftertouch(mios32_midi_port_t port, mios32_midi_chn_t chn, u8 val);
243
extern s32 MIOS32_MIDI_SendPitchBend(mios32_midi_port_t port, mios32_midi_chn_t chn, u16 val);
244
 
245
extern s32 MIOS32_MIDI_SendSysEx(mios32_midi_port_t port, u8 *stream, u32 count);
246
extern s32 MIOS32_MIDI_SendMTC(mios32_midi_port_t port, u8 val);
247
extern s32 MIOS32_MIDI_SendSongPosition(mios32_midi_port_t port, u16 val);
248
extern s32 MIOS32_MIDI_SendSongSelect(mios32_midi_port_t port, u8 val);
249
extern s32 MIOS32_MIDI_SendTuneRequest(mios32_midi_port_t port);
250
extern s32 MIOS32_MIDI_SendClock(mios32_midi_port_t port);
251
extern s32 MIOS32_MIDI_SendTick(mios32_midi_port_t port);
252
extern s32 MIOS32_MIDI_SendStart(mios32_midi_port_t port);
253
extern s32 MIOS32_MIDI_SendStop(mios32_midi_port_t port);
254
extern s32 MIOS32_MIDI_SendContinue(mios32_midi_port_t port);
255
extern s32 MIOS32_MIDI_SendActiveSense(mios32_midi_port_t port);
256
extern s32 MIOS32_MIDI_SendReset(mios32_midi_port_t port);
257
 
1541 tk 258
extern s32 MIOS32_MIDI_SendDebugStringHeader(mios32_midi_port_t port, char command, char first_byte);
259
extern s32 MIOS32_MIDI_SendDebugStringBody(mios32_midi_port_t port, char *str_from_second_byte, u32 len);
260
extern s32 MIOS32_MIDI_SendDebugStringFooter(mios32_midi_port_t port);
261
 
1994 tk 262
extern s32 MIOS32_MIDI_SendDebugMessage(const char *format, ...);
263
extern s32 MIOS32_MIDI_SendDebugString(const char *str);
264
extern s32 MIOS32_MIDI_SendDebugHexDump(const u8 *src, u32 len);
69 tk 265
 
1921 tk 266
extern s32 MIOS32_MIDI_ReceivePackage(mios32_midi_port_t port, mios32_midi_package_t package, void *_callback_package);
674 tk 267
extern s32 MIOS32_MIDI_Receive_Handler(void *callback_event);
32 tk 268
 
528 tk 269
extern s32 MIOS32_MIDI_Periodic_mS(void);
270
 
1327 tk 271
extern s32 MIOS32_MIDI_DirectTxCallback_Init(s32 (*callback_tx)(mios32_midi_port_t port, mios32_midi_package_t package));
272
extern s32 MIOS32_MIDI_DirectRxCallback_Init(s32 (*callback_rx)(mios32_midi_port_t port, u8 midi_byte));
281 tk 273
 
155 tk 274
extern s32 MIOS32_MIDI_SendByteToRxCallback(mios32_midi_port_t port, u8 midi_byte);
275
extern s32 MIOS32_MIDI_SendPackageToRxCallback(mios32_midi_port_t port, mios32_midi_package_t midi_package);
33 tk 276
 
225 tk 277
extern s32 MIOS32_MIDI_DefaultPortSet(mios32_midi_port_t port);
278
extern mios32_midi_port_t MIOS32_MIDI_DefaultPortGet(void);
155 tk 279
 
307 tk 280
extern s32 MIOS32_MIDI_DebugPortSet(mios32_midi_port_t port);
281
extern mios32_midi_port_t MIOS32_MIDI_DebugPortGet(void);
282
 
225 tk 283
extern s32 MIOS32_MIDI_DeviceIDSet(u8 device_id);
284
extern u8  MIOS32_MIDI_DeviceIDGet(void);
285
 
1327 tk 286
extern s32 MIOS32_MIDI_SysExCallback_Init(s32 (*callback_sysex)(mios32_midi_port_t port, u8 sysex_byte));
674 tk 287
 
1327 tk 288
extern s32 MIOS32_MIDI_DebugCommandCallback_Init(s32 (*callback_debug_command)(mios32_midi_port_t port, char c));
1541 tk 289
extern s32 MIOS32_MIDI_FilebrowserCommandCallback_Init(s32 (*callback_filebrowser_command)(mios32_midi_port_t port, char c));
582 tk 290
 
1327 tk 291
extern s32 MIOS32_MIDI_TimeOutCallback_Init(s32 (*callback_timeout)(mios32_midi_port_t port));
225 tk 292
 
529 tk 293
 
32 tk 294
/////////////////////////////////////////////////////////////////////////////
295
// Export global variables
296
/////////////////////////////////////////////////////////////////////////////
297
 
80 tk 298
extern const u8 mios32_midi_pcktype_num_bytes[16];
89 tk 299
extern const u8 mios32_midi_expected_bytes_common[8];
300
extern const u8 mios32_midi_expected_bytes_system[16];
32 tk 301
 
225 tk 302
extern const u8 mios32_midi_sysex_header[5];
303
 
32 tk 304
#endif /* _MIOS32_MIDI_H */