Here is the code I used for the audio examples. Sorry about the mixed tabs and spaces.
(
SynthDef(\kick, {
var snd, duration, velocity;
duration = \duration.kr(1.0);
velocity = duration.linlin(1, 0, 1, 0);
snd = SinOsc.ar(
60
* (1 + (8 * Env.perc(0, 0.001).ar * velocity))
* (1 + (8 * Env.perc(0, 0.03).ar * velocity))
* (1 + (0.5 * Env.perc(0, 0.3).ar * velocity))
* ([1, -1] * 0.1).midiratio
);
snd = snd * (1 + (Env.perc(0, 0.03).ar * velocity));
snd = snd + (BPF.ar(Hasher.ar(Sweep.ar), 8321, 0.3) * Env.perc(0.001, 0.003).ar * 1.dbamp * velocity);
snd = snd.tanh;
snd = snd + (BPF.ar(Hasher.ar(Sweep.ar), 3321, 0.3) * Env.perc(0.03, 0.05).ar * -10.dbamp * velocity);
snd = snd * velocity.sqrt;
snd = snd + GVerb.ar(snd.sum * -30.dbamp, 30, 1);
snd = snd * Env.perc(0.001, duration.min(0.6)).ar(Done.freeSelf);
snd = snd * -3.dbamp;
Out.ar(\out.kr(0), snd);
}).add;
SynthDef(\snare, {
var snd;
snd = SinOsc.ar(
260
* (1 + (3 * Env.perc(0.001, 0.04, curve: -6).ar))
* [1, 4.3, 8.4]
);
snd = snd * [0, -8, -12].dbamp;
snd = snd * Env.perc(0.001, [0.3, 0.1, 0.03]).ar;
snd = snd.sum;
snd = snd + (BPF.ar(WhiteNoise.ar, 2310, 0.25) * Env.perc(0.03, 0.3).ar * 12.dbamp);
snd = snd + (BPF.ar(WhiteNoise.ar, 7310, 0.3) * Env.perc(0.003, 0.04).ar * 8.dbamp);
snd = snd.tanh;
snd = snd + PitchShift.ar(snd, 0.06, 2.4);
snd = snd + PitchShift.ar(snd * -5.dbamp, 0.08, 1.3);
snd = snd * Env.linen(0.001, 0.23, 0.01).ar(Done.freeSelf);
snd = snd * -7.dbamp;
snd = snd ! 2;
Out.ar(\out.kr(0), snd);
}).add;
)
// Pwhite-into-dur rhythm: BORING
(
Routine({
20.do {
s.bind { Synth(\kick) };
rrand(0.03, 0.6).wait;
};
}).play;
)
// Accelerating rhythm
(
Routine({
3.do {
(0.75 ** (0..10)).do { |duration|
s.bind { Synth(\kick) };
duration.wait;
};
};
}).play;
)
// Recursion, level 1
(
Routine({
((0.8 ** (0..8)).normalizeSum * 15.0).do { |phraseDuration|
((0.75 ** (0..10)).normalizeSum * phraseDuration).do { |duration|
s.bind { Synth(\kick) };
duration.wait;
};
};
}).play;
)
// Velocity variation
(
Routine({
((0.8 ** (0..8)).normalizeSum * 15.0).do { |phraseDuration|
((0.75 ** (0..10)).normalizeSum * phraseDuration).do { |duration|
s.bind { Synth(\kick, [duration: duration]) };
duration.wait;
};
};
}).play;
)
// Interruption with snare
(
Routine({
((0.8 ** (0..8)).normalizeSum * 15.0).do { |phraseDuration|
((0.75 ** (0..10)).normalizeSum * phraseDuration).do { |duration|
s.bind { Synth(\kick, [duration: duration]) };
duration.wait;
};
if(0.5.coin) {
s.bind { Synth(\snare) };
0.28.wait;
};
};
}).play;
)
// Three levels of acceleration
(
Routine({
((0.8 ** (0..8)).normalizeSum * 50.0).do { |sectionDuration|
((0.8 ** (0..8)).normalizeSum * sectionDuration).do { |phraseDuration|
((0.75 ** (0..10)).normalizeSum * phraseDuration).do { |duration|
s.bind { Synth(\kick, [duration: duration]) };
duration.wait;
};
if(0.5.coin) {
s.bind { Synth(\snare) };
0.28.wait;
};
};
};
}).play;
)
// Hierarchy of mixed acceleration/deceleration
(
Routine({
((0.8 ** (0..8)).normalizeSum * 50.0).do { |sectionDuration|
((0.8 ** (0..8)).normalizeSum.reverse * sectionDuration).do { |phraseDuration|
((0.75 ** (0..10)).normalizeSum * phraseDuration).do { |duration|
s.bind { Synth(\kick, [duration: duration]) };
duration.wait;
};
};
};
}).play;
)
// Sorted random rhythm
(
Routine({
(({ exprand(0.01, 0.5) } ! 20).sort.normalizeSum * 3.5).do { |duration|
s.bind { Synth(\kick, [duration: duration]) };
duration.wait;
};
}).play;
)
// Self-similar rhythms, a la John Cage
(
Routine({
var row;
row = [0.2, 1, 1.4, 0.8, 1].normalizeSum;
(row * 20.0).do { |sectionDuration|
(row * sectionDuration).do { |phraseDuration|
(row * phraseDuration).do { |duration|
s.bind { Synth(\kick, [duration: duration]) };
duration.wait;
};
};
};
}).play;
)
// Sinusoidal rhythm
(
Routine({
30.do { |i|
var duration;
duration = cos(i * 2pi / 20).linlin(-1, 1, 0.05, 0.2);
s.bind { Synth(\kick, [duration: duration]) };
duration.wait;
};
}).play;
)
// Gridless discrete rhythms
(
Routine({
30.do { |i|
var duration;
duration = [0.02, 0.1, 0.432].choose;
s.bind { Synth(\kick, [duration: duration]) };
duration.wait;
};
}).play;
)