ChucK

ChucK är ett textbaserat programmeringsspråk som används för att generera ljud och underlätta algoritmisk komposition. Det skapades 2002 som en del av en doktorsavhandling av Ge Wang hos Princetons universitet.

Funktioner
ChucK har stöd för MIDI och OSC, vad det gäller kommunikation med omvärden. Det finns även stöd för en mängd "human interface devices" (HID), såsom multipla möss, joysticks, etc.

Vad det gäller ljudgenerering så finns ljudgeneratorer för en mängd olika oscillatorer (med eller utan övertonsbegränsning för att motverka vikningsdistorsion), LiSa (live sampling), olika filter, en mängd physical modelling-implementationer, delay, reverb etc.

Källkod
ChucK skrivs i ett c-liknande programmeringsspråk med stöd för objektorientering och stark typning.

En karakteristisk detalj i språket är operatorn => som kallas "ChucK-operatorn", och som används för tilldelning samt för att koppla ihop "unit generators" (UGens), som är de byggblock som skapar eller behandlar ljud.

4 => int v; deklarerar variabeln v och ger den värdet 4.

SinOsc myOsc => dac deklarerar variablen myOsc (som är en UGen som levererar en konstant sinuston) och kopplar den till det globala objektet "dac", som levererar ljud till datorns ljudutgång

Det finns inte något enkelt stöd för egenutvecklade ljudgeneratorer i ChucK. Två lösningar för detta finns:
 * Man kan göra en funktion som väntar en samplingstid i taget (dvs 1/44100) sekunder i taget, räknar ut och sätter vågformsvärdet i varje steg.
 * ChucK är open-source, så man kan ladda ner källkoden för plattformen (skriven i C++) och implementera en egen UGen.

Runtime
Fokus i ChucK ligger på att hålla programmets klocka stabil. Detta får några speciella effekter:
 * Man kan använda klockan som en variabel, som man adderar tid till. Adderar man 1 millisekund till klockan så kan man vara säker på att det verkligen går exakt en millisekund innan exekveringen fortsätter. Klockan har en mycket precis upplösning, ner till fraktioner av den tid det tar att leverera ett samplingsvärde (1/44100s sekund med defaultinställningar).
 * Det finns ett trådliknande begrepp som kallas shred i ChucK. Man kan starta ett valfritt antal shreds parallellt, men så länge man inte adderar tid till klockan, så kommer det bara vara en shred som exekverar i taget. Så fort en shred adderar tid till klockan så ges tid åt andra shreds att exekvera, om de inte alla ligger i vänteläge
 * Tidssynkronisering underlättas - om två shreds har var sin loop som väntar 1 sekund en miljon gånger, så kommer de varje gång att vakna upp exakt samtidigt - även den miljonte gången.

Om man vill synkronisera på något annat än tid, så kan man använda Events. En shred som lägger sig att vänta på ett event lämnar över exekveringen till andra shreds precis som om man väntar på klockan. Andra kan sedan väcka den som väntar på ett event genom att anropa event.signal.

Länkar

 * ChucKs hemsida: http://chuck.cs.princeton.edu/
 * Det finns ett mycket aktivt och hjälpsamt forum här: http://www.electro-music.com/forum/index.php?f=140