6 static t_class
*tabplay_tilde_class
;
8 typedef struct _tabplay_tilde
16 t_symbol
*x_arrayname
;
20 static void tabplay_tilde_tick(t_tabplay_tilde
*x
);
22 static void *tabplay_tilde_new(t_symbol
*s
)
24 t_tabplay_tilde
*x
= (t_tabplay_tilde
*)pd_new(tabplay_tilde_class
);
25 x
->x_clock
= clock_new(x
, (t_method
)tabplay_tilde_tick
);
26 x
->x_phase
= 0x7fffffff;
29 outlet_new(&x
->x_obj
, &s_signal
);
30 x
->x_bangout
= outlet_new(&x
->x_obj
, &s_bang
);
34 static t_int
*tabplay_tilde_perform(t_int
*w
)
36 t_tabplay_tilde
*x
= (t_tabplay_tilde
*)(w
[1]);
37 t_sample
*out
= (t_sample
*)(w
[2]), *fp
;
38 int n
= (int)(w
[3]), phase
= x
->x_phase
,
39 endphase
= (x
->x_nsampsintab
< x
->x_limit
?
40 x
->x_nsampsintab
: x
->x_limit
), nxfer
, n3
;
41 if (!x
->x_vec
|| phase
>= endphase
)
44 nxfer
= endphase
- phase
;
45 fp
= x
->x_vec
+ phase
;
52 if (phase
>= endphase
)
54 clock_delay(x
->x_clock
, 0);
55 x
->x_phase
= 0x7fffffff;
59 else x
->x_phase
= phase
;
63 while (n
--) *out
++ = 0;
67 void tabplay_tilde_set(t_tabplay_tilde
*x
, t_symbol
*s
)
72 if (!(a
= (t_garray
*)pd_findbyclass(x
->x_arrayname
, garray_class
)))
74 if (*s
->s_name
) pd_error(x
, "tabplay~: %s: no such array",
75 x
->x_arrayname
->s_name
);
78 else if (!garray_getfloatarray(a
, &x
->x_nsampsintab
, &x
->x_vec
))
80 error("%s: bad template for tabplay~", x
->x_arrayname
->s_name
);
83 else garray_usedindsp(a
);
86 static void tabplay_tilde_dsp(t_tabplay_tilde
*x
, t_signal
**sp
)
88 tabplay_tilde_set(x
, x
->x_arrayname
);
89 dsp_add(tabplay_tilde_perform
, 3, x
, sp
[0]->s_vec
, sp
[0]->s_n
);
92 static void tabplay_tilde_list(t_tabplay_tilde
*x
, t_symbol
*s
,
93 int argc
, t_atom
*argv
)
95 long start
= atom_getfloatarg(0, argc
, argv
);
96 long length
= atom_getfloatarg(1, argc
, argv
);
97 if (start
< 0) start
= 0;
99 x
->x_limit
= 0x7fffffff;
101 x
->x_limit
= start
+ length
;
105 static void tabplay_tilde_stop(t_tabplay_tilde
*x
)
107 x
->x_phase
= 0x7fffffff;
110 static void tabplay_tilde_tick(t_tabplay_tilde
*x
)
112 outlet_bang(x
->x_bangout
);
115 static void tabplay_tilde_free(t_tabplay_tilde
*x
)
117 clock_free(x
->x_clock
);
120 void tabplay_tilde_setup(void)
122 tabplay_tilde_class
= class_new(gensym("tabplay~"),
123 (t_newmethod
)tabplay_tilde_new
, (t_method
)tabplay_tilde_free
,
124 sizeof(t_tabplay_tilde
), 0, A_DEFSYM
, 0);
125 class_addmethod(tabplay_tilde_class
, (t_method
)tabplay_tilde_dsp
,
127 class_addmethod(tabplay_tilde_class
, (t_method
)tabplay_tilde_stop
,
129 class_addmethod(tabplay_tilde_class
, (t_method
)tabplay_tilde_set
,
130 gensym("set"), A_DEFSYM
, 0);
131 class_addlist(tabplay_tilde_class
, tabplay_tilde_list
);
138 static t_class
*tabplay_tilde_class
;
140 typedef struct _tabplay_tilde
148 t_symbol
*x_arrayname
;
152 static void tabplay_tilde_tick(t_tabplay_tilde
*x
);
154 static void *tabplay_tilde_new(t_symbol
*s
)
156 t_tabplay_tilde
*x
= (t_tabplay_tilde
*)pd_new(tabplay_tilde_class
);
157 x
->x_clock
= clock_new(x
, (t_method
)tabplay_tilde_tick
);
158 x
->x_phase
= 0x7fffffff;
161 outlet_new(&x
->x_obj
, &s_signal
);
162 x
->x_bangout
= outlet_new(&x
->x_obj
, &s_bang
);
166 static t_int
*tabplay_tilde_perform(t_int
*w
)
168 t_tabplay_tilde
*x
= (t_tabplay_tilde
*)(w
[1]);
169 t_sample
*out
= (t_sample
*)(w
[2]), *fp
;
170 int n
= (int)(w
[3]), phase
= x
->x_phase
,
171 endphase
= (x
->x_nsampsintab
< x
->x_limit
?
172 x
->x_nsampsintab
: x
->x_limit
), nxfer
, n3
;
173 if (!x
->x_vec
|| phase
>= endphase
)
176 nxfer
= endphase
- phase
;
177 fp
= x
->x_vec
+ phase
;
184 if (phase
>= endphase
)
186 clock_delay(x
->x_clock
, 0);
187 x
->x_phase
= 0x7fffffff;
191 else x
->x_phase
= phase
;
195 while (n
--) *out
++ = 0;
199 void tabplay_tilde_set(t_tabplay_tilde
*x
, t_symbol
*s
)
204 if (!(a
= (t_garray
*)pd_findbyclass(x
->x_arrayname
, garray_class
)))
206 if (*s
->s_name
) pd_error(x
, "tabplay~: %s: no such array",
207 x
->x_arrayname
->s_name
);
210 else if (!garray_getfloatarray(a
, &x
->x_nsampsintab
, &x
->x_vec
))
212 error("%s: bad template for tabplay~", x
->x_arrayname
->s_name
);
215 else garray_usedindsp(a
);
218 static void tabplay_tilde_dsp(t_tabplay_tilde
*x
, t_signal
**sp
)
220 tabplay_tilde_set(x
, x
->x_arrayname
);
221 dsp_add(tabplay_tilde_perform
, 3, x
, sp
[0]->s_vec
, sp
[0]->s_n
);
224 static void tabplay_tilde_list(t_tabplay_tilde
*x
, t_symbol
*s
,
225 int argc
, t_atom
*argv
)
227 long start
= atom_getfloatarg(0, argc
, argv
);
228 long length
= atom_getfloatarg(1, argc
, argv
);
229 if (start
< 0) start
= 0;
231 x
->x_limit
= 0x7fffffff;
233 x
->x_limit
= start
+ length
;
237 static void tabplay_tilde_stop(t_tabplay_tilde
*x
)
239 x
->x_phase
= 0x7fffffff;
242 static void tabplay_tilde_tick(t_tabplay_tilde
*x
)
244 outlet_bang(x
->x_bangout
);
247 static void tabplay_tilde_free(t_tabplay_tilde
*x
)
249 clock_free(x
->x_clock
);
252 void tabplay_tilde_setup(void)
254 tabplay_tilde_class
= class_new(gensym("tabplay~"),
255 (t_newmethod
)tabplay_tilde_new
, (t_method
)tabplay_tilde_free
,
256 sizeof(t_tabplay_tilde
), 0, A_DEFSYM
, 0);
257 class_addmethod(tabplay_tilde_class
, (t_method
)tabplay_tilde_dsp
,
259 class_addmethod(tabplay_tilde_class
, (t_method
)tabplay_tilde_stop
,
261 class_addmethod(tabplay_tilde_class
, (t_method
)tabplay_tilde_set
,
262 gensym("set"), A_DEFSYM
, 0);
263 class_addlist(tabplay_tilde_class
, tabplay_tilde_list
);