aboutsummaryrefslogtreecommitdiff
path: root/nusmuk-utils/mtx_preset.c
diff options
context:
space:
mode:
Diffstat (limited to 'nusmuk-utils/mtx_preset.c')
-rw-r--r--nusmuk-utils/mtx_preset.c169
1 files changed, 114 insertions, 55 deletions
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; j<min(argc, x->sizeY); 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; j<min(argc, x->sizeY); 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
}