1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161
|
#ifndef __GREVERB_H
#define __GREVERB_H
class Diffuser
{
private:
friend class Greverb;
void init (unsigned long size, float c);
void reset (void);
void fini (void);
float process (float x)
{
float w;
w = x - _c * _data [_i];
x = _data [_i] + _c * w;
_data [_i] = w;
if (++_i == _size) _i = 0;
return x;
}
float *_data;
unsigned long _size;
unsigned long _i; // sample index
float _c; // feedback
};
class QuadFDN
{
private:
friend class Greverb;
void init (unsigned long size);
void reset (void);
void fini (void);
void process (float *x0, float *x1)
{
int j;
long k;
for (j = 0; j < 4; j++)
{
k = _i - _d [j];
if (k < 0) k += _size;
_y [j] += _c * (_g [j] * _data [j][k] - _y [j]);
}
_data [0][_i] = x0 [0] + x1 [0] + 0.5 * ( _y [0] + _y [1] - _y [2] - _y [3]);
_data [1][_i] = x0 [1] + x1 [1] + 0.5 * ( _y [0] - _y [1] - _y [2] + _y [3]);
_data [2][_i] = x0 [2] + x1 [2] + 0.5 * (-_y [0] + _y [1] - _y [2] + _y [3]);
_data [3][_i] = x0 [3] + x1 [3] + 0.5 * ( _y [0] + _y [1] + _y [2] + _y [3]);
if (++_i == _size) _i = 0;
}
float *_data [4];
unsigned long _size;
float _g [4]; // gain
float _y [4]; // filtered output
unsigned long _d [4]; // delay
unsigned long _i; // input index
float _c; // damping
};
class MTDelay
{
private:
friend class Greverb;
void init (unsigned long size);
void reset (void);
void fini (void);
void process (float x)
{
int j;
long k;
for (j = 0; j < 4; j++)
{
k = _i - _d [j];
if (k < 0) k += _size;
_y [j] = _data [k];
}
_z += _c * (x - _z);
_data [_i] = _z;
if (++_i == _size) _i = 0;
}
float *_data;
unsigned long _size;
float _y [4]; // output
unsigned long _d [4]; // delay
unsigned long _i; // input index
float _c; // damping;
float _z; // filter state
} ;
class Greverb
{
public:
enum
{
MIN_ROOMSIZE = 5,
MAX_ROOMSIZE = 150,
MIN_REVBTIME = 1,
MAX_REVBTIME = 20
};
Greverb (unsigned long rate);
~Greverb (void);
void reset (void);
void set_roomsize (float roomsize);
void set_revbtime (float revbtime);
void set_ipbandw (float ipbandw);
void set_damping (float damping);
void set_dryslev (float refllev) { _dryslev = refllev; }
void set_refllev (float refllev) { _refllev = refllev; }
void set_taillev (float taillev) { _taillev = taillev; }
void process (unsigned long n, float *x0, float *x1, float *y0, float *y1);
private:
void set_params (void);
unsigned long _rate;
float _roomsize;
float _revbtime;
float _ipbandw;
float _damping;
float _dryslev;
float _refllev;
float _taillev;
Diffuser _dif0;
Diffuser _dif1;
MTDelay _del0;
MTDelay _del1;
QuadFDN _qfdn;
Diffuser _dif1L;
Diffuser _dif2L;
Diffuser _dif3L;
Diffuser _dif1R;
Diffuser _dif2R;
Diffuser _dif3R;
};
#endif
|