[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[sc-dev] SF.net SVN: quarks:[2668] SpeakersCorner
- To: sc-dev@xxxxxxxxxxxxxxxx
- Subject: [sc-dev] SF.net SVN: quarks:[2668] SpeakersCorner
- From: decampo@xxxxxxxxxxxxxxxxxxxxx
- Date: Thu, 26 Dec 2013 11:45:57 +0000
- Dkim-signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sourceforge.net; s=x; h=Content-Transfer-Encoding:Content-Type:Subject:To:From:MIME-Version:Date; bh=i5GDGBZNwz9K9Oif5j2O6Bcas+d8vmbXxLHEDDCmeM8=; b=YUJy+X1uF2tOUi5zNt2UFl5Juck1xPljzaC2zGVJAxxXdy8qcxouSA9SEJ1rwHz1OBfvPZXv0RF2bVGVBkA6u30fj+lQBauJb0MkD+7a8xyY6kn0KWxy2AgDICiteMX7MCxFZz/iTpuNWqJo9X8fyfGuS3wYxkyoQ7EqQQ9rdDg=;
- Dkim-signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sf.net; s=x; h=Content-Transfer-Encoding:Content-Type:Subject:To:From:MIME-Version:Date; bh=i5GDGBZNwz9K9Oif5j2O6Bcas+d8vmbXxLHEDDCmeM8=; b=HX2+bmj6JW3I54QuRtSPkE4xgEhYiUjMJpVviiLirSVnmG5Kw94PY6PenTbPWZaB339BN9rFRvkx/EMQ1IF1nt/vpWdnXYgjAgmHGMjmF/h7bb9gBlSF5ue8b/H6iNxPnUHv+FIUNYPb/oCYgs8znoUddgdiYoJ35eNFESTG0Wc=;
- List-id: SuperCollider developers mailing list <sc-devel.create.ucsb.edu>
- Reply-to: sc-dev@xxxxxxxxxxxxxxxx
- Sender: owner-sc-dev@xxxxxxxxxxxxxxxx
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 <numCombs> (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 <nOuts> 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 <numAllpasses> 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><nOuts> 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> -> { <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"> -> { </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"> -> { </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"> -> { </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 -> 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 -> 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 -> 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/