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 来实现效果(例如,为了对形状进行精细控制),那么您可以将合成器分成两部分:一个从 a 读取当前频率,Bus并且是一个长寿命的合成器,以及您创建多个实例并从 env 输出到总线的一个 synthdef。然后,每当您触发时,您都会为后一个 synthdef 创建一个添加到实例堆中的新实例。(乱七八糟的哈。)

3)我敢打赌,您可以通过使用 EnvGen 来做一个技巧,而且每次获得触发器时也只需增加基本频率。棘手但可能工作正常。

于 2014-04-19T14:21:29.183 回答