9#if !defined(__ASOUNDLIB_H) && !defined(ALSA_LIBRARY_BUILD)
11#warning "use #include <alsa/asoundlib.h>, <alsa/ump_msg.h> should not be used directly"
12#include <alsa/asoundlib.h>
15#ifndef __ALSA_UMP_MSG_H
16#define __ALSA_UMP_MSG_H
22#if __BYTE_ORDER != __LITTLE_ENDIAN && __BYTE_ORDER != __BIG_ENDIAN
23#error "Endianness check failed!"
27typedef struct _snd_ump_msg_hdr {
28#if __BYTE_ORDER == __BIG_ENDIAN
43} __attribute((packed)) snd_ump_msg_hdr_t;
46typedef struct _snd_ump_msg_midi1_note {
47#if __BYTE_ORDER == __BIG_ENDIAN
62} __attribute((packed)) snd_ump_msg_midi1_note_t;
65typedef struct _snd_ump_msg_midi1_paf {
66#if __BYTE_ORDER == __BIG_ENDIAN
81} __attribute((packed)) snd_ump_msg_midi1_paf_t;
84typedef struct _snd_ump_msg_midi1_cc {
85#if __BYTE_ORDER == __BIG_ENDIAN
100} __attribute((packed)) snd_ump_msg_midi1_cc_t;
103typedef struct _snd_ump_msg_midi1_program {
104#if __BYTE_ORDER == __BIG_ENDIAN
119} __attribute((packed)) snd_ump_msg_midi1_program_t;
122typedef struct _snd_ump_msg_midi1_caf {
123#if __BYTE_ORDER == __BIG_ENDIAN
138} __attribute((packed)) snd_ump_msg_midi1_caf_t;
141typedef struct _snd_ump_msg_midi1_pitchbend {
142#if __BYTE_ORDER == __BIG_ENDIAN
157} __attribute((packed)) snd_ump_msg_midi1_pitchbend_t;
160typedef struct snd_ump_msg_system {
161#if __BYTE_ORDER == __BIG_ENDIAN
174} __attribute((packed)) snd_ump_msg_system_t;
177typedef union _snd_ump_msg_midi1 {
178 snd_ump_msg_midi1_note_t note_on;
179 snd_ump_msg_midi1_note_t note_off;
180 snd_ump_msg_midi1_paf_t poly_pressure;
181 snd_ump_msg_midi1_cc_t control_change;
182 snd_ump_msg_midi1_program_t program_change;
183 snd_ump_msg_midi1_caf_t channel_pressure;
184 snd_ump_msg_midi1_pitchbend_t pitchbend;
185 snd_ump_msg_system_t system;
186 snd_ump_msg_hdr_t hdr;
188} snd_ump_msg_midi1_t;
192 SND_UMP_MIDI2_NOTE_ATTR_NO_DATA = 0x00,
193 SND_UMP_MIDI2_NOTE_ATTR_MANUFACTURER = 0x01,
194 SND_UMP_MIDI2_NOTE_ATTR_PROFILE = 0x02,
195 SND_UMP_MIDI2_NOTE_ATTR_PITCH79 = 0x03,
199typedef struct _snd_ump_msg_midi2_note {
200#if __BYTE_ORDER == __BIG_ENDIAN
221} __attribute((packed)) snd_ump_msg_midi2_note_t;
224typedef struct _snd_ump_msg_midi2_paf {
225#if __BYTE_ORDER == __BIG_ENDIAN
244} __attribute((packed)) snd_ump_msg_midi2_paf_t;
247typedef struct _snd_ump_msg_midi2_per_note_cc {
248#if __BYTE_ORDER == __BIG_ENDIAN
267} __attribute((packed)) snd_ump_msg_midi2_per_note_cc_t;
271 SND_UMP_MIDI2_PNMGMT_RESET_CONTROLLERS = 0x01,
272 SND_UMP_MIDI2_PNMGMT_DETACH_CONTROLLERS = 0x02,
276typedef struct _snd_ump_msg_midi2_per_note_mgmt {
277#if __BYTE_ORDER == __BIG_ENDIAN
296} __attribute((packed)) snd_ump_msg_midi2_per_note_mgmt_t;
299typedef struct _snd_ump_msg_midi2_cc {
300#if __BYTE_ORDER == __BIG_ENDIAN
319} __attribute((packed)) snd_ump_msg_midi2_cc_t;
322typedef struct _snd_ump_msg_midi2_rpn {
323#if __BYTE_ORDER == __BIG_ENDIAN
342} __attribute((packed)) snd_ump_msg_midi2_rpn_t;
345typedef struct _snd_ump_msg_midi2_program {
346#if __BYTE_ORDER == __BIG_ENDIAN
351 uint16_t reserved:15;
352 uint16_t bank_valid:1;
359 uint16_t bank_valid:1;
360 uint16_t reserved:15;
371} __attribute((packed)) snd_ump_msg_midi2_program_t;
374typedef struct _snd_ump_msg_midi2_caf {
375#if __BYTE_ORDER == __BIG_ENDIAN
392} __attribute((packed)) snd_ump_msg_midi2_caf_t;
395typedef struct _snd_ump_msg_midi2_pitchbend {
396#if __BYTE_ORDER == __BIG_ENDIAN
413} __attribute((packed)) snd_ump_msg_midi2_pitchbend_t;
416typedef struct _snd_ump_msg_midi2_per_note_pitchbend {
417#ifdef __BIG_ENDIAN_BITFIELD
436} __attribute((packed)) snd_ump_msg_midi2_per_note_pitchbend_t;
439typedef union _snd_ump_msg_midi2 {
440 snd_ump_msg_midi2_note_t note_on;
441 snd_ump_msg_midi2_note_t note_off;
442 snd_ump_msg_midi2_paf_t poly_pressure;
443 snd_ump_msg_midi2_per_note_cc_t per_note_acc;
444 snd_ump_msg_midi2_per_note_cc_t per_note_rcc;
445 snd_ump_msg_midi2_per_note_mgmt_t per_note_mgmt;
446 snd_ump_msg_midi2_cc_t control_change;
447 snd_ump_msg_midi2_rpn_t rpn;
448 snd_ump_msg_midi2_rpn_t nrpn;
449 snd_ump_msg_midi2_rpn_t relative_rpn;
450 snd_ump_msg_midi2_rpn_t relative_nrpn;
451 snd_ump_msg_midi2_program_t program_change;
452 snd_ump_msg_midi2_caf_t channel_pressure;
453 snd_ump_msg_midi2_pitchbend_t pitchbend;
454 snd_ump_msg_midi2_per_note_pitchbend_t per_note_pitchbend;
455 snd_ump_msg_hdr_t hdr;
457} snd_ump_msg_midi2_t;
460typedef struct _snd_ump_msg_stream_gen {
461#if __BYTE_ORDER == __BIG_ENDIAN
478} __attribute((packed)) snd_ump_msg_stream_gen_t;
481typedef union _snd_ump_msg_stream {
482 snd_ump_msg_stream_gen_t gen;
483 snd_ump_msg_hdr_t hdr;
485} snd_ump_msg_stream_t;
488typedef struct _snd_ump_msg_flex_data_meta {
489#if __BYTE_ORDER == __BIG_ENDIAN
508} __attribute((packed)) snd_ump_msg_flex_data_meta_t;
511typedef struct _snd_ump_msg_set_tempo {
512#if __BYTE_ORDER == __BIG_ENDIAN
523 uint32_t reserved[2];
535 uint32_t reserved[2];
537} __attribute((packed)) snd_ump_msg_set_tempo_t;
540typedef struct _snd_ump_msg_set_time_sig {
541#if __BYTE_ORDER == __BIG_ENDIAN
555 uint32_t reserved[2];
570 uint32_t reserved[2];
572} __attribute((packed)) snd_ump_msg_set_time_sig_t;
575typedef struct _snd_ump_msg_set_metronome {
576#if __BYTE_ORDER == __BIG_ENDIAN
585 uint8_t clocks_primary;
586 uint8_t bar_accent_1;
587 uint8_t bar_accent_2;
588 uint8_t bar_accent_3;
590 uint8_t subdivision_1;
591 uint8_t subdivision_2;
604 uint8_t bar_accent_3;
605 uint8_t bar_accent_2;
606 uint8_t bar_accent_1;
607 uint8_t clocks_primary;
610 uint8_t subdivision_2;
611 uint8_t subdivision_1;
615} __attribute((packed)) snd_ump_msg_set_metronome_t;
618typedef struct _snd_ump_msg_set_key_sig {
619#if __BYTE_ORDER == __BIG_ENDIAN
628 uint8_t sharps_flats:4;
629 uint8_t tonic_note:4;
630 uint8_t reserved1[3];
632 uint32_t reserved2[2];
642 uint8_t reserved1[3];
643 uint8_t tonic_note:4;
644 uint8_t sharps_flats:4;
646 uint32_t reserved2[2];
648} __attribute((packed)) snd_ump_msg_set_key_sig_t;
651typedef struct _snd_ump_msg_set_chord_name {
652#if __BYTE_ORDER == __BIG_ENDIAN
661 uint8_t tonic_sharp:4;
662 uint8_t chord_tonic:4;
664 uint8_t alter1_type:4;
665 uint8_t alter1_degree:4;
666 uint8_t alter2_type:4;
667 uint8_t alter2_degree:4;
669 uint8_t alter3_type:4;
670 uint8_t alter3_degree:4;
671 uint8_t alter4_type:4;
672 uint8_t alter4_degree:4;
675 uint8_t bass_sharp:4;
678 uint8_t bass_alter1_type:4;
679 uint8_t bass_alter1_degree:4;
680 uint8_t bass_alter2_type:4;
681 uint8_t bass_alter2_degree:4;
691 uint8_t alter2_degree:4;
692 uint8_t alter2_type:4;
693 uint8_t alter1_degree:4;
694 uint8_t alter1_type:4;
696 uint8_t chord_tonic:4;
697 uint8_t tonic_sharp:4;
700 uint8_t alter4_degree:4;
701 uint8_t alter4_type:4;
702 uint8_t alter3_degree:4;
703 uint8_t alter3_type:4;
705 uint8_t bass_alter2_degree:4;
706 uint8_t bass_alter2_type:4;
707 uint8_t bass_alter1_degree:4;
708 uint8_t bass_alter1_type:4;
711 uint8_t bass_sharp:4;
713} __attribute((packed)) snd_ump_msg_set_chord_name_t;
716typedef union _snd_ump_msg_flex_data {
717 snd_ump_msg_flex_data_meta_t meta;
718 snd_ump_msg_flex_data_meta_t text;
719 snd_ump_msg_set_tempo_t set_tempo;
720 snd_ump_msg_set_time_sig_t set_time_sig;
721 snd_ump_msg_set_metronome_t set_metronome;
722 snd_ump_msg_set_key_sig_t set_key_sig;
723 snd_ump_msg_set_chord_name_t set_chord_name;
724 snd_ump_msg_hdr_t hdr;
726} snd_ump_msg_flex_data_t;
729typedef struct _snd_ump_msg_mixed_data_header {
730#ifdef __BIG_ENDIAN_BITFIELD
740 uint16_t manufacturer;
756 uint16_t manufacturer;
761} snd_ump_msg_mixed_data_header_t;
764typedef struct _snd_ump_msg_mixed_data_payload {
765#ifdef __BIG_ENDIAN_BITFIELD
772 uint32_t payloads[3];
780 uint32_t payloads[3];
782} snd_ump_msg_mixed_data_payload_t;
785typedef union _snd_ump_msg_mixed_data {
786 snd_ump_msg_mixed_data_header_t header;
787 snd_ump_msg_mixed_data_payload_t payload;
789} snd_ump_msg_mixed_data_t;
792typedef struct _snd_ump_msg_jr_clock {
793#if __BYTE_ORDER == __BIG_ENDIAN
806} __attribute((packed)) snd_ump_msg_jr_clock_t;
809typedef struct _snd_ump_msg_dctpq {
810#if __BYTE_ORDER == __BIG_ENDIAN
823} __attribute((packed)) snd_ump_msg_dctpq_t;
826typedef struct _snd_ump_msg_dc {
827#if __BYTE_ORDER == __BIG_ENDIAN
838} __attribute((packed)) snd_ump_msg_dc_t;
841typedef union _snd_ump_msg_utility {
842 snd_ump_msg_jr_clock_t jr_clock;
843 snd_ump_msg_dctpq_t dctpq;
845 snd_ump_msg_hdr_t hdr;
847} snd_ump_msg_utility_t;
853 SND_UMP_MSG_TYPE_UTILITY = 0x00,
854 SND_UMP_MSG_TYPE_SYSTEM = 0x01,
855 SND_UMP_MSG_TYPE_MIDI1_CHANNEL_VOICE = 0x02,
856 SND_UMP_MSG_TYPE_DATA = 0x03,
857 SND_UMP_MSG_TYPE_MIDI2_CHANNEL_VOICE = 0x04,
858 SND_UMP_MSG_TYPE_EXTENDED_DATA = 0x05,
859 SND_UMP_MSG_TYPE_FLEX_DATA = 0x0d,
860 SND_UMP_MSG_TYPE_STREAM = 0x0f,
867 SND_UMP_MSG_PER_NOTE_RCC = 0x0,
868 SND_UMP_MSG_PER_NOTE_ACC = 0x1,
869 SND_UMP_MSG_RPN = 0x2,
870 SND_UMP_MSG_NRPN = 0x3,
871 SND_UMP_MSG_RELATIVE_RPN = 0x4,
872 SND_UMP_MSG_RELATIVE_NRPN = 0x5,
873 SND_UMP_MSG_PER_NOTE_PITCHBEND = 0x6,
874 SND_UMP_MSG_NOTE_OFF = 0x8,
875 SND_UMP_MSG_NOTE_ON = 0x9,
876 SND_UMP_MSG_POLY_PRESSURE = 0xa,
877 SND_UMP_MSG_CONTROL_CHANGE = 0xb,
878 SND_UMP_MSG_PROGRAM_CHANGE = 0xc,
879 SND_UMP_MSG_CHANNEL_PRESSURE = 0xd,
880 SND_UMP_MSG_PITCHBEND = 0xe,
881 SND_UMP_MSG_PER_NOTE_MGMT = 0xf,
888 SND_UMP_MSG_REALTIME = 0xf0,
889 SND_UMP_MSG_SYSEX_START = 0xf0,
890 SND_UMP_MSG_MIDI_TIME_CODE = 0xf1,
891 SND_UMP_MSG_SONG_POSITION = 0xf2,
892 SND_UMP_MSG_SONG_SELECT = 0xf3,
893 SND_UMP_MSG_TUNE_REQUEST = 0xf6,
894 SND_UMP_MSG_SYSEX_END = 0xf7,
895 SND_UMP_MSG_TIMING_CLOCK = 0xf8,
896 SND_UMP_MSG_START = 0xfa,
897 SND_UMP_MSG_CONTINUE = 0xfb,
898 SND_UMP_MSG_STOP = 0xfc,
899 SND_UMP_MSG_ACTIVE_SENSING = 0xfe,
900 SND_UMP_MSG_RESET = 0xff,
905 SND_UMP_SYSEX_STATUS_SINGLE = 0,
906 SND_UMP_SYSEX_STATUS_START = 1,
907 SND_UMP_SYSEX_STATUS_CONTINUE = 2,
908 SND_UMP_SYSEX_STATUS_END = 3,
913 SND_UMP_MIXED_DATA_SET_STATUS_HEADER = 8,
914 SND_UMP_MIXED_DATA_SET_STATUS_PAYLOAD = 9,
919 SND_UMP_UTILITY_MSG_STATUS_NOOP = 0x00,
920 SND_UMP_UTILITY_MSG_STATUS_JR_CLOCK = 0x01,
921 SND_UMP_UTILITY_MSG_STATUS_JR_TSTAMP = 0x02,
922 SND_UMP_UTILITY_MSG_STATUS_DCTPQ = 0x03,
923 SND_UMP_UTILITY_MSG_STATUS_DC = 0x04,
928 SND_UMP_STREAM_MSG_STATUS_EP_DISCOVERY = 0x00,
929 SND_UMP_STREAM_MSG_STATUS_EP_INFO = 0x01,
930 SND_UMP_STREAM_MSG_STATUS_DEVICE_INFO = 0x02,
931 SND_UMP_STREAM_MSG_STATUS_EP_NAME = 0x03,
932 SND_UMP_STREAM_MSG_STATUS_PRODUCT_ID = 0x04,
933 SND_UMP_STREAM_MSG_STATUS_STREAM_CFG_REQUEST = 0x05,
934 SND_UMP_STREAM_MSG_STATUS_STREAM_CFG = 0x06,
935 SND_UMP_STREAM_MSG_STATUS_FB_DISCOVERY = 0x10,
936 SND_UMP_STREAM_MSG_STATUS_FB_INFO = 0x11,
937 SND_UMP_STREAM_MSG_STATUS_FB_NAME = 0x12,
938 SND_UMP_STREAM_MSG_STATUS_START_CLIP = 0x20,
939 SND_UMP_STREAM_MSG_STATUS_END_CLIP = 0x21,
944 SND_UMP_STREAM_MSG_REQUEST_EP_INFO = (1U << 0),
945 SND_UMP_STREAM_MSG_REQUEST_DEVICE_INFO = (1U << 1),
946 SND_UMP_STREAM_MSG_REQUEST_EP_NAME = (1U << 2),
947 SND_UMP_STREAM_MSG_REQUEST_PRODUCT_ID = (1U << 3),
948 SND_UMP_STREAM_MSG_REQUEST_STREAM_CFG = (1U << 4),
953 SND_UMP_STREAM_MSG_REQUEST_FB_INFO = (1U << 0),
954 SND_UMP_STREAM_MSG_REQUEST_FB_NAME = (1U << 1),
959 SND_UMP_STREAM_MSG_EP_INFO_CAP_TXJR = (1U << 0),
960 SND_UMP_STREAM_MSG_EP_INFO_CAP_RXJR = (1U << 1),
961 SND_UMP_STREAM_MSG_EP_INFO_CAP_MIDI1 = (1U << 8),
962 SND_UMP_STREAM_MSG_EP_INFO_CAP_MIDI2 = (1U << 9),
967 SND_UMP_STREAM_MSG_FORMAT_SINGLE = 0,
968 SND_UMP_STREAM_MSG_FORMAT_START = 1,
969 SND_UMP_STREAM_MSG_FORMAT_CONTINUE = 2,
970 SND_UMP_STREAM_MSG_FORMAT_END = 3,
975 SND_UMP_FLEX_DATA_MSG_FORMAT_SINGLE = 0,
976 SND_UMP_FLEX_DATA_MSG_FORMAT_START = 1,
977 SND_UMP_FLEX_DATA_MSG_FORMAT_CONTINUE = 2,
978 SND_UMP_FLEX_DATA_MSG_FORMAT_END = 3,
983 SND_UMP_FLEX_DATA_MSG_ADDR_CHANNEL = 0,
984 SND_UMP_FLEX_DATA_MSG_ADDR_GROUP = 1,
989 SND_UMP_FLEX_DATA_MSG_BANK_SETUP = 0,
990 SND_UMP_FLEX_DATA_MSG_BANK_METADATA = 1,
991 SND_UMP_FLEX_DATA_MSG_BANK_PERF_TEXT = 2,
996 SND_UMP_FLEX_DATA_MSG_STATUS_SET_TEMPO = 0x00,
997 SND_UMP_FLEX_DATA_MSG_STATUS_SET_TIME_SIGNATURE = 0x01,
998 SND_UMP_FLEX_DATA_MSG_STATUS_SET_METRONOME = 0x02,
999 SND_UMP_FLEX_DATA_MSG_STATUS_SET_KEY_SIGNATURE = 0x05,
1000 SND_UMP_FLEX_DATA_MSG_STATUS_SET_CHORD_NAME = 0x06,
1005 SND_UMP_FLEX_DATA_MSG_STATUS_PROJECT_NAME = 0x01,
1006 SND_UMP_FLEX_DATA_MSG_STATUS_SONG_NAME = 0x02,
1007 SND_UMP_FLEX_DATA_MSG_STATUS_MIDI_CLIP_NAME = 0x03,
1008 SND_UMP_FLEX_DATA_MSG_STATUS_COPYRIGHT_NOTICE = 0x04,
1009 SND_UMP_FLEX_DATA_MSG_STATUS_COMPOSER_NAME = 0x05,
1010 SND_UMP_FLEX_DATA_MSG_STATUS_LYRICIST_NAME = 0x06,
1011 SND_UMP_FLEX_DATA_MSG_STATUS_ARRANGER_NAME = 0x07,
1012 SND_UMP_FLEX_DATA_MSG_STATUS_PUBLISHER_NAME = 0x08,
1013 SND_UMP_FLEX_DATA_MSG_STATUS_PRIMARY_PERFORMER = 0x09,
1014 SND_UMP_FLEX_DATA_MSG_STATUS_ACCOMPANY_PERFORMAER = 0x0a,
1015 SND_UMP_FLEX_DATA_MSG_STATUS_RECORDING_DATE = 0x0b,
1016 SND_UMP_FLEX_DATA_MSG_STATUS_RECORDING_LOCATION = 0x0c,
1021 SND_UMP_FLEX_DATA_MSG_STATUS_LYRICS = 0x01,
1022 SND_UMP_FLEX_DATA_MSG_STATUS_LYRICS_LANGUAGE = 0x02,
1023 SND_UMP_FLEX_DATA_MSG_STATUS_RUBY = 0x03,
1024 SND_UMP_FLEX_DATA_MSG_STATUS_RUBY_LANGUAGE = 0x04,
1030static inline uint8_t snd_ump_msg_hdr_status(uint32_t ump)
1032 return (ump >> 20) & 0x0f;
1038static inline uint8_t snd_ump_msg_hdr_channel(uint32_t ump)
1040 return (ump >> 16) & 0x0f;
1046static inline uint8_t snd_ump_msg_hdr_type(uint32_t ump)
1054static inline int snd_ump_msg_type_is_groupless(uint8_t type)
1056 return type == SND_UMP_MSG_TYPE_UTILITY || type == SND_UMP_MSG_TYPE_STREAM;
1062static inline uint8_t snd_ump_msg_hdr_group(uint32_t ump)
1064 return (ump >> 24) & 0x0f;
1070static inline uint8_t snd_ump_msg_status(
const uint32_t *ump)
1072 return snd_ump_msg_hdr_status(*ump);
1078static inline uint8_t snd_ump_msg_channel(
const uint32_t *ump)
1080 return snd_ump_msg_hdr_channel(*ump);
1086static inline uint8_t snd_ump_msg_type(
const uint32_t *ump)
1088 return snd_ump_msg_hdr_type(*ump);
1094static inline uint8_t snd_ump_msg_group(
const uint32_t *ump)
1096 return snd_ump_msg_hdr_group(*ump);
1102static inline uint8_t snd_ump_sysex_msg_status(
const uint32_t *ump)
1104 return (*ump >> 20) & 0xf;
1110static inline uint8_t snd_ump_sysex_msg_length(
const uint32_t *ump)
1112 return (*ump >> 16) & 0xf;
1118static inline uint8_t snd_ump_get_byte(
const uint32_t *ump,
unsigned int offset)
1120#if __BYTE_ORDER == __BIG_ENDIAN
1121 return ((
const uint8_t *)ump)[offset];
1123 return ((
const uint8_t *)ump)[(offset & ~3) | (3 - (offset & 3))];
int snd_ump_msg_sysex_expand(const uint32_t *ump, uint8_t *buf, size_t maxlen, size_t *filled)
fill sysex byte from a UMP packet
Definition ump.c:1081
int snd_ump_packet_length(unsigned int type)
return the length of a UMP packet type
Definition ump.c:1100