今日はsndbuf

サウンドを読み込むには2通りあるが、今日はsndbufを。

sndbuf f => dac;
"sample.wav" => f.read;
f.samples()::samp => now;

.samples()は音声ファイルのサイズを取得します。他にも10 =>f.loopで再生を10回繰り返したり、.pos()で再生位置を取得したり、いろいろ便利な機能がありますが、それはドキュメントで確認あれ。
それではファイル再生の再生速度をオシレータでコントロールする。

sndbuf buf => dac;
sinosc s => blackhole;
10 => buf.loop;
"loop.wav" => buf.read;
2 => s.freq;
while( true )
{
    1.1 + s.last() => buf.rate;
    1::samp => now;
}

ChucKはどこをどう繋いでいるのかわかりにくい。オシレータ同士なら周波数変調や位相変調はsyncで指定できるが、他のユニットはそれがないみたいなので。しかしlast()を使うことで出力値をスナップできる。これだとちょっとうまくない感が、、、。
今度はsunbuf.ckを改良し、例えばドラムループを読み込んで、サンプルの再生位置をランダムにしヘンテコナなドラムループを作ってみた。

sndbuf buf => dac;
"sdrum.wav" => buf.read;
buf.samples() => int jun;
150 => int x;
while( x > 0 )
{
    std.rand2(0, jun) => buf.pos;//再生位置
    std.rand2f(.2, .9) => buf.gain;
    std.rand2f(.1, 2.0) => buf.rate;//再生速度
    std.rand2f(.1, .9)::second => now;
    1 -=> x;
}