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., 51 Franklin Street, Fifth Floor,
19
* Boston, MA 02110-1301 USA
24
#if ENABLE_EXPERIMENTAL
26
#include <calf/giface.h>
27
#include <calf/modules_synths.h>
31
using namespace calf_plugins;
33
wavetable_voice::wavetable_voice()
38
void wavetable_voice::set_params_ptr(wavetable_audio_module *_parent, int _srate)
41
params = parent->params;
45
void wavetable_voice::reset()
50
void wavetable_voice::note_on(int note, int vel)
52
typedef wavetable_metadata md;
54
velocity = vel / 127.0;
56
for (int i = 0; i < OscCount; i++) {
58
oscs[i].set_freq(note_to_hz(note, 0), sample_rate);
61
int cr = sample_rate / BlockSize;
62
for (int i = 0; i < EnvCount; i++) {
63
envs[i].set(0.01, 0.1, 0.5, 1, cr);
66
float modsrc[wavetable_metadata::modsrc_count] = { 1, velocity, parent->inertia_pressure.get_last(), parent->modwheel_value, envs[0].value, envs[1].value, envs[2].value};
67
parent->calculate_modmatrix(moddest, md::moddest_count, modsrc);
70
float oscshift[2] = { moddest[md::moddest_o1shift], moddest[md::moddest_o2shift] };
71
memcpy(last_oscshift, oscshift, sizeof(oscshift));
72
memcpy(last_oscamp, cur_oscamp, sizeof(cur_oscamp));
75
void wavetable_voice::note_off(int vel)
77
for (int i = 0; i < EnvCount; i++)
81
void wavetable_voice::steal()
85
void wavetable_voice::render_block()
87
typedef wavetable_metadata md;
89
const float step = 1.f / BlockSize;
93
int espc = md::par_eg2attack - md::par_eg1attack;
94
for (int j = 0; j < EnvCount; j++) {
96
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);
97
scl[j] = dsp::lerp(1.f, velocity, *params[md::par_eg1velscl + o]);;
100
for (int i = 0; i < EnvCount; i++)
103
float modsrc[wavetable_metadata::modsrc_count] = { 1, velocity, parent->inertia_pressure.get_last(), parent->modwheel_value, envs[0].value, envs[1].value, envs[2].value};
104
parent->calculate_modmatrix(moddest, md::moddest_count, modsrc);
105
calc_derived_dests();
107
int ospc = md::par_o2level - md::par_o1level;
108
for (int j = 0; j < OscCount; j++) {
109
oscs[j].tables = parent->tables[(int)*params[md::par_o1wave + j * ospc]];
110
oscs[j].set_freq(note_to_hz(note, *params[md::par_o1transpose + j * ospc] * 100+ *params[md::par_o1detune + j * ospc] + moddest[md::moddest_o1detune]), sample_rate);
113
float oscshift[2] = { moddest[md::moddest_o1shift], moddest[md::moddest_o2shift] };
114
float osstep[2] = { (oscshift[0] - last_oscshift[0]) * step, (oscshift[1] - last_oscshift[1]) * step };
115
float oastep[2] = { (cur_oscamp[0] - last_oscamp[0]) * step, (cur_oscamp[1] - last_oscamp[1]) * step };
116
for (int i = 0; i < BlockSize; i++) {
119
for (int j = 0; j < OscCount; j++) {
120
float o = last_oscshift[j] * 0.01;
121
value += last_oscamp[j] * oscs[j].get(dsp::clip(fastf2i_drm((o + *params[md::par_o1offset + j * ospc]) * 127.0 * 256), 0, 127 * 256));
122
last_oscshift[j] += osstep[j];
123
last_oscamp[j] += oastep[j];
126
output_buffer[i][0] = output_buffer[i][1] = value;
128
if (envs[0].stopped())
130
memcpy(last_oscshift, oscshift, sizeof(oscshift));
131
memcpy(last_oscamp, cur_oscamp, sizeof(cur_oscamp));
134
/////////////////////////////////////////////////////////////////////////////////////////////////////
136
static inline float sincl(float x, float clip)
140
return sin(M_PI * x);
143
static inline float blip(float x, float center, float range)
145
if (x < center - range || x > center + range)
147
return 1 - fabs(x - center)/range;
150
static void interpolate_wt(int16_t table[129][256], int step)
152
for (int i = 0; i < 128; i++)
156
int prev = i - i % step;
157
int next = prev + step;
158
for (int j = 0; j < 256; j++)
160
table[i][j] = table[prev][j] + (i - prev) * (table[next][j] - table[prev][j]) / step;
165
wavetable_audio_module::wavetable_audio_module()
166
: mod_matrix_impl(mod_matrix_data, &mm_metadata)
168
, inertia_pitchbend(1)
169
, inertia_pressure(64)
173
for (int i = 0; i < 129; i += 8)
175
for (int j = 0; j < 256; j++)
177
float ph = j * 2 * M_PI / 256;
178
int harm = 1 + 2 * (i / 8);
179
float ii = i / 128.0;
180
float rezo1 = sin(harm * ph) * sin(ph);
181
float rezo2 = sin((harm+1) * ph) * sin(ph * 2);
182
float rezo3 = sin((harm+3) * ph) * sin(ph * 4);
183
float rezo = (rezo1 + rezo2 + rezo3) / 3;
184
float v = (sin (ph) + ii * ii * rezo) / 2;
185
tables[0][i][j] = 32767 * v;
188
interpolate_wt(tables[0], 8);
189
for (int i = 0; i < 129; i += 4)
191
for (int j = 0; j < 256; j++)
193
float ph = j * 2 * M_PI / 256;
194
int harm = 1 + (i / 4);
195
float ii = i / 128.0;
196
float h = sin(harm * ph);
197
float rezo1 = h * sin(ph);
198
float rezo2 = h * sin(ph * 2)/2;
199
float rezo3 = h * sin(ph * 3)/3;
200
float rezo4 = h * sin(ph * 4)/4;
201
float rezo5 = h * sin(ph * 5)/5;
202
float rezo = (rezo1 + rezo2 + rezo3 + rezo4 + rezo5) / 3;
203
float v = sin (ph + ii * rezo);
204
tables[1][i][j] = 32767 * v;
207
interpolate_wt(tables[1], 4);
208
for (int i = 0; i < 129; i++)
210
for (int j = 0; j < 256; j++)
212
float ph = j * 2 * M_PI / 256;
213
float ii = (i & ~3) / 128.0;
214
float ii2 = ((i & ~3) + 4) / 128.0;
215
float peak = (32 * ii);
216
float rezo1 = sin(floor(peak) * ph);
217
float rezo2 = sin(floor(peak + 1) * ph);
218
float widener = (0.5 + 0.3 * sin(ph) + 0.2 * sin (3 * ph));
219
float v1 = 0.5 * sin (ph) + 0.5 * ii * ii * rezo1 * widener;
220
float v2 = 0.5 * sin (ph) + 0.5 * ii2 * ii2 * rezo2 * widener;
221
tables[wavetable_metadata::wt_rezo][i][j] = 32767 * lerp(v1, v2, (i & 3) / 4.0);
224
for (int i = 0; i < 129; i++)
226
for (int j = 0; j < 256; j++)
228
float ph = j * 2 * M_PI / 256;
229
float ii = i / 128.0;
230
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;
231
tables[wavetable_metadata::wt_metal][i][j] = 32767 * v;
234
for (int i = 0; i < 129; i++)
236
for (int j = 0; j < 256; j++)
238
float ph = j * 2 * M_PI / 256;
239
float ii = i / 128.0;
240
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;
241
tables[wavetable_metadata::wt_bell][i][j] = 32767 * v;
244
for (int i = 0; i < 129; i++)
246
for (int j = 0; j < 256; j++)
248
float ph = j * 2 * M_PI / 256;
249
float ii = i / 128.0;
250
//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;
251
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;
252
tables[wavetable_metadata::wt_blah][i][j] = 32767 * v;
255
for (int i = 0; i < 256; i++)
257
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;
259
for (int i = 127; i >= 0; i--)
261
int16_t *parent = tables[wavetable_metadata::wt_pluck][i + 1];
263
for (int j = 0; j < 256; j++)
265
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];
268
for (int i = 0; i < 129; i++)
270
for (int j = 0; j < 256; j++)
272
float ph = j / 128.0 - 1.0;
273
float ii = i / 128.0;
274
float v = sincl(ph * (1 + 15 * ii), 1);
275
tables[wavetable_metadata::wt_stretch][i][j] = 32767 * v;
278
for (int i = 0; i < 129; i++)
280
for (int j = 0; j < 256; j++)
282
float ph = j / 128.0 - 1.0;
283
float ii = i / 128.0;
284
float v = sincl(ph * (1 + 15 * ii), 4) * sincl(j / 256.0, 1);
285
tables[wavetable_metadata::wt_stretch2][i][j] = 32000 * v;
288
for (int i = 0; i < 129; i++)
290
for (int j = 0; j < 256; j++)
292
float ph = j / 128.0 - 1.0;
293
float ii = i / 128.0;
294
float w = sincl(ph * (1 + 15 * ii), 4);
295
float v = pow(w, 9) * sincl(j / 256.0, 1);
296
tables[wavetable_metadata::wt_hardsync][i][j] = 32000 * v;
299
for (int i = 0; i < 129; i++)
301
for (int j = 0; j < 256; j++)
303
float ph = j / 128.0 - 1.0;
304
float ii = i / 128.0;
305
float w = sincl(ph * (1 + 31 * ii), 3);
306
float v = pow(w, 5) * sincl(j / 256.0, 1);
307
tables[wavetable_metadata::wt_hardsync2][i][j] = 32000 * v;
310
for (int i = 0; i < 129; i++)
312
for (int j = 0; j < 256; j++)
314
float ph = j / 128.0 - 1.0;
315
float ii = i / 128.0;
316
float w = sincl(ph * ph * (1 + 15 * ii), 2);
317
float v = pow(w, 4) * sincl(j / 256.0, 1);
318
tables[wavetable_metadata::wt_softsync][i][j] = 32000 * v;
321
for (int i = 0; i < 129; i++)
323
for (int j = 0; j < 256; j++)
325
float ph = j * 2 * M_PI / 256;
326
float ii = i / 128.0;
327
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;
328
tables[wavetable_metadata::wt_bell2][i][j] = 32767 * v;
331
for (int i = 0; i < 129; i++)
333
for (int j = 0; j < 256; j++)
335
float ph = j * 2 * M_PI / 256;
336
float ii = i / 128.0;
337
float v = (sin(ph) + ii * sin(ph - 3 * ii * sin(ph)) + ii * ii * ii * sin(9 * ph - ii * ii * sin(11 * ph))) / 3;
338
tables[wavetable_metadata::wt_bell3][i][j] = 32767 * v;
341
for (int i = 0; i < 129; i++)
343
for (int j = 0; j < 256; j++)
345
float ph = j * 2 * M_PI / 256;
346
float ii = i / 128.0;
347
float v = (sin(ph + ii * sin(ph - 3 * ii * sin(ph) + ii * ii * ii * sin(5 * ph - ii * ii * sin(7 * ph)))));
348
tables[wavetable_metadata::wt_tine][i][j] = 32767 * v;
351
for (int i = 0; i < 129; i++)
353
for (int j = 0; j < 256; j++)
355
float ph = j * 2 * M_PI / 256;
356
float ii = i / 128.0;
357
float v = (sin(ph + ii * sin(ph - 2 * ii * sin(ph) + ii * ii * ii * sin(3 * ph - ii * ii * sin(4 * ph)))));
358
tables[wavetable_metadata::wt_tine2][i][j] = 32767 * v;
361
for (int i = 0; i < 129; i++)
363
for (int j = 0; j < 256; j++)
365
float ph = j * 2 * M_PI / 256;
366
float ph2 = j / 128.0 - 1;
367
float ii = i / 128.0;
368
float w = sincl(ph2 * (1 + 7 * ii * ii), 4) * pow(sincl(j / 256.0, 1), 2);
369
float v = sin(ph + ii * sin(ph - 2 * ii * w));
370
tables[wavetable_metadata::wt_clav][i][j] = 32767 * v;
373
for (int i = 0; i < 129; i++)
375
for (int j = 0; j < 256; j++)
377
float ph = j * 2 * M_PI / 256;
378
float ph2 = j / 128.0 - 1;
379
float ii = i / 128.0;
380
float w = sincl(ph2 * (1 + 7 * ii * ii), 6) * sincl(j / 256.0, 1);
381
float v = sin(ph + ii * sin(3 * ph - 2 * ii * w));
382
tables[wavetable_metadata::wt_clav2][i][j] = 32767 * v;
386
for (int i = 0; i < 129; i++)
388
for (int j = 0; j < 256; j++)
390
float ph = j * 2 * M_PI / 256;
391
float ph2 = j / 128.0 - 1;
392
float ii = i / 128.0;
393
float w = sincl(ph2 * (1 + 7 * ii * ii), 6) * pow(sincl(j / 256.0, 1), 1);
394
float v = sin(ph + ii * ii * ii * sin(3 * ph - ii * ii * ii * w));
395
tables[wavetable_metadata::wt_gtr][i][j] = 32767 * v;
399
for (int i = 0; i < 129; i++)
401
for (int j = 0; j < 256; j++)
403
float ph = j * 2 * M_PI / 256;
404
float ii = i / 128.0;
406
float w = pow(sincl(j / 256.0, 1), 1);
407
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))));
408
tables[wavetable_metadata::wt_gtr][i][j] = 32767 * v;
411
for (int i = 0; i < 129; i++)
413
for (int j = 0; j < 256; j++)
415
float ph = j * 2 * M_PI / 256;
416
float ii = i / 128.0;
417
float ii2 = dsp::clip(ii - 0.5, 0.0, 1.0);
418
float w = pow(sincl(j / 256.0, 1), 1);
419
float v = sin(ph + ii * ii * ii * sin(3 * ph - ii * ii * ii * w * sin(ph + sin(3 * ph + ii2 * sin(13 * ph)))));
420
tables[wavetable_metadata::wt_gtr2][i][j] = 32767 * v;
423
for (int i = 0; i < 129; i++)
425
for (int j = 0; j < 256; j++)
427
float ph = j * 2 * M_PI / 256;
428
float ii = i / 128.0;
429
float ii2 = dsp::clip(2 * (ii - 0.5), 0.0, 1.0);
430
//float w = sincl(ph2 * (1 + 15 * ii2 * ii2), 4) * pow(sincl(j / 256.0, 1), 1);
431
float w = pow(sincl(j / 256.0, 1), 1);
432
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))))));
433
tables[wavetable_metadata::wt_gtr3][i][j] = 32767 * v;
436
for (int i = 0; i < 129; i++)
438
for (int j = 0; j < 256; j++)
440
float ph = j * 2 * M_PI / 256;
441
float ii = i / 128.0;
442
float ii2 = dsp::clip(2 * (ii - 0.5), 0.0, 1.0);
443
//float w = sincl(ph2 * (1 + 15 * ii2 * ii2), 4) * pow(sincl(j / 256.0, 1), 1);
444
float w = pow(sincl(j / 256.0, 1), 1);
445
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))))));
446
tables[wavetable_metadata::wt_gtr4][i][j] = 32767 * v;
449
for (int i = 0; i < 129; i++)
451
for (int j = 0; j < 256; j++)
453
float ph = j * 2 * M_PI / 256;
454
float ii = i / 128.0;
455
float ii2 = dsp::clip((ii - 0.25)/0.75, 0.0, 1.0);
456
//float w = sincl(ph2 * (1 + 15 * ii2 * ii2), 4) * pow(sincl(j / 256.0, 1), 1);
457
float w = pow(sincl(j / 256.0, 1), 3);
458
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))))));
459
tables[wavetable_metadata::wt_gtr5][i][j] = 32767 * v;
462
for (int i = 0; i < 129; i++)
464
for (int j = 0; j < 256; j++)
466
float ph = j * 2 * M_PI / 256;
467
float ii = i / 128.0;
468
float w = pow(sincl(2 * (j / 256.0), 2), 3);
469
float v = sin(ph + (ii + 0.05) * sin(7 * ph - 2 * ii * w * sin(11 * ph)));
470
tables[wavetable_metadata::wt_reed][i][j] = 32767 * v;
473
for (int i = 0; i < 129; i++)
475
for (int j = 0; j < 256; j++)
477
float ph = j * 2 * M_PI / 256;
478
float ii = i / 128.0;
479
float ii2 = dsp::clip((ii - 0.25)/0.75, 0.0, 1.0);
480
float ii3 = dsp::clip((ii - 0.5)/0.5, 0.0, 1.0);
481
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)));
482
tables[wavetable_metadata::wt_reed2][i][j] = 32767 * v;
485
for (int i = 0; i < 129; i++)
487
for (int j = 0; j < 256; j++)
489
float ph = j * 2 * M_PI / 256;
490
float ii = i / 128.0;
492
for (int k = 0; k < 13; k++)
494
mod += blip(i, k * 10, 30) * sin (ph * (5 + 3 * k) + ii * cos(ph * (2 + 2 * k)));
496
float v = sin(ph + ii * mod);
497
tables[wavetable_metadata::wt_silver][i][j] = 32767 * v;
500
for (int i = 0; i < 129; i++)
502
for (int j = 0; j < 256; j++)
504
float ph = j * 2 * M_PI / 256;
505
float ii = i / 128.0;
507
for (int k = 0; k < 16; k++)
509
mod += 2 * blip(i, k * 8, k * 4 + 10) * cos (ph * (k + 1));
511
float v = sin(ph + ii * mod);
512
tables[wavetable_metadata::wt_brass][i][j] = 32767 * v;
515
for (int i = 0; i < 129; i++)
517
for (int j = 0; j < 256; j++)
519
float ph = j * 2 * M_PI / 256;
520
float ii = i / 128.0;
522
for (int k = 0; k < 16; k++)
524
mod += 2 * blip(i, k * 8, 16) * cos (ph * (2 * k + 1));
526
float v = (sin(ph + ii * mod) + ii * sin(2 * ph + ii * mod)) / 2;
527
tables[wavetable_metadata::wt_multi][i][j] = 32767 * v;
530
for (int i = 0; i < 129; i ++)
532
float h = 1 + i / 16.0;
533
for (int j = 0; j < 256; j++)
535
float ph = j * 2 * M_PI / 256;
536
float v = sin(ph), tv = 1;
537
for (int k = 1; k < 24; k++) {
538
float amp = blip(i, k * 6, 20) / k;
539
v += amp * sin((k + 1) * ph + h * sin(ph));
542
tables[wavetable_metadata::wt_multi2][i][j] = 32767 * v / tv;
547
void wavetable_audio_module::channel_pressure(int /*channel*/, int value)
549
inertia_pressure.set_inertia(value * (1.0 / 127.0));