From 68404305ac5116d8d76ac538748fa206c44a5a93 Mon Sep 17 00:00:00 2001 From: Cyrille Henry Date: Wed, 14 Jan 2015 19:46:48 +0000 Subject: more coherent function name, and examples svn path=/trunk/externals/nusmuk/; revision=17408 --- nusmuk-utils/mtx_preset.c | 169 +++++++++++++++++++++++++++++++--------------- 1 file changed, 114 insertions(+), 55 deletions(-) (limited to 'nusmuk-utils/mtx_preset.c') diff --git a/nusmuk-utils/mtx_preset.c b/nusmuk-utils/mtx_preset.c index 2291bd8..4b62acb 100644 --- a/nusmuk-utils/mtx_preset.c +++ b/nusmuk-utils/mtx_preset.c @@ -204,72 +204,101 @@ void mtx_preset_getMatrix(t_mtx_preset *x) outlet_anything(x->main_outlet, gensym("matrix"),x->sizeX*x->sizeY+2,std_out); } -void mtx_preset_getRow(t_mtx_preset *x, t_symbol *s, int argc, t_atom *argv) +void mtx_preset_getRows(t_mtx_preset *x) { - int i,j, a,b; - t_float c; + int i,j; t_atom std_out[x->sizeX+1]; - if (argc == 0) - for (i=0; i< x->sizeY; i++) { - SETFLOAT(&(std_out[0]),i); - for (j=0; j < x->sizeX; j++) { - SETFLOAT(&(std_out[j+1]),x->matrix[j][i]); - } - outlet_anything(x->main_outlet, gensym("row"),x->sizeX+1,std_out); - } - else if ((argc > 0) && (argv[0].a_type == A_FLOAT)) { - a = floor(atom_getfloatarg(0,argc,argv)); - b = a+1; - c = atom_getfloatarg(0,argc,argv)-a; - - a = min(a, x->sizeX); - a = max(a,0); - b = min(a, x->sizeX); - b = max(b,0); - - for (i=0; i < x->sizeX; i++) { - SETFLOAT(&(std_out[i]),mix(x->matrix[i][a], x->matrix[i][b], c)); + for (i=0; i< x->sizeY; i++) { + SETFLOAT(&(std_out[0]),i); + for (j=0; j < x->sizeX; j++) { + SETFLOAT(&(std_out[j+1]),x->matrix[j][i]); } - outlet_list(x->main_outlet, gensym("list"), x->sizeX, std_out); + outlet_anything(x->main_outlet, gensym("rows"),x->sizeX+1,std_out); } } -void mtx_preset_getElement(t_mtx_preset *x, t_symbol *s, int argc, t_atom *argv) +void mtx_preset_getRow(t_mtx_preset *x, t_float row) { - int i, a, b; + int i,a,b; t_float c; - t_atom std_out[2]; + t_atom std_out[x->sizeX+1]; + + a = floor(row); + b = a+1; + c = row-a; - if ((argc > 1) && (argv[0].a_type == A_FLOAT) && (argv[1].a_type == A_FLOAT)) { - a = min(atom_getfloatarg(0,argc,argv), x->sizeX); - a = max(a,0); - b = min(atom_getfloatarg(1,argc,argv), x->sizeY); - b = max(b,0); - outlet_float(x->main_outlet, x->matrix[a][b]); + a = min(a, x->sizeY-1); + a = max(a,0); + b = min(b, x->sizeY-1); + b = max(b,0); + + for (i=0; i < x->sizeX; i++) { + SETFLOAT(&(std_out[i]),mix(x->matrix[i][a], x->matrix[i][b], c)); } - else if ((argc > 0) && (argv[0].a_type == A_FLOAT)) { - a = floor(atom_getfloatarg(0,argc,argv)); - b = a+1; - c = atom_getfloatarg(0,argc,argv)-floor(atom_getfloatarg(0,argc,argv)); - - a = min(a, x->sizeX); - a = max(a,0); - b = min(b, x->sizeX); - b = max(b,0); - + outlet_anything(x->main_outlet, gensym("row"), x->sizeX, std_out); +} + +void mtx_preset_getElementss(t_mtx_preset *x) +{ + int i, j; + t_atom std_out[3]; + + for (j=0; j < x->sizeY; j++) { + SETFLOAT(&(std_out[1]),j); for (i=0; i < x->sizeX; i++) { SETFLOAT(&(std_out[0]),i); - SETFLOAT(&(std_out[1]),mix(x->matrix[i][a], x->matrix[i][b], c)); - outlet_anything(x->main_outlet, gensym("element"), 2, std_out); + SETFLOAT(&(std_out[2]),x->matrix[i][j]); + outlet_anything(x->main_outlet, gensym("elementss"), 3, std_out); } } - else { - error("bad arguments for getElement"); +} + +void mtx_preset_getElements(t_mtx_preset *x, t_float row) +{ + int i, a, b; + t_float c; + t_atom std_out[2]; + + a = floor(row); + b = a+1; + c = row-a; + + a = min(a, x->sizeY-1); + a = max(a,0); + b = min(b, x->sizeY-1); + b = max(b,0); + + for (i=0; i < x->sizeX; i++) { + SETFLOAT(&(std_out[0]),i); + SETFLOAT(&(std_out[1]),mix(x->matrix[i][a], x->matrix[i][b], c)); + outlet_anything(x->main_outlet, gensym("elements"), 2, std_out); } } -void mtx_preset_mixRow(t_mtx_preset *x, t_symbol *s, int argc, t_atom *argv) +void mtx_preset_getElement(t_mtx_preset *x, t_float col, t_float row) +{ + int a, b, d; + t_float c; + t_atom std_out[1]; + + a = floor(row); + b = a+1; + c = row-a; + + a = min(a, x->sizeY-1); + a = max(a,0); + b = min(b, x->sizeY-1); + b = max(b,0); + + d = min(col, x->sizeX-1); + d = max(d,0); + + SETFLOAT(&(std_out[0]),mix(x->matrix[d][a], x->matrix[d][b], c)); + outlet_anything(x->main_outlet, gensym("element"), 1, std_out); +} + +void mtx_preset_mixRows(t_mtx_preset *x, t_symbol *s, int argc, t_atom *argv) { int i, j; t_atom std_out[x->sizeX]; @@ -279,12 +308,34 @@ void mtx_preset_mixRow(t_mtx_preset *x, t_symbol *s, int argc, t_atom *argv) row[i] = 0; for (j=0; jsizeY); j++) - for (i=0; i < x->sizeX; i++) - row[i] += x->matrix[i][j] * atom_getfloatarg(j, argc, argv); + if ((argv[j].a_type == A_FLOAT) && (atom_getfloatarg(j, argc, argv) != 0)) + for (i=0; i < x->sizeX; i++) + row[i] += x->matrix[i][j] * atom_getfloatarg(j, argc, argv); for (i=0; i < x->sizeX; i++) SETFLOAT(&(std_out[i]),row[i]); - outlet_list(x->main_outlet, gensym("list"), x->sizeX, std_out); + outlet_anything(x->main_outlet, gensym("mixRows"), x->sizeX, std_out); +} + +void mtx_preset_mixElements(t_mtx_preset *x, t_symbol *s, int argc, t_atom *argv) +{ + int i, j; + t_atom std_out[x->sizeX]; + t_float row[2]; + + for (i=0; i < x->sizeX; i++) + row[i] = 0; + + for (j=0; jsizeY); j++) + if ((argv[j].a_type == A_FLOAT) && (atom_getfloatarg(j, argc, argv) != 0)) + for (i=0; i < x->sizeX; i++) + row[i] += x->matrix[i][j] * atom_getfloatarg(j, argc, argv); + + for (i=0; i < x->sizeX; i++){ + SETFLOAT(&(std_out[0]),i); + SETFLOAT(&(std_out[1]),row[i]); + outlet_anything(x->main_outlet, gensym("mixElements"), 2, std_out); + } } void mtx_preset_copyRow(t_mtx_preset *x, t_float row1, t_float row2) @@ -320,16 +371,24 @@ void mtx_preset_setup(void) { class_addmethod(mtx_preset_class, (t_method)mtx_preset_element, gensym("element"),A_FLOAT, A_FLOAT, A_FLOAT, 0); // put 1 element // element posX posY value class_addmethod(mtx_preset_class, (t_method)mtx_preset_getMatrix, gensym("getMatrix"), 0); // get matrix (matrix sizeX sizeY value) - class_addmethod(mtx_preset_class, (t_method)mtx_preset_getRow, gensym("getRow"), A_GIMME, 0); // get row + + class_addmethod(mtx_preset_class, (t_method)mtx_preset_getRows, gensym("getRows"), 0); // get row // getRow -> dump all row (row now_number row values) + class_addmethod(mtx_preset_class, (t_method)mtx_preset_getRow, gensym("getRow"), A_FLOAT, 0); // get row // getRow row_number -> dump 1 row (values) // row_number can be float : row will be interpolated - class_addmethod(mtx_preset_class, (t_method)mtx_preset_getElement,gensym("getElement"), A_GIMME, 0); // get element - // get posX posY -> dump 1 element + class_addmethod(mtx_preset_class, (t_method)mtx_preset_getElementss,gensym("getElementss"), 0); // get elements + + class_addmethod(mtx_preset_class, (t_method)mtx_preset_getElements,gensym("getElements"), A_FLOAT, 0); // get elements // get posX -> dump elements from 1 row // row_number can be float : row will be interpolated - class_addmethod(mtx_preset_class, (t_method)mtx_preset_mixRow, gensym("mixRow"), A_GIMME, 0); // interpol between all row + class_addmethod(mtx_preset_class, (t_method)mtx_preset_getElement,gensym("getElement"), A_FLOAT, A_FLOAT, 0); // get element + // get posX posY -> dump 1 element + // row_number can be float : row will be interpolated + class_addmethod(mtx_preset_class, (t_method)mtx_preset_mixRows, gensym("mixRows"), A_GIMME, 0); // interpol between all row // mixRow value0 value1 value2 : (value0*row0 + value1*row1 + value2*row2) + class_addmethod(mtx_preset_class, (t_method)mtx_preset_mixElements,gensym("mixElements"), A_GIMME, 0); // interpol between all row + // mixELments value0 value1 value2 : (value0*row0 + value1*row1 + value2*row2) class_addmethod(mtx_preset_class, (t_method)mtx_preset_copyRow, gensym("copyRow"), A_FLOAT, A_FLOAT, 0); // copy row 1 to row 2 class_addmethod(mtx_preset_class, (t_method)mtx_preset_resize, gensym("resize"),A_FLOAT, A_FLOAT, 0); // resize matrix } -- cgit v1.2.1