サウンドバッファ
メディアファイルを処理したり再生するには、まずSndBufというユニットジェネレータにデータを読み込む。"foo.wav"というファイルを読み込んで再生するだけなら、
SndBuf buf => dac; "foo.wav" => buf.read; buf.samples()::samp => now;
readにファイル名を突っ込めば読み込み完了。samplesで読み込んだデータのサンプル数を取得できる。
exampleのsndbuf.ckを少し改変してみた。ローカルに適当な素材がなかったのでOSに付いてるやつを使った。まだXP…。あ、素材の並びに特に意味はないよ。
["C:/WINDOWS/Media/Windows XP Startup.wav", "C:/WINDOWS/Media/Windows XP Logon Sound.wav", "C:/WINDOWS/Media/Windows XP Notify.wav", "C:/WINDOWS/Media/Windows XP Exclamation.wav", "C:/WINDOWS/Media/Windows XP Error.wav", "C:/WINDOWS/Media/Windows XP Critical Stop.wav", "C:/WINDOWS/Media/Windows XP Logoff Sound.wav", "C:/WINDOWS/Media/Windows XP Shutdown.wav"] @=> string fname[]; fname.cap() => int n; SndBuf buf[n]; for (0 => int i; i < n; i++) fname[i] => buf[i].read; for (0 => int i; ; (i + 1) % n => i) { 0 => buf[i].pos; // posは再生位置で0からsamplesまでの範囲 buf[i] => dac; Std.rand2f(.2, .9) => buf[i].gain; Std.rand2f(.5, 1.5) => buf[i].rate; // rate倍速 (buf[i].samples() / buf[i].rate())::samp => now; buf[i] =< dac; }
ChucKでは文字列はstringというオブジェクトで扱う。文字列操作はまだほとんど実装されてないので不便。出力もデバッグプリントしかないし。
それぞれのSndBufは実際に再生するときだけdacにつなぐようにした。演算子「=<」*1はUnChucK演算子といってChucK演算子でつないだユニットジェネレータ同士の接続を切るときに使う。
*1:「!=>」でもOK