ChucK
miniAudicleを使った習作。
http://sites.google.com/site/kn1kn1pages/Home/20090320.mp3?attredirects=0
=>演算子が楽しい。ファイルの相対パスの記述のやり方がまだ分からず…
1::minute / 120 => dur DUR_4BEAT;
DUR_4BEAT * 4 => dur DUR_BAR;
DUR_BAR - (now % DUR_BAR) => now;
DUR_4BEAT / 4 => dur DUR_16BEAT;
Gain g => dac;
//Gain g => WvOut w => blackhole;
//"20090320.wav" => w.wavFilename;
.8 => g.gain;
SndBuf k => g;
"/Applications/miniAudicle/documentation/examples/data/kick.wav"
=> k.read;
SndBuf h => g;
"/Applications/miniAudicle/documentation/examples/data/hihat.wav"
=> h.read;
SinOsc s => ADSR e => JCRev r => g;
(0::ms, 100::ms, .5, 20::ms) => e.set;
.1 => r.mix;
[0, 3, 7, 10] @=> int NOTES[];
float freq[];
int sine[];
int hat[];
int kick[];
// time loop
for (0 => int count;;1 +=> count) {
count % 16 => int i;
if ((count / 16) == 16) {
break;
}
if ((count / 16) % 4 == 0) {
(16, NOTES) => notes2freqs @=> freq;
(16, 0, 1) => rands @=> sine;
(16, 0, 1) => rands @=> hat;
(16, 0, 1) => rands @=> kick;
}
freq[i] => s.freq;
sine[i] * .4 => s.gain;
0 => h.pos;
hat[i] * .3 => h.gain;
0 => k.pos;
kick[i] * .4 => k.gain;
if (i == 0) {
.8 => k.gain;
}
if (i == 3) {
.8 => k.gain;
}
e.keyOn();
DUR_16BEAT => now;
}
//w.closeFile();
fun float[] notes2freqs(int size, int notes[]) {
float freqs[size];
for (0 => int i; i < size; i++) {
(Std.rand2(0, 1) * 11 + 60
+ notes[Std.rand2(0, notes.cap() - 1)])
=> Std.mtof => freqs[i];
}
return freqs;
}
fun int[] rands(int size, int from, int to) {
int rands[size];
for (0 => int i; i < size; i++) {
Std.rand2(from, to) => rands[i];
}
return rands;
}