diff options
author | N.N. <krzyszcz@users.sourceforge.net> | 2003-08-14 14:32:00 +0000 |
---|---|---|
committer | N.N. <krzyszcz@users.sourceforge.net> | 2003-08-14 14:32:00 +0000 |
commit | a0f8c026117d1bbe094894d614136efea4b65c97 (patch) | |
tree | 26fe6a8efad5dddc42a5986084606fddbf1e057a /cyclone/sickle/pink.c | |
parent | 053845e60bc1f6143e7c50aa10069a18405c2161 (diff) |
10 new sickle classes
svn path=/trunk/externals/miXed/; revision=846
Diffstat (limited to 'cyclone/sickle/pink.c')
-rw-r--r-- | cyclone/sickle/pink.c | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/cyclone/sickle/pink.c b/cyclone/sickle/pink.c new file mode 100644 index 0000000..0ba71b2 --- /dev/null +++ b/cyclone/sickle/pink.c @@ -0,0 +1,100 @@ +/* Copyright (c) 2003 krzYszcz, and others. + * For information on usage and redistribution, and for a DISCLAIMER OF ALL + * WARRANTIES, see the file, "LICENSE.txt," in this distribution. */ + +/* Filter: Paul Kellet's from music-dsp. This is the most popular one, + used in jMax, Csound, etc. LATER compare to McCartney's (sc). + Rng: noise~ code from d_osc.c. */ + +#include "m_pd.h" +#include "common/loud.h" +#include "sickle/sic.h" + +/* more like 0.085 in c74's */ +#define PINK_GAIN .105 + +typedef struct _pink +{ + t_sic x_sic; + int x_state; + float x_b0; + float x_b1; + float x_b2; + float x_b3; + float x_b4; + float x_b5; + float x_b6; +} t_pink; + +static t_class *pink_class; + +static void pink_float(t_pink *x, t_float f) +{ + loud_nomethod((t_pd *)x, &s_float); /* LATER rethink */ +} + +static t_int *pink_perform(t_int *w) +{ + t_pink *x = (t_pink *)(w[1]); + int nblock = (int)(w[2]); + t_float *out = (t_float *)(w[3]); + int state = x->x_state; + float b0 = x->x_b0; + float b1 = x->x_b1; + float b2 = x->x_b2; + float b3 = x->x_b3; + float b4 = x->x_b4; + float b5 = x->x_b5; + float b6 = x->x_b6; + while (nblock--) + { + float white = ((float)((state & 0x7fffffff) - 0x40000000)) * + (float)(1.0 / 0x40000000); + state = state * 435898247 + 382842987; + b0 = 0.99886 * b0 + white * 0.0555179; + b1 = 0.99332 * b1 + white * 0.0750759; + b2 = 0.96900 * b2 + white * 0.1538520; + b3 = 0.86650 * b3 + white * 0.3104856; + b4 = 0.55000 * b4 + white * 0.5329522; + b5 = -0.7616 * b5 - white * 0.0168980; + *out++ = (b0 + b1 + b2 + b3 + b4 + b5 + b6 + white * 0.5362) + * PINK_GAIN; + b6 = white * 0.115926; + } + x->x_state = state; + x->x_b0 = b0; + x->x_b1 = b1; + x->x_b2 = b2; + x->x_b3 = b3; + x->x_b4 = b4; + x->x_b5 = b5; + x->x_b6 = b6; + return (w + 4); +} + +static void pink_dsp(t_pink *x, t_signal **sp) +{ + dsp_add(pink_perform, 3, x, sp[1]->s_n, sp[1]->s_vec); +} + +static void *pink_new(void) +{ + t_pink *x = (t_pink *)pd_new(pink_class); + /* borrowed from d_osc.c, LATER rethink */ + static int init = 307; + x->x_state = (init *= 1319); + /* all coefs set to zero */ + outlet_new((t_object *)x, &s_signal); + return (x); +} + +void pink_tilde_setup(void) +{ + pink_class = class_new(gensym("pink~"), + (t_newmethod)pink_new, 0, + sizeof(t_pink), 0, 0); + /* dummy float method: we need signal in (for begin~), but neither + float-to-signal conversion, nor a float method (the only control + input is 'enable'). LATER rethink. */ + sic_setup(pink_class, pink_dsp, pink_float); +} |