ChucK
From Wikipedia, the free encyclopedia
Paradigm: | multi-paradigm: procedural, object-oriented, on-the-fly programming |
---|---|
Appeared in: | 2003 |
Designed by: | Ge Wang and Perry Cook |
Typing discipline: | strong, static / dynamic |
OS: | Cross-platform |
License: | GPL |
Website: | http://chuck.cs.princeton.edu/ |
ChucK is a concurrent, strongly-timed audio programming language for real-time synthesis, composition, and performance, which runs on Mac OS X, Linux, and Windows. It is designed to favor readibility and flexibility for the programmer, over other considerations such as raw performance. It natively supports concurrency and multiple, simultaneous, dynamic control rates. Another key feature is the ability to add, remove, and modify code on the fly, while the program is running, without stopping or restarting. It has a highly precise timing model, allowing for arbitrarily fine granularity. It offers composers and researchers a powerful and flexible programming tool for building and experimenting with complex audio synthesis programs, and real-time interactive control.
ChucK is free software distributed under GPL.
[edit] Language Features
- real-time audio synthesis
- precise (sample-synchronous) control over time (strongly-timed)
- powerful and dead-simple concurrent programming model
- syntax and semantics designed to promote readability and maintainability
- the ChucK operator: => is overloaded on types and encourages a left-to-right syntax
- on-the-fly programming
- strongly-typed
- dynamically compiled to ChucK virtual machine bytecode
- unified timing mechanism (no imposed control-rate, can be completely and dynamically throttled by the programmer)
- MIDI
- OpenSound Control
- Synthesis Toolkit unit generators
[edit] Code example
(The following is a simple chuck program that generates sound and music. See more examples here)
// our signal graph (patch) SinOsc s => JCRev r => dac; // set gain .2 => s.gain; // set dry/wet mix .1 => r.mix; // an array of pitch classes (in half steps) [ 0, 2, 4, 7, 9, 11 ] @=> int hi[]; // infinite time loop while( true ) { // choose a note, place in octave, convert to frequency Std.mtof( 45 + Std.rand2(0,3) * 12 + hi[Std.rand2(0,hi.cap()-1)] ) => s.freq; // advance time by 100 ms 120::ms => now; }