From ed932acb5860bf8b9296169676499562a55d139e Mon Sep 17 00:00:00 2001 From: Miller Puckette Date: Mon, 6 Sep 2004 20:20:36 +0000 Subject: checking in version 0.38test5. Oops, I realize I forgot some more nice files, will add them and re-commit. svn path=/trunk/; revision=2010 --- pd/src/d_delay.c | 164 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 85 insertions(+), 79 deletions(-) (limited to 'pd/src/d_delay.c') diff --git a/pd/src/d_delay.c b/pd/src/d_delay.c index 920b28e5..f808e292 100644 --- a/pd/src/d_delay.c +++ b/pd/src/d_delay.c @@ -7,8 +7,8 @@ #include "m_pd.h" extern int ugen_getsortno(void); -#define DEFDELVS 64 /* LATER get this from canvas at DSP time */ -static int delread_zero = 0; /* four bytes of zero for delread~, vd~ */ +#define DEFDELVS 64 /* LATER get this from canvas at DSP time */ +static int delread_zero = 0; /* four bytes of zero for delread~, vd~ */ /* ----------------------------- delwrite~ ----------------------------- */ static t_class *sigdelwrite_class; @@ -37,13 +37,19 @@ typedef struct _sigdelwrite /* routine to check that all delwrites/delreads/vds have same vecsize */ static void sigdelwrite_checkvecsize(t_sigdelwrite *x, int vecsize) { + /* + LATER this should really check sample rate and blocking, once that is + supported. Probably we don't actually care about vecsize. + For now just suppress this check... */ +#if 0 if (x->x_rsortno != ugen_getsortno()) { - x->x_vecsize = vecsize; - x->x_rsortno = ugen_getsortno(); + x->x_vecsize = vecsize; + x->x_rsortno = ugen_getsortno(); } else if (vecsize != x->x_vecsize) - pd_error(x, "delread/delwrite/vd vector size mismatch"); + pd_error(x, "delread/delwrite/vd vector size mismatch"); +#endif } static void *sigdelwrite_new(t_symbol *s, t_floatarg msec) @@ -59,7 +65,7 @@ static void *sigdelwrite_new(t_symbol *s, t_floatarg msec) nsamps += DEFDELVS; x->x_cspace.c_n = nsamps; x->x_cspace.c_vec = - (float *)getbytes((nsamps + XTRASAMPS) * sizeof(float)); + (float *)getbytes((nsamps + XTRASAMPS) * sizeof(float)); x->x_cspace.c_phase = XTRASAMPS; x->x_sortno = 0; x->x_vecsize = 0; @@ -77,19 +83,19 @@ static t_int *sigdelwrite_perform(t_int *w) phase += n; while (n--) { - float f = *in++; - if (PD_BADFLOAT(f)) - f = 0; - *bp++ = f; - if (bp == ep) - { - vp[0] = ep[-4]; - vp[1] = ep[-3]; - vp[2] = ep[-2]; - vp[3] = ep[-1]; - bp = vp + XTRASAMPS; - phase -= nsamps; - } + float f = *in++; + if (PD_BIGORSMALL(f)) + f = 0; + *bp++ = f; + if (bp == ep) + { + vp[0] = ep[-4]; + vp[1] = ep[-3]; + vp[2] = ep[-2]; + vp[3] = ep[-1]; + bp = vp + XTRASAMPS; + phase -= nsamps; + } } c->c_phase = phase; return (w+4); @@ -106,17 +112,17 @@ static void sigdelwrite_free(t_sigdelwrite *x) { pd_unbind(&x->x_obj.ob_pd, x->x_sym); freebytes(x->x_cspace.c_vec, - (x->x_cspace.c_n + XTRASAMPS) * sizeof(float)); + (x->x_cspace.c_n + XTRASAMPS) * sizeof(float)); } static void sigdelwrite_setup(void) { sigdelwrite_class = class_new(gensym("delwrite~"), - (t_newmethod)sigdelwrite_new, (t_method)sigdelwrite_free, - sizeof(t_sigdelwrite), 0, A_DEFSYM, A_DEFFLOAT, 0); + (t_newmethod)sigdelwrite_new, (t_method)sigdelwrite_free, + sizeof(t_sigdelwrite), 0, A_DEFSYM, A_DEFFLOAT, 0); CLASS_MAINSIGNALIN(sigdelwrite_class, t_sigdelwrite, x_f); class_addmethod(sigdelwrite_class, (t_method)sigdelwrite_dsp, - gensym("dsp"), 0); + gensym("dsp"), 0); } /* ----------------------------- delread~ ----------------------------- */ @@ -126,11 +132,11 @@ typedef struct _sigdelread { t_object x_obj; t_symbol *x_sym; - t_float x_deltime; /* delay in msec */ - int x_delsamps; /* delay in samples */ - t_float x_sr; /* samples per msec */ - t_float x_n; /* vector size */ - int x_zerodel; /* 0 or vecsize depending on read/write order */ + t_float x_deltime; /* delay in msec */ + int x_delsamps; /* delay in samples */ + t_float x_sr; /* samples per msec */ + t_float x_n; /* vector size */ + int x_zerodel; /* 0 or vecsize depending on read/write order */ } t_sigdelread; static void sigdelread_float(t_sigdelread *x, t_float f); @@ -151,16 +157,16 @@ static void sigdelread_float(t_sigdelread *x, t_float f) { int samps; t_sigdelwrite *delwriter = - (t_sigdelwrite *)pd_findbyclass(x->x_sym, sigdelwrite_class); + (t_sigdelwrite *)pd_findbyclass(x->x_sym, sigdelwrite_class); x->x_deltime = f; if (delwriter) { - int delsize = delwriter->x_cspace.c_n; - x->x_delsamps = (int)(0.5 + x->x_sr * x->x_deltime) - + x->x_n - x->x_zerodel; - if (x->x_delsamps < x->x_n) x->x_delsamps = x->x_n; - else if (x->x_delsamps > delwriter->x_cspace.c_n - DEFDELVS) - x->x_delsamps = delwriter->x_cspace.c_n - DEFDELVS; + int delsize = delwriter->x_cspace.c_n; + x->x_delsamps = (int)(0.5 + x->x_sr * x->x_deltime) + + x->x_n - x->x_zerodel; + if (x->x_delsamps < x->x_n) x->x_delsamps = x->x_n; + else if (x->x_delsamps > delwriter->x_cspace.c_n - DEFDELVS) + x->x_delsamps = delwriter->x_cspace.c_n - DEFDELVS; } } @@ -177,8 +183,8 @@ static t_int *sigdelread_perform(t_int *w) bp = vp + phase; while (n--) { - *out++ = *bp++; - if (bp == ep) bp -= nsamps; + *out++ = *bp++; + if (bp == ep) bp -= nsamps; } return (w+5); } @@ -186,29 +192,29 @@ static t_int *sigdelread_perform(t_int *w) static void sigdelread_dsp(t_sigdelread *x, t_signal **sp) { t_sigdelwrite *delwriter = - (t_sigdelwrite *)pd_findbyclass(x->x_sym, sigdelwrite_class); + (t_sigdelwrite *)pd_findbyclass(x->x_sym, sigdelwrite_class); x->x_sr = sp[0]->s_sr * 0.001; x->x_n = sp[0]->s_n; if (delwriter) { - sigdelwrite_checkvecsize(delwriter, sp[0]->s_n); - x->x_zerodel = (delwriter->x_sortno == ugen_getsortno() ? - 0 : delwriter->x_vecsize); - sigdelread_float(x, x->x_deltime); - dsp_add(sigdelread_perform, 4, - sp[0]->s_vec, &delwriter->x_cspace, &x->x_delsamps, sp[0]->s_n); + sigdelwrite_checkvecsize(delwriter, sp[0]->s_n); + x->x_zerodel = (delwriter->x_sortno == ugen_getsortno() ? + 0 : delwriter->x_vecsize); + sigdelread_float(x, x->x_deltime); + dsp_add(sigdelread_perform, 4, + sp[0]->s_vec, &delwriter->x_cspace, &x->x_delsamps, sp[0]->s_n); } else if (*x->x_sym->s_name) - error("delread~: %s: no such delwrite~",x->x_sym->s_name); + error("delread~: %s: no such delwrite~",x->x_sym->s_name); } static void sigdelread_setup(void) { sigdelread_class = class_new(gensym("delread~"), - (t_newmethod)sigdelread_new, 0, - sizeof(t_sigdelread), 0, A_DEFSYM, A_DEFFLOAT, 0); + (t_newmethod)sigdelread_new, 0, + sizeof(t_sigdelread), 0, A_DEFSYM, A_DEFFLOAT, 0); class_addmethod(sigdelread_class, (t_method)sigdelread_dsp, - gensym("dsp"), 0); + gensym("dsp"), 0); class_addfloat(sigdelread_class, (t_method)sigdelread_float); } @@ -220,8 +226,8 @@ typedef struct _sigvd { t_object x_obj; t_symbol *x_sym; - t_float x_sr; /* samples per msec */ - int x_zerodel; /* 0 or vecsize depending on read/write order */ + t_float x_sr; /* samples per msec */ + int x_zerodel; /* 0 or vecsize depending on read/write order */ float x_f; } t_sigvd; @@ -252,27 +258,27 @@ static t_int *sigvd_perform(t_int *w) float zerodel = x->x_zerodel; while (n--) { - float delsamps = x->x_sr * *in++ - zerodel, frac; - int idelsamps; - float a, b, c, d, cminusb; - if (delsamps < 1.00001f) delsamps = 1.00001f; - if (delsamps > limit) delsamps = limit; - delsamps += fn; - fn = fn - 1.0f; - idelsamps = delsamps; - frac = delsamps - (float)idelsamps; - bp = wp - idelsamps; - if (bp < vp + 4) bp += nsamps; - d = bp[-3]; - c = bp[-2]; - b = bp[-1]; - a = bp[0]; - cminusb = c-b; - *out++ = b + frac * ( - cminusb - 0.1666667f * (1.-frac) * ( - (d - a - 3.0f * cminusb) * frac + (d + 2.0f*a - 3.0f*b) - ) - ); + float delsamps = x->x_sr * *in++ - zerodel, frac; + int idelsamps; + float a, b, c, d, cminusb; + if (delsamps < 1.00001f) delsamps = 1.00001f; + if (delsamps > limit) delsamps = limit; + delsamps += fn; + fn = fn - 1.0f; + idelsamps = delsamps; + frac = delsamps - (float)idelsamps; + bp = wp - idelsamps; + if (bp < vp + 4) bp += nsamps; + d = bp[-3]; + c = bp[-2]; + b = bp[-1]; + a = bp[0]; + cminusb = c-b; + *out++ = b + frac * ( + cminusb - 0.1666667f * (1.-frac) * ( + (d - a - 3.0f * cminusb) * frac + (d + 2.0f*a - 3.0f*b) + ) + ); } return (w+6); } @@ -280,16 +286,16 @@ static t_int *sigvd_perform(t_int *w) static void sigvd_dsp(t_sigvd *x, t_signal **sp) { t_sigdelwrite *delwriter = - (t_sigdelwrite *)pd_findbyclass(x->x_sym, sigdelwrite_class); + (t_sigdelwrite *)pd_findbyclass(x->x_sym, sigdelwrite_class); x->x_sr = sp[0]->s_sr * 0.001; if (delwriter) { - sigdelwrite_checkvecsize(delwriter, sp[0]->s_n); - x->x_zerodel = (delwriter->x_sortno == ugen_getsortno() ? - 0 : delwriter->x_vecsize); - dsp_add(sigvd_perform, 5, - sp[0]->s_vec, sp[1]->s_vec, - &delwriter->x_cspace, x, sp[0]->s_n); + sigdelwrite_checkvecsize(delwriter, sp[0]->s_n); + x->x_zerodel = (delwriter->x_sortno == ugen_getsortno() ? + 0 : delwriter->x_vecsize); + dsp_add(sigvd_perform, 5, + sp[0]->s_vec, sp[1]->s_vec, + &delwriter->x_cspace, x, sp[0]->s_n); } else error("vd~: %s: no such delwrite~",x->x_sym->s_name); } @@ -297,7 +303,7 @@ static void sigvd_dsp(t_sigvd *x, t_signal **sp) static void sigvd_setup(void) { sigvd_class = class_new(gensym("vd~"), (t_newmethod)sigvd_new, 0, - sizeof(t_sigvd), 0, A_DEFSYM, 0); + sizeof(t_sigvd), 0, A_DEFSYM, 0); class_addmethod(sigvd_class, (t_method)sigvd_dsp, gensym("dsp"), 0); CLASS_MAINSIGNALIN(sigvd_class, t_sigvd, x_f); } -- cgit v1.2.1