aboutsummaryrefslogtreecommitdiff
path: root/steady.c
diff options
context:
space:
mode:
authorHans-Christoph Steiner <eighthave@users.sourceforge.net>2010-08-19 05:04:28 +0000
committerHans-Christoph Steiner <eighthave@users.sourceforge.net>2010-08-19 05:04:28 +0000
commit79096fd626b946efd6947fa94ab15d30bf003ba0 (patch)
tree9a10305d0ade28bb3f5139c37ab8fa76f4e603d4 /steady.c
parent633eaa4b2350c00ddc1b338c357096a441944784 (diff)
converted to new library template and debianized
svn path=/trunk/externals/ekext/; revision=13835
Diffstat (limited to 'steady.c')
-rw-r--r--steady.c80
1 files changed, 80 insertions, 0 deletions
diff --git a/steady.c b/steady.c
new file mode 100644
index 0000000..b438895
--- /dev/null
+++ b/steady.c
@@ -0,0 +1,80 @@
+#include "m_pd.h"
+#include <math.h>
+
+typedef struct _steady
+{
+ t_object x_obj;
+ t_float f_min;
+ t_float f_max;
+ t_float f_prev;
+ t_int resetflag;
+ t_float f_in, f_maxjump;
+ t_outlet *max, *min, *smooth;
+} t_steady;
+
+t_class *steady_class;
+
+void steady_float (t_steady *x, t_floatarg fin)
+{
+ if (x->resetflag == 0)
+ {
+ x->f_max = fin > x->f_max ? fin : x->f_max;
+ x->f_min = fin < x->f_min ? fin : x->f_min;
+ outlet_float(x->smooth, fin);
+ outlet_float(x->min, x->f_min);
+ outlet_float(x->max, x->f_max);
+ x->f_prev = fin;
+ x->resetflag=1;
+ }
+ else
+ {
+ float min = fin >= x->f_prev ? x->f_prev : fin;
+ float max = fin <= x->f_prev ? x->f_prev : fin;
+ fin = (max - min) > x->f_maxjump ? x->f_prev : fin;
+ x->f_max = fin > x->f_max ? fin : x->f_max;
+ x->f_min = fin < x->f_min ? fin : x->f_min;
+ float sm_fin = fabs(fin - x->f_prev) > x->f_maxjump ? x->f_prev : fin;
+ outlet_float(x->smooth, sm_fin);
+ outlet_float(x->min, x->f_min);
+ outlet_float(x->max, x->f_max);
+ x->f_prev = fin;
+ }
+}
+
+void steady_bang (t_steady *x)
+{
+ outlet_float(x->min, x->f_min);
+ outlet_float(x->max, x->f_max);
+ x->f_min = 1e08;
+ x->f_max = -1e08;
+ x->resetflag=0;
+}
+
+void *steady_new(t_floatarg f)
+{
+ t_steady *x = (t_steady *)pd_new(steady_class);
+ x->f_min = 1e08;
+ x->f_max = -1e08;
+ x->f_maxjump = f;
+ x->resetflag = 0;
+ x->f_prev = 0;
+ floatinlet_new(&x->x_obj, &x->f_maxjump);
+ x->max = outlet_new(&x->x_obj, gensym("float"));
+ x->min = outlet_new(&x->x_obj, gensym("float"));
+ x->smooth = outlet_new(&x->x_obj, gensym("float"));
+ return (void *)x;
+}
+
+void steady_setup(void) {
+ steady_class = class_new(gensym("steady"),
+ (t_newmethod)steady_new,
+ 0, sizeof(t_steady),
+ 0, A_DEFFLOAT, 0);
+ post("|+++++++++++++++++>steady<------------------|");
+ post("|+>max, min and through must not jump more<-|");
+ post("|+++++++++>than a specified amount<---------|");
+ post("|+++>edward<------->kelly<++++++++>2005<----|");
+
+ class_addbang(steady_class, steady_bang);
+ class_addfloat(steady_class, steady_float);
+}