A ChucK "erősen időzített" nyelv, az idő fogalma a nyelv szerves részét lépezi.
A nyelv lehetőséget ad a programozó számára, hogy rugalmas és precíz módon kezelje
az időt, és így a hang előállítását.
Idő és időtartam
Az idő és időtartam a nyelv beépített típusai. A time
egy időpillanatot
reprezentál (a ChucKi idő kezdetéhez viszonyítva), a dur
pedig egy
időtartamot (ugyanazokkal az egységekkel, mint a time
).
// egy másodpercnyi időtartam
1::second => dur foo;
// egy időpillanat
now + foo => time later;
Az idő és időtartam segítségéval számos aritmetikai művelet is végezhető.
// 0.5 másodperc egy negyed
.5::second => dur quarter;
// 4 negyed egy egész
4::quarter => dur whole;
A ChucK számos beépített időtartamot tartalmaz.
samp
: egy (hang)minta időtartama ChucKi időben
ms
: egy ezredmásodperc
second
: egy perc
minute
: egy perc
hour
: egy óra
day
: egy nap
week
: egy hét
Ezek használhatók időtartamok megadására.
// fél minta időtartama
.5::samp => dur foo;
// húsz hét
20::week => dur waithere;
// többféle időtartam kombinációja
2::minute + 30::second => dur bar;
// ugyanaz, mint fent
2.5::minute => dur bar;
Aritmetikai műveletek idővel és időtartammal
A ChucKban a time
és dur
típusokon végzett műveleteknek jól definiált,
logikus jelentésük van.
// time + dur eredménye time
now + 10::second => time later;
// time - time eredménye dur
later - now => dur D;
// dur + dur eredménye dur
10::second + 100::samp => dur foo;
// dur - dur eredménye dur
10::second - 100::samp => dur bar;
// dur / dur eredménye szám
10::second / 20::ms => float n;
// time mod dur eredménye dur
now % 1::second => dur remainder;
// szinkronizálás fél másodpercre
.5::second => dur T;
T - (now % T) => now;
// time értékek összehasonlítása
if( t1 < t2 )
// csináljunk valamit...
// dur értékek összehasonlítása
if( 900::ms < 1::second )
<<< "yay!" >>>;
now
A now
kulcsszó használható az idő vezérlésére.
Néhány tulajdonsága:
-
A
now
egy speciális, time
típusú változó
-
Értéke kiolvasva az aktuális ChucKi idő
-
Módosítása a következő mellékhatásokkal jár:
-
idő léptetése (lásd lenti példa)
-
az aktuális folyamat (shred) felfüggesztése, amíg a kívánt idő el nem telik,
lehetővé téve más shredeknek és szintetizátoroknak a futást
-
A
now
értéke csak akkor változik, ha módosítják
// kiszámítjuk "5 másodperc múlva" értékét
now + 5::second => time later;
// amíg el nem érjük later-t...
while( now < later )
{
// now értékének kiírása
<<< now >>>;
// idő léptetése 1 másodperccel
1::second => now;
}
Idő léptetése
Az idő léptetése lehetővé teszi más shredek futását, és az audió szabályozott előállítását.
Az idő léptetésének fajtái:
-
Egy időtartam "chuckolása" (=>)
now
-ba: az idő léptetése az időtartammal
-
Egy idő "chuckolása" (=>)
now
-ba: az idő léptetése az időpillanatig (az
elérendő időnek az aktuális időnél később kell lennie)
-
Egy
Event
"chuckolása" (=>) now
-ba: az idő addig telik, amíg az esemény
ki nem váltódik
Idő léptetése időtartammal
// idő léptetése 1 másodperccel
1::second => now;
// idő léptetése 100 ezredmásodperccel
100::ms => now;
// idő léptetése 1 mintával
1::samp => now;
// idő léptetése kevesebb, mit 1 mintával
.024::samp => now;
Idő léptetése időpillanatig
// later kiszámítása
now + 4::hour => time later;
// idő léptetése later-ig
later => now;
A ChucK sosem mulaszt el egyetlen időpontot sem (kivéve ha össeomlik a virtuális gép)!
A cél időpillanatnak nagyobb-egyenlőnek kell lennie now
-nál, vagy kivétel
váltódik ki.
Idő léptetése eseménnyel
// várakozás eseményre
e => now;
A léptetés bárhol elhelyezhető a kódban.
// útvonal: szinusz oszcillátor -> kimenet
SinOsc s => dac;
// végtelen ciklus
while( true )
{
// véletlenszerű frekvencia 30 és 1000 között
Std.rand2f( 30, 1000 ) => s.freq;
// idő léptetése 100 ezredmásodperccel
100::ms => now;
}
Nincs megkötés az idő léptetésének mértékére (a lebegőpontos típus
pontosságán kívül). Legyen az időtartam egy ezredmásodperc, egy minta,
vagy tíz év, a rendszer annak megfelelően, determinisztikusan fog viselkedni.