From 4c1375daa8fcfb5c7c1d291df30027c78937f4df Mon Sep 17 00:00:00 2001 From: musil Date: Thu, 11 Dec 2008 19:52:38 +0000 Subject: speedlim for anything svn path=/trunk/externals/iemlib/; revision=10448 --- iemlib2/aspeedlim-help.pd | 47 ++++++++++++++++ iemlib2/speedlim-help.pd | 66 +++++++++++----------- iemlib2/src/aspeedlim.c | 140 ++++++++++++++++++++++++++++++++++++++++++++++ iemlib2/src/iemlib2.c | 8 ++- iemlib2/src/speedlim.c | 3 +- 5 files changed, 228 insertions(+), 36 deletions(-) create mode 100644 iemlib2/aspeedlim-help.pd create mode 100644 iemlib2/src/aspeedlim.c (limited to 'iemlib2') diff --git a/iemlib2/aspeedlim-help.pd b/iemlib2/aspeedlim-help.pd new file mode 100644 index 0000000..cf2300a --- /dev/null +++ b/iemlib2/aspeedlim-help.pd @@ -0,0 +1,47 @@ +#N canvas 465 200 609 471 10; +#X msg 204 251 1000; +#X msg 207 273 200; +#X floatatom 116 149 4 0 0 0 - - -; +#X obj 178 384 timer; +#X msg 210 294 20; +#X text 197 317 1.arg: lock-time in ms; +#X obj 77 375 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 +-1; +#X text 348 392 IEM KUG; +#X text 328 380 musil; +#X text 362 380 @; +#X text 370 380 iem.at; +#X text 331 402 Graz \, Austria; +#X text 6 6 aspeedlim : speedlimit for anything-message; +#X obj 104 318 aspeedlim 20; +#X msg 116 169 do_this 11 22 33 \$1 abc xyz; +#X obj 77 355 t b; +#X text 283 369 (c) Thomas Musil 2000 - 2008; +#X msg 138 200 a b c d e f g h i j k l m n o p; +#X obj 24 33 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1 +-1; +#X msg 63 79 symbol jfk; +#X obj 105 408 print out; +#X obj 178 408 print time; +#X obj 178 359 t b b; +#X msg 41 54 3.14159; +#X floatatom 93 103 4 0 0 0 - - -; +#X msg 93 123 \$1 91 92 93 94 95; +#X connect 0 0 13 1; +#X connect 1 0 13 1; +#X connect 2 0 14 0; +#X connect 3 0 21 0; +#X connect 4 0 13 1; +#X connect 13 0 15 0; +#X connect 13 0 20 0; +#X connect 13 0 22 0; +#X connect 14 0 13 0; +#X connect 15 0 6 0; +#X connect 17 0 13 0; +#X connect 18 0 13 0; +#X connect 19 0 13 0; +#X connect 22 0 3 0; +#X connect 22 1 3 1; +#X connect 23 0 13 0; +#X connect 24 0 25 0; +#X connect 25 0 13 0; diff --git a/iemlib2/speedlim-help.pd b/iemlib2/speedlim-help.pd index ff35286..2da9164 100644 --- a/iemlib2/speedlim-help.pd +++ b/iemlib2/speedlim-help.pd @@ -1,33 +1,33 @@ -#N canvas 465 200 400 313 10; -#X msg 173 43 1000; -#X msg 176 65 200; -#X floatatom 67 86 4 0 0 0 - - -; -#X floatatom 46 152 4 0 0 0 - - -; -#X obj 95 150 t f b b; -#X obj 117 174 timer; -#X obj 95 200 pack 0 0; -#X obj 95 225 print; -#X msg 179 86 20; -#X obj 67 115 speedlim 20; -#X text 6 7 speedlim : speedlimit for float-message; -#X text 153 115 1.arg: lock-time in ms; -#X obj 46 171 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 --1; -#X text 235 248 IEM KUG; -#X text 219 236 musil; -#X text 249 236 @; -#X text 255 236 iem.at; -#X text 170 225 (c) Thomas Musil 2000 - 2005; -#X text 218 258 Graz \, Austria; -#X connect 0 0 9 1; -#X connect 1 0 9 1; -#X connect 2 0 9 0; -#X connect 3 0 12 0; -#X connect 4 0 6 0; -#X connect 4 1 5 0; -#X connect 4 2 5 1; -#X connect 5 0 6 1; -#X connect 6 0 7 0; -#X connect 8 0 9 1; -#X connect 9 0 3 0; -#X connect 9 0 4 0; +#N canvas 465 200 404 317 10; +#X msg 173 43 1000; +#X msg 176 65 200; +#X floatatom 67 86 4 0 0 0 - - -; +#X floatatom 46 152 4 0 0 0 - - -; +#X obj 95 150 t f b b; +#X obj 117 174 timer; +#X obj 95 200 pack 0 0; +#X obj 95 225 print; +#X msg 179 86 20; +#X obj 67 115 speedlim 20; +#X text 6 7 speedlim : speedlimit for float-message; +#X text 153 115 1.arg: lock-time in ms; +#X obj 46 171 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 +-1; +#X text 235 248 IEM KUG; +#X text 219 236 musil; +#X text 249 236 @; +#X text 255 236 iem.at; +#X text 170 225 (c) Thomas Musil 2000 - 2005; +#X text 218 258 Graz \, Austria; +#X connect 0 0 9 1; +#X connect 1 0 9 1; +#X connect 2 0 9 0; +#X connect 3 0 12 0; +#X connect 4 0 6 0; +#X connect 4 1 5 0; +#X connect 4 2 5 1; +#X connect 5 0 6 1; +#X connect 6 0 7 0; +#X connect 8 0 9 1; +#X connect 9 0 3 0; +#X connect 9 0 4 0; diff --git a/iemlib2/src/aspeedlim.c b/iemlib2/src/aspeedlim.c new file mode 100644 index 0000000..9262b8e --- /dev/null +++ b/iemlib2/src/aspeedlim.c @@ -0,0 +1,140 @@ +/* For information on usage and redistribution, and for a DISCLAIMER OF ALL +* WARRANTIES, see the file, "LICENSE.txt," in this distribution. + +iemlib2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2008 */ + + +#include "m_pd.h" +#include "iemlib.h" + +/* ------------------------ aspeedlim --------------------------- */ +/* -- reduces the flow of anything-messages to one message per -- */ +/* -------------------- time interval in ms --------------------- */ + +struct _aspeedlim_proxy; + +static t_class *aspeedlim_class; +static t_class *aspeedlim_proxy_class; + +typedef struct _aspeedlim +{ + t_object x_obj; + struct _aspeedlim_proxy *x_proxy_inlet; + t_clock *x_clock; + float x_delay; + int x_output_is_locked; + int x_there_was_n_event; + int x_size; + int x_ac; + t_atom *x_at; + t_symbol *x_selector_sym; +} t_aspeedlim; + +typedef struct _aspeedlim_proxy +{ + t_object p_obj; + t_aspeedlim *p_owner; +} t_aspeedlim_proxy; + +static void aspeedlim_atcopy(t_atom *src, t_atom *dst, int n) +{ + while(n--) + *dst++ = *src++; +} + +static void aspeedlim_proxy_stop(t_aspeedlim_proxy *p) +{ + t_aspeedlim *x = p->p_owner; + + x->x_output_is_locked = 0; + x->x_there_was_n_event = 0; + clock_unset(x->x_clock); +} + +static void aspeedlim_proxy_delay(t_aspeedlim_proxy *p, t_floatarg delay) +{ + t_aspeedlim *x = p->p_owner; + + if(delay < 0.0) + delay = 0.0; + x->x_delay = delay; +} + +static void aspeedlim_tick(t_aspeedlim *x) +{ + if(x->x_there_was_n_event) + { + x->x_output_is_locked = 1; + x->x_there_was_n_event = 0; + outlet_anything(x->x_obj.ob_outlet, x->x_selector_sym, x->x_ac, x->x_at); + clock_delay(x->x_clock, x->x_delay); + } + else + { + x->x_output_is_locked = 0; + x->x_there_was_n_event = 0; + } +} + +static void aspeedlim_anything(t_aspeedlim *x, t_symbol *s, int ac, t_atom *av) +{ + if(ac > x->x_size) + { + x->x_at = (t_atom *)resizebytes(x->x_at, x->x_size*sizeof(t_atom), (10 + ac)*sizeof(t_atom)); + x->x_size = 10 + ac; + } + x->x_ac = ac; + x->x_selector_sym = s; + aspeedlim_atcopy(av, x->x_at, ac); + if(!x->x_output_is_locked) + { + x->x_output_is_locked = 1; + x->x_there_was_n_event = 0; + outlet_anything(x->x_obj.ob_outlet, x->x_selector_sym, x->x_ac, x->x_at); + clock_delay(x->x_clock, x->x_delay); + } + else + x->x_there_was_n_event = 1; +} + +static void aspeedlim_free(t_aspeedlim *x) +{ + clock_free(x->x_clock); + if(x->x_at) + freebytes(x->x_at, x->x_size * sizeof(t_atom)); + if(x->x_proxy_inlet) + pd_free((t_pd *)x->x_proxy_inlet); +} + +static void *aspeedlim_new(t_floatarg delay) +{ + t_aspeedlim *x = (t_aspeedlim *)pd_new(aspeedlim_class); + t_aspeedlim_proxy *p = (t_aspeedlim_proxy *)pd_new(aspeedlim_proxy_class); + + x->x_proxy_inlet = p; + p->p_owner = x; + x->x_size = 10; + x->x_at = (t_atom *)getbytes(x->x_size * sizeof(t_atom)); + x->x_ac = 0; + x->x_selector_sym = &s_bang; + if(delay < 0.0) + delay = 0.0; + x->x_delay = delay; + x->x_output_is_locked = 0; + x->x_there_was_n_event = 0; + x->x_clock = clock_new(x, (t_method)aspeedlim_tick); + inlet_new((t_object *)x, (t_pd *)p, 0, 0); + outlet_new(&x->x_obj, &s_list); + return (x); +} + +void aspeedlim_setup(void) +{ + aspeedlim_class = class_new(gensym("aspeedlim"), (t_newmethod)aspeedlim_new, + (t_method)aspeedlim_free, sizeof(t_aspeedlim), 0, A_DEFFLOAT, 0); + class_addanything(aspeedlim_class, aspeedlim_anything); + + aspeedlim_proxy_class = class_new(gensym("_aspeedlim_proxy"), 0, 0, sizeof(t_aspeedlim_proxy), CLASS_PD | CLASS_NOINLET, 0); + class_addmethod(aspeedlim_proxy_class, (t_method)aspeedlim_proxy_stop, gensym("stop"), 0); + class_addfloat(aspeedlim_proxy_class, (t_method)aspeedlim_proxy_delay); +} diff --git a/iemlib2/src/iemlib2.c b/iemlib2/src/iemlib2.c index e398045..dc80cf6 100644 --- a/iemlib2/src/iemlib2.c +++ b/iemlib2/src/iemlib2.c @@ -17,11 +17,13 @@ static void *iemlib2_new(void) } void add2_comma_setup(void); +void aspeedlim_setup(void); void bpe_setup(void); void dollarg_setup(void); void exp_inc_setup(void); void fade_tilde_setup(void); void float24_setup(void); +void iem_alisttosym_setup(void); void iem_anything_setup(void); void iem_append_setup(void); void iem_blocksize_tilde_setup(void); @@ -33,6 +35,7 @@ void iem_route_setup(void); void iem_samplerate_tilde_setup(void); void iem_sel_any_setup(void); void iem_send_setup(void); +void iem_symtoalist_setup(void); void init_setup(void); void LFO_noise_tilde_setup(void); void list2send_setup(void); @@ -61,11 +64,13 @@ void iemlib2_setup(void) iemlib2_class = class_new(gensym("iemlib2"), iemlib2_new, 0, sizeof(t_object), CLASS_NOINLET, 0); add2_comma_setup(); + aspeedlim_setup(); bpe_setup(); dollarg_setup(); exp_inc_setup(); fade_tilde_setup(); float24_setup(); + iem_alisttosym_setup(); iem_anything_setup(); iem_append_setup(); iem_blocksize_tilde_setup(); @@ -77,6 +82,7 @@ void iemlib2_setup(void) iem_samplerate_tilde_setup(); iem_sel_any_setup(); iem_send_setup(); + iem_symtoalist_setup(); init_setup(); LFO_noise_tilde_setup(); list2send_setup(); @@ -98,6 +104,6 @@ void iemlib2_setup(void) unsymbol_setup(); wrap_setup(); - post("iemlib2 (R-1.17) library loaded! (c) Thomas Musil 11.2006"); + post("iemlib2 (R-1.17) library loaded! (c) Thomas Musil 11.2008"); post(" musil%ciem.at iem KUG Graz Austria", '@'); } diff --git a/iemlib2/src/speedlim.c b/iemlib2/src/speedlim.c index 2328ffa..801acfe 100644 --- a/iemlib2/src/speedlim.c +++ b/iemlib2/src/speedlim.c @@ -1,7 +1,7 @@ /* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. -iemlib2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */ +iemlib2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2008 */ #include "m_pd.h" @@ -21,7 +21,6 @@ typedef struct _speedlim int x_output_is_locked; int x_there_was_n_event; t_float x_curval; - t_float x_lastout; } t_speedlim; static void speedlim_stop(t_speedlim *x) -- cgit v1.2.1