elanhickler

FMD Filter - SuperLove HP6

Feb 25th, 2020
267
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.96 KB | None | 0 0
  1. class SuperLove_HP6 : public FMDFilter
  2. {
  3. public:
  4.     SuperLove_HP6()
  5.     {
  6.         lpFilter.setMode(RAPT::rsLadderFilter<double, double>::LP_6);
  7.         hpFilter.setMode(RAPT::rsLadderFilter<double, double>::HP_6);
  8.  
  9.         resonanceGraph.addNode(0, -0.2);
  10.         resonanceGraph.addNode(1, +1.3);
  11.         resonanceGraph.setNodeShapeType(1, rsFunctionNode<double>::EXPONENTIAL);
  12.         resonanceGraph.setNodeShapeParameter(1, -0.85);
  13.  
  14.         setShape(0.5);
  15.         setPhase(0);
  16.         setResonance(0);
  17.     }
  18.     void setInputAmplitude(double v) override
  19.     {
  20.         inputAmplitude = v;
  21.     }
  22.  
  23.     void setOutputAmplitude(double v) override
  24.     {
  25.         outputAmplitude = v;
  26.     }
  27.  
  28.     void setFrequency(double v) override
  29.     {
  30.         frequency = elan::pitchToFreq(jmap(v, -12.0, +135.0));
  31.         hpFilter.setCutoff(clip(frequency, 0.0, 0.5 * sampleRate));  // 1 to 41860
  32.     }
  33.  
  34.     void setResonance(double v) override
  35.     {
  36.         mod = resonanceGraph.getValue(v);
  37.     }
  38.  
  39.     void setChaosAmount(double v) override
  40.     {
  41.         setShape(v);
  42.     }
  43.  
  44.     void setShape(double v)
  45.     {
  46.         shape = 1 - v;
  47.     }
  48.  
  49.     void setPhase(double v)
  50.     {
  51.         phase = v + 0.75; // offset needed for waveshape::trisaw to be correct starting phase
  52.     }
  53.  
  54.     void setSampleRate(double v) override
  55.     {
  56.         sampleRate = v;
  57.  
  58.         lpFilter.setSampleRate(v);
  59.         lpFilter.setCutoff(sampleRate * 0.5);
  60.         hpFilter.setSampleRate(v);
  61.     }
  62.  
  63.     double getSample(double in) override
  64.     {
  65.         // input and feedback signal
  66.         feedbackSignal = mod * feedbackSignal + in * inputAmplitude;
  67.  
  68.         // resonator
  69.         double oscValue = -waveshape::trisaw(feedbackSignal + phase, shape);
  70.  
  71.         // feedback filter
  72.         feedbackSignal = lpFilter.getSample(oscValue*.1);
  73.         feedbackSignal = hpFilter.getSample(feedbackSignal);
  74.         feedbackSignal *= 10;
  75.  
  76.         // final out
  77.         return feedbackSignal * outputAmplitude;
  78.     }
  79.  
  80. protected:
  81.  
  82.     RAPT::rsLadderFilter<double, double> lpFilter;
  83.     RAPT::rsLadderFilter<double, double> hpFilter;
  84.     RAPT::rsNodeBasedFunction<double> resonanceGraph;
  85.  
  86.     double phase;
  87.     double shape;
  88.     double mod;
  89.  
  90.     double feedbackSignal = 0;
  91. };
Advertisement
Add Comment
Please, Sign In to add comment