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);
|
pitchRatio = region->getBasePitchVariation(number, value);
|
||||||
|
|
||||||
baseVolumedB = region->getBaseVolumedB(number);
|
baseVolumedB = region->getBaseVolumedB(number);
|
||||||
|
|
||||||
auto volumedB { baseVolumedB };
|
auto volumedB { baseVolumedB };
|
||||||
if (region->volumeCC)
|
if (region->volumeCC)
|
||||||
volumedB += normalizeCC(midiState.getCCValue(region->volumeCC->first)) * region->volumeCC->second;
|
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->getBaseGain();
|
||||||
baseGain *= region->getCrossfadeGain(midiState.getCCArray());
|
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)
|
if (region->checkSustain && noteIsOff && ccNumber == config::sustainCC && ccValue < config::halfCCThreshold)
|
||||||
release(delay);
|
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) {
|
if (region->amplitudeCC && ccNumber == region->amplitudeCC->first) {
|
||||||
const float newGain { baseGain * normalizeCC(ccValue) * normalizePercents(region->amplitudeCC->second) };
|
const float newGain { baseGain * normalizeCC(ccValue) * normalizePercents(region->amplitudeCC->second) };
|
||||||
amplitudeEnvelope.registerEvent(delay, newGain);
|
amplitudeEnvelope.registerEvent(delay, newGain);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (region->volumeCC && ccNumber == region->volumeCC->first) {
|
if (region->volumeCC && ccNumber == region->volumeCC->first) {
|
||||||
const float newVolumedB { baseVolumedB + normalizeCC(ccValue) * region->volumeCC->second };
|
const float newVolumedB { Default::volumeRange.clamp(baseVolumedB + normalizeCC(ccValue) * region->volumeCC->second) };
|
||||||
amplitudeEnvelope.registerEvent(delay, db2mag(newVolumedB));
|
volumeEnvelope.registerEvent(delay, db2mag(newVolumedB));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (region->panCC && ccNumber == region->panCC->first) {
|
if (region->panCC && ccNumber == region->panCC->first) {
|
||||||
|
|
@ -282,6 +282,10 @@ void sfz::Voice::processMono(AudioSpan<float> buffer) noexcept
|
||||||
amplitudeEnvelope.getBlock(span1);
|
amplitudeEnvelope.getBlock(span1);
|
||||||
applyGain<float>(span1, leftBuffer);
|
applyGain<float>(span1, leftBuffer);
|
||||||
|
|
||||||
|
// Volume envelope
|
||||||
|
volumeEnvelope.getBlock(span1);
|
||||||
|
applyGain<float>(span1, leftBuffer);
|
||||||
|
|
||||||
// AmpEG envelope
|
// AmpEG envelope
|
||||||
egEnvelope.getBlock(span1);
|
egEnvelope.getBlock(span1);
|
||||||
applyGain<float>(span1, leftBuffer);
|
applyGain<float>(span1, leftBuffer);
|
||||||
|
|
@ -318,6 +322,10 @@ void sfz::Voice::processStereo(AudioSpan<float> buffer) noexcept
|
||||||
amplitudeEnvelope.getBlock(span1);
|
amplitudeEnvelope.getBlock(span1);
|
||||||
buffer.applyGain(span1);
|
buffer.applyGain(span1);
|
||||||
|
|
||||||
|
// Volume envelope
|
||||||
|
volumeEnvelope.getBlock(span1);
|
||||||
|
buffer.applyGain(span1);
|
||||||
|
|
||||||
// AmpEG envelope
|
// AmpEG envelope
|
||||||
egEnvelope.getBlock(span1);
|
egEnvelope.getBlock(span1);
|
||||||
buffer.applyGain(span1);
|
buffer.applyGain(span1);
|
||||||
|
|
|
||||||
|
|
@ -300,12 +300,12 @@ private:
|
||||||
Resources& resources;
|
Resources& resources;
|
||||||
|
|
||||||
ADSREnvelope<float> egEnvelope;
|
ADSREnvelope<float> egEnvelope;
|
||||||
LinearEnvelope<float> volumeEnvelope; // dB events but the envelope output is linear gain
|
|
||||||
LinearEnvelope<float> amplitudeEnvelope; // linear events
|
LinearEnvelope<float> amplitudeEnvelope; // linear events
|
||||||
LinearEnvelope<float> panEnvelope;
|
LinearEnvelope<float> panEnvelope;
|
||||||
LinearEnvelope<float> positionEnvelope;
|
LinearEnvelope<float> positionEnvelope;
|
||||||
LinearEnvelope<float> widthEnvelope;
|
LinearEnvelope<float> widthEnvelope;
|
||||||
MultiplicativeEnvelope<float> pitchBendEnvelope;
|
MultiplicativeEnvelope<float> pitchBendEnvelope;
|
||||||
|
MultiplicativeEnvelope<float> volumeEnvelope;
|
||||||
float bendStepFactor { centsFactor(1) };
|
float bendStepFactor { centsFactor(1) };
|
||||||
|
|
||||||
HistoricalBuffer<float> powerHistory { config::powerHistoryLength };
|
HistoricalBuffer<float> powerHistory { config::powerHistoryLength };
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue