今日は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; }