AnalogTapeModel

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

FlutterProcess.h (2329B)


      1 #ifndef FLUTTERPROCESS_H_INCLUDED
      2 #define FLUTTERPROCESS_H_INCLUDED
      3 
      4 #include <JuceHeader.h>
      5 
      6 class FlutterProcess
      7 {
      8 public:
      9     FlutterProcess() = default;
     10 
     11     void prepare (double sampleRate, int samplesPerBlock, int numChannels);
     12     void prepareBlock (float curDepth, float flutterFreq, int numSamples, int numChannels);
     13     void plotBuffer (foleys::MagicPlotSource* plot);
     14 
     15     inline bool shouldTurnOff() const noexcept { return depthSlew[0].getTargetValue() == depthSlewMin; }
     16     inline void updatePhase (size_t ch) noexcept
     17     {
     18         phase1[ch] += angleDelta1;
     19         phase2[ch] += angleDelta2;
     20         phase3[ch] += angleDelta3;
     21     }
     22 
     23     inline std::pair<float, float> getLFO (int n, size_t ch) noexcept
     24     {
     25         updatePhase (ch);
     26         flutterPtrs[ch][n] = depthSlew[ch].getNextValue()
     27                              * (amp1 * std::cos (phase1[ch] + phaseOff1)
     28                                 + amp2 * std::cos (phase2[ch] + phaseOff2)
     29                                 + amp3 * std::cos (phase3[ch] + phaseOff3));
     30         return std::make_pair (flutterPtrs[ch][n], dcOffset);
     31     }
     32 
     33     inline void boundPhase (size_t ch) noexcept
     34     {
     35         while (phase1[ch] >= MathConstants<float>::twoPi)
     36             phase1[ch] -= MathConstants<float>::twoPi;
     37         while (phase2[ch] >= MathConstants<float>::twoPi)
     38             phase2[ch] -= MathConstants<float>::twoPi;
     39         while (phase3[ch] >= MathConstants<float>::twoPi)
     40             phase3[ch] -= MathConstants<float>::twoPi;
     41     }
     42 
     43 private:
     44     std::vector<float> phase1;
     45     std::vector<float> phase2;
     46     std::vector<float> phase3;
     47 
     48     float amp1 = 0.0f;
     49     float amp2 = 0.0f;
     50     float amp3 = 0.0f;
     51     std::vector<SmoothedValue<float, ValueSmoothingTypes::Multiplicative>> depthSlew;
     52 
     53     float angleDelta1 = 0.0f;
     54     float angleDelta2 = 0.0f;
     55     float angleDelta3 = 0.0f;
     56 
     57     float dcOffset = 0.0f;
     58     static constexpr float phaseOff1 = 0.0f;
     59     static constexpr float phaseOff2 = 13.0f * MathConstants<float>::pi / 4.0f;
     60     static constexpr float phaseOff3 = -MathConstants<float>::pi / 10.0f;
     61 
     62     AudioBuffer<float> flutterBuffer;
     63     float** flutterPtrs;
     64     float fs = 48000.0f;
     65 
     66     static constexpr float depthSlewMin = 0.001f;
     67 
     68     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (FlutterProcess)
     69 };
     70 
     71 #endif // FLUTTERPROCESS_H_INCLUDED