diff --git a/source/backend/engine/CarlaEnginePorts.cpp b/source/backend/engine/CarlaEnginePorts.cpp index 0fbd1fdaa..0755da30f 100644 --- a/source/backend/engine/CarlaEnginePorts.cpp +++ b/source/backend/engine/CarlaEnginePorts.cpp @@ -212,14 +212,57 @@ bool CarlaEngineEventPort::writeMidiEvent(const uint32_t time, const uint8_t cha if (event.type != kEngineEventTypeNull) continue; - event.type = kEngineEventTypeMidi; event.time = time; event.channel = channel; + const uint8_t status(uint8_t(MIDI_GET_STATUS_FROM_DATA(data))); + + if (status == MIDI_STATUS_CONTROL_CHANGE) + { + CARLA_SAFE_ASSERT_RETURN(size >= 3, true); + + switch (data[1]) + { + case MIDI_CONTROL_BANK_SELECT: + case MIDI_CONTROL_BANK_SELECT__LSB: + event.type = kEngineEventTypeControl; + event.ctrl.type = kEngineControlEventTypeMidiBank; + event.ctrl.param = data[2]; + event.ctrl.value = 0.0f; + return true; + + case MIDI_CONTROL_ALL_SOUND_OFF: + event.type = kEngineEventTypeControl; + event.ctrl.type = kEngineControlEventTypeAllSoundOff; + event.ctrl.param = 0; + event.ctrl.value = 0.0f; + return true; + + case MIDI_CONTROL_ALL_NOTES_OFF: + event.type = kEngineEventTypeControl; + event.ctrl.type = kEngineControlEventTypeAllNotesOff; + event.ctrl.param = 0; + event.ctrl.value = 0.0f; + return true; + } + } + + if (status == MIDI_STATUS_PROGRAM_CHANGE) + { + CARLA_SAFE_ASSERT_RETURN(size == 2, true); + + event.type = kEngineEventTypeControl; + event.ctrl.type = kEngineControlEventTypeMidiBank; + event.ctrl.param = data[1]; + event.ctrl.value = 0.0f; + return true; + } + + event.type = kEngineEventTypeMidi; event.midi.port = port; event.midi.size = size; - event.midi.data[0] = uint8_t(MIDI_GET_STATUS_FROM_DATA(data)); + event.midi.data[0] = status; uint8_t j=1; for (; j < size; ++j)