[chuck-users] can there be many ::ms in while?

Martin Ahnelöv operagasten at gmail.com
Thu Aug 2 04:54:46 EDT 2007


tor 2007-08-02 klockan 07:34 +0900 skrev 2g:
> have just started coding on chuck
> was looking for way to let s1 have 3 overtones
> flying around him
> i know it should be something other than rand2f to handle integers
> but my q is about ::ms in while
> 
> i wonder which one of these are the right way to use them
> i thought the latter might be safe but it seems to give one never
> changing long note
> and maybe only one another is floating around
> but none of them give me an error
> 
> 
> style one:
> 
> SinOsc s1 => PRCRev g => dac;
> SinOsc s2 => g;
> SinOsc s3 => g;
> SinOsc s4 => g;
> .25 => g.gain => g.mix;
> while( true ) {
>         500::ms => now;
>         Std.rand2f(30.0, 220.0) => s1.freq;
>         170::ms => now;
>         s1.freq() * Std.rand2f(8.0, 16.0) / 8.0 => s2.freq;
>         75::ms => now;
>         s2.freq() * Std.rand2f(16.0, 32.0) / 16.0 => s3.freq;
>         111::ms => now;
>         s2.freq() * Std.rand2f(16.0, 32.0) / 16.0 => s4.freq;
> }
> 
> 
> style two:
> 
> SinOsc s1 => PRCRev g => dac;
> SinOsc s2 => g;
> SinOsc s3 => g;
> SinOsc s4 => g;
> .25 => g.gain => g.mix;
> while( true ) {
>         200::ms => now;
>         Std.rand2f(30.0, 220.0) => s1.freq;
> }
> while( true ) {
>         170::ms => now;
>         s1.freq() * Std.rand2f(8, 16) / 4.0 => s2.freq;
> }
> while( true ) {
>         75::ms => now;
>         s2.freq() * Std.rand2f(16, 32) / 8.0 => s3.freq;
> }
> while( true ) {
>         111::ms => now;
>         s2.freq() * Std.rand2f(16, 32) / 8.0 => s4.freq;
> }
> 

Okey, I'm gonna teach you something about while-loops. A while loop will
do whatever is in the brackets behind the statements until the
expression inside the parenthesis is false. When it is false, it
continues to the next thing after the close bracket (in your case the
next while-loop).

illustrated with chuck-code:

1 => int i;

while (i < 10) {
	<<<i>>>; //print i
	i + 1 => i;
}
<<<"done">>>;

Notice how it prints the numbers 1 to 9, and finally "done"? 

Now, look at your second example. Does the expression never return
false? No, because you have hard coded "true" inside it.

So, your first one should work as you want it, and your second won't.
(Yes, you can advance time how many times as you want in whatever
code-context you want)

By the way, have you checked out the Blit-UGen? I think that one might
satisfy your needs.


Hope that helps,
Gasten



More information about the chuck-users mailing list