diff options
Diffstat (limited to 'iemlib1/src')
-rw-r--r-- | iemlib1/src/FIR~.c | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/iemlib1/src/FIR~.c b/iemlib1/src/FIR~.c index 07f8417..0dc82c6 100644 --- a/iemlib1/src/FIR~.c +++ b/iemlib1/src/FIR~.c @@ -17,6 +17,7 @@ typedef struct _FIR_tilde t_sample *x_history_beg; int x_rw_index; int x_fir_order; + int x_fir_offset; int x_malloc_history; t_symbol *x_table_name; t_float x_float_sig_in; @@ -33,9 +34,10 @@ static t_int *FIR_tilde_perform(t_int *w) int rw_index = x->x_rw_index; int i, j; int order = x->x_fir_order; + int offset = x->x_fir_offset; int ord16 = order / 16; t_sample sum=0.0; - iemarray_t *coef = x->x_array_coef_beg; + iemarray_t *coef = x->x_array_coef_beg + offset; t_sample *write_hist1=x->x_history_beg; t_sample *write_hist2; t_sample *read_hist; @@ -99,17 +101,19 @@ FIR_tildeperfzero: return(w+5); } -void FIR_tilde_set(t_FIR_tilde *x, t_symbol *table_name, t_floatarg forder) +void FIR_tilde_set(t_FIR_tilde *x, t_symbol *table_name, t_floatarg forder, t_floatarg foffset) { t_garray *ga; int table_size; int order = (int)forder; + int offset = (foffset<1.0)?0:(int)foffset; int i; x->x_table_name = table_name; if(order < 1) order = 1; x->x_fir_order = order; + x->x_fir_offset = offset; if(!(ga = (t_garray *)pd_findbyclass(x->x_table_name, garray_class))) { if(*table_name->s_name) @@ -123,7 +127,7 @@ void FIR_tilde_set(t_FIR_tilde *x, t_symbol *table_name, t_floatarg forder) } else if(table_size < order) { - error("FIR~: tablesize %d < order %d !!!!", table_size, order); + error("FIR~: tablesize %d < order %d + offset %d !!!!", table_size, order, offset); x->x_array_coef_beg = (iemarray_t *)0; } else @@ -140,14 +144,15 @@ void FIR_tilde_set(t_FIR_tilde *x, t_symbol *table_name, t_floatarg forder) static void FIR_tilde_dsp(t_FIR_tilde *x, t_signal **sp) { - FIR_tilde_set(x, x->x_table_name, x->x_fir_order); + FIR_tilde_set(x, x->x_table_name, x->x_fir_order, x->x_fir_offset); dsp_add(FIR_tilde_perform, 4, sp[0]->s_vec, sp[1]->s_vec, x, sp[0]->s_n); } -static void *FIR_tilde_new(t_symbol *array_name, t_floatarg forder) +static void *FIR_tilde_new(t_symbol *array_name, t_floatarg forder, t_floatarg foffset) { t_FIR_tilde *x = (t_FIR_tilde *)pd_new(FIR_tilde_class); int order = (int)forder; + int offset= (int)foffset; outlet_new(&x->x_obj, &s_signal); x->x_float_sig_in = 0; @@ -155,7 +160,10 @@ static void *FIR_tilde_new(t_symbol *array_name, t_floatarg forder) x->x_array_coef_beg = 0; if(order < 1) order = 1; + if(offset < 0) + offset = 0; x->x_fir_order = order; + x->x_fir_offset = offset; x->x_malloc_history = order; x->x_history_beg = (t_sample *)getbytes((2*x->x_malloc_history)*sizeof(t_sample)); x->x_rw_index = 0; @@ -171,8 +179,8 @@ static void FIR_tilde_free(t_FIR_tilde *x) void FIR_tilde_setup(void) { FIR_tilde_class = class_new(gensym("FIR~"), (t_newmethod)FIR_tilde_new, - (t_method)FIR_tilde_free, sizeof(t_FIR_tilde), 0, A_DEFSYM, A_DEFFLOAT, 0); + (t_method)FIR_tilde_free, sizeof(t_FIR_tilde), 0, A_DEFSYM, A_DEFFLOAT, A_DEFFLOAT, 0); CLASS_MAINSIGNALIN(FIR_tilde_class, t_FIR_tilde, x_float_sig_in); class_addmethod(FIR_tilde_class, (t_method)FIR_tilde_dsp, gensym("dsp"), 0); - class_addmethod(FIR_tilde_class, (t_method)FIR_tilde_set, gensym("set"), A_SYMBOL, A_FLOAT, 0); + class_addmethod(FIR_tilde_class, (t_method)FIR_tilde_set, gensym("set"), A_SYMBOL, A_FLOAT, A_DEFFLOAT, 0); } |