Управляйте амплитудой и высвобождением Env с помощью Sample Buffer

У меня есть очень короткий образец файла, который воспроизводится через синтезатор в следующем цикле.

Я хочу, чтобы амплитуда и продолжительность сэмпла согласовывались с амплитудой и высвобождением 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 (без Env) работает:

(

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.


person Daniel B.    schedule 18.10.2017    source источник


Ответы (1)


Выпуск 1

Уровень Env.perc фиксируется во время создания. (ИМХО, документация не очень ясна.) Вместо этого измените уровень EnvGen.

Кроме того, EnvGen, вероятно, должно быть скоростью звука.

Попробуйте env = EnvGen.ar(Env.perc(0.001, 4), levelScale:amp, doneAction: 2);

Вы получите огибающую ударных, которая модулируется амплитудой сэмпла; предполагая, что это то, что вам нужно.

Выпуск 2

Попробуйте BufDur.

person ezra buchla    schedule 20.10.2017
comment
EnvGen должен быть .kr. - person les_h; 09.03.2018
comment
это соответствовало бы примеру, но я не полностью согласен. OP запрашивает огибающую с временем атаки 1 мс, которая будет звучать намного лучше при скорости звука. - person ezra buchla; 13.03.2018