~ubuntu-branches/ubuntu/precise/lmms/precise-updates

« back to all changes in this revision

Viewing changes to plugins/ladspa_effect/calf/src/wavetable.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Артём Попов
  • Date: 2011-02-14 20:58:36 UTC
  • mfrom: (1.1.10 upstream) (3.1.9 sid)
  • Revision ID: james.westby@ubuntu.com-20110214205836-2u41xus1d2mj8nfz
Tags: 0.4.10-1ubuntu1
* Merge from debian unstable (LP: #718801).  Remaining changes:
  - Replace build-dep on libwine-dev with wine1.2-dev to build
    against the newer Wine.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* Calf DSP Library
 
2
 * Example audio modules - wavetable synthesizer
 
3
 *
 
4
 * Copyright (C) 2009 Krzysztof Foltman
 
5
 *
 
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.
 
10
 *
 
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.
 
15
 *
 
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
 
20
 */
 
21
 
 
22
#include <config.h>
 
23
 
 
24
#if ENABLE_EXPERIMENTAL
 
25
    
 
26
#include <calf/giface.h>
 
27
#include <calf/modules_synths.h>
 
28
#include <iostream>
 
29
 
 
30
using namespace dsp;
 
31
using namespace calf_plugins;
 
32
 
 
33
wavetable_voice::wavetable_voice()
 
34
{
 
35
    sample_rate = -1;
 
36
}
 
37
 
 
38
void wavetable_voice::set_params_ptr(wavetable_audio_module *_parent, int _srate)
 
39
{
 
40
    parent = _parent;
 
41
    params = parent->params;
 
42
    sample_rate = _srate;
 
43
}
 
44
 
 
45
void wavetable_voice::reset()
 
46
{
 
47
    note = -1;
 
48
}
 
49
 
 
50
void wavetable_voice::note_on(int note, int vel)
 
51
{
 
52
    typedef wavetable_metadata md;
 
53
    this->note = note;
 
54
    velocity = vel / 127.0;
 
55
    amp.set(1.0);
 
56
    for (int i = 0; i < OscCount; i++) {
 
57
        oscs[i].reset();
 
58
        oscs[i].set_freq(note_to_hz(note, 0), sample_rate);
 
59
        last_oscshift[i] = 0;
 
60
    }
 
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);
 
64
        envs[i].note_on();
 
65
    }
 
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);
 
68
    calc_derived_dests();
 
69
 
 
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));
 
73
}
 
74
 
 
75
void wavetable_voice::note_off(int vel)
 
76
{
 
77
    for (int i = 0; i < EnvCount; i++)
 
78
        envs[i].note_off();
 
79
}
 
80
 
 
81
void wavetable_voice::steal()
 
82
{
 
83
}
 
84
 
 
85
void wavetable_voice::render_block()
 
86
{
 
87
    typedef wavetable_metadata md;
 
88
    
 
89
    const float step = 1.f / BlockSize;
 
90
 
 
91
    float s = 0.001;
 
92
    float scl[EnvCount];
 
93
    int espc = md::par_eg2attack - md::par_eg1attack;
 
94
    for (int j = 0; j < EnvCount; j++) {
 
95
        int o = j*espc;
 
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]);; 
 
98
    }
 
99
    
 
100
    for (int i = 0; i < EnvCount; i++)
 
101
        envs[i].advance();    
 
102
    
 
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();
 
106
 
 
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);
 
111
    }
 
112
        
 
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++) {        
 
117
        float value = 0.f;
 
118
 
 
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];
 
124
        }
 
125
        
 
126
        output_buffer[i][0] = output_buffer[i][1] = value;
 
127
    }
 
128
    if (envs[0].stopped())
 
129
        released = true;
 
130
    memcpy(last_oscshift, oscshift, sizeof(oscshift));
 
131
    memcpy(last_oscamp, cur_oscamp, sizeof(cur_oscamp));
 
132
}
 
133
 
 
134
/////////////////////////////////////////////////////////////////////////////////////////////////////
 
135
 
 
136
static inline float sincl(float x, float clip)
 
137
{
 
138
    if (fabs(x) > clip)
 
139
        return 0;
 
140
    return sin(M_PI * x);
 
141
}
 
142
 
 
143
static inline float blip(float x, float center, float range)
 
144
{
 
145
    if (x < center - range || x > center + range)
 
146
        return 0;
 
147
    return 1 - fabs(x - center)/range;
 
148
}
 
149
 
 
150
static void interpolate_wt(int16_t table[129][256], int step)
 
151
{
 
152
    for (int i = 0; i < 128; i++)
 
153
    {
 
154
        if (!(i % step))
 
155
            continue;
 
156
        int prev = i - i % step;
 
157
        int next = prev + step;
 
158
        for (int j = 0; j < 256; j++)
 
159
        {
 
160
            table[i][j] = table[prev][j] + (i - prev) * (table[next][j] - table[prev][j]) / step;
 
161
        }
 
162
    }
 
163
}
 
164
 
 
165
wavetable_audio_module::wavetable_audio_module()
 
166
: mod_matrix_impl(mod_matrix_data, &mm_metadata)
 
167
, inertia_cutoff(1)
 
168
, inertia_pitchbend(1)
 
169
, inertia_pressure(64)
 
170
{
 
171
    panic_flag = false;
 
172
    modwheel_value = 0.;
 
173
    for (int i = 0; i < 129; i += 8)
 
174
    {
 
175
        for (int j = 0; j < 256; j++)
 
176
        {
 
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;
 
186
        }
 
187
    }
 
188
    interpolate_wt(tables[0], 8);
 
189
    for (int i = 0; i < 129; i += 4)
 
190
    {
 
191
        for (int j = 0; j < 256; j++)
 
192
        {
 
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;
 
205
        }
 
206
    }
 
207
    interpolate_wt(tables[1], 4);
 
208
    for (int i = 0; i < 129; i++)
 
209
    {
 
210
        for (int j = 0; j < 256; j++)
 
211
        {
 
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);
 
222
        }
 
223
    }
 
224
    for (int i = 0; i < 129; i++)
 
225
    {
 
226
        for (int j = 0; j < 256; j++)
 
227
        {
 
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;
 
232
        }
 
233
    }
 
234
    for (int i = 0; i < 129; i++)
 
235
    {
 
236
        for (int j = 0; j < 256; j++)
 
237
        {
 
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;
 
242
        }
 
243
    }
 
244
    for (int i = 0; i < 129; i++)
 
245
    {
 
246
        for (int j = 0; j < 256; j++)
 
247
        {
 
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;
 
253
        }
 
254
    }
 
255
    for (int i = 0; i < 256; i++)
 
256
    {
 
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;
 
258
    }
 
259
    for (int i = 127; i >= 0; i--)
 
260
    {
 
261
        int16_t *parent = tables[wavetable_metadata::wt_pluck][i + 1];
 
262
        float damp = 0.05;
 
263
        for (int j = 0; j < 256; j++)
 
264
        {
 
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];
 
266
        }
 
267
    }
 
268
    for (int i = 0; i < 129; i++)
 
269
    {
 
270
        for (int j = 0; j < 256; j++)
 
271
        {
 
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;
 
276
        }
 
277
    }
 
278
    for (int i = 0; i < 129; i++)
 
279
    {
 
280
        for (int j = 0; j < 256; j++)
 
281
        {
 
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;
 
286
        }
 
287
    }
 
288
    for (int i = 0; i < 129; i++)
 
289
    {
 
290
        for (int j = 0; j < 256; j++)
 
291
        {
 
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;
 
297
        }
 
298
    }
 
299
    for (int i = 0; i < 129; i++)
 
300
    {
 
301
        for (int j = 0; j < 256; j++)
 
302
        {
 
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;
 
308
        }
 
309
    }
 
310
    for (int i = 0; i < 129; i++)
 
311
    {
 
312
        for (int j = 0; j < 256; j++)
 
313
        {
 
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;
 
319
        }
 
320
    }
 
321
    for (int i = 0; i < 129; i++)
 
322
    {
 
323
        for (int j = 0; j < 256; j++)
 
324
        {
 
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;
 
329
        }
 
330
    }
 
331
    for (int i = 0; i < 129; i++)
 
332
    {
 
333
        for (int j = 0; j < 256; j++)
 
334
        {
 
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;
 
339
        }
 
340
    }
 
341
    for (int i = 0; i < 129; i++)
 
342
    {
 
343
        for (int j = 0; j < 256; j++)
 
344
        {
 
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;
 
349
        }
 
350
    }
 
351
    for (int i = 0; i < 129; i++)
 
352
    {
 
353
        for (int j = 0; j < 256; j++)
 
354
        {
 
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;
 
359
        }
 
360
    }
 
361
    for (int i = 0; i < 129; i++)
 
362
    {
 
363
        for (int j = 0; j < 256; j++)
 
364
        {
 
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;
 
371
        }
 
372
    }
 
373
    for (int i = 0; i < 129; i++)
 
374
    {
 
375
        for (int j = 0; j < 256; j++)
 
376
        {
 
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;
 
383
        }
 
384
    }
 
385
    /*
 
386
    for (int i = 0; i < 129; i++)
 
387
    {
 
388
        for (int j = 0; j < 256; j++)
 
389
        {
 
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;
 
396
        }
 
397
    }
 
398
    */
 
399
    for (int i = 0; i < 129; i++)
 
400
    {
 
401
        for (int j = 0; j < 256; j++)
 
402
        {
 
403
            float ph = j * 2 * M_PI / 256;
 
404
            float ii = i / 128.0;
 
405
            float ii2 = ii;
 
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;
 
409
        }
 
410
    }
 
411
    for (int i = 0; i < 129; i++)
 
412
    {
 
413
        for (int j = 0; j < 256; j++)
 
414
        {
 
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;
 
421
        }
 
422
    }
 
423
    for (int i = 0; i < 129; i++)
 
424
    {
 
425
        for (int j = 0; j < 256; j++)
 
426
        {
 
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;
 
434
        }
 
435
    }
 
436
    for (int i = 0; i < 129; i++)
 
437
    {
 
438
        for (int j = 0; j < 256; j++)
 
439
        {
 
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;
 
447
        }
 
448
    }
 
449
    for (int i = 0; i < 129; i++)
 
450
    {
 
451
        for (int j = 0; j < 256; j++)
 
452
        {
 
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;
 
460
        }
 
461
    }
 
462
    for (int i = 0; i < 129; i++)
 
463
    {
 
464
        for (int j = 0; j < 256; j++)
 
465
        {
 
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;
 
471
        }
 
472
    }
 
473
    for (int i = 0; i < 129; i++)
 
474
    {
 
475
        for (int j = 0; j < 256; j++)
 
476
        {
 
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;
 
483
        }
 
484
    }
 
485
    for (int i = 0; i < 129; i++)
 
486
    {
 
487
        for (int j = 0; j < 256; j++)
 
488
        {
 
489
            float ph = j * 2 * M_PI / 256;
 
490
            float ii = i / 128.0;
 
491
            float mod = 0;
 
492
            for (int k = 0; k < 13; k++)
 
493
            {
 
494
                mod += blip(i, k * 10, 30) * sin (ph * (5 + 3 * k) + ii * cos(ph * (2 + 2 * k)));
 
495
            }
 
496
            float v = sin(ph + ii * mod);
 
497
            tables[wavetable_metadata::wt_silver][i][j] = 32767 * v;
 
498
        }
 
499
    }
 
500
    for (int i = 0; i < 129; i++)
 
501
    {
 
502
        for (int j = 0; j < 256; j++)
 
503
        {
 
504
            float ph = j * 2 * M_PI / 256;
 
505
            float ii = i / 128.0;
 
506
            float mod = 0;
 
507
            for (int k = 0; k < 16; k++)
 
508
            {
 
509
                mod += 2 * blip(i, k * 8, k * 4 + 10) * cos (ph * (k + 1));
 
510
            }
 
511
            float v = sin(ph + ii * mod);
 
512
            tables[wavetable_metadata::wt_brass][i][j] = 32767 * v;
 
513
        }
 
514
    }
 
515
    for (int i = 0; i < 129; i++)
 
516
    {
 
517
        for (int j = 0; j < 256; j++)
 
518
        {
 
519
            float ph = j * 2 * M_PI / 256;
 
520
            float ii = i / 128.0;
 
521
            float mod = 0;
 
522
            for (int k = 0; k < 16; k++)
 
523
            {
 
524
                mod += 2 * blip(i, k * 8, 16) * cos (ph * (2 * k + 1));
 
525
            }
 
526
            float v = (sin(ph + ii * mod) + ii * sin(2 * ph + ii * mod)) / 2;
 
527
            tables[wavetable_metadata::wt_multi][i][j] = 32767 * v;
 
528
        }
 
529
    }
 
530
    for (int i = 0; i < 129; i ++)
 
531
    {
 
532
        float h = 1 + i / 16.0;
 
533
        for (int j = 0; j < 256; j++)
 
534
        {
 
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));
 
540
                tv += amp;
 
541
            }
 
542
            tables[wavetable_metadata::wt_multi2][i][j] = 32767 * v / tv;
 
543
        }
 
544
    }
 
545
}
 
546
 
 
547
void wavetable_audio_module::channel_pressure(int /*channel*/, int value)
 
548
{
 
549
    inertia_pressure.set_inertia(value * (1.0 / 127.0));
 
550
}
 
551
 
 
552
#endif