Reinstated the volume envelope using the new

multiplicative envelope
This commit is contained in:
Paul Ferrand 2019-12-29 16:40:39 +01:00
parent 1c2d8f4399
commit fb2287b729
2 changed files with 13 additions and 5 deletions

View file

@ -60,11 +60,10 @@ void sfz::Voice::startVoice(Region* region, int delay, int number, uint8_t value
pitchRatio = region->getBasePitchVariation(number, value);
baseVolumedB = region->getBaseVolumedB(number);
auto volumedB { baseVolumedB };
if (region->volumeCC)
volumedB += normalizeCC(midiState.getCCValue(region->volumeCC->first)) * region->volumeCC->second;
volumeEnvelope.reset(db2mag(volumedB));
volumeEnvelope.reset(db2mag(Default::volumeRange.clamp(volumedB)));
baseGain = region->getBaseGain();
baseGain *= region->getCrossfadeGain(midiState.getCCArray());
@ -177,14 +176,15 @@ void sfz::Voice::registerCC(int delay, int ccNumber, uint8_t ccValue) noexcept
if (region->checkSustain && noteIsOff && ccNumber == config::sustainCC && ccValue < config::halfCCThreshold)
release(delay);
// TODO: gain-type events at time 0 may trigger sharp discontinuities; maybe add a minimum delay?
if (region->amplitudeCC && ccNumber == region->amplitudeCC->first) {
const float newGain { baseGain * normalizeCC(ccValue) * normalizePercents(region->amplitudeCC->second) };
amplitudeEnvelope.registerEvent(delay, newGain);
}
if (region->volumeCC && ccNumber == region->volumeCC->first) {
const float newVolumedB { baseVolumedB + normalizeCC(ccValue) * region->volumeCC->second };
amplitudeEnvelope.registerEvent(delay, db2mag(newVolumedB));
const float newVolumedB { Default::volumeRange.clamp(baseVolumedB + normalizeCC(ccValue) * region->volumeCC->second) };
volumeEnvelope.registerEvent(delay, db2mag(newVolumedB));
}
if (region->panCC && ccNumber == region->panCC->first) {
@ -282,6 +282,10 @@ void sfz::Voice::processMono(AudioSpan<float> buffer) noexcept
amplitudeEnvelope.getBlock(span1);
applyGain<float>(span1, leftBuffer);
// Volume envelope
volumeEnvelope.getBlock(span1);
applyGain<float>(span1, leftBuffer);
// AmpEG envelope
egEnvelope.getBlock(span1);
applyGain<float>(span1, leftBuffer);
@ -318,6 +322,10 @@ void sfz::Voice::processStereo(AudioSpan<float> buffer) noexcept
amplitudeEnvelope.getBlock(span1);
buffer.applyGain(span1);
// Volume envelope
volumeEnvelope.getBlock(span1);
buffer.applyGain(span1);
// AmpEG envelope
egEnvelope.getBlock(span1);
buffer.applyGain(span1);

View file

@ -300,12 +300,12 @@ private:
Resources& resources;
ADSREnvelope<float> egEnvelope;
LinearEnvelope<float> volumeEnvelope; // dB events but the envelope output is linear gain
LinearEnvelope<float> amplitudeEnvelope; // linear events
LinearEnvelope<float> panEnvelope;
LinearEnvelope<float> positionEnvelope;
LinearEnvelope<float> widthEnvelope;
MultiplicativeEnvelope<float> pitchBendEnvelope;
MultiplicativeEnvelope<float> volumeEnvelope;
float bendStepFactor { centsFactor(1) };
HistoricalBuffer<float> powerHistory { config::powerHistoryLength };