OHProcess.h (2115B)
1 #ifndef OHPROCESS_H_INCLUDED 2 #define OHPROCESS_H_INCLUDED 3 4 #include <JuceHeader.h> 5 6 /** 7 * Class to simulate the Ornstein-Uhlenbeck process. 8 * Mostly lifted from https://github.com/mhampton/ZetaCarinaeModules 9 * under the GPLv3 license. 10 */ 11 class OHProcess 12 { 13 public: 14 OHProcess() = default; 15 16 void prepare (double sampleRate, int samplesPerBlock, int numChannels) 17 { 18 dsp::ProcessSpec spec { sampleRate, (uint32) samplesPerBlock, (uint32) numChannels }; 19 dsp::ProcessSpec monoSpec { sampleRate, (uint32) samplesPerBlock, 1 }; 20 21 noiseGen.setNoiseType (chowdsp::Noise<float>::Normal); 22 noiseGen.setGainLinear (1.0f / 2.33f); 23 noiseGen.prepare (monoSpec); 24 25 lpf.prepare (spec); 26 lpf.setCutoffFrequency (10.0f); 27 lpf.reset(); 28 29 noiseBuffer.setSize (1, samplesPerBlock); 30 rPtr = noiseBuffer.getReadPointer (0); 31 32 sqrtdelta = 1.0f / std::sqrt ((float) sampleRate); 33 T = 1.0f / (float) sampleRate; 34 35 y.resize ((size_t) numChannels, 1.0f); 36 } 37 38 void prepareBlock (float amtParam, int numSamples) 39 { 40 noiseBuffer.setSize (1, numSamples, false, false, true); 41 noiseBuffer.clear(); 42 43 dsp::AudioBlock<float> noiseBlock (noiseBuffer); 44 noiseGen.process (dsp::ProcessContextReplacing<float> (noiseBlock)); 45 46 amtParam = std::pow (amtParam, 1.25f); 47 amt = amtParam; 48 damping = amtParam * 20.0f + 1.0f; 49 mean = amtParam; 50 } 51 52 inline float process (int n, size_t ch) noexcept 53 { 54 y[ch] += sqrtdelta * rPtr[n] * amt; 55 y[ch] += damping * (mean - y[ch]) * T; 56 return lpf.processSample ((int) ch, y[ch]); 57 } 58 59 private: 60 float sqrtdelta = 1.0f / std::sqrt (48000.0f); 61 float T = 1.0f / 48000.0f; 62 std::vector<float> y; 63 64 float amt = 0.0f; 65 float mean = 0.0f; 66 float damping = 0.0f; 67 68 chowdsp::Noise<float> noiseGen; 69 AudioBuffer<float> noiseBuffer; 70 const float* rPtr = nullptr; 71 72 chowdsp::SVFLowpass<float> lpf; 73 74 JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (OHProcess) 75 }; 76 77 #endif // OHPROCESS_H_INCLUDED