Arduino STK  4.6.2
PRCRev.h
1 #ifndef STK_PRCREV_H
2 #define STK_PRCREV_H
3 
4 #include "Effect.h"
5 #include "Delay.h"
6 
7 namespace stk {
8 
9 /***************************************************/
22 /***************************************************/
23 
24 class PRCRev : public Effect
25 {
26 public:
28  PRCRev( StkFloat T60 = 1.0 );
29 
31  void clear( void );
32 
34  void setT60( StkFloat T60 );
35 
37 
45  StkFloat lastOut( unsigned int channel = 0 );
46 
48 
55  StkFloat tick( StkFloat input, unsigned int channel = 0 );
56 
58 
67  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
68 
70 
79  StkFrames& tick( StkFrames& iFrames, StkFrames &oFrames, unsigned int iChannel = 0, unsigned int oChannel = 0 );
80 
81 protected:
82 
83  Delay allpassDelays_[2];
84  Delay combDelays_[2];
85  StkFloat allpassCoefficient_;
86  StkFloat combCoefficient_[2];
87 
88 };
89 
90 inline StkFloat PRCRev :: lastOut( unsigned int channel )
91 {
92 #if defined(_STK_DEBUG_)
93  if ( channel > 1 ) {
94  oStream_ << "PRCRev::lastOut(): channel argument must be less than 2!";
95  handleError( StkError::FUNCTION_ARGUMENT );
96  }
97 #endif
98 
99  return lastFrame_[channel];
100 }
101 
102  inline StkFloat PRCRev :: tick( StkFloat input, unsigned int channel )
103 {
104 #if defined(_STK_DEBUG_)
105  if ( channel > 1 ) {
106  oStream_ << "PRCRev::tick(): channel argument must be less than 2!";
107  handleError( StkError::FUNCTION_ARGUMENT );
108  }
109 #endif
110 
111  StkFloat temp, temp0, temp1, temp2, temp3;
112 
113  temp = allpassDelays_[0].lastOut();
114  temp0 = allpassCoefficient_ * temp;
115  temp0 += input;
116  allpassDelays_[0].tick(temp0);
117  temp0 = -(allpassCoefficient_ * temp0) + temp;
118 
119  temp = allpassDelays_[1].lastOut();
120  temp1 = allpassCoefficient_ * temp;
121  temp1 += temp0;
122  allpassDelays_[1].tick(temp1);
123  temp1 = -(allpassCoefficient_ * temp1) + temp;
124 
125  temp2 = temp1 + ( combCoefficient_[0] * combDelays_[0].lastOut() );
126  temp3 = temp1 + ( combCoefficient_[1] * combDelays_[1].lastOut() );
127 
128  lastFrame_[0] = effectMix_ * (combDelays_[0].tick(temp2));
129  lastFrame_[1] = effectMix_ * (combDelays_[1].tick(temp3));
130  temp = (1.0 - effectMix_) * input;
131  lastFrame_[0] += temp;
132  lastFrame_[1] += temp;
133 
134  return lastFrame_[channel];
135 }
136 
137 } // stk namespace
138 
139 #endif
140 
STK non-interpolating delay line class.
Definition: Delay.h:25
StkFloat tick(StkFloat input)
Input one sample to the filter and return one output.
Definition: Delay.h:124
StkFloat lastOut(void) const
Return the last computed output value.
Definition: Delay.h:81
STK abstract effects parent class.
Definition: Effect.h:22
Perry's simple reverberator class.
Definition: PRCRev.h:25
void clear(void)
Reset and clear all internal state.
StkFloat lastOut(unsigned int channel=0)
Return the specified channel value of the last computed stereo frame.
Definition: PRCRev.h:90
StkFrames & tick(StkFrames &iFrames, StkFrames &oFrames, unsigned int iChannel=0, unsigned int oChannel=0)
Take a channel of the iFrames object as inputs to the effect and write stereo outputs to the oFrames ...
StkFrames & tick(StkFrames &frames, unsigned int channel=0)
Take a channel of the StkFrames object as inputs to the effect and replace with stereo outputs.
void setT60(StkFloat T60)
Set the reverberation T60 decay time.
StkFloat tick(StkFloat input, unsigned int channel=0)
Input one sample to the effect and return the specified channel value of the computed stereo frame.
Definition: PRCRev.h:102
PRCRev(StkFloat T60=1.0)
Class constructor taking a T60 decay time argument (one second default value).
An STK class to handle vectorized audio data.
Definition: Stk.h:287
static void handleError(const char *message, StkError::Type type)
Static function for error reporting and handling using c-strings.
The STK namespace.
Definition: ADSR.h:8