CSL  6.0
Freeverb.h
Go to the documentation of this file.
1 //
2 // Reverb.h -- The CSL port of the public domain Freeverb reverberator
3 // Freeverb was written by Jezar at Dreampoint, June 2000 -- http://www.dreampoint.co.uk
4 // See the copyright notice and acknowledgment of authors in the file COPYRIGHT
5 //
6 
7 #ifndef CSL_Reverb_H
8 #define CSL_Reverb_H
9 
10 #include "CSL_Core.h"
11 
12 #define undenormalise(samplev) if (((*(unsigned int*)&samplev)&0x7f800000) == 0) samplev = 0.0f
13 
14 namespace csl {
15 
16 class Comb; // predeclaration of utility classes
17 class FAllpass;
18 
19 ///
20 /// CSL port of the public domain Freeverb reverberator
21 ///
22 
23 class Freeverb : public Effect, public Scalable {
24 
25 public:
26  Freeverb(UnitGenerator &input);
27  ~Freeverb();
28 
29  float roomSize();
30  void setRoomSize(float size); ///< Setting the room size makes longer tails. The value has a range from 0 to 1.
31  float dampening();
32  void setDampening(float damp); ///< Specified in percentage (from 0 to 100%).
33  float wetLevel();
34  void setWetLevel(float level); ///< Amount of wet (reverberation) in the mixed output.
35  float dryLevel();
36  void setDryLevel(float level); ///< Amount of the original "dry" signal in the output.
37  float width();
38  void setWidth(float width); ///< Currently not used, as this reverb became mono in/out.
39 
40  void nextBuffer(Buffer &outputBuffer, unsigned outBufNum) throw (CException);
41 
42 protected: // accessable parameters
43  float mRoomSize;
44  float mDampening;
45  float mWetLevel;
46  float mDryLevel;
47  float mWidth;
48  // internal parameters
49  float mGain;
50 
51  std::vector <Comb *> mCombFilters;
52  std::vector <FAllpass *> mAllpassFilters;
53 
56 
57  void constructReverbGraph();
58  void updateParameters();
59 };
60 
61 ///
62 /// Comb filter class
63 ///
64 
65 class Comb {
66 public:
67  Comb() : mFilterStore(0), mBufIdx(0) { };
68 
69  void mute();
70  float damp() { return mDamp1; }
71  float feedback() { return mFeedback; }
72  void setDamp(float val);
73  void setFeedback(float val) { mFeedback = val; }
74  void setBuffer(float *buf, int size);
75 
76  inline float process(float inp);
77 
78 private:
79  float mFeedback;
80  float mFilterStore;
81  float mDamp1;
82  float mDamp2;
83  float *mBufferPtr;
84  int mBufSize;
85  int mBufIdx;
86 };
87 
88 ///
89 /// All-pass filter class
90 ///
91 
92 class FAllpass {
93 public:
94  FAllpass() : mBufIdx(0) { };
95 
96  void mute();
97  float feedback() { return mFeedback; };
98  void setFeedback(float val) { mFeedback = val; };
99  void setBuffer(float *buf, int size);
100 
101  inline float process(float inp);
102 
103 private:
104  float mFeedback;
105  float *mBufferPtr;
106  int mBufSize;
107  int mBufIdx;
108 };
109 
110 // Big to inline - but crucial for speed
111 
112 inline float Comb::process(float input) {
113  float output = mBufferPtr[mBufIdx];
114  undenormalise(output);
115  mFilterStore = (output * mDamp2) + (mFilterStore * mDamp1);
117  mBufferPtr[mBufIdx] = input + (mFilterStore * mFeedback);
118  if (++mBufIdx >= mBufSize)
119  mBufIdx = 0;
120  return output;
121 }
122 
123 inline float FAllpass::process(float input) {
124  float bufout = mBufferPtr[mBufIdx];
125  undenormalise(bufout);
126  float output = -input + bufout;
127  mBufferPtr[mBufIdx] = input + (bufout * mFeedback);
128  if (++mBufIdx >= mBufSize)
129  mBufIdx = 0;
130  return output;
131 }
132 
133 ///
134 // Stereoverb is a simple wrapper around 2 freeverbs with splitter/joiners
135 // for handling stereo inputs - note the overrides of isActive() and numchannels()
136 ///
137 
138 class Stereoverb : public Effect {
139 
140 public:
141  Stereoverb(UnitGenerator & input);
142  ~Stereoverb();
143 
144  void setRoomSize(float size);
145  void setDampening(float damp);
146  void setWetLevel(float level);
147  void setDryLevel(float level);
148  void setWidth(float width);
149  bool isActive();
150  unsigned numChannels() { return 2; }; ///< I'm stereo
151 
152  void nextBuffer(Buffer &outputBuffer) throw (CException);
153 
154 protected:
155  Freeverb * leftRev, * rightRev; // 2 mono reverberators
156  Splitter * split; // stereo-to-mono splitter
157  Joiner * join; // mono-to-stereo joiner
158 };
159 
160 }
161 
162 #endif
Freeverb * rightRev
Definition: Freeverb.h:155
void constructReverbGraph()
Definition: Freeverb.cpp:91
float mDamp1
Definition: Freeverb.h:81
AdditiveInstrument.h – Sum-of-sines synthesis instrument class.
Definition: Accessor.h:17
Effect – mix-in for classes that have unit generators as inputs (like filters).
Definition: CSL_Core.h:466
void setWidth(float width)
Currently not used, as this reverb became mono in/out.
Definition: Freeverb.cpp:172
void setDampening(float damp)
Specified in percentage (from 0 to 100%).
Definition: Freeverb.cpp:152
void setDampening(float damp)
Definition: Freeverb.cpp:240
Splitter * split
Definition: Freeverb.h:156
void setDamp(float val)
Definition: Freeverb.cpp:52
void setBuffer(float *buf, int size)
Definition: Freeverb.cpp:42
void setDryLevel(float level)
Amount of the original "dry" signal in the output.
Definition: Freeverb.cpp:168
void setRoomSize(float size)
Setting the room size makes longer tails. The value has a range from 0 to 1.
Definition: Freeverb.cpp:143
std::vector< FAllpass * > mAllpassFilters
Definition: Freeverb.h:52
float damp()
Definition: Freeverb.h:70
float roomSize()
Definition: Freeverb.cpp:141
float wetLevel()
Definition: Freeverb.cpp:157
void setBuffer(float *buf, int size)
Definition: Freeverb.cpp:59
float dampening()
Definition: Freeverb.cpp:148
SampleBufferVector mAllpassBuffers
Definition: Freeverb.h:55
unsigned numChannels()
Definition: Freeverb.h:150
int mBufIdx
Definition: Freeverb.h:85
void setDryLevel(float level)
Definition: Freeverb.cpp:250
void setWetLevel(float level)
Amount of wet (reverberation) in the mixed output.
Definition: Freeverb.cpp:159
float mFeedback
Definition: Freeverb.h:104
#define undenormalise(samplev)
Definition: Freeverb.h:12
float feedback()
Definition: Freeverb.h:71
All-pass filter class.
Definition: Freeverb.h:92
float mFeedback
Definition: Freeverb.h:79
Scalable – mix-in class with scale and offset control inputs (may be constants or generators)...
Definition: CSL_Core.h:403
void mute()
Definition: Freeverb.cpp:64
Comb filter class.
Definition: Freeverb.h:65
float process(float inp)
Definition: Freeverb.h:112
float mRoomSize
Definition: Freeverb.h:43
float mWidth
Definition: Freeverb.h:47
void nextBuffer(Buffer &outputBuffer, unsigned outBufNum)
really compute the next buffer given an offset base channel; this is called by nextBuffer, possibly multiple times
Definition: Freeverb.cpp:179
Freeverb * leftRev
Definition: Freeverb.h:155
void setFeedback(float val)
Definition: Freeverb.h:98
void setRoomSize(float size)
Definition: Freeverb.cpp:235
static size_t size
Definition: fft_N.c:40
bool isActive()
am I active?
Definition: Freeverb.cpp:231
CSL port of the public domain Freeverb reverberator.
Definition: Freeverb.h:23
Stereoverb(UnitGenerator &input)
Definition: Freeverb.cpp:208
void setFeedback(float val)
Definition: Freeverb.h:73
Splitter class – a de-multiplexer for multi-channel signals.
Definition: CSL_Core.h:633
void setWidth(float width)
Definition: Freeverb.cpp:255
void nextBuffer(Buffer &outputBuffer)
I'm stereo.
Definition: Freeverb.cpp:262
void updateParameters()
Definition: Freeverb.cpp:133
float * mBufferPtr
Definition: Freeverb.h:83
float mDryLevel
Definition: Freeverb.h:46
float width()
Definition: Freeverb.cpp:170
Buffer – the multi-channel sample buffer class (passed around between generators and IO guys)...
Definition: CSL_Core.h:106
float mDamp2
Definition: Freeverb.h:82
Joiner class – a multiplexer for multi-channel signals.
Definition: CSL_Core.h:648
Freeverb(UnitGenerator &input)
Definition: Freeverb.cpp:71
float mDampening
Definition: Freeverb.h:44
SampleBuffer * SampleBufferVector
Multi-channel buffer data type, vector of (SampleBuffer)
Definition: CSL_Types.h:195
std::vector< Comb * > mCombFilters
Definition: Freeverb.h:51
SampleBufferVector mCombBuffers
Definition: Freeverb.h:54
forward declaration
Definition: CSL_Core.h:241
float mFilterStore
Definition: Freeverb.h:80
float mGain
Definition: Freeverb.h:49
float mWetLevel
Definition: Freeverb.h:45
int mBufSize
Definition: Freeverb.h:84
void mute()
Definition: Freeverb.cpp:47
float process(float inp)
Definition: Freeverb.h:123
float dryLevel()
Definition: Freeverb.cpp:164
void setWetLevel(float level)
Definition: Freeverb.cpp:245
float feedback()
Definition: Freeverb.h:97
Base class of CSL exceptions (written upper-case). Has a string message.
Joiner * join
Definition: Freeverb.h:157
float * mBufferPtr
Definition: Freeverb.h:105