3

次のコードがあります。これは、シンセ機能を1秒間再生し、停止し、1秒後にもう一度再生するというようになります。

    t = Task({{
    var a;
    a =  {[0,0,SinOsc.ar(852, 0, 2.2)+SinOsc.ar(1633, 0, 2.2), 0]} ;
    a.play;
    1.wait;
    a.release(5);
    1.wait;
   }.loop});

   t.play;

問題は、aが再生を停止しないことですが、追加のaがサーバーで開始されます。ここで何が問題になっていますか?シンセサイザーの再生を停止するにはどうすればよいですか?

4

1 に答える 1

4

そのコードでは、aは関数であるため、a.releaseはシンセに再生を停止するように指示しません。

代わりに、5秒の単独エンベロープを含むSynthDefを作成してみませんか。

SynthDef(\sines, {arg out = 0, release_dur, gate =1, amp = 0.2;
    var sines, env;
    env = EnvGen.kr(Env.asr(0.01, amp, release_dur), gate, doneAction:2);
    sines = SinOsc.ar(852, 0, 2.2)+SinOsc.ar(1633, 0, 2.2);
    Out.ar(out, sines * env);
}).add

t = Task({{
    var a;
    a =  Synth.new(\sines, [\release_dur, 5, \out, 0, \amp, 0.2, \gate, 1]);
    1.wait;
    a.set(\gate, 0);
    1.wait;
   }.loop});

   t.play;

リリース期間を引​​数として渡すので、以下のタスクのa=Synth行で設定できます。

次に、シンセを終了する場合は、ゲート0を送信します。これにより、エンベロープにリリースするように指示されます。これは5秒以上実行され、doneActionはサーバーからシンセを削除します。リリース時間は待機時間よりも長いため、一度に複数のシンセが再生されることに注意してください。

また、サインの振幅を1より大きく設定しました。上記のsynthdefではこれを変更しませんでした。

于 2013-02-05T11:46:45.810 に答える