1ZLPF {
2	*ar { arg in, fc=440, damping=0.707, mul=1, add=0;
3
4		var b0, b1, b2, a0, a1, a2;
5		var c, cc, twodC;
6		var out;
7
8		out = in;
9
10		damping.asArray.do({ arg df;
11
12			c = (pi * fc/SampleRate.ir).tan.reciprocal;
13			cc = c.squared;
14			twodC = 2 * df * c;
15
16			b0 = (1 + twodC + cc).reciprocal;
17			b1 = 2 * b0;
18			b2 = b0;
19
20			a0 = 1;
21			a1 = 2 * b0 * (1 - cc);
22			a2 = b0 * (1 - twodC + cc);
23
24			out = SOS.ar( out, b0/a0, b1/a0, b2/a0, a1/a0.neg, a2/a0.neg, mul, add )
25		});
26		^out
27	}
28}
29
30
31ZHPF {
32	*ar { arg in, fc=440, damping=0.707, mul=1, add=0;
33
34		var b0, b1, b2, a0, a1, a2;
35		var c, cc, twodC;
36		var out;
37
38		out = in;
39
40		damping.asArray.do({ arg df;
41
42			c = (pi * fc/SampleRate.ir).tan;
43			cc = c.squared;
44			twodC = 2 * df * c;
45
46			b0 = (1 + twodC + cc).reciprocal;
47			b1 = -2 * b0;
48			b2 = b0;
49
50			a0 = 1;
51			a1 = 2 * b0 * (cc - 1);
52			a2 = b0 * (1 - twodC + cc);
53
54			out = SOS.ar( out, b0/a0, b1/a0, b2/a0, a1/a0.neg, a2/a0.neg, mul, add )
55		});
56		^out
57	}
58}
59
60
61BLPF {
62	*ar { arg in, order=4, freq=440, mul=1, add=0;
63		var df, out;
64		order = order.asInteger;
65		df = Dictionary[
66			2->2.sqrt.reciprocal,
67			4->[0.924, 0.383],
68			6->[0.966, 0.707, 0.259],
69			8->[0.981, 0.831, 0.556, 0.195],
70			10->[0.988, 0.891, 0.707, 0.454, 0.156]
71		].at(order);
72		df.isNil.if({^(this.asString+"invalid order:" +order).error});
73		out = (df.asArray.at(0) > 0).if({ZLPF.ar( in, freq, df)},{in});
74		^out * mul + add
75
76	}
77}
78
79BHPF {
80	*ar { arg in, order=4, freq=440, mul=1, add=0;
81		var df, out;
82		order = order.asInteger;
83		df = Dictionary[
84			2->2.sqrt.reciprocal,
85			4->[0.924, 0.383],
86			6->[0.966, 0.707, 0.259],
87			8->[0.981, 0.831, 0.556, 0.195],
88			10->[0.988, 0.891, 0.707, 0.454, 0.156]
89		].at(order);
90		df.isNil.if({^(this.asString+"invalid order:" +order).error});
91		out = (df.asArray.at(0) > 0).if({ZHPF.ar( in, freq, df)},{in});
92		^out * mul + add
93
94	}
95}
96
97
98LRLPF {
99	*ar { arg in, order=4, freq=440, mul=1, add=0;
100		var df, out;
101		out = in;
102		2.do({out = BLPF.ar( out, order/2, freq)})
103		^out * mul + add
104	}
105}
106
107
108LRHPF {
109	*ar { arg in, order=4, freq=440, mul=1, add=0;
110		var df, out;
111		out = in;
112		2.do({out = BHPF.ar( out, order/2, freq)});
113		^out * mul + add
114
115	}
116}