deprecate SCViewHolder-layRight
[supercollider.git] / SCClassLibrary / Common / Audio / Filter.sc
blobbf3d5792d72c5f3a4b6351e83b724a67fd3d3be4
1 Filter : UGen {
2         checkInputs { ^this.checkSameRateAsFirstInput }
5 Resonz : Filter {
7         *ar { arg in = 0.0, freq = 440.0, bwr = 1.0, mul = 1.0, add = 0.0;
8                 ^this.multiNew('audio', in, freq, bwr).madd(mul, add)
9         }
10         *kr { arg in = 0.0, freq = 440.0, bwr = 1.0, mul = 1.0, add = 0.0;
11                 ^this.multiNew('control', in, freq, bwr).madd(mul, add)
12         }
15 OnePole : Filter {
17         *ar { arg in = 0.0, coef = 0.5, mul = 1.0, add = 0.0;
18                 ^this.multiNew('audio', in, coef).madd(mul, add)
19         }
20         *kr { arg in = 0.0, coef = 0.5, mul = 1.0, add = 0.0;
21                 ^this.multiNew('control', in, coef).madd(mul, add)
22         }
25 OneZero : OnePole {}
27 TwoPole : Filter {
29         *ar { arg in = 0.0, freq = 440.0, radius = 0.8, mul = 1.0, add = 0.0;
30                 ^this.multiNew('audio', in, freq, radius).madd(mul, add)
31         }
32         *kr { arg in = 0.0, freq = 440.0, radius = 0.8, mul = 1.0, add = 0.0;
33                 ^this.multiNew('control', in, freq, radius).madd(mul, add)
34         }
37 TwoZero : TwoPole {}
38 APF : TwoPole {}
40 Integrator : Filter {
42         *ar { arg in = 0.0, coef = 1.0, mul = 1.0, add = 0.0;
43                 ^this.multiNew('audio', in, coef).madd(mul, add)
44         }
45         *kr { arg in = 0.0, coef = 1.0, mul = 1.0, add = 0.0;
46                 ^this.multiNew('control', in, coef).madd(mul, add)
47         }
50 Decay : Filter {
52         *ar { arg in = 0.0, decayTime = 1.0, mul = 1.0, add = 0.0;
53                 ^this.multiNew('audio', in, decayTime).madd(mul, add)
54         }
55         *kr { arg in = 0.0, decayTime = 1.0, mul = 1.0, add = 0.0;
56                 ^this.multiNew('control', in, decayTime).madd(mul, add)
57         }
60 Decay2 : Filter {
62         *ar { arg in = 0.0, attackTime = 0.01, decayTime = 1.0, mul = 1.0, add = 0.0;
63                 ^this.multiNew('audio', in, attackTime, decayTime).madd(mul, add)
64         }
65         *kr { arg in = 0.0, attackTime = 0.01, decayTime = 1.0, mul = 1.0, add = 0.0;
66                 ^this.multiNew('control', in, attackTime, decayTime).madd(mul, add)
67         }
70 Lag : Filter {
72         *ar { arg in = 0.0, lagTime = 0.1, mul = 1.0, add = 0.0;
73                 ^this.multiNew('audio', in, lagTime).madd(mul, add)
74         }
75         *kr { arg in = 0.0, lagTime = 0.1, mul = 1.0, add = 0.0;
76                 ^this.multiNew('control', in, lagTime).madd(mul, add)
77         }
80 Lag2 : Lag {}
81 Lag3 : Lag {}
82 Ramp : Lag {}
84 /// added by nescivi - 15 may 2007
85 LagUD : Filter {
87         *ar { arg in = 0.0, lagTimeU = 0.1, lagTimeD = 0.1,  mul = 1.0, add = 0.0;
88                 ^this.multiNew('audio', in, lagTimeU, lagTimeD).madd(mul, add)
89         }
90         *kr { arg in = 0.0, lagTimeU = 0.1, lagTimeD = 0.1, mul = 1.0, add = 0.0;
91                 ^this.multiNew('control', in, lagTimeU, lagTimeD).madd(mul, add)
92         }
95 Lag2UD : LagUD {}
96 Lag3UD : LagUD {}
98 VarLag : Filter {
99         *ar { arg in = 0.0, time = 0.1, curvature = 0, warp = 5, start, mul = 1.0, add = 0.0;
100                 ^this.multiNew('audio', in, time, curvature, warp, start).madd(mul, add);
101         }
102         *kr { arg in = 0.0, time = 0.1, curvature = 0, warp = 5, start, mul = 1.0, add = 0.0;
103                 ^this.multiNew('control', in, time, curvature, warp, start).madd(mul, add);
104         }
105         // FIXME: Implement 'curve' input on VLag ugen instead of using EnvGen.
106         // Then \exp warp should probably behave as Lag ugen.
107         *new1 { arg rate, in, time, curvature, warp, start;
108                 var e, curve, trig, sel = if(rate==\audio,\ar,\kr);
109                 start = start ? in;
110                 curve = Env.shapeNames[warp] ? warp;
111                 ^if(curve != 1) {
112                         e = Env([start, in], [time], warp).asArray;
113                         e[6] = curve;
114                         e[7] = curvature;
115                         trig = Changed.perform(sel, in) + Impulse.perform(sel, 0);
116                         if(time.rate != \scalar) { trig = trig + Changed.kr(time) };
117                         EnvGen.perform(sel, e, trig);
118                 } {
119                         ^super.new.rate_(rate).addToSynth.init(in, time, start);
120                 }
121         }
124 LeakDC : Filter {
126         *ar { arg in = 0.0, coef = 0.995, mul = 1.0, add = 0.0;
127                 ^this.multiNew('audio', in, coef).madd(mul, add)
128         }
129         *kr { arg in = 0.0, coef = 0.9, mul = 1.0, add = 0.0;
130                 ^this.multiNew('control', in, coef).madd(mul, add)
131         }
135 RLPF : Filter {
137         *ar { arg in = 0.0, freq = 440.0, rq = 1.0, mul = 1.0, add = 0.0;
138                 ^this.multiNew('audio', in, freq, rq).madd(mul, add)
139         }
140         *kr { arg in = 0.0, freq = 440.0, rq = 1.0, mul = 1.0, add = 0.0;
141                 ^this.multiNew('control', in, freq, rq).madd(mul, add)
142         }
145 RHPF : RLPF {}
148 LPF : Filter {
150         *ar { arg in = 0.0, freq = 440.0, mul = 1.0, add = 0.0;
151                 ^this.multiNew('audio', in, freq).madd(mul, add)
152         }
153         *kr { arg in = 0.0, freq = 440.0, mul = 1.0, add = 0.0;
154                 ^this.multiNew('control', in, freq).madd(mul, add)
155         }
158 HPF : LPF {}
160 BPF : Filter {
162         *ar { arg in = 0.0, freq = 440.0, rq = 1.0, mul = 1.0, add = 0.0;
163                 ^this.multiNew('audio', in, freq, rq).madd(mul, add)
164         }
165         *kr { arg in = 0.0, freq = 440.0, rq = 1.0, mul = 1.0, add = 0.0;
166                 ^this.multiNew('control', in, freq, rq).madd(mul, add)
167         }
170 BRF : BPF {}
172 MidEQ : Filter {
174         *ar { arg in = 0.0, freq = 440.0, rq = 1.0, db = 0.0, mul = 1.0, add = 0.0;
175                 ^this.multiNew('audio', in, freq, rq, db).madd(mul, add)
176         }
177         *kr { arg in = 0.0, freq = 440.0, rq = 1.0, db = 0.0, mul = 1.0, add = 0.0;
178                 ^this.multiNew('control', in, freq, rq, db).madd(mul, add)
179         }
182 LPZ1 : Filter {
184         *ar { arg in = 0.0, mul = 1.0, add = 0.0;
185                 ^this.multiNew('audio', in).madd(mul, add)
186         }
187         *kr { arg in = 0.0, mul = 1.0, add = 0.0;
188                 ^this.multiNew('control', in).madd(mul, add)
189         }
192 HPZ1 : LPZ1 {}
194 Slope : Filter {
196         *ar { arg in = 0.0, mul = 1.0, add = 0.0;
197                 ^this.multiNew('audio', in).madd(mul, add)
198         }
199         *kr { arg in = 0.0, mul = 1.0, add = 0.0;
200                 ^this.multiNew('control', in).madd(mul, add)
201         }
204 Changed : Filter {
205                 *kr { arg input, threshold = 0;
206                         ^HPZ1.kr(input).abs > threshold
207                 }
208                 *ar { arg input, threshold = 0;
209                         ^HPZ1.ar(input).abs > threshold
210                 }
213 LPZ2 : Filter {
215         *ar { arg in = 0.0, mul = 1.0, add = 0.0;
216                 ^this.multiNew('audio', in).madd(mul, add)
217         }
218         *kr { arg in = 0.0, mul = 1.0, add = 0.0;
219                 ^this.multiNew('control', in).madd(mul, add)
220         }
223 HPZ2 : LPZ2 {}
225 BPZ2 : LPZ2 {}
227 BRZ2 : LPZ2 {}
229 Median : Filter {
230         *ar { arg length=3, in = 0.0, mul = 1.0, add = 0.0;
231                 ^this.multiNew('audio', length, in).madd(mul, add)
232         }
233         *kr { arg length=3, in = 0.0, mul = 1.0, add = 0.0;
234                 ^this.multiNew('control', length, in).madd(mul, add)
235         }
236         checkInputs {
237                 if (rate == 'audio', {
238                         if (inputs.at(1).rate != 'audio', {
239                                 ^"input was not audio rate";
240                         });
241                 });
242                 ^this.checkValidInputs
243         }
247 //exception in GrafDef_Load: UGen 'AvgAbsAmp' not installed.
248 //AvgAbsAmp : Filter {
250 //      *ar { arg in = 0.0, coef = 0.999, mul = 1.0, add = 0.0;
251 //              ^this.multiNew('audio', in, coef).madd(mul, add)
252 //      }
253 //      *kr { arg in = 0.0, coef = 0.999, mul = 1.0, add = 0.0;
254 //              ^this.multiNew('control', in, coef).madd(mul, add)
255 //      }
258 Slew : Filter {
259         *ar { arg in = 0.0, up = 1.0, dn = 1.0, mul = 1.0, add = 0.0;
260                 ^this.multiNew('audio', in, up, dn).madd(mul, add)
261         }
262         *kr { arg in = 0.0, up = 1.0, dn = 1.0, mul = 1.0, add = 0.0;
263                 ^this.multiNew('control', in, up, dn).madd(mul, add)
264         }
267 // not installed
268 //RLPF4 : Filter {
270 //      *ar { arg in = 0.0, freq = 0.5, res = 0.5, mul = 1.0, add = 0.0;
271 //              ^this.multiNew('audio', in, freq, res).madd(mul, add)
272 //      }
275 FOS : Filter {
276         *ar { arg in = 0.0, a0 = 0.0, a1 = 0.0, b1 = 0.0, mul = 1.0, add = 0.0;
277                 ^this.multiNew('audio', in, a0, a1, b1).madd(mul, add)
278         }
279         *kr { arg in = 0.0, a0 = 0.0, a1 = 0.0, b1 = 0.0, mul = 1.0, add = 0.0;
280                 ^this.multiNew('control', in, a0, a1, b1).madd(mul, add)
281         }
284 SOS : Filter {
285         *ar { arg in = 0.0, a0 = 0.0, a1 = 0.0, a2 = 0.0, b1 = 0.0, b2 = 0.0, mul = 1.0, add = 0.0;
286                 ^this.multiNew('audio', in, a0, a1, a2, b1, b2).madd(mul, add)
287         }
288         *kr { arg in = 0.0, a0 = 0.0, a1 = 0.0, a2 = 0.0, b1 = 0.0, b2 = 0.0, mul = 1.0, add = 0.0;
289                 ^this.multiNew('control', in, a0, a1, a2, b1, b2).madd(mul, add)
290         }
294 Ringz : Filter {
296         *ar { arg in = 0.0, freq = 440.0, decaytime = 1.0, mul = 1.0, add = 0.0;
297                 ^this.multiNew('audio', in, freq, decaytime).madd(mul, add)
298         }
299         *kr { arg in = 0.0, freq = 440.0, decaytime = 1.0, mul = 1.0, add = 0.0;
300                 ^this.multiNew('control', in, freq, decaytime).madd(mul, add)
301         }
304 Formlet : Filter {
306         *ar { arg in = 0.0, freq = 440.0, attacktime = 1.0, decaytime = 1.0, mul = 1.0, add = 0.0;
307                 ^this.multiNew('audio', in, freq, attacktime, decaytime).madd(mul, add)
308         }
309         *kr { arg in = 0.0, freq = 440.0, attacktime = 1.0, decaytime = 1.0, mul = 1.0, add = 0.0;
310                 ^this.multiNew('control', in, freq, attacktime, decaytime).madd(mul, add)
311         }
314 // the doneAction arg lets you cause the EnvGen to stop or end the
315 // synth without having to use a PauseSelfWhenDone or FreeSelfWhenDone ugen.
316 // It is more efficient to use a doneAction.
317 // doneAction = 0   do nothing when the envelope has ended.
318 // doneAction = 1   pause the synth running, it is still resident.
319 // doneAction = 2   remove the synth and deallocate it.
320 // doneAction = 3   remove and deallocate both this synth and the preceeding node.
321 // doneAction = 4   remove and deallocate both this synth and the following node.
322 // doneAction = 5   remove and deallocate this synth and free all children in the preceeding group (if it is a group).
323 // doneAction = 6   remove and deallocate this synth and free all children in the following group (if it is a group).
325 DetectSilence : Filter {
327         *ar { arg in = 0.0, amp = 0.0001, time = 0.1, doneAction = 0;
328                 ^this.multiNew('audio', in, amp, time, doneAction)
329                 //              ^0.0            // DetectSilence has no output
330         }
331         *kr { arg in = 0.0, amp = 0.0001, time = 0.1, doneAction = 0;
332                 ^this.multiNew('control', in, amp, time, doneAction)
333                 //              ^0.0            // DetectSilence has no output
334         }
337 //exception in GrafDef_Load: UGen 'FlagNaN' not installed.
338 //FlagNaN : Filter {
340 //      *ar { arg in = 0.0;
341 //              ^this.multiNew('audio', in)
342 //      }
343 //      *kr { arg in = 0.0;
344 //              ^this.multiNew('control', in)
345 //      }