2
* Copyright (C) 2000 Luc Tanguay <luc.tanguay@bell.ca>
3
* Copyright (C) 1998-2001 Michael Krause
5
* This program is free software; you can redistribute it and/or modify
6
* it under the terms of the GNU General Public License as published by
7
* the Free Software Foundation; either version 2 of the License, or
8
* (at your option) any later version.
10
* This program is distributed in the hope that it will be useful,
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
* GNU General Public License for more details.
15
* You should have received a copy of the GNU General Public License
16
* along with this program; if not, write to the Free Software
17
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
22
#if defined(DRIVER_ALSA_050)
25
#include "midi-utils.h"
26
#include "midi-settings.h"
28
/* Global variables. */
32
/* Next array taken from alsa-lib-0.5.5/test/seq-decode.c */
34
static char *event_names[256] = {
43
/* 8 */ "Key Pressure",
45
/* 10 */ "Controller",
46
/* 11 */ "Program Change",
47
/* 12 */ "Channel Pressure",
50
/* 15 */ "Nonregparam",
52
/* 17 */ "Reserved 17",
53
/* 18 */ "Reserved 18",
54
/* 19 */ "Reserved 19",
55
/* 20 */ "Song Position",
56
/* 21 */ "Song Select",
58
/* 23 */ "SMF Time Signature",
59
/* 24 */ "SMF Key Signature",
60
/* 25 */ "Reserved 25",
61
/* 26 */ "Reserved 26",
62
/* 27 */ "Reserved 27",
63
/* 28 */ "Reserved 28",
64
/* 29 */ "Reserved 29",
68
/* 33 */ "Set Position Tick",
69
/* 34 */ "Set Position Time",
73
/* 38 */ "Reserved 38",
74
/* 39 */ "Reserved 39",
75
/* 40 */ "Tune Request",
77
/* 42 */ "Active Sensing",
78
/* 43 */ "Reserved 43",
79
/* 44 */ "Reserved 44",
80
/* 45 */ "Reserved 45",
81
/* 46 */ "Reserved 46",
82
/* 47 */ "Reserved 47",
83
/* 48 */ "Reserved 48",
84
/* 49 */ "Reserved 49",
87
/* 52 */ "Reserved 52",
88
/* 53 */ "Reserved 53",
89
/* 54 */ "Reserved 54",
90
/* 55 */ "Reserved 55",
91
/* 56 */ "Reserved 56",
92
/* 57 */ "Reserved 57",
93
/* 58 */ "Reserved 58",
94
/* 59 */ "Reserved 59",
95
/* 60 */ "Client Start",
96
/* 61 */ "Client Exit",
97
/* 62 */ "Client Change",
98
/* 63 */ "Port Start",
100
/* 65 */ "Port Change",
101
/* 66 */ "Port Subscribed",
102
/* 67 */ "Port Used",
103
/* 68 */ "Port Unsubscribed",
104
/* 69 */ "Port Unused",
106
/* 71 */ "Sample Cluster",
107
/* 72 */ "Sample Start",
108
/* 73 */ "Sample Stop",
109
/* 74 */ "Sample Freq",
110
/* 75 */ "Sample Volume",
111
/* 76 */ "Sample Loop",
112
/* 77 */ "Sample Position",
113
/* 78 */ "Sample Private1",
114
/* 79 */ "Reserved 79",
115
/* 80 */ "Reserved 80",
116
/* 81 */ "Reserved 81",
117
/* 82 */ "Reserved 82",
118
/* 83 */ "Reserved 83",
119
/* 84 */ "Reserved 84",
120
/* 85 */ "Reserved 85",
121
/* 86 */ "Reserved 86",
122
/* 87 */ "Reserved 87",
123
/* 88 */ "Reserved 88",
124
/* 89 */ "Reserved 89",
135
/* 100 */ "Instr Begin",
136
/* 101 */ "Instr End",
137
/* 102 */ "Instr Info",
138
/* 103 */ "Instr Info Result",
139
/* 104 */ "Instr Finfo",
140
/* 105 */ "Instr Finfo Result",
141
/* 106 */ "Instr Reset",
142
/* 107 */ "Instr Status",
143
/* 108 */ "Instr Status Result",
144
/* 109 */ "Instr Put",
145
/* 110 */ "Instr Get",
146
/* 111 */ "Instr Get Result",
147
/* 112 */ "Instr Free",
148
/* 113 */ "Instr List",
149
/* 114 */ "Instr List Result",
150
/* 115 */ "Instr Cluster",
151
/* 116 */ "Instr Cluster Get",
152
/* 117 */ "Instr Cluster Result",
153
/* 118 */ "Instr Change",
154
/* 119 */ "Reserved 119",
155
/* 120 */ "Reserved 120",
156
/* 121 */ "Reserved 121",
157
/* 122 */ "Reserved 122",
158
/* 123 */ "Reserved 123",
159
/* 124 */ "Reserved 124",
160
/* 125 */ "Reserved 125",
161
/* 126 */ "Reserved 126",
162
/* 127 */ "Reserved 127",
163
/* 128 */ "Reserved 128",
164
/* 129 */ "Reserved 129",
167
/* 132 */ "Reserved 132",
168
/* 133 */ "Reserved 133",
169
/* 134 */ "Reserved 134",
170
/* 135 */ "User Var0",
171
/* 136 */ "User Var1",
172
/* 137 */ "User Var2",
173
/* 138 */ "User Var3",
174
/* 139 */ "User Var4",
176
/* 141 */ "Reserved 141",
177
/* 142 */ "Reserved 142",
178
/* 143 */ "Reserved 143",
179
/* 144 */ "Reserved 144",
180
/* 145 */ "User IPC0",
181
/* 146 */ "User IPC1",
182
/* 147 */ "User IPC2",
183
/* 148 */ "User IPC3",
184
/* 149 */ "User IPC4",
185
/* 150 */ "Reserved 150",
186
/* 151 */ "Reserved 151",
187
/* 152 */ "Reserved 152",
188
/* 153 */ "Reserved 153",
189
/* 154 */ "Reserved 154",
190
/* 155 */ "Reserved 155",
191
/* 156 */ "Reserved 156",
192
/* 157 */ "Reserved 157",
193
/* 158 */ "Reserved 158",
194
/* 159 */ "Reserved 159",
195
/* 160 */ "Reserved 160",
196
/* 161 */ "Reserved 161",
197
/* 162 */ "Reserved 162",
198
/* 163 */ "Reserved 163",
199
/* 164 */ "Reserved 164",
200
/* 165 */ "Reserved 165",
201
/* 166 */ "Reserved 166",
202
/* 167 */ "Reserved 167",
203
/* 168 */ "Reserved 168",
204
/* 169 */ "Reserved 169",
205
/* 170 */ "Reserved 170",
206
/* 171 */ "Reserved 171",
207
/* 172 */ "Reserved 172",
208
/* 173 */ "Reserved 173",
209
/* 174 */ "Reserved 174",
210
/* 175 */ "Reserved 175",
211
/* 176 */ "Reserved 176",
212
/* 177 */ "Reserved 177",
213
/* 178 */ "Reserved 178",
214
/* 179 */ "Reserved 179",
215
/* 180 */ "Reserved 180",
216
/* 181 */ "Reserved 181",
217
/* 182 */ "Reserved 182",
218
/* 183 */ "Reserved 183",
219
/* 184 */ "Reserved 184",
220
/* 185 */ "Reserved 185",
221
/* 186 */ "Reserved 186",
222
/* 187 */ "Reserved 187",
223
/* 188 */ "Reserved 188",
224
/* 189 */ "Reserved 189",
225
/* 190 */ "Reserved 190",
226
/* 191 */ "Reserved 191",
227
/* 192 */ "Reserved 192",
228
/* 193 */ "Reserved 193",
229
/* 194 */ "Reserved 194",
230
/* 195 */ "Reserved 195",
231
/* 196 */ "Reserved 196",
232
/* 197 */ "Reserved 197",
233
/* 198 */ "Reserved 198",
234
/* 199 */ "Reserved 199",
235
/* 200 */ "Reserved 200",
236
/* 201 */ "Reserved 201",
237
/* 202 */ "Reserved 202",
238
/* 203 */ "Reserved 203",
239
/* 204 */ "Reserved 204",
240
/* 205 */ "Reserved 205",
241
/* 206 */ "Reserved 206",
242
/* 207 */ "Reserved 207",
243
/* 208 */ "Reserved 208",
244
/* 209 */ "Reserved 209",
245
/* 210 */ "Reserved 210",
246
/* 211 */ "Reserved 211",
247
/* 212 */ "Reserved 212",
248
/* 213 */ "Reserved 213",
249
/* 214 */ "Reserved 214",
250
/* 215 */ "Reserved 215",
251
/* 216 */ "Reserved 216",
252
/* 217 */ "Reserved 217",
253
/* 218 */ "Reserved 218",
254
/* 219 */ "Reserved 219",
255
/* 220 */ "Reserved 220",
256
/* 221 */ "Reserved 221",
257
/* 222 */ "Reserved 222",
258
/* 223 */ "Reserved 223",
259
/* 224 */ "Reserved 224",
260
/* 225 */ "Reserved 225",
261
/* 226 */ "Reserved 226",
262
/* 227 */ "Reserved 227",
263
/* 228 */ "Reserved 228",
264
/* 229 */ "Reserved 229",
265
/* 230 */ "Reserved 230",
266
/* 231 */ "Reserved 231",
267
/* 232 */ "Reserved 232",
268
/* 233 */ "Reserved 233",
269
/* 234 */ "Reserved 234",
270
/* 235 */ "Reserved 235",
271
/* 236 */ "Reserved 236",
272
/* 237 */ "Reserved 237",
273
/* 238 */ "Reserved 238",
274
/* 239 */ "Reserved 239",
275
/* 240 */ "Reserved 240",
276
/* 241 */ "Reserved 241",
277
/* 242 */ "Reserved 242",
278
/* 243 */ "Reserved 243",
279
/* 244 */ "Reserved 244",
280
/* 245 */ "Reserved 245",
281
/* 246 */ "Reserved 246",
282
/* 247 */ "Reserved 247",
283
/* 248 */ "Reserved 248",
284
/* 249 */ "Reserved 249",
285
/* 250 */ "Reserved 250",
286
/* 251 */ "Reserved 251",
287
/* 252 */ "Reserved 252",
288
/* 253 */ "Reserved 253",
289
/* 254 */ "Reserved 254",
293
/* Local functions prototypes */
295
/************************************************************************/
297
/***********************************************
299
* Adapted from alsa-lib-0.5.5/test/seq-decode.c.
301
* Level of details is determined by debug_level (see midi-settings.h).
304
void midi_print_event(snd_seq_event_t *ev)
306
if (ev->type == SND_SEQ_EVENT_SENSING) {
312
if (midi_settings.misc.debug_level > MIDI_DEBUG_BASIC) {
314
g_print(" Type = %d, flags = 0x%x", ev->type, ev->flags);
316
switch (ev->flags & SND_SEQ_TIME_STAMP_MASK) {
317
case SND_SEQ_TIME_STAMP_TICK:
318
g_print(", time = %d ticks", ev->time.tick);
321
case SND_SEQ_TIME_STAMP_REAL:
322
g_print(", time = %d.%09d",
323
(int)ev->time.time.tv_sec,
324
(int)ev->time.time.tv_nsec);
328
g_print("\nSource = %d.%d, dest = %d.%d, queue = %d\n",
336
g_print(" \"%s\"", event_names[ev->type]);
338
/* decode actual event data... */
341
case SND_SEQ_EVENT_NOTE:
342
g_print("; ch=%d, note=%d, velocity=%d, off_velocity=%d, duration=%d\n",
343
ev->data.note.channel,
345
ev->data.note.velocity,
346
ev->data.note.off_velocity,
347
ev->data.note.duration);
350
case SND_SEQ_EVENT_NOTEON:
351
g_print("; ch=%d, note ON=%d, velocity=%d\n",
352
ev->data.note.channel,
354
ev->data.note.velocity);
357
case SND_SEQ_EVENT_NOTEOFF:
358
g_print("; ch=%d, note OFF=%d, velocity=%d\n",
359
ev->data.note.channel,
361
ev->data.note.velocity);
364
case SND_SEQ_EVENT_KEYPRESS:
365
g_print("; ch=%d, keypress=%d, velocity=%d\n",
366
ev->data.note.channel,
368
ev->data.note.velocity);
371
case SND_SEQ_EVENT_CONTROLLER:
372
g_print("; ch=%d, param=%i, value=%i\n",
373
ev->data.control.channel,
374
ev->data.control.param,
375
ev->data.control.value);
378
case SND_SEQ_EVENT_PGMCHANGE:
379
g_print("; ch=%d, program=%i\n",
380
ev->data.control.channel,
381
ev->data.control.value);
384
case SND_SEQ_EVENT_CHANPRESS:
385
case SND_SEQ_EVENT_PITCHBEND:
386
g_print("; ch=%d, value=%i\n",
387
ev->data.control.channel,
388
ev->data.control.value);
391
case SND_SEQ_EVENT_SYSEX:
393
unsigned char *sysex = (unsigned char *) ev + sizeof(snd_seq_event_t);
396
g_print("; len=%d [", ev->data.ext.len);
398
for (c = 0; c < ev->data.ext.len; c++) {
399
g_print("%02x%s", sysex[c], c < ev->data.ext.len - 1 ? ":" : "");
405
case SND_SEQ_EVENT_QFRAME:
406
g_print("; frame = %i\n", ev->data.control.value);
409
case SND_SEQ_EVENT_CLOCK:
410
case SND_SEQ_EVENT_START:
411
case SND_SEQ_EVENT_CONTINUE:
412
case SND_SEQ_EVENT_STOP:
413
g_print("; queue = %i\n", ev->data.queue.queue);
416
case SND_SEQ_EVENT_SENSING:
420
case SND_SEQ_EVENT_ECHO:
425
for (i = 0; i < 8; i++) {
426
g_print("%02i%s", ev->data.raw8.d[i], i < 7 ? ":" : "\n");
431
case SND_SEQ_EVENT_CLIENT_START:
432
case SND_SEQ_EVENT_CLIENT_EXIT:
433
case SND_SEQ_EVENT_CLIENT_CHANGE:
434
g_print("; client = %i\n", ev->data.addr.client);
437
case SND_SEQ_EVENT_PORT_START:
438
case SND_SEQ_EVENT_PORT_EXIT:
439
case SND_SEQ_EVENT_PORT_CHANGE:
440
case SND_SEQ_EVENT_PORT_SUBSCRIBED:
441
case SND_SEQ_EVENT_PORT_USED:
442
case SND_SEQ_EVENT_PORT_UNSUBSCRIBED:
443
case SND_SEQ_EVENT_PORT_UNUSED:
444
g_print("; client = %i, port = %i\n",
445
ev->data.addr.client, ev->data.addr.port);
449
g_print("; not implemented\n");
453
switch (ev->flags & SND_SEQ_EVENT_LENGTH_MASK) {
454
case SND_SEQ_EVENT_LENGTH_FIXED:
455
return; /* sizeof(snd_seq_event_t);*/
457
case SND_SEQ_EVENT_LENGTH_VARIABLE:
458
return; /* sizeof(snd_seq_event_t) + ev->data.ext.len; */
463
} /* midi_print_event() */
465
#endif /* defined(DRIVER_ALSA_050) */