Pulp 1.88.0
Cross-platform audio plugin framework
Loading...
Searching...
No Matches
mpe_config_messages.hpp
Go to the documentation of this file.
1#pragma once
2
8
10#include <pulp/midi/message.hpp>
11#include <pulp/midi/ump.hpp>
12
13#include <array>
14#include <cstddef>
15#include <cstdint>
16
17namespace pulp::midi {
18
20template <std::size_t Capacity> struct MpeMessageList {
21 std::array<MidiEvent, Capacity> events{};
22 std::size_t count = 0;
23
24 const MidiEvent* begin() const {
25 return events.data();
26 }
27 const MidiEvent* end() const {
28 return events.data() + count;
29 }
30 std::size_t size() const {
31 return count;
32 }
33
34 void push(const MidiEvent& e) {
35 if (count < Capacity)
36 events[count++] = e;
37 }
38};
39
43inline MpeMessageList<3> mpe_configuration_message(uint8_t manager_channel, uint8_t member_count) {
45 const uint8_t ch = manager_channel == 15 ? uint8_t{15} : uint8_t{0};
46 out.push(MidiEvent::cc(ch, 101, 0));
47 out.push(MidiEvent::cc(ch, 100, 6));
48 out.push(MidiEvent::cc(ch, 6, member_count > 15 ? uint8_t{15} : member_count));
49 return out;
50}
51
55inline MpeMessageList<4> mpe_pitch_bend_range_message(uint8_t channel, float semitones) {
57 if (!(semitones > 0.0f))
58 semitones = 0.0f;
59 if (semitones > 127.0f)
60 semitones = 127.0f;
61 const auto whole = static_cast<uint8_t>(semitones);
62 auto cents = static_cast<int>((semitones - static_cast<float>(whole)) * 100.0f + 0.5f);
63 if (cents > 99)
64 cents = 99;
65 const uint8_t ch = channel & 0x0F;
66 out.push(MidiEvent::cc(ch, 101, 0));
67 out.push(MidiEvent::cc(ch, 100, 0));
68 out.push(MidiEvent::cc(ch, 6, whole));
69 out.push(MidiEvent::cc(ch, 38, static_cast<uint8_t>(cents)));
70 return out;
71}
72
78 for (const auto& e : mpe_configuration_message(0, config.lower_zone.member_channels))
79 out.push(e);
80 const uint8_t upper =
81 config.upper_zone.manager_channel == 15 ? config.upper_zone.member_channels : uint8_t{0};
82 for (const auto& e : mpe_configuration_message(15, upper))
83 out.push(e);
84 return out;
85}
86
91 float manager_semitones,
92 float member_semitones) {
94 if (zone.member_channels == 0)
95 return out;
96 for (const auto& e : mpe_pitch_bend_range_message(zone.manager_channel, manager_semitones))
97 out.push(e);
98 for (uint8_t c = 0; c < 16; ++c) {
99 if (!zone.contains_channel(c))
100 continue;
101 for (const auto& e : mpe_pitch_bend_range_message(c, member_semitones))
102 out.push(e);
103 }
104 return out;
105}
106
108template <std::size_t N> void send_mpe_messages(MidiOutput& output, const MpeMessageList<N>& list) {
109 for (const auto& e : list)
110 output.send(e);
111}
112
113} // namespace pulp::midi
Definition device.hpp:42
virtual void send(const MidiEvent &event)=0
Definition custom_node_events.hpp:26
MpeMessageList< 6 > mpe_zone_layout_messages(const MpeConfig &config)
Zone layout: one Configuration Message for each zone, lower first.
Definition mpe_config_messages.hpp:76
MpeMessageList< 4 > mpe_pitch_bend_range_message(uint8_t channel, float semitones)
Pitch-bend range (RPN 0) for one channel: whole semitones in Data Entry MSB and the remaining hundred...
Definition mpe_config_messages.hpp:55
MpeMessageList< 3 > mpe_configuration_message(uint8_t manager_channel, uint8_t member_count)
MPE Configuration Message: RPN 6 on a manager channel.
Definition mpe_config_messages.hpp:43
void send_mpe_messages(MidiOutput &output, const MpeMessageList< N > &list)
Send every event in list to output, in order.
Definition mpe_config_messages.hpp:108
MpeMessageList< 64 > mpe_zone_pitch_bend_range_messages(const MpeZone &zone, float manager_semitones, float member_semitones)
Pitch-bend ranges for a whole zone: the manager channel gets manager_semitones and every member chann...
Definition mpe_config_messages.hpp:90
Timestamped MIDI event combining a choc::midi::ShortMessage with timing info.
Definition message.hpp:32
static MidiEvent cc(uint8_t channel, uint8_t controller, uint8_t value)
Create a Control Change event.
Definition message.hpp:64
Definition ump.hpp:374
Fixed-capacity, allocation-free list of events returned by the builders.
Definition mpe_config_messages.hpp:20
const MidiEvent * begin() const
Definition mpe_config_messages.hpp:24
std::array< MidiEvent, Capacity > events
Definition mpe_config_messages.hpp:21
std::size_t count
Definition mpe_config_messages.hpp:22
std::size_t size() const
Definition mpe_config_messages.hpp:30
void push(const MidiEvent &e)
Definition mpe_config_messages.hpp:34
const MidiEvent * end() const
Definition mpe_config_messages.hpp:27
Definition ump.hpp:357
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