rsc3/doc-schelp/HelpSource/Classes/NdefGui.schelp

317 lines
8.2 KiB
Text

class:: NdefGui
summary:: a gui for a NodeProxy or Ndef
categories:: Libraries>JITLib>GUI, Live Coding
related:: Classes/JITGui, Classes/MonitorGui, Classes/NdefParamGui, Classes/NdefMixer, Classes/ProxyMixer
description::
NdefGui provides controls for handling and editing a link::Classes/NodeProxy:: or link::Classes/Ndef::, and its monitors. NdefGui replaces link::Classes/NodeProxyEditor::. It provides:
list::
## sliders for numerical settings
## mapping of kr proxies to parameters
## optional controls for playing / monitoring
::
Both link::Classes/NodeProxy:: and link::Classes/Ndef:: implement a strong::.gui:: message, which returns a NdefGui for that NodeProxy. Overview: link::Overviews/JITLib::.
code::
(
s.boot;
Ndef(\a, { |freq=300, dens=20, amp=0.1, pan|
Pan2.ar(Ringz.ar(Dust.ar(dens, amp / (dens.max(1).sqrt)), freq, 0.2), pan)
}).gui;
)
::
ClassMethods::
private::initClass
subsection::Creation
method::new
argument::object
the nodeproxy to be shown and edited, or nil.
argument::numItems
How many sliders or textviews for parameters to provide. Default value is 0.
argument::parent
a parent view where NdefGui is to be shown. If nil, a window is made.
argument::bounds
bounds where the view (or window) will be shown.
argument::makeSkip
a flag whether to create and start a link::Classes/SkipJack:: for auto-updating.
argument::options
an array of symbols for options of what to display. See list below.
subsection:: Preset options lists which can be used in *new:
method::big
two lines of controls for a big NdefGui, usually in its own window
method::full
two lines of controls for a very big NdefGui
method::audio
for ar proxies, used in ProxyMixer left hand side
method::audioSm
for ar proxies, used in ProxyMixer.small on left hand side
method::control
for kr proxies, used in ProxyMixer mid section
subsection::Class Variables
method::buttonSizes
a dict for the sizes of the different gui elements.
method::buttonFuncs
a lookup dict for making the different buttons.
method::makeButFuncs
not a class var, but the method that inits buttonFuncs.
InstanceMethods::
subsection::Variables
See link::Classes/JITGui:: for more instance methods.
Various views the NdefGui has if they were present in the options:
method::nameView, typeView, monitorGui, paramGui, fadeBox, pauseBut, sendBut, edBut, wakeBut
subsection::Basic Methods
method::edits
the paramGui's widgets (usually, EZSliders)
method::editKeys
the currently used param names
method::highlight, unhighlight
highlight and unhighlight a single slider by index
method::highlightName, unhighlightName
highlight and unhighlight the nameView
method::highlightParams
highlight a contiguous group of sliders;
used for showing assigned MIDI faderboxes etc.
method::addReplaceKey, removeReplaceKey
editKeys with technical names can be replaced with
more user-friendly ones.
method::proxy
an alias to method object, object_
subsection::Standard JITGui Methods
method:: setDefaults
method:: accepts
method:: getState, checkUpdate
subsection::GUI Element Creation
method:: makeViews
creates all the views given in the options list. Internally this calls the following methods:
method:: makeNameView, makeTypeView, makeClrBut, makeWakeBut, makeResetBut, makeScopeBut, makeDocBut, makeEndBut, makeFadeBox, makePauseBut, makeSendBut, makeEdBut, makeRipBut, makePollBut
method:: makeMonitor
Examples::
code::
// some preparation - make an ar and a kr nodeproxy.
s.boot;
(
Ndef(\lfo, { |lofreq| SinOsc.kr(lofreq) });
Ndef(\a, { |freq=300, dens=20, amp=0.1, pan|
Pan2.ar(Ringz.ar(Dust.ar(dens, amp / (dens.max(1).sqrt)), freq, 0.2), pan)
});
)
// make an NdefGui. By default, this has a lot of the options on.
n = NdefGui.new;
n.object_(Ndef(\lfo));
Ndef(\lfo).set(\lofreq, 12);
n.object_(Ndef(\a));
Ndef(\a).set(\freq, 120);
::
subsection::Some configuration options
code::
// some preparation - make an ar and a kr nodeproxy.
s.boot;
(
Ndef(\lfo, { |lofreq| SinOsc.kr(lofreq) });
Ndef(\a, { |freq=300, dens=20, amp=0.1, pan|
Pan2.ar(Ringz.ar(Dust.ar(dens, amp / (dens.max(1).sqrt)), freq, 0.2), pan)
});
)
// make an NdefGui. By default, this has a lot of the options on.
n = NdefGui.new;
n.object_(Ndef(\lfo));
Ndef(\lfo).set(\lofreq, 12);
n.object_(Ndef(\a));
Ndef(\a).set(\freq, 120);
::
subsection::Some configuration options
code::
// numItems - sliders for setting parameters
n = NdefGui(Ndef(\a), 8);
// 4 sets of configurations are provided:
n = NdefGui(Ndef(\a), 0, options: NdefGui.control);
n = NdefGui(Ndef(\a), 0, options: NdefGui.audio);
n = NdefGui(Ndef(\a), 0, options: NdefGui.big);
n = NdefGui(Ndef(\a), 0, options: NdefGui.full);
NdefGui.control; // used for control proxies in ProxyMixer/NdefMixer
-> [ \name, \pausR, \sendR, \poll, \ed ]
NdefGui.audio; // used for audio proxies in ProxyMixer/NdefMixer
-> [ \monitor, \playN, \name, \pausR, \sendR, \ed ]
NdefGui.big; // used for the big NdefGui in ProxyMixer/NdefMixer
-> [ \name, \type, \CLR, \reset, \scope, \doc, \end, \fade,
\monitor, \playN, \pausR, \sendR, \poll ]
// all of 'em
NdefGui.full;
-> [ name, \type, \CLR, \reset, \scope, \doc, \end, \fade, \rip,
monitor, \playN, \pausR, \sendR, \poll, \ed ]
/*
// the choice of elements is:
\name a dragboth for the proxy's name
\type a view for the proxy's type (ir, ar + numChans, kr + numChans)
\CLR button to clear proxy
\reset button to reset proxy nodemap
\scope button to scope proxy
\doc button to document proxy as code
\end button to end proxy
\fade EZNumber for setting proxy fadetime
\monitor MonitorGui for audio proxies
\playN a button for editing playN settings (within the MonitorGui)
\rip (^) button to open a new editor on the proxy (used in ProxyMixer/NdefMixer)
\pausR a button to toggle proxy pause/resume
\sendR a button to re-send; alt-click tells the proxy to rebuild
\poll poll the proxy
* preset storage in JITLibExtensions, see ProxyPreset / NdefPreset
*/
// add your own functions to add your own elements, such as:
NdefGui.buttonSizes.put(\zoink, 60);
NdefGui.buttonFuncs.put(\zoink, { |ndgui| Button(ndgui.zone, 60@20).states_([["zoink"]]).action_({ ndgui.object.zoink }) });
n = NdefGui(Ndef(\a), 4, options: NdefGui.big ++ [\zoink]);
// make one and watch how the elements change
n = NdefGui(Ndef(\a), 4, options: NdefGui.big);
Ndef(\a).stop;
Ndef(\a).play;
Ndef(\a).vol_(0.3);
Ndef(\a).stop;
Ndef(\a).playN([2, 5]); // does not display fully on outNumberBox
Ndef(\a).playN([2, 5], vol: 0.34);
// as in ProxyMixer, left side
n = NdefGui(Ndef(\a), options: NdefGui.audio);
// as in ProxyMixer control zone
n = NdefGui(Ndef(\a), 4, options: NdefGui.control);
// NdefGui default
n = NdefGui(options: NdefGui.big);
// and a few more
n = NdefGui(bounds: 400@20, options: NdefGui.full);
// put in a window - then no margin is added
(
w = Window().front;
w.addFlowLayout;
n = NdefGui(Ndef(\a), 4, w, options: NdefGui.big);
)
Ndef(\a, { |freq = 10| Blip.ar(freq) }).set(\freq, 200)
Ndef(\a, { |freq = 10, amp = 0.1| Blip.ar(freq) * amp })
Ndef(\a).set(\freq, 220)
Ndef(\a).set(\harm, 20)
Ndef(\a, { |freq = 10, amp = 0.1, harm = 20| Blip.ar(freq, harm) * amp })
::
subsection::Test - drag and drop proxies between NdefGuis
This seems broken in 3.7.0 - drags are sticky and can't be dropped.
code::
(
p = ProxySpace.push(s.boot);
l = NdefGui(nil, 3).moveTo(10, 120);
m = NdefGui(nil, 3).moveTo(10, 240);
n = NdefGui(nil, 3).moveTo(10, 360);
o = NdefGui(nil, 3).moveTo(10, 480);
Spec.add(\dens, [0.1, 300, \exp]);
// make 3 kinds of proxies: using tilde/proxyspace, Ndef, and unnamed.
~spacy = {|dens=5| Formlet.ar(Dust.ar(dens ! 2), LFDNoise0.kr(20 ! 2).lag(0.1).linexp(-1, 1, 300, 5000), 0.003, 0.03) };
Ndef(\ndeffy, { GrayNoise.ar( 0.1 ! 2) });
c = NodeProxy.audio.source_({ PinkNoise.ar(0.1 ! 2) });
// put one in each editor
l.object_(~spacy);
m.object_(Ndef(\ndeffy));
n.object_(c);
)
// One should also be able to drag and drop text into the drag,
// but this is also not working yet.
( Ndef(\a) )
::
subsection::Test - replacing keys
This is used in ProxyChain (JITLibExtensions).
code::
(
Ndef(\a, { |freq=300, dens=20, amp=0.1, pan|
Pan2.ar(Ringz.ar(Dust.ar(dens, amp / (dens.max(1).sqrt)), freq, 0.2), pan)
});
n = NdefGui(Ndef(\a));
)
n.addReplaceKey(\freq, \myFreak);
// ATM needs an extra update:
x = n.object; n.object_(nil); n.object_(x);
::