バスなど

バスというのはチャンネルとかシールドみたいな理解でいいのか。
通常の左右2チャンネルの環境だと、0番と1番は音が出ます。
ところが2番以降は音が出ない。これを使ってシンセからシンセに音(とかコントロールレート)を渡してやることが出来るという。
例えば音源のSynthDefとエフェクトのSynthDefを別々に作っておいて、適宜つなげて使うとか、複数のシンセをミックスするとか、系統を分けるとか、そうなるといろいろ便利っぽいですね。
便利っぽいのだが、とりあえずどうやったら使えるのか、という最低限のところを実験。

Buffer.read(s, "hoge.wav", bufnum:10);

SynthDef("hoge", {
var len;
len = BufFrames.ir(10);
p = LFNoise2.ar(10, len/10);
o = BufRd.ar(1, 10, p);
Out.ar(10, o); // バス10番に出力
}).store;

SynthDef("moge", {
var
o = SinOsc.ar(SinOsc.ar(2, 0, 500), 0, 0.5);
Out.ar(10, o); // バス10番に出力
}).store;

SynthDef("mixx", {
var in;
in = In.ar(10, 1); // バス10番を入力
Out.ar(0, Pan2.ar(in, 0));
}).store;

二つのシンセの出力を一つのシンセにまとめてみる。

// 上から順にひとつずつ実行
x = Synth.new(\hoge);		// hogeを立ち上げ
y = Synth.after(x, \moge);	// xの後にmogeを立ち上げ
z = Synth.after(y, \mixx);	// yの後にmixxを立ち上げ

最後のzを実行したときに初めて音が出ます。
つまり10番を通ってる音というのは聴こえない。
こういう書き方をしないと鳴らない、というのはつなぎ順をはっきりさせないと、Inが受け取ってくれないのだろうか。
単にplayでだららーと鳴らすには

SynthDef("hoge", {
var len;
len = BufFrames.ir(10);
p = LFNoise2.ar(10, len/10);
o = BufRd.ar(1, 10, p);
Out.ar(10, o);
}).play;

SynthDef("moge", {
var
o = SinOsc.ar(SinOsc.ar(2, 0, 500), 0, 0.5);
Out.ar(10, o);
}).play;

SynthDef("mixx", {
var in;
in = InFeedback.ar(10, 1); // バス10番をフィードバック入力
Out.ar(0, Pan2.ar(in, 0));
}).play;

InFeedbackを使うとできるみたい。つなぎ順とか関係なしに入ってくるから注意が必要、ということか?

フィードバック

ところでフィードバックとは、出口と入口をくっつける、というようなやり方で、うまくすると面白い効果が作れる。
のだが、フィードバックの音量が1を超えると無限に増殖して音が爆発するので、フィードバック係数と言って1未満の数を掛けてやるのが一般的。
ところでシンセ内部でフィードバックさせるにはローカルというのが使える。

SynthDef("hoge", {
var len;
i = LocalIn.ar(1);		// ローカルから入力
len = BufFrames.ir(10);
p = LFNoise2.ar(10, len/10);
o = BufRd.ar(1, 10, p);
d = DelayN.ar(o+i, 0.5, 0.5);	// ディレイ
LocalOut.ar(d*0.9);		// ローカルに出力
Out.ar(0, Pan2.ar(d, 0));
}).play;

わけわからん出音ですが。これは0.5秒遅らせたのをフィードバックすることで1.0秒、1.5秒、2.0秒…の遅れのかたまりを作っていると。
DelayNのところでフィードバック入力を混ぜてますが、これがないとフィードバックになりませぬ。
あとLocalOutのところの0.9がフィードバック係数。フィードバックごとに音量が0.9、0.81、0.729、0.6561…と減っていくから、係数が小さいとより短命である、ということかと。