6 extern int ugen_getsortno(void);
8 #define DEFDELVS 64 /* LATER get this from canvas at DSP time */
9 static int delread_zero
= 0; /* four bytes of zero for delread~, vd~ */
11 static t_class
*sigvd_class
;
17 t_sample x_sr
; /* samples per msec */
18 int x_zerodel
; /* 0 or vecsize depending on read/write order */
22 static void *sigvd_new(t_symbol
*s
)
24 t_sigvd
*x
= (t_sigvd
*)pd_new(sigvd_class
);
25 if (!*s
->s_name
) s
= gensym("vd~");
29 outlet_new(&x
->x_obj
, &s_signal
);
35 static t_int
*sigvd_perform(t_int
*w
)
37 t_sample
*in
= (t_sample
*)(w
[1]);
38 t_sample
*out
= (t_sample
*)(w
[2]);
39 t_delwritectl
*ctl
= (t_delwritectl
*)(w
[3]);
40 t_sigvd
*x
= (t_sigvd
*)(w
[4]);
43 int nsamps
= ctl
->c_n
;
45 t_sample limit
= nsamps
- n
- 1;
46 t_sample
*vp
= ctl
->c_vec
, *bp
, *wp
= vp
+ ctl
->c_phase
;
47 t_sample zerodel
= x
->x_zerodel
;
50 t_time delsamps
= ((long long) mult((*in
++),ftofix(44.1)));//- itofix(zerodel);
51 int index
= fixtoi(delsamps
);
53 // post("%d: index %d f %lld",index,findex,*in);
55 frac
= delsamps
- itofix(index
);
57 if (index
< 1 ) index
+= nsamps
;
58 if (index
> limit
) index
-= nsamps
;
60 if (bp
< vp
+ 2) bp
+= nsamps
;
61 *out
++ = bp
[-1] + mult(frac
,bp
[-1]-bp
[0]);
69 static void sigvd_dsp(t_sigvd
*x
, t_signal
**sp
)
71 t_sigdelwrite
*delwriter
=
72 (t_sigdelwrite
*)pd_findbyclass(x
->x_sym
, sigdelwrite_class
);
73 x
->x_sr
= sp
[0]->s_sr
* 0.001;
76 sigdelwrite_checkvecsize(delwriter
, sp
[0]->s_n
);
77 x
->x_zerodel
= (delwriter
->x_sortno
== ugen_getsortno() ?
78 0 : delwriter
->x_vecsize
);
79 dsp_add(sigvd_perform
, 5,
80 sp
[0]->s_vec
, sp
[1]->s_vec
,
81 &delwriter
->x_cspace
, x
, sp
[0]->s_n
);
83 else error("vd~: %s: no such delwrite~",x
->x_sym
->s_name
);
86 void vd_tilde_setup(void)
88 sigvd_class
= class_new(gensym("vd~"), (t_newmethod
)sigvd_new
, 0,
89 sizeof(t_sigvd
), 0, A_DEFSYM
, 0);
90 class_addmethod(sigvd_class
, (t_method
)sigvd_dsp
, gensym("dsp"), 0);
91 CLASS_MAINSIGNALIN(sigvd_class
, t_sigvd
, x_f
);
98 extern int ugen_getsortno(void);
100 #define DEFDELVS 64 /* LATER get this from canvas at DSP time */
101 static int delread_zero
= 0; /* four bytes of zero for delread~, vd~ */
103 static t_class
*sigvd_class
;
105 typedef struct _sigvd
109 t_sample x_sr
; /* samples per msec */
110 int x_zerodel
; /* 0 or vecsize depending on read/write order */
114 static void *sigvd_new(t_symbol
*s
)
116 t_sigvd
*x
= (t_sigvd
*)pd_new(sigvd_class
);
117 if (!*s
->s_name
) s
= gensym("vd~");
121 outlet_new(&x
->x_obj
, &s_signal
);
127 static t_int
*sigvd_perform(t_int
*w
)
129 t_sample
*in
= (t_sample
*)(w
[1]);
130 t_sample
*out
= (t_sample
*)(w
[2]);
131 t_delwritectl
*ctl
= (t_delwritectl
*)(w
[3]);
132 t_sigvd
*x
= (t_sigvd
*)(w
[4]);
135 int nsamps
= ctl
->c_n
;
137 t_sample limit
= nsamps
- n
- 1;
138 t_sample
*vp
= ctl
->c_vec
, *bp
, *wp
= vp
+ ctl
->c_phase
;
139 t_sample zerodel
= x
->x_zerodel
;
142 t_time delsamps
= ((long long) mult((*in
++),ftofix(44.1)));//- itofix(zerodel);
143 int index
= fixtoi(delsamps
);
145 // post("%d: index %d f %lld",index,findex,*in);
147 frac
= delsamps
- itofix(index
);
149 if (index
< 1 ) index
+= nsamps
;
150 if (index
> limit
) index
-= nsamps
;
152 if (bp
< vp
+ 2) bp
+= nsamps
;
153 *out
++ = bp
[-1] + mult(frac
,bp
[-1]-bp
[0]);
161 static void sigvd_dsp(t_sigvd
*x
, t_signal
**sp
)
163 t_sigdelwrite
*delwriter
=
164 (t_sigdelwrite
*)pd_findbyclass(x
->x_sym
, sigdelwrite_class
);
165 x
->x_sr
= sp
[0]->s_sr
* 0.001;
168 sigdelwrite_checkvecsize(delwriter
, sp
[0]->s_n
);
169 x
->x_zerodel
= (delwriter
->x_sortno
== ugen_getsortno() ?
170 0 : delwriter
->x_vecsize
);
171 dsp_add(sigvd_perform
, 5,
172 sp
[0]->s_vec
, sp
[1]->s_vec
,
173 &delwriter
->x_cspace
, x
, sp
[0]->s_n
);
175 else error("vd~: %s: no such delwrite~",x
->x_sym
->s_name
);
178 void vd_tilde_setup(void)
180 sigvd_class
= class_new(gensym("vd~"), (t_newmethod
)sigvd_new
, 0,
181 sizeof(t_sigvd
), 0, A_DEFSYM
, 0);
182 class_addmethod(sigvd_class
, (t_method
)sigvd_dsp
, gensym("dsp"), 0);
183 CLASS_MAINSIGNALIN(sigvd_class
, t_sigvd
, x_f
);