35 if (m_deviceIdentifier == deviceIdentifier && m_midiInput !=
nullptr)
44 m_deviceIdentifier = deviceIdentifier;
46 if (deviceIdentifier.isNotEmpty())
48 m_midiInput = juce::MidiInput::openDevice(deviceIdentifier,
this);
55 const JUCEAppBasics::MidiCommandRangeAssignment& assi)
57 m_assignments[
static_cast<int>(param)] = assi;
63 return m_assignments[
static_cast<int>(param)];
66void MidiController::handleIncomingMidiMessage(juce::MidiInput*,
const juce::MidiMessage& message)
69 auto msgCopy = message;
70 juce::MessageManager::callAsync([
this, msgCopy]() {
73 auto& assi = m_assignments[i];
74 if (assi.getCommandType() == JUCEAppBasics::MidiCommandRangeAssignment::CT_Invalid)
76 if (!assi.isMatchingCommand(msgCopy) && !assi.isMatchingCommandRange(msgCopy))
78 if (!assi.isMatchingValueRange(msgCopy) && !assi.isMatchingCommandRange(msgCopy))
81 float normalised = 0.5f;
82 if (assi.isValueRangeAssignment())
84 auto range = assi.getValueRange();
85 auto val = JUCEAppBasics::MidiCommandRangeAssignment::getValue(msgCopy);
86 if (range.getLength() > 0)
87 normalised = juce::jlimit(0.0f, 1.0f,
88 float(val - range.getStart()) /
float(range.getLength()));
92 auto domainValue = minVal + normalised * (maxVal - minVal);
void setAssignment(UmsciExternalControlComponent::UpmixMidiParam param, const JUCEAppBasics::MidiCommandRangeAssignment &assi)
void openDevice(const juce::String &deviceIdentifier)
std::function< void(UmsciExternalControlComponent::UpmixMidiParam, float)> onParamValueChanged
const JUCEAppBasics::MidiCommandRangeAssignment & getAssignment(UmsciExternalControlComponent::UpmixMidiParam param) const
~MidiController() override
static const std::array< std::pair< float, float >, UpmixMidiParam_COUNT > s_paramRanges
Natural parameter ranges for normalised MIDI→domain mapping. Indexed by UpmixMidiParam.
UpmixMidiParam
Identifies each controllable upmix transform parameter.