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