From 420ada2dde4af8d71bc1d9c6988311961cf47f1b Mon Sep 17 00:00:00 2001 From: daniel aschauer Date: Fri, 9 Jan 2009 17:23:55 +0000 Subject: svn path=/trunk/externals/algocomp/; revision=10494 --- gauss_tilde.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100755 gauss_tilde.c (limited to 'gauss_tilde.c') diff --git a/gauss_tilde.c b/gauss_tilde.c new file mode 100755 index 0000000..b04b61a --- /dev/null +++ b/gauss_tilde.c @@ -0,0 +1,65 @@ +#include "m_pd.h" + + +#define fran() (t_float)rand()/(t_float)RAND_MAX + +static char *version = "gauss v0.1, generates a Gaussian distributed random variable\n" + " with mean 'mu' and standard deviation 'sigma',\n" + " written by Olaf Matthes "; + +/* -------------------------- rand_gauss ------------------------------ */ + +static t_class *gauss_tilde_class; + +typedef struct _gauss_tilde +{ + t_object x_obj; + t_float x_sigma; + t_float x_mu; +} t_gauss_tilde; + + + +t_int *gauss_tilde_perform(t_int *w) +{ + t_gauss_tilde *x = (t_gauss_tilde *)(w[1]); + t_sample *out = (t_sample *)(w[2]); + int n = (int)(w[3]); + t_float u, halfN = 6.0, sum = 0, scale; + t_int k, N = 12; + scale = 1/sqrt(N/12); + while (n--){ + sum = 0; + for(k = 1; k <= N; k++) + sum += fran(); + *out++ = x->x_sigma*scale*(sum-halfN)+x->x_mu; + } + return (w+4); +} + +void gauss_tilde_dsp(t_gauss_tilde *x, t_signal **sp) +{ +dsp_add(gauss_tilde_perform, 3, x, +sp[0]->s_vec, +sp[0]->s_n); +} + + +void *gauss_tilde_new(t_floatarg fs, t_floatarg fm) +{ + t_gauss_tilde *x = (t_gauss_tilde *)pd_new(gauss_tilde_class); + + floatinlet_new(&x->x_obj, &x->x_sigma); + floatinlet_new(&x->x_obj, &x->x_mu); + outlet_new(&x->x_obj, &s_signal); + x->x_sigma = fs; + x->x_mu = fm; + return (x); +} + + + + + + + -- cgit v1.2.1