使用样品缓冲液控制Env的振幅和释放

时间:2017-10-18 06:31:40

标签: supercollider

我有一个非常短的示例文件,它在以下循环中通过Synth播放。

我希望样本的幅度和持续时间与单独振荡器的Env的振幅和释放相匹配。

(很快,实时输入将取代样本文件,如果这有助于澄清我正在采取的路径。)

问题#1

以下Env + SinOsc尝试无效:

(

s = Server.local;

b = Buffer.read(s, "/Users/freen/Desktop/a_rook_is_placed.wav");

SynthDef("aRookIsPlaced", { arg out=0, bufnum=0, rate=1, trigger=1, startPos=0, loop=0;
    var sampleBuf,
        env,
        amp,
        sig,
        bufRate = BufRateScale.kr(bufnum) * rate,
        bufStartPos = BufFrames.ir(bufnum) * startPos;

    sampleBuf = PlayBuf.ar(1, bufnum, bufRate, trigger, bufStartPos, loop);

    amp = Amplitude.kr(sampleBuf);
    env = EnvGen.kr(Env.perc(0.001, 4, amp), doneAction: 2);
    sig = SinOsc.ar(300, mul:env);

    Out.ar(out, sig ! 2);
}).add;

Routine({
    while ({ true }, {

        Synth(\aRookIsPlaced, [\out, 0, \bufnum, b.bufnum]);

        rrand(0.9, 1.7).wait;
    });
}).play(AppClock);

)

使用Pulse(无环境)的类似练习有效:

(

s = Server.local;

b = Buffer.read(s, "/Users/freen/Desktop/a_rook_is_placed.wav");

SynthDef("aRookIsPlaced", { arg out=0, bufnum=0, rate=1, trigger=1, startPos=0, loop=0;
    var sampleBuf,
        sig,
        bufRate = BufRateScale.kr(bufnum) * rate,
        bufStartPos = BufFrames.ir(bufnum) * startPos;

    sampleBuf = PlayBuf.ar(1, bufnum, bufRate, trigger, bufStartPos, loop);

    sig = Pulse.ar(90, 0.3, Amplitude.kr(sampleBuf));

    Out.ar(out, sig ! 2);
}).add;

Routine({
    while ({ true }, {

        Synth(\aRookIsPlaced, [\out, 0, \bufnum, b.bufnum]);

        rrand(0.9, 1.7).wait;
    });
}).play(AppClock);

)

问题#2

我不确定如何访问缓冲区长度,以用作Env的版本。

1 个答案:

答案 0 :(得分:1)

第1期

Env.perc级别在创建时固定。 (文档在这个恕我直言,并不是非常清楚。)而是调整EnvGen的水平。

此外,EnvGen应该是音频费率。

尝试env = EnvGen.ar(Env.perc(0.001, 4), levelScale:amp, doneAction: 2);

你会得到一个由样本幅度调制的打击乐包络;假设你追求的是什么。

第2期

尝试BufDur