3
/*--------------- deltas ---------------*/
5
static t_class *deltas_class;
14
float *m_buffer; // circular buffer
18
static void deltas_perform_float(t_deltas *x, t_float f)
21
index=x->m_buffer_index+1;
22
index=(index==x->m_buffer_size)?0:index;
23
x->m_buffer_index=index;
27
static void deltas_bang(t_deltas *x)
29
int lo,hi,n,index,size;
38
size=x->m_buffer_size;
39
index=x->m_buffer_index;
40
ap = (t_atom *)getbytes(sizeof(t_atom)*n);
45
bp=(bp>=buffer)?bp:bp+size; // wrap
48
{ // no wrap-around needed
51
SETFLOAT(app, last-*bp--);
54
// post("not wrapped, app-ap=%i",app-ap);
62
for(;ps>=0;ps--) // don't we miss one sample in signal???
65
SETFLOAT(app, last-buffer[ps]);
74
SETFLOAT(app, last-buffer[ps--]);
82
post("first part %i",index);
84
SETFLOAT(app, last-*bp--);
88
post("2nd part %i",index);
91
SETFLOAT(app, last-*bp--);
95
// post("wrapped, app-ap=%i",app-ap);
98
outlet_list(x->x_obj.ob_outlet,gensym("list"),n,ap);
99
freebytes(ap, sizeof(t_atom)*n);
102
static void deltas_clear(t_deltas *x)
112
static void deltas_set(t_deltas *x, t_float lo, t_float hi, t_float size)
117
post("deltas: size is minimum 1...");
121
post("deltas: higher bound cannot be higher than the buffer size...");
126
post("deltas: lower bound cannot be negative...");
131
post("deltas: higher bound cannot be smaller than one...");
136
post("deltas: higher bound must be higher than lower bound...");
140
freebytes(x->m_buffer, x->m_buffer_size);
142
x->m_hi=(float)((int)hi);
143
x->m_lo=(float)((int)lo);
144
x->m_buffer_size=(int)size;
145
x->m_buffer = (float*)getbytes(sizeof(float)*x->m_buffer_size);
150
static void *deltas_new(t_float lo, t_float hi, t_float size)
152
t_deltas *x=(t_deltas *)pd_new(deltas_class);
153
outlet_new(&x->x_obj, gensym("list"));
156
deltas_set(x, lo, hi, size);
158
floatinlet_new(&x->x_obj, &x->m_lo);
159
floatinlet_new(&x->x_obj, &x->m_hi);
164
static void deltas_free(t_deltas *x)
166
freebytes(x->m_buffer, x->m_buffer_size);
169
void deltas_setup(void)
171
deltas_class = class_new(gensym("deltas"),
172
(t_newmethod)deltas_new, (t_method)deltas_free,
175
A_DEFFLOAT, A_DEFFLOAT, A_DEFFLOAT,0);
177
class_addmethod(deltas_class, (t_method)deltas_clear, gensym("clear"),0);
178
class_addfloat(deltas_class, (t_method)deltas_perform_float);
179
class_addbang(deltas_class, (t_method)deltas_bang);