Krotos Modules 3
Loading...
Searching...
No Matches
Saturation.cpp
Go to the documentation of this file.
1namespace krotos
2{
4 {
5 for (int i = 0; i < NUM_CHANNELS_MAX; i++)
6 {
7 m_lowCutFilters.add(std::make_unique<juce::IIRFilter>());
8 m_highCutFilters.add(std::make_unique<juce::IIRFilter>());
9 }
10 }
11
13
14 void Saturation::prepareToPlay(double sampleRate, int blockSize)
15 {
16 m_sampleRate = sampleRate;
17
18 for (int i = 0; i < NUM_CHANNELS_MAX; i++)
19 {
20 m_lowCutFilters[i]->setCoefficients(IIRCoefficients::makeHighPass(m_sampleRate, 20.0f));
21 m_highCutFilters[i]->setCoefficients(IIRCoefficients::makeLowPass(m_sampleRate, 20000.0f));
22 }
23
24 dsp::ProcessSpec spec;
25 spec.sampleRate = sampleRate;
26 spec.maximumBlockSize = static_cast<unsigned int>(blockSize);
27 spec.numChannels = static_cast<unsigned int>(NUM_CHANNELS_MAX);
28 m_waveshaper.prepare(spec);
29 }
30
31 float Saturation::processSample(float sample, int channel)
32 {
33 float dry = sample;
34
35 sample = m_waveshaper.processSample(sample * m_inputGain);
36 sample = m_lowCutFilters[channel]->processSingleSampleRaw(sample);
37 sample = m_highCutFilters[channel]->processSingleSampleRaw(sample);
38 sample = std::sqrt(m_mix) * sample + std::sqrt(1.0f - m_mix) * dry;
39
40 return sample * m_outputGain;
41 }
42
43 template <typename T> int Saturation::sign(T val) { return (T(0) < val) - (val < T(0)); }
44
45 void Saturation::setInputGainDb(float gainInDb) { m_inputGain = std::pow(10.0f, gainInDb / 20.0f); }
46
47 void Saturation::setOutputGainDb(float gainInDb) { m_outputGain = std::pow(10.0f, gainInDb / 20.0f); }
48
49 void Saturation::setFunctionType(FunctionType function) { m_waveshaper.functionToUse = functions.at(function); }
50
51 void Saturation::setLowCutFrequency(float newCutoffFrequency)
52 {
53 auto coeff = IIRCoefficients::makeHighPass(m_sampleRate, newCutoffFrequency);
54
55 for (int i = 0; i < NUM_CHANNELS_MAX; i++)
56 m_lowCutFilters[i]->setCoefficients(coeff);
57 }
58
59 void Saturation::setHighCutFrequency(float newCutoffFrequency)
60 {
61 auto coeff = IIRCoefficients::makeLowPass(m_sampleRate, newCutoffFrequency);
62
63 for (int i = 0; i < NUM_CHANNELS_MAX; i++)
64 m_highCutFilters[i]->setCoefficients(coeff);
65 }
66
67 void Saturation::setMix(float mix) { m_mix = mix; }
68} // namespace krotos
OwnedArray< IIRFilter > m_highCutFilters
Definition Saturation.h:99
@ mix
Definition Saturation.h:48
float m_mix
Definition Saturation.h:94
OwnedArray< IIRFilter > m_lowCutFilters
Definition Saturation.h:98
double m_sampleRate
Definition Saturation.h:90
void setOutputGainDb(float gainInDb)
Definition Saturation.cpp:47
void setHighCutFrequency(float newCutoffFrequency)
Definition Saturation.cpp:59
float processSample(float sample, int channel)
Definition Saturation.cpp:31
void setLowCutFrequency(float newCutoffFrequency)
Definition Saturation.cpp:51
void setInputGainDb(float gainInDb)
Definition Saturation.cpp:45
Saturation()
Definition Saturation.cpp:3
FunctionType
Definition Saturation.h:11
float m_outputGain
Definition Saturation.h:92
const std::map< FunctionType, float(*)(float)> functions
Definition Saturation.h:19
static int sign(T val)
Definition Saturation.cpp:43
dsp::WaveShaper< float > m_waveshaper
Definition Saturation.h:96
void setMix(float newMixValue)
Definition Saturation.cpp:67
~Saturation()
Definition Saturation.cpp:12
void setFunctionType(FunctionType function)
Definition Saturation.cpp:49
const int NUM_CHANNELS_MAX
Definition Saturation.h:88
float m_inputGain
Definition Saturation.h:93
void prepareToPlay(double sampleRate, int blockSize)
Definition Saturation.cpp:14
Definition AirAbsorptionFilter.cpp:2