Reinstated the volume envelope using the new
multiplicative envelope
This commit is contained in:
parent
1c2d8f4399
commit
fb2287b729
2 changed files with 13 additions and 5 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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 };
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue