Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Public Member Functions | Protected Member Functions | List of all members
stk::FreeVerb Class Reference

Jezar at Dreampoint's FreeVerb, implemented in STK. More...

#include <FreeVerb.h>

Inheritance diagram for stk::FreeVerb:
stk::Effect stk::Stk

Public Member Functions

 FreeVerb ()
 FreeVerb Constructor.
 
 ~FreeVerb ()
 Destructor.
 
void setEffectMix (StkFloat mix)
 Set the effect mix [0 = mostly dry, 1 = mostly wet].
 
void setRoomSize (StkFloat value)
 Set the room size (comb filter feedback gain) parameter [0,1].
 
StkFloat getRoomSize (void)
 Get the room size (comb filter feedback gain) parameter.
 
void setDamping (StkFloat value)
 Set the damping parameter [0=low damping, 1=higher damping].
 
StkFloat getDamping (void)
 Get the damping parameter.
 
void setWidth (StkFloat value)
 Set the width (left-right mixing) parameter [0,1].
 
StkFloat getWidth (void)
 Get the width (left-right mixing) parameter.
 
void setMode (bool isFrozen)
 Set the mode [frozen = 1, unfrozen = 0].
 
StkFloat getMode (void)
 Get the current freeze mode [frozen = 1, unfrozen = 0].
 
void clear (void)
 Clears delay lines, etc.
 
StkFloat lastOut (unsigned int channel=0)
 Return the specified channel value of the last computed stereo frame.
 
StkFloat tick (StkFloat inputL, StkFloat inputR=0.0, unsigned int channel=0)
 Input one or two samples to the effect and return the specified channel value of the computed stereo frame.
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Take two channels of the StkFrames object as inputs to the effect and replace with stereo outputs.
 
StkFramestick (StkFrames &iFrames, StkFrames &oFrames, unsigned int iChannel=0, unsigned int oChannel=0)
 Take one or two channels of the iFrames object as inputs to the effect and write stereo outputs to the oFrames object.
 
- Public Member Functions inherited from stk::Effect
 Effect (void)
 Class constructor.
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
virtual void clear ()=0
 Reset and clear all internal state.
 
virtual void setEffectMix (StkFloat mix)
 Set the mixture of input and "effected" levels in the output (0.0 = input only, 1.0 = effect only).
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes.
 

Protected Member Functions

void update (void)
 Update interdependent parameters.
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate.
 
static void clear_alertList ()
 Static method that frees memory from alertList_.
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 

Detailed Description

Jezar at Dreampoint's FreeVerb, implemented in STK.

Freeverb is a free and open-source Schroeder reverberator originally implemented in C++. The parameters of the reverberation model are exceptionally well tuned. FreeVerb uses 8 lowpass-feedback-comb-filters in parallel, followed by 4 Schroeder allpass filters in series. The input signal can be either mono or stereo, and the output signal is stereo. The delay lengths are optimized for a sample rate of 44100 Hz.

Ported to STK by Gregory Burlet, 2012.

Constructor & Destructor Documentation

◆ FreeVerb()

stk::FreeVerb::FreeVerb ( )

FreeVerb Constructor.

Initializes the effect with default parameters. Note that these defaults are slightly different than those in the original implementation of FreeVerb [Effect Mix: 0.75; Room Size: 0.75; Damping: 0.25; Width: 1.0; Mode: freeze mode off].

Member Function Documentation

◆ lastOut()

StkFloat stk::FreeVerb::lastOut ( unsigned int  channel = 0)
inline

Return the specified channel value of the last computed stereo frame.

Use the lastFrame() function to get both values of the last computed stereo frame. The channel argument must be 0 or 1 (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

166{
167#if defined(_STK_DEBUG_)
168 if ( channel > 1 ) {
169 oStream_ << "FreeVerb::lastOut(): channel argument must be less than 2!";
170 handleError( StkError::FUNCTION_ARGUMENT );
171 }
172#endif
173
174 return lastFrame_[channel];
175}
static void handleError(const char *message, StkError::Type type)
Static function for error reporting and handling using c-strings.

◆ tick() [1/3]

StkFloat stk::FreeVerb::tick ( StkFloat  inputL,
StkFloat  inputR = 0.0,
unsigned int  channel = 0 
)
inline

Input one or two samples to the effect and return the specified channel value of the computed stereo frame.

Use the lastFrame() function to get both values of the computed stereo output frame. The channel argument must be 0 or 1 (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

178{
179#if defined(_STK_DEBUG_)
180 if ( channel > 1 ) {
181 oStream_ << "FreeVerb::tick(): channel argument must be less than 2!";
182 handleError(StkError::FUNCTION_ARGUMENT);
183 }
184#endif
185
186 StkFloat fInput = (inputL + inputR) * gain_;
187 StkFloat outL = 0.0;
188 StkFloat outR = 0.0;
189
190 // Parallel LBCF filters
191 for ( int i = 0; i < nCombs; i++ ) {
192 // Left channel
193 //StkFloat yn = fInput + (roomSize_ * FreeVerb::undenormalize(combLPL_[i].tick(FreeVerb::undenormalize(combDelayL_[i].nextOut()))));
194 StkFloat yn = fInput + (roomSize_ * combLPL_[i].tick( combDelayL_[i].nextOut() ) );
195 combDelayL_[i].tick(yn);
196 outL += yn;
197
198 // Right channel
199 //yn = fInput + (roomSize_ * FreeVerb::undenormalize(combLPR_[i].tick(FreeVerb::undenormalize(combDelayR_[i].nextOut()))));
200 yn = fInput + (roomSize_ * combLPR_[i].tick( combDelayR_[i].nextOut() ) );
201 combDelayR_[i].tick(yn);
202 outR += yn;
203 }
204
205 // Series allpass filters
206 for ( int i = 0; i < nAllpasses; i++ ) {
207 // Left channel
208 //StkFloat vn_m = FreeVerb::undenormalize(allPassDelayL_[i].nextOut());
209 StkFloat vn_m = allPassDelayL_[i].nextOut();
210 StkFloat vn = outL + (g_ * vn_m);
211 allPassDelayL_[i].tick(vn);
212
213 // calculate output
214 outL = -vn + (1.0 + g_)*vn_m;
215
216 // Right channel
217 //vn_m = FreeVerb::undenormalize(allPassDelayR_[i].nextOut());
218 vn_m = allPassDelayR_[i].nextOut();
219 vn = outR + (g_ * vn_m);
220 allPassDelayR_[i].tick(vn);
221
222 // calculate output
223 outR = -vn + (1.0 + g_)*vn_m;
224 }
225
226 // Mix output
227 lastFrame_[0] = outL*wet1_ + outR*wet2_ + inputL*dry_;
228 lastFrame_[1] = outR*wet1_ + outL*wet2_ + inputR*dry_;
229
230 /*
231 // Hard limiter ... there's not much else we can do at this point
232 if ( lastFrame_[0] >= 1.0 ) {
233 lastFrame_[0] = 0.9999;
234 }
235 if ( lastFrame_[0] <= -1.0 ) {
236 lastFrame_[0] = -0.9999;
237 }
238 if ( lastFrame_[1] >= 1.0 ) {
239 lastFrame_[1] = 0.9999;
240 }
241 if ( lastFrame_[1] <= -1.0 ) {
242 lastFrame_[1] = -0.9999;
243 }
244 */
245
246 return lastFrame_[channel];
247}
StkFloat nextOut(void)
Return the value that will be output by the next call to tick().
Definition Delay.h:87
StkFloat tick(StkFloat input)
Input one sample to the filter and return one output.
Definition Delay.h:124
StkFloat tick(StkFloat input)
Input one sample to the filter and return one output.
Definition OnePole.h:80

◆ tick() [2/3]

StkFrames & stk::FreeVerb::tick ( StkFrames frames,
unsigned int  channel = 0 
)

Take two channels of the StkFrames object as inputs to the effect and replace with stereo outputs.

The StkFrames argument reference is returned. The stereo inputs are taken from (and written back to) the StkFrames argument starting at the specified channel. Therefore, the channel argument must be less than ( channels() - 1 ) of the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

◆ tick() [3/3]

StkFrames & stk::FreeVerb::tick ( StkFrames iFrames,
StkFrames oFrames,
unsigned int  iChannel = 0,
unsigned int  oChannel = 0 
)

Take one or two channels of the iFrames object as inputs to the effect and write stereo outputs to the oFrames object.

The iFrames object reference is returned. The iChannel argument must be less than the number of channels in the iFrames argument (the first channel is specified by 0). If more than one channel of data exists in iFrames starting from iChannel, stereo data is input to the effect. The oChannel argument must be less than ( channels() - 1 ) of the oFrames argument. However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.


The documentation for this class was generated from the following file:

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