|
View:
New views
1 Messages
—
Rating Filter:
Alert me
|
|
|
SF.net SVN: supercollider: [7647] trunk/build
by cruxxial
::
Rate this Message:
Reply (Restricted by the Administrator) | Reply to Author | View Threaded | Show Only this Message Revision: 7647
http://svn.sourceforge.net/supercollider/?rev=7647&view=rev Author: cruxxial Date: 2008-07-05 09:26:11 -0700 (Sat, 05 Jul 2008) Log Message: ----------- adding -onTrig support inside of Patch Modified Paths: -------------- trunk/build/Help/Libraries/crucial/Instr/Patch.html trunk/build/SCClassLibrary/crucial/Instr/InstrSynthDef.sc trunk/build/SCClassLibrary/crucial/Instr/Patch.sc trunk/build/SCClassLibrary/crucial/Instr/instrSupport.sc Modified: trunk/build/Help/Libraries/crucial/Instr/Patch.html =================================================================== --- trunk/build/Help/Libraries/crucial/Instr/Patch.html 2008-07-03 18:53:16 UTC (rev 7646) +++ trunk/build/Help/Libraries/crucial/Instr/Patch.html 2008-07-05 16:26:11 UTC (rev 7647) @@ -5,40 +5,49 @@ <meta http-equiv="Content-Style-Type" content="text/css"> <title></title> <meta name="Generator" content="Cocoa HTML Writer"> -<meta name="CocoaVersion" content="824.44"> +<meta name="CocoaVersion" content="824.48"> <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: #853519} -p.p7 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #653e23} +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.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: #a8220e} -p.p10 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #132ea3} +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.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: #5d652d} -p.p13 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #316f11} +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.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: #5d652d; min-height: 12.0px} -p.p16 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #952e14} -p.p17 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #0013bb} -p.p18 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #653e23; min-height: 12.0px} -p.p19 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; color: #0018e8} -span.s1 {color: #001af9} -span.s2 {color: #0021b3} -span.s3 {color: #4e6a1f} +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 Helvetica; color: #0018e8} +span.s1 {color: #0025f3} +span.s2 {color: #0626af} +span.s3 {color: #556824} span.s4 {color: #000000} -span.s5 {color: #0013bb} -span.s6 {color: #316f11} -span.s7 {color: #132ea3} +span.s5 {color: #001bb7} +span.s6 {color: #436c19} +span.s7 {color: #1731a0} span.s8 {color: #606060} -span.s9 {color: #5d652d} -span.s10 {text-decoration: underline ; color: #0018e8} -span.s11 {color: #001bb7} -span.s12 {color: #436c19} -span.s13 {font: 12.0px Helvetica} +span.s9 {color: #5f6430} +span.s10 {text-decoration: underline ; color: #0022e3} +span.s11 {color: #0021b3} +span.s12 {color: #4e6a1f} +span.s13 {color: #0000bf} +span.s14 {color: #007300} +span.s15 {font: 12.0px Helvetica} span.Apple-tab-span {white-space:pre} </style> </head> @@ -487,10 +496,81 @@ <p class="p18"><br></p> <p class="p5">)</p> <p class="p2"><br></p> -<p class="p19"><span class="s4">see also [<a href="SC://InstrGateSpawner"><span class="s13">InstrGateSpawner</span></a>]</span></p> <p class="p2"><br></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="p2"><br></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="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="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">You could also spawn more synths.</p> +<p class="p2"><br></p> +<p class="p2"><br></p> +<p class="p5">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="p2"><br></p> +<p class="p2"><br></p> +<p class="p2"><br></p> +<p class="p2"><br></p> +<p class="p26"><span class="s4">see also [<a href="SC://InstrGateSpawner"><span class="s15">InstrGateSpawner</span></a>]</span></p> +<p class="p2"><br></p> +<p class="p2"><br></p> +<p class="p2"><br></p> +<p class="p2"><br></p> </body> </html> Modified: trunk/build/SCClassLibrary/crucial/Instr/InstrSynthDef.sc =================================================================== --- trunk/build/SCClassLibrary/crucial/Instr/InstrSynthDef.sc 2008-07-03 18:53:16 UTC (rev 7646) +++ trunk/build/SCClassLibrary/crucial/Instr/InstrSynthDef.sc 2008-07-05 16:26:11 UTC (rev 7647) @@ -57,7 +57,7 @@ //out = outClass.perform(if(this.rate == \audio,\ar,\kr), // inputs.at(0),xfader.value,out) }); - + rate.switch( \audio, { result = outClass.ar(Control.names([\out]).ir([0]) , result); @@ -70,6 +70,11 @@ ("InstrSynthDef: result of your Instr function was a scalar rate object:" + result + this.buildErrorString).error; }, + \noncontrol,{ + + ("InstrSynthDef: result of your Instr function was a noncontrol rate object:" + + result + this.buildErrorString).error; + }, { ("InstrSynthDef: result of your Instr function was an object with unknown rate:" + result + rate + this.buildErrorString).error; @@ -98,6 +103,11 @@ // but after that comes secret args and the out if(i > argInstr.argNames.size,{ name = name ++ controlName.name.asString; + },{ + //inputs[i].addToDefName + // if outputProxy != control + + }); switch(controlName.rate, \control, { @@ -116,7 +126,6 @@ name = name ++ controlName.defaultValue.asCompileString; }); }); - longName = name; firstName = argInstr.name.last.asString; if(firstName.size > 20,{ @@ -341,26 +350,65 @@ }) ^sd } - synthProxy { + + // in the context of an InstrSynthDef + // InstrSynthDef.buildSynthDef.onTrig(sig,func,pollableValue) + // this allows to execute the func in the client whenever the trigger goes + // the mechanics and the adding/removing of the responder are taken care of + // because Patch knows when it starts and stops the synth + onTrig { |trig,func,value=0.0| + // triggerID is the nTh onTrig we have so far added + 9999 + var triggerID,onTrig; + triggerID = stepchildren.select({|sc|sc.isKindOf(ClientOnTrigResponder)}).size + 9999; + onTrig = ClientOnTrigResponder(triggerID,func); + stepchildren = stepchildren.add(onTrig); + + ^SendTrig.kr(trig,triggerID,value) + } + + /*synthProxy { ^synthProxy ?? { synthProxy = SynthProxy.new; stepchildren = stepchildren.add(synthProxy); - synthProxy + synthProxy } + }*/ +} + + + +ClientOnTrigResponder { + + var <>triggerID, <>func,responder; + + *new { |triggerID,func| + ^super.newCopyArgs(triggerID,func) } + didSpawn { |synth| + var commandpath = ['/tr', synth.nodeID, triggerID]; + responder = OSCpathResponder(synth.server.addr, commandpath, + {|time,responder,message| func.value(time,message[3]) }); + responder.add; + } + stopToBundle { |b| + b.addFunction({ responder.remove; responder = nil }) + } } // SynthProxy is a way to access the Synth once the SynthDef has started playing // there is only one SynthProxy per synth def, though there may be multiple synths spawned // the synthProxy is in stepchildren and in the Patch's stepChildren so it is prepared and spawned. // it is roughly equivalent to the synth argument in SC2's Spawn -SynthProxy { - var events,sched; +// +/*SynthProxy { + + var events,sched,<synth; + spawnToBundle { |b| b.addMessage(this,\didSpawn) } - didSpawn { + didSpawn { |synth| sched = BeatSched.new; // sched any events events.do({ |df| @@ -370,9 +418,8 @@ sched { |delta, function| events = events.add([delta,function]); } - channelOffset_ { + / *channelOffset_ { // shift the Out.ar - } -} + }* / +}*/ - Modified: trunk/build/SCClassLibrary/crucial/Instr/Patch.sc =================================================================== --- trunk/build/SCClassLibrary/crucial/Instr/Patch.sc 2008-07-03 18:53:16 UTC (rev 7646) +++ trunk/build/SCClassLibrary/crucial/Instr/Patch.sc 2008-07-05 16:26:11 UTC (rev 7647) @@ -441,6 +441,12 @@ ); bundle.addMessage(this,\didSpawn); } + didSpawn { + super.didSpawn; + this.stepChildren.do({ |child| + child.didSpawn(this.synth) + }) + } synthDefArgs { // not every arg makes it into the synth def var args; @@ -459,7 +465,6 @@ stopToBundle { arg bundle; super.stopToBundle(bundle); - //bundle.addMessage(this,\didStop); stepChildren.do({ |sc| sc.stopToBundle(bundle) }) @@ -520,7 +525,13 @@ children { ^args } - printOn { arg s; s << this.class.name << "(" <<< instr.dotNotation << " )"; } + printOn { arg s; + var n; + s << this.class.name << "(" <<< instr.dotNotation << ")"; + if((n = this.name).notNil,{ + s << "{"++n++"}"; + }); + } storeParamsOn { arg stream; var last; if(this.class === Patch,{ // an indulgence ... Modified: trunk/build/SCClassLibrary/crucial/Instr/instrSupport.sc =================================================================== --- trunk/build/SCClassLibrary/crucial/Instr/instrSupport.sc 2008-07-03 18:53:16 UTC (rev 7646) +++ trunk/build/SCClassLibrary/crucial/Instr/instrSupport.sc 2008-07-05 16:26:11 UTC (rev 7647) @@ -254,6 +254,14 @@ } } ++ UGen { + onTrig { |func,value=0.0| + if(this.rate != \control,{ + Error("UGen:onTrig only permissable with a control rate signal").throw; + }); + ^InstrSynthDef.buildSynthDef.onTrig(this,func,value) + } +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. _______________________________________________ sc-dev mailing list sc-dev@... http://lists.create.ucsb.edu/mailman/listinfo/sc-dev |
| Free embeddable forum powered by Nabble | Forum Help |