/*  
    uggab.h:

    Copyright (C) 1998 Gabriel Maldonado, John ffitch

    This file is part of Csound.

    The Csound Library is free software; you can redistribute it
    and/or modify it under the terms of the GNU Lesser General Public
    License as published by the Free Software Foundation; either
    version 2.1 of the License, or (at your option) any later version.

    Csound is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public
    License along with Csound; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
    02111-1307 USA
*/

/********************************************/
/* wrap and mirror UGs by Gabriel Maldonado */
/********************************************/

typedef struct {
    OPDS  h;
    MYFLT *xdest, *xsig, *xlow, *xhigh;
} WRAP;


typedef struct {
    OPDS  h;
    MYFLT *kout, *ksig, *kthreshold, *kmode;
    MYFLT old_sig;
} TRIG;


typedef struct {
    OPDS  h;
    MYFLT *r, *val1, *val2, *point, *imin, *imax;
    MYFLT point_factor;
} INTERPOL;


typedef struct  {
    OPDS        h;
    MYFLT       *out, *amp, *freq, *ift, *iphs;
    FUNC        *ftp;
    long        tablen;
    double      tablenUPsr;
    double      phs;
} POSC;

typedef struct  {
    OPDS        h;
    MYFLT       *out, *amp, *freq, *kloop, *kend, *ift, *iphs;
    FUNC        *ftp;
    long        tablen;
    MYFLT       fsr;
    double      phs, looplength;
} LPOSC;

typedef struct {
    OPDS        h;
    MYFLT       *ar, *argums[VARGMAX];
} SUM;

typedef struct {
    OPDS        h;
    MYFLT       *ar, *asig, *kcf, *kbw, *ord, *sep, *iflag, *iscl, *istor;
    int         scale, loop;
    AUXCH       aux;
    AUXCH       buffer;
    MYFLT       *yt1, *yt2;
} RESONY;

typedef struct {
    OPDS        h;
    MYFLT       *ar, *asig, *kincr ;
    double      index;
    long        sample_index;
    MYFLT       value;
} FOLD;

typedef struct {
        OPDS    h;
        MYFLT   *out, *freq,*retrig, *iphase, *argums[VARGMAX];
        MYFLT   args[VARGMAX];
        double  phs;
        int     nsegs;
} LOOPSEG;

typedef struct {
        OPDS    h;
        MYFLT   *out, *kphase, *argums[VARGMAX];
        MYFLT   args[VARGMAX];
        int     nsegs;
} LOOPSEGP;

typedef struct {  /* gab f1 */
        OPDS    h;
        MYFLT   *kr, *ksig, *ktime;
        MYFLT   current_val, current_time, incr, val_incremented, old_time;
        int flag;
} LINETO;

typedef struct {  /* gab f1 */
        OPDS    h;
        MYFLT   *kr, *ksig, *ktime, *ktrig;
        MYFLT   current_val, current_time, incr, val_incremented, old_time;
        int flag;
} LINETO2;

typedef struct {
        OPDS    h;
        MYFLT   *out, *AverageAmp,*AverageFreq, *randAmountAmp, *randAmountFreq;
        MYFLT   *ampMinRate, *ampMaxRate, *cpsMinRate, *cpsMaxRate, *ifn, *iphs;
        MYFLT   xcpsAmpRate, xcpsFreqRate;
        double  lphs, tablenUPkr;
        long    tablen, phsAmpRate, phsFreqRate;
        MYFLT   num1amp, num2amp, num1freq, num2freq, dfdmaxAmp, dfdmaxFreq;
        FUNC    *ftp;
} VIBRATO;


typedef struct {
        OPDS    h;
        MYFLT   *out, *AverageAmp,*AverageFreq,*ifn;
        MYFLT   xcpsAmpRate, xcpsFreqRate;
        double  lphs, tablenUPkr;
        long    tablen, phsAmpRate, phsFreqRate;
        MYFLT   num1amp, num2amp, num1freq, num2freq, dfdmaxAmp, dfdmaxFreq;
        FUNC    *ftp;
} VIBR;

typedef struct {
        OPDS    h;
        MYFLT   *out, *gamp, *amp1, *cps1, *amp2, *cps2, *amp3, *cps3;
        int     flag;
        long    phs1,phs2,phs3;
        MYFLT   num1a,num2a, dfdmax1,num1b,num2b, dfdmax2,num1c,num2c, dfdmax3;
} JITTER2;


typedef struct {
        OPDS    h;
        MYFLT   *ar, *amp, *cpsMin, *cpsMax;
        MYFLT   xcps;
        long    phs;
        int     initflag;
        MYFLT   num1, num2, dfdmax;
} JITTER;

typedef struct {
        OPDS    h;
        MYFLT   *ar, *amp, *cpsMin, *cpsMax;
        double  si;
        double  phs;
        int     initflag, cod;
        MYFLT   num0, num1, num2, df0, df1,c3, c2;
} JITTERS;


#define oneUp31Bit      (4.656612875245796924105750827168e-10)
#define randGab         (MYFLT)((double) \
               (((holdrand=holdrand*214013L+2531011L)>>1)&0x7fffffff)*oneUp31Bit)
#define BiRandGab   (MYFLT)((double) \
               (holdrand = holdrand*(-214013L) + 2531011L)*oneUp31Bit)

typedef struct  {
        OPDS    h;
        MYFLT   *out, *tableNum;
        int     pfn;
        FUNC    *ftp;
} DURAND;

typedef struct  {
        OPDS    h;
        MYFLT   *out, *min, *max, *tableNum;
        int     pfn;
        FUNC    *ftp;
} CURAND;

typedef struct  {
        OPDS    h;
        MYFLT   *out, *min, *max;
} RANGERAND;

typedef struct {
        OPDS    h;
        MYFLT   *ar, *min, *max, *xcps;
        short   cpscod;
        long    phs;
        MYFLT   num1, num2, dfdmax;
} RANDOMI;

typedef struct {
        OPDS    h;
        MYFLT   *ar, *min, *max, *xcps;
        short   cpscod;
        long    phs;
        MYFLT   num1;
} RANDOMH;


typedef struct {
        OPDS    h;
        MYFLT   *ar, *rangeMin, *rangeMax, *cpsMin, *cpsMax;
        double  si;
        double  phs;
        int initflag, cod;
        MYFLT   num0, num1, num2, df0, df1,c3, c2;
} RANDOM3;

