[sc-users] Embedded routines and Conditions

Scott Carver scott at artificia.org
Thu Oct 18 23:02:47 PDT 2007


You're right, I didn't reset it in the example code. However, it  
doesn't fix the problem - the outer routine continues to play while  
the inner one is paused, waiting for the Condition.

I think I've figured it out, but it's not an ideal solution (it  
involves a special embedInStream method for Routines that works  
slightly differently, as well as a slight modification to  
Condition.wait). Basically, instead of stopping when it hits the  
first nil value, the modified .embedInStream continues until the  
Routine is actually finished. Any nil's are yielded all the way down  
the chain, so an embedded Routine can pause all of it's parents. I  
have no idea whether the embedInStream modification safe (it might  
break other things), but I'm going to see how it works. And, it  
solves my problem - I can now use Conditions in embedded Routines.

A better solution would be if Condition.wait yielded an inf instead  
of nil - conceptually, this makes more sense (wait forever, rather  
than stop playback entirely). Nil could then work as it does now, but  
some clock/scheduling code would have to be changed to treat inf  
exactly like it would treat nil (i.e. stop scheduling) - currently,  
yielding inf crashes SC.

- Scott



On Oct 18, 2007, at 11:48 AM, Julian Rohrhuber wrote:

>
> you are embedding streams (Routine) and not patterns, so you'd have  
> to reset the first routine, since you've used it already.
>
>
> 	Routine({
> 		"before1".postln;
> 		r.reset.embedInStream;
> 		"after1".postln;
> 	}).play
>
>
>
>> The following works as expected:
>>
>> 	c = Condition(false);
>>
>> 	r = Routine({
>> 		"before".postln;
>> 		c.wait;
>> 		"after".postln;
>> 	}).play
>>
>> 	c.test_(true).signal;
>>
>> The Routine advances only when the Condition is changed. However,  
>> in a situation where the above Routine is embedded in another  
>> Routine, it behaves strangely:
>>
>> 	c.test_(false); // reset the condition
>>
>> 	Routine({
>> 		"before1".postln;
>> 		r.embedInStream;
>> 		"after1".postln;
>> 	}).play
>>
>> 	c.test_(true).signal;
>>
>> will yield:
>> 	before1
>> 	before
>> 	after1
>>
>> and then, after changing the Condition:
>> 	after
>>
>> The outside Routine is continuing on, instead of waiting for the  
>> Condition, though the inside routine is still waiting.
>>
>> So, what am I doing wrong here? Is there another way I can  
>> approach this? Help would be much appreciated!
>>
>> - Scott
>>
>>
>>
>> _______________________________________________
>> sc-users mailing list
>> sc-users at create.ucsb.edu
>> http://www.create.ucsb.edu/mailman/listinfo/sc-users
>
>
> -- 
>
>
>
>
>
> .
> _______________________________________________
> sc-users mailing list
> sc-users at create.ucsb.edu
> http://www.create.ucsb.edu/mailman/listinfo/sc-users



More information about the sc-users mailing list