Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


PRCRev.h
1#ifndef STK_PRCREV_H
2#define STK_PRCREV_H
3
4#include "Effect.h"
5#include "Delay.h"
6
7namespace stk {
8
9/***************************************************/
22/***************************************************/
23
24class PRCRev : public Effect
25{
26public:
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
81protected:
82
83 Delay allpassDelays_[2];
84 Delay combDelays_[2];
85 StkFloat allpassCoefficient_;
86 StkFloat combCoefficient_[2];
87
88};
89
90inline 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
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
void setT60(StkFloat T60)
Set the reverberation T60 decay time.
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 ...
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
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.
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:279
The STK namespace.
Definition ADSR.h:6

The Synthesis ToolKit in C++ (STK)
©1995--2023 Perry R. Cook and Gary P. Scavone. All Rights Reserved.