5 extern int ugen_getsortno(void);
7 #define DEFDELVS 64 /* LATER get this from canvas at DSP time */
8 static int delread_zero
= 0; /* four bytes of zero for delread~, vd~ */
10 static t_class
*sigdelread_class
;
12 typedef struct _sigdelread
16 t_float x_deltime
; /* delay in msec */
17 int x_delsamps
; /* delay in samples */
18 t_float x_sr
; /* samples per msec */
19 t_float x_n
; /* vector size */
20 int x_zerodel
; /* 0 or vecsize depending on read/write order */
23 static void sigdelread_float(t_sigdelread
*x
, t_float f
);
25 static void *sigdelread_new(t_symbol
*s
, t_floatarg f
)
27 t_sigdelread
*x
= (t_sigdelread
*)pd_new(sigdelread_class
);
32 sigdelread_float(x
, f
);
33 outlet_new(&x
->x_obj
, &s_signal
);
37 static void sigdelread_float(t_sigdelread
*x
, t_float f
)
40 t_sigdelwrite
*delwriter
=
41 (t_sigdelwrite
*)pd_findbyclass(x
->x_sym
, sigdelwrite_class
);
45 int delsize
= delwriter
->x_cspace
.c_n
;
46 x
->x_delsamps
= (int)(0.5 + x
->x_sr
* x
->x_deltime
)
47 + x
->x_n
- x
->x_zerodel
;
48 if (x
->x_delsamps
< x
->x_n
) x
->x_delsamps
= x
->x_n
;
49 else if (x
->x_delsamps
> delwriter
->x_cspace
.c_n
- DEFDELVS
)
50 x
->x_delsamps
= delwriter
->x_cspace
.c_n
- DEFDELVS
;
54 static t_int
*sigdelread_perform(t_int
*w
)
56 t_sample
*out
= (t_sample
*)(w
[1]);
57 t_delwritectl
*c
= (t_delwritectl
*)(w
[2]);
58 int delsamps
= *(int *)(w
[3]);
60 int phase
= c
->c_phase
- delsamps
, nsamps
= c
->c_n
;
61 t_sample
*vp
= c
->c_vec
, *bp
, *ep
= vp
+ (c
->c_n
+ XTRASAMPS
);
63 if (phase
< 0) phase
+= nsamps
;
68 if (bp
== ep
) bp
-= nsamps
;
73 static void sigdelread_dsp(t_sigdelread
*x
, t_signal
**sp
)
75 t_sigdelwrite
*delwriter
=
76 (t_sigdelwrite
*)pd_findbyclass(x
->x_sym
, sigdelwrite_class
);
77 x
->x_sr
= sp
[0]->s_sr
* 0.001;
81 sigdelwrite_checkvecsize(delwriter
, sp
[0]->s_n
);
82 x
->x_zerodel
= (delwriter
->x_sortno
== ugen_getsortno() ?
83 0 : delwriter
->x_vecsize
);
84 sigdelread_float(x
, x
->x_deltime
);
85 dsp_add(sigdelread_perform
, 4,
86 sp
[0]->s_vec
, &delwriter
->x_cspace
, &x
->x_delsamps
, sp
[0]->s_n
);
88 else if (*x
->x_sym
->s_name
)
89 error("delread~: %s: no such delwrite~",x
->x_sym
->s_name
);
92 void delread_tilde_setup(void)
94 sigdelread_class
= class_new(gensym("delread~"),
95 (t_newmethod
)sigdelread_new
, 0,
96 sizeof(t_sigdelread
), 0, A_DEFSYM
, A_DEFFLOAT
, 0);
97 class_addmethod(sigdelread_class
, (t_method
)sigdelread_dsp
,
99 class_addfloat(sigdelread_class
, (t_method
)sigdelread_float
);
105 extern int ugen_getsortno(void);
107 #define DEFDELVS 64 /* LATER get this from canvas at DSP time */
108 static int delread_zero
= 0; /* four bytes of zero for delread~, vd~ */
110 static t_class
*sigdelread_class
;
112 typedef struct _sigdelread
116 t_float x_deltime
; /* delay in msec */
117 int x_delsamps
; /* delay in samples */
118 t_float x_sr
; /* samples per msec */
119 t_float x_n
; /* vector size */
120 int x_zerodel
; /* 0 or vecsize depending on read/write order */
123 static void sigdelread_float(t_sigdelread
*x
, t_float f
);
125 static void *sigdelread_new(t_symbol
*s
, t_floatarg f
)
127 t_sigdelread
*x
= (t_sigdelread
*)pd_new(sigdelread_class
);
132 sigdelread_float(x
, f
);
133 outlet_new(&x
->x_obj
, &s_signal
);
137 static void sigdelread_float(t_sigdelread
*x
, t_float f
)
140 t_sigdelwrite
*delwriter
=
141 (t_sigdelwrite
*)pd_findbyclass(x
->x_sym
, sigdelwrite_class
);
145 int delsize
= delwriter
->x_cspace
.c_n
;
146 x
->x_delsamps
= (int)(0.5 + x
->x_sr
* x
->x_deltime
)
147 + x
->x_n
- x
->x_zerodel
;
148 if (x
->x_delsamps
< x
->x_n
) x
->x_delsamps
= x
->x_n
;
149 else if (x
->x_delsamps
> delwriter
->x_cspace
.c_n
- DEFDELVS
)
150 x
->x_delsamps
= delwriter
->x_cspace
.c_n
- DEFDELVS
;
154 static t_int
*sigdelread_perform(t_int
*w
)
156 t_sample
*out
= (t_sample
*)(w
[1]);
157 t_delwritectl
*c
= (t_delwritectl
*)(w
[2]);
158 int delsamps
= *(int *)(w
[3]);
160 int phase
= c
->c_phase
- delsamps
, nsamps
= c
->c_n
;
161 t_sample
*vp
= c
->c_vec
, *bp
, *ep
= vp
+ (c
->c_n
+ XTRASAMPS
);
163 if (phase
< 0) phase
+= nsamps
;
168 if (bp
== ep
) bp
-= nsamps
;
173 static void sigdelread_dsp(t_sigdelread
*x
, t_signal
**sp
)
175 t_sigdelwrite
*delwriter
=
176 (t_sigdelwrite
*)pd_findbyclass(x
->x_sym
, sigdelwrite_class
);
177 x
->x_sr
= sp
[0]->s_sr
* 0.001;
181 sigdelwrite_checkvecsize(delwriter
, sp
[0]->s_n
);
182 x
->x_zerodel
= (delwriter
->x_sortno
== ugen_getsortno() ?
183 0 : delwriter
->x_vecsize
);
184 sigdelread_float(x
, x
->x_deltime
);
185 dsp_add(sigdelread_perform
, 4,
186 sp
[0]->s_vec
, &delwriter
->x_cspace
, &x
->x_delsamps
, sp
[0]->s_n
);
188 else if (*x
->x_sym
->s_name
)
189 error("delread~: %s: no such delwrite~",x
->x_sym
->s_name
);
192 void delread_tilde_setup(void)
194 sigdelread_class
= class_new(gensym("delread~"),
195 (t_newmethod
)sigdelread_new
, 0,
196 sizeof(t_sigdelread
), 0, A_DEFSYM
, A_DEFFLOAT
, 0);
197 class_addmethod(sigdelread_class
, (t_method
)sigdelread_dsp
,
199 class_addfloat(sigdelread_class
, (t_method
)sigdelread_float
);