aboutsummaryrefslogtreecommitdiff
path: root/src/masse.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/masse.c')
-rwxr-xr-xsrc/masse.c44
1 files changed, 37 insertions, 7 deletions
diff --git a/src/masse.c b/src/masse.c
index 8241854..fccee2b 100755
--- a/src/masse.c
+++ b/src/masse.c
@@ -9,12 +9,36 @@ typedef struct _masse {
t_float force, masse, dX;
t_float minX, maxX;
t_outlet *position_new, *vitesse_out, *force_out;
- t_symbol *x_sym; // receive
-} t_masse;
+ t_symbol *x_sym; // receive
+ unsigned int x_state; // random
+ t_float x_f; // random
-extern t_float max(t_float, t_float);
-extern t_float min(t_float, t_float);
+} t_masse;
+
+static int makeseed(void)
+{
+ static unsigned int random_nextseed = 1489853723;
+ random_nextseed = random_nextseed * 435898247 + 938284287;
+ return (random_nextseed & 0x7fffffff);
+}
+
+static float random_bang(t_masse *x)
+{
+ int nval;
+ int range = 2000000;
+ float rnd;
+ unsigned int randval = x->x_state;
+ x->x_state = randval = randval * 472940017 + 832416023;
+ nval = ((double)range) * ((double)randval)
+ * (1./4294967296.);
+ if (nval >= range) nval = range-1;
+ rnd=nval;
+
+ rnd-=1000000;
+ rnd=rnd/1000000.; //pour mettre entre -1 et 1;
+ return (rnd);
+}
void masse_minX(t_masse *x, t_floatarg f1)
{
@@ -52,7 +76,10 @@ void masse_bang(t_masse *x)
x->pos_old_2 = x->pos_old_1;
x->pos_old_1 = pos_new;
- x->force = 0;
+// x->force = 0;
+
+ x->force = random_bang(x)*1e-25; // avoiding denormal problem by adding low amplitude noise
+
x->dX = 0;
}
@@ -70,6 +97,7 @@ void masse_reset(t_masse *x)
void masse_resetF(t_masse *x)
{
x->force=0;
+
}
void masse_dX(t_masse *x, t_float posX)
@@ -79,7 +107,7 @@ void masse_dX(t_masse *x, t_float posX)
void masse_setX(t_masse *x, t_float posX)
{
- x->pos_old_2 = posX; // clear hystory for stability (instability) problem
+ x->pos_old_2 = posX; // clear history for stability (instability) problem
x->pos_old_1 = posX;
x->force=0;
@@ -124,7 +152,9 @@ void *masse_new(t_symbol *s, t_floatarg M, t_floatarg X)
x->minX = -100000;
x->maxX = 100000;
- if (x->masse<=0) x->masse=1;
+ if (x->masse<=0) x->masse=1;
+
+ makeseed();
return (void *)x;
}