int sp_reverse_compute(sp_data *sp, sp_reverse *p, SPFLOAT *in, SPFLOAT *out) { sp_auxdata_getbuf(&p->buf, p->bufpos, out); sp_auxdata_setbuf(&p->buf, (p->bufsize - 1) - p->bufpos, in); p->bufpos = (p->bufpos + 1) % p->bufsize; return SP_OK; }
int sp_vdelay_compute(sp_data *sp, sp_vdelay *p, SPFLOAT *in, SPFLOAT *out) { int32_t maxd, indx; *out = p->sr; SPFLOAT del = p->del; SPFLOAT b0, b1, b2, b3; int32_t v0, v1, v2, v3; SPFLOAT fv1; indx = p->left; sp_auxdata_setbuf(&p->buf, indx, in); fv1 = del * (-1.0 * sp->sr); v1 = (int32_t)fv1; fv1 -= (SPFLOAT) v1; v1 += (int32_t)indx; maxd = (uint32_t) (p->maxdel * p->sr); /* Make sure we're inside the buffer */ if ((v1 < 0) || (fv1 < 0.0)) { fv1++; v1--; while (v1 < 0) { v1 += (int32_t)maxd; } } else { while (v1 >= (int32_t)maxd) { v1 -= (int32_t)maxd; } } /* Find next sample for interpolation */ v2 = (v1 == (int32_t)(maxd - 1UL) ? 0L : v1 + 1L); if (maxd<4) { sp_auxdata_getbuf(&p->buf, v1, &b1); sp_auxdata_getbuf(&p->buf, v2, &b2); *out = b1 + fv1 * (b2 - b1); } else { v0 = (v1==0 ? maxd-1 : v1-1); v3 = (v2==(int32_t)maxd-1 ? 0 : v2+1); { SPFLOAT w, x, y, z; z = fv1 * fv1; z--; z *= 0.1666666667; y = fv1; y++; w = (y *= 0.5); w--; x = 3.0 * z; y -= x; w -= z; x -= fv1; sp_auxdata_getbuf(&p->buf, v0, &b0); sp_auxdata_getbuf(&p->buf, v1, &b1); sp_auxdata_getbuf(&p->buf, v2, &b2); sp_auxdata_getbuf(&p->buf, v3, &b3); *out = (w*b0 + x*b1 + y*b2 + z*b3) * fv1 + b1; } } if (++indx == maxd) indx = 0; p->left = indx; return SP_OK; }
int sp_allpass_compute(sp_data *sp, sp_allpass *p, SPFLOAT *in, SPFLOAT *out) { SPFLOAT y, z; SPFLOAT coef = p->coef; if(p->prvt != p->revtime) { p->prvt = p->revtime; coef = p->coef = exp(-6.9078 * p->looptime / p->prvt); } sp_auxdata_getbuf(&p->aux, p->bufpos, &y); z = coef * y + *in; sp_auxdata_setbuf(&p->aux, p->bufpos, &z); *out = y - coef * z; p->bufpos++; p->bufpos %= p->bufsize; return SP_OK; }