/* * Add float from second inlet to signal from first inlet * and multiply by float value from third inlet. * if two creation arguments are specified they override the * default of (x+1)*0.5 * * 2005-08-01 Thomas Strathmann */ #include "m_pd.h" static t_class *addmult_tilde_class; typedef struct _addmult_tilde { t_object x_obj; t_sample f_add; t_sample f_mult; t_sample f; } t_addmult_tilde; t_int *addmult_tilde_perform(t_int *w) { t_addmult_tilde *x = (t_addmult_tilde *)(w[1]); t_sample *in = (t_sample *)(w[2]); t_sample *out = (t_sample *)(w[3]); int n = (int)(w[4]); t_float add = x->f_add; t_float mult = x->f_mult; while (n--) { float f = *(in++); *(out++) = (f+add)*mult; } return (w+5); } void addmult_tilde_dsp(t_addmult_tilde *x, t_signal **sp) { dsp_add(addmult_tilde_perform, 4, x, sp[0]->s_vec, sp[1]->s_vec, sp[0]->s_n); } void *addmult_tilde_new(t_symbol *selector, int argcount, t_atom *argvec) { t_addmult_tilde *x = (t_addmult_tilde *)pd_new(addmult_tilde_class); if(argcount < 2) { x->f_add = 1.0; x->f_mult = 0.5; } else { x->f_add = argvec[0].a_w.w_float; x->f_mult = argvec[1].a_w.w_float; } post("%f, %f", x->f_add, x->f_mult); floatinlet_new (&x->x_obj, &x->f_add); floatinlet_new (&x->x_obj, &x->f_mult); outlet_new(&x->x_obj, &s_signal); return (void *)x; } void addmult_tilde_setup(void) { addmult_tilde_class = class_new(gensym("+*~"), (t_newmethod)addmult_tilde_new, 0, sizeof(t_addmult_tilde), CLASS_DEFAULT, A_GIMME, 0); class_addmethod(addmult_tilde_class, (t_method)addmult_tilde_dsp, gensym("dsp"), 0); CLASS_MAINSIGNALIN(addmult_tilde_class, t_addmult_tilde, f); }