45 switch (message_type & 0x0F) {
46 case 0x0:
case 0x1:
case 0x2:
50 case 0x8:
case 0x9:
case 0xA:
54 case 0x5:
case 0xD:
case 0xE:
case 0xF:
85 std::array<uint32_t, 4>
words = {};
94 return static_cast<uint8_t
>((
words[0] >> 24) & 0x0F);
98 return static_cast<uint8_t
>((
words[0] >> 16) & 0xFF);
102 return static_cast<uint8_t
>((
words[0] >> 16) & 0x0F);
107 return static_cast<uint8_t
>((
words[0] >> 8) & 0x7F);
112 return static_cast<uint16_t
>((
words[1] >> 16) & 0xFFFF);
125 return static_cast<uint8_t
>(
words[0] & 0xFF);
130 return static_cast<uint16_t
>(
words[1] & 0xFFFF);
144 uint8_t note, uint16_t velocity,
145 uint8_t attr_type = 0, uint16_t attr_data = 0) {
148 p.words[0] = (0x4u << 28) | (uint32_t(
group & 0x0F) << 24)
149 | (uint32_t(0x90 | (
channel & 0x0F)) << 16)
150 | (uint32_t(note & 0x7F) << 8)
151 | uint32_t(attr_type);
152 p.words[1] = (uint32_t(velocity) << 16) | uint32_t(attr_data);
158 uint8_t note, uint16_t velocity = 0) {
161 p.words[0] = (0x4u << 28) | (uint32_t(
group & 0x0F) << 24)
162 | (uint32_t(0x80 | (
channel & 0x0F)) << 16)
163 | (uint32_t(note & 0x7F) << 8);
164 p.words[1] = (uint32_t(velocity) << 16);
170 uint8_t controller, uint32_t value) {
173 p.words[0] = (0x4u << 28) | (uint32_t(
group & 0x0F) << 24)
174 | (uint32_t(0xB0 | (
channel & 0x0F)) << 16)
175 | (uint32_t(controller & 0x7F) << 8);
184 p.words[0] = (0x4u << 28) | (uint32_t(
group & 0x0F) << 24)
185 | (uint32_t(0xE0 | (
channel & 0x0F)) << 16);
192 uint8_t note, uint32_t value) {
195 p.words[0] = (0x4u << 28) | (uint32_t(
group & 0x0F) << 24)
196 | (uint32_t(0x60 | (
channel & 0x0F)) << 16)
197 | (uint32_t(note & 0x7F) << 8);
205 uint8_t note, uint8_t cc_index,
209 p.words[0] = (0x4u << 28) | (uint32_t(
group & 0x0F) << 24)
210 | (uint32_t(0x00 | (
channel & 0x0F)) << 16)
211 | (uint32_t(note & 0x7F) << 8)
212 | uint32_t(cc_index & 0x7F);
219 uint8_t note, uint8_t velocity) {
222 p.words[0] = (0x2u << 28) | (uint32_t(
group & 0x0F) << 24)
223 | (uint32_t(0x90 | (
channel & 0x0F)) << 16)
224 | (uint32_t(note & 0x7F) << 8)
225 | uint32_t(velocity & 0x7F);
234 uint8_t note, uint8_t cc_index,
238 p.words[0] = (0x4u << 28) | (uint32_t(
group & 0x0F) << 24)
239 | (uint32_t(0x10 | (
channel & 0x0F)) << 16)
240 | (uint32_t(note & 0x7F) << 8)
241 | uint32_t(cc_index & 0x7F);
251 uint8_t note, uint8_t flags) {
254 p.words[0] = (0x4u << 28) | (uint32_t(
group & 0x0F) << 24)
255 | (uint32_t(0xF0 | (
channel & 0x0F)) << 16)
256 | (uint32_t(note & 0x7F) << 8)
278template <
typename Visitor>
283 while (w < word_count) {
284 const uint8_t mt =
static_cast<uint8_t
>((words[w] >> 28) & 0x0F);
286 if (w + n > word_count)
break;
287 visit(mt, words + w, n);
311 return static_cast<UtilityStatus>((p.words[0] >> 20) & 0x0F);
319 return static_cast<uint16_t
>(p.words[0] & 0xFFFF);
338 p.words[0] = (0x0u << 28) | (uint32_t(group & 0x0F) << 24)
339 | (uint32_t(0x1) << 20)
348 p.words[0] = (0x0u << 28) | (uint32_t(group & 0x0F) << 24)
349 | (uint32_t(0x2) << 20)
Definition custom_node_events.hpp:26
constexpr double kJrTicksPerSecond
One JR Clock tick is 1/31250 of a second (~32 microseconds).
Definition ump.hpp:324
double jr_value_seconds(uint16_t value)
Definition ump.hpp:326
Midi2Status
Definition ump.hpp:63
@ RegisteredCC
Definition ump.hpp:66
@ AssignableCC
Definition ump.hpp:67
@ NoteOn
Definition ump.hpp:72
@ PerNotePitchBend
Definition ump.hpp:70
@ PolyPressure
Definition ump.hpp:73
@ PerNoteManagement
Definition ump.hpp:78
@ AssignablePerNoteCC
Definition ump.hpp:65
@ NoteOff
Definition ump.hpp:71
@ RelativeRegisteredCC
Definition ump.hpp:68
@ RegisteredPerNoteCC
Definition ump.hpp:64
@ ControlChange
Definition ump.hpp:74
@ ChannelPressure
Definition ump.hpp:76
@ PitchBend
Definition ump.hpp:77
@ RelativeAssignableCC
Definition ump.hpp:69
@ ProgramChange
Definition ump.hpp:75
UmpPacket make_jr_clock(uint8_t group, uint16_t value)
Build a JR Clock utility packet (status 0x1).
Definition ump.hpp:335
UtilityStatus
Utility message status codes (bits 20-23 of word 0 for type 0x0).
Definition ump.hpp:301
@ Noop
Definition ump.hpp:302
@ JrClock
Definition ump.hpp:303
@ DeltaClockstampTicksPerQuarter
Definition ump.hpp:305
@ JrTimestamp
Definition ump.hpp:304
@ DeltaClockstamp
Definition ump.hpp:306
UmpPacket make_jr_timestamp(uint8_t group, uint16_t value)
Build a JR Timestamp utility packet (status 0x2).
Definition ump.hpp:345
uint16_t jr_value_16(const UmpPacket &p)
Extract the 16-bit JR Clock / JR Timestamp value from a type-0 UMP packet (bits 0-15 of word 0).
Definition ump.hpp:318
int ump_words_for_message_type(uint8_t message_type)
Spec-complete UMP packet length, in 32-bit words, for a raw message-type nibble (bits 28-31 of word 0...
Definition ump.hpp:44
UtilityStatus utility_status(const UmpPacket &p)
Extract the utility status nibble from a type-0 UMP packet (bits 20-23 of word 0).
Definition ump.hpp:310
void walk_ump_packet(const uint32_t *words, uint32_t word_count, Visitor &&visit)
Walk one UMP packet's contiguous word array, visiting each complete message in order.
Definition ump.hpp:279
UmpMessageType
Definition ump.hpp:22
@ Midi2ChannelVoice
Definition ump.hpp:27
@ Midi1ChannelVoice
Definition ump.hpp:25
@ Data128
Definition ump.hpp:28
@ Utility
Definition ump.hpp:23
@ System
Definition ump.hpp:24
@ DataSysEx
Definition ump.hpp:26
double jr_value_microseconds(uint16_t value)
Definition ump.hpp:330
const MpeZone * zone_for_channel(uint8_t ch) const
Definition ump.hpp:399
static MpeConfig dual(uint8_t lower_members, uint8_t upper_members)
Definition ump.hpp:386
static MpeConfig standard_lower(uint8_t members=15)
Definition ump.hpp:379
bool is_manager_channel(uint8_t ch) const
Definition ump.hpp:394
MpeZone lower_zone
Definition ump.hpp:375
MpeZone upper_zone
Definition ump.hpp:376
bool is_upper() const
Definition ump.hpp:362
bool is_lower() const
Definition ump.hpp:361
uint8_t manager_channel
Definition ump.hpp:358
uint8_t member_channels
Definition ump.hpp:359
bool contains_channel(uint8_t ch) const
Definition ump.hpp:365
uint8_t velocity_7() const
Definition ump.hpp:116
static constexpr uint8_t kPerNoteDetachControllers
Definition ump.hpp:264
static UmpPacket midi1_note_on(uint8_t group, uint8_t channel, uint8_t note, uint8_t velocity)
Definition ump.hpp:218
static int size_for_type(UmpMessageType type)
Definition ump.hpp:136
uint16_t attribute_data() const
Definition ump.hpp:129
static constexpr uint8_t kPerNoteResetControllers
Definition ump.hpp:263
static UmpPacket per_note_management(uint8_t group, uint8_t channel, uint8_t note, uint8_t flags)
Definition ump.hpp:250
uint8_t group() const
Definition ump.hpp:93
static UmpPacket assignable_per_note_cc(uint8_t group, uint8_t channel, uint8_t note, uint8_t cc_index, uint32_t value)
Definition ump.hpp:233
uint8_t note_number() const
Definition ump.hpp:106
uint8_t channel() const
Definition ump.hpp:101
uint32_t data_32() const
Definition ump.hpp:121
static UmpPacket note_off_2(uint8_t group, uint8_t channel, uint8_t note, uint16_t velocity=0)
Definition ump.hpp:157
uint16_t velocity_16() const
Definition ump.hpp:111
static UmpPacket per_note_pitch_bend(uint8_t group, uint8_t channel, uint8_t note, uint32_t value)
Definition ump.hpp:191
static UmpPacket cc_2(uint8_t group, uint8_t channel, uint8_t controller, uint32_t value)
Definition ump.hpp:169
static UmpPacket note_on_2(uint8_t group, uint8_t channel, uint8_t note, uint16_t velocity, uint8_t attr_type=0, uint16_t attr_data=0)
Definition ump.hpp:143
uint8_t attribute_type() const
Definition ump.hpp:124
uint8_t status() const
Definition ump.hpp:97
std::array< uint32_t, 4 > words
Definition ump.hpp:85
UmpMessageType message_type() const
Definition ump.hpp:89
static UmpPacket pitch_bend_2(uint8_t group, uint8_t channel, uint32_t value)
Definition ump.hpp:181
static UmpPacket registered_per_note_cc(uint8_t group, uint8_t channel, uint8_t note, uint8_t cc_index, uint32_t value)
Definition ump.hpp:204
int word_count
Definition ump.hpp:86