gearmulator

Emulation of classic VA synths of the late 90s/2000s that are based on Motorola 56300 family DSPs
Log | Files | Refs | Submodules | README | LICENSE

commit 0795a1f6b11e7ecc4981bbae374f4c15b227145b
parent ec40b92a92dc98ae9016002567b31be50117d26b
Author: dsp56300 <dsp56300@users.noreply.github.com>
Date:   Sun,  2 Jun 2024 12:39:55 +0200

fix begin/end change gesture issues when DSP replies to parameter changes via sysex

Diffstat:
Msource/jucePluginLib/parameter.cpp | 28+++++++++++++++++++++++-----
Msource/jucePluginLib/parameter.h | 19+++++++++++++++++++
Msource/jucePluginLib/parameterbinding.cpp | 6++----
3 files changed, 44 insertions(+), 9 deletions(-)

diff --git a/source/jucePluginLib/parameter.cpp b/source/jucePluginLib/parameter.cpp @@ -46,9 +46,9 @@ namespace pluginLib break; case Origin::Unknown: case Origin::Ui: - beginChangeGesture(); - setUnnormalizedValueNotifyingHost(newValue, Origin::Derived); - endChangeGesture(); + { + setUnnormalizedValueNotifyingHost(newValue, Origin::Derived); + } break; } } @@ -121,18 +121,21 @@ namespace pluginLib void Parameter::setValueNotifyingHost(const float _value, const Origin _origin) { + ScopedChangeGesture g(*this); setUnnormalizedValue(juce::roundToInt(convertFrom0to1(_value)), _origin); sendValueChangedMessageToListeners(_value); } void Parameter::setUnnormalizedValueNotifyingHost(const float _value, const Origin _origin) { + ScopedChangeGesture g(*this); setUnnormalizedValue(juce::roundToInt(_value), _origin); sendValueChangedMessageToListeners(convertTo0to1(_value)); } void Parameter::setUnnormalizedValueNotifyingHost(const int _value, const Origin _origin) { + ScopedChangeGesture g(*this); setUnnormalizedValue(_value, _origin); sendValueChangedMessageToListeners(convertTo0to1(static_cast<float>(_value))); } @@ -158,6 +161,21 @@ namespace pluginLib onLinkStateChanged(this, m_linkType); } + void Parameter::pushChangeGesture() + { + if(!m_changeGestureCount) + beginChangeGesture(); + ++m_changeGestureCount; + } + + void Parameter::popChangeGesture() + { + assert(m_changeGestureCount > 0); + --m_changeGestureCount; + if(!m_changeGestureCount) + endChangeGesture(); + } + bool Parameter::isMetaParameter() const { return !m_derivedParameters.empty(); @@ -173,6 +191,8 @@ namespace pluginLib if (m_changingDerivedValues) return; + if(_origin == Origin::Midi) + int foo=0; m_lastValueOrigin = _origin; m_value.setValue(clampValue(_newValue)); sendToSynth(); @@ -196,9 +216,7 @@ namespace pluginLib if (notifyHost && getDescription().isPublic) { - beginChangeGesture(); setUnnormalizedValueNotifyingHost(clampedValue, _origin); - endChangeGesture(); } else { diff --git a/source/jucePluginLib/parameter.h b/source/jucePluginLib/parameter.h @@ -95,7 +95,25 @@ namespace pluginLib ParameterLinkType getLinkState() const { return m_linkType; } + void pushChangeGesture(); + void popChangeGesture(); + private: + + struct ScopedChangeGesture + { + explicit ScopedChangeGesture(Parameter& _p) : m_parameter(_p) + { + _p.pushChangeGesture(); + } + ~ScopedChangeGesture() + { + m_parameter.popChangeGesture(); + } + private: + Parameter& m_parameter; + }; + static juce::String genId(const Description &d, int part, int uniqueId); void valueChanged(juce::Value &) override; void setDerivedValue(int _value, Origin _origin, bool _notifyHost); @@ -124,5 +142,6 @@ namespace pluginLib bool m_isLocked = false; ParameterLinkType m_linkType = None; + uint32_t m_changeGestureCount = 0; }; } diff --git a/source/jucePluginLib/parameterbinding.cpp b/source/jucePluginLib/parameterbinding.cpp @@ -14,12 +14,12 @@ namespace pluginLib void ParameterBinding::MouseListener::mouseDown(const juce::MouseEvent& event) { - m_param->beginChangeGesture(); + m_param->pushChangeGesture(); } void ParameterBinding::MouseListener::mouseUp(const juce::MouseEvent& event) { - m_param->endChangeGesture(); + m_param->popChangeGesture(); } void ParameterBinding::MouseListener::mouseDrag(const juce::MouseEvent& event) @@ -164,9 +164,7 @@ namespace pluginLib if(v->getDescription().isPublic) { - v->beginChangeGesture(); v->setUnnormalizedValueNotifyingHost(id - 1, Parameter::Origin::Ui); - v->endChangeGesture(); } v->getValueObject().setValue(id - 1); };