Use the pepare() function to initialize filters
This commit is contained in:
parent
2d94810af2
commit
0173aa1e96
2 changed files with 27 additions and 38 deletions
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue