1

シンセを作成し、その出力をエフェクトユニットにルーティングする次の単純なシンセ構造を構築しました。

b = Bus.audio(numChannels: 2);

SynthDef(
    "mySynth",
    {
        |freq, amp, gate = 1|
        var vol = 0.5;
        var audio = Pulse.ar(freq, 0.5);
        var env = EnvGen.kr(Env.perc, doneAction:2);
        audio = Pan2.ar(audio, MouseX.kr(-1, 1));
        Out.ar(b, audio * env);
    }
).add;


SynthDef(
    "effects",
    {
        var audio = In.ar(b, 2);
        audio = LPF.ar(audio, MouseY.kr(200, 1000));
                    //TODO: Implement some crazy, revolutionary effects
            Out.ar(0, audio);
    }
).add;

// **** Dividing line for executing the code ****

e = Synth(\effects);

p = Pbind(*[
    instrument: \mySynth,
    scale: #[0, 2, 4, 5, 7, 9, 11],
    degree: Pseq([3,        3,      9,      9,      2,      9,      9,      3,      5,      7], inf),
    dur:        Pseq([0.2,  0.2,    0.2,    0.1,    0.1,    0.2,    0.2,    0.2,    0.1,    0.1], inf),
    amp:        Pseq([1,        0.6,    0.9,    0.3,    0.4,    0.9,    0.6,    0.85,   0.3,    0.4], inf),
]);

p.play;

これは、特定の方法でコードを実行した場合にのみ可聴出力を生成します。

  • 各ブロックを順番に個別に実行でき、可聴出力が得られます。
  • 「区切り線」コメントまでの最初のブロックを実行し、その後に続くブロックを実行すると、可聴出力が得られます。
  • すべてのコードをまとめて実行すると、音声出力が得られません。

サーバーがセットアップを設定している間、 aSynthDefを宣言してから を使用してインスタンス化するまでの間に、ある程度の遅延が必要だと思います。Synth()誰でも光を当てることができますか?

4

3 に答える 3

2

私は通常、これを Server.sync() メソッドで回避します。すべての非同期サーバー コマンドが完了するまで、囲んでいるスレッド (Routine など) の実行を一時停止します。これには、SynthDef の送信とバッファの割り当てが含まれます。より明示的な制御のために、Condition 引数を Server.sync() に渡すことができます。

たとえば、このブロックを一度に実行できます。

s = Server.local;
s.boot;
s.doWhenBooted({
    Routine {
        SynthDef.new(\sine, {
            arg out=0, hz=220, dur=4.0;
            var snd, amp;
            snd = SinOsc.ar(hz);
            amp = EnvGen.ar(Env.linen(0.1, dur, 0.1), doneAction:2);
            Out.ar(out, (amp*snd).dup);
        }).send(s);
        s.sync; // waits here
        x = Synth.new(\sine);
    }.play;
});
于 2014-10-09T19:19:19.303 に答える
1

これは、サーバーに SynthDefs を「追加」して、同じ実行でそのシンセのインスタンスを作成することはできないためです。実行時にシンセを「再生」すると、それらのインスタンスがサーバーに追加されるため、実行のためにシンセを呼び出したときにすでにロードされています。作業コードは以下に含まれています。

(
b = Bus.audio(numChannels: 2);

SynthDef(
    "mySynth",
    {
        |freq, amp, gate = 1|
        var vol = 0.5;
        var audio = Pulse.ar(freq, 0.5);
        var env = EnvGen.kr(Env.perc, doneAction:2);
        audio = Pan2.ar(audio, MouseX.kr(-1, 1));
        Out.ar(b, audio * env);
    }
).play;

SynthDef(
    "effects",
    {
        var audio = In.ar(b, 2);
        audio = LPF.ar(audio, MouseY.kr(200, 1000));
                    //TODO: Implement some crazy, revolutionary effects
            Out.ar(0, audio);
    }
).play;



// **** Dividing line for executing the code ****

e = Synth(\effects);

p = Pbind(*[
    instrument: \mySynth,
    scale: #[0, 2, 4, 5, 7, 9, 11],
    degree: Pseq([3,        3,      9,      9,      2,      9,      9,      3,      5,      7], inf),
    dur:        Pseq([0.2,  0.2,    0.2,    0.1,    0.1,    0.2,    0.2,    0.2,    0.1,    0.1], inf),
    amp:        Pseq([1,        0.6,    0.9,    0.3,    0.4,    0.9,    0.6,    0.85,   0.3,    0.4], inf),
]);

p.play;
)
于 2013-09-03T07:58:54.123 に答える
1

それは、synthdef を宣言してから準備が整うまでの遅延に関係していると確信しています。

コードをどのように変更する必要があるかをすぐに正確に説明できるほどの経験はありませんsclang(私は通常、OSC 経由で scsynth を使用し、sclang を使用して SynthDefs を記述しますcompletionMsg) SynthDef.add

于 2013-08-17T15:35:45.860 に答える