NdefGui a gui for a NodeProxy or Ndef
Inherits from: JITGui
NdefGui provides controls for handling and editing a NodeProxy or Ndef,
and its monitors. NdefGui replaces NodeProxyEditor.
It provides:
• sliders for numerical settings
• mapping of kr proxies to parameters
• optional controls for playing / monitoring
NodeProxy and Ndef implement a .gui message,
which returns a NdefGui for that NodeProxy.
Overview: JITLib
See also: MonitorGui, NdefParamGui, NdefMixer, ProxyMixer
Creation / Class Methods
*new (object, numItems, parent, bounds, makeSkip, options)
object - the nodeproxy to be shown and edited, or nil.
numItems - How many sliders or textviews for paramaters to provide. Default value is 0.
parent - a parent view where NdefGui is to be shown. If nil, a window is made.
bounds - bounds where the view (or window) will be shown.
makeSkip - a flag whether to create and start a SkipJack for auto-updating.
options - an array of symbols for options of what to display. See list below.
// 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));
n.object_(Ndef(\a));
Ndef(\a).set(\lofreq, 12);
Some configuration options
// 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 PxMix
-> [ \name, \pausR, \sendR, \poll, \ed ]
NdefGui.audio; // used for audio proxies in PxMix
-> [ \monitor, \playN, \name, \pausR, \sendR, \ed ]
NdefGui.big; // used for the big NdefGui in PxMix
-> [ \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 PxMix)
\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
// Planned options - not done yet:
\morph add a PxPreset / morph control
// pass in functions to add your own elements, such as:
\zoink -> { |ndgui| Button(ndgui.zone, 60@20).states_([["zoink"]]).action_({ ndgui.object.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]);
Ndef(\a).playN([2, 5], vol: 0.34);
// as in ProxyMixer, left side
n = NdefGui(Ndef(\a), options: NdefGui.audio);
n = NdefGui(Ndef(\a), 4, options: NdefGui.control); // control zone
n = NdefGui(options: NdefGui.big);
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 })
// Works with ProxySpace as well:
p = ProxySpace.push;
n = NdefGui(~test, 4);
~test.ar;
~test.play;
// too many controls: an EZScroller helps.
(
~test = { |freq=300, dens=20, amp=0.1, pan, ping=12, tok=13, crak|
Pan2.ar(Ringz.ar(Dust.ar(dens, amp / (dens.max(1).sqrt)), freq, 0.2), pan)
};
// gets specs for slider ranges from global lookup in Spec.specs:
Spec.add(\dens, [0.1, 100, \exp, 0.01, 10]);
)
( // keys go away if not needed
~test = { |freq=300, dens=20, amp=0.1|
Pan2.ar(Ringz.ar(Dust.ar(dens, amp / (dens.max(1).sqrt)), freq, 0.2))
};
)
( // and are added in order if needed
~test = { |freq=300, intv=0, dens=20, amp=0.1, pan, pok, ting|
Pan2.ar(
Ringz.ar(
Dust.ar(dens ! 2, amp / (dens.max(1).sqrt)),
freq * [intv, intv.neg].midiratio, 0.2))
};
)
// changes in settings are shown:
~test.set(\freq, exprand(100.0, 2000.0));
~test.playN([0, 2]);
// mapping kr proxies to controls is shown
~lfo = { LFNoise0.kr(8, 4) };
~test.map(\intv, ~lfo);
~test.unmap(\intv);
Spec.add(\intv, ControlSpec(0, 24, \lin, 0.01, 0));
// setting a param value unmaps a previous control source
~test.set(\freq, rrand(200, 500), \intv, rrand(-5.5, 5.5));
// You can drag and drop proxies between NodeProxyEditors:
(
// 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 can also drag and drop text into the drag:
( Ndef(\a) )
Class Variables
buttonSizes a dict for the sizes of the different gui elements.
Instance Variables
As in all JITGuis:
... object, numItems, parent, bounds ...
... zone, minSize, defPos, skin, font, skipjack ...
Views if they were present in the options:
nameView
typeView
monitorGui
paramGui
fadeBox
pauseBut
sendBut
edBut
// test replacing keys - needed for ProxyChain.
(
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);