Use the pepare() function to initialize filters

This commit is contained in:
Paul Fd 2020-02-19 13:38:48 +01:00
parent 2d94810af2
commit 0173aa1e96
2 changed files with 27 additions and 38 deletions

View file

@ -18,14 +18,22 @@ void sfz::EQHolder::reset()
void sfz::EQHolder::setup(const EQDescription& description, unsigned numChannels, uint8_t velocity)
{
reset();
eq.setChannels(numChannels);
this->description = &description;
const auto normalizedVelocity = normalizeVelocity(velocity);
// Setup the base values
baseFrequency = description.frequency + normalizedVelocity * description.vel2frequency;
baseBandwidth = description.bandwidth;
baseGain = Default::eqGainRange.clamp(description.gain + normalizedVelocity * description.vel2gain);
baseFrequency = Default::eqFrequencyRange.clamp(description.frequency + normalizedVelocity * description.vel2frequency);
baseGain = description.gain + normalizedVelocity * description.vel2gain;
// Setup the modulated values
lastFrequency = midiState.modulate(baseFrequency, description.frequencyCC, Default::eqFrequencyRange);
lastBandwidth = midiState.modulate(baseBandwidth, description.bandwidthCC, Default::eqBandwidthRange);
lastGain = midiState.modulate(baseGain, description.gainCC, Default::eqGainRange);
// Initialize the EQ
eq.prepare(lastFrequency, lastBandwidth, lastGain);
}
void sfz::EQHolder::process(const float** inputs, float** outputs, unsigned numFrames)
@ -42,23 +50,9 @@ void sfz::EQHolder::process(const float** inputs, float** outputs, unsigned numF
// TODO: Once the midistate envelopes are done, add modulation in there!
// For now we take the last value
lastFrequency = baseFrequency;
for (auto& mod: description->frequencyCC) {
lastFrequency += midiState.getCCValue(mod.first) * mod.second;
}
lastFrequency = Default::eqFrequencyRange.clamp(lastFrequency);
lastBandwidth = baseBandwidth;
for (auto& mod: description->bandwidthCC) {
lastBandwidth += midiState.getCCValue(mod.first) * mod.second;
}
lastBandwidth = Default::eqBandwidthRange.clamp(lastBandwidth);
lastGain = baseGain;
for (auto& mod: description->gainCC) {
lastGain += midiState.getCCValue(mod.first) * mod.second;
}
lastGain = Default::eqGainRange.clamp(lastGain);
lastFrequency = midiState.modulate(baseFrequency, description->frequencyCC, Default::eqFrequencyRange);
lastBandwidth = midiState.modulate(baseBandwidth, description->bandwidthCC, Default::eqBandwidthRange);
lastGain = midiState.modulate(baseGain, description->gainCC, Default::eqGainRange);
if (lastGain == 0.0f) {
justCopy();

View file

@ -19,11 +19,11 @@ void sfz::FilterHolder::reset()
void sfz::FilterHolder::setup(const FilterDescription& description, unsigned numChannels, int noteNumber, uint8_t velocity)
{
reset();
this->description = &description;
filter.setType(description.type);
filter.setChannels(numChannels);
// Setup the base values
baseCutoff = description.cutoff;
if (description.random != 0) {
dist.param(filterRandomDist::param_type(0, description.random));
@ -37,6 +37,14 @@ void sfz::FilterHolder::setup(const FilterDescription& description, unsigned num
baseGain = description.gain;
baseResonance = description.resonance;
// Setup the modulated values
lastCutoff = midiState.modulate<float, int>(baseCutoff, description.cutoffCC, Default::filterCutoffRange, multiplyByCents);
lastResonance = midiState.modulate(baseResonance, description.resonanceCC, Default::filterResonanceRange);
baseGain = midiState.modulate(baseGain, description.gainCC, Default::filterGainRange);
// Initialize the filter
filter.prepare(lastCutoff, lastResonance, lastGain);
}
void sfz::FilterHolder::process(const float** inputs, float** outputs, unsigned numFrames)
@ -49,23 +57,10 @@ void sfz::FilterHolder::process(const float** inputs, float** outputs, unsigned
// TODO: Once the midistate envelopes are done, add modulation in there!
// For now we take the last value
lastCutoff = baseCutoff;
for (auto& mod: description->cutoffCC) {
lastCutoff *= centsFactor(midiState.getCCValue(mod.first) * mod.second);
}
lastCutoff = Default::filterCutoffRange.clamp(lastCutoff);
lastResonance = baseResonance;
for (auto& mod: description->resonanceCC) {
lastResonance += midiState.getCCValue(mod.first) * mod.second;
}
lastResonance = Default::filterResonanceRange.clamp(lastResonance);
lastGain = baseGain;
for (auto& mod: description->gainCC) {
lastGain += midiState.getCCValue(mod.first) * mod.second;
}
lastGain = Default::filterGainRange.clamp(lastGain);
// TODO: the template deduction could be automatic here?
lastCutoff = midiState.modulate<float, int>(baseCutoff, description->cutoffCC, Default::filterCutoffRange, multiplyByCents);
lastResonance = midiState.modulate(baseResonance, description->resonanceCC, Default::filterResonanceRange);
baseGain = midiState.modulate(baseGain, description->gainCC, Default::filterGainRange);
filter.process(inputs, outputs, lastCutoff, lastResonance, lastGain, numFrames);
}