+ GUI: remove more unused control pointers
[calf.git] / src / wavetable.cpp
blob98b94f93dc40ecab314d72f0820927ff1353dc1f
1 /* Calf DSP Library
2 * Example audio modules - wavetable synthesizer
4 * Copyright (C) 2009 Krzysztof Foltman
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General
17 * Public License along with this program; if not, write to the
18 * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
19 * Boston, MA 02111-1307, USA.
21 #include <config.h>
23 #if ENABLE_EXPERIMENTAL
25 #include <assert.h>
26 #include <memory.h>
27 #include <complex>
28 #if USE_JACK
29 #include <jack/jack.h>
30 #endif
31 #include <calf/giface.h>
32 #include <calf/modules_synths.h>
33 #include <iostream>
35 using namespace dsp;
36 using namespace calf_plugins;
38 wavetable_voice::wavetable_voice()
40 sample_rate = -1;
43 void wavetable_voice::set_params_ptr(wavetable_audio_module *_parent, int _srate)
45 parent = _parent;
46 params = parent->params;
47 sample_rate = _srate;
50 void wavetable_voice::reset()
52 note = -1;
55 void wavetable_voice::note_on(int note, int vel)
57 this->note = note;
58 velocity = vel / 127.0;
59 amp.set(1.0);
60 for (int i = 0; i < OscCount; i++) {
61 oscs[i].reset();
62 oscs[i].set_freq(note_to_hz(note, 0), sample_rate);
64 int cr = sample_rate / BlockSize;
65 for (int i = 0; i < EnvCount; i++) {
66 envs[i].set(0.01, 0.1, 0.5, 1, cr);
67 envs[i].note_on();
71 void wavetable_voice::note_off(int vel)
73 for (int i = 0; i < EnvCount; i++)
74 envs[i].note_off();
77 void wavetable_voice::steal()
81 void wavetable_voice::render_block()
83 typedef wavetable_metadata md;
85 const float step = 1.f / BlockSize;
87 int ospc = md::par_o2level - md::par_o1level;
88 int espc = md::par_eg2attack - md::par_eg1attack;
89 for (int j = 0; j < OscCount; j++) {
90 oscs[j].tables = parent->tables[(int)*params[md::par_o1wave + j * ospc]];
91 oscs[j].set_freq(note_to_hz(note, *params[md::par_o1transpose + j * ospc] * 100+ *params[md::par_o1detune + j * ospc]), sample_rate);
93 float s = 0.001;
94 float scl[EnvCount];
95 for (int j = 0; j < EnvCount; j++) {
96 int o = j*espc;
97 envs[j].set(*params[md::par_eg1attack + o] * s, *params[md::par_eg1decay + o] * s, *params[md::par_eg1sustain + o], *params[md::par_eg1release + o] * s, sample_rate / BlockSize, *params[md::par_eg1fade + o] * s);
98 scl[j] = dsp::lerp(1.f, velocity, *params[md::par_eg1velscl + o]);;
101 for (int i = 0; i < EnvCount; i++)
102 envs[i].advance();
104 float env_old = envs[0].old_value * scl[0] + 0.2 * envs[1].old_value * scl[1];
105 float env_new = envs[0].value * scl[0] + 0.2 * envs[1].value * scl[1];
106 for (int i = 0; i < BlockSize; i++) {
107 float value = 0.f;
109 float env = dsp::lerp(env_old, env_new, i * step);
110 for (int j = 0; j < OscCount; j++) {
111 value += oscs[j].get(dsp::clip(fastf2i_drm((env + *params[md::par_o1offset + j * ospc]) * 127.0 * 256), 0, 127 * 256)) * *params[md::par_o1level + j * ospc];
114 output_buffer[i][0] = output_buffer[i][1] = value * env * env;
116 if (envs[0].stopped())
117 released = true;
120 /////////////////////////////////////////////////////////////////////////////////////////////////////
122 static inline float sincl(float x, float clip)
124 if (fabs(x) > clip)
125 return 0;
126 return sin(M_PI * x);
129 static inline float blip(float x, float center, float range)
131 if (x < center - range || x > center + range)
132 return 0;
133 return 1 - fabs(x - center)/range;
136 static void interpolate_wt(int16_t table[129][256], int step)
138 for (int i = 0; i < 128; i++)
140 if (!(i % step))
141 continue;
142 int prev = i - i % step;
143 int next = prev + step;
144 for (int j = 0; j < 256; j++)
146 table[i][j] = table[prev][j] + (i - prev) * (table[next][j] - table[prev][j]) / step;
151 wavetable_audio_module::wavetable_audio_module()
153 panic_flag = false;
154 for (int i = 0; i < 129; i += 8)
156 for (int j = 0; j < 256; j++)
158 float ph = j * 2 * M_PI / 256;
159 int harm = 1 + 2 * (i / 8);
160 float ii = i / 128.0;
161 float rezo1 = sin(harm * ph) * sin(ph);
162 float rezo2 = sin((harm+1) * ph) * sin(ph * 2);
163 float rezo3 = sin((harm+3) * ph) * sin(ph * 4);
164 float rezo = (rezo1 + rezo2 + rezo3) / 3;
165 float v = (sin (ph) + ii * ii * rezo) / 2;
166 tables[0][i][j] = 32767 * v;
169 interpolate_wt(tables[0], 8);
170 for (int i = 0; i < 129; i += 4)
172 for (int j = 0; j < 256; j++)
174 float ph = j * 2 * M_PI / 256;
175 int harm = 1 + (i / 4);
176 float ii = i / 128.0;
177 float h = sin(harm * ph);
178 float rezo1 = h * sin(ph);
179 float rezo2 = h * sin(ph * 2)/2;
180 float rezo3 = h * sin(ph * 3)/3;
181 float rezo4 = h * sin(ph * 4)/4;
182 float rezo5 = h * sin(ph * 5)/5;
183 float rezo = (rezo1 + rezo2 + rezo3 + rezo4 + rezo5) / 3;
184 float v = sin (ph + ii * rezo);
185 tables[1][i][j] = 32767 * v;
188 interpolate_wt(tables[1], 4);
189 for (int i = 0; i < 129; i++)
191 for (int j = 0; j < 256; j++)
193 float ph = j * 2 * M_PI / 256;
194 float ii = (i & ~3) / 128.0;
195 float ii2 = ((i & ~3) + 4) / 128.0;
196 float peak = (32 * ii);
197 float rezo1 = sin(floor(peak) * ph);
198 float rezo2 = sin(floor(peak + 1) * ph);
199 float widener = (0.5 + 0.3 * sin(ph) + 0.2 * sin (3 * ph));
200 float v1 = 0.5 * sin (ph) + 0.5 * ii * ii * rezo1 * widener;
201 float v2 = 0.5 * sin (ph) + 0.5 * ii2 * ii2 * rezo2 * widener;
202 tables[wavetable_metadata::wt_rezo][i][j] = 32767 * lerp(v1, v2, (i & 3) / 4.0);
205 for (int i = 0; i < 129; i++)
207 for (int j = 0; j < 256; j++)
209 float ph = j * 2 * M_PI / 256;
210 float ii = i / 128.0;
211 float v = (sin(ph) + ii * sin(ph + 2 * ii * sin(ph)) + ii * ii * sin(ph + 6 * ii * ii * sin(6 * ph)) + ii * ii * ii * ii * sin(ph + 11 * ii * ii * ii * ii * sin(11 * ph))) / 4;
212 tables[wavetable_metadata::wt_metal][i][j] = 32767 * v;
215 for (int i = 0; i < 129; i++)
217 for (int j = 0; j < 256; j++)
219 float ph = j * 2 * M_PI / 256;
220 float ii = i / 128.0;
221 float v = (sin(ph) + ii * sin(ph - 3 * ii * sin(ph)) + ii * ii * sin(5 * ph - 5 * ii * ii * ii * ii * sin(11 * ph))) / 3;
222 tables[wavetable_metadata::wt_bell][i][j] = 32767 * v;
225 for (int i = 0; i < 129; i++)
227 for (int j = 0; j < 256; j++)
229 float ph = j * 2 * M_PI / 256;
230 float ii = i / 128.0;
231 //float v = (sin(ph) + ii * sin(ph + 2 * ii * sin(ph)) + ii * ii * sin(ph + 3 * ii * ii * sin(3 * ph)) + ii * ii * ii * sin(ph + 5 * ii * ii * ii * sin(5 * ph))) / 4;
232 float v = (sin(ph) + sin(ph - 3 * sin(ii * 5 - 2) * sin(ph)) + sin(ii * 4 - 1.3) * sin(5 * ph + 3 * ii * ii * sin(6 * ph))) / 3;
233 tables[wavetable_metadata::wt_blah][i][j] = 32767 * v;
236 for (int i = 0; i < 256; i++)
238 tables[wavetable_metadata::wt_pluck][128][i] = (i < 128) ? 32000 * fabs(sin(i / 32.0 * M_PI) * sin(i / 13.0 * M_PI) * sin(i / 19.0 * M_PI)) : 0;
240 for (int i = 127; i >= 0; i--)
242 int16_t *parent = tables[wavetable_metadata::wt_pluck][i + 1];
243 float damp = 0.05;
244 for (int j = 0; j < 256; j++)
246 tables[wavetable_metadata::wt_pluck][i][j] = (1 - 2*damp) * parent[j] + damp * parent[(j+1)&255] + damp * parent[(j+2)&255];// + 0.1 * parent[(j-1)&255]+ 0.1 * parent[(j-2)&255];
249 for (int i = 0; i < 129; i++)
251 for (int j = 0; j < 256; j++)
253 float ph = j / 128.0 - 1.0;
254 float ii = i / 128.0;
255 float v = sincl(ph * (1 + 15 * ii), 1);
256 tables[wavetable_metadata::wt_stretch][i][j] = 32767 * v;
259 for (int i = 0; i < 129; i++)
261 for (int j = 0; j < 256; j++)
263 float ph = j / 128.0 - 1.0;
264 float ii = i / 128.0;
265 float v = sincl(ph * (1 + 15 * ii), 4) * sincl(j / 256.0, 1);
266 tables[wavetable_metadata::wt_stretch2][i][j] = 32000 * v;
269 for (int i = 0; i < 129; i++)
271 for (int j = 0; j < 256; j++)
273 float ph = j / 128.0 - 1.0;
274 float ii = i / 128.0;
275 float w = sincl(ph * (1 + 15 * ii), 4);
276 float v = pow(w, 9) * sincl(j / 256.0, 1);
277 tables[wavetable_metadata::wt_hardsync][i][j] = 32000 * v;
280 for (int i = 0; i < 129; i++)
282 for (int j = 0; j < 256; j++)
284 float ph = j / 128.0 - 1.0;
285 float ii = i / 128.0;
286 float w = sincl(ph * (1 + 31 * ii), 3);
287 float v = pow(w, 5) * sincl(j / 256.0, 1);
288 tables[wavetable_metadata::wt_hardsync2][i][j] = 32000 * v;
291 for (int i = 0; i < 129; i++)
293 for (int j = 0; j < 256; j++)
295 float ph = j / 128.0 - 1.0;
296 float ii = i / 128.0;
297 float w = sincl(ph * ph * (1 + 15 * ii), 2);
298 float v = pow(w, 4) * sincl(j / 256.0, 1);
299 tables[wavetable_metadata::wt_softsync][i][j] = 32000 * v;
302 for (int i = 0; i < 129; i++)
304 for (int j = 0; j < 256; j++)
306 float ph = j * 2 * M_PI / 256;
307 float ii = i / 128.0;
308 float v = (sin(ph) + ii * sin(ph - 3 * ii * sin(ph)) + ii * ii * ii * sin(7 * ph - 2 * ii * ii * ii * ii * sin(13 * ph))) / 3;
309 tables[wavetable_metadata::wt_bell2][i][j] = 32767 * v;
312 for (int i = 0; i < 129; i++)
314 for (int j = 0; j < 256; j++)
316 float ph = j * 2 * M_PI / 256;
317 float ii = i / 128.0;
318 float v = (sin(ph) + ii * sin(ph - 3 * ii * sin(ph)) + ii * ii * ii * sin(9 * ph - ii * ii * sin(11 * ph))) / 3;
319 tables[wavetable_metadata::wt_bell3][i][j] = 32767 * v;
322 for (int i = 0; i < 129; i++)
324 for (int j = 0; j < 256; j++)
326 float ph = j * 2 * M_PI / 256;
327 float ii = i / 128.0;
328 float v = (sin(ph + ii * sin(ph - 3 * ii * sin(ph) + ii * ii * ii * sin(5 * ph - ii * ii * sin(7 * ph)))));
329 tables[wavetable_metadata::wt_tine][i][j] = 32767 * v;
332 for (int i = 0; i < 129; i++)
334 for (int j = 0; j < 256; j++)
336 float ph = j * 2 * M_PI / 256;
337 float ii = i / 128.0;
338 float v = (sin(ph + ii * sin(ph - 2 * ii * sin(ph) + ii * ii * ii * sin(3 * ph - ii * ii * sin(4 * ph)))));
339 tables[wavetable_metadata::wt_tine2][i][j] = 32767 * v;
342 for (int i = 0; i < 129; i++)
344 for (int j = 0; j < 256; j++)
346 float ph = j * 2 * M_PI / 256;
347 float ph2 = j / 128.0 - 1;
348 float ii = i / 128.0;
349 float w = sincl(ph2 * (1 + 7 * ii * ii), 4) * pow(sincl(j / 256.0, 1), 2);
350 float v = sin(ph + ii * sin(ph - 2 * ii * w));
351 tables[wavetable_metadata::wt_clav][i][j] = 32767 * v;
354 for (int i = 0; i < 129; i++)
356 for (int j = 0; j < 256; j++)
358 float ph = j * 2 * M_PI / 256;
359 float ph2 = j / 128.0 - 1;
360 float ii = i / 128.0;
361 float w = sincl(ph2 * (1 + 7 * ii * ii), 6) * sincl(j / 256.0, 1);
362 float v = sin(ph + ii * sin(3 * ph - 2 * ii * w));
363 tables[wavetable_metadata::wt_clav2][i][j] = 32767 * v;
367 for (int i = 0; i < 129; i++)
369 for (int j = 0; j < 256; j++)
371 float ph = j * 2 * M_PI / 256;
372 float ph2 = j / 128.0 - 1;
373 float ii = i / 128.0;
374 float w = sincl(ph2 * (1 + 7 * ii * ii), 6) * pow(sincl(j / 256.0, 1), 1);
375 float v = sin(ph + ii * ii * ii * sin(3 * ph - ii * ii * ii * w));
376 tables[wavetable_metadata::wt_gtr][i][j] = 32767 * v;
380 for (int i = 0; i < 129; i++)
382 for (int j = 0; j < 256; j++)
384 float ph = j * 2 * M_PI / 256;
385 float ii = i / 128.0;
386 float ii2 = ii;
387 float w = pow(sincl(j / 256.0, 1), 1);
388 float v = sin(ph + ii2 * ii2 * ii2 * sin(3 * ph - ii2 * ii2 * ii2 * w * sin(ph + sin(3 * ph) + ii * sin(11 * ph) + ii * ii * sin(25 * ph))));
389 tables[wavetable_metadata::wt_gtr][i][j] = 32767 * v;
392 for (int i = 0; i < 129; i++)
394 for (int j = 0; j < 256; j++)
396 float ph = j * 2 * M_PI / 256;
397 float ii = i / 128.0;
398 float ii2 = dsp::clip(ii - 0.5, 0.0, 1.0);
399 float w = pow(sincl(j / 256.0, 1), 1);
400 float v = sin(ph + ii * ii * ii * sin(3 * ph - ii * ii * ii * w * sin(ph + sin(3 * ph + ii2 * sin(13 * ph)))));
401 tables[wavetable_metadata::wt_gtr2][i][j] = 32767 * v;
404 for (int i = 0; i < 129; i++)
406 for (int j = 0; j < 256; j++)
408 float ph = j * 2 * M_PI / 256;
409 float ii = i / 128.0;
410 float ii2 = dsp::clip(2 * (ii - 0.5), 0.0, 1.0);
411 //float w = sincl(ph2 * (1 + 15 * ii2 * ii2), 4) * pow(sincl(j / 256.0, 1), 1);
412 float w = pow(sincl(j / 256.0, 1), 1);
413 float v = sin(ph + ii * sin(3 * ph - ii * w * sin(ph + sin(3 * ph + 0.5 * ii2 * sin(13 * ph + 0.5 * sin(4 * ph))))));
414 tables[wavetable_metadata::wt_gtr3][i][j] = 32767 * v;
417 for (int i = 0; i < 129; i++)
419 for (int j = 0; j < 256; j++)
421 float ph = j * 2 * M_PI / 256;
422 float ii = i / 128.0;
423 float ii2 = dsp::clip(2 * (ii - 0.5), 0.0, 1.0);
424 //float w = sincl(ph2 * (1 + 15 * ii2 * ii2), 4) * pow(sincl(j / 256.0, 1), 1);
425 float w = pow(sincl(j / 256.0, 1), 1);
426 float v = sin(ph + ii * sin(3 * ph - ii * w * sin(2 * ph + sin(5 * ph + 0.5 * ii2 * sin(13 * ph + 0.5 * sin(4 * ph))))));
427 tables[wavetable_metadata::wt_gtr4][i][j] = 32767 * v;
430 for (int i = 0; i < 129; i++)
432 for (int j = 0; j < 256; j++)
434 float ph = j * 2 * M_PI / 256;
435 float ii = i / 128.0;
436 float ii2 = dsp::clip((ii - 0.25)/0.75, 0.0, 1.0);
437 //float w = sincl(ph2 * (1 + 15 * ii2 * ii2), 4) * pow(sincl(j / 256.0, 1), 1);
438 float w = pow(sincl(j / 256.0, 1), 3);
439 float v = sin(ph + (ii + 0.05) * sin(3 * ph - 2 * ii * w * sin(5 * ph + sin(7 * ph + 0.5 * ii2 * sin(13 * ph + 0.5 * sin(11 * ph))))));
440 tables[wavetable_metadata::wt_gtr5][i][j] = 32767 * v;
443 for (int i = 0; i < 129; i++)
445 for (int j = 0; j < 256; j++)
447 float ph = j * 2 * M_PI / 256;
448 float ii = i / 128.0;
449 float w = pow(sincl(2 * (j / 256.0), 2), 3);
450 float v = sin(ph + (ii + 0.05) * sin(7 * ph - 2 * ii * w * sin(11 * ph)));
451 tables[wavetable_metadata::wt_reed][i][j] = 32767 * v;
454 for (int i = 0; i < 129; i++)
456 for (int j = 0; j < 256; j++)
458 float ph = j * 2 * M_PI / 256;
459 float ii = i / 128.0;
460 float ii2 = dsp::clip((ii - 0.25)/0.75, 0.0, 1.0);
461 float ii3 = dsp::clip((ii - 0.5)/0.5, 0.0, 1.0);
462 float v = sin(ph + (ii + 0.05) * sin(ii * sin(2 * ph) - 2 * ii2 * sin(2 * ph + ii2 * sin(3 * ph)) + 3 * ii3 * sin(3 * ph)));
463 tables[wavetable_metadata::wt_reed2][i][j] = 32767 * v;
466 for (int i = 0; i < 129; i++)
468 for (int j = 0; j < 256; j++)
470 float ph = j * 2 * M_PI / 256;
471 float ii = i / 128.0;
472 float mod = 0;
473 for (int k = 0; k < 13; k++)
475 mod += blip(i, k * 10, 30) * sin (ph * (5 + 3 * k) + ii * cos(ph * (2 + 2 * k)));
477 float v = sin(ph + ii * mod);
478 tables[wavetable_metadata::wt_silver][i][j] = 32767 * v;
481 for (int i = 0; i < 129; i++)
483 for (int j = 0; j < 256; j++)
485 float ph = j * 2 * M_PI / 256;
486 float ii = i / 128.0;
487 float mod = 0;
488 for (int k = 0; k < 16; k++)
490 mod += 2 * blip(i, k * 8, k * 4 + 10) * cos (ph * (k + 1));
492 float v = sin(ph + ii * mod);
493 tables[wavetable_metadata::wt_brass][i][j] = 32767 * v;
496 for (int i = 0; i < 129; i++)
498 for (int j = 0; j < 256; j++)
500 float ph = j * 2 * M_PI / 256;
501 float ii = i / 128.0;
502 float mod = 0;
503 for (int k = 0; k < 16; k++)
505 mod += 2 * blip(i, k * 8, 16) * cos (ph * (2 * k + 1));
507 float v = (sin(ph + ii * mod) + ii * sin(2 * ph + ii * mod)) / 2;
508 tables[wavetable_metadata::wt_multi][i][j] = 32767 * v;
513 #endif