AnalogTapeModel

Physical modelling signal processing for analog tape recording
Log | Files | Refs | Submodules | README | LICENSE

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