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 5a92d08ef711d069da3497966666a0d14f794708
parent f28d1ad577bba445d247e2201a718f312508cb47
Author: dsp56300 <dsp56300@users.noreply.github.com>
Date:   Mon,  6 May 2024 22:37:56 +0200

add support to rate limit parameter changes

Diffstat:
Msource/jucePluginLib/parameter.cpp | 45++++++++++++++++++++++++++++++++++++++++++++-
Msource/jucePluginLib/parameter.h | 8++++++++
2 files changed, 52 insertions(+), 1 deletion(-)

diff --git a/source/jucePluginLib/parameter.cpp b/source/jucePluginLib/parameter.cpp @@ -69,17 +69,60 @@ namespace pluginLib // ignore initial update if (m_lastValue != -1) - m_ctrl.sendParameterChange(*this, static_cast<uint8_t>(value)); + { + if(m_rateLimit) + { + sendParameterChangeDelayed(static_cast<uint8_t>(value), ++m_uniqueDelayCallbackId); + } + else + { + m_lastSendTime = milliseconds(); + m_ctrl.sendParameterChange(*this, static_cast<uint8_t>(value)); + } + } m_lastValue = value; } + uint64_t Parameter::milliseconds() + { + const auto t = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now().time_since_epoch()); + return t.count(); + } + + void Parameter::sendParameterChangeDelayed(const uint8_t _value, uint32_t _uniqueId) + { + if(_uniqueId != m_uniqueDelayCallbackId) + return; + + const auto ms = milliseconds(); + + const auto elapsed = ms - m_lastSendTime; + if(elapsed >= m_rateLimit) + { + m_lastSendTime = ms; + m_ctrl.sendParameterChange(*this, _value); + } + else + { + juce::Timer::callAfterDelay(static_cast<int>(elapsed), [this, _value, _uniqueId] + { + sendParameterChangeDelayed(_value, _uniqueId); + }); + } + } + void Parameter::setValueNotifyingHost(const float _value, const ChangedBy _origin) { setValue(_value, _origin); sendValueChangedMessageToListeners(_value); } + void Parameter::setRateLimitMilliseconds(const uint32_t _ms) + { + m_rateLimit = _ms; + } + bool Parameter::isMetaParameter() const { return !m_derivedParameters.empty(); diff --git a/source/jucePluginLib/parameter.h b/source/jucePluginLib/parameter.h @@ -83,11 +83,15 @@ namespace pluginLib void setValueNotifyingHost(float _value, ChangedBy _origin); + void setRateLimitMilliseconds(uint32_t _ms); + private: static juce::String genId(const Description &d, int part, int uniqueId); void valueChanged(juce::Value &) override; void setDerivedValue(int _value, ChangedBy _origin, bool _notifyHost); void sendToSynth(); + static uint64_t milliseconds(); + void sendParameterChangeDelayed(uint8_t, uint32_t _uniqueId); Controller &m_ctrl; const Description m_desc; @@ -99,5 +103,9 @@ namespace pluginLib juce::Value m_value; std::set<Parameter*> m_derivedParameters; bool m_changingDerivedValues = false; + + uint32_t m_rateLimit = 0; // milliseconds + uint64_t m_lastSendTime = 0; + uint32_t m_uniqueDelayCallbackId = 0; }; }