Merge pull request #506 from andrewcsmith/patch-2
[supercollider.git] / SCClassLibrary / Common / Audio / BEQSuite.sc
blob94d86ec0c32a38d2e06933c1bff82862b76c9d57
1 BEQSuite : Filter {}
3 BLowPass : BEQSuite {
4         *ar { arg in, freq = 1200.0, rq = 1.0, mul = 1.0, add = 0.0;
5                 ^this.multiNew('audio', in, freq, rq).madd(mul, add);
6         }
8         *sc { arg dummy, freq = 1200.0, rq = 1.0;
9                 var w0, cos_w0, i, alpha, a0, a1, b0rz, b1, b2, sr;
10                 sr  = SampleRate.ir;
11                 w0 = pi * 2 * freq * SampleDur.ir;
12                 cos_w0 = w0.cos; i = 1 - cos_w0;
13                 alpha = w0.sin * 0.5 * rq;
14                 b0rz = (1 + alpha).reciprocal;
15                 a0 = i * 0.5 * b0rz;
16                 a1 = i * b0rz;
17                 b1 = cos_w0 * 2 * b0rz;
18                 b2 = (1 - alpha) * b0rz.neg;
19                 ^[a0, a1, a0, b1, b2];
20         }
23 BHiPass : BEQSuite {
24         *ar { arg in, freq = 1200.0, rq = 1.0, mul = 1.0, add = 0.0;
25                 ^this.multiNew('audio', in, freq, rq).madd(mul, add);
26         }
28         *sc { arg dummy, freq = 1200.0, rq = 1.0;
29                 var i, w0, cos_w0, alpha, a0, a1, b0rz, b1, b2, sr;
30                 sr  = SampleRate.ir;
31                 w0 =  pi * 2 * freq * SampleDur.ir;
32                 cos_w0 = w0.cos; i = 1 + cos_w0;
33                 alpha = w0.sin * 0.5 * rq;
34                 b0rz = (1 + alpha).reciprocal;
35                 a0 = i * 0.5 * b0rz;
36                 a1 = i.neg * b0rz;
37                 b1 = cos_w0 * 2 * b0rz;
38                 b2 = (1 - alpha) * b0rz.neg;
39                 ^[a0, a1, a0, b1, b2];
40         }
43 BAllPass : BEQSuite {
44         *ar { arg in, freq = 1200.0, rq = 1.0, mul = 1.0, add = 0.0;
45                 ^this.multiNew('audio', in, freq, rq).madd(mul, add);
46         }
48         *sc { arg dummy, freq = 1200.0, rq = 1.0;
49                 var w0, alpha, a0, b1, b0rz, sr;
50                 sr  = SampleRate.ir;
51                 w0 = pi * 2 * freq * SampleDur.ir;
52                 alpha = w0.sin * 0.5 * rq;
53                 b0rz = (1 + alpha).reciprocal;
54                 a0 = (1 - alpha) * b0rz;
55                 b1 = 2.0 * w0.cos * b0rz;
56                 ^[a0, b1.neg, 1.0, b1, a0.neg];
57         }
60 BBandPass : BEQSuite {
61         *ar {arg in, freq = 1200.0, bw = 1.0, mul = 1.0, add = 0.0;
62                 ^this.multiNew('audio', in, freq, bw).madd(mul, add);
63         }
65         *sc { arg dummy, freq = 1200.0, bw = 1.0;
66                 var w0, sin_w0, alpha, a0, b0rz, b1, b2, sr;
67                 sr  = SampleRate.ir;
68                 w0 = pi * 2 * freq * SampleDur.ir;
69                 sin_w0 = w0.sin;
70         //      alpha = w0.sin * 0.5 * rq;
71                 alpha = sin_w0 * sinh(0.34657359027997 * bw * w0 / sin_w0);
72                 b0rz = (1 + alpha).reciprocal;
73                 a0 = alpha * b0rz;
74                 b1 = w0.cos * 2 * b0rz;
75                 b2 = (1 - alpha) * b0rz.neg;
76                 ^[a0, 0.0, a0.neg, b1, b2];
77         }
80 BBandStop : BEQSuite {
81         *ar {arg in, freq = 1200.0, bw = 1.0, mul = 1.0, add = 0.0;
82                 ^this.multiNew('audio', in, freq, bw).madd(mul, add);
83         }
85         *sc { arg dummy, freq = 1200.0, bw = 1.0;
86                 var w0, sin_w0, alpha, b1, b2, b0rz, sr;
87                 sr  = SampleRate.ir;
88                 w0 = pi * 2 * freq * SampleDur.ir;
89                 sin_w0 = w0.sin;
90         //      alpha = w0.sin * 0.5 * rq;
91                 alpha = sin_w0 * sinh(0.34657359027997 * bw * w0 / sin_w0);
92                 b0rz = (1 + alpha).reciprocal;
93                 b1 = 2.0 * w0.cos * b0rz;
94                 b2 = (1 - alpha) * b0rz.neg;
95                 ^[b0rz, b1.neg, b0rz, b1, b2];
96         }
99 BPeakEQ : BEQSuite {
100         *ar {arg in, freq = 1200.0, rq = 1.0, db = 0.0, mul = 1.0, add = 0.0;
101                 ^this.multiNew('audio', in, freq, rq, db).madd(mul, add);
102         }
104         *sc { arg dummy, freq = 1200.0, rq = 1.0, db = 0.0;
105                 var a, w0, alpha, a0, a2, b1, b2, b0rz, sr;
106                 sr  = SampleRate.ir;
107                 a = pow(10, db/40);
108                 w0 = pi * 2 * freq * SampleDur.ir;
109                 alpha = w0.sin * 0.5 * rq;
110                 b0rz = (1 + (alpha / a)).reciprocal;
111                 a0 = (1 + (alpha * a)) * b0rz;
112                 a2 = (1 - (alpha * a)) * b0rz;
113                 b1 = 2.0 * w0.cos * b0rz;
114                 b2 = (1 - (alpha / a)) * b0rz.neg;
115                 ^[a0, b1.neg, a2, b1, b2];
116         }
119 BLowShelf : BEQSuite {
120         *ar {arg in, freq = 1200.0, rs = 1.0, db = 0.0, mul = 1.0, add = 0.0;
121                 ^this.multiNew('audio', in, freq, rs, db).madd(mul, add);
122         }
124         *sc { arg dummy, freq = 120.0, rs = 1.0, db = 0.0;
125                 var a, w0, sin_w0, cos_w0, alpha, i, j, k, a0, a1, a2, b0rz, b1, b2, sr;
126                 sr  = SampleRate.ir;
127                 a = pow(10, db/40);
128                 w0 = pi * 2 * freq * SampleDur.ir;
129                 cos_w0 = w0.cos;
130                 sin_w0 = w0.sin;
131                 alpha = sin_w0 * 0.5 * sqrt((a + a.reciprocal) * (rs - 1) + 2.0);
132                 i = (a+1) * cos_w0;
133                 j = (a-1) * cos_w0;
134                 k = 2 * sqrt(a) * alpha;
135                 b0rz = ((a+1) + j + k).reciprocal;
136                 a0 = a * ((a+1) - j + k) * b0rz;
137                 a1 = 2 * a * ((a-1) - i) * b0rz;
138                 a2 = a * ((a+1) - j - k) * b0rz;
139                 b1 = 2.0 * ((a-1) + i) * b0rz;
140                 b2 = ((a+1) + j - k) * b0rz.neg;
141                 ^[a0, a1, a2, b1, b2];
142         }
145 BHiShelf : BEQSuite {
146         *ar {arg in, freq = 1200.0, rs = 1.0, db = 0.0, mul = 1.0, add = 0.0;
147                 ^this.multiNew('audio', in, freq, rs, db).madd(mul, add);
148         }
150         *sc { arg dummy, freq = 120.0, rs = 1.0, db = 0.0;
151                 var a, w0, sin_w0, cos_w0, alpha, i, j, k, a0, a1, a2, b0rz, b1, b2, sr;
152                 sr  = SampleRate.ir;
153                 a = pow(10, db/40);
154                 w0 = pi * 2 * freq * SampleDur.ir;
155                 cos_w0 = w0.cos;
156                 sin_w0 = w0.sin;
157                 alpha = sin_w0 * 0.5 * sqrt((a + a.reciprocal) * (rs - 1) + 2.0);
158                 i = (a+1) * cos_w0;
159                 j = (a-1) * cos_w0;
160                 k = 2 * sqrt(a) * alpha;
161                 b0rz = ((a+1) - j + k).reciprocal;
162                 a0 = a * ((a+1) + j + k) * b0rz;
163                 a1 = -2.0 * a * ((a-1) + i) * b0rz;
164                 a2 = a * ((a+1) + j - k) * b0rz;
165                 b1 = -2.0 * ((a-1) - i) * b0rz;
166                 b2 = ((a+1) - j - k) * b0rz.neg;
167                 ^[a0, a1, a2, b1, b2];
168         }
171 // pseudo UGens
172 BLowPass4 {
173         *ar { arg in, freq = 1200.0, rq = 1.0, mul = 1.0, add = 0.0;
174                 var coefs;
175                 rq = sqrt(rq);
176                 coefs = BLowPass.sc(nil, freq, rq);
177                 ^SOS.ar(SOS.ar(in, *coefs), *coefs ++ [mul, add]);
178         }
181 BHiPass4 {
182         *ar { arg in, freq = 1200.0, rq = 1.0, mul = 1.0, add = 0.0;
183                 var coefs;
184                 rq = sqrt(rq);
185                 coefs = BHiPass.sc(nil, freq, rq);
186                 ^SOS.ar(SOS.ar(in, *coefs), *coefs ++ [mul, add]);
187         }