[chuck-users] Looping

Michael Heuer heuermh at gmail.com
Tue Sep 25 15:59:59 EDT 2012

Alberto Alassio wrote:

> I cannot understand how the while structure has to be used. I mean, I
> understood that while ( true ) means infinite loop
> and also that while ( n::second => now ) means an "n" second loop duration
> but...
>
> If I just want to do a really stupid thing like a Sine at 220 Hz that sounds
> for 2 seconds and then stops for 2 seconds and then goes again.
> How could I do? I thought that it was necessary just to do something like
> this
>
> SinOsc s => dac;
> .2 => s.gain;
> 220 => s.freq;
> while ( 2::second => now)
> 0 =>s.gain
>
> but I know that it's not the right way, also because in this method I would
> have to rewrite this thing an infinite ( whiletrue ahahah) number of times
> to have what I'm looking for.
>
> And I don't actually understand {} . How am I supposed to use these?

The curly brackets '{' and '}' encapsulate what you would like to loop
over with the while construct:

SinOsc s => dac;
220.0 => s.freq;
while (true)
{
0.2 => s.gain;
2::second => now;
0.0 => s.gain;
2::second => now;
}

Does that make sense?  If you want to loop a certain number of times,
you can use the for construct, e.g.

SinOsc s => dac;
220.0 => s.freq;
for (0 => int i; i < 10; i++)
{
0.2 => s.gain;
2::second => now;
0.0 => s.gain;
2::second => now;
}

would loop 10 times.

If you want to take this further, with LiCK you can put the part
between the {}s into a functor class

class Play extends Procedure
{
SinOsc s => dac;

fun void run()
{
freq => s.freq;
0.2 => s.gain;
2::second => now;
0.0 => s.gain;
}
}

and then use the Loops class to do the looping

Play playA;
220.0 => playA.s.freq;
Play playC;
130.81278 => playC.s.freq;

spork ~ Loops.loop(playA, 2::second, 10).run();
spork ~ Loops.loop(playC, 1::second, 2::second, 10).run();

michael