180 lines
5.2 KiB
Text
180 lines
5.2 KiB
Text
class:: FreqScopeView
|
|
summary:: Frequency analysis view
|
|
categories:: GUI>Views
|
|
related:: Classes/FreqScope
|
|
|
|
description::
|
|
FreqScopeView shows the frequency spectrum of a specified audio bus.
|
|
|
|
note::
|
|
|
|
The scope will remain active after a command-period. To turn it off you must use the 'active' method.
|
|
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:
|
|
code::
|
|
(
|
|
w = Window("My Analyzer", Rect(0, 0, 511, 300));
|
|
f = FreqScopeView(w, w.view.bounds);
|
|
w.onClose_({ f.kill }); // YOU MUST HAVE THIS
|
|
w.front;
|
|
)
|
|
::
|
|
|
|
::
|
|
|
|
classmethods::
|
|
|
|
private::initClass
|
|
|
|
method:: new
|
|
argument:: parent
|
|
The parent view.
|
|
argument:: bounds
|
|
An instance of link::Classes/Rect::, or a link::Classes/Point:: indicating code::width@height::.
|
|
argument:: server
|
|
The server to be shown in scope.
|
|
|
|
discussion::
|
|
Example:
|
|
code::
|
|
// Start server
|
|
s.boot;
|
|
|
|
// Create analyzer in a window
|
|
(
|
|
w = Window("My Analyzer", Rect(0, 0, 511, 300)); // width should be 511
|
|
f = FreqScopeView(w, w.view.bounds);
|
|
f.active_(true); // turn it on the first time;
|
|
|
|
w.onClose_({ f.kill }); // you must have this
|
|
w.front;
|
|
{ SinOsc.ar([500, 1000], 0, 0.25).mean.dup }.play(s); // start two sine waves
|
|
)
|
|
::
|
|
|
|
method:: response
|
|
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.
|
|
argument:: parent
|
|
The parent view.
|
|
argument:: bounds
|
|
An instance of link::Classes/Rect::, or a link::Classes/Point:: indicating code::width@height::.
|
|
argument:: bus1
|
|
The bus on which the "pre" signal is found.
|
|
argument:: bus2
|
|
The bus on which the "post" signal is found.
|
|
argument:: freqMode
|
|
Linear (0) or log(1) frequency mode. Defaults to 1.
|
|
discussion::
|
|
Example:
|
|
code::
|
|
s.boot
|
|
|
|
// basic usage. try these. Each one will open a new window
|
|
// move the mouse left and right to test response in different ranges
|
|
LPF.scopeResponse
|
|
HPF.scopeResponse
|
|
MoogFF.scopeResponse
|
|
BBandPass.scopeResponse
|
|
BLowShelf.scopeResponse // by default BLowShelf doesn't mangle much
|
|
Resonz.scopeResponse
|
|
BRF.scopeResponse
|
|
Integrator.scopeResponse
|
|
Median.scopeResponse // nonlinear, and therefore interesting
|
|
|
|
// customize the parameters for more informative scoping
|
|
{|in| MoogFF.ar(in, freq: MouseX.kr(10, 10000, 1),
|
|
gain:MouseY.kr(4, 0))}.scopeResponse
|
|
::
|
|
|
|
subsection:: Subclassing and Internal Methods
|
|
|
|
The following methods are usually not used directly or are called by a primitive. Programmers can still call or override these as needed.
|
|
|
|
instancemethods::
|
|
|
|
method:: kill
|
|
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.
|
|
|
|
method:: active
|
|
Turn the scope on or off.
|
|
argument:: bool
|
|
An instance of link::Classes/Boolean::.
|
|
|
|
method:: freqMode
|
|
argument:: mode
|
|
0 = linear, 1 = logarithmic.
|
|
|
|
method:: inBus
|
|
The bus to listen on.
|
|
argument:: num
|
|
An audio link::Classes/Bus:: number.
|
|
|
|
method:: dbRange
|
|
Get/set the amplitude range.
|
|
argument:: db
|
|
A link::Classes/Number::.
|
|
|
|
method:: special
|
|
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.
|
|
argument:: defname
|
|
Name of the link::Classes/SynthDef:: you wish to use.
|
|
argument:: extraArgs
|
|
Extra arguments that you may wish to pass to the synth.
|
|
|
|
subsection:: instance variables
|
|
method:: server
|
|
the server that is freqscoped
|
|
method:: synth
|
|
the synth running the freqscope analysis
|
|
method:: scope
|
|
the scopeview that shows the running analysis
|
|
method:: scopebuf
|
|
the buffer used by the scope
|
|
|
|
subsection:: Internal Methods
|
|
|
|
The following methods are usually not used directly or are called by a primitive. Programmers can still call or override these in subclasses as needed.
|
|
|
|
method:: initFreqScope
|
|
initialize and show on parent view
|
|
method:: doesNotUnderstand
|
|
redirects methods to scope view variable
|
|
|
|
method:: start
|
|
method:: allocBuffers
|
|
method:: freeBuffers
|
|
method:: bufSize
|
|
method:: doOnServerQuit
|
|
method:: doOnServerTree
|
|
method:: shmScopeAvailable
|
|
method:: specialSynthArgs
|
|
method:: specialSynthDef
|
|
|
|
examples::
|
|
|
|
code::
|
|
// Start server
|
|
s.boot;
|
|
|
|
// Create analyzer in a window
|
|
(
|
|
w = Window("My Analyzer", Rect(0, 0, 511, 300)); // width should be 511
|
|
f = FreqScopeView(w, w.view.bounds);
|
|
f.active_(true); // turn it on the first time;
|
|
|
|
w.onClose_({ f.kill }); // you must have this
|
|
w.front;
|
|
{ SinOsc.ar([500, 1000], 0, 0.25).mean.dup }.play(s); // start two sine waves
|
|
)
|
|
|
|
f.freqMode_(1); // change to log scale so we can see them
|
|
f.inBus_(1); // look at bus 1
|
|
f.dbRange_(200); // expand amplitude range
|
|
f.active_(false); // turn scope off (watch CPU)
|
|
f.active_(true); // turn it back on
|
|
|
|
// Now press command-period. The scope is still running.
|
|
|
|
{ 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
|
|
|
|
// Close window and scope is killed.
|
|
::
|