コード例 #1
0
ファイル: reverse.c プロジェクト: adammendoza/Soundpipe
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;
}
コード例 #2
0
ファイル: vdelay.c プロジェクト: OpenDAWN/Soundpipe
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;
}
コード例 #3
0
ファイル: allpass.c プロジェクト: BillGrim/AudioKit
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;
}