Merge pull request #506 from andrewcsmith/patch-2
[supercollider.git] / HelpSource / Classes / Compander.schelp
blob3da76d74768238605698ace5136586d07abcd94b
1 class:: Compander
2 summary:: Compressor, expander, limiter, gate, ducker
3 categories:: UGens>Dynamics
5 description::
6 General purpose (hard-knee) dynamics processor.
8 classmethods::
9 method:: ar
10 argument::in
11 The signal to be compressed / expanded / gated.
13 argument::control
14 The signal whose amplitude determines the gain applied to the input signal. Often the same as in (for standard gating or compression) but should be different for ducking.
16 argument::thresh
17 Control signal amplitude threshold, which determines the break point between slopeBelow and slopeAbove. Usually 0..1. The control signal amplitude is calculated using RMS.
19 argument::slopeBelow
20 Slope of the amplitude curve below the threshold. If this slope > 1.0, the amplitude will drop off more quickly the softer the control signal gets; when the control signal is close to 0 amplitude, the output should be exactly zero -- hence, noise gating. Values < 1.0 are possible, but it means that a very low-level control signal will cause the input signal to be amplified, which would raise the noise floor.
22 argument::slopeAbove
23 Same thing, but above the threshold. Values < 1.0 achieve compression (louder signals are attenuated); > 1.0, you get expansion (louder signals are made even louder). For 3:1 compression, you would use a value of 1/3 here.
25 argument::clampTime
26 The amount of time it takes for the amplitude adjustment to kick in fully. This is usually pretty small, not much more than 10 milliseconds (the default value). I often set it as low as 2 milliseconds (0.002).
28 argument::relaxTime
29 The amount of time for the amplitude adjustment to be released. Usually a bit longer than clampTime; if both times are too short, you can get some (possibly unwanted) artifacts.
31 argument::mul
33 argument::add
35 discussion::
36 If any of this is confusing, see http://en.wikipedia.org/wiki/Audio_level_compression
38 examples::
40 code::
42 // example signal to process
43 play({
44     var z;
45     z = Decay2.ar(
46         Impulse.ar(8, 0,LFSaw.kr(0.3, 0, -0.3, 0.3)),
47         0.001, 0.3, Mix.ar(Pulse.ar([80,81], 0.3)))
52 code::
54 // noise gate
55 play({
56     var z;
57     z = Decay2.ar(
58         Impulse.ar(8, 0,LFSaw.kr(0.3, 0, -0.3, 0.3)),
59         0.001, 0.3, Mix.ar(Pulse.ar([80,81], 0.3)));
60     Compander.ar(z, z,
61         thresh: MouseX.kr(0.1, 1),
62         slopeBelow: 10,
63         slopeAbove: 1,
64         clampTime: 0.01,
65         relaxTime: 0.01
66     );
71 code::
73 // compressor
74 play({
75     var z;
76     z = Decay2.ar(
77         Impulse.ar(8, 0,LFSaw.kr(0.3, 0, -0.3, 0.3)),
78         0.001, 0.3, Mix.ar(Pulse.ar([80,81], 0.3)));
79     Compander.ar(z, z,
80         thresh: MouseX.kr(0.1, 1),
81         slopeBelow: 1,
82         slopeAbove: 0.5,
83         clampTime: 0.01,
84         relaxTime: 0.01
85     );
90 code::
92 // limiter
93 play({
94     var z;
95     z = Decay2.ar(
96         Impulse.ar(8, 0,LFSaw.kr(0.3, 0, -0.3, 0.3)),
97         0.001, 0.3, Mix.ar(Pulse.ar([80,81], 0.3)));
98     Compander.ar(z, z,
99         thresh: MouseX.kr(0.1, 1),
100         slopeBelow: 1,
101         slopeAbove: 0.1,
102         clampTime: 0.01,
103         relaxTime: 0.01
104     );
109 code::
111 // sustainer
112 play({
113     var z;
114     z = Decay2.ar(
115         Impulse.ar(8, 0,LFSaw.kr(0.3, 0, -0.3, 0.3)),
116         0.001, 0.3, Mix.ar(Pulse.ar([80,81], 0.3)));
117     Compander.ar(z, z,
118         thresh: MouseX.kr(0.1, 1),
119         slopeBelow: 0.1,
120         slopeAbove: 1,
121         clampTime: 0.01,
122         relaxTime: 0.01
123     )*0.1;