1 | // SPDX-License-Identifier: GPL-2.0-or-later |
2 | /* |
3 | * Universal MIDI Packet (UMP): Message Definitions |
4 | */ |
5 | #ifndef __SOUND_UMP_MSG_H |
6 | #define __SOUND_UMP_MSG_H |
7 | |
8 | /* MIDI 1.0 / 2.0 Status Code (4bit) */ |
9 | enum { |
10 | UMP_MSG_STATUS_PER_NOTE_RCC = 0x0, |
11 | UMP_MSG_STATUS_PER_NOTE_ACC = 0x1, |
12 | UMP_MSG_STATUS_RPN = 0x2, |
13 | UMP_MSG_STATUS_NRPN = 0x3, |
14 | UMP_MSG_STATUS_RELATIVE_RPN = 0x4, |
15 | UMP_MSG_STATUS_RELATIVE_NRPN = 0x5, |
16 | UMP_MSG_STATUS_PER_NOTE_PITCH_BEND = 0x6, |
17 | UMP_MSG_STATUS_NOTE_OFF = 0x8, |
18 | UMP_MSG_STATUS_NOTE_ON = 0x9, |
19 | UMP_MSG_STATUS_POLY_PRESSURE = 0xa, |
20 | UMP_MSG_STATUS_CC = 0xb, |
21 | UMP_MSG_STATUS_PROGRAM = 0xc, |
22 | UMP_MSG_STATUS_CHANNEL_PRESSURE = 0xd, |
23 | UMP_MSG_STATUS_PITCH_BEND = 0xe, |
24 | UMP_MSG_STATUS_PER_NOTE_MGMT = 0xf, |
25 | }; |
26 | |
27 | /* MIDI 1.0 Channel Control (7bit) */ |
28 | enum { |
29 | UMP_CC_BANK_SELECT = 0, |
30 | UMP_CC_MODULATION = 1, |
31 | UMP_CC_BREATH = 2, |
32 | = 4, |
33 | UMP_CC_PORTAMENTO_TIME = 5, |
34 | UMP_CC_DATA = 6, |
35 | UMP_CC_VOLUME = 7, |
36 | UMP_CC_BALANCE = 8, |
37 | UMP_CC_PAN = 10, |
38 | UMP_CC_EXPRESSION = 11, |
39 | UMP_CC_EFFECT_CONTROL_1 = 12, |
40 | UMP_CC_EFFECT_CONTROL_2 = 13, |
41 | UMP_CC_GP_1 = 16, |
42 | UMP_CC_GP_2 = 17, |
43 | UMP_CC_GP_3 = 18, |
44 | UMP_CC_GP_4 = 19, |
45 | UMP_CC_BANK_SELECT_LSB = 32, |
46 | UMP_CC_MODULATION_LSB = 33, |
47 | UMP_CC_BREATH_LSB = 34, |
48 | = 36, |
49 | UMP_CC_PORTAMENTO_TIME_LSB = 37, |
50 | UMP_CC_DATA_LSB = 38, |
51 | UMP_CC_VOLUME_LSB = 39, |
52 | UMP_CC_BALANCE_LSB = 40, |
53 | UMP_CC_PAN_LSB = 42, |
54 | UMP_CC_EXPRESSION_LSB = 43, |
55 | UMP_CC_EFFECT1_LSB = 44, |
56 | UMP_CC_EFFECT2_LSB = 45, |
57 | UMP_CC_GP_1_LSB = 48, |
58 | UMP_CC_GP_2_LSB = 49, |
59 | UMP_CC_GP_3_LSB = 50, |
60 | UMP_CC_GP_4_LSB = 51, |
61 | UMP_CC_SUSTAIN = 64, |
62 | UMP_CC_PORTAMENTO_SWITCH = 65, |
63 | UMP_CC_SOSTENUTO = 66, |
64 | UMP_CC_SOFT_PEDAL = 67, |
65 | UMP_CC_LEGATO = 68, |
66 | UMP_CC_HOLD_2 = 69, |
67 | UMP_CC_SOUND_CONTROLLER_1 = 70, |
68 | UMP_CC_SOUND_CONTROLLER_2 = 71, |
69 | UMP_CC_SOUND_CONTROLLER_3 = 72, |
70 | UMP_CC_SOUND_CONTROLLER_4 = 73, |
71 | UMP_CC_SOUND_CONTROLLER_5 = 74, |
72 | UMP_CC_SOUND_CONTROLLER_6 = 75, |
73 | UMP_CC_SOUND_CONTROLLER_7 = 76, |
74 | UMP_CC_SOUND_CONTROLLER_8 = 77, |
75 | UMP_CC_SOUND_CONTROLLER_9 = 78, |
76 | UMP_CC_SOUND_CONTROLLER_10 = 79, |
77 | UMP_CC_GP_5 = 80, |
78 | UMP_CC_GP_6 = 81, |
79 | UMP_CC_GP_7 = 82, |
80 | UMP_CC_GP_8 = 83, |
81 | UMP_CC_PORTAMENTO_CONTROL = 84, |
82 | UMP_CC_EFFECT_1 = 91, |
83 | UMP_CC_EFFECT_2 = 92, |
84 | UMP_CC_EFFECT_3 = 93, |
85 | UMP_CC_EFFECT_4 = 94, |
86 | UMP_CC_EFFECT_5 = 95, |
87 | UMP_CC_DATA_INC = 96, |
88 | UMP_CC_DATA_DEC = 97, |
89 | UMP_CC_NRPN_LSB = 98, |
90 | UMP_CC_NRPN_MSB = 99, |
91 | UMP_CC_RPN_LSB = 100, |
92 | UMP_CC_RPN_MSB = 101, |
93 | UMP_CC_ALL_SOUND_OFF = 120, |
94 | UMP_CC_RESET_ALL = 121, |
95 | UMP_CC_LOCAL_CONTROL = 122, |
96 | UMP_CC_ALL_NOTES_OFF = 123, |
97 | UMP_CC_OMNI_OFF = 124, |
98 | UMP_CC_OMNI_ON = 125, |
99 | UMP_CC_POLY_OFF = 126, |
100 | UMP_CC_POLY_ON = 127, |
101 | }; |
102 | |
103 | /* MIDI 1.0 / 2.0 System Messages (0xfx) */ |
104 | enum { |
105 | UMP_SYSTEM_STATUS_MIDI_TIME_CODE = 0xf1, |
106 | UMP_SYSTEM_STATUS_SONG_POSITION = 0xf2, |
107 | UMP_SYSTEM_STATUS_SONG_SELECT = 0xf3, |
108 | UMP_SYSTEM_STATUS_TUNE_REQUEST = 0xf6, |
109 | UMP_SYSTEM_STATUS_TIMING_CLOCK = 0xf8, |
110 | UMP_SYSTEM_STATUS_START = 0xfa, |
111 | UMP_SYSTEM_STATUS_CONTINUE = 0xfb, |
112 | UMP_SYSTEM_STATUS_STOP = 0xfc, |
113 | UMP_SYSTEM_STATUS_ACTIVE_SENSING = 0xfe, |
114 | UMP_SYSTEM_STATUS_RESET = 0xff, |
115 | }; |
116 | |
117 | /* MIDI 1.0 Realtime and SysEx status messages (0xfx) */ |
118 | enum { |
119 | UMP_MIDI1_MSG_REALTIME = 0xf0, /* mask */ |
120 | UMP_MIDI1_MSG_SYSEX_START = 0xf0, |
121 | UMP_MIDI1_MSG_SYSEX_END = 0xf7, |
122 | }; |
123 | |
124 | /* |
125 | * UMP Message Definitions |
126 | */ |
127 | |
128 | /* MIDI 1.0 Note Off / Note On (32bit) */ |
129 | struct snd_ump_midi1_msg_note { |
130 | #ifdef __BIG_ENDIAN_BITFIELD |
131 | u32 type:4; |
132 | u32 group:4; |
133 | u32 status:4; |
134 | u32 channel:4; |
135 | u32 note:8; |
136 | u32 velocity:8; |
137 | #else |
138 | u32 velocity:8; |
139 | u32 note:8; |
140 | u32 channel:4; |
141 | u32 status:4; |
142 | u32 group:4; |
143 | u32 type:4; |
144 | #endif |
145 | } __packed; |
146 | |
147 | /* MIDI 1.0 Poly Pressure (32bit) */ |
148 | struct snd_ump_midi1_msg_paf { |
149 | #ifdef __BIG_ENDIAN_BITFIELD |
150 | u32 type:4; |
151 | u32 group:4; |
152 | u32 status:4; |
153 | u32 channel:4; |
154 | u32 note:8; |
155 | u32 data:8; |
156 | #else |
157 | u32 data:8; |
158 | u32 note:8; |
159 | u32 channel:4; |
160 | u32 status:4; |
161 | u32 group:4; |
162 | u32 type:4; |
163 | #endif |
164 | } __packed; |
165 | |
166 | /* MIDI 1.0 Control Change (32bit) */ |
167 | struct snd_ump_midi1_msg_cc { |
168 | #ifdef __BIG_ENDIAN_BITFIELD |
169 | u32 type:4; |
170 | u32 group:4; |
171 | u32 status:4; |
172 | u32 channel:4; |
173 | u32 index:8; |
174 | u32 data:8; |
175 | #else |
176 | u32 data:8; |
177 | u32 index:8; |
178 | u32 channel:4; |
179 | u32 status:4; |
180 | u32 group:4; |
181 | u32 type:4; |
182 | #endif |
183 | } __packed; |
184 | |
185 | /* MIDI 1.0 Program Change (32bit) */ |
186 | struct snd_ump_midi1_msg_program { |
187 | #ifdef __BIG_ENDIAN_BITFIELD |
188 | u32 type:4; |
189 | u32 group:4; |
190 | u32 status:4; |
191 | u32 channel:4; |
192 | u32 program:8; |
193 | u32 reserved:8; |
194 | #else |
195 | u32 reserved:8; |
196 | u32 program:8; |
197 | u32 channel:4; |
198 | u32 status:4; |
199 | u32 group:4; |
200 | u32 type:4; |
201 | #endif |
202 | } __packed; |
203 | |
204 | /* MIDI 1.0 Channel Pressure (32bit) */ |
205 | struct snd_ump_midi1_msg_caf { |
206 | #ifdef __BIG_ENDIAN_BITFIELD |
207 | u32 type:4; |
208 | u32 group:4; |
209 | u32 status:4; |
210 | u32 channel:4; |
211 | u32 data:8; |
212 | u32 reserved:8; |
213 | #else |
214 | u32 reserved:8; |
215 | u32 data:8; |
216 | u32 channel:4; |
217 | u32 status:4; |
218 | u32 group:4; |
219 | u32 type:4; |
220 | #endif |
221 | } __packed; |
222 | |
223 | /* MIDI 1.0 Pitch Bend (32bit) */ |
224 | struct snd_ump_midi1_msg_pitchbend { |
225 | #ifdef __BIG_ENDIAN_BITFIELD |
226 | u32 type:4; |
227 | u32 group:4; |
228 | u32 status:4; |
229 | u32 channel:4; |
230 | u32 data_lsb:8; |
231 | u32 data_msb:8; |
232 | #else |
233 | u32 data_msb:8; |
234 | u32 data_lsb:8; |
235 | u32 channel:4; |
236 | u32 status:4; |
237 | u32 group:4; |
238 | u32 type:4; |
239 | #endif |
240 | } __packed; |
241 | |
242 | /* System Common and Real Time messages (32bit); no channel field */ |
243 | struct snd_ump_system_msg { |
244 | #ifdef __BIG_ENDIAN_BITFIELD |
245 | u32 type:4; |
246 | u32 group:4; |
247 | u32 status:8; |
248 | u32 parm1:8; |
249 | u32 parm2:8; |
250 | #else |
251 | u32 parm2:8; |
252 | u32 parm1:8; |
253 | u32 status:8; |
254 | u32 group:4; |
255 | u32 type:4; |
256 | #endif |
257 | } __packed; |
258 | |
259 | /* MIDI 1.0 UMP CVM (32bit) */ |
260 | union snd_ump_midi1_msg { |
261 | struct snd_ump_midi1_msg_note note; |
262 | struct snd_ump_midi1_msg_paf paf; |
263 | struct snd_ump_midi1_msg_cc cc; |
264 | struct snd_ump_midi1_msg_program pg; |
265 | struct snd_ump_midi1_msg_caf caf; |
266 | struct snd_ump_midi1_msg_pitchbend pb; |
267 | struct snd_ump_system_msg system; |
268 | u32 raw; |
269 | }; |
270 | |
271 | /* MIDI 2.0 Note Off / Note On (64bit) */ |
272 | struct snd_ump_midi2_msg_note { |
273 | #ifdef __BIG_ENDIAN_BITFIELD |
274 | /* 0 */ |
275 | u32 type:4; |
276 | u32 group:4; |
277 | u32 status:4; |
278 | u32 channel:4; |
279 | u32 note:8; |
280 | u32 attribute_type:8; |
281 | /* 1 */ |
282 | u32 velocity:16; |
283 | u32 attribute_data:16; |
284 | #else |
285 | /* 0 */ |
286 | u32 attribute_type:8; |
287 | u32 note:8; |
288 | u32 channel:4; |
289 | u32 status:4; |
290 | u32 group:4; |
291 | u32 type:4; |
292 | /* 1 */ |
293 | u32 attribute_data:16; |
294 | u32 velocity:16; |
295 | #endif |
296 | } __packed; |
297 | |
298 | /* MIDI 2.0 Poly Pressure (64bit) */ |
299 | struct snd_ump_midi2_msg_paf { |
300 | #ifdef __BIG_ENDIAN_BITFIELD |
301 | /* 0 */ |
302 | u32 type:4; |
303 | u32 group:4; |
304 | u32 status:4; |
305 | u32 channel:4; |
306 | u32 note:8; |
307 | u32 reserved:8; |
308 | /* 1 */ |
309 | u32 data; |
310 | #else |
311 | /* 0 */ |
312 | u32 reserved:8; |
313 | u32 note:8; |
314 | u32 channel:4; |
315 | u32 status:4; |
316 | u32 group:4; |
317 | u32 type:4; |
318 | /* 1 */ |
319 | u32 data; |
320 | #endif |
321 | } __packed; |
322 | |
323 | /* MIDI 2.0 Per-Note Controller (64bit) */ |
324 | struct snd_ump_midi2_msg_pernote_cc { |
325 | #ifdef __BIG_ENDIAN_BITFIELD |
326 | /* 0 */ |
327 | u32 type:4; |
328 | u32 group:4; |
329 | u32 status:4; |
330 | u32 channel:4; |
331 | u32 note:8; |
332 | u32 index:8; |
333 | /* 1 */ |
334 | u32 data; |
335 | #else |
336 | /* 0 */ |
337 | u32 index:8; |
338 | u32 note:8; |
339 | u32 channel:4; |
340 | u32 status:4; |
341 | u32 group:4; |
342 | u32 type:4; |
343 | /* 1 */ |
344 | u32 data; |
345 | #endif |
346 | } __packed; |
347 | |
348 | /* MIDI 2.0 Per-Note Management (64bit) */ |
349 | struct snd_ump_midi2_msg_pernote_mgmt { |
350 | #ifdef __BIG_ENDIAN_BITFIELD |
351 | /* 0 */ |
352 | u32 type:4; |
353 | u32 group:4; |
354 | u32 status:4; |
355 | u32 channel:4; |
356 | u32 note:8; |
357 | u32 flags:8; |
358 | /* 1 */ |
359 | u32 reserved; |
360 | #else |
361 | /* 0 */ |
362 | u32 flags:8; |
363 | u32 note:8; |
364 | u32 channel:4; |
365 | u32 status:4; |
366 | u32 group:4; |
367 | u32 type:4; |
368 | /* 1 */ |
369 | u32 reserved; |
370 | #endif |
371 | } __packed; |
372 | |
373 | /* MIDI 2.0 Control Change (64bit) */ |
374 | struct snd_ump_midi2_msg_cc { |
375 | #ifdef __BIG_ENDIAN_BITFIELD |
376 | /* 0 */ |
377 | u32 type:4; |
378 | u32 group:4; |
379 | u32 status:4; |
380 | u32 channel:4; |
381 | u32 index:8; |
382 | u32 reserved:8; |
383 | /* 1 */ |
384 | u32 data; |
385 | #else |
386 | /* 0 */ |
387 | u32 reserved:8; |
388 | u32 index:8; |
389 | u32 channel:4; |
390 | u32 status:4; |
391 | u32 group:4; |
392 | u32 type:4; |
393 | /* 1 */ |
394 | u32 data; |
395 | #endif |
396 | } __packed; |
397 | |
398 | /* MIDI 2.0 Registered Controller (RPN) / Assignable Controller (NRPN) (64bit) */ |
399 | struct snd_ump_midi2_msg_rpn { |
400 | #ifdef __BIG_ENDIAN_BITFIELD |
401 | /* 0 */ |
402 | u32 type:4; |
403 | u32 group:4; |
404 | u32 status:4; |
405 | u32 channel:4; |
406 | u32 bank:8; |
407 | u32 index:8; |
408 | /* 1 */ |
409 | u32 data; |
410 | #else |
411 | /* 0 */ |
412 | u32 index:8; |
413 | u32 bank:8; |
414 | u32 channel:4; |
415 | u32 status:4; |
416 | u32 group:4; |
417 | u32 type:4; |
418 | /* 1 */ |
419 | u32 data; |
420 | #endif |
421 | } __packed; |
422 | |
423 | /* MIDI 2.0 Program Change (64bit) */ |
424 | struct snd_ump_midi2_msg_program { |
425 | #ifdef __BIG_ENDIAN_BITFIELD |
426 | /* 0 */ |
427 | u32 type:4; |
428 | u32 group:4; |
429 | u32 status:4; |
430 | u32 channel:4; |
431 | u32 reserved:15; |
432 | u32 bank_valid:1; |
433 | /* 1 */ |
434 | u32 program:8; |
435 | u32 reserved2:8; |
436 | u32 bank_msb:8; |
437 | u32 bank_lsb:8; |
438 | #else |
439 | /* 0 */ |
440 | u32 bank_valid:1; |
441 | u32 reserved:15; |
442 | u32 channel:4; |
443 | u32 status:4; |
444 | u32 group:4; |
445 | u32 type:4; |
446 | /* 1 */ |
447 | u32 bank_lsb:8; |
448 | u32 bank_msb:8; |
449 | u32 reserved2:8; |
450 | u32 program:8; |
451 | #endif |
452 | } __packed; |
453 | |
454 | /* MIDI 2.0 Channel Pressure (64bit) */ |
455 | struct snd_ump_midi2_msg_caf { |
456 | #ifdef __BIG_ENDIAN_BITFIELD |
457 | /* 0 */ |
458 | u32 type:4; |
459 | u32 group:4; |
460 | u32 status:4; |
461 | u32 channel:4; |
462 | u32 reserved:16; |
463 | /* 1 */ |
464 | u32 data; |
465 | #else |
466 | /* 0 */ |
467 | u32 reserved:16; |
468 | u32 channel:4; |
469 | u32 status:4; |
470 | u32 group:4; |
471 | u32 type:4; |
472 | /* 1 */ |
473 | u32 data; |
474 | #endif |
475 | } __packed; |
476 | |
477 | /* MIDI 2.0 Pitch Bend (64bit) */ |
478 | struct snd_ump_midi2_msg_pitchbend { |
479 | #ifdef __BIG_ENDIAN_BITFIELD |
480 | /* 0 */ |
481 | u32 type:4; |
482 | u32 group:4; |
483 | u32 status:4; |
484 | u32 channel:4; |
485 | u32 reserved:16; |
486 | /* 1 */ |
487 | u32 data; |
488 | #else |
489 | /* 0 */ |
490 | u32 reserved:16; |
491 | u32 channel:4; |
492 | u32 status:4; |
493 | u32 group:4; |
494 | u32 type:4; |
495 | /* 1 */ |
496 | u32 data; |
497 | #endif |
498 | } __packed; |
499 | |
500 | /* MIDI 2.0 Per-Note Pitch Bend (64bit) */ |
501 | struct snd_ump_midi2_msg_pernote_pitchbend { |
502 | #ifdef __BIG_ENDIAN_BITFIELD |
503 | /* 0 */ |
504 | u32 type:4; |
505 | u32 group:4; |
506 | u32 status:4; |
507 | u32 channel:4; |
508 | u32 note:8; |
509 | u32 reserved:8; |
510 | /* 1 */ |
511 | u32 data; |
512 | #else |
513 | /* 0 */ |
514 | u32 reserved:8; |
515 | u32 note:8; |
516 | u32 channel:4; |
517 | u32 status:4; |
518 | u32 group:4; |
519 | u32 type:4; |
520 | /* 1 */ |
521 | u32 data; |
522 | #endif |
523 | } __packed; |
524 | |
525 | /* MIDI 2.0 UMP CVM (64bit) */ |
526 | union snd_ump_midi2_msg { |
527 | struct snd_ump_midi2_msg_note note; |
528 | struct snd_ump_midi2_msg_paf paf; |
529 | struct snd_ump_midi2_msg_pernote_cc pernote_cc; |
530 | struct snd_ump_midi2_msg_pernote_mgmt pernote_mgmt; |
531 | struct snd_ump_midi2_msg_cc cc; |
532 | struct snd_ump_midi2_msg_rpn rpn; |
533 | struct snd_ump_midi2_msg_program pg; |
534 | struct snd_ump_midi2_msg_caf caf; |
535 | struct snd_ump_midi2_msg_pitchbend pb; |
536 | struct snd_ump_midi2_msg_pernote_pitchbend pernote_pb; |
537 | u32 raw[2]; |
538 | }; |
539 | |
540 | /* UMP Stream Message: Endpoint Discovery (128bit) */ |
541 | struct snd_ump_stream_msg_ep_discovery { |
542 | #ifdef __BIG_ENDIAN_BITFIELD |
543 | /* 0 */ |
544 | u32 type:4; |
545 | u32 format:2; |
546 | u32 status:10; |
547 | u32 ump_version_major:8; |
548 | u32 ump_version_minor:8; |
549 | /* 1 */ |
550 | u32 reserved:24; |
551 | u32 filter_bitmap:8; |
552 | /* 2-3 */ |
553 | u32 reserved2[2]; |
554 | #else |
555 | /* 0 */ |
556 | u32 ump_version_minor:8; |
557 | u32 ump_version_major:8; |
558 | u32 status:10; |
559 | u32 format:2; |
560 | u32 type:4; |
561 | /* 1 */ |
562 | u32 filter_bitmap:8; |
563 | u32 reserved:24; |
564 | /* 2-3 */ |
565 | u32 reserved2[2]; |
566 | #endif |
567 | } __packed; |
568 | |
569 | /* UMP Stream Message: Endpoint Info Notification (128bit) */ |
570 | struct snd_ump_stream_msg_ep_info { |
571 | #ifdef __BIG_ENDIAN_BITFIELD |
572 | /* 0 */ |
573 | u32 type:4; |
574 | u32 format:2; |
575 | u32 status:10; |
576 | u32 ump_version_major:8; |
577 | u32 ump_version_minor:8; |
578 | /* 1 */ |
579 | u32 static_function_block:1; |
580 | u32 num_function_blocks:7; |
581 | u32 reserved:8; |
582 | u32 protocol:8; |
583 | u32 reserved2:6; |
584 | u32 jrts:2; |
585 | /* 2-3 */ |
586 | u32 reserved3[2]; |
587 | #else |
588 | /* 0 */ |
589 | u32 ump_version_minor:8; |
590 | u32 ump_version_major:8; |
591 | u32 status:10; |
592 | u32 format:2; |
593 | u32 type:4; |
594 | /* 1 */ |
595 | u32 jrts:2; |
596 | u32 reserved2:6; |
597 | u32 protocol:8; |
598 | u32 reserved:8; |
599 | u32 num_function_blocks:7; |
600 | u32 static_function_block:1; |
601 | /* 2-3 */ |
602 | u32 reserved3[2]; |
603 | #endif |
604 | } __packed; |
605 | |
606 | /* UMP Stream Message: Device Info Notification (128bit) */ |
607 | struct snd_ump_stream_msg_devince_info { |
608 | #ifdef __BIG_ENDIAN_BITFIELD |
609 | /* 0 */ |
610 | u32 type:4; |
611 | u32 format:2; |
612 | u32 status:10; |
613 | u32 reserved:16; |
614 | /* 1 */ |
615 | u32 manufacture_id; |
616 | /* 2 */ |
617 | u8 family_lsb; |
618 | u8 family_msb; |
619 | u8 model_lsb; |
620 | u8 model_msb; |
621 | /* 3 */ |
622 | u32 sw_revision; |
623 | #else |
624 | /* 0 */ |
625 | u32 reserved:16; |
626 | u32 status:10; |
627 | u32 format:2; |
628 | u32 type:4; |
629 | /* 1 */ |
630 | u32 manufacture_id; |
631 | /* 2 */ |
632 | u8 model_msb; |
633 | u8 model_lsb; |
634 | u8 family_msb; |
635 | u8 family_lsb; |
636 | /* 3 */ |
637 | u32 sw_revision; |
638 | #endif |
639 | } __packed; |
640 | |
641 | /* UMP Stream Message: Stream Config Request / Notification (128bit) */ |
642 | struct snd_ump_stream_msg_stream_cfg { |
643 | #ifdef __BIG_ENDIAN_BITFIELD |
644 | /* 0 */ |
645 | u32 type:4; |
646 | u32 format:2; |
647 | u32 status:10; |
648 | u32 protocol:8; |
649 | u32 reserved:6; |
650 | u32 jrts:2; |
651 | /* 1-3 */ |
652 | u32 reserved2[3]; |
653 | #else |
654 | /* 0 */ |
655 | u32 jrts:2; |
656 | u32 reserved:6; |
657 | u32 protocol:8; |
658 | u32 status:10; |
659 | u32 format:2; |
660 | u32 type:4; |
661 | /* 1-3 */ |
662 | u32 reserved2[3]; |
663 | #endif |
664 | } __packed; |
665 | |
666 | /* UMP Stream Message: Function Block Discovery (128bit) */ |
667 | struct snd_ump_stream_msg_fb_discovery { |
668 | #ifdef __BIG_ENDIAN_BITFIELD |
669 | /* 0 */ |
670 | u32 type:4; |
671 | u32 format:2; |
672 | u32 status:10; |
673 | u32 function_block_id:8; |
674 | u32 filter:8; |
675 | /* 1-3 */ |
676 | u32 reserved[3]; |
677 | #else |
678 | /* 0 */ |
679 | u32 filter:8; |
680 | u32 function_block_id:8; |
681 | u32 status:10; |
682 | u32 format:2; |
683 | u32 type:4; |
684 | /* 1-3 */ |
685 | u32 reserved[3]; |
686 | #endif |
687 | } __packed; |
688 | |
689 | /* UMP Stream Message: Function Block Info Notification (128bit) */ |
690 | struct snd_ump_stream_msg_fb_info { |
691 | #ifdef __BIG_ENDIAN_BITFIELD |
692 | /* 0 */ |
693 | u32 type:4; |
694 | u32 format:2; |
695 | u32 status:10; |
696 | u32 active:1; |
697 | u32 function_block_id:7; |
698 | u32 reserved:2; |
699 | u32 ui_hint:2; |
700 | u32 midi_10:2; |
701 | u32 direction:2; |
702 | /* 1 */ |
703 | u32 first_group:8; |
704 | u32 num_groups:8; |
705 | u32 midi_ci_version:8; |
706 | u32 sysex8_streams:8; |
707 | /* 2-3 */ |
708 | u32 reserved2[2]; |
709 | #else |
710 | /* 0 */ |
711 | u32 direction:2; |
712 | u32 midi_10:2; |
713 | u32 ui_hint:2; |
714 | u32 reserved:2; |
715 | u32 function_block_id:7; |
716 | u32 active:1; |
717 | u32 status:10; |
718 | u32 format:2; |
719 | u32 type:4; |
720 | /* 1 */ |
721 | u32 sysex8_streams:8; |
722 | u32 midi_ci_version:8; |
723 | u32 num_groups:8; |
724 | u32 first_group:8; |
725 | /* 2-3 */ |
726 | u32 reserved2[2]; |
727 | #endif |
728 | } __packed; |
729 | |
730 | /* UMP Stream Message: Function Block Name Notification (128bit) */ |
731 | struct snd_ump_stream_msg_fb_name { |
732 | #ifdef __BIG_ENDIAN_BITFIELD |
733 | /* 0 */ |
734 | u16 type:4; |
735 | u16 format:2; |
736 | u16 status:10; |
737 | u8 function_block_id; |
738 | u8 name0; |
739 | /* 1-3 */ |
740 | u8 name[12]; |
741 | #else |
742 | /* 0 */ |
743 | u8 name0; |
744 | u8 function_block_id; |
745 | u16 status:10; |
746 | u16 format:2; |
747 | u16 type:4; |
748 | /* 1-3 */ |
749 | u8 name[12]; // FIXME: byte order |
750 | #endif |
751 | } __packed; |
752 | |
753 | /* MIDI 2.0 Stream Messages (128bit) */ |
754 | union snd_ump_stream_msg { |
755 | struct snd_ump_stream_msg_ep_discovery ep_discovery; |
756 | struct snd_ump_stream_msg_ep_info ep_info; |
757 | struct snd_ump_stream_msg_devince_info device_info; |
758 | struct snd_ump_stream_msg_stream_cfg stream_cfg; |
759 | struct snd_ump_stream_msg_fb_discovery fb_discovery; |
760 | struct snd_ump_stream_msg_fb_info fb_info; |
761 | struct snd_ump_stream_msg_fb_name fb_name; |
762 | u32 raw[4]; |
763 | }; |
764 | |
765 | #endif /* __SOUND_UMP_MSG_H */ |
766 | |