diff --git a/external/abseil-cpp b/external/abseil-cpp index a0d1e098..83c1d65c 160000 --- a/external/abseil-cpp +++ b/external/abseil-cpp @@ -1 +1 @@ -Subproject commit a0d1e098c2f99694fa399b175a7ccf920762030e +Subproject commit 83c1d65c90a92aa49632b9ac5a793214bb0768bc diff --git a/sfizz/MathHelpers.h b/sfizz/MathHelpers.h index 93e11bec..553f4d2c 100644 --- a/sfizz/MathHelpers.h +++ b/sfizz/MathHelpers.h @@ -73,4 +73,6 @@ constexpr Type pi { 3.141592653589793238462643383279502884 }; template constexpr Type twoPi { 2 * pi }; template -constexpr Type piTwo { pi / 2 }; \ No newline at end of file +constexpr Type piTwo { pi / 2 }; +template +constexpr Type piFour { pi / 4 }; \ No newline at end of file diff --git a/sfizz/StereoBuffer.h b/sfizz/StereoBuffer.h index 0ec80a6e..fa1526b5 100644 --- a/sfizz/StereoBuffer.h +++ b/sfizz/StereoBuffer.h @@ -31,8 +31,7 @@ #include #include -enum class Channel { left, - right }; +enum class Channel { left, right }; template class StereoBuffer { diff --git a/sfizz/Voice.cpp b/sfizz/Voice.cpp index 10404d60..d235150c 100644 --- a/sfizz/Voice.cpp +++ b/sfizz/Voice.cpp @@ -22,7 +22,7 @@ // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "Voice.h" -#include "Voice.h" +#include "Defaults.h" #include "SIMDHelpers.h" #include "SfzHelpers.h" #include "absl/algorithm/container.h" @@ -53,12 +53,13 @@ void sfz::Voice::startVoice(Region* region, int delay, int channel, int number, baseGain = region->getBaseGain(); if (triggerType != TriggerType::CC) baseGain *= region->getNoteGain(number, value); - DBG("Voice base gain with note crossfades: " << baseGain); baseGain *= region->getCCGain(ccState); - DBG("Voice base gain with CC crossfades: " << baseGain); + if (region->amplitudeCC) + baseGain *= normalizeCC(ccState[region->amplitudeCC->first]) * normalizePercents(region->amplitudeCC->second); + amplitudeEnvelope.reset(baseGain); + sourcePosition = region->getOffset(); initialDelay = delay + region->getDelay(); - DBG("Voice initial delay: " << initialDelay); baseFrequency = midiNoteFrequency(number) * pitchRatio; prepareEGEnvelope(delay, value); } @@ -90,7 +91,6 @@ bool sfz::Voice::isFree() const noexcept return (region == nullptr); } - void sfz::Voice::release(int delay) noexcept { if (state == State::playing) { @@ -123,18 +123,26 @@ void sfz::Voice::registerCC(int delay, int channel [[maybe_unused]], int ccNumbe { if (ccNumber == 64 && noteIsOff && ccValue < 63) release(delay); + + if (region->amplitudeCC && ccNumber == region->amplitudeCC->first) { + const float newGain { normalizeCC(ccValue) * normalizePercents(region->amplitudeCC->second) * baseGain }; + amplitudeEnvelope.registerEvent(delay, newGain); + } } void sfz::Voice::registerPitchWheel(int delay [[maybe_unused]], int channel [[maybe_unused]], int pitch [[maybe_unused]]) noexcept { + // TODO } void sfz::Voice::registerAftertouch(int delay [[maybe_unused]], int channel [[maybe_unused]], uint8_t aftertouch [[maybe_unused]]) noexcept { + // TODO } void sfz::Voice::registerTempo(int delay [[maybe_unused]], float secondsPerQuarter [[maybe_unused]]) noexcept { + // TODO } void sfz::Voice::setSampleRate(float sampleRate) noexcept @@ -167,9 +175,10 @@ void sfz::Voice::renderBlock(StereoSpan buffer) noexcept else fillWithData(buffer); - buffer.applyGain(baseGain); - auto envelopeSpan = tempSpan1.first(numSamples); + amplitudeEnvelope.getBlock(envelopeSpan); + buffer.applyGain(envelopeSpan); + egEnvelope.getBlock(envelopeSpan); buffer.applyGain(envelopeSpan); diff --git a/sfizz/Voice.h b/sfizz/Voice.h index 760fc3d9..9f940bc2 100644 --- a/sfizz/Voice.h +++ b/sfizz/Voice.h @@ -24,6 +24,7 @@ #pragma once #include "ADSREnvelope.h" #include "Config.h" +#include "LinearEnvelope.h" #include "Region.h" #include "StereoBuffer.h" #include "StereoSpan.h" @@ -109,6 +110,10 @@ private: const CCValueArray& ccState; ADSREnvelope egEnvelope; + LinearEnvelope amplitudeEnvelope; + LinearEnvelope leftPanEnvelope; + LinearEnvelope rightPanEnvelope; + LEAK_DETECTOR(Voice); };