[Cs-dev] expseg bug fix
Date | 2007-09-09 09:04 |
From | Jonathan Murphy |
Subject | [Cs-dev] expseg bug fix |
Regarding: http://www.nabble.com/differing-behaviour-of-linseg-and-expseg-with-xtratim-release-tf4400129.html I believe that I have found the problem. Changing the following lines in /OOps/ugens1.c: 424 if (dur > FL(0.0)) { 425 if (val * nxtval <= FL(0.0)) 426 goto experr; 427 d = dur * csound->ekr; 428 segp->val = val; 429 segp->mlt = (MYFLT) pow((double)(nxtval / val), (1.0/(double)d)); 430 segp->cnt = (long) (d + FL(0.5)); 431 } 432 else break; /* .. til 0 dur or done */ to read: if (val * nxtval <= FL(0.0)) goto experr; d = dur * csound->ekr; segp->val = val; segp->mlt = (MYFLT) pow((double)(nxtval / val), (1.0/(double)d)); segp->cnt = (long) (d + FL(0.5)); Fixes it. I think. In order to obtain a steady state it is necessary to process values of dur <= 0.0, meaning that code like this: iatt = 0.01 ipeak = 1.0 idec = 0.1 isus = 0.5 irel = 1.0 aenv expseg 0.001, iatt, ipeak, idec, isus, -1, isus, irel, 0.001 will attain a steady state at isus, whereas at present this is not possible. Could someone with a deeper understanding of the code and CVS write access please take a look at this and commit the change if it's deemed appropriate? Thanks in advance, Jonathan. ------------------------------------------------------------------------- This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2005. http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ _______________________________________________ Csound-devel mailing list Csound-devel@lists.sourceforge.net |
Date | 2007-09-11 18:31 |
From | Jonathan Murphy |
Subject | Re: [Cs-dev] expseg bug fix |
Here is a patch to ugens1.c. The basic problem is that expseg and expsega don't tolerate indefinite durations, they are discarded by the if (...){ ...} else break; statements. Jonathan. --- /csound5/OOps/ugens1.c.orig 2007-09-12 01:25:15.000000000 +0900 +++ /csound5/OOps/ugens1.c 2007-09-12 01:28:05.000000000 +0900 @@ -421,15 +421,12 @@ val = nxtval; dur = **argp++; nxtval = **argp++; - if (dur > FL(0.0)) { if (val * nxtval <= FL(0.0)) goto experr; d = dur * csound->ekr; segp->val = val; segp->mlt = (MYFLT) pow((double)(nxtval / val), (1.0/(double)d)); segp->cnt = (long) (d + FL(0.5)); - } - else break; /* .. til 0 dur or done */ } while (--nsegs); segp->cnt = MAXPOS; /* set last cntr to infin */ return OK; @@ -467,15 +464,12 @@ val = nxtval; dur = **argp++; nxtval = **argp++; - if (dur > FL(0.0)) { if (val * nxtval <= FL(0.0)) goto experr; d = dur * csound->esr; segp->val = val; segp->mlt = (MYFLT) pow((double)(nxtval / val), (1.0/(double)d)); segp->cnt = (long) (d + FL(0.5)); - } - else break; /* .. til 0 dur or done */ } while (--nsegs); segp->cnt = MAXPOS; /* set last cntr to infin */ return OK; ------------------------------------------------------------------------- This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2005. http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ _______________________________________________ Csound-devel mailing list Csound-devel@lists.sourceforge.net |
Date | 2007-09-12 14:13 |
From | Victor Lazzarini |
Subject | Re: [Cs-dev] expseg bug fix |
Jonathan, thanks for this. I'd like to wait for John's return to integrate this, as I think it's best if he takes a look at it before we do anything. all the best Victor At 09:04 09/09/2007, you wrote: >Regarding: > >http://www.nabble.com/differing-behaviour-of-linseg-and-expseg-with-xtratim-release-tf4400129.html > >I believe that I have found the problem. Changing the following lines >in /OOps/ugens1.c: > > 424 if (dur > FL(0.0)) { > 425 if (val * nxtval <= FL(0.0)) > 426 goto experr; > 427 d = dur * csound->ekr; > 428 segp->val = val; > 429 segp->mlt = (MYFLT) pow((double)(nxtval / val), > (1.0/(double)d)); > 430 segp->cnt = (long) (d + FL(0.5)); > 431 } > 432 else break; /* .. til 0 dur or done */ > >to read: > > if (val * nxtval <= FL(0.0)) > goto experr; > d = dur * csound->ekr; > segp->val = val; > segp->mlt = (MYFLT) pow((double)(nxtval / val), (1.0/(double)d)); > segp->cnt = (long) (d + FL(0.5)); > >Fixes it. I think. > >In order to obtain a steady state it is necessary to process values of >dur <= 0.0, meaning that code like this: > >iatt = 0.01 >ipeak = 1.0 >idec = 0.1 >isus = 0.5 >irel = 1.0 >aenv expseg 0.001, iatt, ipeak, idec, isus, -1, isus, irel, 0.001 > >will attain a steady state at isus, whereas at present this is not >possible. > >Could someone with a deeper understanding of the code and CVS write >access please take a look at this and commit the change if it's deemed >appropriate? > >Thanks in advance, >Jonathan. > >------------------------------------------------------------------------- >This SF.net email is sponsored by: Microsoft >Defy all challenges. Microsoft(R) Visual Studio 2005. >http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ >_______________________________________________ >Csound-devel mailing list >Csound-devel@lists.sourceforge.net >https://lists.sourceforge.net/lists/listinfo/csound-devel Victor Lazzarini Music Technology Laboratory Music Department National University of Ireland, Maynooth ------------------------------------------------------------------------- This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2005. http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ _______________________________________________ Csound-devel mailing list Csound-devel@lists.sourceforge.net |