バスなど
バスというのはチャンネルとかシールドみたいな理解でいいのか。
通常の左右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…と減っていくから、係数が小さいとより短命である、ということかと。