0

如果我使用 OSCdef 来监听函数的变化,例如:

OSCdef('listen', {
    arg msg;

    ~trigger = msg[5]; // This value is 0 when off, 1 when on

    ~amp = msg[3].linexp(0.0, 1.0, 0.7, 0.8 );
    ~dur = msg[4].linexp(0.1, 1.0, 1.0, 0.01);
    ~pitch = msg[4].linlin(0.0, 1.0, 80, 800);
}, '/ctrl');

触发时~trigger,变量变为 1。我想播放合成器或打开 env 来更改声音。

但是,当~trigger开火时,它会随机开火 10 秒,因此您将有 1,1,0,1,0,0,0,1,0,01,01,01,01,1,01 等 10秒。

我想知道是否有可能抓住第一个 1,播放一个事件并在接下来的 10 秒内忽略剩余的触发器

4

1 回答 1

1

值得一看的“抑制触发器”:

传递或抑制触发器:您可能需要连续生成触发器,但仅在满足条件时才允许触发器生效。乘法很好地处理了这个问题:条件 * 触发器。由于条件在 false 时评估为 0,因此触发器将被 0 替换,并且不会发生任何事情,如所愿。\ \ 对于一个简单的情况,让我们通过抑制在前一个之后 1/4 秒内发生的触发器来优化麦克风幅度示例。var mic = In.ar(8, 1), 幅度 = Amplitude.kr(mic), trig = 幅度 > 0.2,
timer = Timer.kr(trig), // 自上次触发以来多久了?
过滤的Trig =(定时器> 0.25)*触发;

SendTrig.kr(filteredTrig, 0, 幅度);

来源:https ://supercollider.github.io/tutorials/If-statements-in-a-SynthDef.html

于 2018-10-17T10:12:12.150 回答