1
/*******************************************/
2
/* JVRev Reverb Subclass */
3
/* by Tim Stilson, 1998 */
4
/* based on CLM JCRev */
5
/* Integrated into STK by Gary Scavone */
7
/* This is based on some of the famous */
8
/* Stanford CCRMA reverbs (NRev, KipRev) */
9
/* all based on the Chowning/Moorer/ */
10
/* Schroeder reverberators, which use */
11
/* networks of simple allpass and comb */
12
/* delay filters. This particular */
13
/* arrangement consists of 3 allpass */
14
/* filters in series, followed by 4 comb */
15
/* filters in parallel, an optional */
16
/* lowpass filter, and two decorrelation */
17
/* delay lines in parallel at the output. */
18
/*******************************************/
24
JCRev :: JCRev(MY_FLOAT T60)
26
/* These are the values from CLM's JCRev.ins ... I found that the
27
impulse response sounded better with the shorter delay lengths.
28
--Gary Scavone, 2/1998
29
int lens[9] = {4799,4999,5399,5801,1051,337,113,573,487};
31
int lens[9] = {1777,1847,1993,2137,389,127,43,211,179};
34
if (SRATE < 44100.0) {
35
double srscale = SRATE / 44100.0;
37
val = (int) floor(srscale * lens[i]);
38
if ((val & 1) == 0) val++;
39
while (!this->isprime(val)) val += 2;
46
APdelayLine[i] = new DLineN(lens[i+4] + 2);
47
APdelayLine[i]->setDelay(lens[i+4]);
51
CdelayLine[i] = new DLineN(lens[i] + 2);
52
CdelayLine[i]->setDelay(lens[i]);
53
combCoeff[i] = pow(10,(-3 * lens[i] / (T60 * SRATE)));
54
// printf("combCoeff[%d] = %f\n", i, combCoeff[i]);
56
outLdelayLine = new DLineN(lens[7] + 2);
57
outLdelayLine->setDelay(lens[7]);
58
outRdelayLine = new DLineN(lens[8] + 2);
59
outRdelayLine->setDelay(lens[8]);
67
delete APdelayLine[0];
68
delete APdelayLine[1];
69
delete APdelayLine[2];
80
APdelayLine[0]->clear();
81
APdelayLine[1]->clear();
82
APdelayLine[2]->clear();
83
CdelayLine[0]->clear();
84
CdelayLine[1]->clear();
85
CdelayLine[2]->clear();
86
CdelayLine[3]->clear();
87
outRdelayLine->clear();
88
outLdelayLine->clear();
96
void JCRev :: setEffectMix(MY_FLOAT mix)
101
MY_FLOAT JCRev :: lastOutput()
103
return (lastOutL + lastOutR) * 0.5;
106
MY_FLOAT JCRev :: lastOutputL()
111
MY_FLOAT JCRev :: lastOutputR()
116
MY_FLOAT JCRev :: tick(MY_FLOAT input)
118
MY_FLOAT temp,temp0,temp1,temp2,temp3,temp4,temp5,temp6;
121
temp = APdelayLine[0]->lastOut();
122
temp0 = allPassCoeff * temp;
124
APdelayLine[0]->tick(temp0);
125
temp0 = -(allPassCoeff * temp0) + temp;
127
temp = APdelayLine[1]->lastOut();
128
temp1 = allPassCoeff * temp;
130
APdelayLine[1]->tick(temp1);
131
temp1 = -(allPassCoeff * temp1) + temp;
133
temp = APdelayLine[2]->lastOut();
134
temp2 = allPassCoeff * temp;
136
APdelayLine[2]->tick(temp2);
137
temp2 = -(allPassCoeff * temp2) + temp;
139
temp3 = temp2 + (combCoeff[0] * CdelayLine[0]->lastOut());
140
temp4 = temp2 + (combCoeff[1] * CdelayLine[1]->lastOut());
141
temp5 = temp2 + (combCoeff[2] * CdelayLine[2]->lastOut());
142
temp6 = temp2 + (combCoeff[3] * CdelayLine[3]->lastOut());
144
CdelayLine[0]->tick(temp3);
145
CdelayLine[1]->tick(temp4);
146
CdelayLine[2]->tick(temp5);
147
CdelayLine[3]->tick(temp6);
152
combsum = temp3+temp4+temp5+temp6;
153
filtout= 0.5*combsum1+0.25*(combsum+combsum2);
155
filtout = temp3+temp4+temp5+temp6;
158
lastOutL = effectMix * (outLdelayLine->tick(filtout));
159
lastOutR = effectMix * (outRdelayLine->tick(filtout));
160
temp = (1.0 - effectMix) * input;
164
return (lastOutL + lastOutR) * 0.5;