This is a very basic example, simply to show how the syntax of a little interactive
programming session could look like. For more, see for example here
Some live coding exercitiae
// boot the server
s.boot;
// a synth definition, this can be edited on-the-fly, just select and hit enter
(
SynthDef(\noiseGrain,
{ arg out = 0, freq=800, sustain=0.001, amp=0.5, pan = 0; // this are the arguments of the synth function
var window;
window = Env.perc(0.002, sustain, amp); // exponential decay envelope
Out.ar(out, // write to output bus
Pan2.ar( // panning
Ringz.ar(PinkNoise.ar(0.1), freq, 2.6), // filtered noise
pan
) * EnvGen.ar(window, doneAction:2) // multiplied by envelope
)
}
).store;
)
Tdef(\geoff).play; // play a lazy task (it's a routine)
(
Tdef(\geoff, {
loop { // do forever (well, until we replace the definition..)
Synth(\noiseGrain, [\freq, exprand(300, 5000)]); // start random grain on the server
0.2.wait; // wait a little
}
})
)
// this can be changed while playing at any time:
(
Tdef(\geoff, {
loop {
20.do {
Synth(\noiseGrain, [\freq, exprand(300, 5000)]); // start a grain on the server
0.2.wait; // wait a little
};
5.do { |i|
Synth(\noiseGrain, [\freq, 400 * i + 500, \sustain, 0.01]); // a little sweeplet
0.1.wait;
}
}
})
)
// also subroutines can be forked off:
// define another task
(
Tdef(\lisa, {
5.do { |i|
Synth(\noiseGrain, [\freq, 400 * i + 500, \sustain, 0.01]); // a little sweeplet
0.1.wait;
}
});
)
(
Tdef(\geoff, {
loop {
Synth(\noiseGrain, [\freq, exprand(300, 5000)]); // start a grain on the server
0.2.wait; // wait a little
Tdef(\lisa).fork; // fork a therad
}
})
)