Hi,

I noticed by accident your discussion in
https://github.com/grame-cncm/faustlibraries/pull/80

        ===========
        From @orlarey:

        Your ADSR uses a variable slope for the release. This induces a 
different
        behavior when the gate is shorter than the AD part. That can make sense,
        but replacing the ADSR function with yours would potentially break the
        users' code that relies on the actual behavior.

Yann, please note that (afaics) the current behaviour was introduced
by a70abf508322 ("New faster ADSR envelop generator."), the fix from
Andrey seems to restore the old behaviour before that commit.

Please see the test-case below, the last 2 outputs are the same.

IIR I too tried to report that after a70abf508322 adsr() reacts
to gate=0 differently... probably
https://sourceforge.net/p/faudiostream/mailman/message/36643370/

Oleg.

-------------------------------------------------------------------------------
import("stdfaust.lib");

// adsr before a70abf508322 ("New faster ADSR envelop generator.")
old(a,d,s,r,t) = on*(ads) : ba.sAndH(on) : rel
with{
        on = t>0;
        off = t==0;
        attTime = ma.SR*a;
        decTime = ma.SR*d;
        relTime = ma.SR*r : max(0.001);
        sustainGain = t*s;
        ads = ba.countup(attTime+decTime,off) : ba.bpf.start(0,0) :
                ba.bpf.point(attTime,1) : 
ba.bpf.end(attTime+decTime,sustainGain);
        rel = _,ba.countup(relTime,on) : ba.bpf.start(0) : 
ba.bpf.end(relTime,0);
};

// adsr with Andrey Bundin's fix applied
new(at,dt,sl,rt,gate) = ADS : *(1-R) : max(0)
with {

    // Durations in samples
    an = max(1, at*ma.SR);
    dn = max(1, dt*ma.SR);
    rn = max(1, rt*ma.SR);

    // Deltas per samples
    adelta = 1/an;
    ddelta = (1-sl)/dn;


    // Attack time (starts when gate changes and raises until gate == 0)
    atime = +(gate) ~ *(gate' >= gate);

    // Attack curve
    A = atime * adelta;

    // Decay curve
    D0 = 1 + an * ddelta;
    D = D0 - atime * ddelta;

    // ADS part
    ADS = min(A, max(D, sl));

    // Release time starts when gate is 0
    rtime = (+(1) : *(gate == 0)) ~ _;

    // Release curve starts when gate is 0 with the current value of the 
envelope
    R = rtime/rn;
};

process = ba.pulsen(ba.sec2samp(.09), ba.sec2samp(1/2)) : @(1000)
        <: _, en.adsr(0.1,0.1,0.1, 1), old(0.1,0.1,0.1, 1), new(0.1,0.1,0.1, 1);



_______________________________________________
Faudiostream-users mailing list
Faudiostream-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/faudiostream-users

Reply via email to