sclang: ServerShmInterface - try to avoid multiple destructor calls
[supercollider.git] / HelpSource / Classes / FreqScopeView.schelp
blob664086df470f6487fe228972a4fc074ce388248e
1 class:: FreqScopeView
2 redirect:: implClass
3 summary:: Frequency analysis view
4 categories:: GUI
5 related:: Classes/SCFreqScopeWindow, Classes/SCScope
7 description::
8 FreqScopeView shows the frequency spectrum of a specified audio bus.
10 subsection:: A Very Important Issue Regarding FreqScope:
12 The scope will remain active after a command-period. To turn it off you must use the 'active' method.
13 Very important: You must run code::kill():: when the parent window is closed to avoid problems. It also frees the buffers that the scope allocated and stops the FFT analysis synth. So:
14 code::
16 w = Window("My Analyzer", Rect(0, 0, 511, 300));
17 f = FreqScopeView(w, w.view.bounds);
18 w.onClose_({ f.kill }); // YOU MUST HAVE THIS
19 w.front;
24 classmethods::
26 method:: new
27 argument:: parent
28 The parent view.
29 argument:: bounds
30 An instance of link::Classes/Rect::, or a link::Classes/Point:: indicating code::width@height::.
31 discussion::
32 Example:
33 code::
34 // Start internal server
35 s = Server.internal.boot;
37 // Create analyzer in a window
39 w = Window("My Analyzer", Rect(0, 0, 511, 300)); // width should be 511
40 f = FreqScopeView(w, w.view.bounds);
41 f.active_(true); // turn it on the first time;
43 w.onClose_({ f.kill }); // you must have this
44 w.front;
45 { SinOsc.ar([500, 1000], 0, 0.25).mean.dup }.play(s); // start two sine waves
49 method:: response
50 Create a scope in a special frequency-response mode. This uses FFT-based spectral division to estimate the frequency response of some effect, on the assumption that the signal to bus1 is transformed to the signal at bus2 by some linear time-invariant process.
51 argument:: parent
52 The parent view.
53 argument:: bounds
54 An instance of link::Classes/Rect::, or a link::Classes/Point:: indicating code::width@height::.
55 argument:: bus1
56 The bus on which the "pre" signal is found.
57 argument:: bus2
58 The bus on which the "post" signal is found.
59 argument:: freqMode
60 Linear (0) or log(1) frequency mode. Defaults to 1.
61 discussion::
62 Example:
63 code::
64 Server.default = s = Stethoscope.defaultServer.boot;
66 // basic usage. try these. Each one will open a new window
67 // move the mouse left and right to test response in different ranges
68 LPF.scopeResponse
69 HPF.scopeResponse
70 MoogFF.scopeResponse
71 BBandPass.scopeResponse
72 BLowShelf.scopeResponse // by default BLowShelf doesn't mangle much
73 Resonz.scopeResponse
74 BRF.scopeResponse
75 Integrator.scopeResponse
76 Median.scopeResponse // nonlinear, and therefore interesting
78 // customize the parameters for more informative scoping
79 {|in| MoogFF.ar(in, freq: MouseX.kr(10, 10000, 1),
80 gain:MouseY.kr(4, 0))}.scopeResponse
83 subsection:: Subclassing and Internal Methods
85 The following methods are usually not used directly or are called by a primitive. Programmers can still call or override these as needed.
87 method:: viewClass
88 Returns link::Classes/SCScope::. See also Subclassing and Internal Methods in link::Classes/SCView::.
89 warning::Cocoa specific::
91 method:: initClass
92 Sets the classvar, code::server = Server.internal::.
94 method:: server
95 A classvar. Must be code::Server.internal::.
97 instancemethods::
99 method:: kill
100 Very important. This must be run when the parent window is closed to avoid problems. It also frees the buffers that the scope allocated and stops the FFT analysis synth.
102 method:: active
103 Turn the scope on or off.
104 argument:: bool
105 An instance of link::Classes/Boolean::.
107 method:: freqMode
108 argument:: mode
109 0 = linear, 1 = logarithmic.
111 method:: inBus
112 The bus to listen on.
113 argument:: num
114 An audio link::Classes/Bus:: number.
116 method:: dbRange
117 Get/set the amplitude range.
118 argument:: db
119 A link::Classes/Number::.
121 method:: special
122 Put the scope into a special mode using a user-specified link::Classes/SynthDef::. Note that only very particular SynthDefs should be used, namely ones that are derived from the code::\freqScope0:: or code::\freqScope1:: SynthDefs. Most users will not need to use this method directly, but it can be used to provide a customised analysis shown in the scope.
123 argument:: defname
124 Name of the link::Classes/SynthDef:: you wish to use.
125 argument:: extraArgs
126 Extra arguments that you may wish to pass to the synth.
129 subsection:: Subclassing and Internal Methods
131 The following methods are usually not used directly or are called by a primitive. Programmers can still call or override these as needed.
133 method:: start
135 method:: eventSeq
136 argument:: delta
137 argument:: funcs
139 method:: cmdPeriod
141 method:: initFreqScope
143 method:: sendSynthDefs
145 method:: allocBuffers
147 method:: freeBuffers
149 method:: node
151 method:: scopebuf
153 method:: fftbuf
155 method:: bufSize
157 examples::
159 code::
160 // Start internal server
161 s = Server.internal.boot;
164 // Create analyzer in a window
166 w = Window("My Analyzer", Rect(0, 0, 511, 300)); // width should be 511
167 f = FreqScopeView(w, w.view.bounds);
168 f.active_(true); // turn it on the first time;
170 w.onClose_({ f.kill }); // you must have this
171 w.front;
172 { SinOsc.ar([500, 1000], 0, 0.25).mean.dup }.play(s); // start two sine waves
175 f.freqMode_(1); // change to log scale so we can see them
176 f.inBus_(1); // look at bus 1
177 f.dbRange_(200); // expand amplitude range
178 f.active_(false); // turn scope off (watch CPU)
179 f.active_(true); // turn it back on
181 // Now press command-period. The scope is still running.
183 { Mix.ar(SinOsc.ar([500, 1200, 3000, 9000, 12000], 0, [0.2, 0.1, 0.05, 0.03, 0.01])) }.play(s); // restart some sines
185 // Close window and scope is killed.