14 Equalizer::Equalizer(juce::AudioProcessor * processor,
int numFilters)
18 if (numFilters < 3) numFilters = 3;
19 if (numFilters > 6) numFilters = 6;
21 filterSet.add(
new LowShelfFilter(processor));
23 for (
int i = 0; i < numFilters - 2; i++)
25 filterSet.add(
new PeakFilter(processor));
28 filterSet.add(
new HighShelfFilter(processor));
30 for (
int i = 0; i < numFilters; i++)
32 EQGains.push_back(1.0f);
41 filterSet[0]->setQ(0.71);
42 filterSet[numFilters - 1]->setQ(0.71);
44 for (
int i = 0; i < numFilters; i++)
47 filterSet[i]->setGain(2);
48 filterSet[i]->setFrequency((i + 1) * 10000 / numFilters);
50 if (i != 0 && i != numFilters - 1) filterSet[i]->setQ(4);
67 const juce::String& blockId)
70 int filterId = std::stoi(blockId.getLastCharacters(1).toStdString());
75 auto paramGain = params.getRawParameterValue(blockId + AudioProcessor::PID_FILTER_GAIN_SUFFIX);
79 throw std::invalid_argument(
"Parameter not found for gain factor in Filter block");
82 if (*paramGain != EQGains[filterId])
84 EQGains[filterId] = *paramGain;
88 filterSet[filterId]->updateParams(params, blockId);
90 mustExec |= filterSet[filterId]->needsToRun();
109 for (
int i = 0; i < filterSet.size(); i++)
111 filterSet[i]->exec(ir);
120 for (
int i = 0; i < filterSet.size(); i++) {
121 filterSet[i]->updateSampleRate(sr);
144 const int dim = filterSet.size();
146 std::vector<
float> evalFrequencies(dim);
150 evalFrequencies[0] = 0;
152 for (
int i = 1; i < dim - 1; i++)
154 evalFrequencies[i] = filterSet[i]->frequency;
157 evalFrequencies[(dim - 1)] = 21000;
161 juce::dsp::Matrix<
float> B(dim, dim);
162 juce::dsp::Matrix<
float> gamma(dim, 1);
163 juce::dsp::Matrix<
float> lambda(dim, 1);
165 float * B_data = B.getRawDataPointer();
166 float * gamma_data = gamma.getRawDataPointer();
167 float * lambda_data = lambda.getRawDataPointer();
171 for (
int i = 0; i < dim; i++)
173 gamma_data[i] = Filter::todB(EQGains[i]);
174 filterSet[i]->setGain(Filter::invdB(1.0f));
178 bool unitaryGain =
false;
182 for (
int k = 0; k < 5; k++)
185 memcpy(lambda_data, gamma_data, dim *
sizeof(
float));
188 for (
int i = 0; i < dim; i++)
191 for (
int j = 0; j < dim; j++)
194 B_data[j + B.getNumColumns() * i] = filterSet[j]->getdBAmplitude(evalFrequencies[i]);
200 for (
int i = 0; i < dim; i++)
203 if (std::abs(lambda_data[i]) < 0.001f)
208 if (!(Filter::invdB(lambda_data[i] * Filter::todB(filterSet[i]->gainFactor)) > 0))
214 filterSet[i]->setGain(Filter::invdB(lambda_data[i] * Filter::todB(filterSet[i]->gainFactor)));
234 float dBAmplitude = 0;
236 for (
int i = 0; i < filterSet.size(); i++)
238 dBAmplitude += filterSet[i]->getdBAmplitude(freq);
252 return filterSet.size();
float getParam(const juce::AudioProcessorValueTreeState ¶ms, const juce::String &blockId) const
Internal method used to get (and check) a parameter's value.
void calibrateFilters()
Calibrates the individual filter gains so that the total gains are equal to the user defined values...
float getdBAmplitude(float freq)
Returns the Equalizer amplitude response in dB at a given frequency.
int getNumFilters()
Returns the number of filters in the equalizer.
virtual void updateSampleRate(double sr) override
Update sample rate for task block.
virtual bool needsToRun() const override
Tells caller whether block must be run for current block.
virtual AudioBlock exec(AudioBlock ir) override
Processes the AudioBuffer input with the EQ filters.
virtual void updateParams(const juce::AudioProcessorValueTreeState ¶ms, const juce::String &blockId) override
Read processor parameters and update block parameters as necessary.