aboutsummaryrefslogtreecommitdiff
path: root/cyclone/sickle/pink.c
diff options
context:
space:
mode:
Diffstat (limited to 'cyclone/sickle/pink.c')
-rw-r--r--cyclone/sickle/pink.c100
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);
+}