diff options
author | Ed Kelly <edkelly@users.sourceforge.net> | 2005-12-01 11:22:08 +0000 |
---|---|---|
committer | Ed Kelly <edkelly@users.sourceforge.net> | 2005-12-01 11:22:08 +0000 |
commit | 08596048cf2b13cfba6d7fabe5ad5604875d9a45 (patch) | |
tree | ad228864bcce3220f169366d40849aeb11722f4f /externals/build/src/steady.c | |
parent | beff9cda2230f9e51c49b54566e98e90d5f5a81b (diff) |
This commit was generated by cvs2svn to compensate for changes in r4096,
which included commits to RCS files with non-trunk default branches.
svn path=/trunk/; revision=4097
Diffstat (limited to 'externals/build/src/steady.c')
-rw-r--r-- | externals/build/src/steady.c | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/externals/build/src/steady.c b/externals/build/src/steady.c new file mode 100644 index 00000000..c79ac4ef --- /dev/null +++ b/externals/build/src/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_sethelpsymbol(steady_class, gensym("help-steady")); + class_addbang(steady_class, steady_bang); + class_addfloat(steady_class, steady_float); +} |