4 extern int ugen_getsortno(void);
8 #define DEFDELVS 64 /* LATER get this from canvas at DSP time */
10 static int delread_zero
= 0; /* four bytes of zero for delread~, vd~ */
13 static t_class
*sigvd_class
;
19 t_sample x_sr
; /* samples per msec */
20 int x_zerodel
; /* 0 or vecsize depending on read/write order */
24 static void *sigvd_new(t_symbol
*s
)
26 t_sigvd
*x
= (t_sigvd
*)pd_new(sigvd_class
);
27 if (!*s
->s_name
) s
= gensym("vd~");
31 outlet_new(&x
->x_obj
, &s_signal
);
37 static t_int
*sigvd_perform(t_int
*w
)
39 t_sample
*in
= (t_sample
*)(w
[1]);
40 t_sample
*out
= (t_sample
*)(w
[2]);
41 t_delwritectl
*ctl
= (t_delwritectl
*)(w
[3]);
43 t_sigvd
*x
= (t_sigvd
*)(w
[4]);
47 int nsamps
= ctl
->c_n
;
49 t_sample limit
= nsamps
- n
- 1;
50 t_sample
*vp
= ctl
->c_vec
, *bp
, *wp
= vp
+ ctl
->c_phase
;
52 t_sample zerodel
= x
->x_zerodel
;
56 t_time delsamps
= ((long long) mult((*in
++),ftofix(44.1)));//- itofix(zerodel);
57 int index
= fixtoi(delsamps
);
59 // post("%d: index %d f %lld",index,findex,*in);
61 frac
= delsamps
- itofix(index
);
63 if (index
< 1 ) index
+= nsamps
;
64 if (index
> limit
) index
-= nsamps
;
66 if (bp
< vp
+ 2) bp
+= nsamps
;
67 *out
++ = bp
[-1] + mult(frac
,bp
[-1]-bp
[0]);
75 static void sigvd_dsp(t_sigvd
*x
, t_signal
**sp
)
77 t_sigdelwrite
*delwriter
=
78 (t_sigdelwrite
*)pd_findbyclass(x
->x_sym
, sigdelwrite_class
);
79 x
->x_sr
= sp
[0]->s_sr
* 0.001;
82 sigdelwrite_checkvecsize(delwriter
, sp
[0]->s_n
);
83 x
->x_zerodel
= (delwriter
->x_sortno
== ugen_getsortno() ?
84 0 : delwriter
->x_vecsize
);
85 dsp_add(sigvd_perform
, 5,
86 sp
[0]->s_vec
, sp
[1]->s_vec
,
87 &delwriter
->x_cspace
, x
, sp
[0]->s_n
);
89 else error("vd~: %s: no such delwrite~",x
->x_sym
->s_name
);
92 void vd_tilde_setup(void)
94 sigvd_class
= class_new(gensym("vd~"), (t_newmethod
)sigvd_new
, 0,
95 sizeof(t_sigvd
), 0, A_DEFSYM
, 0);
96 class_addmethod(sigvd_class
, (t_method
)sigvd_dsp
, gensym("dsp"), 0);
97 CLASS_MAINSIGNALIN(sigvd_class
, t_sigvd
, x_f
);