mirror of
https://codeberg.org/armin/rmx-19.git
synced 2026-10-11 16:51:55 +02:00
Smooth MIDI CC parameter changes per-sample to avoid stepped/zippery fast knob rotation
This commit is contained in:
parent
526025840c
commit
51a6944326
4 changed files with 77 additions and 18 deletions
|
|
@ -175,6 +175,23 @@ void RMX19AudioProcessor::processMidi (juce::MidiBuffer& midi, const VParams& p)
|
|||
}
|
||||
}
|
||||
|
||||
void RMX19AudioProcessor::smoothGain (juce::AudioBuffer<float>& buffer, float targetVol)
|
||||
{
|
||||
const int num = buffer.getNumSamples();
|
||||
const int ch = buffer.getNumChannels();
|
||||
if (num <= 0 || ch <= 0) { volSmooth = targetVol; return; }
|
||||
|
||||
const float k = 0.03f; // per-sample glide so volume doesn't step between blocks
|
||||
for (int s = 0; s < num; ++s)
|
||||
{
|
||||
volSmooth += (targetVol - volSmooth) * k;
|
||||
const float g = volSmooth;
|
||||
for (int c = 0; c < ch; ++c)
|
||||
*buffer.getWritePointer (c, s) *= g;
|
||||
}
|
||||
volSmooth = targetVol;
|
||||
}
|
||||
|
||||
void RMX19AudioProcessor::processBlock (juce::AudioBuffer<float>& buffer, juce::MidiBuffer& midi)
|
||||
{
|
||||
juce::ScopedNoDenormals noDenormals;
|
||||
|
|
@ -249,7 +266,7 @@ void RMX19AudioProcessor::processBlock (juce::AudioBuffer<float>& buffer, juce::
|
|||
L[s] = oL;
|
||||
R[s] = oR;
|
||||
}
|
||||
if (p.vol != 1.0f) buffer.applyGain (p.vol);
|
||||
smoothGain (buffer, p.vol);
|
||||
}
|
||||
else if (L != nullptr)
|
||||
{
|
||||
|
|
@ -279,7 +296,7 @@ void RMX19AudioProcessor::processBlock (juce::AudioBuffer<float>& buffer, juce::
|
|||
}
|
||||
for (int c = 0; c < numChannels; ++c)
|
||||
buffer.copyFrom (c, 0, dummy, 0, 0, numSamples);
|
||||
buffer.applyGain (p.vol);
|
||||
smoothGain (buffer, p.vol);
|
||||
}
|
||||
|
||||
cpu = 0.7f * cpu + 0.3f * (float) (juce::Time::getMillisecondCounter() - start);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue