Added the amplitude envelope

This commit is contained in:
paulfd 2019-09-06 01:09:36 +02:00
parent db45224e79
commit fad715559f
5 changed files with 26 additions and 11 deletions

2
external/abseil-cpp vendored

@ -1 +1 @@
Subproject commit a0d1e098c2f99694fa399b175a7ccf920762030e
Subproject commit 83c1d65c90a92aa49632b9ac5a793214bb0768bc

View file

@ -73,4 +73,6 @@ constexpr Type pi { 3.141592653589793238462643383279502884 };
template <class Type>
constexpr Type twoPi { 2 * pi<Type> };
template <class Type>
constexpr Type piTwo { pi<Type> / 2 };
constexpr Type piTwo { pi<Type> / 2 };
template <class Type>
constexpr Type piFour { pi<Type> / 4 };

View file

@ -31,8 +31,7 @@
#include <iostream>
#include <type_traits>
enum class Channel { left,
right };
enum class Channel { left, right };
template <class Type, unsigned int Alignment = SIMDConfig::defaultAlignment>
class StereoBuffer {

View file

@ -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<float> 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);

View file

@ -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<float> egEnvelope;
LinearEnvelope<float> amplitudeEnvelope;
LinearEnvelope<float> leftPanEnvelope;
LinearEnvelope<float> rightPanEnvelope;
LEAK_DETECTOR(Voice);
};