Передача midi-сообщений ESP32 к Arduino Mega по UART

Привет ардуинщикам! Помогите новичку!
ESP32 по Bluetooth midi-сообщения и передает по uart на arduino mega.
Скетч для ESP32

#include <Arduino.h>
#include <BLEMidi.h>
#include <MIDI.h>
#define LED_BUILTIN 2

MIDI_CREATE_INSTANCE(HardwareSerial, Serial2, MIDI);

void connected();

void onNoteOn(uint8_t channel, uint8_t note, uint8_t velocity, uint16_t timestamp) {
  Serial.printf("NoteOn, channel: %d, note: %d, velocity: %d (timestamp %dms)\n", channel, note, velocity, timestamp);
}

void onNoteOff(uint8_t channel, uint8_t note, uint8_t velocity, uint16_t timestamp) {
  Serial.printf("NoteOff, channel: %d, note: %d, velocity: %d (timestamp %dms)\n", channel, note, velocity, timestamp);
}

void onControlChange(uint8_t channel, uint8_t controller, uint8_t value, uint16_t timestamp) {
  Serial.printf("ControlChange, channel: %d, controller: %d, value %d (timestamp %dms)\n", channel, controller, value, timestamp);
}

void connected() {
  Serial.println("Connected");
}

void setup() {
  Serial.begin(115200);
  BLEMidiServer.begin("MIDI device");
  BLEMidiServer.setOnConnectCallback(connected);
  BLEMidiServer.setOnDisconnectCallback([]() {  // To show how to make a callback with a lambda function
    Serial.println("Disconnected");
  });
  BLEMidiServer.setNoteOnCallback(onNoteOn);
  BLEMidiServer.setNoteOffCallback(onNoteOff);
  BLEMidiServer.setControlChangeCallback(onControlChange);
  //BLEMidiServer.enableDebugging();
  pinMode(LED_BUILTIN, OUTPUT);
  Serial2.begin(31250);  // 31250 пробую 9600
  MIDI.begin(MIDI_CHANNEL_OMNI);
  MIDI.turnThruOff();
}

void loop() {
  MIDI.read();
  delay(30);
}
void OnSysEx(byte* data, unsigned int length) {
  // Перенаправляем System Exclusive сообщение на Serial2
  for (unsigned int i = 0; i < length; i++) {
    Serial2.write(data[i]);
  }
}

Скетч для arduino mega

#include <MIDI.h>

struct CustomBaud : public midi::DefaultSettings{
    static const long BaudRate = 31250; // Baud rate for hairless
};
MIDI_CREATE_CUSTOM_INSTANCE(HardwareSerial, Serial1, MIDI, CustomBaud);


void handleNoteOn(uint8_t channel, uint8_t pitch, uint8_t velocity)
{
  Serial.print("NoteOn, channel: ");
  Serial.print(channel);
  Serial.print(", note: ");
  Serial.print(pitch);
  Serial.print(", velocity: ");
  Serial.println(velocity);
}

void handleNoteOff(uint8_t channel, uint8_t pitch, uint8_t velocity)
{
  Serial.print("NoteOff, channel: ");
  Serial.print(channel);
  Serial.print(", note: ");
  Serial.print(pitch);
  Serial.print(", velocity: ");
  Serial.println(velocity);
}

void handleControlChange(uint8_t channel, uint8_t number, uint8_t value)
{
  // Обработка Control Change сообщений
}

void setup()
{
  Serial.begin(31250); // Для отладки
  Serial1.begin(31250); // Соединение с ESP32 через UART

  MIDI.setHandleNoteOn(handleNoteOn);
  MIDI.setHandleNoteOff(handleNoteOff);
  MIDI.setHandleControlChange(handleControlChange);
  MIDI.begin(MIDI_CHANNEL_OMNI);
}

void loop()
{
  MIDI.read();
  delay(30);
}

В мониторе ESP32 всё правильно:
Connected
NoteOn, channel: 0, note: 56, velocity: 127 (timestamp 0ms)
NoteOff, channel: 0, note: 56, velocity: 0 (timestamp 0ms)
NoteOn, channel: 0, note: 31, velocity: 127 (timestamp 0ms)
NoteOff, channel: 0, note: 31, velocity: 0 (timestamp 0ms)
NoteOn, channel: 0, note: 50, velocity: 127 (timestamp 0ms)
NoteOff, channel: 0, note: 50, velocity: 0 (timestamp 0ms)
А в мониторе мега не правильные числа:
NoteOff, channel: 11, note: 10, velocity: 231
NoteOff, channel: 11, note: 47, velocity: 57
NoteOff, channel: 8, note: 195, velocity: 46
NoteOff, channel: 8, note: 78, velocity: 199
NoteOff, channel: 4, note: 3, velocity: 11
NoteOff, channel: 4, note: 42, velocity: 203

В чём моя ошибка???

как стыкуются скорости 115200 и 31250

Не туда смотришь, 38я строка…
А вот в 36й строке приемной части я бы изменил…

Менял, ничего не изменилось

За 30 миллисекунд мимо вашего приемника успевает проскочить около 100 символов. МИМО!

[edit] - 'не нужно
Кроме того, читать из порта, не проверяя, есть ли там что-нибудь - это значит получать мусор вместо данных.

Так и происходит

Последнее замечание снимается, MIDI.read() сам проверяет наличие сообщений. Попробуйте просто убрать задержку

Убрал, ничего не изменилось

Первое сообщение
NoteOn
Остальные все
NoteOff

Дайте ссылку на библиотеку.

Для ESP32

MIDI.h

@Dmitriy , слона нужно есть по частям.
Раз у Вас два устройства, то и отлаживать нужно каждое из них по отдельности.

  1. Подключите, например, ESP к синтезатору и проверьте, что он играет ноты, причем именно те, что нужно.
  2. Подключите Мегу к клавиатуре и проверьте, что в мониторе порта отображаются именно те ноты, что Вы нажимаете на клавиатуре.

Если с этапом 1 сложности, подключите к выходу логический анализатор и посмотрите, что отправляет ESP.

И еще: если уж создаете тему с вопросом, СХЕМА - ОБЯЗАТЕЛЬНА.