aboutsummaryrefslogtreecommitdiff
path: root/filterbank~.c
diff options
context:
space:
mode:
Diffstat (limited to 'filterbank~.c')
-rw-r--r--filterbank~.c606
1 files changed, 308 insertions, 298 deletions
diff --git a/filterbank~.c b/filterbank~.c
index 37d40c9..4fab001 100644
--- a/filterbank~.c
+++ b/filterbank~.c
@@ -126,44 +126,44 @@ static void miller_sigbp_docoef(t_filterbank_tilde *x, t_int index, t_floatarg f
static void filterbank_draw_new(t_filterbank_tilde *x, t_glist *glist)
{
- t_canvas *canvas=glist_getcanvas(glist);
- int fi;
-
- // draw the square
- {
-
- SYS_VGUI7(".x%lx.c create rectangle %d %d %d %d -fill #FFFFFF -tags %xFILTERBANK\n",
- canvas,
- text_xpix(&x->x_obj, glist),
- text_ypix(&x->x_obj, glist),
- text_xpix(&x->x_obj, glist) + x->x_width,
- text_ypix(&x->x_obj, glist) + x->x_height,
- x);
-
- SYS_VGUI7(".x%lx.c create rectangle %d %d %d %d -fill #000000 -tags %xSIN\n",
- canvas,
- text_xpix(&x->x_obj, glist),
- text_ypix(&x->x_obj, glist)-1,
- text_xpix(&x->x_obj, glist)+7,
- text_ypix(&x->x_obj, glist),
- x);
-
- for ( fi=0; fi<x->x_nbfilters; fi++ )
- {
- char color[8];
-
- sprintf( color, "#%.2x%.2x%.2x", (int)random() % 256, (int)random() % 256, (int)random() % 256 );
-
- SYS_VGUI11(".x%lx.c create polygon %d %d %d %d %d %d -outline #000000 -fill %s -tags %xFILTER%d\n",
- canvas,
- text_xpix(&x->x_obj, glist) + fi*x->x_width/x->x_nbfilters,
- text_ypix(&x->x_obj, glist),
- text_xpix(&x->x_obj, glist) + fi*x->x_width/x->x_nbfilters + x->x_width/(2*x->x_nbfilters),
- text_ypix(&x->x_obj, glist) + x->x_height,
- text_xpix(&x->x_obj, glist) + (fi+1)*x->x_width/x->x_nbfilters,
- text_ypix(&x->x_obj, glist),
- color, x, fi);
- }
+ t_canvas *canvas=glist_getcanvas(glist);
+ int fi;
+
+ // draw the square
+ {
+
+ SYS_VGUI7(".x%lx.c create rectangle %d %d %d %d -fill #FFFFFF -tags %xFILTERBANK\n",
+ canvas,
+ text_xpix(&x->x_obj, glist),
+ text_ypix(&x->x_obj, glist),
+ text_xpix(&x->x_obj, glist) + x->x_width,
+ text_ypix(&x->x_obj, glist) + x->x_height,
+ x);
+
+ SYS_VGUI7(".x%lx.c create rectangle %d %d %d %d -fill #000000 -tags %xSIN\n",
+ canvas,
+ text_xpix(&x->x_obj, glist),
+ text_ypix(&x->x_obj, glist)-1,
+ text_xpix(&x->x_obj, glist)+7,
+ text_ypix(&x->x_obj, glist),
+ x);
+
+ for ( fi=0; fi<x->x_nbfilters; fi++ )
+ {
+ char color[8];
+
+ sprintf( color, "#%.2x%.2x%.2x", (int)random() % 256, (int)random() % 256, (int)random() % 256 );
+
+ SYS_VGUI11(".x%lx.c create polygon %d %d %d %d %d %d -outline #000000 -fill %s -tags %xFILTER%d\n",
+ canvas,
+ text_xpix(&x->x_obj, glist) + fi*x->x_width/x->x_nbfilters,
+ text_ypix(&x->x_obj, glist),
+ text_xpix(&x->x_obj, glist) + fi*x->x_width/x->x_nbfilters + x->x_width/(2*x->x_nbfilters),
+ text_ypix(&x->x_obj, glist) + x->x_height,
+ text_xpix(&x->x_obj, glist) + (fi+1)*x->x_width/x->x_nbfilters,
+ text_ypix(&x->x_obj, glist),
+ color, x, fi);
+ }
}
canvas_fixlinesfor( canvas, (t_text*)x );
@@ -175,32 +175,32 @@ static void filterbank_draw_move(t_filterbank_tilde *x, t_glist *glist)
t_int fi;
SYS_VGUI7(".x%lx.c coords %xFILTERBANK %d %d %d %d\n",
- canvas, x,
- text_xpix(&x->x_obj, glist),
- text_ypix(&x->x_obj, glist),
- text_xpix(&x->x_obj, glist) + x->x_width,
- text_ypix(&x->x_obj, glist) + x->x_height
+ canvas, x,
+ text_xpix(&x->x_obj, glist),
+ text_ypix(&x->x_obj, glist),
+ text_xpix(&x->x_obj, glist) + x->x_width,
+ text_ypix(&x->x_obj, glist) + x->x_height
);
SYS_VGUI7(".x%lx.c coords %xSIN %d %d %d %d\n",
- canvas, x,
- text_xpix(&x->x_obj, glist),
- text_ypix(&x->x_obj, glist)-1,
- text_xpix(&x->x_obj, glist)+7,
- text_ypix(&x->x_obj, glist)
+ canvas, x,
+ text_xpix(&x->x_obj, glist),
+ text_ypix(&x->x_obj, glist)-1,
+ text_xpix(&x->x_obj, glist)+7,
+ text_ypix(&x->x_obj, glist)
);
for ( fi=0; fi<x->x_nbfilters; fi++ )
{
- SYS_VGUI10(".x%lx.c coords %xFILTER%d %d %d %d %d %d %d\n",
- canvas, x, fi,
- text_xpix(&x->x_obj, glist) + fi*x->x_width/x->x_nbfilters,
- text_ypix(&x->x_obj, glist),
- text_xpix(&x->x_obj, glist) + fi*x->x_width/x->x_nbfilters + x->x_width/(2*x->x_nbfilters),
- text_ypix(&x->x_obj, glist) + x->x_height,
- text_xpix(&x->x_obj, glist) + (fi+1)*x->x_width/x->x_nbfilters,
- text_ypix(&x->x_obj, glist)
- );
+ SYS_VGUI10(".x%lx.c coords %xFILTER%d %d %d %d %d %d %d\n",
+ canvas, x, fi,
+ text_xpix(&x->x_obj, glist) + fi*x->x_width/x->x_nbfilters,
+ text_ypix(&x->x_obj, glist),
+ text_xpix(&x->x_obj, glist) + fi*x->x_width/x->x_nbfilters + x->x_width/(2*x->x_nbfilters),
+ text_ypix(&x->x_obj, glist) + x->x_height,
+ text_xpix(&x->x_obj, glist) + (fi+1)*x->x_width/x->x_nbfilters,
+ text_ypix(&x->x_obj, glist)
+ );
}
canvas_fixlinesfor( canvas, (t_text*)x );
@@ -208,14 +208,14 @@ static void filterbank_draw_move(t_filterbank_tilde *x, t_glist *glist)
static void filterbank_draw_erase(t_filterbank_tilde* x,t_glist* glist)
{
- t_canvas *canvas=glist_getcanvas(glist);
- int fi;
-
+ t_canvas *canvas=glist_getcanvas(glist);
+ int fi;
+
SYS_VGUI3(".x%lx.c delete %xFILTERBANK\n", canvas, x );
SYS_VGUI3(".x%lx.c delete %xSIN\n", canvas, x );
for ( fi=0; fi<x->x_nbfilters; fi++ )
{
- SYS_VGUI4(".x%lx.c delete %xFILTER%d\n", canvas, x, fi );
+ SYS_VGUI4(".x%lx.c delete %xFILTER%d\n", canvas, x, fi );
}
}
@@ -227,11 +227,11 @@ static void filterbank_draw_select(t_filterbank_tilde* x,t_glist* glist)
if(x->x_selected)
{
/* sets the item in blue */
- SYS_VGUI3(".x%lx.c itemconfigure %xFILTERBANK -outline #0000FF\n", canvas, x);
+ SYS_VGUI3(".x%lx.c itemconfigure %xFILTERBANK -outline #0000FF\n", canvas, x);
}
else
{
- SYS_VGUI3(".x%lx.c itemconfigure %xFILTERBANK -outline #000000\n", canvas, x);
+ SYS_VGUI3(".x%lx.c itemconfigure %xFILTERBANK -outline #000000\n", canvas, x);
}
}
@@ -239,152 +239,154 @@ static void filterbank_draw_select(t_filterbank_tilde* x,t_glist* glist)
static void filterbank_getrect(t_gobj *z, t_glist *owner,
- int *xp1, int *yp1, int *xp2, int *yp2)
+ int *xp1, int *yp1, int *xp2, int *yp2)
{
- t_filterbank_tilde* x = (t_filterbank_tilde*)z;
+ t_filterbank_tilde* x = (t_filterbank_tilde*)z;
- *xp1 = text_xpix(&x->x_obj, owner);
- *yp1 = text_ypix(&x->x_obj, owner);
- *xp2 = text_xpix(&x->x_obj, owner)+x->x_width;
- *yp2 = text_ypix(&x->x_obj, owner)+x->x_height;
+ *xp1 = text_xpix(&x->x_obj, owner);
+ *yp1 = text_ypix(&x->x_obj, owner);
+ *xp2 = text_xpix(&x->x_obj, owner)+x->x_width;
+ *yp2 = text_ypix(&x->x_obj, owner)+x->x_height;
}
static void filterbank_save(t_gobj *z, t_binbuf *b)
{
- t_filterbank_tilde *x = (t_filterbank_tilde *)z;
- t_int ii;
+ t_filterbank_tilde *x = (t_filterbank_tilde *)z;
+ t_int ii;
- binbuf_addv(b, "ssiisiii", gensym("#X"),gensym("obj"),
- (t_int)x->x_obj.te_xpix, (t_int)x->x_obj.te_ypix,
- atom_getsymbol(binbuf_getvec(x->x_obj.te_binbuf)),
- x->x_lowfreq, x->x_highfreq,
+ binbuf_addv(b, "ssiisiii", gensym("#X"),gensym("obj"),
+ (t_int)x->x_obj.te_xpix, (t_int)x->x_obj.te_ypix,
+ atom_getsymbol(binbuf_getvec(x->x_obj.te_binbuf)),
+ x->x_lowfreq, x->x_highfreq,
x->x_nbfilters );
- binbuf_addv(b, ";");
+ binbuf_addv(b, ";");
}
static void filterbank_properties(t_gobj *z, t_glist *owner)
{
- char buf[800];
- t_filterbank_tilde *x=(t_filterbank_tilde *)z;
+ char buf[800];
+ t_filterbank_tilde *x=(t_filterbank_tilde *)z;
- sprintf(buf, "pdtk_filterbank_dialog %%s %d %d\n",
+ sprintf(buf, "pdtk_filterbank_dialog %%s %d %d\n",
x->x_lowfreq, x->x_highfreq );
- gfxstub_new(&x->x_obj.ob_pd, x, buf);
+ gfxstub_new(&x->x_obj.ob_pd, x, buf);
}
static void filterbank_select(t_gobj *z, t_glist *glist, int selected)
{
- t_filterbank_tilde *x = (t_filterbank_tilde *)z;
+ t_filterbank_tilde *x = (t_filterbank_tilde *)z;
- x->x_selected = selected;
- filterbank_draw_select( x, glist );
+ x->x_selected = selected;
+ filterbank_draw_select( x, glist );
}
static void filterbank_vis(t_gobj *z, t_glist *glist, int vis)
{
- t_filterbank_tilde *x = (t_filterbank_tilde *)z;
-
- // post( "filterbank~ : vis : %d", vis );
- if (vis)
- {
- filterbank_draw_new( x, glist );
- }
- else
- {
- filterbank_draw_erase( x, glist );
- }
+ t_filterbank_tilde *x = (t_filterbank_tilde *)z;
+
+ // post( "filterbank~ : vis : %d", vis );
+ if (vis)
+ {
+ filterbank_draw_new( x, glist );
+ }
+ else
+ {
+ filterbank_draw_erase( x, glist );
+ }
}
static void filterbank_dialog(t_filterbank_tilde *x, t_symbol *s, int argc, t_atom *argv)
{
- t_int olowfreq = x->x_lowfreq;
- t_int ohighfreq = x->x_highfreq;
- t_int fi, ei;
- t_int dspstate;
- t_float Q;
- t_float afreq, abandwidth;
- t_canvas *canvas=glist_getcanvas(x->x_glist);
-
- // !!paranoid
- if ( !x ) {
- post( "filterbank~ : error :tried to set properties on an unexisting object" );
- }
- if ( argc != 2 )
- {
- post( "filterbank : error in the number of arguments ( %d instead of 2 )", argc );
- return;
- }
- if ( argv[0].a_type != A_FLOAT || argv[1].a_type != A_FLOAT ) {
- post( "filterbank~ : wrong arguments" );
- return;
- }
-
- x->x_allocate = 1;
- x->x_lowfreq = (int)argv[0].a_w.w_float;
- if ( x->x_lowfreq < 0 ) x->x_lowfreq = 0;
- x->x_highfreq = (int)argv[1].a_w.w_float;
- if ( x->x_highfreq < x->x_lowfreq ) x->x_highfreq = x->x_lowfreq + 100;
-
- // recalculate filters if needed
- if ( ( olowfreq != x->x_lowfreq ) || ( ohighfreq != x->x_highfreq ) )
- {
- // free filters
- if ( x->x_freq )
- {
- freebytes( x->x_freq, x->x_nbfilters*sizeof(t_float) );
- }
- if ( x->x_q )
- {
- freebytes( x->x_q, x->x_nbfilters*sizeof(t_float) );
- }
- if ( x->x_cspace )
- {
- freebytes( x->x_cspace, x->x_nbfilters*sizeof(t_bpctl) );
- }
- if ( x->x_ctl )
- {
- freebytes( x->x_ctl, x->x_nbfilters*sizeof(t_bpctl*) );
- }
- // create filters
- x->x_freq = (t_float *) getbytes( x->x_nbfilters*sizeof(t_float) );
- x->x_q = (t_float *) getbytes( x->x_nbfilters*sizeof(t_float) );
- x->x_cspace = (t_bpctl *) getbytes( x->x_nbfilters*sizeof(t_bpctl) );
- x->x_ctl = (t_bpctl **) getbytes( x->x_nbfilters*sizeof(t_bpctl*) );
- if ( !x->x_freq || !x->x_q || !x->x_cspace || !x->x_ctl )
- {
- post( "filterbank~ : could not allocate filters" );
- return;
- }
- abandwidth = ( x->x_highfreq - x->x_lowfreq ) / x->x_nbfilters;
- afreq = x->x_lowfreq + ( abandwidth / 2 );
- for ( fi=0; fi<x->x_nbfilters; fi++ )
- {
- x->x_ctl[fi] = &x->x_cspace[fi];
- x->x_cspace[fi].c_x1 = 0;
- x->x_cspace[fi].c_x2 = 0;
- Q = ( (t_float) afreq )/ ( (t_float) abandwidth );
- miller_sigbp_docoef( x, fi, afreq, Q );
- afreq += abandwidth;
- }
- }
-
- x->x_allocate = 0;
+ t_int olowfreq = x->x_lowfreq;
+ t_int ohighfreq = x->x_highfreq;
+ t_int fi, ei;
+ t_int dspstate;
+ t_float Q;
+ t_float afreq, abandwidth;
+ t_canvas *canvas=glist_getcanvas(x->x_glist);
+
+ // !!paranoid
+ if ( !x )
+ {
+ post( "filterbank~ : error :tried to set properties on an unexisting object" );
+ }
+ if ( argc != 2 )
+ {
+ post( "filterbank : error in the number of arguments ( %d instead of 2 )", argc );
+ return;
+ }
+ if ( argv[0].a_type != A_FLOAT || argv[1].a_type != A_FLOAT )
+ {
+ post( "filterbank~ : wrong arguments" );
+ return;
+ }
+
+ x->x_allocate = 1;
+ x->x_lowfreq = (int)argv[0].a_w.w_float;
+ if ( x->x_lowfreq < 0 ) x->x_lowfreq = 0;
+ x->x_highfreq = (int)argv[1].a_w.w_float;
+ if ( x->x_highfreq < x->x_lowfreq ) x->x_highfreq = x->x_lowfreq + 100;
+
+ // recalculate filters if needed
+ if ( ( olowfreq != x->x_lowfreq ) || ( ohighfreq != x->x_highfreq ) )
+ {
+ // free filters
+ if ( x->x_freq )
+ {
+ freebytes( x->x_freq, x->x_nbfilters*sizeof(t_float) );
+ }
+ if ( x->x_q )
+ {
+ freebytes( x->x_q, x->x_nbfilters*sizeof(t_float) );
+ }
+ if ( x->x_cspace )
+ {
+ freebytes( x->x_cspace, x->x_nbfilters*sizeof(t_bpctl) );
+ }
+ if ( x->x_ctl )
+ {
+ freebytes( x->x_ctl, x->x_nbfilters*sizeof(t_bpctl*) );
+ }
+ // create filters
+ x->x_freq = (t_float *) getbytes( x->x_nbfilters*sizeof(t_float) );
+ x->x_q = (t_float *) getbytes( x->x_nbfilters*sizeof(t_float) );
+ x->x_cspace = (t_bpctl *) getbytes( x->x_nbfilters*sizeof(t_bpctl) );
+ x->x_ctl = (t_bpctl **) getbytes( x->x_nbfilters*sizeof(t_bpctl*) );
+ if ( !x->x_freq || !x->x_q || !x->x_cspace || !x->x_ctl )
+ {
+ post( "filterbank~ : could not allocate filters" );
+ return;
+ }
+ abandwidth = ( x->x_highfreq - x->x_lowfreq ) / x->x_nbfilters;
+ afreq = x->x_lowfreq + ( abandwidth / 2 );
+ for ( fi=0; fi<x->x_nbfilters; fi++ )
+ {
+ x->x_ctl[fi] = &x->x_cspace[fi];
+ x->x_cspace[fi].c_x1 = 0;
+ x->x_cspace[fi].c_x2 = 0;
+ Q = ( (t_float) afreq )/ ( (t_float) abandwidth );
+ miller_sigbp_docoef( x, fi, afreq, Q );
+ afreq += abandwidth;
+ }
+ }
+
+ x->x_allocate = 0;
}
static void filterbank_delete(t_gobj *z, t_glist *glist)
{
- t_filterbank_tilde *x = (t_filterbank_tilde *)z;
+ t_filterbank_tilde *x = (t_filterbank_tilde *)z;
- // post( "filterbank~ : delete" );
- filterbank_draw_erase( x, glist );
- canvas_deletelinesfor(glist, (t_text *)z);
+ // post( "filterbank~ : delete" );
+ filterbank_draw_erase( x, glist );
+ canvas_deletelinesfor(glist, (t_text *)z);
}
static void filterbank_displace(t_gobj *z, t_glist *glist, int dx, int dy)
{
- t_filterbank_tilde *x = (t_filterbank_tilde *)z;
- int xold = text_xpix(&x->x_obj, glist);
- int yold = text_ypix(&x->x_obj, glist);
+ t_filterbank_tilde *x = (t_filterbank_tilde *)z;
+ int xold = text_xpix(&x->x_obj, glist);
+ int yold = text_ypix(&x->x_obj, glist);
// post( "filterbank_displace dx=%d dy=%d", dx, dy );
@@ -392,31 +394,36 @@ static void filterbank_displace(t_gobj *z, t_glist *glist, int dx, int dy)
x->x_obj.te_ypix += dy;
if(xold != text_xpix(&x->x_obj, glist) || yold != text_ypix(&x->x_obj, glist) )
{
- filterbank_draw_move(x, x->x_glist);
+ filterbank_draw_move(x, x->x_glist);
}
}
static void filterbank_randomize(t_filterbank_tilde *x, t_floatarg fflag )
{
- t_int shind, tmpi, fi;
-
- if ( fflag != 0.0 && fflag != 1.0 ) {
- post( "filterbank~ : wrong argument in randomize message : should be 0 or 1" );
- return;
- } else if ( fflag == 1 ) {
- for ( fi=0; fi<x->x_nbfilters; fi++ )
- {
- shind = rand() % x->x_nbfilters;
- tmpi = x->x_outmapping[ shind ];
- x->x_outmapping[ shind ] = x->x_outmapping[ fi ];
- x->x_outmapping[ fi ] = tmpi;
- }
- } else {
- for ( fi=0; fi<x->x_nbfilters; fi++ )
- {
- x->x_outmapping[ fi ] = fi;
- }
+ t_int shind, tmpi, fi;
+
+ if ( fflag != 0.0 && fflag != 1.0 )
+ {
+ post( "filterbank~ : wrong argument in randomize message : should be 0 or 1" );
+ return;
+ }
+ else if ( fflag == 1 )
+ {
+ for ( fi=0; fi<x->x_nbfilters; fi++ )
+ {
+ shind = rand() % x->x_nbfilters;
+ tmpi = x->x_outmapping[ shind ];
+ x->x_outmapping[ shind ] = x->x_outmapping[ fi ];
+ x->x_outmapping[ fi ] = tmpi;
+ }
+ }
+ else
+ {
+ for ( fi=0; fi<x->x_nbfilters; fi++ )
+ {
+ x->x_outmapping[ fi ] = fi;
+ }
}
}
@@ -427,38 +434,39 @@ static t_filterbank_tilde *filterbank_new(t_symbol *s, int argc, t_atom *argv)
char *str;
t_float Q;
t_float afreq, abandwidth;
-
+
x = (t_filterbank_tilde *)pd_new(filterbank_class_tilde);
x->x_samplerate = (int)sys_getsr();
x->x_sr = 44100;
- // new filterbank created from the gui
+ // new filterbank created from the gui
if ( argc != 0 )
{
- if ( argc != 3 )
- {
- post( "filterbank~ : error in the number of arguments ( %d )", argc );
- return NULL;
- }
- if ( argv[0].a_type != A_FLOAT || argv[1].a_type != A_FLOAT ||
- argv[2].a_type != A_FLOAT ) {
- post( "filterbank~ : wrong arguments" );
- return NULL;
- }
+ if ( argc != 3 )
+ {
+ post( "filterbank~ : error in the number of arguments ( %d )", argc );
+ return NULL;
+ }
+ if ( argv[0].a_type != A_FLOAT || argv[1].a_type != A_FLOAT ||
+ argv[2].a_type != A_FLOAT )
+ {
+ post( "filterbank~ : wrong arguments" );
+ return NULL;
+ }
- x->x_lowfreq = (int)argv[0].a_w.w_float;
- if ( x->x_lowfreq < 0 ) x->x_lowfreq = 0;
- x->x_highfreq = (int)argv[1].a_w.w_float;
- if ( x->x_highfreq < x->x_lowfreq ) x->x_highfreq = x->x_lowfreq + 100;
- x->x_nbfilters = (int)argv[2].a_w.w_float;
- if ( x->x_nbfilters < 1 ) x->x_nbfilters = 1;
+ x->x_lowfreq = (int)argv[0].a_w.w_float;
+ if ( x->x_lowfreq < 0 ) x->x_lowfreq = 0;
+ x->x_highfreq = (int)argv[1].a_w.w_float;
+ if ( x->x_highfreq < x->x_lowfreq ) x->x_highfreq = x->x_lowfreq + 100;
+ x->x_nbfilters = (int)argv[2].a_w.w_float;
+ if ( x->x_nbfilters < 1 ) x->x_nbfilters = 1;
}
else
{
- x->x_lowfreq = DEFAULT_FILTERBANK_LOWFREQ;
- x->x_highfreq = DEFAULT_FILTERBANK_HIGHFREQ;
- x->x_nbfilters = DEFAULT_FILTERBANK_NBFILTERS;
+ x->x_lowfreq = DEFAULT_FILTERBANK_LOWFREQ;
+ x->x_highfreq = DEFAULT_FILTERBANK_HIGHFREQ;
+ x->x_nbfilters = DEFAULT_FILTERBANK_NBFILTERS;
}
// post( "filterbank~ : new [ %d,%d ] with %d filters", x->x_lowfreq, x->x_highfreq, x->x_nbfilters );
@@ -467,34 +475,34 @@ static t_filterbank_tilde *filterbank_new(t_symbol *s, int argc, t_atom *argv)
x->x_outputs = (t_outlet **) getbytes( x->x_nbfilters*sizeof(t_outlet *) );
if ( !x->x_outputs )
{
- post( "filterbank~ : could not allocate outputs" );
- return NULL;
+ post( "filterbank~ : could not allocate outputs" );
+ return NULL;
}
for ( fi=0; fi<x->x_nbfilters; fi++ )
{
- x->x_outputs[fi] = outlet_new( &x->x_obj, &s_signal );
+ x->x_outputs[fi] = outlet_new( &x->x_obj, &s_signal );
}
- // create filters
+ // create filters
x->x_freq = (t_float *) getbytes( x->x_nbfilters*sizeof(t_float) );
x->x_q = (t_float *) getbytes( x->x_nbfilters*sizeof(t_float) );
x->x_cspace = (t_bpctl *) getbytes( x->x_nbfilters*sizeof(t_bpctl) );
x->x_ctl = (t_bpctl **) getbytes( x->x_nbfilters*sizeof(t_bpctl*) );
if ( !x->x_freq || !x->x_q || !x->x_cspace || !x->x_ctl )
{
- post( "filterbank~ : could not allocate filters" );
- return NULL;
+ post( "filterbank~ : could not allocate filters" );
+ return NULL;
}
abandwidth = ( x->x_highfreq - x->x_lowfreq ) / x->x_nbfilters;
afreq = x->x_lowfreq + ( abandwidth / 2 );
for ( fi=0; fi<x->x_nbfilters; fi++ )
{
- x->x_ctl[fi] = &x->x_cspace[fi];
- x->x_cspace[fi].c_x1 = 0;
- x->x_cspace[fi].c_x2 = 0;
- Q = ( (t_float) afreq ) / ( (t_float) abandwidth );
- miller_sigbp_docoef( x, fi, afreq, Q );
- afreq += abandwidth;
+ x->x_ctl[fi] = &x->x_cspace[fi];
+ x->x_cspace[fi].c_x1 = 0;
+ x->x_cspace[fi].c_x2 = 0;
+ Q = ( (t_float) afreq ) / ( (t_float) abandwidth );
+ miller_sigbp_docoef( x, fi, afreq, Q );
+ afreq += abandwidth;
}
x->x_width = x->x_nbfilters*FILTERBANK_OUTLET_WIDTH*2;
@@ -506,48 +514,48 @@ static t_filterbank_tilde *filterbank_new(t_symbol *s, int argc, t_atom *argv)
x->x_outmapping = (t_int*) getbytes( x->x_nbfilters*sizeof( t_int ) );
if ( !x->x_outmapping )
{
- post( "filterbank~ : cannot allocate mapping array" );
- return NULL; // otherwise, pd schrieks
+ post( "filterbank~ : cannot allocate mapping array" );
+ return NULL; // otherwise, pd schrieks
}
for ( fi=0; fi<x->x_nbfilters; fi++ )
{
- x->x_outmapping[fi] = fi;
+ x->x_outmapping[fi] = fi;
}
return (x);
}
static void filterbank_free(t_filterbank_tilde *x)
{
- t_int ei, fi;
-
- if ( x->x_outputs )
- {
- for ( ei=0; ei<x->x_nbfilters; ei++ )
- {
- outlet_free( x->x_outputs[ei] );
- }
- freebytes( x->x_outputs, x->x_nbfilters*sizeof(t_outlet*) );
- }
- if ( x->x_freq )
- {
- freebytes( x->x_freq, x->x_nbfilters*sizeof(t_float) );
- }
- if ( x->x_q )
- {
- freebytes( x->x_q, x->x_nbfilters*sizeof(t_float) );
- }
- if ( x->x_cspace )
- {
- freebytes( x->x_cspace, x->x_nbfilters*sizeof(t_bpctl) );
- }
- if ( x->x_ctl )
- {
- freebytes( x->x_ctl, x->x_nbfilters*sizeof(t_bpctl*) );
- }
- if ( x->x_outmapping )
- {
- freebytes( x->x_outmapping, x->x_nbfilters*sizeof(t_int) );
- }
+ t_int ei, fi;
+
+ if ( x->x_outputs )
+ {
+ for ( ei=0; ei<x->x_nbfilters; ei++ )
+ {
+ outlet_free( x->x_outputs[ei] );
+ }
+ freebytes( x->x_outputs, x->x_nbfilters*sizeof(t_outlet*) );
+ }
+ if ( x->x_freq )
+ {
+ freebytes( x->x_freq, x->x_nbfilters*sizeof(t_float) );
+ }
+ if ( x->x_q )
+ {
+ freebytes( x->x_q, x->x_nbfilters*sizeof(t_float) );
+ }
+ if ( x->x_cspace )
+ {
+ freebytes( x->x_cspace, x->x_nbfilters*sizeof(t_bpctl) );
+ }
+ if ( x->x_ctl )
+ {
+ freebytes( x->x_ctl, x->x_nbfilters*sizeof(t_bpctl*) );
+ }
+ if ( x->x_outmapping )
+ {
+ freebytes( x->x_outmapping, x->x_nbfilters*sizeof(t_int) );
+ }
}
static t_int *filterbank_perform(t_int *w)
@@ -558,8 +566,8 @@ static t_int *filterbank_perform(t_int *w)
t_float *in, *out;
int i;
t_float last, prev, coef1, coef2, gain;
- t_float *acopy;
- t_int noneedtofilter = 1;
+ t_float *acopy;
+ t_int noneedtofilter = 1;
in = (t_float*)w[3];
@@ -567,51 +575,53 @@ static t_int *filterbank_perform(t_int *w)
acopy = (t_float*) getbytes( n*sizeof( t_float ) );
if ( !acopy )
{
- post( "filterbank~ : cannot allocate audio copy block" );
- return 0; // otherwise, pd schrieks
+ post( "filterbank~ : cannot allocate audio copy block" );
+ return 0; // otherwise, pd schrieks
}
memcpy( acopy, in, n*sizeof(t_float) );
for ( i=0; i<n; i++ )
{
- if ( *(acopy+i) != 0.0 ) noneedtofilter = 0;
+ if ( *(acopy+i) != 0.0 ) noneedtofilter = 0;
}
if ( !noneedtofilter )
{
- for ( fi=0; fi<x->x_nbfilters; fi++ )
- {
- out = (t_float *)(w[x->x_outmapping[fi]+4]);
-
- last = x->x_ctl[fi]->c_x1;
- prev = x->x_ctl[fi]->c_x2;
- coef1 = x->x_ctl[fi]->c_coef1;
- coef2 = x->x_ctl[fi]->c_coef2;
- gain = x->x_ctl[fi]->c_gain;
- for (i=0; i < n; i++)
+ for ( fi=0; fi<x->x_nbfilters; fi++ )
{
- float output = *(acopy+i) + coef1 * last + coef2 * prev;
- *out++ = gain * output;
- prev = last;
- last = output;
- }
+ out = (t_float *)(w[x->x_outmapping[fi]+4]);
+
+ last = x->x_ctl[fi]->c_x1;
+ prev = x->x_ctl[fi]->c_x2;
+ coef1 = x->x_ctl[fi]->c_coef1;
+ coef2 = x->x_ctl[fi]->c_coef2;
+ gain = x->x_ctl[fi]->c_gain;
+ for (i=0; i < n; i++)
+ {
+ float output = *(acopy+i) + coef1 * last + coef2 * prev;
+ *out++ = gain * output;
+ prev = last;
+ last = output;
+ }
/* NAN protect */
- if (!((last <= 0) || (last >= 0)))
- last = 0;
- if (!((prev <= 0) || (prev >= 0)))
- prev = 0;
- x->x_ctl[fi]->c_x1 = last;
- x->x_ctl[fi]->c_x2 = prev;
- }
- } else {
- for ( fi=0; fi<x->x_nbfilters; fi++ )
- {
- out = (t_float *)(w[x->x_outmapping[fi]+4]);
- for (i=0; i < n; i++)
+ if (!((last <= 0) || (last >= 0)))
+ last = 0;
+ if (!((prev <= 0) || (prev >= 0)))
+ prev = 0;
+ x->x_ctl[fi]->c_x1 = last;
+ x->x_ctl[fi]->c_x2 = prev;
+ }
+ }
+ else
+ {
+ for ( fi=0; fi<x->x_nbfilters; fi++ )
{
- *out++ = 0.0;
+ out = (t_float *)(w[x->x_outmapping[fi]+4]);
+ for (i=0; i < n; i++)
+ {
+ *out++ = 0.0;
+ }
}
- }
}
if ( acopy ) freebytes( acopy, n*sizeof(t_float) );
@@ -621,7 +631,7 @@ static t_int *filterbank_perform(t_int *w)
static void filterbank_dsp(t_filterbank_tilde *x, t_signal **sp)
{
- t_int *dspargs, fi, nbargs;
+ t_int *dspargs, fi, nbargs;
dspargs = (t_int*) getbytes( (x->x_nbfilters+3)*sizeof(t_int) );
@@ -632,10 +642,10 @@ static void filterbank_dsp(t_filterbank_tilde *x, t_signal **sp)
nbargs = 3;
for ( fi=0; fi<x->x_nbfilters; fi++ )
{
- dspargs[3+fi] = (t_int)sp[fi+1]->s_vec;
- nbargs++;
+ dspargs[3+fi] = (t_int)sp[fi+1]->s_vec;
+ nbargs++;
}
-
+
dsp_addv(filterbank_perform, nbargs, dspargs );
if ( dspargs ) freebytes( dspargs, (x->x_nbfilters+3)*sizeof(t_int) );
@@ -645,7 +655,7 @@ void filterbank_tilde_setup(void)
{
verbose(0, filterbank_version );
filterbank_class_tilde = class_new(gensym("filterbank~"), (t_newmethod)filterbank_new,
- (t_method)filterbank_free, sizeof(t_filterbank_tilde), 0, A_GIMME, 0);
+ (t_method)filterbank_free, sizeof(t_filterbank_tilde), 0, A_GIMME, 0);
CLASS_MAINSIGNALIN( filterbank_class_tilde, t_filterbank_tilde, x_f );
class_addmethod(filterbank_class_tilde, (t_method)filterbank_dsp, gensym("dsp"), 0);
class_addmethod(filterbank_class_tilde, (t_method)filterbank_dialog, gensym("dialog"), A_GIMME, 0);
@@ -668,6 +678,6 @@ void filterbank_tilde_setup(void)
class_setwidget(filterbank_class_tilde, &filterbank_widgetbehavior);
sys_vgui("eval [read [open {%s/%s.tcl}]]\n",
- filterbank_class_tilde->c_externdir->s_name,
+ filterbank_class_tilde->c_externdir->s_name,
filterbank_class_tilde->c_name->s_name);
}