static int sndwarpstgetset(CSOUND *csound, SNDWARPST *p) { int i; int nsections; FUNC *ftpWind, *ftpSamp; WARPSECTION *exp; char *auxp; MYFLT iwsize; if (UNLIKELY(p->OUTOCOUNT > 2 && p->OUTOCOUNT < 4)) { return csound->InitError(csound, Str("Wrong number of outputs " "in sndwarpst; must be 2 or 4")); } nsections = (int)*p->ioverlap; if ((auxp = p->auxch.auxp) == NULL || nsections != p->nsections) { if (nsections != p->nsections) auxp=p->auxch.auxp=NULL; csound->AuxAlloc(csound, (size_t)nsections*sizeof(WARPSECTION), &p->auxch); auxp = p->auxch.auxp; p->nsections = nsections; } p->exp = (WARPSECTION *)auxp; if (UNLIKELY((ftpSamp = csound->FTnp2Find(csound, p->isampfun)) == NULL)) return NOTOK; p->ftpSamp = ftpSamp; p->sampflen=ftpSamp->flen; if (UNLIKELY((ftpWind = csound->FTnp2Find(csound, p->ifn)) == NULL)) return NOTOK; p->ftpWind = ftpWind; p->flen=ftpWind->flen; p->maxFr = -1L + (int32)(ftpSamp->flen*FL(0.5)); p->prFlg = 1; /* true */ p->begin = (int)(*p->ibegin * CS_ESR); iwsize = *p->iwsize; exp = p->exp; for (i=0; i< nsections; i++) { if (i==0) { exp[i].wsize = (int)iwsize; exp[i].cnt=0; exp[i].ampphs = FL(0.0); } else { exp[i].wsize = (int) (iwsize + (unirand(csound) * (*p->irandw))); exp[i].cnt=(int)(exp[i].wsize*((MYFLT)i/(*p->ioverlap))); exp[i].ampphs = p->flen*(i/(*p->ioverlap)); } exp[i].offset = (MYFLT)p->begin; exp[i].ampincr = (MYFLT)p->flen/(exp[i].wsize-1); /* exp[i].section = i+1; *//* section number just used for debugging! */ } p->ampcode = IS_ASIG_ARG(p->xamp) ? 1 : 0; p->timewarpcode = IS_ASIG_ARG(p->xtimewarp) ? 1 : 0; p->resamplecode = IS_ASIG_ARG(p->xresample) ? 1 : 0; return OK; }
static int bppasxx(CSOUND *csound, BBFIL *p) /* Bandpass filter */ { uint32_t offset = p->h.insdshead->ksmps_offset; uint32_t early = p->h.insdshead->ksmps_no_end; uint32_t nsmps = CS_KSMPS; MYFLT *out, *in; double *a = p->a; double t, y; uint32_t nn; in = p->ain; out = p->sr; if (p->kbw[0] <= FL(0.0)) { memset(out, 0, CS_KSMPS*sizeof(MYFLT)); return OK; } if (UNLIKELY(offset)) memset(out, '\0', offset*sizeof(MYFLT)); if (UNLIKELY(early)) { nsmps -= early; memset(&out[nsmps], '\0', early*sizeof(MYFLT)); } /* if (p->kbw[0] != p->lkb || p->kfo[0] != p->lkf) { */ /* p->lkf = p->kfo[0]; */ /* p->lkb = p->kbw[0]; */ /* c = 1.0 / tan((double)(csound->pidsr * p->lkb)); */ /* d = 2.0 * cos((double)(csound->tpidsr * p->lkf)); */ /* a[1] = 1.0 / (1.0 + c); */ /* a[2] = 0.0; */ /* a[3] = -a[1]; */ /* a[4] = - c * d * a[1]; */ /* a[5] = (c - 1.0) * a[1]; */ /* } */ //butter_filter(nsmps, offset, in, out, p->a); for (nn=offset; nn<nsmps; nn++) { MYFLT bw, fr; bw = (IS_ASIG_ARG(p->kbw) ? p->kbw[nn] : *p->kbw); fr = (IS_ASIG_ARG(p->kfo) ? p->kfo[nn] : *p->kfo); if (bw != p->lkb || fr != p->lkf) { double c, d; p->lkf = fr; p->lkb = bw; c = 1.0 / tan((double)(csound->pidsr * bw)); d = 2.0 * cos((double)(csound->tpidsr * fr)); a[1] = 1.0 / (1.0 + c); a[2] = 0.0; a[3] = -a[1]; a[4] = - c * d * a[1]; a[5] = (c - 1.0) * a[1]; } t = (double)in[nn] - a[4] * a[6] - a[5] * a[7]; t = csoundUndenormalizeDouble(t); /* Not needed on AMD */ y = t * a[1] + a[2] * a[6] + a[3] * a[7]; a[7] = a[6]; a[6] = t; out[nn] = (MYFLT)y; } return OK; }
static int svf(CSOUND *csound, SVF *p) { MYFLT f1 = FL(0.0), q1 = FL(1.0), scale = FL(1.0), lfco = -FL(1.0), lq = -FL(1.0); MYFLT *low, *high, *band, *in, ynm1, ynm2; MYFLT low2, high2, band2; MYFLT *kfco = p->kfco, *kq = p->kq; uint32_t offset = p->h.insdshead->ksmps_offset; uint32_t early = p->h.insdshead->ksmps_no_end; uint32_t n, nsmps = CS_KSMPS; in = p->in; low = p->low; band = p->band; high = p->high; ynm1 = p->ynm1; ynm2 = p->ynm2; /* equations derived from Hal Chamberlin, "Musical Applications * of Microprocessors. */ if (UNLIKELY(offset)) { memset(low, '\0', offset*sizeof(MYFLT)); memset(high, '\0', offset*sizeof(MYFLT)); memset(band, '\0', offset*sizeof(MYFLT)); } if (UNLIKELY(early)) { nsmps -= early; memset(&low[nsmps], '\0', early*sizeof(MYFLT)); memset(&high[nsmps], '\0', early*sizeof(MYFLT)); memset(&band[nsmps], '\0', early*sizeof(MYFLT)); } for (n=offset; n<nsmps; n++) { MYFLT fco = IS_ASIG_ARG(p->kfco) ? kfco[n] : *kfco; MYFLT q = IS_ASIG_ARG(p->kq) ? kq[n] : *kq; if (fco != lfco || q != lq) { lfco = fco; lq = q; /* calculate frequency and Q coefficients */ f1 = FL(2.0) * (MYFLT)sin((double)(fco * csound->pidsr)); /* Protect against division by zero */ if (UNLIKELY(q<FL(0.000001))) q = FL(1.0); q1 = FL(1.0) / q; /* if there is a non-zero value for iscl, set scale to be * equal to the Q coefficient. */ if (*p->iscl) scale = q1; } low[n] = low2 = ynm2 + f1 * ynm1; high[n] = high2 = scale * in[n] - low2 - q1 * ynm1; band[n] = band2 = f1 * high2 + ynm1; ynm1 = band2; ynm2 = low2; } p->ynm1 = ynm1; p->ynm2 = ynm2; return OK; }
int tblset(CSOUND *csound, TABLE *p) { if (UNLIKELY(IS_ASIG_ARG(p->rslt) != IS_ASIG_ARG(p->xndx))) { const char *opname = csound->GetOpcodeName(p); const char *msg = Str("%s: table index type inconsistent with output"); if (UNLIKELY(CS_KSMPS == 1)) csound->Warning(csound, msg, opname); else { return csound->InitError(csound, msg, opname); } } p->h.iopadr = (SUBR) itblchk; return itblchk(csound, p); }
static int32_t lowprx(CSOUND *csound, LOWPRX *p) { IGN(csound); MYFLT b, k = p->k; MYFLT *ar, *asig, yn,*ynm1, *ynm2 ; MYFLT coef1 = p->coef1, coef2 = p->coef2; MYFLT *kfco = p->kfco, *kres = p->kres; uint32_t offset = p->h.insdshead->ksmps_offset; uint32_t early = p->h.insdshead->ksmps_no_end; uint32_t n, nsmps = CS_KSMPS; int32_t j; int32_t asgf = IS_ASIG_ARG(p->kfco), asgr = IS_ASIG_ARG(p->kres); ynm1 = p->ynm1; ynm2 = p->ynm2; asig = p->asig; if (UNLIKELY(offset)) memset(p->ar, '\0', offset*sizeof(MYFLT)); if (UNLIKELY(early)) { nsmps -= early; memset(&p->ar[nsmps], '\0', early*sizeof(MYFLT)); } for (j=0; j< p->loop; j++) { ar = p->ar; for (n=offset;n<nsmps;n++) { MYFLT fco = (asgf ? kfco[n] : *kfco); MYFLT res = (asgr ? kres[n] : *kres); if (p->okf != fco || p->okr != res) { /* Only if changed */ b = FL(10.0) / (res * SQRT(fco)) - FL(1.0); k = FL(1000.0) / fco; coef1 = (b+FL(2.0) * k); coef2 = FL(1.0)/(FL(1.0) + b + k); p->okf = fco; p->okr = res; /* remember to save recalculation */ } ar[n] = yn = (coef1 * ynm1[j] - k * ynm2[j] + asig[n]) * coef2; ynm2[j] = ynm1[j]; ynm1[j] = yn; } asig= p->ar; } p->k = k; p->coef1 = coef1; p->coef2 = coef2; return OK; }
static int resonz(CSOUND *csound, RESONZ *p) { /* * * An implementation of the 2-pole, 2-zero reson filter * described by Julius O. Smith and James B. Angell in * "A Constant Gain Digital Resonator Tuned by a Single * Coefficient," Computer Music Journal, Vol. 6, No. 4, * Winter 1982, p.36-39. resonr implements the version * where the zeros are located at z = 1 and z = -1. * */ double r = 0.0, scale = 1.0; /* radius & scaling factor */ double c1=0.0, c2=0.0; /* filter coefficients */ MYFLT *out, *in; double xn, yn, xnm1, xnm2, ynm1, ynm2; MYFLT *kcf = p->kcf, *kbw = p->kbw; MYFLT lcf = -FL(1.0), lbw = -FL(1.0); uint32_t offset = p->h.insdshead->ksmps_offset; uint32_t early = p->h.insdshead->ksmps_no_end; uint32_t n, nsmps = CS_KSMPS; /* Normalizing factors derived from equations in Ken Steiglitz, * "A Note on Constant-Gain Digital Resonators," Computer * Music Journal, vol. 18, no. 4, pp. 8-10, Winter 1982. */ out = p->out; in = p->in; xnm1 = p->xnm1; xnm2 = p->xnm2; ynm1 = p->ynm1; ynm2 = p->ynm2; if (UNLIKELY(offset)) memset(out, '\0', offset*sizeof(MYFLT)); if (UNLIKELY(early)) { nsmps -= early; memset(&out[nsmps], '\0', early*sizeof(MYFLT)); } for (n=offset; n<nsmps; n++) { MYFLT cf = IS_ASIG_ARG(p->kcf) ? kcf[n] : *kcf; MYFLT bw = IS_ASIG_ARG(p->kbw) ? kbw[n] : *kbw; if (cf != lcf || bw != lbw) { lcf = cf; lbw = bw; r = exp(-(double)(bw * csound->pidsr)); c1 = 2.0 * r * cos((double)(csound->tpidsr*cf)); c2 = r * r; if (p->scaletype == 1) scale = (1.0 - c2) * 0.5; else if (p->scaletype == 2) scale = sqrt((1.0 - c2) * 0.5); } xn = (double)in[n]; out[n] = (MYFLT)(yn = scale * (xn - xnm2) + c1 * ynm1 - c2 * ynm2); xnm2 = xnm1; xnm1 = xn; ynm2 = ynm1; ynm1 = yn; } p->xnm1 = xnm1; p->xnm2 = xnm2; p->ynm1 = ynm1; p->ynm2 = ynm2; return OK; }