aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormusil <tmusil@users.sourceforge.net>2011-05-06 09:52:16 +0000
committermusil <tmusil@users.sourceforge.net>2011-05-06 09:52:16 +0000
commit632d277afda8bb877250e0c9851d667c0e5a9a99 (patch)
treeb7e002c24073cf1e19dbb50125bf73b057e313c8
parent4eb1a0d38308a0f8b81f4f71f4579ecb7fb67d2c (diff)
added an increment value, now if time is 0, it counts without 0-delay-timer
svn path=/trunk/externals/iemlib/; revision=15084
-rw-r--r--iemlib1/src/for++.c187
1 files changed, 97 insertions, 90 deletions
diff --git a/iemlib1/src/for++.c b/iemlib1/src/for++.c
index 76daecc..49bf1bb 100644
--- a/iemlib1/src/for++.c
+++ b/iemlib1/src/for++.c
@@ -1,88 +1,86 @@
/* For information on usage and redistribution, and for a DISCLAIMER OF ALL
* WARRANTIES, see the file, "LICENSE.txt," in this distribution.
-iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */
+iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2011 */
#include "m_pd.h"
#include "iemlib.h"
-/* ----------------------------- for++ -------------------------------- */
-/* -- an internal timed counter (start-, stop-number and metro-time) -- */
+/* ------------------------------------ for++ -------------------------------------- */
+/* -- an optional timed counter (begin number, end number, metro time, increment) -- */
typedef struct _forpp
{
t_object x_obj;
- int x_beg;
- int x_end;
- t_float x_delay;
- int x_cur;
- int x_incr;
- void *x_out_end;
- void *x_clock;
- void *x_clock2;
+ double x_beg;
+ double x_end;
+ double x_delay;
+ double x_cur;
+ double x_incr;
+ t_outlet *x_out_counter;
+ t_outlet *x_out_end;
+ t_clock *x_clock_incr;
+ t_clock *x_clock_end;
} t_forpp;
static t_class *forpp_class;
-static void forpp_tick2(t_forpp *x)
+static void forpp_tick_end(t_forpp *x)
{
outlet_bang(x->x_out_end);
- clock_unset(x->x_clock2);
+ clock_unset(x->x_clock_end);
}
-static void forpp_tick(t_forpp *x)
+static void forpp_tick_incr(t_forpp *x)
{
- outlet_float(x->x_obj.ob_outlet, x->x_cur);
+ int stop_it=1;
+
+ outlet_float(x->x_out_counter, (t_float)x->x_cur);
x->x_cur += x->x_incr;
if(x->x_incr > 0)
{
if(x->x_cur <= x->x_end)
- clock_delay(x->x_clock, x->x_delay);
- else
- {
- clock_unset(x->x_clock);
- clock_delay(x->x_clock2, x->x_delay);
- }
+ stop_it = 0;
}
else
{
if(x->x_cur >= x->x_end)
- clock_delay(x->x_clock, x->x_delay);
- else
- {
- clock_unset(x->x_clock);
- clock_delay(x->x_clock2, x->x_delay);
- }
+ stop_it = 0;
}
+
+ if(stop_it)
+ {
+ clock_unset(x->x_clock_incr);
+ clock_delay(x->x_clock_end, x->x_delay);
+ }
+ else
+ clock_delay(x->x_clock_incr, x->x_delay);
}
static void forpp_bang(t_forpp *x)
{
- x->x_cur = x->x_beg;
- outlet_float(x->x_obj.ob_outlet, x->x_cur);
- x->x_cur += x->x_incr;
- if(x->x_incr > 0)
+ if(x->x_delay > 0.0)
{
- if(x->x_cur <= x->x_end)
- clock_delay(x->x_clock, x->x_delay);
- else
- {
- clock_unset(x->x_clock);
- clock_delay(x->x_clock2, x->x_delay);
- }
+ x->x_cur = x->x_beg;
+ forpp_tick_incr(x);
}
else
{
- if(x->x_cur >= x->x_end)
- clock_delay(x->x_clock, x->x_delay);
+ double cur=x->x_beg, end=x->x_end, incr=x->x_incr;
+
+ if(x->x_end < x->x_beg)
+ {
+ for(; cur >= end; cur += incr)
+ outlet_float(x->x_out_counter, (t_float)cur);
+ }
else
{
- clock_unset(x->x_clock);
- clock_delay(x->x_clock2, x->x_delay);
+ for(; cur <= end; cur += incr)
+ outlet_float(x->x_out_counter, (t_float)cur);
}
+ outlet_bang(x->x_out_end);
}
-
}
static void forpp_start(t_forpp *x)
@@ -92,90 +90,99 @@ static void forpp_start(t_forpp *x)
static void forpp_stop(t_forpp *x)
{
- if(x->x_incr > 0)
- x->x_cur = x->x_end + 1;
- else
- x->x_cur = x->x_end - 1;
- clock_unset(x->x_clock);
- clock_unset(x->x_clock2);
+ x->x_cur = x->x_end + x->x_incr;
+ clock_unset(x->x_clock_incr);
+ clock_unset(x->x_clock_end);
}
-static void forpp_float(t_forpp *x, t_floatarg beg)
+static void forpp_ft3(t_forpp *x, t_floatarg incr)
{
- x->x_beg = (int)beg;
if(x->x_end < x->x_beg)
- x->x_incr = -1;
+ {
+ if(incr > 0.0)
+ incr = -incr;
+ }
else
- x->x_incr = 1;
+ {
+ if(incr < 0.0)
+ incr = -incr;
+ }
+ x->x_incr = (double)incr;
+}
+
+static void forpp_ft2(t_forpp *x, t_floatarg delay)
+{
+ if(delay < 0.0)
+ delay = 0.0;
+ x->x_delay = (double)delay;
}
static void forpp_ft1(t_forpp *x, t_floatarg end)
{
- x->x_end = (int)end;
- if(x->x_end < x->x_beg)
- x->x_incr = -1;
- else
- x->x_incr = 1;
+ x->x_end = (double)end;
+ forpp_ft3(x, (t_floatarg)x->x_incr);
}
-static void forpp_ft2(t_forpp *x, t_floatarg delay)
+static void forpp_float(t_forpp *x, t_floatarg beg)
{
- if(delay < 0.0)
- delay = 0.0;
- x->x_delay = delay;
+ x->x_beg = (double)beg;
+ forpp_ft3(x, (t_floatarg)x->x_incr);
}
static void forpp_list(t_forpp *x, t_symbol *s, int argc, t_atom *argv)
{
- if(argc == 2)
- {
- forpp_float(x, atom_getfloatarg(0, argc, argv));
+ if((argc >= 4) && IS_A_FLOAT(argv, 3))
+ forpp_ft3(x, atom_getfloatarg(3, argc, argv));
+ if((argc >= 3) && IS_A_FLOAT(argv, 2))
+ forpp_ft2(x, atom_getfloatarg(2, argc, argv));
+ if((argc >= 2) && IS_A_FLOAT(argv, 1))
forpp_ft1(x, atom_getfloatarg(1, argc, argv));
- }
- else if(argc == 3)
- {
+ if((argc >= 1) && IS_A_FLOAT(argv, 0))
forpp_float(x, atom_getfloatarg(0, argc, argv));
- forpp_ft1(x, atom_getfloatarg(1, argc, argv));
- forpp_ft2(x, atom_getfloatarg(2, argc, argv));
- }
}
-static void *forpp_new(t_floatarg beg, t_floatarg end, t_floatarg delay)
+static void *forpp_new(t_symbol *s, int argc, t_atom *argv)
{
t_forpp *x = (t_forpp *)pd_new(forpp_class);
+ t_float fbeg=0.0, fend=0.0, fdelay=0.0, fincr=1.0; // default
+
+ if((argc >= 1) && IS_A_FLOAT(argv, 0))
+ fbeg = (t_float)atom_getfloatarg(0, argc, argv);
+ if((argc >= 2) && IS_A_FLOAT(argv, 1))
+ fend = (t_float)atom_getfloatarg(1, argc, argv);
+ if((argc >= 3) && IS_A_FLOAT(argv, 2))
+ fdelay = (t_float)atom_getfloatarg(2, argc, argv);
+ if((argc >= 4) && IS_A_FLOAT(argv, 3))
+ fincr = (t_float)atom_getfloatarg(3, argc, argv);
inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("ft1"));
inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("ft2"));
- outlet_new(&x->x_obj, &s_float);
+ inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("ft3"));
+ x->x_out_counter = outlet_new(&x->x_obj, &s_float);
x->x_out_end = outlet_new(&x->x_obj, &s_bang);
- x->x_clock = clock_new(x, (t_method)forpp_tick);
- x->x_clock2 = clock_new(x, (t_method)forpp_tick2);
- x->x_beg = (int)beg;
- x->x_end = (int)end;
- if(x->x_end < x->x_beg)
- x->x_incr = -1;
- else
- x->x_incr = 1;
- if(delay < 0.0)
- delay = 0.0;
- x->x_delay = delay;
+ x->x_clock_incr = clock_new(x, (t_method)forpp_tick_incr);
+ x->x_clock_end = clock_new(x, (t_method)forpp_tick_end);
+
+ x->x_beg = (double)fbeg;
+ x->x_end = (double)fend;
+ forpp_ft3(x, (t_floatarg)fincr);
+ forpp_ft2(x, (t_floatarg)fdelay);
x->x_cur = x->x_beg;
return(x);
}
static void forpp_ff(t_forpp *x)
{
- clock_free(x->x_clock);
- clock_free(x->x_clock2);
+ clock_free(x->x_clock_incr);
+ clock_free(x->x_clock_end);
}
void forpp_setup(void)
{
forpp_class = class_new(gensym("for++"), (t_newmethod)forpp_new,
(t_method)forpp_ff, sizeof(t_forpp),
- 0, A_DEFFLOAT, A_DEFFLOAT, A_DEFFLOAT, 0);
- class_addcreator((t_newmethod)forpp_new, gensym("for_pp"), A_DEFFLOAT, A_DEFFLOAT, A_DEFFLOAT, 0);
-
+ 0, A_GIMME, 0);
+ class_addcreator((t_newmethod)forpp_new, gensym("for_pp"), A_GIMME, 0);
class_addbang(forpp_class, forpp_bang);
class_addfloat(forpp_class, forpp_float);
class_addlist(forpp_class, forpp_list);
@@ -183,5 +190,5 @@ void forpp_setup(void)
class_addmethod(forpp_class, (t_method)forpp_stop, gensym("stop"), 0);
class_addmethod(forpp_class, (t_method)forpp_ft1, gensym("ft1"), A_FLOAT, 0);
class_addmethod(forpp_class, (t_method)forpp_ft2, gensym("ft2"), A_FLOAT, 0);
-// class_sethelpsymbol(forpp_class, gensym("iemhelp/help-for++"));
+ class_addmethod(forpp_class, (t_method)forpp_ft3, gensym("ft3"), A_FLOAT, 0);
}