From fb2287b72904a237bb17893607810781721d0ac9 Mon Sep 17 00:00:00 2001 From: Paul Ferrand Date: Sun, 29 Dec 2019 16:40:39 +0100 Subject: [PATCH] Reinstated the volume envelope using the new multiplicative envelope --- src/sfizz/Voice.cpp | 16 ++++++++++++---- src/sfizz/Voice.h | 2 +- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/sfizz/Voice.cpp b/src/sfizz/Voice.cpp index a7e4a15e..365c862b 100644 --- a/src/sfizz/Voice.cpp +++ b/src/sfizz/Voice.cpp @@ -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 buffer) noexcept amplitudeEnvelope.getBlock(span1); applyGain(span1, leftBuffer); + // Volume envelope + volumeEnvelope.getBlock(span1); + applyGain(span1, leftBuffer); + // AmpEG envelope egEnvelope.getBlock(span1); applyGain(span1, leftBuffer); @@ -318,6 +322,10 @@ void sfz::Voice::processStereo(AudioSpan buffer) noexcept amplitudeEnvelope.getBlock(span1); buffer.applyGain(span1); + // Volume envelope + volumeEnvelope.getBlock(span1); + buffer.applyGain(span1); + // AmpEG envelope egEnvelope.getBlock(span1); buffer.applyGain(span1); diff --git a/src/sfizz/Voice.h b/src/sfizz/Voice.h index 89bec831..407c08c9 100644 --- a/src/sfizz/Voice.h +++ b/src/sfizz/Voice.h @@ -300,12 +300,12 @@ private: Resources& resources; ADSREnvelope egEnvelope; - LinearEnvelope volumeEnvelope; // dB events but the envelope output is linear gain LinearEnvelope amplitudeEnvelope; // linear events LinearEnvelope panEnvelope; LinearEnvelope positionEnvelope; LinearEnvelope widthEnvelope; MultiplicativeEnvelope pitchBendEnvelope; + MultiplicativeEnvelope volumeEnvelope; float bendStepFactor { centsFactor(1) }; HistoricalBuffer powerHistory { config::powerHistoryLength };