Setup the filters and EQ from the region

This commit is contained in:
Paul Ferrand 2020-09-16 13:56:37 +02:00
parent dc4f59107b
commit bebd398e39
5 changed files with 41 additions and 39 deletions

View file

@ -16,31 +16,33 @@ void sfz::EQHolder::reset()
eq->clear(); eq->clear();
} }
void sfz::EQHolder::setup(const EQDescription& description, unsigned numChannels, float velocity) void sfz::EQHolder::setup(const Region& region, unsigned eqId, float velocity)
{ {
ASSERT(velocity >= 0.0f && velocity <= 1.0f); ASSERT(velocity >= 0.0f && velocity <= 1.0f);
eq->setType(description.type); ASSERT(eqId < region.equalizers.size());
eq->setChannels(numChannels);
this->description = &description; this->description = &region.equalizers[eqId];
eq->setType(description->type);
eq->setChannels(region.isStereo() ? 2 : 1);
// Setup the base values // Setup the base values
baseFrequency = description.frequency + velocity * description.vel2frequency; baseFrequency = description->frequency + velocity * description->vel2frequency;
baseBandwidth = description.bandwidth; baseBandwidth = description->bandwidth;
baseGain = description.gain + velocity * description.vel2gain; baseGain = description->gain + velocity * description->vel2gain;
// Setup the modulated values // Setup the modulated values
float lastFrequency = baseFrequency; float lastFrequency = baseFrequency;
for (const auto& mod : description.frequencyCC) for (const auto& mod : description->frequencyCC)
lastFrequency += resources.midiState.getCCValue(mod.cc) * mod.data; lastFrequency += resources.midiState.getCCValue(mod.cc) * mod.data;
lastFrequency = Default::eqFrequencyRange.clamp(lastFrequency); lastFrequency = Default::eqFrequencyRange.clamp(lastFrequency);
float lastBandwidth = baseBandwidth; float lastBandwidth = baseBandwidth;
for (const auto& mod : description.bandwidthCC) for (const auto& mod : description->bandwidthCC)
lastBandwidth += resources.midiState.getCCValue(mod.cc) * mod.data; lastBandwidth += resources.midiState.getCCValue(mod.cc) * mod.data;
lastBandwidth = Default::eqBandwidthRange.clamp(lastBandwidth); lastBandwidth = Default::eqBandwidthRange.clamp(lastBandwidth);
float lastGain = baseGain; float lastGain = baseGain;
for (const auto& mod : description.gainCC) for (const auto& mod : description->gainCC)
lastGain += resources.midiState.getCCValue(mod.cc) * mod.data; lastGain += resources.midiState.getCCValue(mod.cc) * mod.data;
lastGain = Default::filterGainRange.clamp(lastGain); lastGain = Default::filterGainRange.clamp(lastGain);

View file

@ -1,6 +1,6 @@
#pragma once #pragma once
#include "SfzFilter.h" #include "SfzFilter.h"
#include "EQDescription.h" #include "Region.h"
#include "Resources.h" #include "Resources.h"
#include "utility/SpinMutex.h" #include "utility/SpinMutex.h"
#include <vector> #include <vector>
@ -16,13 +16,13 @@ public:
EQHolder() = delete; EQHolder() = delete;
EQHolder(const Resources& resources); EQHolder(const Resources& resources);
/** /**
* @brief Setup a new EQ based on an EQ description. * @brief Setup a new EQ from a region and an index
* *
* @param description the EQ description * @param description the region from which we take the EQ
* @param numChannels the number of channels for the EQ * @param eqId the EQ index in the region
* @param description the triggering velocity/value * @param description the triggering velocity/value
*/ */
void setup(const EQDescription& description, unsigned numChannels, float velocity); void setup(const Region& region, unsigned eqId, float velocity);
/** /**
* @brief Process a block of stereo inputs * @brief Process a block of stereo inputs
* *

View file

@ -17,42 +17,43 @@ void sfz::FilterHolder::reset()
filter->clear(); filter->clear();
} }
void sfz::FilterHolder::setup(const FilterDescription& description, unsigned numChannels, int noteNumber, float velocity) void sfz::FilterHolder::setup(const Region& region, unsigned filterId, int noteNumber, float velocity)
{ {
ASSERT(velocity >= 0.0f && velocity <= 1.0f); ASSERT(velocity >= 0.0f && velocity <= 1.0f);
ASSERT(filterId < region.filters.size());
this->description = &description; this->description = &region.filters[filterId];
filter->setType(description.type); filter->setType(description->type);
filter->setChannels(numChannels); filter->setChannels(region.isStereo() ? 2 : 1);
// Setup the base values // Setup the base values
baseCutoff = description.cutoff; baseCutoff = description->cutoff;
if (description.random != 0) { if (description->random != 0) {
dist.param(filterRandomDist::param_type(0, description.random)); dist.param(filterRandomDist::param_type(0, description->random));
baseCutoff *= centsFactor(dist(Random::randomGenerator)); baseCutoff *= centsFactor(dist(Random::randomGenerator));
} }
const auto keytrack = description.keytrack * (noteNumber - description.keycenter); const auto keytrack = description->keytrack * (noteNumber - description->keycenter);
baseCutoff *= centsFactor(keytrack); baseCutoff *= centsFactor(keytrack);
const auto veltrack = static_cast<float>(description.veltrack) * velocity; const auto veltrack = static_cast<float>(description->veltrack) * velocity;
baseCutoff *= centsFactor(veltrack); baseCutoff *= centsFactor(veltrack);
baseCutoff = Default::filterCutoffRange.clamp(baseCutoff); baseCutoff = Default::filterCutoffRange.clamp(baseCutoff);
baseGain = description.gain; baseGain = description->gain;
baseResonance = description.resonance; baseResonance = description->resonance;
// Setup the modulated values // Setup the modulated values
float lastCutoff = baseCutoff; float lastCutoff = baseCutoff;
for (const auto& mod : description.cutoffCC) for (const auto& mod : description->cutoffCC)
lastCutoff *= centsFactor(resources.midiState.getCCValue(mod.cc) * mod.data); lastCutoff *= centsFactor(resources.midiState.getCCValue(mod.cc) * mod.data);
lastCutoff = Default::filterCutoffRange.clamp(lastCutoff); lastCutoff = Default::filterCutoffRange.clamp(lastCutoff);
float lastResonance = baseResonance; float lastResonance = baseResonance;
for (const auto& mod : description.resonanceCC) for (const auto& mod : description->resonanceCC)
lastResonance += resources.midiState.getCCValue(mod.cc) * mod.data; lastResonance += resources.midiState.getCCValue(mod.cc) * mod.data;
lastResonance = Default::filterResonanceRange.clamp(lastResonance); lastResonance = Default::filterResonanceRange.clamp(lastResonance);
float lastGain = baseGain; float lastGain = baseGain;
for (const auto& mod : description.gainCC) for (const auto& mod : description->gainCC)
lastGain += resources.midiState.getCCValue(mod.cc) * mod.data; lastGain += resources.midiState.getCCValue(mod.cc) * mod.data;
lastGain = Default::filterGainRange.clamp(lastGain); lastGain = Default::filterGainRange.clamp(lastGain);

View file

@ -1,6 +1,6 @@
#pragma once #pragma once
#include "SfzFilter.h" #include "SfzFilter.h"
#include "FilterDescription.h" #include "Region.h"
#include "Resources.h" #include "Resources.h"
#include "Defaults.h" #include "Defaults.h"
#include "utility/SpinMutex.h" #include "utility/SpinMutex.h"
@ -19,12 +19,12 @@ public:
/** /**
* @brief Setup a new filter based on a filter description, and a triggering note parameters. * @brief Setup a new filter based on a filter description, and a triggering note parameters.
* *
* @param description the filter description * @param description the region from which we take the filter
* @param numChannels the number of channels * @param filterId the filter index in the region
* @param noteNumber the triggering note number * @param noteNumber the triggering note number
* @param velocity the triggering note velocity/value * @param velocity the triggering note velocity/value
*/ */
void setup(const FilterDescription& description, unsigned numChannels, int noteNumber = static_cast<int>(Default::filterKeycenter), float velocity = 0); void setup(const Region& region, unsigned filterId, int noteNumber = static_cast<int>(Default::filterKeycenter), float velocity = 0);
/** /**
* @brief Process a block of stereo inputs * @brief Process a block of stereo inputs
* *

View file

@ -121,13 +121,12 @@ void sfz::Voice::startVoice(Region* region, int delay, const TriggerEvent& event
gainSmoother.reset(); gainSmoother.reset();
resetCrossfades(); resetCrossfades();
const unsigned numChannels = region->isStereo() ? 2 : 1;
for (unsigned i = 0; i < region->filters.size(); ++i) { for (unsigned i = 0; i < region->filters.size(); ++i) {
filters[i].setup(region->filters[i], numChannels, triggerEvent.number, triggerEvent.value); filters[i].setup(*region, i, triggerEvent.number, triggerEvent.value);
} }
for (unsigned i = 0; i < region->equalizers.size(); ++i) { for (unsigned i = 0; i < region->equalizers.size(); ++i) {
equalizers[i].setup(region->equalizers[i], numChannels, triggerEvent.value); equalizers[i].setup(*region, i, triggerEvent.value);
} }
sourcePosition = region->getOffset(); sourcePosition = region->getOffset();