class:: ProxyMixerOld
summary:: mix control for a proxyspace
categories:: JITLib>GUI
related:: Classes/ProxySpace, Classes/NodeProxyEditor

description::

warning::
ProxyMixer has been updated - some little adaptations to existing uses may be needed. If you like, you can also replace "ProxyMixer" with "ProxyMixerOld" to keep using the old style of ProxyMixer.
::

ProxyMixer provides controls for handling and editing the node proxies in a proxyspace and their monitors (cross-platform graphics).

Overview: link::Overviews/JITLib::

ClassMethods::

private::initClass

subsection::Creation

method::new

argument::proxyspace
a link::Classes/ProxySpace::

argument::nProxies
the maximum number of proxies you plan to use

argument::title
window title

argument::where
window bounds

Examples::

code::
p = ProxySpace.push(s.boot, \p);
m = ProxyMixer(p, 8, \p, Rect(20, 500, 0,0));

m = ProxyMixer(p, 8)

	// the top left menu sets which proxies will be shown.

		// existingProxies: even an empty proxy is shown
~test.ar;

(		// activeProxies: proxy appears when it is alive
~test = { |freq=250, intv=19, timescale=1, curve=0, loopnode=0|
	var env = EnvGen.kr(
		Env({ 1.0.rand2 }!11, {1.0.rand}!10, curve, releaseNode: 9, loopNode: loopnode),
		timeScale: timescale);
	var pitch = (env * [1, 0.33, -1] * intv).midiratio * freq;
	Splay.ar(Formant.ar(pitch, pitch.scramble * 2, pitch.scramble)) * 0.1;
};
)
~test.lag(\freq, 4);

		// playingProxies : only those that really play are shown.
~test.playN(vol: 1);

// switch back to active proxies...

		// the reduce button removes all proxies that are not playing
		// and that are not used as sources in other proxies:
~otto = { |dens=12| Dust.ar(dens) };

~otto.clear;		// remove it
p.reduce;

		// doc and docc post the current proxyspace as code
p.document;

		// openEdit opens the editor zone, see below;
m.openEditZone(1);

		// R opens a Record utility, see below.

	// the line of controls for one proxy and its monitor is
	// a ProxyMonitorGui, so for full details see ProxyMonitorGui.help.

	// it displays current volume,
~test.vol_(0.05);
~test.vol_(0.1);

	// proxy name; play/stop/end control:
~test.playN;		// playN as is
~test.stop;		// stop
~test.end;		// option-click on stop : end the monitor and the proxy itself.
~test.playN(vol: 0);	// option-click on play : start playing with volume zero.

~test.vol_(0.1);

s.scope(8);
~test.playN(4);	// set proxy's first output channel:
~test.playN(0);

	// the "-=" / "-<" button supports multichannel monitoring,
	// see ProxyMonitorGui.help

	//	paus/rsum toggles pause and resume:
~test.pause;
~test.resume;

	// send button resends the proxy,
	// option-click on send rebuilds the proxy
	// (e.g. for lookup in client-site state)
~test.send;
~test.send;
~test.send;
~test.rebuild;
~test.rebuild;
~test.rebuild;


	// the ed button sends this proxy to the editor - see below

		// kr proxies show up in the middle
~lfo = { SinOsc.kr(2) };
~lfnoyz0 = { |lofreq, mul=1, add| LFDNoise0.kr(lofreq, mul, add) };

		// the editor zone is a NodeProxyEditor
		// open it and set some params
m.openEditZone(1);
m.editor.proxy_(~test);
~test.set(\freq, exprand(80, 1250));	// set ~tests parameters
~test.set(\intv, 1.0.linrand);

	//	if you declare global specs for the range of a parameter,
	//	they can be used in the editor:
Spec.add(\intv, [0, 36, \lin]);
Spec.add(\timescale, [0.001, 10, \exp]);
Spec.add(\loopnode, [0, 7, \lin, 1]);
Spec.add(\curve, [-10, 10]);

m.editor.proxy_(~test);

		// you can map a kr proxy to a control param;
~test.map(\intv, ~lfnoyz0);
~test.unmap(\intv);
		// this also works by dragging the kr proxy name
		// the field left of the param name.


	//	some more tests :
	// if there are too many ar proxies, a scroller appears
(		// test too many
10.do { |i| p[("test" ++ i).asSymbol] = {
	Pan2.ar(Ringz.ar(Impulse.ar(exprand(0.5, 4)), exprand(300, 3000), 0.02), 1.0.rand2, 0.2) };
};
)

10.do { |i| p[("test" ++ i).asSymbol].playN(vol: linrand(1.0), fadeTime: exprand(0.01, 5)) };

	// and the same for kr proxies
10.do { |i| p[("kr" ++ i).asSymbol] = { LFNoise0.kr(exprand(5, 50)) }; };

p.krProxyNames.do { |key| p.removeAt(key) };

p.reduce(method: \clear);

p.clean;
::
