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.
23 #if ENABLE_EXPERIMENTAL
29 #include <jack/jack.h>
31 #include <calf/giface.h>
32 #include <calf/modules_synths.h>
36 using namespace calf_plugins
;
38 wavetable_voice::wavetable_voice()
43 void wavetable_voice::set_params_ptr(wavetable_audio_module
*_parent
, int _srate
)
46 params
= parent
->params
;
50 void wavetable_voice::reset()
55 void wavetable_voice::note_on(int note
, int vel
)
58 velocity
= vel
/ 127.0;
60 for (int i
= 0; i
< OscCount
; i
++) {
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
);
71 void wavetable_voice::note_off(int vel
)
73 for (int i
= 0; i
< EnvCount
; i
++)
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
);
95 for (int j
= 0; j
< EnvCount
; j
++) {
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
++)
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
++) {
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())
120 /////////////////////////////////////////////////////////////////////////////////////////////////////
122 static inline float sincl(float x
, float clip
)
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
)
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
++)
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()
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];
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;
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;
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;
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;
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
;