diff options
Diffstat (limited to 'apps/plugins/pdbox/PDa/intern/tabosc4~.c')
-rw-r--r-- | apps/plugins/pdbox/PDa/intern/tabosc4~.c | 264 |
1 files changed, 264 insertions, 0 deletions
diff --git a/apps/plugins/pdbox/PDa/intern/tabosc4~.c b/apps/plugins/pdbox/PDa/intern/tabosc4~.c new file mode 100644 index 0000000000..ec8ed84f31 --- /dev/null +++ b/apps/plugins/pdbox/PDa/intern/tabosc4~.c | |||
@@ -0,0 +1,264 @@ | |||
1 | |||
2 | #include <m_pd.h> | ||
3 | #include <m_fixed.h> | ||
4 | |||
5 | static t_class *tabosc4_tilde_class; | ||
6 | |||
7 | typedef struct _tabosc4_tilde | ||
8 | { | ||
9 | t_object x_obj; | ||
10 | int x_fnpoints; | ||
11 | int x_lognpoints; | ||
12 | t_sample *x_vec; | ||
13 | t_symbol *x_arrayname; | ||
14 | t_sample x_f; | ||
15 | unsigned int x_phase; | ||
16 | t_sample x_conv; | ||
17 | } t_tabosc4_tilde; | ||
18 | |||
19 | static void *tabosc4_tilde_new(t_symbol *s) | ||
20 | { | ||
21 | t_tabosc4_tilde *x = (t_tabosc4_tilde *)pd_new(tabosc4_tilde_class); | ||
22 | x->x_arrayname = s; | ||
23 | x->x_vec = 0; | ||
24 | x->x_fnpoints = 512; | ||
25 | outlet_new(&x->x_obj, gensym("signal")); | ||
26 | inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("ft1")); | ||
27 | x->x_f = 0; | ||
28 | post("new done"); | ||
29 | return (x); | ||
30 | } | ||
31 | |||
32 | static t_int *tabosc4_tilde_perform(t_int *w) | ||
33 | { | ||
34 | t_tabosc4_tilde *x = (t_tabosc4_tilde *)(w[1]); | ||
35 | t_sample *in = (t_sample *)(w[2]); | ||
36 | t_sample *out = (t_sample *)(w[3]); | ||
37 | int n = (int)(w[4]); | ||
38 | t_sample *tab = x->x_vec; | ||
39 | unsigned int phase = x->x_phase; | ||
40 | int conv = x->x_conv; | ||
41 | int off; | ||
42 | int frac; | ||
43 | int logp = x->x_lognpoints; | ||
44 | |||
45 | if (!tab) goto zero; | ||
46 | |||
47 | while (n--) { | ||
48 | t_sample f2; | ||
49 | phase+= mult(conv ,(*in++)); | ||
50 | phase &= (itofix(1) -1); | ||
51 | off = fixtoi((long long)phase<<logp); | ||
52 | |||
53 | #ifdef NO_INTERPOLATION | ||
54 | *out = *(tab+off); | ||
55 | #else | ||
56 | frac = phase & ((1<<logp)-1); | ||
57 | frac <<= (fix1-logp); | ||
58 | |||
59 | f2 = (off == x->x_fnpoints) ? | ||
60 | mult(*(tab),frac) : | ||
61 | mult(*(tab + off + 1),frac); | ||
62 | |||
63 | *out = mult(*(tab + off),(itofix(1) - frac)) + f2; | ||
64 | #endif | ||
65 | out++; | ||
66 | } | ||
67 | x->x_phase = phase; | ||
68 | |||
69 | return (w+5); | ||
70 | |||
71 | zero: | ||
72 | while (n--) *out++ = 0; | ||
73 | |||
74 | return (w+5); | ||
75 | } | ||
76 | |||
77 | void tabosc4_tilde_set(t_tabosc4_tilde *x, t_symbol *s) | ||
78 | { | ||
79 | t_garray *a; | ||
80 | int npoints, pointsinarray; | ||
81 | x->x_arrayname = s; | ||
82 | |||
83 | if (!(a = (t_garray *)pd_findbyclass(x->x_arrayname, garray_class))) | ||
84 | { | ||
85 | if (*s->s_name) | ||
86 | pd_error(x, "tabosc4~: %s: no such array", x->x_arrayname->s_name); | ||
87 | x->x_vec = 0; | ||
88 | } | ||
89 | else if (!garray_getfloatarray(a, &pointsinarray, &x->x_vec)) | ||
90 | { | ||
91 | pd_error(x, "%s: bad template for tabosc4~", x->x_arrayname->s_name); | ||
92 | x->x_vec = 0; | ||
93 | } | ||
94 | else | ||
95 | { | ||
96 | int i; | ||
97 | x->x_fnpoints = pointsinarray; | ||
98 | x->x_lognpoints = ilog2(pointsinarray); | ||
99 | post("tabosc~: using %d (log %d) points of array",x->x_fnpoints,x->x_lognpoints); | ||
100 | |||
101 | garray_usedindsp(a); | ||
102 | } | ||
103 | } | ||
104 | |||
105 | static void tabosc4_tilde_ft1(t_tabosc4_tilde *x, t_float f) | ||
106 | { | ||
107 | x->x_phase = f; | ||
108 | } | ||
109 | |||
110 | static void tabosc4_tilde_dsp(t_tabosc4_tilde *x, t_signal **sp) | ||
111 | { | ||
112 | x->x_conv = ftofix(1000.)/sp[0]->s_sr; | ||
113 | x->x_conv = mult(x->x_conv + 500,ftofix(0.001)); | ||
114 | |||
115 | tabosc4_tilde_set(x, x->x_arrayname); | ||
116 | dsp_add(tabosc4_tilde_perform, 4, x, | ||
117 | sp[0]->s_vec, sp[1]->s_vec, sp[0]->s_n); | ||
118 | } | ||
119 | |||
120 | void tabosc4_tilde_setup(void) | ||
121 | { | ||
122 | tabosc4_tilde_class = class_new(gensym("tabosc4~"), | ||
123 | (t_newmethod)tabosc4_tilde_new, 0, | ||
124 | sizeof(t_tabosc4_tilde), 0, A_DEFSYM, 0); | ||
125 | CLASS_MAINSIGNALIN(tabosc4_tilde_class, t_tabosc4_tilde, x_f); | ||
126 | class_addmethod(tabosc4_tilde_class, (t_method)tabosc4_tilde_dsp, | ||
127 | gensym("dsp"), 0); | ||
128 | class_addmethod(tabosc4_tilde_class, (t_method)tabosc4_tilde_set, | ||
129 | gensym("set"), A_SYMBOL, 0); | ||
130 | class_addmethod(tabosc4_tilde_class, (t_method)tabosc4_tilde_ft1, | ||
131 | gensym("ft1"), A_FLOAT, 0); | ||
132 | } | ||
133 | |||
134 | #include <m_pd.h> | ||
135 | #include <m_fixed.h> | ||
136 | |||
137 | static t_class *tabosc4_tilde_class; | ||
138 | |||
139 | typedef struct _tabosc4_tilde | ||
140 | { | ||
141 | t_object x_obj; | ||
142 | int x_fnpoints; | ||
143 | int x_lognpoints; | ||
144 | t_sample *x_vec; | ||
145 | t_symbol *x_arrayname; | ||
146 | t_sample x_f; | ||
147 | unsigned int x_phase; | ||
148 | t_sample x_conv; | ||
149 | } t_tabosc4_tilde; | ||
150 | |||
151 | static void *tabosc4_tilde_new(t_symbol *s) | ||
152 | { | ||
153 | t_tabosc4_tilde *x = (t_tabosc4_tilde *)pd_new(tabosc4_tilde_class); | ||
154 | x->x_arrayname = s; | ||
155 | x->x_vec = 0; | ||
156 | x->x_fnpoints = 512; | ||
157 | outlet_new(&x->x_obj, gensym("signal")); | ||
158 | inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("ft1")); | ||
159 | x->x_f = 0; | ||
160 | post("new done"); | ||
161 | return (x); | ||
162 | } | ||
163 | |||
164 | static t_int *tabosc4_tilde_perform(t_int *w) | ||
165 | { | ||
166 | t_tabosc4_tilde *x = (t_tabosc4_tilde *)(w[1]); | ||
167 | t_sample *in = (t_sample *)(w[2]); | ||
168 | t_sample *out = (t_sample *)(w[3]); | ||
169 | int n = (int)(w[4]); | ||
170 | t_sample *tab = x->x_vec; | ||
171 | unsigned int phase = x->x_phase; | ||
172 | int conv = x->x_conv; | ||
173 | int off; | ||
174 | int frac; | ||
175 | int logp = x->x_lognpoints; | ||
176 | |||
177 | if (!tab) goto zero; | ||
178 | |||
179 | while (n--) { | ||
180 | t_sample f2; | ||
181 | phase+= mult(conv ,(*in++)); | ||
182 | phase &= (itofix(1) -1); | ||
183 | off = fixtoi((long long)phase<<logp); | ||
184 | |||
185 | #ifdef NO_INTERPOLATION | ||
186 | *out = *(tab+off); | ||
187 | #else | ||
188 | frac = phase & ((1<<logp)-1); | ||
189 | frac <<= (fix1-logp); | ||
190 | |||
191 | f2 = (off == x->x_fnpoints) ? | ||
192 | mult(*(tab),frac) : | ||
193 | mult(*(tab + off + 1),frac); | ||
194 | |||
195 | *out = mult(*(tab + off),(itofix(1) - frac)) + f2; | ||
196 | #endif | ||
197 | out++; | ||
198 | } | ||
199 | x->x_phase = phase; | ||
200 | |||
201 | return (w+5); | ||
202 | |||
203 | zero: | ||
204 | while (n--) *out++ = 0; | ||
205 | |||
206 | return (w+5); | ||
207 | } | ||
208 | |||
209 | void tabosc4_tilde_set(t_tabosc4_tilde *x, t_symbol *s) | ||
210 | { | ||
211 | t_garray *a; | ||
212 | int npoints, pointsinarray; | ||
213 | x->x_arrayname = s; | ||
214 | |||
215 | if (!(a = (t_garray *)pd_findbyclass(x->x_arrayname, garray_class))) | ||
216 | { | ||
217 | if (*s->s_name) | ||
218 | pd_error(x, "tabosc4~: %s: no such array", x->x_arrayname->s_name); | ||
219 | x->x_vec = 0; | ||
220 | } | ||
221 | else if (!garray_getfloatarray(a, &pointsinarray, &x->x_vec)) | ||
222 | { | ||
223 | pd_error(x, "%s: bad template for tabosc4~", x->x_arrayname->s_name); | ||
224 | x->x_vec = 0; | ||
225 | } | ||
226 | else | ||
227 | { | ||
228 | int i; | ||
229 | x->x_fnpoints = pointsinarray; | ||
230 | x->x_lognpoints = ilog2(pointsinarray); | ||
231 | post("tabosc~: using %d (log %d) points of array",x->x_fnpoints,x->x_lognpoints); | ||
232 | |||
233 | garray_usedindsp(a); | ||
234 | } | ||
235 | } | ||
236 | |||
237 | static void tabosc4_tilde_ft1(t_tabosc4_tilde *x, t_float f) | ||
238 | { | ||
239 | x->x_phase = f; | ||
240 | } | ||
241 | |||
242 | static void tabosc4_tilde_dsp(t_tabosc4_tilde *x, t_signal **sp) | ||
243 | { | ||
244 | x->x_conv = ftofix(1000.)/sp[0]->s_sr; | ||
245 | x->x_conv = mult(x->x_conv + 500,ftofix(0.001)); | ||
246 | |||
247 | tabosc4_tilde_set(x, x->x_arrayname); | ||
248 | dsp_add(tabosc4_tilde_perform, 4, x, | ||
249 | sp[0]->s_vec, sp[1]->s_vec, sp[0]->s_n); | ||
250 | } | ||
251 | |||
252 | void tabosc4_tilde_setup(void) | ||
253 | { | ||
254 | tabosc4_tilde_class = class_new(gensym("tabosc4~"), | ||
255 | (t_newmethod)tabosc4_tilde_new, 0, | ||
256 | sizeof(t_tabosc4_tilde), 0, A_DEFSYM, 0); | ||
257 | CLASS_MAINSIGNALIN(tabosc4_tilde_class, t_tabosc4_tilde, x_f); | ||
258 | class_addmethod(tabosc4_tilde_class, (t_method)tabosc4_tilde_dsp, | ||
259 | gensym("dsp"), 0); | ||
260 | class_addmethod(tabosc4_tilde_class, (t_method)tabosc4_tilde_set, | ||
261 | gensym("set"), A_SYMBOL, 0); | ||
262 | class_addmethod(tabosc4_tilde_class, (t_method)tabosc4_tilde_ft1, | ||
263 | gensym("ft1"), A_FLOAT, 0); | ||
264 | } | ||