33 std::array<uint8_t, 4>
data{};
55 std::vector<uint8_t> sysex_buffer;
56 bool sysex_in_progress =
false;
57 int32_t sysex_start_offset = 0;
59 for (
const auto& packet : packets) {
60 if (packet.length == 0) {
64 const bool starts_sysex =
65 (!sysex_in_progress && packet.data[0] == 0xF0);
66 if (starts_sysex || sysex_in_progress) {
69 sysex_start_offset =
static_cast<int32_t
>(packet.timestamp);
70 sysex_in_progress =
true;
72 for (uint8_t b = 0; b < packet.length && b < 4; ++b) {
73 const uint8_t
byte = packet.data[b];
74 sysex_buffer.push_back(
byte);
76 out.
add_sysex(std::move(sysex_buffer), sysex_start_offset,
79 sysex_in_progress =
false;
87 if (packet.length > 3) {
90 const unsigned char data1 = packet.length > 1 ? packet.data[1] : 0;
91 const unsigned char data2 = packet.length > 2 ? packet.data[2] : 0;
93 .message = choc::midi::ShortMessage(packet.data[0], data1, data2),
94 .sample_offset =
static_cast<int32_t
>(packet.timestamp),
107 std::span<const uint8_t> payload, uint32_t timestamp) {
108 std::vector<MidiPacketBytes> packets;
109 std::size_t offset = 0;
110 while (offset < payload.size()) {
111 const std::size_t chunk = std::min<std::size_t>(4, payload.size() - offset);
114 packet.
length =
static_cast<uint8_t
>(chunk);
115 for (std::size_t b = 0; b < chunk; ++b) {
116 packet.
data[b] = payload[offset + b];
118 packets.push_back(packet);
Collection of timestamped MIDI events within a single audio buffer period.
Definition buffer.hpp:31
bool add_sysex(std::vector< uint8_t > data, int32_t sample_offset=0, double ts=0.0)
Definition buffer.hpp:352
void sort()
Sort events by sample_offset for sample-accurate processing.
Definition buffer.hpp:177
bool add(const MidiEvent &event)
Append a MIDI event to the buffer.
Definition buffer.hpp:98
Timestamped MIDI event combining a choc::midi::ShortMessage with timing info.
Definition message.hpp:32