| 
							- // Comb filter class declaration
 - //
 - // Written by Jezar at Dreampoint, June 2000
 - // http://www.dreampoint.co.uk
 - // This code is public domain
 - 
 - // adapted for use in VCV Rack by Martin Lueders
 - 
 - #ifndef _comb_
 - #define _comb_
 - 
 - #include "denormals.h"
 - 
 - class comb
 - {
 - public:
 - 	comb() 
 - 	{
 - 		buffer = 0;
 - 		filterstore = 0;
 - 		bufidx = 0;
 - 	};
 - 
 - 	~comb()
 - 	{
 - 		if (buffer) delete buffer;
 - 	};
 - 
 - 	void    makebuffer(float *buf, int size) 
 - 	{
 - 		if (buffer) {delete buffer;}
 - 		buffer = new float[size];
 - 		bufsize = size;
 - 		bufidx = 0;
 - 	}
 - 
 - 	void	deletebuffer()
 - 	{
 - 		if(buffer) delete buffer;
 - 		bufsize = 0;
 - 	};
 - 
 - 	void	setbuffer(float *buf, int size)
 - 	{
 - 		buffer = buf;
 - 		bufsize = size;
 - 	};
 - 
 - 	inline  float	process(float inp, float damp1, float damp2, float feedback);
 - 	void	mute()
 - 	{
 - 		for( int i=0; i<bufsize; i++) buffer[i]=0.0;
 - 	};
 - 
 - private:
 - 	float	filterstore;
 - 	float	*buffer;
 - 	int	bufsize;
 - 	int	bufidx;
 - };
 - 
 - 
 - // Big to inline - but crucial for speed
 - 
 - inline float comb::process(float input, float damp1, float damp2, float feedback)
 - {
 - 	float output;
 - 
 - 	output = buffer[bufidx]; // y[n-K]
 - //	undenormalise(output);
 - 
 - 	filterstore *= damp1;
 - 	filterstore += (output*damp2);
 - 
 - //  filterstore = damp1*filterstore + damp2*output;
 - //  filterstore = damp1*filterstore + (1.0-damp1) * output;
 - //	filterstore = output + damp1*(filterstore - output);
 - 
 - 
 - 
 - //	undenormalise(filterstore);
 - 
 - 	buffer[bufidx] = input + (filterstore*feedback);
 - 
 - 	if(++bufidx>=bufsize) bufidx = 0;
 - 
 - 	return output;
 - }
 - 
 - #endif //_comb_
 - 
 - //ends
 
 
  |