From c91acb086ab4c95cef4feb0da4265a09f73a1201 Mon Sep 17 00:00:00 2001 From: Franz Zotter Date: Wed, 22 Oct 2008 12:38:10 +0000 Subject: added [mtx_sndfile] which reads blocks of an audiofile and [mtx_pack~] which packs the sample vectors of its signal inputs into a matrix. svn path=/trunk/externals/iem/iemmatrix/; revision=10336 --- src/mtx_pack~.c | 80 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 src/mtx_pack~.c (limited to 'src/mtx_pack~.c') diff --git a/src/mtx_pack~.c b/src/mtx_pack~.c new file mode 100644 index 0000000..c935d10 --- /dev/null +++ b/src/mtx_pack~.c @@ -0,0 +1,80 @@ +#include "m_pd.h" +#define MTX_PACK_MAXCHANNELS 200 + +static t_class *mtx_pack_tilde_class; + +typedef struct _mtx_pack_tilde { + t_object x_obj; + int block_size; + int num_chan; + t_float **sig_in; + t_atom *list_out; + t_outlet *message_outlet; +} mtx_pack_tilde; + +void *newMtxPackTilde (t_floatarg f) +{ + int num_chan=1; + mtx_pack_tilde *x = (mtx_pack_tilde*) pd_new(mtx_pack_tilde_class); + num_chan=(int)f; + if ((num_chan<0) || (num_chan>MTX_PACK_MAXCHANNELS)) { + num_chan=1; + } + x->num_chan=num_chan; + x->sig_in=0; + x->list_out=0; + while (num_chan--) { + inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); + } + x->sig_in = (t_float**)getbytes(sizeof(t_float*)*x->num_chan); + x->message_outlet=(t_outlet*)outlet_new(&x->x_obj,&s_list); + + return (void *) x; +} +void deleteMtxPackTilde (mtx_pack_tilde *x) +{ + if (x->sig_in) + freebytes (x->sig_in, x->num_chan * sizeof (t_float)); + if (x->list_out) + freebytes (x->list_out, (x->num_chan * x->block_size + 2)*sizeof(t_atom)); +} +static t_int *mTxPackTildePerform (t_int *arg) +{ + mtx_pack_tilde *x = (mtx_pack_tilde *) (arg[1]); + int chan; + int samp; + t_atom *lptr=x->list_out+2; + SETFLOAT(x->list_out,(t_float)x->num_chan); + SETFLOAT(x->list_out+1,(t_float)x->block_size); + + for (chan=0; channum_chan; chan++) { + for (samp=0; sampblock_size; samp++,lptr++) { + SETFLOAT(lptr, x->sig_in[chan][samp]); + } + } + + outlet_anything(x->message_outlet,gensym("matrix"), + x->block_size*x->num_chan+2,x->list_out); + + return(arg+2); + +} + +static void mTxPackTildeDsp (mtx_pack_tilde *x, t_signal **sp) +{ + int chan; + for (chan=0; channum_chan; chan++) + x->sig_in[chan]=sp[chan]->s_vec; + + x->block_size=sp[0]->s_n; + x->list_out = (t_atom*) getbytes ((x->num_chan * x->block_size + 2) *sizeof(t_atom)); + dsp_add(mTxPackTildePerform,1,x); +} + +void mtx_pack_tilde_setup (void) +{ + mtx_pack_tilde_class = class_new(gensym("mtx_pack~"), (t_newmethod)newMtxPackTilde, (t_method) deleteMtxPackTilde, sizeof(mtx_pack_tilde), CLASS_NOINLET, A_DEFFLOAT, 0); + class_addmethod (mtx_pack_tilde_class, (t_method) mTxPackTildeDsp, gensym("dsp"),0); +} + + -- cgit v1.2.1