[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[sc-dev] SF.net SVN: quarks:[2668] SpeakersCorner



Revision: 2668
          http://sourceforge.net/p/quarks/code/2668
Author:   decampo
Date:     2013-12-26 11:45:56 +0000 (Thu, 26 Dec 2013)
Log Message:
-----------
sort into dirs before converting help files.

Added Paths:
-----------
    SpeakersCorner/Classes/
    SpeakersCorner/Classes/AdCVerb.sc
    SpeakersCorner/Classes/Latency.sc
    SpeakersCorner/Classes/MasterFX.sc
    SpeakersCorner/Classes/PanRingTop.sc
    SpeakersCorner/Classes/SpatioScope.sc
    SpeakersCorner/Classes/SpeakerAdjust.sc
    SpeakersCorner/Classes/Spectralyzer.sc
    SpeakersCorner/Classes/TorusPanAz.sc
    SpeakersCorner/Classes/extMapTable.sc
    SpeakersCorner/Help/
    SpeakersCorner/Help/AdCVerb.html
    SpeakersCorner/Help/Latency.html
    SpeakersCorner/Help/MasterFX.html
    SpeakersCorner/Help/PanRingTop.html
    SpeakersCorner/Help/PanRingTopBot.html
    SpeakersCorner/Help/SpatioScope.html
    SpeakersCorner/Help/SpeakerAdjust.html
    SpeakersCorner/Help/SpeakersCorner.html
    SpeakersCorner/Help/Spectralyzer.html
    SpeakersCorner/Help/TorusPanAz.html
    SpeakersCorner/Help/asMapTable.html
    SpeakersCorner/HelpSource/
    SpeakersCorner/HelpSource/Classes/
    SpeakersCorner/HelpSource/Classes/AdCVerb.schelp

Added: SpeakersCorner/Classes/AdCVerb.sc
===================================================================
--- SpeakersCorner/Classes/AdCVerb.sc	                        (rev 0)
+++ SpeakersCorner/Classes/AdCVerb.sc	2013-12-26 11:45:56 UTC (rev 2668)
@@ -0,0 +1,96 @@
+/* 	Simple reverb class, based on MoorerLoyReverb as given in Pope, Sc1 Tutorial. 
+	input is converted to mono and filtered, 
+	dense reverb is done with a bank of comb filters with prime ratio delaytimes;
+	hfDamping uses side CombL side effect for freq dependent decay. 
+	to do: get a good list of primes in sequence together and hardcode them...
+*/
+AdCVerb { 	
+
+	classvar <>verbose = false, <>maxTime = 0.2;
+
+	*ar { arg in, revTime = 3, hfDamping = 0.1, nOuts = 2, predelay = 0.02,
+		numCombs = 8, numAllpasses = 4, inFilter = 0.6, leakCoeff = 0.995, 
+		combScale = 1, apScale = 1, allpassPrimes;
+	
+		var timeOneSample;	// used for comb average-filtering;
+		var primeRange; 
+		
+		var combTimes,	// Table of combtimes
+		allpassTimes,		// delayTimes for allpasses
+		combsOut, apDecay;	
+	
+		timeOneSample = SampleDur.ir;
+
+	// Initialize comb table for longer reverberations
+	//	 "// combs: ".post;
+		  		// try creating good prime number based delayTimes with e.g. :
+	//	combTimes = ({ rrand(100, 400).nthPrime } ! numCombs).sort.postln / 40000;
+
+		combTimes = [
+			0.0797949, 			// new prime Numbers
+			0.060825,
+			0.0475902, 
+			0.0854197, 
+			0.0486931,
+			0.0654572,
+			0.0717437,
+			0.0826624,
+			0.0707511,
+			0.0579574,
+			0.0634719,
+			0.0662292
+		];
+		
+		combTimes = combTimes.copyRange(0, numCombs - 1);
+	//	combTimes.postln;
+	// Initialize allpass delay times:		  
+	//	 "// allpasses: ".post;
+		
+		allpassPrimes = allpassPrimes ?? { 
+			primeRange = 250 div: numAllpasses; 
+			{ 
+				{ |i| rrand(i + 1 * primeRange, i + 2 * primeRange).nthPrime } ! numAllpasses 
+			} ! nOuts
+		}; 
+		
+		allpassTimes = allpassPrimes * (1/44100); // scale into a good time range.
+		
+		if (verbose) { 
+			"// AdCVerb - allpassPrimes are: \n    %\n\n".postf(allpassPrimes);
+		}; 
+	
+	// mix input down to mono if needed, block DC, round off and pre-delay reverb input.
+		in = DelayN.ar(
+			OnePole.ar(
+				LeakDC.ar(in.asArray.sum, leakCoeff), 
+				inFilter
+			), 
+			maxTime, 
+			predelay
+		);  
+		
+	// Create an array of combs, with a special trick to make treble decay faster than lows:
+		if (numCombs > 0) { 
+			 combsOut = CombL.ar(in, maxTime, 
+			 	
+			 	(combTimes * combScale)
+			 		.round(timeOneSample)	// round delay times to integer samples
+			 	+ 						// and add up to half a sample to them: 
+			 							// linear interpolation between samples loses 
+			 							// high freq energy, with the maximum at 0.5. 
+			 	(timeOneSample * 0.5 * hfDamping), 
+			 	revTime
+			 ).sum 
+		 } { combsOut = 0 };
+	
+	// allpass decay always is shorter than combs decay
+		apDecay = 1.min(revTime * 0.6); 
+		
+	// Put the output through nOuts parallel chains of allpass delays
+		^allpassTimes.collect({ |timesCh| var out;
+			out = combsOut + in;
+			timesCh.do { |time| out = AllpassN.ar(out, maxTime, time * apScale, apDecay) };
+			out;
+		});
+	 }
+}
\ No newline at end of file


Property changes on: SpeakersCorner/Classes/AdCVerb.sc
___________________________________________________________________
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Added: SpeakersCorner/Classes/Latency.sc
===================================================================
--- SpeakersCorner/Classes/Latency.sc	                        (rev 0)
+++ SpeakersCorner/Classes/Latency.sc	2013-12-26 11:45:56 UTC (rev 2668)
@@ -0,0 +1,70 @@
+/* 
+	Latency.testAudio(2, 1);
+	Latency.stop;
+*/ 
+
+Latency { 
+	classvar <syn, <resp, <latencies, <serv, lastTime;
+	classvar <>verbose = false;
+	
+	*initClass { 
+		Class.initClassTree(OSCresponderNode); 
+		
+		// register to receive latency values
+		resp = OSCresponderNode(nil,'/tr',{ arg time,responder,msg;
+			var which = msg[2], exactTime = msg[3], delta; 
+			
+			if ( verbose ) { msg.postln; };
+		//	msg.postcs; 
+		//	[exactTime, which].dump;
+			if ( syn.notNil ){ 
+				// make sure we only listen to the trigger coming from the latency measurement synth
+				if ( msg[1] == syn.nodeID ){ 
+					[ 	{ 	delta = (exactTime - lastTime[1]); 
+						[lastTime[0], delta, delta / serv.sampleRate].postln; 
+						latencies[lastTime[0] - 1] = delta;
+					},
+						{ lastTime = [which, exactTime] }
+					].clipAt(which).value;
+				};
+			};
+		});
+	}
+	
+	*testAudio { |numChans=5, maxDT = 0.2, server, inChan=0|
+		serv = server ? Server.default;
+		latencies = Array.newClear(numChans); 
+		resp.remove;
+		resp.add;
+		syn = { 	var pulses, audIn, phase; 
+			var pulseFreq = (maxDT * 2 * numChans).reciprocal;
+			pulseFreq;
+			
+			phase = Phasor.ar(0, 1, 0, 2 ** 30);	// time in samples
+			audIn = SoundIn.ar(inChan);				// mike input
+			
+			pulses =  Decay2.ar(
+				Impulse.ar( pulseFreq, 
+					0.99 - ((0..numChans - 1) / numChans) // phase
+				), 0.0, 0.002
+			);
+				// send when audioin triggers
+			SendTrig.ar( Trig1.ar(audIn > 0.1, 0.05), 0, phase);
+				// send when each output plays a trigger
+			SendTrig.ar(pulses > 0.1, (1..numChans), phase);
+			(pulses ++ [ Silent.ar, audIn ])
+		}.play(serv);	
+	}
+	
+	*stop { 
+		resp.remove;
+		syn.free; 
+		this.post;
+	}
+	
+	*post { 
+		"// measured latencies:".postln;  
+		"in samples: ".post; latencies.postcs;
+		"in seconds: ".post; (latencies / serv.sampleRate).postcs;
+	}
+}
\ No newline at end of file

Added: SpeakersCorner/Classes/MasterFX.sc
===================================================================
--- SpeakersCorner/Classes/MasterFX.sc	                        (rev 0)
+++ SpeakersCorner/Classes/MasterFX.sc	2013-12-26 11:45:56 UTC (rev 2668)
@@ -0,0 +1,137 @@
+MasterFX { 
+
+	classvar <all, <maxNumChans = 8;
+	var <group, <numChannels, <busIndex, <server, <pxChain; 
+	var <checkingBadValues = true, <badSynth, badDefName;
+	
+	*initClass { 
+		all = IdentityDictionary.new;
+	}
+	
+	*new { |server, numChannels, slotNames, busIndex=0| 
+		// only one masterfx per server ATM.
+		// could be changed if different MasterFX 
+		// for different outchannel groups are to be used.
+		
+		var fx = all[server.name];
+		if (fx.notNil) { 
+			"// MasterFX for server % exists - use \nMasterFX.clear(%) \n// to make a new one.\n"
+				.postf(server.name, server.name.asCompileString);
+			^fx
+		} { 
+			^this.make(server, numChannels, slotNames, busIndex) 
+		}
+	}
+	
+	*make { |server, numChannels, slotNames| 
+		^super.new.init(server, numChannels, slotNames);
+	}
+	
+	add { |key, wet, func| 
+		pxChain.add(key, wet, func);
+	}
+	remove { |key| 
+		pxChain.remove(key);
+	}
+	
+	bus { 
+		^Bus.new(\audio, busIndex, numChannels, server);
+	}
+
+					
+	cmdPeriod { 
+		group.freeAll; 	// for SharedServers
+						// evil just to wait? hmmm. 
+		defer({ this.wakeUp }, 0.2);
+	}
+	
+	hide { 
+		Ndef.all[server.name].envir.removeAt(pxChain.proxy.key);
+	}
+		// maybe it is useful to see it under some circumstances
+	show { 
+		Ndef.all[server.name].envir.put(pxChain.proxy.key, pxChain.proxy);
+	}
+	
+	init { |inServer, inNumChannels, inSlotNames, inBusIndex| 
+		var proxy;
+		server = inServer ? Server.default;
+		numChannels = inNumChannels ? server.options.numOutputBusChannels;
+		busIndex = inBusIndex ? 0; 
+
+		proxy = Ndef(\zz_mastafx -> server.name); 
+		proxy.ar(numChannels); 
+		proxy.bus_(this.bus);
+		pxChain = ProxyChain.from(proxy, inSlotNames ? []);
+		
+		this.hide;	// hide by default
+		
+		all.put(server.name, this);
+		
+		this.makeGroup; 
+		CmdPeriod.add(this);
+		
+		badDefName = ("BadMasterFX_" ++ server.name).asSymbol;
+		SynthDef(badDefName, {
+			var snd = In.ar(busIndex, numChannels); 
+			var dt = 0.001;
+			var isOK = (CheckBadValues.ar(snd) < 0.001);
+			var gate = (isOK * DelayN.ar(isOK, dt * 2));
+			var outSnd = 	DelayL.ar(snd, dt) * gate;
+			ReplaceOut.ar(busIndex, outSnd)
+		}).add;
+		
+		fork { 
+			0.2.wait; 
+			this.checkBad(checkingBadValues);
+		};
+	}
+	
+	makeGroup { 
+		group = Group.new(1.asGroup, \addAfter).isPlaying_(true);
+		pxChain.proxy.parentGroup_(group);
+	}
+	
+	wakeUp { 
+		"\nMasterFX for server % waking up.\n\n".postf(server.name); 
+			this.makeGroup; 
+			pxChain.proxy.wakeUp;
+			this.checkBad;		
+	}
+	
+	clear { 
+		CmdPeriod.remove(this);
+		pxChain.proxy.clear;
+		all.removeAt(pxChain.proxy.server.name);
+	}
+	
+	*clear { |name| 
+		(name ?? { all.keys }).do { |name| 
+			all.removeAt(name).clear;
+		};
+	}
+	
+	makeName { 
+		^(this.class.name ++ "_" ++ server.name 
+		++ "_" ++ pxChain.proxy.numChannels).asSymbol 
+	}
+	
+	gui { |name, numItems, buttonList, parent, bounds, makeSkip = true|
+			// the effects are all on by default: 
+		buttonList = buttonList ?? { pxChain.slotNames.collect ([_, \slotCtl, 1]) };
+		name = name ?? { this.makeName };
+		numItems = numItems ? 16; 
+		^MasterFXGui(pxChain, numItems, parent, bounds, makeSkip, buttonList)
+			.name_(name);
+	}
+	
+	checkBad { |flag = true| 
+		checkingBadValues = flag;
+		badSynth.free; 
+		if (checkingBadValues) { 
+			badSynth = Synth(badDefName, target: group, addAction: \addAfter);
+		};
+	}
+	
+	*default { ^all[Server.default.name] }
+}
\ No newline at end of file

Copied: SpeakersCorner/Classes/PanRingTop.sc (from rev 2667, SpeakersCorner/Panning/PanRingTop.sc)
===================================================================
--- SpeakersCorner/Classes/PanRingTop.sc	                        (rev 0)
+++ SpeakersCorner/Classes/PanRingTop.sc	2013-12-26 11:45:56 UTC (rev 2668)
@@ -0,0 +1,44 @@
+PanRingTop : MultiOutUGen { 
+	*ar {|numChans=4, in, azi=0.0, elev=0.0, orientation=0.5|
+		^[numChans, in, azi, elev, orientation ].flop.collect({ |inputs|
+			this.ar1(*inputs) 
+		}).unbubble;
+	}
+	*ar1 { |numChans=4, in, azi=0.0, elev=0.0, orientation=0.5|
+		var down, up; #down, up = Pan2.ar(in, (elev * 2 - 1).clip(-1, 1));
+		^PanAz.ar(numChans, down, azi) ++ [ up ];
+	}
+	*kr {|numChans=4, in, azi=0.0, elev=0.0, orientation=0.5|
+		^[numChans, in, azi, elev, orientation ].flop.collect({ |inputs|
+			this.kr1(*inputs) 
+		}).unbubble;
+	}
+	*kr1 { |numChans=4, in, azi=0.0, elev=0.0, orientation=0.5|
+		var down, up; #down, up = Pan2.kr(in, (elev * 2 - 1).clip(-1, 1));
+		^PanAz.kr(numChans, down, azi) ++ [ up ];
+	}
+}
+		// 1 top and 1 bottom speaker, 
+		// positions azi wraps, elev clips.
+PanRingTopBot : MultiOutUGen { 
+	*ar {|numChans=4, in, azi=0.0, elev=0.0, orientation=0.5|
+		^[numChans, in, azi, elev, orientation ].flop.collect({ |inputs|
+			this.ar1(*inputs) 
+		}).unbubble;
+	}
+	*ar1 { |numChans=4, in, azi=0.0, elev=0.0, orientation=0.5|
+		var down, ring, up; 
+		#down, ring, up = PanAz.ar(3, in, elev.clip(-1, 1) * 2/3, orientation: 1);
+		^PanAz.ar(numChans, ring, azi) ++ [up, down];
+	}
+	*kr {|numChans=4, in, azi=0.0, elev=0.0, orientation=0.5|
+		^[numChans, in, azi, elev, orientation ].flop.collect({ |inputs|
+			this.kr1(*inputs) 
+		}).unbubble;
+	}
+	*kr1 { |numChans=4, in, azi=0.0, elev=0.0, orientation=0.5|
+		var down, ring, up; 
+		#down, ring, up = PanAz.kr(3, in, elev.clip(-1, 1) * 2/3, orientation: 1);
+		^PanAz.kr(numChans, ring, azi) ++ [up, down];
+	}
+}
\ No newline at end of file

Added: SpeakersCorner/Classes/SpatioScope.sc
===================================================================
--- SpeakersCorner/Classes/SpatioScope.sc	                        (rev 0)
+++ SpeakersCorner/Classes/SpatioScope.sc	2013-12-26 11:45:56 UTC (rev 2668)
@@ -0,0 +1,212 @@
+SpatioScope { 
+	
+	var <locations, <server,  <bounds, <>background, <>foreground; 
+	var <numChannels, <offset = 0; 
+	var <proxy, <resp, <skipjack;
+	var <parent, <startBtn, <stopBtn, <ampViews, <magSlider, <>redLevel=0.95, <>magnify=1;
+
+	var <rate;
+
+	*new { arg locations, server, parent, bounds;
+		locations = locations ?? { [(-0.5 @ -0.5), (0.5 @ -0.5), (0.5@0.5), (-0.5@0.5) ] }; 
+		server = server ? Server.default; 
+		
+		^super.newCopyArgs(locations, server)
+			.init(bounds)
+			.gui(parent)
+			// .start
+	}
+	
+	init { |argBounds|
+		bounds = argBounds ?? { Rect(0,0,410,410) };
+		numChannels = locations.size; 
+		
+		proxy = proxy ?? {  NodeProxy.control(server, this.numChannels) };
+		proxy.source = {
+			Amplitude.kr(InFeedback.ar(this.offset, this.numChannels), 0, 0.5)
+		};
+
+		rate = \audio;
+
+		resp.remove;
+		resp = OSCresponderNode(server.addr, '/c_set', { arg time, r, msg; 
+			var amps;
+			// check if this reply message is for this spatioscope
+			if ( msg[1] == this.proxy.index ){
+				amps = msg.copyToEnd(1).clump(2).flop[1];
+				{  this.amps_(amps * (magnify ? 1)); }.defer;
+			};
+		}); 
+		
+		skipjack = SkipJack( 
+			{ proxy.wakeUp; this.updateViews; }, 
+			0.2, 
+			{ parent.isClosed; },
+			this.class.name, 
+			autostart: false
+		);
+	}
+
+	maxBusNum {
+		^if ( rate == \audio ){
+			server.options.numAudioBusChannels
+		} {
+			server.options.numControlBusChannels
+		} - this.numChannels;
+	}
+
+	offset_ { |inChan=0|
+		if (inChan.inclusivelyBetween(0, this.maxBusNum ) ) { 
+			offset = inChan; 
+			if (skipjack.task.isPlaying) { this.stop.start };
+		}{
+			"new offset out of range of valid busnumbers!".warn;
+		};
+	}
+	
+	gui { |argParent| 
+		var butWidth = 38; 
+		background = background ?? { Color(0, 0, 0.15) }; // dark blue
+		foreground = foreground ?? { Color(0.5, 0.5, 1.0) }; // light blue
+		
+		parent = argParent ?? { 
+			Window(this.class.name, bounds.moveBy(200, 200).resizeBy(10, 30)).front;
+		};
+		parent.view.background_(background); 
+		parent.addFlowLayout;
+		
+		#startBtn, stopBtn = [ \start, \stop ].collect { |name, i| 
+			Button(parent, Rect(i * (butWidth + 2) + 2, 2, butWidth, 20))
+				.states_([[name, Color.white, Color.clear], 
+					[name, Color.white, Color(0,0,0.8)]])
+				.action_({ this.perform(name); });
+		};
+	
+		magSlider = EZSlider(parent, 
+			(bounds.width - (butWidth * 2) - 10) @ 20, 
+			\magnify, 
+			[1, 10, \exp], 
+			{ |sl| magnify = sl.value }, magnify, 
+			labelWidth: 45, numberWidth: 30);
+		magSlider.labelView.stringColor_(foreground);
+		magSlider.numberView.background_(foreground);
+//		magSlider.numberView.resize_(3);
+//		magSlider.sliderView.resize_(2);
+		
+		this.showLocs;
+		this.stop.start;
+	}
+	
+	showLocs { 
+		var ampCont = CompositeView(parent, bounds).background_(Color.clear);
+		var center = bounds.center; 
+		var size = bounds.center.x * 0.2; 
+		
+		ampViews = locations.collect { |point, i| 
+			var left = point.x + 1 - 0.125 * center.x; 
+			var top = point.y + 1 - 0.125 * center.y; 
+			StaticText(ampCont, Rect(left, top, size, size))
+			.string_((i + 1).asString).align_(\center)
+				.stringColor_(foreground)
+			.background_(Color.black);
+		};
+	}
+
+	*ringPos { |num=6, radius=0.7, angleOffset=0| 
+		var angles = { |i| (2pi * (i / num)) + angleOffset }.dup(num); 
+		^angles.collect { |angle| Polar(radius, angle).asPoint };
+	}
+
+	*ring { |num=6, radius=0.7, angleOffset=0, server, parent, bounds|
+		var locs = this.ringPos(num, radius, angleOffset);
+		^this.new(locs, server, parent, bounds);
+	}
+	
+	
+	*rings { |nums, radii, angleOffsets = 0, server, parent, bounds|
+		var locs; 
+		var numrings = nums.size; 
+			// earlier circles are outer 
+			// (assumes dome shape, low channels on bottom, as in IEM CUBE)
+		radii = radii ?? { (numrings .. 1) / (numrings + 1) };
+		angleOffsets = angleOffsets ?? 0;
+		locs = [ nums, radii, angleOffsets ].flop.collect { |list| this.ringPos(*list) }.flat; 
+		
+		^this.new(locs, server, parent, bounds);
+	}
+
+	// grid speaker positions
+	*gridPos{ |numx = 2, numy = 6|
+		
+		^Array.series( numy, 1/(2*numy), 1/numy ).collect{ |y|
+			Array.series( numx, 1/(2*numx), 1/numx ).collect{ |x|
+				Point(x*2-1,y*2-1);
+			}
+		}.flatten;
+	}
+
+	*grid { |numx=2, numy=6, server, parent, bounds|
+		var locs = this.gridPos(numx, numy);
+		^this.new(locs, server, parent, bounds);
+	}
+
+
+	// listen to control buses
+	krListen{
+		rate = \control;
+		proxy.source = {
+			Amplitude.kr(In.kr(this.offset, this.numChannels), 0, 0.5)
+		};
+	}
+
+	// listen to audio rate buses
+	arListen{
+		rate = \audio;
+		proxy.source = {
+			Amplitude.kr(InFeedback.ar(this.offset, this.numChannels), 0, 0.5)
+		};
+	}
+			
+	start {
+		if(server.serverRunning.not) { 
+			"SpatioScope: server not running.".warn; 
+			skipjack.stop; 
+			this.updateViews;
+			^this
+		};
+		proxy.rebuild;
+		fork { 0.4.wait; proxy.send };
+		skipjack.start; 
+		resp.remove.add;
+		this.updateViews;
+	}
+
+	updateViews {
+		var isOn = skipjack.task.isPlaying.binaryValue;
+		if (parent.isClosed.not) { 
+			startBtn.value_(isOn);
+			stopBtn.value_(1 - isOn);
+			server.listSendMsg(["/c_get"] ++ ((_ + proxy.index) ! proxy.numChannels));
+		};
+	}
+	
+	stop { 
+		skipjack.stop;
+		proxy.free;
+		resp.remove;
+		this.updateViews;
+		this.amps_([]);
+	}
+	
+	amps_ { arg vals;
+		var amp, col;
+		// "amps coming in: %\n".postf(vals);
+		if (parent.isClosed.not) { 
+			ampViews.do { |el, i|  
+				amp = (vals[i] ? 0).sqrt; 
+				col = if (amp > redLevel, { Color.red }, { Color.yellow( amp ) });
+				el.background_(col) 
+			} 
+		};
+	}
+}
\ No newline at end of file

Added: SpeakersCorner/Classes/SpeakerAdjust.sc
===================================================================
--- SpeakersCorner/Classes/SpeakerAdjust.sc	                        (rev 0)
+++ SpeakersCorner/Classes/SpeakerAdjust.sc	2013-12-26 11:45:56 UTC (rev 2668)
@@ -0,0 +1,100 @@
+SpeakerAdjust { 
+
+	classvar <>freqName = \eqFr, <>gainName= \eqGn, <>bwName= \eqBw;
+	var <server, <specs, <vol, <synth, <group; 
+		
+	*addSpecs { |numChans = 8, numBands = 3, dict|
+		var 	freqSpec, gainSpec, bwSpec, threeSpecs; 
+		
+		freqSpec = \freq.asSpec;
+		gainSpec = [-24, 24].asSpec; 
+		bwSpec = [0.01, 2, \exp].asSpec;
+		threeSpecs = [freqSpec, gainSpec, bwSpec];
+		
+		dict = dict ? Spec.specs;
+		dict.put(freqName, freqSpec);
+		dict.put(gainName, gainSpec);
+		dict.put(bwName, bwSpec);
+		
+		numChans.do { |i| 
+			numBands.do { |j| 
+				this.makeNames(i, j).do { |name, i| 
+					dict.put(name, threeSpecs[i]);
+				}
+			}
+		};
+	}
+	
+	*makeNames { |i, j| 
+		var ext = "_c" ++ (j+1) ++ "_" ++ (i+1);
+		^[freqName, gainName, bwName].collect { |nm| (nm ++ ext).asSymbol };
+	}
+		// more efficient, but fixed values for everything
+	*ar { |ins, specs, vol=1|
+
+		vol = vol.lag(0.2); 
+		
+		if (ins.size != specs.size) { 
+			"SpeakerAdjust: number of ins: % and specs: % dont match."
+				.format(ins.size, specs.size).warn;
+			^nil
+		};
+		
+		^specs.collect { |spec, i|
+			var out, amp, dt, eqSpecs; 
+
+			out = ins[i];
+			#amp, dt ... eqSpecs = spec; 
+
+			out = if (amp.notNil, { out * amp }, { out });
+
+			if (dt ? 0 > 0, { out = DelayN.ar(out, dt, dt) });
+		
+			eqSpecs.do { |spec|
+				var freq, db, rq; 
+				#freq, db, rq = spec;
+				out = MidEQ.ar(out, freq, rq, db);
+			};
+			out * vol;
+		};	
+	}
+		// create controls for everything
+	*arDyn { |ins, specs, vol=1|
+		
+		vol = vol.lag(0.2); 
+		
+		if (ins.size != specs.size) { 
+			"SpeakerAdjust: number of ins: % and specs: % dont match."
+				.format(ins.size, specs.size).warn;
+			^nil
+		};
+		
+		^specs.collect { |specList, i|
+			var out, amp, dt, eqSpecs; 
+			var ampCtl, delayCtl;
+			
+			out = ins[i];
+			#amp, dt ... eqSpecs = specList; 
+
+			delayCtl = NamedControl.kr(("eqDt_c" ++ (i+1)).asSymbol, dt ? 0, 0.2);
+			out = DelayN.ar(out, 0.1, delayCtl);
+
+			ampCtl = NamedControl.kr(("eqAmp_c" ++ (i+1)).asSymbol, amp ? 1, 0.2);
+			out * (ampCtl * vol);
+		
+			eqSpecs.do { |specBand, j|
+				var freq, db, rq; 
+				var freqCtl, gainCtl, rqCtl; 
+				var ctlNames = this.makeNames(i, j); 
+				#freq, db, rq = specBand.postcs;
+				
+				freqCtl = NamedControl.kr(ctlNames[0], freq, 0.2);
+				gainCtl = NamedControl.kr(ctlNames[1], db, 0.2);
+				rqCtl   = NamedControl.kr(ctlNames[2], rq, 0.2);
+				
+				out = MidEQ.ar(out, freqCtl, gainCtl, rqCtl);
+			};
+			out
+		};	
+	}
+}
\ No newline at end of file

Added: SpeakersCorner/Classes/Spectralyzer.sc
===================================================================
--- SpeakersCorner/Classes/Spectralyzer.sc	                        (rev 0)
+++ SpeakersCorner/Classes/Spectralyzer.sc	2013-12-26 11:45:56 UTC (rev 2668)
@@ -0,0 +1,133 @@
+Spectralyzer { 
+	var <nBands, <minFreq, <maxFreq, <server, <rq, <freqs; 
+	var <inPx, <ampsPx, task, lastNDbs, <avgN = 5; 
+	
+	var <view, <ampsV, <dbVals, <midSl, <rangeSl, <avgSl, <dtSl;
+	var <midDb = -30, <rangeDb = 15, <dt=0.1;
+	
+	*new { |nBands=61, minFreq=20, maxFreq=20000, server| 
+		server = server ? Server.default;
+		^super.newCopyArgs(nBands, minFreq, maxFreq, server).init;
+	}
+	
+	init { 
+		freqs = (maxFreq / minFreq) ** ((0..nBands - 1) / (nBands - 1)) * minFreq;
+		rq = freqs[1] / freqs[0] - 1; 
+		inPx = NodeProxy(server, \audio, 1);
+		ampsPx = NodeProxy(server, \control, nBands + 1);
+		ampsPx.source = this.ampsFunc; 
+		task = Task { 
+			loop { max(0.1, dt).wait; 
+				this.poll({ |mAmps| { this.setAmps(mAmps) }.defer; });
+			};
+		};
+	}
+	
+	midDb_ { |val| midDb = val.clip(-100, 0); midSl.value_(midDb); }
+	rangeDb_ { |val| rangeDb = val.clip(0, 30); rangeSl.value_(rangeDb); }
+	avgN_ { |val| avgN = val.clip(1, 50); avgSl.value_(avgN); }
+	dt_ { |val| dt = val.clip(0.01, 1); dtSl.value_(dt); }
+	
+	ampsFunc { 
+		^{ Amplitude.kr([inPx.ar(1)] ++ BPF.ar(inPx.ar(1), freqs, rq), 0.0, 1) }
+	}
+	listenTo { |src| inPx.source = src; }
+	
+	poll { |func| ^ampsPx.bus.getn(nBands, func) }
+
+	start { 
+		inPx.wakeUp; 
+		ampsPx.wakeUp; 
+		task.stop.play; 
+	}
+	stop { 
+		inPx.end; 
+		ampsPx.end; 
+		task.stop; 
+	}
+	setAmps { |amps|
+		var viewVals; 
+		dbVals = amps.drop(1).ampdb; 
+		lastNDbs = lastNDbs.add(dbVals).keep(avgN.neg.asInteger); 
+		
+		viewVals = (lastNDbs.mean - midDb) / (rangeDb * 2) + 0.5; 
+		this.setViewVals(viewVals);
+	}
+
+	setViewVals { |vals| if (view.isClosed.not) { ampsV.value_(vals) } }
+
+	makeWindow { arg parent, labelsPerLine = 31; 
+		
+		var win, flo, width = 1024, ezWidth;
+		var labelWid = 32, maxNumLabels = 31, numLabels, numLines; 
+		var comp, font = Font("Monaco", 9); 
+		var multiHeight = 200;
+		
+		view = parent ?? { 
+			win = Window(this.class.name, Rect(0,0, width + 10, multiHeight + 60))
+				.front;
+			view = win.view; 
+		};
+		
+		flo = view.addFlowLayout(1@1, 2@2);
+		
+		Button(view, Rect(0,0, 60,20)).states_([["start"]])
+			.action_({ this.start });
+			
+		Button(view, Rect(0,0, 60,20)).states_([["stop"]])
+			.action_({ this.stop });
+		
+		ezWidth = width - (60 + 2 * 2) / 4 - 2; 
+		
+		#midSl, rangeSl, avgSl, dtSl = [	
+			[\midDb, [-80,0,\lin,1,-30].asSpec],
+			[\rangeDb, [2,40,\lin,1,15].asSpec],
+			[\avgN, [1, 50, \lin,1, 5].asSpec],
+			[\dt, [0.01, 1, \exp, 0.01, 0.1].asSpec]
+		].collect { |list| var name, spec; 
+			#name, spec = list;
+			EZSlider(view, ezWidth@20, name, spec, 
+				{|sl| this.perform((name ++ "_").asSymbol, sl.value); }, 
+				labelWidth: 50, numberWidth: 25
+			);
+		};
+		
+		flo.nextLine;
+		
+			// make labels: 
+		
+		comp = CompositeView(view, Rect(0,0, width, multiHeight + 50)); 
+		
+		numLines = (freqs.size / maxNumLabels).ceil.asInteger;
+		numLabels = (freqs.size / numLines).ceil.asInteger; 
+		labelWid = (width / numLabels).trunc;
+		
+		numLabels.do { |i| 
+			var left = i * labelWid; 
+			var top = 0; // stacked ... i % numLines * 20;
+			
+			var freq = freqs[i * numLines].round(0.1);
+			if (freq >= 100, { freq = freq.round(1) }); 
+			
+			StaticText(comp, Rect(left, top, labelWid - 1, 16))
+				.background_(Color(0.9,0.9,0.9))
+				.string_(freq).align_(0)
+				.font_(font);
+			StaticText(comp, Rect(left + (labelWid / (numLines + 1)), top + 16, 1, 4))
+				.background_(Color.black)
+		};
+		
+		flo.nextLine;
+		flo.dump; 
+		
+		ampsV = MultiSliderView(comp, Rect(0, 20, width + 2, multiHeight))
+			.valueThumbSize_(2.0).gap_(2.0)
+			.indexThumbSize_(width / freqs.size - 2.0)
+			.value_(0.5 ! freqs.size);
+		
+		3.do { |i|
+			StaticText(comp, Rect(0, i + 1 * (multiHeight / 4) + 20, width, 1))
+				.background_(Color.white.alpha_([0.3, 0.6, 0.3][i]));
+		};
+	}
+}
\ No newline at end of file

Copied: SpeakersCorner/Classes/TorusPanAz.sc (from rev 2667, SpeakersCorner/Panning/TorusPanAz.sc)
===================================================================
--- SpeakersCorner/Classes/TorusPanAz.sc	                        (rev 0)
+++ SpeakersCorner/Classes/TorusPanAz.sc	2013-12-26 11:45:56 UTC (rev 2668)
@@ -0,0 +1,22 @@
+TorusPanAz { 
+	*ar { arg numSpeakers = #[ 16, 12, 8, 4 ], 
+		in, hPos = 0.0, vPos = 0.0, level = 1.0, 
+		hWidth = 2, vWidth = 2, 
+		hOrients=0, vOrient=0;
+
+		 ^PanAz.ar(numSpeakers.size, in, vPos, level, vWidth, vOrient)
+		 	.collect({ arg vChan, i; var numSpk; 
+		 		numSpk = numSpeakers[i];
+		 		if (numSpk == 1, { 
+		 			[vChan] 
+		 		}, {
+					PanAz.ar(numSpk, 
+						vChan, 
+						hPos, 
+						width: hWidth.min(numSpk),
+						orientation: hOrients.asArray.clipAt(i)
+					)
+				});
+		}).flat;
+	}
+}
\ No newline at end of file

Added: SpeakersCorner/Classes/extMapTable.sc
===================================================================
--- SpeakersCorner/Classes/extMapTable.sc	                        (rev 0)
+++ SpeakersCorner/Classes/extMapTable.sc	2013-12-26 11:45:56 UTC (rev 2668)
@@ -0,0 +1,50 @@
++ SequenceableCollection {	 
+
+	asMapTable { |sizePow2=8| 
+
+		var insize = this.size, maxval = this.last;
+		var tabsize = (2 ** sizePow2).asInteger; 
+		var numvals = tabsize / (insize - 1);
+		var outTable = Signal.newClear(tabsize); 
+		
+		this.doAdjacentPairs { |a, b, i| 
+			var startIndex = (i * numvals).round(1);
+			var endIndex = (i + 1 * numvals).round(1);
+			var incr = b - a / (endIndex - startIndex); 
+			(startIndex..endIndex - 1).do { |j| 
+				outTable.put(j, a + (j - startIndex * incr));
+			};
+		};
+		^outTable;
+	}
+}
+
+/*inpos -> outpos
+0.0 -> 0.0
+0.3 -> 0.4
+0.7 -> 0.8
+1.0 -> 1.2
+1.5 -> 1.6
+2.0 -> 2.0 (same as 0.0)
+
+a = [0, 0.3, 0.7, 1, 1.5, 2.0].asMapTable; 
+a.plot;
+s.boot; 
+
+b = Buffer.sendCollection(s, a.asWavetable, 1);
+b.getn(0, 255, { |a| a.postln });
+
+c = { |inpos=0.0| 
+	Shaper.kr(b.bufnum, inpos.wrap(0, 2)).poll;
+}.play;
+
+c.set(\inpos, -1);
+c.set(\inpos, -0.99);
+c.set(\inpos, -0.6);
+c.set(\inpos, -0.2);
+c.set(\inpos, 0.2);
+c.set(\inpos, 0.6);
+c.set(\inpos, 0.99);
+c.set(\inpos, 1.0);
+*/
+

Added: SpeakersCorner/Help/AdCVerb.html
===================================================================
--- SpeakersCorner/Help/AdCVerb.html	                        (rev 0)
+++ SpeakersCorner/Help/AdCVerb.html	2013-12-26 11:45:56 UTC (rev 2668)
@@ -0,0 +1,178 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd";>
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<meta http-equiv="Content-Style-Type" content="text/css">
+<title></title>
+<meta name="Generator" content="Cocoa HTML Writer">
+<meta name="CocoaVersion" content="1038.25">
+<style type="text/css">
+p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica}
+p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; min-height: 12.0px}
+p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px}
+p.p4 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco}
+p.p5 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #cd0b0b}
+p.p6 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #008417}
+p.p7 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #2024c7}
+p.p8 {margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Helvetica; min-height: 17.0px}
+p.p9 {margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Helvetica}
+p.p10 {margin: 0.0px 0.0px 0.0px 57.0px; text-indent: -57.0px; font: 12.0px Helvetica; min-height: 14.0px}
+p.p11 {margin: 0.0px 0.0px 0.0px 57.0px; text-indent: -57.0px; font: 12.0px Helvetica}
+p.p12 {margin: 0.0px 0.0px 0.0px 57.0px; text-indent: -57.0px; font: 9.0px Monaco; min-height: 12.0px}
+p.p13 {margin: 0.0px 0.0px 0.0px 57.0px; text-indent: -57.0px; font: 9.0px Monaco}
+p.p14 {margin: 0.0px 0.0px 0.0px 57.0px; text-indent: -57.0px; font: 9.0px Monaco; color: #e20d0d; min-height: 12.0px}
+p.p15 {margin: 0.0px 0.0px 0.0px 57.0px; text-indent: -57.0px; font: 9.0px Monaco; color: #e20d0d}
+p.p16 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #000000; min-height: 12.0px}
+p.p17 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #ffac28; min-height: 12.0px}
+p.p18 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #000000}
+p.p19 {margin: 0.0px 0.0px 0.0px 57.0px; text-indent: -57.0px; font: 9.0px Monaco; color: #2226cf}
+span.s1 {font: 18.0px Helvetica}
+span.s2 {font: 9.0px Monaco}
+span.s3 {color: #000000}
+span.s4 {color: #2024c7}
+span.s5 {color: #008417}
+span.s6 {color: #2226cf}
+span.s7 {color: #e20d0d}
+span.Apple-tab-span {white-space:pre}
+</style>
+</head>
+<body>
+<p class="p1"><span class="s1"><b>AdCVerb</b></span><span class="s2"> <span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span></span><b>a simple reverb based on Schroeder and Moorer/Loy models,<span class="Apple-converted-space"> </span></b></p>
+<p class="p1"><b><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>tuned for low coloration, with some special tweaks.</b></p>
+<p class="p2"><br></p>
+<p class="p2"><br></p>
+<p class="p1">AdCVerb is a bank of comb filters going thru a bank of allpass filters, with optional predelay.</p>
+<p class="p1">Input filtering is provided (high rolloff, DC removal), and it is easy and efficient to use for<span class="Apple-converted-space"> </span></p>
+<p class="p1">multichannel systems.</p>
+<p class="p3"><br></p>
+<p class="p1">The overall structure is:</p>
+<p class="p3"><br></p>
+<p class="p3"><br></p>
+<p class="p4"><span class="Apple-converted-space">     </span>||||| <span class="Apple-converted-space">  </span>in (number of channels of input array, e.g. 5)</p>
+<p class="p4"><span class="Apple-converted-space">     </span>\\|//<span class="Apple-tab-span">	</span>summed to<span class="Apple-converted-space"> </span></p>
+<p class="p4"><span class="Apple-converted-space">       </span>|<span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>mono<span class="Apple-converted-space"> </span></p>
+<p class="p4"><span class="Apple-converted-space">    </span>/// \\\<span class="Apple-tab-span">	</span>fanning out to &lt;numCombs&gt; (e.g. 6 here)</p>
+<p class="p4"><span class="Apple-converted-space">    </span>||| ||| <span class="Apple-converted-space">  </span>comb filters</p>
+<p class="p4"><span class="Apple-converted-space">     </span>\\ //</p>
+<p class="p4"><span class="Apple-converted-space">       </span>|<span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>summed to mono</p>
+<p class="p4"><span class="Apple-converted-space">     </span>//|\\<span class="Apple-converted-space">    </span>fanned to &lt;nOuts&gt; allpass chain channels for decorrelation/diffuseness;</p>
+<p class="p4"><span class="Apple-converted-space">     </span>|||||<span class="Apple-tab-span">	</span>for each channel, a chain of &lt;numAllpasses&gt; allPasses,</p>
+<p class="p4"><span class="Apple-converted-space">     </span>|||||<span class="Apple-tab-span">	</span>e.g. 3 here.</p>
+<p class="p4"><span class="Apple-converted-space">     </span>|||||</p>
+<p class="p4">_____________</p>
+<p class="p4"><span class="Apple-tab-span">	</span>|||||<span class="Apple-tab-span">	</span>&lt;nOuts&gt; output channels.<span class="Apple-converted-space"> </span></p>
+<p class="p2"><span class="Apple-tab-span">	</span></p>
+<p class="p1">There is no specific design of first reflections; if there are no particular demands on the early reflections,<span class="Apple-converted-space"> </span></p>
+<p class="p1">those created by AdCVerb are often fully sufficient.<span class="Apple-converted-space"> </span></p>
+<p class="p1">One can easily add first reflections, e.g. based on room geometry, by adding higher predelays,<span class="Apple-converted-space"> </span></p>
+<p class="p1">and creating a special purpose set of first reflections; then AdCVerb works well for global reverb tails.<span class="Apple-converted-space"> </span></p>
+<p class="p3"><br></p>
+<p class="p1">Currently, the combTimes are hardcoded to be colouration-free (based on prime numbers),<span class="Apple-converted-space"> </span></p>
+<p class="p1">and they can be scaled. The allpassTimes are generated randomly based on prime number ratios,<span class="Apple-converted-space"> </span></p>
+<p class="p1">but can also be passed in if desired</p>
+<p class="p2"><br></p>
+<p class="p1"><b>*ar(in, revTime, hfDamping, nOuts,<span class="Apple-converted-space"> </span></b></p>
+<p class="p1"><b><span class="Apple-tab-span">	</span>predelay, numCombs, numAllpasses,<span class="Apple-converted-space"> </span></b></p>
+<p class="p1"><b><span class="Apple-tab-span">	</span>inFilter, leakCoeff, combScale, apScale, allpassPrimes)</b></p>
+<p class="p2"><br></p>
+<p class="p2"><span class="Apple-tab-span">	</span></p>
+<p class="p1"><span class="s2"><span class="Apple-tab-span">	</span></span><b>in<span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span></b>audio input; this is converted to mono.</p>
+<p class="p1"><b><span class="Apple-tab-span">	</span>revTime <span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span></b>reverb time for -60 db decay of combs.</p>
+<p class="p1"><b><span class="Apple-tab-span">	</span>hfDamping<span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span></b>0.0 is no damping, 1.0 means high frequencies roll off<span class="Apple-converted-space"> </span></p>
+<p class="p1"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>significantly faster.<span class="Apple-converted-space"> </span></p>
+<p class="p1"><b><span class="Apple-tab-span">	</span>nOuts<span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span></b>number of outputs; each out gets its own group<span class="Apple-converted-space"> </span></p>
+<p class="p1"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>of allpass filters for more density and decorrelation</p>
+<p class="p1"><b><span class="Apple-tab-span">	</span>predelay <span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span></b>predelay before reverb tail begins, in sec</p>
+<p class="p1"><b><span class="Apple-tab-span">	</span>numCombs<span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span></b>number of combs used for reverb tail</p>
+<p class="p1"><b><span class="Apple-tab-span">	</span>numAllpasses<span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span></b>number of allpasses used for decorrelating each out channel</p>
+<p class="p1"><b><span class="Apple-tab-span">	</span>inFilter <span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span></b>a coefficient for reverb input filtering;<span class="Apple-converted-space"> </span></p>
+<p class="p1"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>0.0 is no filtering, 0.99 is very dark.</p>
+<p class="p1"><b><span class="Apple-tab-span">	</span>combScale<span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span></b>scales all combTimes (within a max of 0.2 sec);<span class="Apple-converted-space"> </span></p>
+<p class="p1"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>can be used to adjust room size. 1.0 is default.</p>
+<p class="p1"><b><span class="Apple-tab-span">	</span>apScale<span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span></b>scales all allpassTimes (within a max of 0.2 sec);</p>
+<p class="p1"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>can be used to adjust room size. 1.0 is default.</p>
+<p class="p1"><span class="Apple-tab-span">	</span><b>allpassPrimes<span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span></b>a list of prime numbers for the allpass filters;<span class="Apple-converted-space"> </span></p>
+<p class="p1"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>providing them overrides <b>numAllpasses </b>and<b> nOuts.</b></p>
+<p class="p2"><br></p>
+<p class="p2"><br></p>
+<p class="p5"><span class="s3">(<span class="Apple-tab-span">	</span></span>// simple use:<span class="Apple-converted-space"> </span></p>
+<p class="p6"><span class="s4">Ndef</span><span class="s3">(</span>\adcverb_help<span class="s3">).play;</span></p>
+<p class="p6"><span class="s4">Ndef</span><span class="s3">(</span>\adcverb_help<span class="s3">, {<span class="Apple-converted-space"> </span></span></p>
+<p class="p4"><span class="Apple-tab-span">	</span><span class="s4">var</span> src, verb;<span class="Apple-converted-space"> </span></p>
+<p class="p4"><span class="Apple-tab-span">	</span>src = <span class="s4">Decay2</span>.ar(<span class="s4">Impulse</span>.ar(0.5, 0.99), 0.001, 0.03, <span class="s4">PinkNoise</span>.ar(1));</p>
+<p class="p4"><span class="Apple-tab-span">	</span>verb = <span class="s4">AdCVerb</span>.ar(src * 0.1);</p>
+<p class="p4"><span class="Apple-tab-span">	</span>src + verb;</p>
+<p class="p4">});</p>
+<p class="p4">)</p>
+<p class="p2"><br></p>
+<p class="p2"><br></p>
+<p class="p6"><span class="s4">Ndef</span><span class="s3">(</span>\adcverb_help).play;</p>
+<p class="p7">NodeProxyEditor<span class="s3">(</span>Ndef<span class="s3">(</span><span class="s5">\adcverb_help));</span></p>
+<p class="p2"><br></p>
+<p class="p5"><span class="s3">(<span class="Apple-tab-span">	</span></span>// all params open for tuning:</p>
+<p class="p4"><span class="s4">Spec</span>.add(<span class="s5">\revTime</span>, [0.01, 100, <span class="s5">\exp</span>]);</p>
+<p class="p4"><span class="s4">Spec</span>.add(<span class="s5">\hfDamping</span>, [0, 1]);</p>
+<p class="p4"><span class="s4">Spec</span>.add(<span class="s5">\predelay</span>, [0.0, 0.2, <span class="s5">\amp</span>]);</p>
+<p class="p4"><span class="s4">Spec</span>.add(<span class="s5">\revTime</span>, [0.01, 100, <span class="s5">\exp</span>]);</p>
+<p class="p4"><span class="s4">Spec</span>.add(<span class="s5">\inFilter</span>, [-0.99, 0.99]);</p>
+<p class="p4"><span class="s4">Spec</span>.add(<span class="s5">\leakCoeff</span>, [0.8, 1.0]);</p>
+<p class="p4"><span class="s4">Spec</span>.add(<span class="s5">\combScale</span>, [0.1, 2, <span class="s5">\exp</span>]);</p>
+<p class="p4"><span class="s4">Spec</span>.add(<span class="s5">\apScale</span>, [0.1, 2, <span class="s5">\exp</span>]);</p>
+<p class="p2"><br></p>
+<p class="p4"><span class="s4">Ndef</span>(<span class="s5">\adcverb_help</span>, { |revTime = 3, hfDamping = 0.1, predelay = 0.02,</p>
+<p class="p4"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>inFilter = 0.6, leakCoeff = 0.995, combScale = 1, apScale = 1|</p>
+<p class="p2"><span class="Apple-tab-span">	</span></p>
+<p class="p4"><span class="Apple-tab-span">	</span>var src, verb;<span class="Apple-converted-space"> </span></p>
+<p class="p4"><span class="Apple-tab-span">	</span>src = Decay2.ar(Impulse.ar(0.5), 0.001, 0.03, PinkNoise.ar(1));</p>
+<p class="p2"><span class="Apple-tab-span">	</span></p>
+<p class="p4"><span class="Apple-tab-span">	</span>verb = AdCVerb.ar(src * 0.1,<span class="Apple-converted-space"> </span></p>
+<p class="p4"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>revTime: revTime.lag(0.5),<span class="Apple-converted-space"> </span></p>
+<p class="p4"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>hfDamping: hfDamping.lag(0.5),</p>
+<p class="p4"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>nOuts: 2, <span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>// fixed number of decorrelated output channels</p>
+<p class="p4"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>predelay: predelay.lag(0.5),<span class="Apple-converted-space"> </span></p>
+<p class="p4"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>numCombs: <span class="Apple-tab-span">	</span>8, <span class="Apple-tab-span">	</span>// fixed number - increase for more density</p>
+<p class="p4"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>numAllpasses: 4, <span class="Apple-tab-span">	</span>// fixed number - increase for more diffuseness</p>
+<p class="p4"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>inFilter: inFilter,</p>
+<p class="p4"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>leakCoeff: leakCoeff,<span class="Apple-converted-space"> </span></p>
+<p class="p4"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>combScale: combScale.lag(0.5), // lagged to<span class="Apple-converted-space"> </span></p>
+<p class="p4"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>apScale: apScale.lag(0.5)</p>
+<p class="p4"><span class="Apple-tab-span">	</span>);</p>
+<p class="p4"><span class="Apple-tab-span">	</span>src + verb;</p>
+<p class="p4">});</p>
+<p class="p4">)</p>
+<p class="p8"><b></b><br></p>
+<p class="p9"><b>Class Variables</b></p>
+<p class="p10"><span class="Apple-tab-span">	</span></p>
+<p class="p11"><b><span class="Apple-tab-span">	</span>*verbose</b><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>turn posting of random-generated allpass number info on and off,<span class="Apple-converted-space"> </span></p>
+<p class="p11"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>so one can get the exact same reverb again if desired.</p>
+<p class="p12"><br></p>
+<p class="p13"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="s6">AdCVerb</span>.verbose_(<span class="s6">true</span>); <span class="s7">// post</span></p>
+<p class="p14"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span></p>
+<p class="p15"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>// now build a new AdCVerb - times get posted,<span class="Apple-converted-space"> </span></p>
+<p class="p4"><span class="s5">(<span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span></span><span class="s4">Ndef</span>(<span class="s5">\adcverb_help</span>, { <span class="s4">var</span> src, verb;<span class="Apple-converted-space"> </span></p>
+<p class="p4"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>src = <span class="s4">Decay2</span>.ar(<span class="s4">Impulse</span>.ar(0.5, 0.99), 0.001, 0.03, <span class="s4">PinkNoise</span>.ar(1));</p>
+<p class="p4"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>verb = <span class="s4">AdCVerb</span>.ar(src * 0.1);</p>
+<p class="p4"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>src + verb;</p>
+<p class="p4"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>});</p>
+<p class="p4">)</p>
+<p class="p16"><br></p>
+<p class="p5"><span class="s3"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span></span>// e.g. [ [ 683, 757, 1319, 1597 ], [ 419, 1009, 1129, 2053 ] ]</p>
+<p class="p17"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span></p>
+<p class="p15"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>// if desired, use these specific random primes:<span class="Apple-converted-space"> <span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span></span></p>
+<p class="p18"><span class="s5">(</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="s4">Ndef</span>(<span class="s5">\adcverb_help</span>, { <span class="s4">var</span> src, verb;<span class="Apple-converted-space"> </span></p>
+<p class="p18"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>src = <span class="s4">Decay2</span>.ar(<span class="s4">Impulse</span>.ar(0.5, 0.99), 0.001, 0.03, <span class="s4">PinkNoise</span>.ar(1));</p>
+<p class="p18"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>verb = <span class="s4">AdCVerb</span>.ar(src * 0.1,<span class="Apple-converted-space"> </span></p>
+<p class="p18"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>allpassPrimes: [ [ 683, 757, 1319, 1597 ], [ 419, 1009, 1129, 2053 ] ]</p>
+<p class="p18"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>);</p>
+<p class="p18"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>src + verb;</p>
+<p class="p18"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>});</p>
+<p class="p4">)</p>
+<p class="p19"><span class="s3"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span></span>AdCVerb.verbose_<span class="s3">(</span>false<span class="s3">); </span><span class="s7">// no posting</span></p>
+<p class="p10"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span></p>
+<p class="p11"><b><span class="Apple-tab-span">	</span>*maxTime<span class="Apple-tab-span">	</span></b>set the maximum delay time for predelay, combs and allpasses.</p>
+<p class="p10"><b><span class="Apple-tab-span">	</span></b><span class="Apple-tab-span">	</span></p>
+<p class="p11"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>When maxTime is changed, the next instance of AdCVerb will have this maxdelaytime</p>
+<p class="p11"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>for combs, allpasses and predelay. Default value is 0.2.</p>
+<p class="p10"><br></p>
+</body>
+</html>

Added: SpeakersCorner/Help/Latency.html
===================================================================
--- SpeakersCorner/Help/Latency.html	                        (rev 0)
+++ SpeakersCorner/Help/Latency.html	2013-12-26 11:45:56 UTC (rev 2668)
@@ -0,0 +1,96 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd";>
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<meta http-equiv="Content-Style-Type" content="text/css">
+<title></title>
+<meta name="Generator" content="Cocoa HTML Writer">
+<meta name="CocoaVersion" content="949.43">
+<style type="text/css">
+p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica}
+p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px}
+p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; min-height: 14.0px}
+p.p4 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco}
+p.p5 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; min-height: 12.0px}
+p.p6 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; color: #000000; min-height: 14.0px}
+p.p7 {margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; color: #000000}
+p.p8 {margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; color: #bf0000}
+p.p9 {margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco}
+p.p10 {margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; color: #862323; min-height: 14.0px}
+p.p11 {margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; color: #862323}
+span.s1 {font: 18.0px Helvetica}
+span.s2 {color: #000000}
+span.Apple-tab-span {white-space:pre}
+</style>
+</head>
+<body>
+<p class="p1"><span class="s1"><b>Latency</b></span><b><span class="Apple-tab-span">	</span>measure audio delays for multiple channels</b></p>
+<p class="p2"><br></p>
+<p class="p1">Latency is the time delay between when one initiates something and when it happens.</p>
+<p class="p1">There are several places in the SC architecture where latencies occur:<span class="Apple-converted-space"> </span></p>
+<p class="p2"><br></p>
+<p class="p1"><b>1. Interpreter latency:<span class="Apple-converted-space"> </span></b></p>
+<p class="p1">the time between entering a command and the time it is executed in the client (sclang).<span class="Apple-converted-space"> </span></p>
+<p class="p1">This depends on how much code it is and how complex the calculations are.</p>
+<p class="p1">For many cases, it is near zero.<span class="Apple-converted-space"> </span></p>
+<p class="p3"><br></p>
+<p class="p4"><span class="Apple-tab-span">	</span>// a function that does nothing runs really fast</p>
+<p class="p4">bench({ nil });<span class="Apple-tab-span">	</span></p>
+<p class="p5"><br></p>
+<p class="p4"><span class="Apple-tab-span">	</span>// filling a big array with random numbers takes a while longer.</p>
+<p class="p4">bench({ Array.rand(100000, 0.0, 1.0) });<span class="Apple-tab-span">	</span></p>
+<p class="p5"><br></p>
+<p class="p4"><span class="Apple-tab-span">	</span>// different operations may take different times</p>
+<p class="p4">bench({ 1000000.do { 3.sqrt.cos } });<span class="Apple-converted-space"> </span></p>
+<p class="p4">bench({ 1000000.do { 12.squared } });<span class="Apple-converted-space"> </span></p>
+<p class="p5"><br></p>
+<p class="p3"><br></p>
+<p class="p1"><b>2. Network latency:<span class="Apple-converted-space"> </span></b></p>
+<p class="p1">sclang and scserver communicate via network (OpenSoundControl, usually UDP, or also TCP/IP);<span class="Apple-converted-space"> </span></p>
+<p class="p1">until a network packet sent from sclang to the server arrives, an undetermined time passes.<span class="Apple-converted-space"> </span></p>
+<p class="p1">On the same machine, with little other network traffic, this is typically ca. 0.02 seconds, depending mainly<span class="Apple-converted-space"> </span></p>
+<p class="p1">on the server's hardware buffer size.<span class="Apple-converted-space">  </span>This can be measured with:</p>
+<p class="p6"><br></p>
+<p class="p7">s.boot;</p>
+<p class="p7">s.ping(10, 0.1);</p>
+<p class="p8"><span class="s2"><span class="Apple-tab-span">	</span></span>// compare</p>
+<p class="p7">s.options.hardwareBufferSize;<span class="Apple-converted-space"> </span></p>
+<p class="p7">s.options.hardwareBufferSize / s.sampleRate</p>
+<p class="p2"><br></p>
+<p class="p1">The order in which packets arrive is not guaranteed, so in the worst case, one can end up sending a command to start a synth process, then set one of its controls to some value; if the order is accidentally reversed, trying to set e.g. frequency on a node which does not exist yet - which will complain (server - Node not found), and then start that node playing at the wrong pitch and staying there forever (because the failed command has happened already).<span class="Apple-converted-space"> </span></p>
+<p class="p2"><br></p>
+<p class="p1">Therefore, one usually sets a latency value for the server, which is safely greater than the worst value measured/estimated (e.g. with s.ping). The default for this is 0.2 sec.<span class="Apple-converted-space"> </span></p>
+<p class="p3"><br></p>
+<p class="p9">s.latency;</p>
+<p class="p3"><br></p>
+<p class="p1"><b>3. Audio I/O latency :<span class="Apple-converted-space"> </span></b></p>
+<p class="p1">scsynth passes buffers (one block of numbers per channel) to the audio hardware;<span class="Apple-converted-space"> </span></p>
+<p class="p1">the size of these buffers determines the time it takes between when a synth starts<span class="Apple-converted-space"> </span></p>
+<p class="p1">internally and when it actually is heard.<span class="Apple-converted-space"> </span></p>
+<p class="p1">The same goes for audio input too: input signals are passed to SC as blocks,<span class="Apple-converted-space"> </span></p>
+<p class="p1">so there is some latency between when e.g. a trigger happens at the analog audio input,<span class="Apple-converted-space"> </span></p>
+<p class="p1">and when it is detected with e.g. a Trig Ugen.</p>
+<p class="p2"><br></p>
+<p class="p2"><br></p>
+<p class="p1">While this latency can be set directly with some utility software for audiocards,<span class="Apple-converted-space"> </span></p>
+<p class="p1">such software may not consider all the factors:<span class="Apple-converted-space"> </span></p>
+<p class="p1">E.g. the operating system itself, firewire or USB connections, and intermediate layers<span class="Apple-converted-space"> </span></p>
+<p class="p1">like Jack may introduce extra buffering and thus extra delay somewhere along the line.</p>
+<p class="p1">For multiple speaker setups, distances to the listening position may also introduce delays.<span class="Apple-converted-space"> </span></p>
+<p class="p2"><br></p>
+<p class="p1">So it makes sense to measure audio latency. The *testAudio method generates pulses<span class="Apple-converted-space"> </span></p>
+<p class="p1">on several output channels and measures time until each pulse registers again at an audio input.</p>
+<p class="p10"><br></p>
+<p class="p11">Latency.initClass;<span class="Apple-converted-space"> </span></p>
+<p class="p10"><br></p>
+<p class="p1"><b><span class="Apple-tab-span">	</span>*testAudio(numChans, maxDT, server, inChan)</b></p>
+<p class="p1"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><b>numChans</b>: <span class="Apple-tab-span">	</span>the number of audio channels to be measured</p>
+<p class="p1"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><b>maxDT</b>: <span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>the longest expected delay time to be measured</p>
+<p class="p1"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><b>server</b>: <span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>the server to be generating the test sound on</p>
+<p class="p1"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><b>inChan</b>: <span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>the input channel where the returning audio signal comes in,<span class="Apple-converted-space"> </span></p>
+<p class="p1"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>typically, the mic input.</p>
+<p class="p11">Latency.testAudio;</p>
+<p class="p10"><br></p>
+<p class="p11">s.scope;</p>
+</body>
+</html>

Added: SpeakersCorner/Help/MasterFX.html
===================================================================
--- SpeakersCorner/Help/MasterFX.html	                        (rev 0)
+++ SpeakersCorner/Help/MasterFX.html	2013-12-26 11:45:56 UTC (rev 2668)
@@ -0,0 +1,139 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd";>
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<meta http-equiv="Content-Style-Type" content="text/css">
+<title></title>
+<meta name="Generator" content="Cocoa HTML Writer">
+<meta name="CocoaVersion" content="1038.29">
+<style type="text/css">
+p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica}
+p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px}
+p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; min-height: 12.0px}
+p.p4 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco}
+p.p5 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #862323}
+p.p6 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #0023b6}
+p.p7 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #4d6d13}
+p.p8 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #1c23b6; min-height: 12.0px}
+p.p9 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #0023b6; min-height: 12.0px}
+p.p10 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #007300}
+span.s1 {font: 18.0px Helvetica}
+span.s2 {font: 9.0px Monaco}
+span.s3 {color: #0023b6}
+span.s4 {color: #000000}
+span.s5 {color: #4d6d13}
+span.s6 {color: #1936a7}
+span.s7 {color: #0000bf}
+span.Apple-tab-span {white-space:pre}
+</style>
+</head>
+<body>
+<p class="p1"><span class="s1"><b>MasterFX</b></span><span class="s2"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span></span><b>a highly configurable chain of effects on the main outputs</b></p>
+<p class="p2"><br></p>
+<p class="p1"><b><span class="Apple-tab-span">	</span>see also: </b><span class="s3"><b>ProxyChain</b></span><b><span class="Apple-converted-space"> </span></b></p>
+<p class="p3"><br></p>
+<p class="p4">(</p>
+<p class="p4">s.boot;</p>
+<p class="p3"><br></p>
+<p class="p5"><span class="s4"><span class="Apple-tab-span">	</span></span>// add a few global filter functions to use - these are then available by name.</p>
+<p class="p6">ProxyChain<span class="s4">.add(</span></p>
+<p class="p4"><span class="Apple-tab-span">	</span><span class="s5">\leakDC</span>,<span class="Apple-converted-space">  </span><span class="s5">\filter</span> -&gt; { <span class="s3">|in, leak=0.99|</span> <span class="s3">LeakDC</span>.ar(in, leak) },</p>
+<p class="p6"><span class="s4"><span class="Apple-tab-span">	</span></span><span class="s5">\rollClip</span><span class="s4">, </span><span class="s5">\filter</span><span class="s4"> -&gt; { </span>|in, clip=0.99, pole=0.2|</p>
+<p class="p4"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="s3">OnePole</span>.ar(in.clip2(clip), pole ** 0.7);</p>
+<p class="p4"><span class="Apple-tab-span">	</span>},</p>
+<p class="p6"><span class="s4"><span class="Apple-tab-span">	</span></span><span class="s5">\krush</span><span class="s4">, </span><span class="s5">\filter</span><span class="s4"> -&gt; { </span>|in, bits=16, downsamp=2|<span class="s4"><span class="Apple-converted-space"> </span></span></p>
+<p class="p4"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="s3">var</span> down;</p>
+<p class="p4"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>in = in.round(0.5 ** bits);</p>
+<p class="p4"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>down = <span class="s3">Latch</span>.ar(in, <span class="s3">Impulse</span>.ar(<span class="s3">SampleRate</span>.ir / downsamp.max(2)));<span class="Apple-converted-space"> </span></p>
+<p class="p5"><span class="s4"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span></span>// below 1/2 downsamp, do xfade:</p>
+<p class="p4"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>blend(in, down, (downsamp - 1).clip(0, 1));</p>
+<p class="p4"><span class="Apple-tab-span">	</span>},</p>
+<p class="p6"><span class="s4"><span class="Apple-tab-span">	</span></span><span class="s5">\ampFin</span><span class="s4">, </span><span class="s5">\filter</span><span class="s4"> -&gt; { </span>|in, limDrive=1, ampLimit=0.8, postAmp=1 |<span class="s4"><span class="Apple-converted-space"> </span></span></p>
+<p class="p4"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="s3">Limiter</span>.ar(in * limDrive, ampLimit) * <span class="s3">postAmp</span>;</p>
+<p class="p4"><span class="Apple-tab-span">	</span>}</p>
+<p class="p4">);</p>
+<p class="p5"><span class="s4"><span class="Apple-tab-span">	</span></span>// and specs for them fof gui control.</p>
+<p class="p4"><span class="s3">Spec</span>.add(<span class="s5">\leak</span>, [0.5, 0.999, <span class="s5">\exp</span>]);</p>
+<p class="p4"><span class="s3">Spec</span>.add(<span class="s5">\clip</span>, [0.0, 1, <span class="s5">\amp</span>]);</p>
+<p class="p4"><span class="s3">Spec</span>.add(<span class="s5">\pole</span>, [0, 0.95, <span class="s5">\lin</span>]);</p>
+<p class="p3"><br></p>
+<p class="p4"><span class="s3">Spec</span>.add(<span class="s5">\bits</span>, [16, 1]);</p>
+<p class="p4"><span class="s3">Spec</span>.add(<span class="s5">\downsamp</span>, [1, 100, <span class="s5">\exp</span>]);</p>
+<p class="p3"><br></p>
+<p class="p7"><span class="s3">Spec</span><span class="s4">.add(</span>\limDrive<span class="s4">, </span>\ampx4<span class="s4">);</span></p>
+<p class="p7"><span class="s3">Spec</span><span class="s4">.add(</span>\ampLimit<span class="s4">, </span>\amp<span class="s4">);</span></p>
+<p class="p6">Spec<span class="s4">.add(</span><span class="s5">\</span>postAmp<span class="s4">, </span><span class="s5">\ampx4</span><span class="s4">);</span></p>
+<p class="p4">)</p>
+<p class="p3"><br></p>
+<p class="p3"><br></p>
+<p class="p1"><b><span class="Apple-tab-span">	</span>*new(server, numChannels, slotNames, busnum)<span class="Apple-converted-space"> </span></b></p>
+<p class="p2"><b><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span></b></p>
+<p class="p4"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>server: <span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>the server on which the <span class="s3">MasterFX</span> chain will run;</p>
+<p class="p4"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>numChannels: <span class="Apple-tab-span">	</span>the number of channels it will work on,<span class="Apple-converted-space"> </span></p>
+<p class="p4"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>default is server.numOutputBusChannels</p>
+<p class="p4"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>slotNames: <span class="Apple-tab-span">	</span>the names of the filters/functions to be used, in order of execution;</p>
+<p class="p4"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>busnum: <span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>the busnumber where it will process audio, default = 0.</p>
+<p class="p3"><br></p>
+<p class="p4">(</p>
+<p class="p4">m = <span class="s3">MasterFX</span>.new(server: s,<span class="Apple-converted-space"> </span></p>
+<p class="p4"><span class="Apple-tab-span">	</span>numChannels: 8,<span class="Apple-converted-space"> </span></p>
+<p class="p7"><span class="s4"><span class="Apple-tab-span">	</span>slotNames: [</span>\leakDC<span class="s4">, </span>\krush<span class="s4">, </span>\rollClip<span class="s4">, </span>\ampFin<span class="s4">],<span class="Apple-converted-space"> </span></span></p>
+<p class="p4"><span class="Apple-tab-span">	</span>busIndex: 0);</p>
+<p class="p8"><br></p>
+<p class="p4">g = m.gui;</p>
+<p class="p4">)</p>
+<p class="p3"><br></p>
+<p class="p4">{ <span class="s6">PinkNoise</span>.ar(0.5) * LFNoise2.kr([5, 8, 13, 21]).max(0); }.play;</p>
+<p class="p4">s.scope(8);</p>
+<p class="p3"><br></p>
+<p class="p4"><span class="Apple-tab-span">	</span>// kick the effects in at full wet level</p>
+<p class="p4">m.pxChain.add(<span class="s5">\leakDC</span>, 1);</p>
+<p class="p4">m.pxChain.add(<span class="s5">\rollClip</span>, 1);</p>
+<p class="p4">m.pxChain.add(<span class="s5">\dualComp</span>, 1);</p>
+<p class="p4">m.pxChain.add(<span class="s5">\ampFin</span>, 1);</p>
+<p class="p3"><br></p>
+<p class="p4"><span class="Apple-tab-span">	</span>// make a more specific gui - see also ProxyChainGui</p>
+<p class="p4">(</p>
+<p class="p4">m.gui(<span class="s5">\Mestre</span>, 20, [</p>
+<p class="p7"><span class="s4"><span class="Apple-tab-span">	</span>[</span>\leakDC<span class="s4">, </span>\slotCtl<span class="s4">, 1],</span></p>
+<p class="p7"><span class="s4"><span class="Apple-tab-span">	</span>[</span>\rollClip<span class="s4">, </span>\slotCtl<span class="s4">, 1],</span></p>
+<p class="p7"><span class="s4"><span class="Apple-tab-span">	</span>[</span>\krush<span class="s4">, </span>\slotCtl<span class="s4">, 1],</span></p>
+<p class="p7"><span class="s4"><span class="Apple-tab-span">	</span>[</span>\ampFin<span class="s4">, </span>\slotCtl<span class="s4">, 1],</span></p>
+<p class="p4"><span class="Apple-tab-span">	</span>[<span class="s5">\RESET</span>, <span class="s5">\extra</span>, { m.pxChain.add(<span class="s5">\leakDC</span>, 1).add(<span class="s5">\ampFin</span>, 1) }],</p>
+<p class="p4">])</p>
+<p class="p4">)</p>
+<p class="p3"><br></p>
+<p class="p4">m.pxChain.remove(<span class="s5">\leakDC</span>, 1);</p>
+<p class="p4">m.pxChain.remove(<span class="s5">\rollClip</span>, 1);</p>
+<p class="p4">m.pxChain.remove(<span class="s5">\krush</span>);</p>
+<p class="p4">m.pxChain.remove(<span class="s5">\ampFin</span>, 1);</p>
+<p class="p3"><br></p>
+<p class="p3"><br></p>
+<p class="p3"><br></p>
+<p class="p5"><span class="s4"><span class="Apple-tab-span">	</span></span>// removing a MasterFX<span class="Apple-converted-space"> </span></p>
+<p class="p5"><span class="s3">MasterFX</span><span class="s4">.all;<span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span></span>// all masterFX, one per server, live here.</p>
+<p class="p5"><span class="s3">MasterFX</span><span class="s4">.clear(</span><span class="s5">\localhost</span><span class="s4">); <span class="Apple-tab-span">	</span></span>// clear one specific masterfx</p>
+<p class="p5"><span class="s3">MasterFX</span><span class="s4">.all;<span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span></span>// gone now.</p>
+<p class="p3"><br></p>
+<p class="p7"><span class="s3">MasterFX</span><span class="s4">(</span><span class="s3">Server</span><span class="s4">.internal, 8, [</span>\leakDC<span class="s4">, </span>\rollClip<span class="s4">, </span>\dualComp<span class="s4">, </span>\ampFin<span class="s4">]);</span></p>
+<p class="p6">MasterFX<span class="s4">.all;</span></p>
+<p class="p5"><span class="s3">MasterFX</span><span class="s4">.clear; <span class="Apple-tab-span">	</span></span>// clear all mfxes</p>
+<p class="p6">MasterFX<span class="s4">.all;</span></p>
+<p class="p3"><br></p>
+<p class="p3"><br></p>
+<p class="p4">p = <span class="s3">ProxySpace</span>.push;</p>
+<p class="p4">~pink = { <span class="s3">PinkNoise</span>.ar * <span class="s3">SinOsc</span>.ar };</p>
+<p class="p4">~pink.play;</p>
+<p class="p6">ProxyMixer<span class="s4">(p);</span></p>
+<p class="p9"><br></p>
+<p class="p9"><br></p>
+<p class="p10"><span class="s4">z = </span><span class="s7">MasterFX</span><span class="s4">(s, 8, [</span>\leakDC<span class="s4">, </span>\rollClip<span class="s4">, </span>\dualComp<span class="s4">, </span>\ampFin<span class="s4">]);</span></p>
+<p class="p4">z.gui;</p>
+<p class="p3"><br></p>
+<p class="p3"><br></p>
+<p class="p4">ToDo:<span class="Apple-converted-space"> </span></p>
+<p class="p4"><span class="Apple-tab-span">	</span>maybe at some point one will want separate MasterFX for different output groups<span class="Apple-converted-space"> </span></p>
+<p class="p4"><span class="Apple-tab-span">	</span>on the same server. in that case, remove storage by server name, and use freely<span class="Apple-converted-space"> </span></p>
+<p class="p4"><span class="Apple-tab-span">	</span>given names.<span class="Apple-converted-space"> </span></p>
+</body>
+</html>

Copied: SpeakersCorner/Help/PanRingTop.html (from rev 2667, SpeakersCorner/Panning/PanRingTop.html)
===================================================================
--- SpeakersCorner/Help/PanRingTop.html	                        (rev 0)
+++ SpeakersCorner/Help/PanRingTop.html	2013-12-26 11:45:56 UTC (rev 2668)
@@ -0,0 +1,60 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd";>
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<meta http-equiv="Content-Style-Type" content="text/css">
+<title></title>
+<meta name="Generator" content="Cocoa HTML Writer">
+<meta name="CocoaVersion" content="949.43">
+<style type="text/css">
+p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Helvetica}
+p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; min-height: 12.0px}
+p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica}
+p.p4 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px}
+p.p5 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #a91616; min-height: 12.0px}
+p.p6 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #000000}
+p.p7 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #000000; min-height: 12.0px}
+p.p8 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #bf0000}
+span.s1 {font: 9.0px Monaco}
+span.s2 {font: 9.0px Monaco; color: #a91616}
+span.s3 {color: #0000bf}
+span.s4 {color: #000000}
+span.s5 {color: #007300}
+span.s6 {color: #bf0000}
+span.Apple-tab-span {white-space:pre}
+</style>
+</head>
+<body>
+<p class="p1"><b>PanRingTop</b></p>
+<p class="p2"><br></p>
+<p class="p3"><b>a panner for a ring with one speaker on top.<span class="Apple-converted-space"> </span></b></p>
+<p class="p3"><b>see also PanRingTopBot, TorusPanAz.</b></p>
+<p class="p2"><br></p>
+<p class="p3"><b><span class="Apple-tab-span">	</span>*ar(numChans, in, azi, elev, orientation)</b></p>
+<p class="p3"><span class="s1"><span class="Apple-tab-span">	</span></span><b>numChans<span class="Apple-tab-span">	</span></b>number of channels in the ring</p>
+<p class="p3"><span class="s2"><span class="Apple-tab-span">	</span></span><b>in<span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span></b>input signal to pan</p>
+<p class="p3"><b><span class="Apple-tab-span">	</span>azi<span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span></b>azimuth, angle in the horizontal ring; from 0 to 2, wraps around.</p>
+<p class="p3"><b><span class="Apple-tab-span">	</span>elev<span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span></b>height above the horizon, toward top speaker; 0 is ring, 1 is top.</p>
+<p class="p3"><b><span class="Apple-tab-span">	</span>orientation<span class="Apple-tab-span">	</span></b>direction of azimuth 0: orientation 0 means azi 0 is on chan0,<span class="Apple-converted-space"> </span></p>
+<p class="p3"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>orientation 0.5 means azi 0 is between chan0 and chan1.</p>
+<p class="p4"><br></p>
+<p class="p3">The order of the returned channels is: ring1, ring2 ... ringN, top.</p>
+<p class="p5"><br></p>
+<p class="p6"><span class="s3">Server</span>.internal.boot;<span class="Apple-converted-space"> </span></p>
+<p class="p7"><br></p>
+<p class="p8"><span class="s4"><span class="Apple-tab-span">	</span></span>// orientation defaults to 0.5, between first 2 chans.</p>
+<p class="p6">z = { <span class="s3">|azi=0, elev=0|</span> <span class="s3">PanRingTop</span>.ar(4, <span class="s3">Dust</span>.ar(1000, 0.5), azi, elev).postln }.scope;</p>
+<p class="p7"><br></p>
+<p class="p7"><br></p>
+<p class="p6">z.set(<span class="s5">\azi</span>, -0.25);<span class="Apple-tab-span">	</span><span class="s6">// chan 0</span></p>
+<p class="p6">z.set(<span class="s5">\azi</span>, 0.25);<span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="s6">// chan 1</span></p>
+<p class="p6">z.set(<span class="s5">\azi</span>, 0.75);<span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="s6">// chan 2</span></p>
+<p class="p6">z.set(<span class="s5">\azi</span>, 1.25);<span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="s6">// chan 3</span></p>
+<p class="p8"><span class="s4">z.set(</span><span class="s5">\elev</span><span class="s4">, 0.5);<span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span></span>// halfway up to chan 5, top.</p>
+<p class="p8"><span class="s4">z.set(</span><span class="s5">\elev</span><span class="s4">, 1);<span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span></span>// chan 5 - last chan is top.</p>
+<p class="p7"><br></p>
+<p class="p7"><br></p>
+<p class="p7"><br></p>
+<p class="p8">// could also be done with TorusPanAz now.</p>
+</body>
+</html>

Copied: SpeakersCorner/Help/PanRingTopBot.html (from rev 2667, SpeakersCorner/Panning/PanRingTopBot.html)
===================================================================
--- SpeakersCorner/Help/PanRingTopBot.html	                        (rev 0)
+++ SpeakersCorner/Help/PanRingTopBot.html	2013-12-26 11:45:56 UTC (rev 2668)
@@ -0,0 +1,80 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd";>
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<meta http-equiv="Content-Style-Type" content="text/css">
+<title></title>
+<meta name="Generator" content="Cocoa HTML Writer">
+<meta name="CocoaVersion" content="949.43">
+<style type="text/css">
+p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Helvetica}
+p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; min-height: 12.0px}
+p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica}
+p.p4 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px}
+p.p5 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #000000}
+p.p6 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #000000; min-height: 12.0px}
+p.p7 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #bf0000}
+span.s1 {font: 9.0px Monaco}
+span.s2 {font: 9.0px Monaco; color: #a91616}
+span.s3 {color: #0000bf}
+span.s4 {color: #000000}
+span.s5 {color: #007300}
+span.s6 {color: #bf0000}
+span.Apple-tab-span {white-space:pre}
+</style>
+</head>
+<body>
+<p class="p1"><b>PanRingTopBot</b></p>
+<p class="p2"><br></p>
+<p class="p3"><b>a panner for a ring with one speaker on top, and one on the bottom.</b></p>
+<p class="p3"><b>see also PanRingTop, TorusPanAz.</b></p>
+<p class="p2"><br></p>
+<p class="p3"><b><span class="Apple-tab-span">	</span>*ar(numChans, in, azi, elev, orientation)</b></p>
+<p class="p3"><span class="s1"><span class="Apple-tab-span">	</span></span><b>numChans<span class="Apple-tab-span">	</span></b>number of channels in the ring</p>
+<p class="p3"><span class="s2"><span class="Apple-tab-span">	</span></span><b>in<span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span></b>input signal to pan</p>
+<p class="p3"><b><span class="Apple-tab-span">	</span>azi<span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span></b>azimuth, angle in the horizontal ring; from 0 to 2, wraps around.</p>
+<p class="p3"><b><span class="Apple-tab-span">	</span>elev<span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span></b>height above the horizon, toward top speaker; 0 is ring, 1 is top, -1 is bottom.</p>
+<p class="p3"><b><span class="Apple-tab-span">	</span>orientation<span class="Apple-tab-span">	</span></b>direction of azimuth 0: orientation 0 means azi 0 is on chan0,<span class="Apple-converted-space"> </span></p>
+<p class="p3"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>orientation 0.5 means azi 0 is between chan0 and chan1.</p>
+<p class="p4"><br></p>
+<p class="p3">The order of the returned channels is: ring1, ring2 ... ringN, top, bottom.</p>
+<p class="p4"><br></p>
+<p class="p2"><br></p>
+<p class="p5"><span class="s3">Server</span>.internal.boot;<span class="Apple-converted-space"> </span></p>
+<p class="p6"><br></p>
+<p class="p7"><span class="s4"><span class="Apple-tab-span">	</span></span>// orientation defaults to 0.5, between first 2 chans.</p>
+<p class="p5">z = { <span class="s3">|azi=0, elev=0|</span> <span class="s3">PanRingTopBot</span>.ar(4, <span class="s3">Dust</span>.ar(1000, 0.5), azi, elev) }.scope;</p>
+<p class="p6"><br></p>
+<p class="p6"><br></p>
+<p class="p5">z.set(<span class="s5">\azi</span>, -0.25);<span class="Apple-tab-span">	</span><span class="s6">// chan 1</span></p>
+<p class="p5">z.set(<span class="s5">\azi</span>, 0.25);<span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="s6">// chan 2</span></p>
+<p class="p5">z.set(<span class="s5">\azi</span>, 0.75);<span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="s6">// chan 3</span></p>
+<p class="p5">z.set(<span class="s5">\azi</span>, 1.25);<span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="s6">// chan 4</span></p>
+<p class="p7"><span class="s4">z.set(</span><span class="s5">\elev</span><span class="s4">, 0.5);<span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span></span>// halfway up to top chan (here chan 5).</p>
+<p class="p7"><span class="s4">z.set(</span><span class="s5">\elev</span><span class="s4">, 1);<span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span></span>// pan all the way to top chan.</p>
+<p class="p7"><span class="s4">z.set(</span><span class="s5">\elev</span><span class="s4">, -0.5);<span class="Apple-tab-span">	</span></span>// halfway down to bottom (here chan 6).</p>
+<p class="p7"><span class="s4">z.set(</span><span class="s5">\elev</span><span class="s4">, -1);<span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span></span>// pan fully to to bottom chan.</p>
+<p class="p6"><br></p>
+<p class="p6"><br></p>
+<p class="p7">// The bottom speaker can also be virtual, and mixed to the ring speakers:</p>
+<p class="p5">(</p>
+<p class="p5">z = { <span class="s3">|azi=0, elev=0|</span> <span class="s3">var</span> all, ring, top, bot;<span class="Apple-converted-space"> </span></p>
+<p class="p5"><span class="Apple-tab-span">	</span>all = <span class="s3">PanRingTopBot</span>.ar(6, <span class="s3">Dust</span>.ar(1000, 0.5), azi, elev);<span class="Apple-converted-space"> </span></p>
+<p class="p5"><span class="Apple-tab-span">	</span>ring = all.keep(6);<span class="Apple-converted-space"> </span></p>
+<p class="p5"><span class="Apple-tab-span">	</span>top = all[6];<span class="Apple-converted-space"> </span></p>
+<p class="p5"><span class="Apple-tab-span">	</span>bot = all[7];<span class="Apple-converted-space"> </span></p>
+<p class="p5"><span class="Apple-tab-span">	</span>(ring + (bot * (1/6))) ++ top;</p>
+<p class="p5">}.scope;</p>
+<p class="p5">)</p>
+<p class="p6"><br></p>
+<p class="p5">z.set(<span class="s5">\azi</span>, -0.17);<span class="Apple-tab-span">	</span><span class="s6">// chan 1</span></p>
+<p class="p5">z.set(<span class="s5">\azi</span>, 0.5);<span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="s6">// chan 3</span></p>
+<p class="p7"><span class="s4">z.set(</span><span class="s5">\elev</span><span class="s4">, 1);<span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span></span>// pan all the way to top chan.</p>
+<p class="p7"><span class="s4">z.set(</span><span class="s5">\elev</span><span class="s4">, -0.5);<span class="Apple-tab-span">	</span></span>// bottom is added to ring of 6.</p>
+<p class="p7"><span class="s4">z.set(</span><span class="s5">\elev</span><span class="s4">, -1);<span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span></span>// fully down is now evenly on all ring speakers.</p>
+<p class="p6"><br></p>
+<p class="p6"><br></p>
+<p class="p6"><br></p>
+<p class="p7">// could also be done with TorusPanAz now.</p>
+</body>
+</html>

Added: SpeakersCorner/Help/SpatioScope.html
===================================================================
--- SpeakersCorner/Help/SpatioScope.html	                        (rev 0)
+++ SpeakersCorner/Help/SpatioScope.html	2013-12-26 11:45:56 UTC (rev 2668)
@@ -0,0 +1,134 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd";>
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<meta http-equiv="Content-Style-Type" content="text/css">
+<title></title>
+<meta name="Generator" content="Cocoa HTML Writer">
+<meta name="CocoaVersion" content="824.48">
+<style type="text/css">
+p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica}
+p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; min-height: 12.0px}
+p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco}
+p.p4 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #9a1d1b}
+p.p5 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #001ebb}
+p.p6 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px}
+span.s1 {font: 18.0px Helvetica}
+span.s2 {color: #000000}
+span.s3 {color: #001ebb}
+span.s4 {font: 9.0px Monaco}
+span.s5 {color: #9a1d1b}
+span.Apple-tab-span {white-space:pre}
+</style>
+</head>
+<body>
+<p class="p1"><span class="s1"><b>SpatioScope<span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span></b></span><b>monitor volume levels on multiple speakers</b></p>
+<p class="p2"><br></p>
+<p class="p2"><span class="Apple-tab-span">	</span></p>
+<p class="p3">s.boot;</p>
+<p class="p2"><br></p>
+<p class="p1"><b><span class="Apple-tab-span">	</span>// quick first example:<span class="Apple-converted-space"> </span></b></p>
+<p class="p4"><span class="s2">z = </span><span class="s3">SpatioScope</span><span class="s2">.new;<span class="Apple-tab-span">	</span></span>// default is 4 speakers<span class="Apple-converted-space"> </span></p>
+<p class="p2"><br></p>
+<p class="p4"><span class="s2"><span class="Apple-tab-span">	</span></span>// 4 chans of sound</p>
+<p class="p3">{ <span class="s3">LFDNoise3</span>.ar([2, 3, 5, 8] * 1000) * <span class="s3">LFNoise2</span>.kr([5, 8, 13, 21] * 0.1).max(0); }.play;</p>
+<p class="p2"><span class="Apple-tab-span">	</span></p>
+<p class="p2"><br></p>
+<p class="p4"><span class="s2"><span class="Apple-tab-span">	</span></span>// survives cmd-period</p>
+<p class="p5">thisProcess<span class="s2">.stop;</span></p>
+<p class="p2"><br></p>
+<p class="p3">{ <span class="s3">PanAz</span>.ar(4, <span class="s3">ClipNoise</span>.ar, <span class="s3">LFSaw</span>.kr(<span class="s3">SinOsc</span>.ar(0.03) * 1), 0.1) }.play;</p>
+<p class="p2"><br></p>
+<p class="p1"><b><span class="Apple-tab-span">	</span>// stop and start</b></p>
+<p class="p3">z.stop;</p>
+<p class="p3">z.start;</p>
+<p class="p2"><br></p>
+<p class="p1"><b><span class="Apple-tab-span">	</span>*new(locations, server, parent, bounds)</b></p>
+<p class="p1"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><b>locations</b>: positions in space of [-1, 1] for x and y</p>
+<p class="p1"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><b>server</b>: on which server to watch<span class="Apple-tab-span">	</span></p>
+<p class="p1"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><b>parent</b>: which window or view to show on</p>
+<p class="p1"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><b>bounds</b>: view bounds.</p>
+<p class="p2"><br></p>
+<p class="p4"><span class="s2"><span class="Apple-tab-span">	</span></span>// supply locations by hand - 1@1 is left bottom.</p>
+<p class="p3">z = <span class="s3">SpatioScope</span>([ -0.5 @ -0.7, 0.5 @ -0.4, 0.8 @ 0.8, -0.5 @ 0.5, 0@0 ]);<span class="Apple-converted-space"> </span></p>
+<p class="p2"><br></p>
+<p class="p6"><br></p>
+<p class="p1"><b><span class="Apple-tab-span">	</span>*gridPos(numx, numy) <span class="Apple-tab-span">	</span></b>// calculate positions for a grid</p>
+<p class="p1"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><b>numx</b>: number of speakers in the x-direction</p>
+<p class="p1"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><b>numy</b>: number of speakers in the y-direction</p>
+<p class="p6"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span></p>
+<p class="p3"><span class="s3">SpatioScope</span>.gridPos(4,6);</p>
+<p class="p2"><br></p>
+<p class="p6"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span></p>
+<p class="p1"><b><span class="Apple-tab-span">	</span>*grid(numx, numy radius, angleOffset, server, parent, bounds) <span class="Apple-tab-span">	</span></b>// make a SpatioScope for a grid</p>
+<p class="p1"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><b>numx, numy</b> as in *<b>gridPos</b></p>
+<p class="p1"><span class="s4"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span></span><b>server, parent, bounds </b>as in <b>*new</b></p>
+<p class="p6"><br></p>
+<p class="p3">z = <span class="s3">SpatioScope</span>.grid(4,6);</p>
+<p class="p6"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span></p>
+<p class="p1"><b><span class="Apple-tab-span">	</span>*ringPos(num, radius, angleOffset) <span class="Apple-tab-span">	</span></b>// calculate positions for a ring</p>
+<p class="p1"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><b>num</b>: number of speakers in the ring</p>
+<p class="p1"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><b>radius</b>: radius from center</p>
+<p class="p1"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><b>angleOffset</b>: angleOffset of first speaker (0 = right, -0.5pi is top)</p>
+<p class="p2"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span></p>
+<p class="p3"><span class="s3">SpatioScope</span>.ringPos(5);</p>
+<p class="p3"><span class="s3">SpatioScope</span>.ringPos(8);</p>
+<p class="p2"><br></p>
+<p class="p6"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span></p>
+<p class="p1"><b><span class="Apple-tab-span">	</span>*ring(num, radius, angleOffset, server, parent, bounds) <span class="Apple-tab-span">	</span></b>// make a SpatioScope for a ring</p>
+<p class="p1"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><b>num</b>, <b>radius, angleOffset</b> as in *<b>ringPos</b></p>
+<p class="p1"><span class="s4"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span></span><b>server, parent, bounds </b>as in <b>*new</b></p>
+<p class="p2"><br></p>
+<p class="p3">z = <span class="s3">SpatioScope</span>.ring(5);<span class="Apple-tab-span">	</span><span class="s5">// 1 is right</span></p>
+<p class="p3">z = <span class="s3">SpatioScope</span>.ring(8);<span class="Apple-tab-span">	</span>// more speakers</p>
+<p class="p3">z = <span class="s3">SpatioScope</span>.ring(8, 0.8);<span class="Apple-tab-span">	</span>// ring radius</p>
+<p class="p4"><span class="s2">z = </span><span class="s3">SpatioScope</span><span class="s2">.ring(5, 0.5, 0.5pi);<span class="Apple-tab-span">	</span></span>// radius, rotate location clockwise -&gt; bottom</p>
+<p class="p4"><span class="s2">z = </span><span class="s3">SpatioScope</span><span class="s2">.ring(6, 0.5, pi);<span class="Apple-tab-span">	</span></span>// radius, rotate location clockwise -&gt; left</p>
+<p class="p4"><span class="s2">z = </span><span class="s3">SpatioScope</span><span class="s2">.ring(7, 0.5, 1.5pi);<span class="Apple-tab-span">	</span></span>// radius, rotate location clockwise -&gt; top</p>
+<p class="p2"><br></p>
+<p class="p3"><span class="Apple-tab-span">	</span>// ring + subwoofer in center</p>
+<p class="p3">z = <span class="s3">SpatioScope</span>(SpatioScope.ringPos(6, 0.8, pi) ++ [0@0]);<span class="Apple-tab-span">	</span></p>
+<p class="p2"><br></p>
+<p class="p1"><b><span class="Apple-tab-span">	</span>*rings(nums, radii, angleOffsets, server, parent, bounds)</b></p>
+<p class="p1"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>// concentric rings, as in dome-style setups<span class="Apple-converted-space">  </span>(e.g. Animax Bonn, IEM-Cube Graz)</p>
+<p class="p1"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><b>nums</b>: number of speakers in each ring</p>
+<p class="p1"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><b>radii</b>: the radii of each ring (nil distributes the radii between 0 and 1)</p>
+<p class="p1"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><b>angleOffsets</b>: the angle offsets for each ring; if a single value, it applies to all rings.</p>
+<p class="p1"><span class="s4"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span></span><b>server, parent, bounds: </b>as above.</p>
+<p class="p6"><b><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span></b></p>
+<p class="p4"><span class="s2">z = </span><span class="s3">SpatioScope</span><span class="s2">.rings([8, 4]);<span class="Apple-tab-span">	</span></span>// 2 rings, outer ring is lower channels</p>
+<p class="p2"><br></p>
+<p class="p3">z = <span class="s3">SpatioScope</span>.rings([8, 4], <span class="s3">nil</span>, -0.5pi);<span class="Apple-tab-span">	</span><span class="s5">// 1 on top</span></p>
+<p class="p3">z = <span class="s3">SpatioScope</span>.rings([8, 4], [0.4, 0.75]);<span class="Apple-tab-span">	</span><span class="s5">// low chan numbers inside</span></p>
+<p class="p3">z = <span class="s3">SpatioScope</span>.rings([12, 8, 4], <span class="s3">nil</span>, -0.5pi); <span class="s5">// 3 rings</span></p>
+<p class="p2"><br></p>
+<p class="p2"><br></p>
+<p class="p4"><span class="s2"><span class="Apple-tab-span">	</span></span>// roughly the angle offsets for IEM CUBE</p>
+<p class="p3">z = <span class="s3">SpatioScope</span>.rings([12, 8, 4], <span class="s3">nil</span>, (-0.5 + [0, 0.125, 0.25]) * pi);<span class="Apple-converted-space"> </span></p>
+<p class="p2"><br></p>
+<p class="p4"><span class="s2"><span class="Apple-tab-span">	</span></span>// roughly the Animax Dome setup in Bonn</p>
+<p class="p3">z = <span class="s3">SpatioScope</span>.rings([16, 12, 8, 4], <span class="s3">nil</span>, (-0.5 + [0.0625, 0.083, 0.125, 0.25]) * pi);<span class="Apple-converted-space"> </span></p>
+<p class="p2"><br></p>
+<p class="p2"><br></p>
+<p class="p4"><span class="s2"><span class="Apple-tab-span">	</span></span>// test with several sources</p>
+<p class="p5"><span class="s2">{ </span>{ Ringz.ar(Dust2.ar(5), exprand(300, 10000), exprand(0.03, 0.1)) }.dup(12)<span class="s2"> }.play;</span></p>
+<p class="p2"><br></p>
+<p class="p1"><b><span class="Apple-tab-span">	</span>internals:</b></p>
+<p class="p2"><br></p>
+<p class="p3">z.locations<span class="Apple-tab-span">	</span>// knows its locations</p>
+<p class="p3">z.server<span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>// and its server</p>
+<p class="p3">z.numChannels<span class="Apple-tab-span">	</span>// inferred from number of locations</p>
+<p class="p3">z.offset<span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>// zero by default, can be set so that outputs to watch begin at higher channels</p>
+<p class="p3">z.proxy<span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>// a proxy does the amp watching</p>
+<p class="p3">z.resp<span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>// a respondernode listen for the incoming amp values</p>
+<p class="p3">z.skipjack<span class="Apple-tab-span">	</span>// a skipjack restarts the spatioscope after thisProcess.stop</p>
+<p class="p3">z.parent<span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>// its view</p>
+<p class="p2"><br></p>
+<p class="p3">z.offset_(8);</p>
+<p class="p3">z.offset_(0);</p>
+<p class="p2"><br></p>
+<p class="p3"><span class="Apple-tab-span">	</span>// closing the gui and reopening does not work yet. hmmm.</p>
+<p class="p3">z.parent.close;</p>
+<p class="p3">z.gui;</p>
+</body>
+</html>

Added: SpeakersCorner/Help/SpeakerAdjust.html
===================================================================
--- SpeakersCorner/Help/SpeakerAdjust.html	                        (rev 0)
+++ SpeakersCorner/Help/SpeakerAdjust.html	2013-12-26 11:45:56 UTC (rev 2668)
@@ -0,0 +1,154 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd";>
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<meta http-equiv="Content-Style-Type" content="text/css">
+<title></title>
+<meta name="Generator" content="Cocoa HTML Writer">
+<meta name="CocoaVersion" content="949.43">
+<style type="text/css">
+p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Helvetica}
+p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; min-height: 12.0px}
+p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica}
+p.p4 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px}
+p.p5 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco}
+p.p6 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #a91616}
+p.p7 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #0014bc}
+p.p8 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #307109}
+p.p9 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #bf0000}
+p.p10 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #622c2c}
+p.p11 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #622c2c; min-height: 12.0px}
+span.s1 {font: 9.0px Monaco}
+span.s2 {color: #000000}
+span.s3 {color: #307109}
+span.s4 {color: #0014bc}
+span.s5 {color: #5e691f}
+span.s6 {color: #622c2c}
+span.Apple-tab-span {white-space:pre}
+</style>
+</head>
+<body>
+<p class="p1"><b>SpeakerAdjust</b><span class="s1"><span class="Apple-converted-space"> </span></span></p>
+<p class="p2"><br></p>
+<p class="p3"><b>adjusts levels, arrival times, and optional eqalisation bands for multichannel signals.</b></p>
+<p class="p3"><b>Typical use is for multichannel speaker setups.<span class="Apple-converted-space"> </span></b></p>
+<p class="p3"><b>See also Spectralyzer.help for a related tool.<span class="Apple-converted-space"> </span></b></p>
+<p class="p2"><br></p>
+<p class="p2"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span></p>
+<p class="p3"><b><span class="Apple-tab-span">	</span>*ar(ins, specs, vol) <span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span></b>// static settings</p>
+<p class="p3"><b><span class="Apple-tab-span">	</span>ins <span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span></b>an array of audio channels to be processed/adjusted</p>
+<p class="p3"><b><span class="Apple-tab-span">	</span>specs <span class="Apple-tab-span">	</span></b>the adjustment specifications:</p>
+<p class="p3"><b><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span></b>one list for each channel consisting of<span class="Apple-converted-space"> </span></p>
+<p class="p3"><b><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>[ amp, <span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span></b>a multiply factor for this channel,<span class="Apple-converted-space"> </span></p>
+<p class="p3"><b><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-converted-space">  </span>delaytime,<span class="Apple-tab-span">	</span></b>(optional) delay time for this channel (in secs)</p>
+<p class="p4"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-converted-space"> </span></p>
+<p class="p3"><b><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-converted-space">  </span>eqspec1:<span class="Apple-tab-span">	</span></b>(optional) spec for one eq band to use, with values for:</p>
+<p class="p3"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><b>[freq,</b><span class="Apple-tab-span">	</span>frequency,<span class="Apple-converted-space"> </span></p>
+<p class="p3"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><b>db</b>, <span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>gain in db,<span class="Apple-converted-space"> </span></p>
+<p class="p3"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><b>rq]</b>, <span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>reciprocal of Q: bandwidth / cutoffFreq.<span class="Apple-converted-space"> </span></p>
+<p class="p3"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>(1 is wide, 0.1 is narrow).</p>
+<p class="p3"><b><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>eqspec2,<span class="Apple-converted-space"> </span></b></p>
+<p class="p3"><b><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>...</b></p>
+<p class="p3"><b><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>eqspecN</b></p>
+<p class="p3"><b><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>],</b></p>
+<p class="p3"><b><span class="Apple-tab-span">	</span>vol<span class="Apple-tab-span">	</span></b>master volume for all chans, can be used for muting</p>
+<p class="p4"><br></p>
+<p class="p3"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><b>// Caution:</b> not working yet, because default values with Control.names are not correct yet.</p>
+<p class="p3"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>// for the time being, use ar (fix).</p>
+<p class="p3"><b><span class="Apple-tab-span">	</span>*arDyn ( ins, specs, vol)<span class="Apple-converted-space"> </span></b></p>
+<p class="p3"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>same as above, but with adjustable delay times, level and EQ; to be used for tweaking<span class="Apple-converted-space"> </span></p>
+<p class="p3"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>the setup is final.</p>
+<p class="p3"><span class="Apple-tab-span">	</span><span class="Apple-tab-span">	</span>This is slightly more efficient than creating control inputs on all parameters.</p>
+<p class="p4"><br></p>
+<p class="p4"><b><span class="Apple-tab-span">	</span></b></p>
+<p class="p3"><b><span class="Apple-tab-span">	</span>Recommended use: put a function for speaker adjustment in a MasterFX chain,<span class="Apple-converted-space"> </span></b></p>
+<p class="p3"><b><span class="Apple-tab-span">	</span>where it is guaranteed to run post all other sounds, and wake up after Cmd-period.</b></p>
+<p class="p4"><b><span class="Apple-tab-span">	</span></b></p>
+<p class="p5">s.boot;<span class="Apple-converted-space"> </span></p>
+<p class="p2"><br></p>
+<p class="p5"><span class="Apple-tab-span">	</span>// ... full short example here, e.g. 6 chans, amp, delay, 2 bands eq each.</p>
+<p class="p2"><br></p>
+<p class="p2"><br></p>

@@ Diff output truncated at 100000 characters. @@
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.


_______________________________________________
sc-dev mailing list

info (subscription, etc.): http://www.beast.bham.ac.uk/research/sc_mailing_lists.shtml
archive: https://listarc.bham.ac.uk/marchives/sc-dev/
search: https://listarc.bham.ac.uk/lists/sc-dev/search/