* Fix incorrect rounding of midi CC when passed to LV2 * Fix inaccurate MIDI CC rounding everywheretags/v2.4.4
@@ -50,7 +50,7 @@ uint8_t EngineControlEvent::convertToMidiData(const uint8_t channel, uint8_t dat | |||||
if (midiValue >= 0) | if (midiValue >= 0) | ||||
data[2] = uint8_t(midiValue); | data[2] = uint8_t(midiValue); | ||||
else | else | ||||
data[2] = uint8_t(carla_fixedValue<float>(0.0f, 1.0f, normalizedValue) * static_cast<float>(MAX_MIDI_VALUE-1)); | |||||
data[2] = uint8_t(carla_fixedValue<float>(0.0f, 1.0f, normalizedValue) * static_cast<float>(MAX_MIDI_VALUE-1) + 0.5f); | |||||
} | } | ||||
return 3; | return 3; | ||||
@@ -1580,7 +1580,7 @@ public: | |||||
fShmRtClientControl.writeByte(3); // size | fShmRtClientControl.writeByte(3); // size | ||||
fShmRtClientControl.writeByte(uint8_t(MIDI_STATUS_CONTROL_CHANGE | (event.channel & MIDI_CHANNEL_BIT))); | fShmRtClientControl.writeByte(uint8_t(MIDI_STATUS_CONTROL_CHANGE | (event.channel & MIDI_CHANNEL_BIT))); | ||||
fShmRtClientControl.writeByte(uint8_t(ctrlEvent.param)); | fShmRtClientControl.writeByte(uint8_t(ctrlEvent.param)); | ||||
fShmRtClientControl.writeByte(uint8_t(ctrlEvent.normalizedValue*127.0f)); | |||||
fShmRtClientControl.writeByte(uint8_t(ctrlEvent.normalizedValue*127.0f + 0.5f)); | |||||
} | } | ||||
break; | break; | ||||
} | } | ||||
@@ -1304,7 +1304,7 @@ public: | |||||
if ((pData->options & PLUGIN_OPTION_SEND_CONTROL_CHANGES) != 0 && ctrlEvent.param < MAX_MIDI_VALUE) | if ((pData->options & PLUGIN_OPTION_SEND_CONTROL_CHANGES) != 0 && ctrlEvent.param < MAX_MIDI_VALUE) | ||||
{ | { | ||||
fluid_synth_cc(fSynth, event.channel, ctrlEvent.param, int(ctrlEvent.normalizedValue*127.0f)); | |||||
fluid_synth_cc(fSynth, event.channel, ctrlEvent.param, int(ctrlEvent.normalizedValue*127.0f + 0.5f)); | |||||
} | } | ||||
break; | break; | ||||
} | } | ||||
@@ -1134,7 +1134,7 @@ public: | |||||
fShmRtClientControl.writeByte(3); // size | fShmRtClientControl.writeByte(3); // size | ||||
fShmRtClientControl.writeByte(uint8_t(MIDI_STATUS_CONTROL_CHANGE | (event.channel & MIDI_CHANNEL_BIT))); | fShmRtClientControl.writeByte(uint8_t(MIDI_STATUS_CONTROL_CHANGE | (event.channel & MIDI_CHANNEL_BIT))); | ||||
fShmRtClientControl.writeByte(uint8_t(ctrlEvent.param)); | fShmRtClientControl.writeByte(uint8_t(ctrlEvent.param)); | ||||
fShmRtClientControl.writeByte(uint8_t(ctrlEvent.normalizedValue*127.0f)); | |||||
fShmRtClientControl.writeByte(uint8_t(ctrlEvent.normalizedValue*127.0f + 0.5f)); | |||||
} | } | ||||
break; | break; | ||||
@@ -1151,7 +1151,7 @@ public: | |||||
uint8_t midiData[3]; | uint8_t midiData[3]; | ||||
midiData[0] = uint8_t(MIDI_STATUS_CONTROL_CHANGE | (event.channel & MIDI_CHANNEL_BIT)); | midiData[0] = uint8_t(MIDI_STATUS_CONTROL_CHANGE | (event.channel & MIDI_CHANNEL_BIT)); | ||||
midiData[1] = uint8_t(ctrlEvent.param); | midiData[1] = uint8_t(ctrlEvent.param); | ||||
midiData[2] = uint8_t(ctrlEvent.normalizedValue*127.0f); | |||||
midiData[2] = uint8_t(ctrlEvent.normalizedValue*127.0f + 0.5f); | |||||
fMidiBuffer.addEvent(midiData, 3, static_cast<int>(event.time)); | fMidiBuffer.addEvent(midiData, 3, static_cast<int>(event.time)); | ||||
} | } | ||||
@@ -1173,7 +1173,7 @@ public: | |||||
fMidiBuffer.addEvent(midiData, 3, static_cast<int>(event.time)); | fMidiBuffer.addEvent(midiData, 3, static_cast<int>(event.time)); | ||||
midiData[1] = MIDI_CONTROL_BANK_SELECT__LSB; | midiData[1] = MIDI_CONTROL_BANK_SELECT__LSB; | ||||
midiData[2] = uint8_t(ctrlEvent.normalizedValue*127.0f); | |||||
midiData[2] = uint8_t(ctrlEvent.normalizedValue*127.0f + 0.5f); | |||||
fMidiBuffer.addEvent(midiData, 3, static_cast<int>(event.time)); | fMidiBuffer.addEvent(midiData, 3, static_cast<int>(event.time)); | ||||
} | } | ||||
break; | break; | ||||
@@ -1190,7 +1190,7 @@ public: | |||||
{ | { | ||||
uint8_t midiData[3]; | uint8_t midiData[3]; | ||||
midiData[0] = uint8_t(MIDI_STATUS_PROGRAM_CHANGE | (event.channel & MIDI_CHANNEL_BIT)); | midiData[0] = uint8_t(MIDI_STATUS_PROGRAM_CHANGE | (event.channel & MIDI_CHANNEL_BIT)); | ||||
midiData[1] = uint8_t(ctrlEvent.normalizedValue*127.0f); | |||||
midiData[1] = uint8_t(ctrlEvent.normalizedValue*127.0f + 0.5f); | |||||
fMidiBuffer.addEvent(midiData, 2, static_cast<int>(event.time)); | fMidiBuffer.addEvent(midiData, 2, static_cast<int>(event.time)); | ||||
} | } | ||||
break; | break; | ||||
@@ -1732,7 +1732,7 @@ public: | |||||
seqEvent.type = SND_SEQ_EVENT_CONTROLLER; | seqEvent.type = SND_SEQ_EVENT_CONTROLLER; | ||||
seqEvent.data.control.channel = event.channel; | seqEvent.data.control.channel = event.channel; | ||||
seqEvent.data.control.param = ctrlEvent.param; | seqEvent.data.control.param = ctrlEvent.param; | ||||
seqEvent.data.control.value = int8_t(ctrlEvent.normalizedValue*127.0f); | |||||
seqEvent.data.control.value = int8_t(ctrlEvent.normalizedValue*127.0f + 0.5f); | |||||
} | } | ||||
#ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | #ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | ||||
@@ -4092,7 +4092,7 @@ public: | |||||
uint8_t midiData[3]; | uint8_t midiData[3]; | ||||
midiData[0] = uint8_t(MIDI_STATUS_CONTROL_CHANGE | (event.channel & MIDI_CHANNEL_BIT)); | midiData[0] = uint8_t(MIDI_STATUS_CONTROL_CHANGE | (event.channel & MIDI_CHANNEL_BIT)); | ||||
midiData[1] = uint8_t(ctrlEvent.param); | midiData[1] = uint8_t(ctrlEvent.param); | ||||
midiData[2] = uint8_t(ctrlEvent.normalizedValue*127.0f); | |||||
midiData[2] = uint8_t(ctrlEvent.normalizedValue*127.0f + 0.5f); | |||||
const uint32_t mtime(isSampleAccurate ? startTime : eventTime); | const uint32_t mtime(isSampleAccurate ? startTime : eventTime); | ||||
@@ -2065,7 +2065,7 @@ public: | |||||
nativeEvent.time = isSampleAccurate ? startTime : eventTime; | nativeEvent.time = isSampleAccurate ? startTime : eventTime; | ||||
nativeEvent.data[0] = uint8_t(MIDI_STATUS_CONTROL_CHANGE | (event.channel & MIDI_CHANNEL_BIT)); | nativeEvent.data[0] = uint8_t(MIDI_STATUS_CONTROL_CHANGE | (event.channel & MIDI_CHANNEL_BIT)); | ||||
nativeEvent.data[1] = uint8_t(ctrlEvent.param); | nativeEvent.data[1] = uint8_t(ctrlEvent.param); | ||||
nativeEvent.data[2] = uint8_t(ctrlEvent.normalizedValue*127.0f); | |||||
nativeEvent.data[2] = uint8_t(ctrlEvent.normalizedValue*127.0f + 0.5f); | |||||
nativeEvent.size = 3; | nativeEvent.size = 3; | ||||
} | } | ||||
@@ -471,7 +471,7 @@ public: | |||||
if ((pData->options & PLUGIN_OPTION_SEND_CONTROL_CHANGES) != 0 && ctrlEvent.param < MAX_MIDI_VALUE) | if ((pData->options & PLUGIN_OPTION_SEND_CONTROL_CHANGES) != 0 && ctrlEvent.param < MAX_MIDI_VALUE) | ||||
{ | { | ||||
fSynth.handleController(event.channel+1, ctrlEvent.param, int(ctrlEvent.normalizedValue*127.0f)); | |||||
fSynth.handleController(event.channel+1, ctrlEvent.param, int(ctrlEvent.normalizedValue*127.0f + 0.5f)); | |||||
} | } | ||||
break; | break; | ||||
@@ -1502,7 +1502,7 @@ public: | |||||
vstMidiEvent.deltaFrames = static_cast<int32_t>(isSampleAccurate ? startTime : eventTime); | vstMidiEvent.deltaFrames = static_cast<int32_t>(isSampleAccurate ? startTime : eventTime); | ||||
vstMidiEvent.midiData[0] = char(MIDI_STATUS_CONTROL_CHANGE | (event.channel & MIDI_CHANNEL_BIT)); | vstMidiEvent.midiData[0] = char(MIDI_STATUS_CONTROL_CHANGE | (event.channel & MIDI_CHANNEL_BIT)); | ||||
vstMidiEvent.midiData[1] = char(ctrlEvent.param); | vstMidiEvent.midiData[1] = char(ctrlEvent.param); | ||||
vstMidiEvent.midiData[2] = char(ctrlEvent.normalizedValue*127.0f); | |||||
vstMidiEvent.midiData[2] = char(ctrlEvent.normalizedValue*127.0f + 0.5f); | |||||
} | } | ||||
#ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | #ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | ||||