ディスクから読み取ったサウンド サンプルをそれぞれ含むバッファの配列をループしようとしていますが、SynthDef を取得してバッファへのポインタをリセットするのに問題があります。
私は次のことをしました:
サウンド ファイルのフォルダーがあり、それらすべてを "~buffers" という名前のバッファーの配列に読み込んだとします。
配列を順番に調べて、サンプルを連続して再生し、最後のサンプルの後に停止したいだけです。
シンプルな SynthDef を定義し、それを呼び出す Synth を Routine に入れます。
( SynthDef(\playBuffer,{arg out = 0, buf; var sig; sig = PlayBuf.ar(2, buf, doneAction: Done.freeSelf); Out.ar(out, sig); }).add ~routine = Routine({ ~buffers.do({ arg item; var synth; synth = Synth(\playBuffer, [\buf, item]); item.duration.wait; synth.free; }); }); ~routine.play; )
期待どおりに動作しません--- シンセは、異なるサンプルに対応する持続時間にもかかわらず、常に最初のサウンドと同じサウンドを再生しています。
問題は、\playbuffer SynthDef 内の関数 (少なくともヘルプ ファイルによると) が、ループ内の別の bufnum 引数で再評価されないことだと思います。
実際、synthDef と Synth をオンザフライで作成する Buffer.play を使用すると、バッファをループできます。私のルーチンをこのコードに置き換えるとうまくいきます:
(
~routine2 = Routine({
~buffers.do({
arg item;
item.play;
item.duration.wait;
});
});
~routine2.play;
)
BUT: Buffer.play の mul パラメータを使用して振幅を変更する以外は、バッファ出力を操作できないため、非常に粗雑です。私がやりたいことは、Buffer.play の動作を複製することです--- SynthDef と Synth をオンザフライで作成します--- 自分のコードで。しかし、私はそれで運がありません。実際、どこから始めればよいかわかりません。おそらく、SuperCollider のサーバーの関数の処理を完全に把握していないためです。シンセ作成関数を作成し、それをルーチンのループ内で使用する必要がありますか? または、SynthDef の定義をループ内に移動する必要がありますか (同等のようです)。後者を試しましたが、それでも同じサウンドが再生されました。
おそらく私はこれを間違った方法で行っています---私は SuperCollider に非常に慣れていません。