SF.net SVN: supercollider: [7689] trunk/build

View: New views
1 Messages — Rating Filter:   Alert me  

SF.net SVN: supercollider: [7689] trunk/build

by cruxxial :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Revision: 7689
          http://supercollider.svn.sourceforge.net/supercollider/?rev=7689&view=rev
Author:   cruxxial
Date:     2008-07-15 17:44:37 -0700 (Tue, 15 Jul 2008)

Log Message:
-----------
AbstractPlayer
        -copy returns a copy stripped of any vars related to the patch out or the server or current state.  its a pure musical sound definition object, no runtime stuff.
 
Editors
        - copy returns a new object with the value copied
NumberEditor
        - no longer need to send .changed to an Editor before it updates the gui or updates the server.

PlayerSocket
        - support kr rate players now
        - added an optional limiter
        - server sends a message when the socket is blown by nan or inf
                player socket sends .changed(\fuseDidBlow) when it blows
                by default it posts a message

EnvelopedPlayer
        sends a message from the server when the fuse is blown
        onFuseBlown handler
 
Patch
        can access inputs by eg.  patch.freq

BusDriver
        becomes a non-abstract class, similar to KrNumberEditor
        but it owns (and drives) a Bus

Instr
         copy return self since the same name is always the same instr
        clearer gui
        UGenInstr-initAt - fixed specs checking bug

Modified Paths:
--------------
    trunk/build/Help/Libraries/crucial/Editors/KrNumberEditor.html
    trunk/build/Help/Libraries/crucial/Instr/Patch.html
    trunk/build/Help/Libraries/crucial/Players/InstrGateSpawner.html
    trunk/build/SCClassLibrary/crucial/Editors/EnvEditor.sc
    trunk/build/SCClassLibrary/crucial/Editors/NumberEditor.sc
    trunk/build/SCClassLibrary/crucial/Instr/Instr.sc
    trunk/build/SCClassLibrary/crucial/Instr/Patch.sc
    trunk/build/SCClassLibrary/crucial/Players/PlayerSocket.sc
    trunk/build/SCClassLibrary/crucial/Players/SimplePlayerEffect.sc
    trunk/build/SCClassLibrary/crucial/Sequencers/BusDriver.sc

Modified: trunk/build/Help/Libraries/crucial/Editors/KrNumberEditor.html
===================================================================
--- trunk/build/Help/Libraries/crucial/Editors/KrNumberEditor.html 2008-07-15 22:05:41 UTC (rev 7688)
+++ trunk/build/Help/Libraries/crucial/Editors/KrNumberEditor.html 2008-07-16 00:44:37 UTC (rev 7689)
@@ -11,16 +11,22 @@
 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: 14.0px Helvetica}
 p.p4 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica}
-p.p5 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #0000bf}
-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}
+p.p5 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #0013bb}
+p.p6 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco}
+p.p7 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; min-height: 12.0px}
+p.p8 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #a8220e}
 p.p9 {margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Helvetica; min-height: 17.0px}
 p.p10 {margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; min-height: 14.0px}
-p.p11 {margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; color: #942b17; min-height: 14.0px}
-p.p12 {margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Helvetica; color: #000000}
+p.p11 {margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; color: #84331b; min-height: 14.0px}
+p.p12 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #0000bf}
+p.p13 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #000000}
+p.p14 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #000000; min-height: 12.0px}
+p.p15 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #bf0000; min-height: 12.0px}
+p.p16 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #bf0000}
 span.s1 {color: #000000}
-span.s2 {color: #007300}
+span.s2 {color: #316f11}
+span.s3 {color: #007300}
+span.s4 {color: #0000bf}
 </style>
 </head>
 <body>
@@ -34,45 +40,43 @@
 <p class="p6">k.gui</p>
 <p class="p7"><br></p>
 <p class="p6">k.value = 100</p>
-<p class="p6">k.changed</p>
 <p class="p7"><br></p>
 <p class="p6">k.rand</p>
 <p class="p7"><br></p>
 <p class="p8">// 0..1<span class="Apple-converted-space">  </span>mapped to the \freq range</p>
 <p class="p6">k.setUnmappedValue(0.5)</p>
 <p class="p7"><br></p>
-<p class="p9"><b></b><br></p>
-<p class="p9"><b></b><br></p>
+<p class="p9"><br></p>
+<p class="p9"><br></p>
 <p class="p3"><b>Internals</b></p>
 <p class="p9"><br></p>
-<p class="p4">if a KrNumberEditor is in a Patch, and that Patch is playing on a server, the message to the server happens when the KrNumberEditor gets the .changed message and sends .update to all its depedants.<span class="Apple-converted-space">  </span>This includes any NumberEditorGui and also any UpdatingScalarPatchOut, which is what actually sends the message to the server.</p>
+<p class="p4">if a KrNumberEditor is in a Patch, and that Patch is playing on a server, the message to the server happens when the KrNumberEditor gets the .changed message and sends .update to all its depedants.<span class="Apple-converted-space">  </span>This includes any <b>NumberEditorGui</b> and also any <b>UpdatingScalarPatchOut</b>, <i>which is what actually sends the message to the server</i>.</p>
 <p class="p10"><br></p>
 <p class="p10"><br></p>
 <p class="p11"><br></p>
 <p class="p10"><br></p>
-<p class="p12"><b>Lag</b></p>
+<p class="p3"><b>Lag</b></p>
 <p class="p2"><br></p>
 <p class="p4">KrNumberEditors<span class="Apple-converted-space">  </span>support lag.<span class="Apple-converted-space">  </span>This means that the control messages received by the Synth are smoothed by a Lag.kr<span class="Apple-converted-space">  </span>You can set lag to nil for no Lag.</p>
 <p class="p2"><br></p>
-<p class="p4">k = KrNumberEditor(0,\loop);</p>
-<p class="p4">k.lag = nil;</p>
+<p class="p12"><span class="s1">k = </span>KrNumberEditor<span class="s1">(0,</span><span class="s3">\loop</span><span class="s1">);</span></p>
+<p class="p13">k.lag = <span class="s4">nil</span>;</p>
 <p class="p2"><br></p>
 <p class="p2"><br></p>
 <p class="p4">Alternatively see NoLagControlSpec, whose defaultControl sets the lag to nil.</p>
 <p class="p2"><br></p>
-<p class="p4">k = KrNumberEditor(0, NoLagControlSpec(0,1) );</p>
+<p class="p12"><span class="s1">k = </span>KrNumberEditor<span class="s1">(0, </span>NoLagControlSpec<span class="s1">(0,1) );</span></p>
+<p class="p14"><br></p>
+<p class="p4">the keys \binary, \loop (as looked up in the Spec dictionary)<span class="Apple-converted-space">  </span>are registred as NoLagControlSpec, and thus don't use any lag at all.</p>
+<p class="p15"><br></p>
+<p class="p16">// \loop is defined by default as a no lag control spec</p>
+<p class="p13"><span class="s3">\loop</span>.asSpec.defaultControl.insp</p>
 <p class="p2"><br></p>
-<p class="p4">// lag is set to nil</p>
-<p class="p4">\loop.asSpec.defaultControl.insp</p>
 <p class="p2"><br></p>
-<p class="p2"><br></p>
 <p class="p4">I would prefer to just have a lag preference in ControlSpec</p>
 <p class="p4">(clients that do lag eg. sliders can tell from the spec if they should do lag or not).</p>
 <p class="p2"><br></p>
-<p class="p4">as Jan pointed out a while ago, binary things don't like lag.</p>
 <p class="p2"><br></p>
-<p class="p4">the keys \binary, \loop (as looked up in the Spec dictionary)<span class="Apple-converted-space">  </span>are registred as NoLagControlSpec, and thus don't use any lag at all.</p>
-<p class="p2"><br></p>
 <p class="p4">You can register others, or use a NoLagControlSpec when writing the Instr.</p>
 <p class="p2"><br></p>
 </body>

Modified: trunk/build/Help/Libraries/crucial/Instr/Patch.html
===================================================================
--- trunk/build/Help/Libraries/crucial/Instr/Patch.html 2008-07-15 22:05:41 UTC (rev 7688)
+++ trunk/build/Help/Libraries/crucial/Instr/Patch.html 2008-07-16 00:44:37 UTC (rev 7689)
@@ -12,44 +12,44 @@
 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: #783a1d}
-p.p7 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #5e4025}
+p.p6 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #6e3d20}
+p.p7 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #594127}
 p.p8 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Lucida Grande; min-height: 15.0px}
-p.p9 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #952e14}
-p.p10 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #1731a0}
+p.p9 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #853519}
+p.p10 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #1b339d}
 p.p11 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Lucida Grande}
-p.p12 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #5f6430}
-p.p13 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #436c19}
+p.p12 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #606333}
+p.p13 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #4e6a1f}
 p.p14 {margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Helvetica; min-height: 17.0px}
-p.p15 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #5f6430; min-height: 12.0px}
-p.p16 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #853519}
-p.p17 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #001bb7}
-p.p18 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #5e4025; min-height: 12.0px}
-p.p19 {margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Helvetica; color: #000000}
-p.p20 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; color: #000000; min-height: 14.0px}
-p.p21 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; color: #000000}
-p.p22 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #000000; min-height: 12.0px}
-p.p23 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #000000}
-p.p24 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #606060}
-p.p25 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #0000bf}
-p.p26 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Arial; color: #000000; min-height: 14.0px}
-p.p27 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Arial; color: #000000}
-p.p28 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; color: #0018e8}
-span.s1 {color: #0025f3}
-span.s2 {color: #0626af}
-span.s3 {color: #556824}
+p.p15 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #606333; min-height: 12.0px}
+p.p16 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #783a1d}
+p.p17 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #000000; 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 0.0px; font: 9.0px Monaco; color: #bf0000}
+p.p20 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #bf0000; min-height: 12.0px}
+p.p21 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #0000bf}
+p.p22 {margin: 0.0px 0.0px 0.0px 0.0px; font: 15.0px Helvetica}
+p.p23 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #606060}
+p.p24 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #0013bb}
+p.p25 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Arial}
+p.p26 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Arial; min-height: 14.0px}
+p.p27 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; color: #0018e8}
+span.s1 {color: #002ded}
+span.s2 {color: #0b2aab}
+span.s3 {color: #5a6628}
 span.s4 {color: #000000}
-span.s5 {color: #001bb7}
-span.s6 {color: #436c19}
-span.s7 {color: #1731a0}
+span.s5 {color: #0021b3}
+span.s6 {color: #4e6a1f}
+span.s7 {color: #1b339d}
 span.s8 {color: #606060}
-span.s9 {color: #5f6430}
-span.s10 {text-decoration: underline ; color: #0022e3}
-span.s11 {color: #0021b3}
-span.s12 {color: #4e6a1f}
+span.s9 {color: #606333}
+span.s10 {text-decoration: underline ; color: #0029de}
+span.s11 {color: #0626af}
+span.s12 {color: #556824}
 span.s13 {color: #0000bf}
 span.s14 {color: #007300}
-span.s15 {font: 12.0px Helvetica}
+span.s15 {color: #0013bb}
+span.s16 {font: 12.0px Helvetica}
 span.Apple-tab-span {white-space:pre}
 </style>
 </head>
@@ -304,7 +304,7 @@
 <p class="p3">Note that the Patch would assume upDown to be a modulatable control input (with a default of 0.0) without the StaticIntegerSpec making it clear that its a static integer.</p>
 <p class="p2"><br></p>
 <p class="p2"><br></p>
-<p class="p3"><b>Busses</b></p>
+<p class="p3"><b>Busses and Groups</b></p>
 <p class="p5">(</p>
 <p class="p2"><br></p>
 <p class="p5">s.boot;</p>
@@ -328,113 +328,129 @@
 <p class="p2"><br></p>
 <p class="p2"><br></p>
 <p class="p5">z = <span class="s11">Patch</span>({<span class="Apple-tab-span"> </span><span class="s11">Saw</span>.ar(500) * 0.1<span class="Apple-converted-space">  </span>}).play(group: a, bus: c );</p>
+<p class="p2"><br></p>
+<p class="p5">z.bus</p>
+<p class="p5">z.synth</p>
+<p class="p5">z.group</p>
+<p class="p5">z.server</p>
+<p class="p2"><br></p>
 <p class="p5">z.stop;</p>
 <p class="p2"><br></p>
 <p class="p5">y.stop;</p>
 <p class="p2"><br></p>
 <p class="p5">)</p>
+<p class="p5">// z and y are now stopped by p is still playing</p>
 <p class="p2"><br></p>
-<p class="p16">// you can make the bus play to a main audio output</p>
+<p class="p16">// c is a Bus object</p>
+<p class="p16">c</p>
+<p class="p16"><span class="s4">//</span> play c ontto a main audio output</p>
 <p class="p5">c.play</p>
 <p class="p2"><br></p>
-<p class="p16">//command-. to stop all</p>
+<p class="p16">//use command-. to stop all</p>
 <p class="p2"><br></p>
+<p class="p17"><br></p>
+<p class="p17"><br></p>
+<p class="p18">(</p>
+<p class="p18">s.boot;</p>
+<p class="p17"><br></p>
+<p class="p18">a = <span class="s13">Group</span>.new;</p>
+<p class="p17"><br></p>
+<p class="p18">b = <span class="s13">Group</span>.after(a);</p>
+<p class="p17"><br></p>
+<p class="p19">// no index, not yet allocated</p>
+<p class="p18">c = <span class="s13">Bus</span>(<span class="s14">\audio</span>,<span class="s13">nil</span>,2);</p>
+<p class="p17"><br></p>
+<p class="p18">y = <span class="s13">Patch</span>({ <span class="s13">arg</span> in,ffreq;</p>
+<p class="p18"><span class="Apple-tab-span"> </span><span class="s13">LPF</span>.ar(in,ffreq)</p>
+<p class="p18">},[</p>
+<p class="p19"><span class="s4"><span class="Apple-tab-span"> </span>c, </span>// a proxy, the bus is yet to be allocated</p>
+<p class="p18"><span class="Apple-tab-span"> </span><span class="s13">KrNumberEditor</span>(3000,[200,8000,<span class="s14">\exp</span>])</p>
+<p class="p18">]).play(group: b);</p>
+<p class="p17"><br></p>
+<p class="p19">// now that the patch has played, the bus allocated itself</p>
+<p class="p18">c.insp</p>
+<p class="p17"><br></p>
+<p class="p19">// play onto this bus in a group before that of the filter</p>
+<p class="p18">z = <span class="s13">Patch</span>({<span class="Apple-tab-span"> </span><span class="s13">Saw</span>.ar([400,401]) * 0.1<span class="Apple-converted-space">  </span>}).play(group: a, bus: c )</p>
 <p class="p2"><br></p>
-<p class="p5">(</p>
-<p class="p5">s.boot;</p>
 <p class="p2"><br></p>
-<p class="p5">a = <span class="s11">Group</span>.new;</p>
-<p class="p2"><br></p>
-<p class="p5">b = <span class="s11">Group</span>.after(a);</p>
-<p class="p2"><br></p>
-<p class="p16">// no index, not yet allocated</p>
-<p class="p5">c = <span class="s11">Bus</span>(<span class="s12">\audio</span>,<span class="s11">nil</span>,2);</p>
-<p class="p2"><br></p>
-<p class="p5">y = <span class="s11">Patch</span>({ <span class="s11">arg</span> in,ffreq;</p>
-<p class="p5"><span class="Apple-tab-span"> </span><span class="s11">LPF</span>.ar(in,ffreq)</p>
-<p class="p5">},[</p>
-<p class="p16"><span class="s4"><span class="Apple-tab-span"> </span>c, </span>// a proxy, the bus is yet to be allocated</p>
-<p class="p5"><span class="Apple-tab-span"> </span><span class="s11">KrNumberEditor</span>(3000,[200,8000,<span class="s12">\exp</span>])</p>
-<p class="p5">]).play(group: b);</p>
-<p class="p2"><br></p>
-<p class="p16">// now that the patch has played, the bus allocated itself</p>
-<p class="p5">c.insp</p>
-<p class="p2"><br></p>
-<p class="p16">// play onto this bus in a group before that of the filter</p>
-<p class="p5">z = <span class="s11">Patch</span>({<span class="Apple-tab-span"> </span><span class="s11">Saw</span>.ar([400,401]) * 0.1<span class="Apple-converted-space">  </span>}).play(group: a, bus: c )</p>
-<p class="p2"><br></p>
-<p class="p2"><br></p>
+<p class="p3"><b>Automagic setter for the inputs of the Patch</b></p>
 <p class="p3"><b>Sending controllers to the Patch while its playing</b></p>
-<p class="p3"><b>Remapping the Bus while its playing</b></p>
-<p class="p4"><br></p>
+<p class="p4"><b></b><br></p>
 <p class="p2"><br></p>
-<p class="p5">p = <span class="s11">Patch</span>({ <span class="s11">arg</span> freq=440; <span class="s11">SinOsc</span>.ar( freq ) });</p>
-<p class="p16">// with no args supplied, a KrNumberEditor was made as input for \freq</p>
-<p class="p5">p.args.dump;</p>
-<p class="p5">p.play</p>
+<p class="p18">p = <span class="s13">Patch</span>({ <span class="s13">arg</span> freq=440; <span class="s13">SinOsc</span>.ar( freq ) });</p>
+<p class="p19">// with no args supplied, a KrNumberEditor was made as input for \freq</p>
+<p class="p18">p.args.dump;</p>
+<p class="p17"><br></p>
+<p class="p17"><br></p>
+<p class="p18">p.play</p>
+<p class="p17"><br></p>
+<p class="p20"><br></p>
+<p class="p19">// each arg name automagically becomes an attribute of the patch object</p>
+<p class="p5">p.freq</p>
 <p class="p2"><br></p>
-<p class="p16">// looks for the input for the 'freq' arg</p>
-<p class="p16">// and sends it the .set(500) message if it responds to that</p>
-<p class="p5">p.set(<span class="s12">\freq</span>, 500)</p>
-<p class="p2"><br></p>
-<p class="p16">// change the bus</p>
-<p class="p5">p.bus = 3</p>
+<p class="p19">// set its value</p>
+<p class="p5">p.freq.value = 300</p>
+<p class="p17"><br></p>
+<p class="p17"><br></p>
+<p class="p19">// look for the input for the 'freq' arg</p>
+<p class="p19">// and sends it the .set(500) message if it responds to that</p>
+<p class="p18">p.set(<span class="s14">\freq</span>, 500)</p>
+<p class="p17"><br></p>
+<p class="p17"><br></p>
+<p class="p17"><br></p>
 <p class="p14"><br></p>
-<p class="p16">// change it back</p>
-<p class="p5">p.bus = 0</p>
-<p class="p14"><br></p>
-<p class="p14"><br></p>
 <p class="p2"><br></p>
 <p class="p2"><br></p>
 <p class="p3">Quite apart from Patch, you can use a spec to map a signal from a 0..1 range to the range of the spec :</p>
+<p class="p17"><br></p>
+<p class="p18">(</p>
+<p class="p18"><span class="s13">var</span> spec;</p>
+<p class="p18">spec = [ 100,18000,<span class="s14">\exp</span>].asSpec;</p>
+<p class="p17"><br></p>
+<p class="p18">{</p>
+<p class="p21"><span class="s4"><span class="Apple-tab-span"> </span></span>SinOsc<span class="s4">.ar(</span></p>
+<p class="p19"><span class="s4"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span>// creates a BinaryOpUGen</p>
+<p class="p18"><span class="Apple-tab-span"> </span><span class="Apple-converted-space">  </span>spec.map(<span class="Apple-converted-space">  </span><span class="s13">SinOsc</span>.kr(0.1).range(0,1) ).dump</p>
+<p class="p18"><span class="Apple-tab-span"> </span>)</p>
+<p class="p18">}.play</p>
+<p class="p17"><br></p>
+<p class="p18">)</p>
 <p class="p2"><br></p>
-<p class="p5">(</p>
-<p class="p5"><span class="s7">var</span> spec;</p>
-<p class="p5">spec = [ 100,18000,<span class="s9">\exp</span>].asSpec;</p>
 <p class="p2"><br></p>
-<p class="p5">{</p>
-<p class="p10"><span class="Apple-tab-span"> </span>SinOsc<span class="s4">.ar(</span></p>
-<p class="p5"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span>// creates a BinaryOpUGen</p>
-<p class="p5"><span class="s7"><span class="Apple-tab-span"> </span></span><span class="Apple-converted-space">  </span>spec.map(<span class="Apple-converted-space">  </span><span class="s7">SinOsc</span>.kr(0.1).range(0,1) ).dump</p>
-<p class="p5"><span class="Apple-tab-span"> </span>)</p>
-<p class="p5">}.play</p>
-<p class="p2"><br></p>
-<p class="p5">)</p>
-<p class="p2"><br></p>
-<p class="p2"><br></p>
 <p class="p3">you can also do that with a Patch, supplying the resulting function as an input to the patch:</p>
 <p class="p2"><br></p>
-<p class="p5">(</p>
-<p class="p5"><span class="s5">var</span> spec;</p>
-<p class="p5">spec = [ 100,18000,<span class="s6">\exp</span>].asSpec;</p>
-<p class="p2"><br></p>
-<p class="p5"><span class="s5">Patch</span>({ <span class="s5">arg</span> freq;</p>
-<p class="p5"><span class="Apple-tab-span"> </span><span class="s5">SinOsc</span>.ar(freq)</p>
-<p class="p5">},[</p>
-<p class="p9"><span class="s4"><span class="Apple-tab-span"> </span></span>// creates a BinaryOpFunction</p>
-<p class="p5"><span class="Apple-converted-space">    </span>spec.map( { <span class="s5">SinOsc</span>.kr(0.1).range(0,1) } ).dump</p>
-<p class="p5">]).play</p>
-<p class="p5">)</p>
-<p class="p2"><br></p>
+<p class="p18">(</p>
+<p class="p18"><span class="s13">var</span> spec;</p>
+<p class="p18">spec = [ 100,18000,<span class="s14">\exp</span>].asSpec;</p>
+<p class="p17"><br></p>
+<p class="p18"><span class="s13">Patch</span>({ <span class="s13">arg</span> freq;</p>
+<p class="p18"><span class="Apple-tab-span"> </span><span class="s13">SinOsc</span>.ar(freq)</p>
+<p class="p18">},[</p>
+<p class="p19"><span class="s4"><span class="Apple-tab-span"> </span></span>// creates a BinaryOpFunction</p>
+<p class="p18"><span class="Apple-converted-space">    </span>spec.map( { <span class="s13">SinOsc</span>.kr(0.1).range(0,1) } ).dump</p>
+<p class="p18">]).play</p>
+<p class="p18">)</p>
+<p class="p17"><br></p>
 <p class="p14"><br></p>
 <p class="p3">A Patch is subclass of AbstractPlayer which is a subclass of AbstractFunction.</p>
 <p class="p4"><br></p>
 <p class="p3">Because a Player IS A FUNCTION, a Spec may also be used to map another player's output and then use that as an input to a patch :</p>
 <p class="p2"><br></p>
-<p class="p5">(</p>
-<p class="p5"><span class="s5">var</span> spec;</p>
-<p class="p5">spec = [ 100,18000,<span class="s6">\exp</span>].asSpec;</p>
+<p class="p18">(</p>
+<p class="p18"><span class="s13">var</span> spec;</p>
+<p class="p18">spec = [ 100,18000,<span class="s14">\exp</span>].asSpec;</p>
+<p class="p17"><br></p>
+<p class="p18"><span class="s13">Patch</span>({ <span class="s13">arg</span> freq;</p>
+<p class="p18"><span class="Apple-tab-span"> </span><span class="s13">SinOsc</span>.ar(freq)</p>
+<p class="p18">},[</p>
+<p class="p19"><span class="s4"><span class="Apple-tab-span"> </span></span>// a BinaryOpFunction</p>
+<p class="p18"><span class="Apple-converted-space">    </span>spec.map( <span class="s13">Patch</span>({ <span class="s13">SinOsc</span>.kr(0.1).range(0,1) }) ).debug</p>
+<p class="p18">]).play</p>
+<p class="p17"><br></p>
+<p class="p18">)</p>
 <p class="p2"><br></p>
-<p class="p5"><span class="s5">Patch</span>({ <span class="s5">arg</span> freq;</p>
-<p class="p5"><span class="Apple-tab-span"> </span><span class="s5">SinOsc</span>.ar(freq)</p>
-<p class="p5">},[</p>
-<p class="p9"><span class="s4"><span class="Apple-tab-span"> </span></span>// a BinaryOpFunction</p>
-<p class="p5"><span class="Apple-converted-space">    </span>spec.map( <span class="s5">Patch</span>({ <span class="s5">SinOsc</span>.kr(0.1).range(0,1) }) ).debug</p>
-<p class="p5">]).play</p>
 <p class="p2"><br></p>
-<p class="p5">)</p>
-<p class="p2"><br></p>
-<p class="p2"><br></p>
 <p class="p4"><br></p>
 <p class="p3">spec.map is taking the player</p>
 <p class="p3">and creating a BinaryOpFunction out of it.</p>
@@ -451,9 +467,9 @@
 <p class="p5">(<span class="s5">Patch</span>({ <span class="s5">SinOsc</span>.ar(440) }) * 0.1).play</p>
 <p class="p2"><br></p>
 <p class="p3">where the output of the Patch is multiplied by 0.1, reducing the amplitude.</p>
-<p class="p3">Internal optimization results in using a PlayerAmp</p>
+<p class="p3">Internal optimization in this case results in using a PlayerAmp</p>
 <p class="p2"><br></p>
-<p class="p9">// not yet implemented :(</p>
+<p class="p9">// true binary op players not yet implemented :(</p>
 <p class="p5">(<span class="s5">Patch</span>({<span class="s5">SinOsc</span>.ar(440) }) % 0.4).play</p>
 <p class="p2"><br></p>
 <p class="p2"><br></p>
@@ -461,115 +477,125 @@
 <p class="p2"><br></p>
 <p class="p3"><b>Spawning</b></p>
 <p class="p2"><br></p>
-<p class="p5">(</p>
+<p class="p18">(</p>
+<p class="p17"><br></p>
+<p class="p18">a = <span class="s13">Patch</span>({</p>
+<p class="p18"><span class="Apple-tab-span"> </span><span class="s13">SinOsc</span>.ar(800,0.0)</p>
+<p class="p18">});</p>
+<p class="p17"><br></p>
+<p class="p17"><br></p>
+<p class="p18">c = <span class="s13">Bus</span>.audio;</p>
+<p class="p18">a.play(bus: c);</p>
+<p class="p19">// a is now playing on bus c, which we can't hear</p>
+<p class="p17"><br></p>
+<p class="p19">// patch b will listen to buss c and play one enveloped grain</p>
+<p class="p18">b = <span class="s13">Patch</span>({ <span class="s13">arg</span> tone;</p>
+<p class="p18"><span class="Apple-tab-span"> </span><span class="s13">var</span> gate;</p>
+<p class="p18"><span class="Apple-tab-span"> </span>gate = <span class="s13">Trig1</span>.kr(1.0,0.25);</p>
+<p class="p18"><span class="Apple-tab-span"> </span>tone = <span class="s13">In</span>.ar(tone,1);</p>
+<p class="p18"><span class="Apple-tab-span"> </span>tone * <span class="s13">EnvGen</span>.kr(<span class="s13">Env</span>([0,1,0],[0.05,0.05],<span class="s14">\welch</span>,1),gate,doneAction: 2)</p>
+<p class="p18">},[</p>
+<p class="p18"><span class="Apple-tab-span"> </span>c.index</p>
+<p class="p18">]);</p>
+<p class="p17"><br></p>
+<p class="p18">b.prepareForPlay(s);</p>
+<p class="p17"><br></p>
+<p class="p19">// play one grain</p>
+<p class="p18">b.spawn(atTime: 0.1);</p>
+<p class="p17"><br></p>
+<p class="p19">// play 100 grains</p>
+<p class="p21">Routine<span class="s4">({</span></p>
+<p class="p18"><span class="Apple-tab-span"> </span>1.0.wait;</p>
+<p class="p18"><span class="Apple-tab-span"> </span>100.do({</p>
+<p class="p18"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span>b.spawn(atTime: 0.1);</p>
+<p class="p18"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span>0.25.wait</p>
+<p class="p18"><span class="Apple-tab-span"> </span>})</p>
+<p class="p21"><span class="s4">}).play(</span>SystemClock<span class="s4">)</span></p>
+<p class="p17"><br></p>
+<p class="p18">)</p>
+<p class="p17"><br></p>
 <p class="p2"><br></p>
-<p class="p5">a = <span class="s11">Patch</span>({</p>
-<p class="p5"><span class="Apple-tab-span"> </span><span class="s11">SinOsc</span>.ar(800,0.0)</p>
-<p class="p5">});</p>
 <p class="p2"><br></p>
+<p class="p22"><b>Extra capabilities</b></p>
+<p class="p4"><br></p>
+<p class="p3">Because the Patch manages the creation of the SynthDef and also manages the Synth that is created at the time of play, it is possible to do some tricks that make client-server communication a bit easier. <span class="Apple-converted-space"> </span></p>
+<p class="p4"><br></p>
+<p class="p3">Keep in mind that when the sc lang code that is inside a SynthDef or an Instr is run when the the SynthDef or InstrSynthDef is compiled.<span class="Apple-converted-space">  </span>Its compiled into bytecode that is then sent to the server but then when the synth itself runs there is no sc language.<span class="Apple-converted-space">  </span>There are no functions or 'if' statements.</p>
+<p class="p4"><br></p>
+<p class="p3">So once you have that concept clear in your head, here's how to violate it.</p>
 <p class="p2"><br></p>
-<p class="p5">c = <span class="s5">Bus</span>.audio;</p>
-<p class="p5">a.play(bus: c);</p>
-<p class="p9">// a is now playing on bus c, which we can't hear</p>
 <p class="p2"><br></p>
-<p class="p9">// patch b will listen to buss c and play one enveloped grain</p>
-<p class="p5">b = <span class="s5">Patch</span>({ <span class="s5">arg</span> tone;</p>
-<p class="p5"><span class="Apple-tab-span"> </span><span class="s5">var</span> gate;</p>
-<p class="p5"><span class="Apple-tab-span"> </span>gate = <span class="s5">Trig1</span>.kr(1.0,0.25);</p>
-<p class="p5"><span class="Apple-tab-span"> </span>tone = <span class="s5">In</span>.ar(tone,1);</p>
-<p class="p5"><span class="Apple-tab-span"> </span>tone * <span class="s5">EnvGen</span>.kr(<span class="s5">Env</span>([0,1,0],[0.05,0.05],<span class="s6">\welch</span>,1),gate,doneAction: 2)</p>
-<p class="p5">},[</p>
-<p class="p5"><span class="Apple-tab-span"> </span>c.index</p>
-<p class="p5">]);</p>
+<p class="p3"><b>UGen:onTrig(function,value)</b></p>
+<p class="p2"><span class="Apple-tab-span"> </span></p>
+<p class="p5"><span class="Apple-tab-span"> </span>trigger.onTrig({ <span class="s15">|time,value|</span></p>
+<p class="p23"><span class="s4"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span>"did trig"<span class="s4">.postln</span></p>
+<p class="p5"><span class="Apple-tab-span"> </span>})</p>
 <p class="p2"><br></p>
-<p class="p5">b.prepareForPlay(s);</p>
+<p class="p3">On receiving a trigger (a non-positive to positive transition) evaluate the function IN THE CLIENT LANGUAGE.<span class="Apple-converted-space">  </span>A value may also be passed in which will be polled and passed to the function.</p>
 <p class="p2"><br></p>
-<p class="p9">// play one grain</p>
-<p class="p5">b.spawn(atTime: 0.1);</p>
+<p class="p5">(</p>
+<p class="p24">Patch<span class="s4">({ </span>|freq=200|</p>
+<p class="p5"><span class="Apple-tab-span"> </span>var out;</p>
+<p class="p2"><span class="Apple-tab-span"> </span></p>
+<p class="p5"><span class="Apple-tab-span"> </span>out = <span class="s15">LFSaw</span>.ar(freq);</p>
+<p class="p2"><span class="Apple-tab-span"> </span></p>
+<p class="p5"><span class="Apple-tab-span"> </span>(<span class="s15">Dust</span>.kr(0.3)).onTrig({ <span class="s15">|time,value|</span></p>
+<p class="p5"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span>[<span class="s8">"dusty"</span>,time,value].postln</p>
+<p class="p5"><span class="Apple-tab-span"> </span>},<span class="s15">out</span>); // this value will be polled anytime the trig goes</p>
+<p class="p2"><span class="Apple-tab-span"> </span></p>
+<p class="p5"><span class="Apple-tab-span"> </span>out * 0.1<span class="Apple-tab-span"> </span></p>
 <p class="p2"><br></p>
-<p class="p9">// play 100 grains</p>
-<p class="p17">Routine<span class="s4">({</span></p>
-<p class="p5"><span class="Apple-tab-span"> </span>1.0.wait;</p>
-<p class="p5"><span class="Apple-tab-span"> </span>100.do({</p>
-<p class="p5"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span>b.spawn(atTime: 0.1);</p>
-<p class="p5"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span>0.25.wait</p>
-<p class="p5"><span class="Apple-tab-span"> </span>})</p>
-<p class="p17"><span class="s4">}).play(</span>SystemClock<span class="s4">)</span></p>
-<p class="p18"><br></p>
+<p class="p5">}).play</p>
+<p class="p2"><br></p>
 <p class="p5">)</p>
 <p class="p2"><br></p>
+<p class="p5">(</p>
+<p class="p24"><span class="s4">p = </span>Patch<span class="s4">({ </span>|freq=200|</p>
 <p class="p2"><br></p>
+<p class="p5"><span class="Apple-tab-span"> </span>(freq >= 300).onTrig({</p>
+<p class="p23"><span class="s4"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span>"GREATER !"<span class="s4">.postln</span></p>
+<p class="p5"><span class="Apple-tab-span"> </span>});</p>
+<p class="p2"><span class="Apple-tab-span"> </span></p>
+<p class="p5"><span class="Apple-tab-span"> </span><span class="s15">LFSaw</span>.ar(freq) * 0.1</p>
+<p class="p5">});</p>
 <p class="p2"><br></p>
-<p class="p19"><b>Extra capabilities</b></p>
-<p class="p20"><br></p>
-<p class="p21">Because the Patch manages the creation of the SynthDef and also manages the Synth that is created at the time of play, it is possible to do some tricks that make client-server communication a bit easier. <span class="Apple-converted-space"> </span></p>
-<p class="p20"><br></p>
-<p class="p21">Keep in mind that when the sc lang code that is inside a SynthDef or an Instr is run when the the SynthDef or InstrSynthDef is compiled.<span class="Apple-converted-space">  </span>Its compiled into bytecode that is then sent to the server but then when the synth itself runs there is no sc language.<span class="Apple-converted-space">  </span>There are no functions or 'if' statements.</p>
-<p class="p20"><br></p>
-<p class="p21">So once you have that concept clear in your head, here's how to violate it.</p>
+<p class="p5">p.play</p>
 <p class="p2"><br></p>
+<p class="p5">)</p>
 <p class="p2"><br></p>
-<p class="p21"><b>UGen:onTrig(function,value)</b></p>
-<p class="p22"><span class="Apple-tab-span"> </span></p>
-<p class="p23"><span class="Apple-tab-span"> </span>trigger.onTrig({ <span class="s13">|time,value|</span></p>
-<p class="p24"><span class="s4"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span>"did trig"<span class="s4">.postln</span></p>
-<p class="p23"><span class="Apple-tab-span"> </span>})</p>
+<p class="p5">p.freq.value = 400</p>
 <p class="p2"><br></p>
-<p class="p3">On receiving a trigger (a non-positive to positive transition) evaluate the function IN THE CLIENT LANGUAGE.<span class="Apple-converted-space">  </span>A value may also be passed in which will be polled and passed to the function.</p>
+<p class="p5">p.freq.value = 200</p>
 <p class="p2"><br></p>
-<p class="p25">Patch<span class="s4">({ </span>|freq=200|</p>
-<p class="p22"><br></p>
-<p class="p23"><span class="Apple-tab-span"> </span>(<span class="s13">Dust</span>.kr(0.3)).onTrig({ <span class="s13">|time,value|</span></p>
-<p class="p23"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span>[<span class="s8">"dusty"</span>,time,value].postln</p>
-<p class="p23"><span class="Apple-tab-span"> </span>},<span class="s13">LFSaw</span><span class="s4">.kr(0.2)</span>); // value to be polled</p>
-<p class="p22"><span class="Apple-tab-span"> </span></p>
-<p class="p23"><span class="Apple-tab-span"> </span><span class="s13">LFSaw</span>.ar(freq)</p>
-<p class="p22"><br></p>
-<p class="p23">}).play</p>
-<p class="p22"><br></p>
-<p class="p22"><br></p>
-<p class="p22"><span class="Apple-tab-span"> </span></p>
-<p class="p25"><span class="s4">p = </span>Patch<span class="s4">({ </span>|freq=200|</p>
-<p class="p22"><br></p>
-<p class="p23"><span class="Apple-tab-span"> </span>(freq >= 300).onTrig({</p>
-<p class="p23"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="s8">"greater"</span>.postln</p>
-<p class="p23"><span class="Apple-tab-span"> </span>});</p>
-<p class="p22"><span class="Apple-tab-span"> </span></p>
-<p class="p23"><span class="Apple-tab-span"> </span><span class="s13">LFSaw</span>.ar(freq)</p>
-<p class="p23">});</p>
-<p class="p22"><br></p>
-<p class="p22"><br></p>
-<p class="p23">p.set(<span class="s14">\freq</span>,400)</p>
-<p class="p22"><br></p>
-<p class="p23">p.set(<span class="s14">\freq</span>,200)</p>
-<p class="p22"><br></p>
-<p class="p22"><br></p>
-<p class="p22"><br></p>
-<p class="p22"><br></p>
-<p class="p22"><br></p>
-<p class="p25"><span class="s4">p = </span>Patch<span class="s4">({ </span>|freq=200|</p>
-<p class="p22"><br></p>
-<p class="p23"><span class="Apple-tab-span"> </span><span class="s13">var</span> lfo;</p>
-<p class="p23"><span class="Apple-tab-span"> </span>lfo = <span class="s13">LFSaw</span>.kr(0.2);</p>
-<p class="p23"><span class="Apple-tab-span"> </span><span class="s13">Dust</span>.kr(2.0).onTrig({ <span class="s13">|time,value|</span></p>
-<p class="p23"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span>[time,value].postln</p>
-<p class="p23"><span class="Apple-tab-span"> </span>},lfo);</p>
-<p class="p22"><span class="Apple-tab-span"> </span></p>
-<p class="p23"><span class="Apple-tab-span"> </span><span class="s13">LFSaw</span>.ar(freq)</p>
-<p class="p23">});</p>
-<p class="p22"><br></p>
-<p class="p23">p.play</p>
 <p class="p2"><br></p>
+<p class="p2"><br></p>
+<p class="p5">(</p>
+<p class="p2"><br></p>
+<p class="p24"><span class="s4">p = </span>Patch<span class="s4">({ </span>|freq=200|</p>
+<p class="p2"><br></p>
+<p class="p5"><span class="Apple-tab-span"> </span><span class="s15">var</span> lfo;</p>
+<p class="p5"><span class="Apple-tab-span"> </span>lfo = <span class="s15">LFSaw</span>.kr(0.2);</p>
+<p class="p5"><span class="Apple-tab-span"> </span><span class="s15">Dust</span>.kr(2.0).onTrig({ <span class="s15">|time,value|</span></p>
+<p class="p5"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span>[time,value].postln</p>
+<p class="p5"><span class="Apple-tab-span"> </span>},lfo);</p>
+<p class="p2"><span class="Apple-tab-span"> </span></p>
+<p class="p5"><span class="Apple-tab-span"> </span><span class="s15">LFSaw</span>.ar(freq)</p>
+<p class="p5">});</p>
+<p class="p2"><br></p>
+<p class="p5">p.play</p>
+<p class="p2"><br></p>
+<p class="p25">)</p>
 <p class="p26"><br></p>
-<p class="p27">You could also spawn more synths.</p>
 <p class="p26"><br></p>
+<p class="p25">You could also spawn more synths.</p>
 <p class="p26"><br></p>
-<p class="p27">What happens is happening is that a ClientOnTrigResponder is added to the InstrSynthDef's stepchildren.<span class="Apple-converted-space">  </span>When a Patch plays it also plays its children (the inputs to the patch) and its stepchildren.<span class="Apple-converted-space">  </span>The ClientOnTrigResponder adds an OSCpathResponder when the synth starts and removes it when the synth stops. <span class="Apple-converted-space"> </span></p>
 <p class="p26"><br></p>
+<p class="p25">What is happening is that a ClientOnTrigResponder is added to the InstrSynthDef's stepchildren.<span class="Apple-converted-space">  </span>When a Patch plays it also plays its children (the inputs to the patch) and its stepchildren.<span class="Apple-converted-space">  </span>The ClientOnTrigResponder adds an OSCpathResponder when the synth starts and removes it when the synth stops. <span class="Apple-converted-space"> </span></p>
+<p class="p26"><br></p>
 <p class="p2"><br></p>
 <p class="p2"><br></p>
 <p class="p2"><br></p>
-<p class="p28"><span class="s4">see also [<a href="SC://InstrGateSpawner"><span class="s15">InstrGateSpawner</span></a>]</span></p>
+<p class="p27"><span class="s4">see also [<a href="SC://InstrGateSpawner"><span class="s16">InstrGateSpawner</span></a>]</span></p>
 <p class="p2"><br></p>
 <p class="p2"><br></p>
 <p class="p2"><br></p>

Modified: trunk/build/Help/Libraries/crucial/Players/InstrGateSpawner.html
===================================================================
--- trunk/build/Help/Libraries/crucial/Players/InstrGateSpawner.html 2008-07-15 22:05:41 UTC (rev 7688)
+++ trunk/build/Help/Libraries/crucial/Players/InstrGateSpawner.html 2008-07-16 00:44:37 UTC (rev 7689)
@@ -5,27 +5,32 @@
 <meta http-equiv="Content-Style-Type" content="text/css">
 <title></title>
 <meta name="Generator" content="Cocoa HTML Writer">
-<meta name="CocoaVersion" content="824.42">
+<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; min-height: 14.0px}
 p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Helvetica}
 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: 9.0px Monaco; min-height: 12.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: #0019b7}
+p.p6 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #001fb3}
 p.p7 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Verdana}
 p.p8 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Verdana}
-p.p9 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #a71e12}
-p.p10 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; color: #a71e12}
+p.p9 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #942b17}
+p.p10 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; color: #942b17}
 p.p11 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #606060}
-p.p12 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #0019b7; min-height: 12.0px}
-span.s1 {color: #0019b7}
+p.p12 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #000000}
+p.p13 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #000000; min-height: 12.0px}
+p.p14 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #0000bf}
+p.p15 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #001fb3; min-height: 12.0px}
+span.s1 {color: #001fb3}
 span.s2 {color: #000000}
-span.s3 {color: #a71e12}
+span.s3 {color: #942b17}
 span.s4 {font: 9.0px Monaco; color: #000000}
 span.s5 {font: 9.0px Monaco}
-span.s6 {color: #606060}
-span.s7 {color: #326f17}
+span.s6 {color: #0000bf}
+span.s7 {color: #bf0000}
+span.s8 {color: #606060}
+span.s9 {color: #436c1d}
 span.Apple-tab-span {white-space:pre}
 </style>
 </head>
@@ -169,9 +174,9 @@
 <p class="p3">// note that the old tempo settings persist until the end of the bar</p>
 <p class="p3">(</p>
 <p class="p4"><br></p>
-<p class="p5"><span class="s1">InstrGateSpawner</span>({ <span class="s1">arg</span> sample,start=0,dur,env,tempo;</p>
+<p class="p5"><span class="s1">InstrGateSpawner</span>({ <span class="s1">arg</span> sample,start=0,dur,env;</p>
 <p class="p5"><span class="Apple-tab-span"> </span>var gate;</p>
-<p class="p5"><span class="Apple-tab-span"> </span>gate = <span class="s1">Trig1</span>.kr(1.0,dur / tempo);</p>
+<p class="p5"><span class="Apple-tab-span"> </span>gate = <span class="s1">Trig1</span>.kr(1.0,dur / Tempo.kr);</p>
 <p class="p4"><br></p>
 <p class="p6"><span class="s2"><span class="Apple-tab-span"> </span></span>PlayBuf<span class="s2">.ar(<span class="Apple-converted-space"> </span></span></p>
 <p class="p5"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span>sample.numChannels,<span class="Apple-converted-space"> </span></p>
@@ -195,36 +200,34 @@
 <p class="p3">// change the (global) tempo using the tempo control at the top</p>
 <p class="p3">// you can also change the beats setting on the sample</p>
 <p class="p3">(</p>
-<p class="p5"><span class="s1">var</span> sample;</p>
-<p class="p5"><span class="s1">InstrGateSpawner</span>({ <span class="s1">arg</span> sample,start=0,dur,pchRatio,env,tempo;</p>
-<p class="p5"><span class="Apple-tab-span"> </span><span class="s1">var</span> gate;</p>
-<p class="p5"><span class="Apple-tab-span"> </span>gate = <span class="s1">Trig1</span>.kr(1.0,dur / tempo);</p>
-<p class="p4"><br></p>
-<p class="p6"><span class="s2"><span class="Apple-tab-span"> </span></span>PlayBuf<span class="s2">.ar(<span class="Apple-converted-space"> </span></span></p>
-<p class="p5"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span>sample.numChannels,<span class="Apple-converted-space"> </span></p>
-<p class="p5"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span>sample.bufnumIr,</p>
-<p class="p5"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span>sample.bufRateScaleIr * pchRatio,</p>
-<p class="p5"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span>1,</p>
-<p class="p5"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span>start,</p>
-<p class="p5"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span>1</p>
-<p class="p5"><span class="Apple-tab-span"> </span>) * <span class="s1">EnvGen</span>.kr(env,gate, doneAction: 2)</p>
-<p class="p5">},[</p>
-<p class="p11"><span class="s2"><span class="Apple-tab-span"> </span>sample = </span><span class="s1">Sample</span><span class="s2">(</span>"a11wlk01.wav"<span class="s2">),</span></p>
-<p class="p5"><span class="Apple-tab-span"> </span><span class="s1">Pfunc</span>({ <span class="s1">arg</span> igs;</p>
-<p class="p5"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span>(igs.beat * sample.beatsize).wrap(0,sample.end) <span class="s3">// in samples</span></p>
-<p class="p5"><span class="Apple-tab-span"> </span>}),</p>
-<p class="p5"><span class="Apple-tab-span"> </span>0.125,</p>
-<p class="p5"><span class="Apple-tab-span"> </span><span class="s1">KrNumberEditor</span>(1.0,[-4.0,4.0]),</p>
-<p class="p5"><span class="Apple-tab-span"> </span><span class="s1">Env</span>.adsr(0.02,releaseTime:0.1)</p>
-<p class="p4"><br></p>
-<p class="p5">],0.125).gui</p>
-<p class="p4"><br></p>
+<p class="p12"><span class="s6">var</span> sample;</p>
+<p class="p12"><span class="s6">InstrGateSpawner</span>({ <span class="s6">arg</span> sample,start=0,dur,pchRatio,env;</p>
+<p class="p12"><span class="Apple-tab-span"> </span><span class="s6">var</span> gate;</p>
+<p class="p12"><span class="Apple-tab-span"> </span>gate = <span class="s6">Trig1</span>.kr(1.0,dur / Tempo.kr);</p>
+<p class="p13"><br></p>
+<p class="p14"><span class="s2"><span class="Apple-tab-span"> </span></span>PlayBuf<span class="s2">.ar(<span class="Apple-converted-space"> </span></span></p>
+<p class="p12"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span>sample.numChannels,<span class="Apple-converted-space"> </span></p>
+<p class="p12"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span>sample.bufnumIr,</p>
+<p class="p12"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span>sample.bufRateScaleIr * pchRatio,</p>
+<p class="p12"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span>1,</p>
+<p class="p12"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span>start,</p>
+<p class="p12"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span>1</p>
+<p class="p12"><span class="Apple-tab-span"> </span>) * <span class="s6">EnvGen</span>.kr(env,gate, doneAction: 2)</p>
+<p class="p12">},[</p>
+<p class="p11"><span class="s2"><span class="Apple-tab-span"> </span>sample = </span><span class="s6">Sample</span><span class="s2">(</span>"a11wlk01.wav"<span class="s2">),</span></p>
+<p class="p12"><span class="Apple-tab-span"> </span><span class="s6">Pfunc</span>({ <span class="s6">arg</span> igs;</p>
+<p class="p12"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span>(igs.beat * sample.beatsize).wrap(0,sample.end) <span class="s7">// in samples</span></p>
+<p class="p12"><span class="Apple-tab-span"> </span>}),</p>
+<p class="p12"><span class="Apple-tab-span"> </span>0.125,</p>
+<p class="p12"><span class="Apple-tab-span"> </span><span class="s6">KrNumberEditor</span>(1.0,[-4.0,4.0]),</p>
+<p class="p12"><span class="Apple-tab-span"> </span><span class="s6">Env</span>.adsr(0.02,releaseTime:0.1)</p>
+<p class="p13"><br></p>
+<p class="p12">],0.125).gui</p>
+<p class="p13"><br></p>
 <p class="p3">)</p>
 <p class="p1"><br></p>
-<p class="p3">There is a large client side performance hit to build the sample's waveform display</p>
-<p class="p3">during which the grain commands stop getting sent.<span class="Apple-converted-space">  </span>(someone will make a better</p>
-<p class="p3">waveform display some day...)</p>
 <p class="p1"><br></p>
+<p class="p1"><br></p>
 <p class="p3">There is also a problem (currently) on the server whereby it can't accept the OSC commands</p>
 <p class="p3">while it is dealing with loading the sample.<span class="Apple-converted-space">  </span>You can use <span class="s5">ScurryableInstrGateSpawner-scurry,</span></p>
 <p class="p3">a subclass of InstrGateSpawner that can scurry ahead of time, sending OSC bundles</p>
@@ -258,7 +261,7 @@
 <p class="p4"><span class="Apple-tab-span"> </span></p>
 <p class="p5">layout = <span class="s1">FlowView</span>.new;</p>
 <p class="p4"><br></p>
-<p class="p6">ToggleButton<span class="s2">(layout,</span><span class="s6">"Gnome"</span><span class="s2">,{</span></p>
+<p class="p6">ToggleButton<span class="s2">(layout,</span><span class="s8">"Gnome"</span><span class="s2">,{</span></p>
 <p class="p5"><span class="Apple-tab-span"> </span>if(nome.isPlaying.not,{ nome.play(atTime: 1) })</p>
 <p class="p5">},{</p>
 <p class="p5"><span class="Apple-tab-span"> </span>if(nome.isPlaying,{ nome.stop })</p>
@@ -297,7 +300,7 @@
 <p class="p3">compare with the first example from Pbind help</p>
 <p class="p4"><br></p>
 <p class="p5">(</p>
-<p class="p5"><span class="s1">SynthDef</span>(<span class="s7">\cfstring1</span>.postln, { <span class="s1">arg</span> i_out, freq = 360, gate = 1, pan, amp=0.1;</p>
+<p class="p5"><span class="s1">SynthDef</span>(<span class="s9">\cfstring1</span>.postln, { <span class="s1">arg</span> i_out, freq = 360, gate = 1, pan, amp=0.1;</p>
 <p class="p5"><span class="Apple-tab-span"> </span><span class="s1">var</span> out, eg, fc, osc, a, b, w;</p>
 <p class="p5"><span class="Apple-tab-span"> </span>fc = <span class="s1">LinExp</span>.kr(<span class="s1">LFNoise1</span>.kr(<span class="s1">Rand</span>(0.25,0.4)), -1,1,500,2000);</p>
 <p class="p5"><span class="Apple-tab-span"> </span>osc = <span class="s1">Mix</span>.fill(8, { <span class="s1">LFSaw</span>.ar(freq * [<span class="s1">Rand</span>(0.99,1.01),<span class="s1">Rand</span>(0.99,1.01)], 0, amp) }).distort * 0.2;</p>
@@ -306,12 +309,12 @@
 <p class="p5"><span class="Apple-tab-span"> </span>#a, b = out;</p>
 <p class="p5"><span class="Apple-tab-span"> </span><span class="s1">Out</span>.ar(i_out, <span class="s1">Mix</span>.ar(<span class="s1">PanAz</span>.ar(4, [a, b], [pan, pan+0.3])));</p>
 <p class="p5">}).load(s);</p>
-<p class="p12"><br></p>
+<p class="p15"><br></p>
 <p class="p5"><span class="s1">SynthDescLib</span>.global.read;</p>
 <p class="p4"><br></p>
 <p class="p5">)</p>
 <p class="p4"><br></p>
-<p class="p5">e = <span class="s1">Pbind</span>(<span class="s7">\degree</span>, <span class="s1">Pwhite</span>(0,12), <span class="s7">\dur</span>, 0.2, <span class="s7">\instrument</span>, <span class="s7">\cfstring1</span>).play; <span class="s3">// returns an EventStream</span></p>
+<p class="p5">e = <span class="s1">Pbind</span>(<span class="s9">\degree</span>, <span class="s1">Pwhite</span>(0,12), <span class="s9">\dur</span>, 0.2, <span class="s9">\instrument</span>, <span class="s9">\cfstring1</span>).play; <span class="s3">// returns an EventStream</span></p>
 <p class="p4"><br></p>
 <p class="p4"><br></p>
 <p class="p4"><br></p>

Modified: trunk/build/SCClassLibrary/crucial/Editors/EnvEditor.sc
===================================================================
--- trunk/build/SCClassLibrary/crucial/Editors/EnvEditor.sc 2008-07-15 22:05:41 UTC (rev 7688)
+++ trunk/build/SCClassLibrary/crucial/Editors/EnvEditor.sc 2008-07-16 00:44:37 UTC (rev 7689)
@@ -58,7 +58,7 @@
  env {// direct access for the gui
  ^value // the prototype env that we edit
  }
-
+ copy { ^this.class.new(value.deepCopy,levelSpec) }
  guiClass { ^EnvEditorGui }
 
 }

Modified: trunk/build/SCClassLibrary/crucial/Editors/NumberEditor.sc
===================================================================
--- trunk/build/SCClassLibrary/crucial/Editors/NumberEditor.sc 2008-07-15 22:05:41 UTC (rev 7688)
+++ trunk/build/SCClassLibrary/crucial/Editors/NumberEditor.sc 2008-07-16 00:44:37 UTC (rev 7689)
@@ -43,6 +43,7 @@
  action.value(value);
  }
  spec { ^thisMethod.subclassResponsibility }
+ copy { ^this.class.new.value_(value.copy) }
 
 }
 
@@ -62,8 +63,9 @@
  this.value = spec.constrain(value);
  this.changed(\spec);
  }
- value_ { |v|
+ value_ { |v,change=true|
  value = spec.constrain(v);
+ if(change,{ this.changed });
  }
  setUnmappedValue { arg unipolar,change=true;
  this.value = spec.map(unipolar);
@@ -90,7 +92,7 @@
  }
  rate { ^spec.rate } // probably scalar
 
-
+ copy { ^this.class.new(value,spec) }
  guiClass { ^NumberEditorGui }
 
 }
@@ -101,9 +103,11 @@
 
  init { arg val,aspec;
  super.init(val, aspec);
- lag = defaultLag;
+ if(spec.isKindOf(NoLagControlSpec).not,{
+ lag = defaultLag;
+ });
  }
- //rate { ^\control }
+
  canDoSpec { arg aspec; ^aspec.isKindOf(ControlSpec) }
 
  addToSynthDef {  arg synthDef,name;
@@ -125,14 +129,23 @@
  connectToPatchIn { arg patchIn,needsValueSetNow = true;
  patchOut.connectTo(patchIn,needsValueSetNow);
  }
+ copy { ^this.class.new(value,spec).lag_(lag) }
 
-
  guiClass { ^KrNumberEditorGui }
 
 }
 
 IrNumberEditor : NumberEditor {
- rate { ^\scalar } // was \control but this is correct now
+ init { arg val,aspec;
+ super.init(val, aspec);
+ if((spec.isKindOf(ScalarSpec) or: spec.isKindOf(StaticSpec)).not,{
+ // let's assume you are lazy and specifying \freq
+ // we are going to guess you are using this for i_freq
+ spec = spec.as(ScalarSpec);
+ // if you wanted it for patterns or instr then use a simple NumberEditor
+ });
+ }
+ rate { ^spec.rate } // \scalar or \static
  addToSynthDef {  arg synthDef,name;
  synthDef.addIr(name,this.synthArg);
  }
@@ -146,6 +159,8 @@
 }
 
 
+
+
 // paul.crabbe@...
 PopUpEditor : KrNumberEditor {
 

Modified: trunk/build/SCClassLibrary/crucial/Instr/Instr.sc
===================================================================
--- trunk/build/SCClassLibrary/crucial/Instr/Instr.sc 2008-07-15 22:05:41 UTC (rev 7688)
+++ trunk/build/SCClassLibrary/crucial/Instr/Instr.sc 2008-07-16 00:44:37 UTC (rev 7689)
@@ -328,7 +328,6 @@
  }
 
 
-
  asString { ^"%(%)".format(this.class.name, this.defName.asCompileString) }
  storeArgs {
  if(this.path.notNil,{
@@ -337,6 +336,7 @@
  ^[this.dotNotation,this.func,this.specs,this.outSpec]
  });
  }
+ copy { ^this } // unless you change the address its the same instr
 
  *initClass {
  Class.initClassTree(Document);
@@ -390,9 +390,19 @@
 
  guiBody { arg layout;
  var defs,tf,source,lines,h,w,specWidth;
+
+ this.argNames.do({ arg a,i;
+ layout.startRow;
+ ArgNameLabel(  a ,layout,150);
+ CXLabel(layout, " = " ++ this.defArgAt(i).asString,100);
+ specWidth = min(layout.indentedRemaining.width,300);
+ this.specs.at(i).asCompileString.gui(layout,specWidth@...);
+ });
+
+ layout.startRow;
  source = this.func.def.sourceCode;
  if(source.notNil,{
- lines = source.split($\n);
+ lines = ["\n"] ++ source.split($\n).collect({|l| " "++l}) ++ ["\n"];
 
  w = lines.maxValue({ |l| l.size }) * 7;
  h = lines.size * 13;
@@ -401,25 +411,20 @@
  tf.string = source;
  tf.font_(GUI.font.new("Helvetica",10.0));
  });
+
+ ArgNameLabel("outSpec:",layout.startRow,150);
+ this.outSpec.asString.gui(layout);
+
  if(path.notNil,{
  CXLabel(layout.startRow,path);
  // ActionButton(layout.startRow,"open file...",{ path.openTextFile });
  });
- ArgNameLabel("outSpec:",layout.startRow,150);
- this.outSpec.asString.gui(layout);
- this.argNames.do({ arg a,i;
- layout.startRow;
- ArgNameLabel(  a ,layout,150);
- CXLabel(layout, " = " ++ this.defArgAt(i).asString,100);
- specWidth = min(layout.indentedRemaining.width,300);
- this.specs.at(i).asCompileString.gui(layout,specWidth@...);
- });
 
  layout.startRow;
  if(path.notNil and: { File.exists(this.path) },{
  ActionButton(layout,"edit File",{ this.path.openTextFile });
  });
- ActionButton(layout,"make Patch",{ Patch(this.name).topGui });
+ ActionButton(layout,"make a Patch",{ Patch(this.name).topGui });
  }
 }
 
@@ -441,6 +446,7 @@
  }
  asDefName { ^instr.asDefName }
  storeArgs { ^[name] }
+
 }
 
 
@@ -464,7 +470,8 @@
  //specs
  specs = this.argNames.collect({ arg ag,i;
  ag.asSpec ?? {
- ("UGenInstr-init  spec not found for:" + ag).warn;
+ ("UGenInstr:init Spec.specs has no entry for: % so guessing ControlSpec".format(ag.asCompileString)).warn;
+ nil.asSpec
  }
  });
  }
@@ -506,7 +513,7 @@
  ^if(nn.notNil,{nn.copyRange(1,nn.size-1)},{[]});
  }
 
- initAt { arg i;  ^(this.defArgAt(i) ?? {this.specs.at(i).default}) }
+ initAt { arg i;  ^(this.defArgAt(i) ?? {this.specs.at(i).tryPerform(\default)}) }
  argNameAt { arg i;
  var nn;
  nn=this.funcDef.argNames;

Modified: trunk/build/SCClassLibrary/crucial/Instr/Patch.sc
===================================================================
--- trunk/build/SCClassLibrary/crucial/Instr/Patch.sc 2008-07-15 22:05:41 UTC (rev 7688)
+++ trunk/build/SCClassLibrary/crucial/Instr/Patch.sc 2008-07-16 00:44:37 UTC (rev 7689)
@@ -182,6 +182,25 @@
  (argg.asString + "does not respond to set").warn;
  });
  }
+ doesNotUnderstand { arg selector ... dnuargs;
+ var sel,setter,argName,index;
+ sel = selector.asString;
+ setter = sel.last == $_;
+ if(setter,{
+ argName = sel.copyRange(0,sel.size-2).asSymbol;
+ },{
+ argName = sel.asSymbol;
+ });
+ index = this.argNames.detectIndex({ |an| an == argName });
+ if(index.isNil,{
+ ^this.superPerformList(\doesNotUnderstand, selector, dnuargs);
+ });
+ if(setter,{
+ this.setInput(index,dnuargs[0])
+ },{
+ ^args[index]
+ });
+ }
  argNames { ^this.instr.argNames }
  argNameAt { arg i; ^instr.argNameAt(i) }
  specAt { arg i; ^instr.specs.at(i) }
@@ -506,23 +525,7 @@
  });
  ^result
  }
- reportError {
 
-
- }
-
- /*storeModifiersOn { arg stream;
- // this allows a known defName to be used to look up in the cache
- // otherwise a Patch doesn't know its defName until after building
- if(defName.notNil,{
- stream << ".defName_(" <<< defName << ")";
- })
- }*/
- /*defName_ { arg df;
- // for reloading from storeModifiersOn
- defName = df;
- }*/
-
  children { ^args }
 
  printOn { arg s;

Modified: trunk/build/SCClassLibrary/crucial/Players/PlayerSocket.sc
===================================================================
--- trunk/build/SCClassLibrary/crucial/Players/PlayerSocket.sc 2008-07-15 22:05:41 UTC (rev 7688)
+++ trunk/build/SCClassLibrary/crucial/Players/PlayerSocket.sc 2008-07-16 00:44:37 UTC (rev 7689)
@@ -2,8 +2,10 @@
 /*
  a player that can switch playing different players in its socket
 
- should all be same rate
- numChannels will adapt
+ numChannels will cause all players played within the socket to automatically adapt :
+ stereo mixed to mono,
+ mono expanded to stereo
+
 */
 
 PlayerSocket : AbstractPlayerProxy {
@@ -11,6 +13,7 @@
  var <>round,<>rate,<>numChannels;
  var <>env,<socketGroup,sched;
  var <lastPlayer,<envdSource,onBat, dee,dum;
+ var <fuseBlown = false;
 
  *new { arg rate=\audio,numChannels=2,round=0.0,env;
  ^this.prNew(rate,numChannels,round,env)
@@ -23,10 +26,20 @@
  }
  psinit {
  sched = OSCSched.new;
- dee = EnvelopedPlayer(PlayerInputProxy(AudioSpec(numChannels)),env,numChannels);
- dum = EnvelopedPlayer(PlayerInputProxy(AudioSpec(numChannels)),env,numChannels);
- dee.name = this.name + "EnvelopedPlayer1";
- dum.name = this.name + "EnvelopedPlayer2";
+ if(this.rate == \audio,{
+ dee = EnvelopedPlayer(PlayerInputProxy(AudioSpec(numChannels)),env,numChannels);
+ dum = EnvelopedPlayer(PlayerInputProxy(AudioSpec(numChannels)),env,numChannels);
+ dee.name = this.name + "EnvelopedPlayer1";
+ dum.name = this.name + "EnvelopedPlayer2";
+ dee.onFuseBlown = { |time,value| this.fuseDidBlow(value) };
+ dum.onFuseBlown = dee.onFuseBlown;
+ },{
+ dee = PlayerInputProxy(\bipolar);
+ dum = PlayerInputProxy(\bipolar);
+ dee.name = this.name + "dee";
+ dum.name = this.name + "dum";
+ });
+
  // dee and dum are swapped on alternate spawns
  // now playing:
  envdSource = dee;
@@ -159,7 +172,7 @@
  }
  )
  }
-
+
  spawnToBundle { arg bundle;
  if(source.notNil,{
  this.setSourceToBundle(source,bundle);
@@ -168,7 +181,7 @@
  }
  synthArg { ^this.bus.index }
 
- // prepared objects only
+ // the source should be already prepared
  setSource { arg s,atTime,releaseTime;
  var bundle;
  if(this.server.notNil,{ // else not even playing, or not loaded
@@ -179,20 +192,29 @@
  source = s;
  });
  }
- // the main switching method
- // the source should be prepared
+ // the source should be already prepared
  setSourceToBundle { arg s,bundle,releaseTime;
+ // the main switching method
  var currentSubject;
+
  if(envdSource.isPlaying,{
  envdSource.releaseToBundle(releaseTime,bundle);
  # envdSource, onBat = [onBat,envdSource];
  });
- if(envdSource.subject.isKindOf(PlayerInputProxy),{
- envdSource.subject.freeToBundle(bundle)
+ if(this.rate == 'audio',{
+ if(envdSource.subject.isKindOf(PlayerInputProxy),{
+ envdSource.subject.freeToBundle(bundle)
+ });
+ source = s;
+ envdSource.subject = source;
+ },{
+ if(envdSource.isKindOf(PlayerInputProxy),{
+ envdSource.freeToBundle(bundle)
+ });
+ source = s;
+ envdSource = source;
  });
 
- source = s;
- envdSource.subject = source;
  if(this.bus.rate != source.rate,{
  if(this.bus.isNil,{
  "PlayerSocket:setSourceToBundle: I am not prepared".error;
@@ -201,13 +223,11 @@
  + this.bus.rate + source.rate).error(this,source);
  })
  });
+ socketStatus = \switching;
  envdSource.spawnOnToBundle(socketGroup,this.bus,bundle);
- socketStatus = \switching;
  bundle.addFunction({
- if(socketStatus != \switching, {
- socketStatus.debug("socket Status changed !!");
- });
  socketStatus = \isPlaying;
+ fuseBlown = false;
  lastPlayer = source;
  { this.changed; nil; }.defer;
  nil
@@ -217,7 +237,12 @@
  super.didFree;
  socketStatus = \isSleeping;
  }
-
+ fuseDidBlow { |value|
+ "% produced bad value: %".format(source,value).warn;
+ {
+ this.changed(\fuseDidBlow)
+ }.defer
+ }
  // emergency kill off contents
  socketFreeAll {
  socketGroup.freeAll
@@ -225,6 +250,13 @@
  name {
  ^name ?? {this.class.name.asString}
  }
+
+ limit_ { |boo|
+ if(this.rate == \audio,{
+ dee.limit = boo;
+ dum.limit = boo;
+ })
+ }
 }
 
 PlayerEffectSocket : PlayerSocket {
@@ -240,3 +272,63 @@
  super.setSourceToBundle(aplayer,bundle,releaseTime);
  }
 }
+
+/*
+a pure control class
+
+ControlPlayerSocket : PlayerSocket {
+
+
+ *new { arg round=0.0;
+ ^this.prNew(\control,1,round)
+ }
+ psinit {
+ sched = OSCSched.new;
+ dee = PlayerInputProxy(\bipolar);
+ dum = PlayerInputProxy(\bipolar);
+ dee.name = this.name + "EnvelopedPlayer1";
+ dum.name = this.name + "EnvelopedPlayer2";
+ // dee and dum are swapped on alternate spawns
+ // now playing:
+ envdSource = dee;
+ // "on bat" is a baseball term : the guy who is up to bat next
+ onBat = dum;
+ }
+
+ // the main switching method
+ // the source should be prepared
+ setSourceToBundle { arg s,bundle,releaseTime;
+ var currentSubject;
+ if(envdSource.isPlaying,{
+ envdSource.releaseToBundle(releaseTime,bundle);
+ # envdSource, onBat = [onBat,envdSource];
+ });
+ if(envdSource.isKindOf(PlayerInputProxy),{
+ envdSource.subject.freeToBundle(bundle)
+ });
+
+ source = s;
+ envdSource.subject = source;
+ if(this.bus.rate != source.rate,{
+ if(this.bus.isNil,{
+ "PlayerSocket:setSourceToBundle: I am not prepared".error;
+ },{
+ ("PlayerSocket:setSourceToBundle bus and source have different rates:"
+ + this.bus.rate + source.rate).error(this,source);
+ })
+ });
+ envdSource.spawnOnToBundle(socketGroup,this.bus,bundle);
+ socketStatus = \switching;
+ bundle.addFunction({
+ if(socketStatus != \switching, {
+ socketStatus.debug("socket Status changed !!");
+ });
+ socketStatus = \isPlaying;
+ lastPlayer = source;
+ { this.changed; nil; }.defer;
+ nil
+ });
+ }
+}
+
+*/

Modified: trunk/build/SCClassLibrary/crucial/Players/SimplePlayerEffect.sc
===================================================================
--- trunk/build/SCClassLibrary/crucial/Players/SimplePlayerEffect.sc 2008-07-15 22:05:41 UTC (rev 7688)
+++ trunk/build/SCClassLibrary/crucial/Players/SimplePlayerEffect.sc 2008-07-16 00:44:37 UTC (rev 7689)
@@ -57,13 +57,16 @@
 /*
  put an envelope on the player's output bus.
  correct numChannels of the player's output eg. from 1 to 2 if needed
+ protect against bad values (nan, inf)
+ set limit = true to add a limiter
 */
 EnvelopedPlayer : AbstractSinglePlayerEffect {
 
- var <>env,<>numChannels;
+ var <>env,<>numChannels,<>limit,<>onFuseBlown;
+ var fuseListener;
 
- *new { arg player,env,numChannels=2;
- ^super.new(player).env_(env).numChannels_(numChannels)
+ *new { arg player,env,numChannels=2,limit=false;
+ ^super.new(player).env_(env).numChannels_(numChannels).limit_(limit)
  }
  storeArgs { ^[subject,env,numChannels] }
  asSynthDef {
@@ -72,20 +75,35 @@
  var good;
  pnc = subject.numChannels;
  in = In.ar(i_bus,pnc);
- good = BinaryOpUGen('==', CheckBadValues.kr(in, 0, 0), 0);
+ good = BinaryOpUGen('==', CheckBadValues.ar(in, 0, 0), 0);
  // silence the output if freq is bad
  in = in * good * EnvGen.kr(env,gate,doneAction:0);
+ // phone home
+ SendTrig.kr(1.0-A2K.kr(good),1,in);
+ if(limit,{
+ in = Limiter.ar(in)
+ });
  if(numChannels.notNil,{
  in = NumChannels.ar(in,numChannels,true);
  });
  ReplaceOut.ar(i_bus,in)
  })
  }
- defName { ^this.class.name.asString ++ numChannels.asString ++
+ defName { ^this.class.name.asString ++ numChannels.asString ++ limit.binaryValue.asString ++
  env.asCompileString.hash.asFileSafeString
  }
  synthDefArgs { ^[\i_bus,patchOut.synthArg,\gate,1.0] }
-
+ didSpawn {
+ var commandpath = ['/tr', this.synth.nodeID, 1];
+ fuseListener = OSCpathResponder(this.server.addr, commandpath,
+ {|time,responder,message|
+ (onFuseBlown ? {|time,msg| "% got bad value: %".format(this,msg).warn }).value(time,message[3])
+ });
+ fuseListener.add;
+ }
+ didStop {
+ fuseListener.remove;
+ }
  // this is a once-only event; you cannot retrigger it
  releaseToBundle { arg releaseTime,bundle;
  if(releaseTime.isNil,{ releaseTime = env.releaseTime; });

Modified: trunk/build/SCClassLibrary/crucial/Sequencers/BusDriver.sc
===================================================================
--- trunk/build/SCClassLibrary/crucial/Sequencers/BusDriver.sc 2008-07-15 22:05:41 UTC (rev 7688)
+++ trunk/build/SCClassLibrary/crucial/Sequencers/BusDriver.sc 2008-07-16 00:44:37 UTC (rev 7689)
@@ -1,5 +1,5 @@
 
-BusDriver : SynthlessPlayer {
+AbstractBusDriver : SynthlessPlayer {
 
  var <>lag=0.0,<>latency=0.1;
  var sched,bus,msg,bnd,resched,routine;
@@ -17,10 +17,47 @@
  }
  stopToBundle { arg bundle;
  super.stopToBundle(bundle);
- bundle.addMessage(this,\reset);
+ bundle.addMessage(this,\didStop);
  }
 }
 
+BusDriver : AbstractBusDriver {
+
+ var <value,<>spec;
+
+ *new { |value=0.0,spec=\unipolar|
+ ^super.new.spec_(spec.asSpec).value_(value)
+ }
+
+ poll { ^value }
+ value_ { |v|
+ value = spec.constrain(v);
+ if(this.isPlaying,{
+ this.bus.set(value)
+ });
+ }
+ activeValue_ { |v|
+ this.value = v;
+ this.changed;
+ }
+ spawnToBundle { |b|
+ var v;
+ super.spawnToBundle(b);
+ b.add(this.bus.setMsg(value));
+ v = value;
+ b.addFunction({// just in case it changed
+ if(v != value,{
+ this.bus.set(value);
+ })
+ });
+ }
+ storeOn { |stream| value.storeOn(stream) }
+ guiClass { ^KrNumberEditorGui }
+ storeArgs { ^[value,spec] }
+}
+
+
+
 /*
 StreamKr : Kr { // trigger is a kr rate trigger
 
@@ -49,7 +86,7 @@
 }
 */
 
-StreamKrDur : BusDriver {
+StreamKrDur : AbstractBusDriver {
 
  var <>values,<>durations;
  var valst,deltast,<lastValue,<delta,<beat;
@@ -113,9 +150,13 @@
  });
  });
  }
- reset {
+ didStop { this.stopRoutine }
+ stopRoutine {
  routine.stop;
- }
+ }
+ resetRoutine {
+ routine.reset;
+ }
  // has no synth, just a bus
  spawnToBundle { arg bundle;
  valst = values.asStream;
@@ -167,9 +208,9 @@
 }
 
 
-Stream2Trig : StreamKrDur { // outputs just a single pulse trig
+Stream2Trig : StreamKrDur { // outputs just a single pulse trig with the amplitude of the value stream
 
- // *new(levels, deltas)
+ // *new(amplitudes, deltas)
 
  // doesn't use lag
  instrArgFromControl { arg control;


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.

_______________________________________________
sc-dev mailing list

info (subscribe and unsubscribe): http://swiki.hfbk-hamburg.de:8888/MusicTechnology/880
archive: http://www.listarc.bham.ac.uk/marchives/sc-dev/
search: http://www.listarc.bham.ac.uk/lists/sc-dev/search/
LightInTheBox - Buy quality products at wholesale price