1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
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);
}
|