766 lines · c
1// SPDX-License-Identifier: GPL-2.0-or-later2/*3 * Universal MIDI Packet (UMP): Message Definitions4 */5#ifndef __SOUND_UMP_MSG_H6#define __SOUND_UMP_MSG_H7 8/* MIDI 1.0 / 2.0 Status Code (4bit) */9enum {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) */28enum {29 UMP_CC_BANK_SELECT = 0,30 UMP_CC_MODULATION = 1,31 UMP_CC_BREATH = 2,32 UMP_CC_FOOT = 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 UMP_CC_FOOT_LSB = 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) */104enum {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) */118enum {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 Definitions126 */127 128/* MIDI 1.0 Note Off / Note On (32bit) */129struct snd_ump_midi1_msg_note {130#ifdef __BIG_ENDIAN_BITFIELD131 u32 type:4;132 u32 group:4;133 u32 status:4;134 u32 channel:4;135 u32 note:8;136 u32 velocity:8;137#else138 u32 velocity:8;139 u32 note:8;140 u32 channel:4;141 u32 status:4;142 u32 group:4;143 u32 type:4;144#endif145} __packed;146 147/* MIDI 1.0 Poly Pressure (32bit) */148struct snd_ump_midi1_msg_paf {149#ifdef __BIG_ENDIAN_BITFIELD150 u32 type:4;151 u32 group:4;152 u32 status:4;153 u32 channel:4;154 u32 note:8;155 u32 data:8;156#else157 u32 data:8;158 u32 note:8;159 u32 channel:4;160 u32 status:4;161 u32 group:4;162 u32 type:4;163#endif164} __packed;165 166/* MIDI 1.0 Control Change (32bit) */167struct snd_ump_midi1_msg_cc {168#ifdef __BIG_ENDIAN_BITFIELD169 u32 type:4;170 u32 group:4;171 u32 status:4;172 u32 channel:4;173 u32 index:8;174 u32 data:8;175#else176 u32 data:8;177 u32 index:8;178 u32 channel:4;179 u32 status:4;180 u32 group:4;181 u32 type:4;182#endif183} __packed;184 185/* MIDI 1.0 Program Change (32bit) */186struct snd_ump_midi1_msg_program {187#ifdef __BIG_ENDIAN_BITFIELD188 u32 type:4;189 u32 group:4;190 u32 status:4;191 u32 channel:4;192 u32 program:8;193 u32 reserved:8;194#else195 u32 reserved:8;196 u32 program:8;197 u32 channel:4;198 u32 status:4;199 u32 group:4;200 u32 type:4;201#endif202} __packed;203 204/* MIDI 1.0 Channel Pressure (32bit) */205struct snd_ump_midi1_msg_caf {206#ifdef __BIG_ENDIAN_BITFIELD207 u32 type:4;208 u32 group:4;209 u32 status:4;210 u32 channel:4;211 u32 data:8;212 u32 reserved:8;213#else214 u32 reserved:8;215 u32 data:8;216 u32 channel:4;217 u32 status:4;218 u32 group:4;219 u32 type:4;220#endif221} __packed;222 223/* MIDI 1.0 Pitch Bend (32bit) */224struct snd_ump_midi1_msg_pitchbend {225#ifdef __BIG_ENDIAN_BITFIELD226 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#else233 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#endif240} __packed;241 242/* System Common and Real Time messages (32bit); no channel field */243struct snd_ump_system_msg {244#ifdef __BIG_ENDIAN_BITFIELD245 u32 type:4;246 u32 group:4;247 u32 status:8;248 u32 parm1:8;249 u32 parm2:8;250#else251 u32 parm2:8;252 u32 parm1:8;253 u32 status:8;254 u32 group:4;255 u32 type:4;256#endif257} __packed;258 259/* MIDI 1.0 UMP CVM (32bit) */260union 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) */272struct snd_ump_midi2_msg_note {273#ifdef __BIG_ENDIAN_BITFIELD274 /* 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#else285 /* 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#endif296} __packed;297 298/* MIDI 2.0 Poly Pressure (64bit) */299struct snd_ump_midi2_msg_paf {300#ifdef __BIG_ENDIAN_BITFIELD301 /* 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#else311 /* 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#endif321} __packed;322 323/* MIDI 2.0 Per-Note Controller (64bit) */324struct snd_ump_midi2_msg_pernote_cc {325#ifdef __BIG_ENDIAN_BITFIELD326 /* 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#else336 /* 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#endif346} __packed;347 348/* MIDI 2.0 Per-Note Management (64bit) */349struct snd_ump_midi2_msg_pernote_mgmt {350#ifdef __BIG_ENDIAN_BITFIELD351 /* 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#else361 /* 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#endif371} __packed;372 373/* MIDI 2.0 Control Change (64bit) */374struct snd_ump_midi2_msg_cc {375#ifdef __BIG_ENDIAN_BITFIELD376 /* 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#else386 /* 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#endif396} __packed;397 398/* MIDI 2.0 Registered Controller (RPN) / Assignable Controller (NRPN) (64bit) */399struct snd_ump_midi2_msg_rpn {400#ifdef __BIG_ENDIAN_BITFIELD401 /* 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#else411 /* 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#endif421} __packed;422 423/* MIDI 2.0 Program Change (64bit) */424struct snd_ump_midi2_msg_program {425#ifdef __BIG_ENDIAN_BITFIELD426 /* 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#else439 /* 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#endif452} __packed;453 454/* MIDI 2.0 Channel Pressure (64bit) */455struct snd_ump_midi2_msg_caf {456#ifdef __BIG_ENDIAN_BITFIELD457 /* 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#else466 /* 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#endif475} __packed;476 477/* MIDI 2.0 Pitch Bend (64bit) */478struct snd_ump_midi2_msg_pitchbend {479#ifdef __BIG_ENDIAN_BITFIELD480 /* 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#else489 /* 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#endif498} __packed;499 500/* MIDI 2.0 Per-Note Pitch Bend (64bit) */501struct snd_ump_midi2_msg_pernote_pitchbend {502#ifdef __BIG_ENDIAN_BITFIELD503 /* 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#else513 /* 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#endif523} __packed;524 525/* MIDI 2.0 UMP CVM (64bit) */526union 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) */541struct snd_ump_stream_msg_ep_discovery {542#ifdef __BIG_ENDIAN_BITFIELD543 /* 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#else555 /* 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#endif567} __packed;568 569/* UMP Stream Message: Endpoint Info Notification (128bit) */570struct snd_ump_stream_msg_ep_info {571#ifdef __BIG_ENDIAN_BITFIELD572 /* 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#else588 /* 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#endif604} __packed;605 606/* UMP Stream Message: Device Info Notification (128bit) */607struct snd_ump_stream_msg_devince_info {608#ifdef __BIG_ENDIAN_BITFIELD609 /* 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#else624 /* 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#endif639} __packed;640 641/* UMP Stream Message: Stream Config Request / Notification (128bit) */642struct snd_ump_stream_msg_stream_cfg {643#ifdef __BIG_ENDIAN_BITFIELD644 /* 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#else654 /* 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#endif664} __packed;665 666/* UMP Stream Message: Function Block Discovery (128bit) */667struct snd_ump_stream_msg_fb_discovery {668#ifdef __BIG_ENDIAN_BITFIELD669 /* 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#else678 /* 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#endif687} __packed;688 689/* UMP Stream Message: Function Block Info Notification (128bit) */690struct snd_ump_stream_msg_fb_info {691#ifdef __BIG_ENDIAN_BITFIELD692 /* 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#else710 /* 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#endif728} __packed;729 730/* UMP Stream Message: Function Block Name Notification (128bit) */731struct snd_ump_stream_msg_fb_name {732#ifdef __BIG_ENDIAN_BITFIELD733 /* 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#else742 /* 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 order750#endif751} __packed;752 753/* MIDI 2.0 Stream Messages (128bit) */754union 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