21#ifndef SBL_PROTOCOL_MIDI_PARSER_HPP_
22#define SBL_PROTOCOL_MIDI_PARSER_HPP_
63 dispatch_realtime(
byte);
118 running_status_ = byte;
126 if (in_sysex_)
return;
129 if (data_count_ == 0 && running_status_ == 0) {
134 if (data_count_ == 0 && status_ == 0) {
135 status_ = running_status_;
140 if (data_count_ == 0) {
148 if (data_count_ >= expected_) {
149 dispatch_channel_message();
159 void push(
const uint8_t* data, uint16_t len) {
160 for (uint16_t i = 0; i < len; ++i) {
167 uint8_t channel_filter_ = 0xFF;
170 uint8_t running_status_ = 0;
172 uint8_t expected_ = 0;
173 uint8_t data_count_ = 0;
176 bool in_sysex_ =
false;
178 void dispatch_realtime(uint8_t
byte) {
179 if (!callback_)
return;
194 void dispatch_channel_message() {
195 if (!callback_)
return;
197 uint8_t msg_channel = status_ & 0x0F;
200 if (channel_filter_ != 0xFF && msg_channel != channel_filter_) {
209 uint8_t msg_type = status_ & 0xF0;
MIDI byte stream parser — state machine with running status.
void set_callback(MidiCallback cb)
Set the callback for parsed MIDI events.
void push(const uint8_t *data, uint16_t len)
Feed multiple bytes.
void push(uint8_t byte)
Feed one byte from UART RX.
void set_channel(uint8_t ch)
Set channel filter.
MIDI parser, encoder, SMF and sequencer.
uint8_t expected_data_bytes(uint8_t status)
Number of data bytes expected for a channel message status byte.
void(*)(const MidiEvent &event) MidiCallback
Callback type for parsed MIDI events.
uint8_t channel
0-15 for channel messages, 0 for system