linux: shared memory interface - link with librt
[supercollider.git] / HelpSource / Classes / AmpCompA.schelp
blob3e8243003fe5dde0ba67ada470236a6a600d2b5c
1 class:: AmpCompA
2 summary:: Basic psychoacoustic amplitude compensation (ANSI A-weighting curve).
3 related:: Classes/AmpComp
4 categories::  UGens>Analysis>Amplitude
7 Description::
9 Higher frequencies are normally perceived as louder, which AmpCompA
10 compensates. Following the measurings by Fletcher and Munson, the
11 ANSI standard describes a function for loudness vs. frequency.
13 Note that this curve is only valid for standardized amplitude.
14 footnote::
15 Function freq → dB,
16 derived from http://www.beis.de/Elektronik/AudioMeasure/WeightingFilters.html
17 and modified to map freq → amp.
18 code::
20 var k =  3.5041384e16;
21 var c1 = 424.31867740601;
22 var c2 = 11589.093052022;
23 var c3 = 544440.67046057;
24 var c4 = 148698928.24309;
25 f = {|f|
26 var r = squared(f);
27 var m1 = pow(r,4);
28 var n1 = squared(c1 + r);
29 var n2 = c2 + r;
30 var n3 = c3 + r;
31 var n4 = squared(c4 + r);
32 var level = k * m1 / (n1 * n2 * n3 * n4);
33 sqrt(level)
41 For a simpler but more flexible curve, see  link::Classes/AmpComp::
43 classmethods::
45 method::ar, kr, ir
47 argument::freq
48 Input frequency value. For freq == root, the output is rootAmp.
50 argument::root
51 Root freq relative to which the curve is calculated (usually lowest freq).
53 argument::minAmp
54 Amplitude at the minimum point of the curve (around 2512 Hz).
56 argument::rootAmp
57 Amplitude at the root frequency.
59 discussion::
60 Apart from code::freq::, the values are not modulatable
62 Examples::
64 code::
66 // compare a sine without compensation
68 { SinOsc.ar(MouseX.kr(300, 15000, 1)) * 0.1 }.play;
70 // with one that uses amplitude compensation
73         var freq;
74         freq = MouseX.kr(300, 15000, 1);
75         SinOsc.ar(freq) * 0.3 * AmpCompA.kr(freq)
76 }.play;
80 // adjust the minimum and root amp
81 // (in this way one can flatten out the curve for higher amplitudes)
85         var freq;
86         freq = MouseX.kr(300, 18000, 1);
87         Formant.ar(300, freq, 20, 0.1) * AmpCompA.kr(freq, 300, 0.6, 0.3)
88 }.play;
91 // the curve:
93 { AmpCompA.ar(Line.ar(48, 120, 1).midicps, 48.midicps) }.plot(1.0);
95 // freqs:
97 { AmpCompA.ar(Line.ar(0, 20000, 1)) }.plot(1.0);
99 // compare with AmpComp (exponential decay)
101 { AmpComp.ar(Line.ar(48, 120, 1).midicps, 48.midicps) }.plot(1.0);
103 // freqs:
105 { AmpComp.ar(Line.ar(40, 20000, 1), 40) }.plot(1.0);
109 // amplitude compensation in frequency modulation (using Fletscher-Munson curve)
112         var freq;
113         freq = MouseX.kr(300, 15000, 1);
114         freq = freq * SinOsc.ar(MouseY.kr(3, 200, 1), 0, 0.5, 1);
115         SinOsc.ar(freq) * 0.1 * AmpCompA.ar(freq, 300)
116 }.play;
119 // amplitude compensation in frequency modulation (using AmpComp exponential decay)
122         var freq;
123         freq = MouseX.kr(300, 15000, 1);
124         freq = freq * SinOsc.ar(MouseY.kr(3, 200, 1), 0, 0.5, 1);
125         SinOsc.ar(freq) * 0.1 * AmpComp.ar(freq, 300)
126 }.play;
130 // without amplitude compensation
133         var freq;
134         freq = MouseX.kr(300, 15000, 1);
135         freq = freq * SinOsc.ar(MouseY.kr(3, 200, 1), 0, 0.5, 1);
136         SinOsc.ar(freq) * 0.1
137 }.play;
144 [1] Function freq -> dB,
145         derived from http://www.beis.de/Elektronik/AudioMeasure/WeightingFilters.html
146         and modified to map freq -> amp
149 var k =  3.5041384e16;
150 var c1 = 424.31867740601;
151 var c2 = 11589.093052022;
152 var c3 = 544440.67046057;
153 var c4 = 148698928.24309;
154 f = {|f|
155   var r = squared(f);
156   var m1 = pow(r,4);
157   var n1 = squared(c1 + r);
158   var n2 = c2 + r;
159   var n3 = c3 + r;
160   var n4 = squared(c4 + r);
161   var level = k * m1 / (n1 * n2 * n3 * n4);
162   sqrt(level)
163  };