This approach is vulnerable to framing errors.
Try the following:
void setup() {
Serial.begin(31250);
}
void loop() {
static uint8_t header = 0;
static uint8_t data1 = 0;
static bool third_byte = false;
if (Serial.available() >= 1) {
uint8_t data = Serial.read();
if (data & 0b10000000) { // if msb == 1 (header byte)
header = data;
third_byte = false;
} else if ((header & 0xF0) == 0xB0) {
if (!third_byte) {
data1 = data;
third_byte = true;
} else {
third_byte = false;
uint8_t data2 = data;
uint8_t channel = header & 0x0F;
handleCC(channel, data1, data2);
}
}
}
}
void handleCC(uint8_t channel, uint8_t data1, uint8_t data2) {
// Serial.printf("Control Change event on channel %d: controller number 0x%02X, value 0x%02X\r\n", channel + 1, data1, data2);
}
Pieter