1

非リターン エンベロープを使用しようとしています (つまり、その中のセグメントが 0 に戻りません)。次のコードでは、エンベロープenvを複数回トリガーできないことがわかりました。

(
SynthDef(\stupidSynth,
    {
        |t_trig|
        var env, envShape, audio, env2;
        envShape = Env.new([0, 1], [0.5], \sine);
        env = EnvGen.kr(envShape, t_trig);
        env2 = EnvGen.kr(Env.perc, t_trig);
        audio = SinOsc.ar(400 + (env * 100)) * env2 * 0.1;
        Out.ar(0, audio);
    }
).add;
)

(
p = Pmono(*[
    \stupidSynth,
    \t_trig, 1
]
).play;
)

私が望んでいたのは、シンセが再トリガーされるたびに、ピッチがどんどん高くなることでした。実際に何が起こるかというと、最初のノートがピッチ エンベ​​ロープを再生し、後続の各ノートがちょうど最終 (つまり高い) 周波数になります。env明らかに再トリガーされていません。

これがなぜなのかはわかりません。エンベロープは、再トリガーする前に 0 に戻す必要はありません。終了する前にエンベロープを再トリガーすることは完全に可能です。私の封筒に何か問題があります。

私は基本的に の動作を持つものを探していますが、再Lineトリガーしてカスタマイズ可能な曲線を持つこともできます。

私がやろうとしていることは可能ですか?

4

2 に答える 2

3

いつものように、これは私の誤解でした。エンベロープ再トリガーされることがわかりました。指定された開始点から開始しないだけです。常に現在の値から開始します。エンベロープが終了する前に再トリガーされる可能性があるため、これは実際には理にかなっています。

したがって、私が投稿したコードの唯一の問題は、エンベロープが一度実行されると、その後実行されるたびに、エンベロープの終点である現在の値からエンベロープの終点に移動することです。つまり、エンベロープは変更されません。なんでも。

次のコードは、開始点が無関係であることを示しており、私が求めていた動作の種類を示しています。

(
SynthDef(\test,
    {
        |freq = 300, on = 1, amp = 0.2, t_pitchEnv = 0, pitchEnvEnd = 1|
        var audio, onswitch, pitchEnv;
        onswitch = EnvGen.kr(Env.cutoff(5, curve: \exp), on, doneAction:2);
        pitchEnv = EnvGen.kr(Env.new([0, pitchEnvEnd], [1], \sine), t_pitchEnv) * freq;
        audio = SinOsc.ar(freq + pitchEnv, mul: amp * onswitch);
        Out.ar(0, audio ! 2);
    }
).add;
)

x = Synth(\test);
x.set(\t_pitchEnv, 1, \pitchEnvEnd, 1);
x.set(\t_pitchEnv, 1, \pitchEnvEnd, 2);
x.set(\t_pitchEnv, 1, \pitchEnvEnd, 1);
x.set(\t_pitchEnv, 1, \pitchEnvEnd, 0);
x.set(\on, 0);
于 2014-08-30T09:52:41.440 に答える
1

封筒に問題はありません。エンベロープが再トリガーされるたびに、以前に出力していたものに新しい出力を「追加」するかのように動作する必要があるかのように考えていますが、これはエンベロープの動作ではありません。エンベロープをトリガーすると、常にリスタート ポイント (通常は開始点) にジャンプします。出力されたものの長期記憶のような概念はありませんEnvEnvGen

あなたがやりたいことをする方法:

1)エンベロープを使用して「メモリフル」動作を実現する代わりに、インテグレータのようなものを使用してからラグを実行します。

(
SynthDef(\stupidSynth,
    {
        |t_trig|
        var env, envShape, audio, env2, note;
        note = 67 + Integrator.kr(t_trig * 5).lag(0.2); /* up by 5 semitones at a time */
        env2 = EnvGen.kr(Env.perc, t_trig);
        audio = SinOsc.ar(note.midicps) * env2 * 0.1;
        Out.ar(0, audio);
    }
).add;
)

(
p = Pmono(*[
    \stupidSynth,
    \t_trig, 1
]
).play;
)

2) どうしても Env を使用してエフェクトを実現したい場合 (形状の微調整など)、シンセを 2 つに分けることができますBus。複数のインスタンスを作成し、環境からバスに出力する1つのsynthdef。次に、トリガーするたびに、後者のシンセ定義のインスタンスの山に追加される新しいインスタンスを作成します。(面倒ですね。)

3) あなたがやっているように EnvGen を使用することでできるトリックがあると思いますが、トリガーを取得するたびに基本周波数を単純にインクリメントすることもできます。トリッキーですが、うまくいくかもしれません。

于 2014-04-19T14:21:29.183 に答える