2 * Example audio modules - organ
4 * Copyright (C) 2001-2007 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
23 #include <calf/giface.h>
24 #include <calf/organ.h>
29 using namespace calf_plugins
;
31 //////////////////////////////////////////////////////////////////////////////////////////////////////////
33 organ_audio_module::organ_audio_module()
34 : drawbar_organ(&par_values
)
36 var_map_curve
= "2\n0 1\n1 1\n"; // XXXKF hacky bugfix
39 void organ_audio_module::activate()
45 void organ_audio_module::post_instantiate(uint32_t)
47 dsp::organ_voice_base::precalculate_waves(progress_report
);
51 uint32_t organ_audio_module::process(uint32_t offset
, uint32_t nsamples
, uint32_t inputs_mask
, uint32_t outputs_mask
)
53 float *o
[2] = { outs
[0] + offset
, outs
[1] + offset
};
56 control_change(120, 0); // stop all sounds
57 control_change(121, 0); // reset all controllers
60 render_separate(o
, nsamples
);
64 void organ_audio_module::params_changed() {
65 for (int i
= 0; i
< param_count
; i
++)
66 ((float *)&par_values
)[i
] = *params
[i
];
68 unsigned int old_poly
= polyphony_limit
;
69 polyphony_limit
= dsp::clip(dsp::fastf2i_drm(*params
[par_polyphony
]), 1, 32);
70 if (polyphony_limit
< old_poly
)
75 bool organ_audio_module::get_layers(int index
, int generation
, unsigned int &layers
) const
77 layers
= LG_REALTIME_GRAPH
;
80 bool organ_audio_module::get_graph(int index
, int subindex
, int phase
, float *data
, int points
, cairo_iface
*context
, int *mode
) const
82 if (index
!= par_master
or subindex
or !phase
)
85 organ_voice_base::precalculate_waves(progress_report
);
88 enum { small_waves
= organ_voice_base::wave_count_small
};
89 for (int i
= 0; i
< 9; i
++)
91 int wave
= dsp::clip((int)(parameters
->waveforms
[i
]), 0, (int)organ_voice_base::wave_count
- 1);
92 if (wave
>= small_waves
)
94 waveforms
[i
] = organ_voice_base::get_big_wave(wave
- small_waves
).original
;
95 S
[i
] = ORGAN_BIG_WAVE_SIZE
;
96 S2
[i
] = ORGAN_WAVE_SIZE
/ 64;
100 waveforms
[i
] = organ_voice_base::get_wave(wave
).original
;
101 S
[i
] = S2
[i
] = ORGAN_WAVE_SIZE
;
104 for (int i
= 0; i
< points
; i
++)
107 for (int j
= 0; j
< 9; j
++)
109 float shift
= parameters
->phase
[j
] * S
[j
] / 360.0;
110 sum
+= parameters
->drawbars
[j
] * waveforms
[j
][int(parameters
->harmonics
[j
] * i
* S2
[j
] / points
+ shift
) & (S
[j
] - 1)];
112 data
[i
] = sum
* 2 / (9 * 8);
118 uint32_t organ_audio_module::message_run(const void *valid_inputs
, void *output_ports
)
120 // silence a default printf (which is kind of a warning about unhandled message_run)
125 ////////////////////////////////////////////////////////////////////////////
127 organ_voice_base::small_wave_family (*organ_voice_base::waves
)[organ_voice_base::wave_count_small
];
128 organ_voice_base::big_wave_family (*organ_voice_base::big_waves
)[organ_voice_base::wave_count_big
];
130 static void smoothen(bandlimiter
<ORGAN_WAVE_BITS
> &bl
, float tmp
[ORGAN_WAVE_SIZE
])
132 bl
.compute_spectrum(tmp
);
133 for (int i
= 1; i
<= ORGAN_WAVE_SIZE
/ 2; i
++) {
134 bl
.spectrum
[i
] *= 1.0 / sqrt(i
);
135 bl
.spectrum
[ORGAN_WAVE_SIZE
- i
] *= 1.0 / sqrt(i
);
137 bl
.compute_waveform(tmp
);
138 normalize_waveform(tmp
, ORGAN_WAVE_SIZE
);
141 static void phaseshift(bandlimiter
<ORGAN_WAVE_BITS
> &bl
, float tmp
[ORGAN_WAVE_SIZE
])
143 bl
.compute_spectrum(tmp
);
144 for (int i
= 1; i
<= ORGAN_WAVE_SIZE
/ 2; i
++) {
145 float frac
= i
* 2.0 / ORGAN_WAVE_SIZE
;
146 float phase
= M_PI
/ sqrt(frac
) ;
147 complex<float> shift
= complex<float>(cos(phase
), sin(phase
));
148 bl
.spectrum
[i
] *= shift
;
149 bl
.spectrum
[ORGAN_WAVE_SIZE
- i
] *= conj(shift
);
151 bl
.compute_waveform(tmp
);
152 normalize_waveform(tmp
, ORGAN_WAVE_SIZE
);
155 static void padsynth(bandlimiter
<ORGAN_WAVE_BITS
> blSrc
, bandlimiter
<ORGAN_BIG_WAVE_BITS
> &blDest
, organ_voice_base::big_wave_family
&result
, int bwscale
= 20, float bell_factor
= 0, bool foldover
= false)
157 // kept in a vector to avoid putting large arrays on stack
158 vector
<complex<float> >orig_spectrum
;
159 orig_spectrum
.resize(ORGAN_WAVE_SIZE
/ 2);
160 for (int i
= 0; i
< ORGAN_WAVE_SIZE
/ 2; i
++)
162 orig_spectrum
[i
] = blSrc
.spectrum
[i
];
163 // printf("@%d = %f\n", i, abs(orig_spectrum[i]));
166 int periods
= (1 << ORGAN_BIG_WAVE_SHIFT
) * ORGAN_BIG_WAVE_SIZE
/ ORGAN_WAVE_SIZE
;
167 for (int i
= 0; i
<= ORGAN_BIG_WAVE_SIZE
/ 2; i
++) {
168 blDest
.spectrum
[i
] = 0;
170 int MAXHARM
= (ORGAN_WAVE_SIZE
>> (1 + ORGAN_BIG_WAVE_SHIFT
));
171 for (int i
= 1; i
<= MAXHARM
; i
++) {
172 //float esc = 0.25 * (1 + 0.5 * log(i));
174 float amp
= abs(blSrc
.spectrum
[i
]);
175 // fade out starting from half
176 if (i
>= MAXHARM
/ 2) {
177 float pos
= (i
- MAXHARM
/2) * 1.0 / (MAXHARM
/ 2);
184 if (bw
> 20) delta
= bw
/ 20;
185 for (int j
= delta
; j
<= bw
; j
+=delta
)
187 float p
= j
* 1.0 / bw
;
188 sum
+= 2 * exp(-p
* p
* esc
);
192 amp
*= (ORGAN_BIG_WAVE_SIZE
/ ORGAN_WAVE_SIZE
);
194 int orig
= i
* periods
+ bell_factor
* cos(i
);
195 if (orig
> 0 && orig
< ORGAN_BIG_WAVE_SIZE
/ 2)
196 blDest
.spectrum
[orig
] += amp
;
197 for (int j
= delta
; j
<= bw
; j
+= delta
)
199 float p
= j
* 1.0 / bw
;
200 float val
= amp
* exp(-p
* p
* esc
);
201 int dist
= j
* bwscale
/ 40;
202 int pos
= orig
+ dist
;
203 if (pos
< 1 || pos
>= ORGAN_BIG_WAVE_SIZE
/ 2)
205 int pos2
= orig
- dist
;
206 if (pos2
< 1 || pos2
>= ORGAN_BIG_WAVE_SIZE
/ 2)
208 blDest
.spectrum
[pos
] += val
;
210 blDest
.spectrum
[pos2
] += val
;
213 for (int i
= 1; i
<= ORGAN_BIG_WAVE_SIZE
/ 2; i
++) {
214 float phase
= M_PI
* 2 * (rand() & 255) / 256;
215 complex<float> shift
= complex<float>(cos(phase
), sin(phase
));
216 blDest
.spectrum
[i
] *= shift
;
217 // printf("@%d = %f\n", i, abs(blDest.spectrum[i]));
219 blDest
.spectrum
[ORGAN_BIG_WAVE_SIZE
- i
] = conj(blDest
.spectrum
[i
]);
221 // same as above - put large array on heap to avoid stack overflow in ingen
223 tmp
.resize(ORGAN_BIG_WAVE_SIZE
);
224 float *ptmp
= &tmp
.front();
225 blDest
.compute_waveform(ptmp
);
226 normalize_waveform(ptmp
, ORGAN_BIG_WAVE_SIZE
);
227 blDest
.compute_spectrum(ptmp
);
229 // limit is 1/2 of the number of harmonics of the original wave
230 result
.make_from_spectrum(blDest
, foldover
, ORGAN_WAVE_SIZE
>> (1 + ORGAN_BIG_WAVE_SHIFT
));
231 memcpy(result
.original
, result
.begin()->second
, sizeof(result
.original
));
233 blDest
.compute_waveform(result
);
234 normalize_waveform(result
, ORGAN_BIG_WAVE_SIZE
);
235 result
[ORGAN_BIG_WAVE_SIZE
] = result
[0];
236 for (int i
=0 ; i
<ORGAN_BIG_WAVE_SIZE
+ 1; i
++)
237 printf("%f\n", result
[i
]);
241 #define LARGE_WAVEFORM_PROGRESS() do { if (reporter) { progress += 100; reporter->report_progress(floor(progress / totalwaves), "Precalculating large waveforms"); } } while(0)
243 void organ_voice_base::update_pitch()
245 float phase
= dsp::midi_note_to_phase(note
, 100 * parameters
->global_transpose
+ parameters
->global_detune
, sample_rate_ref
);
246 dpphase
.set((long int) (phase
* parameters
->percussion_harmonic
* parameters
->pitch_bend
));
247 moddphase
.set((long int) (phase
* parameters
->percussion_fm_harmonic
* parameters
->pitch_bend
));
250 void organ_voice_base::precalculate_waves(progress_report_iface
*reporter
)
252 static bool inited
= false;
255 static organ_voice_base::small_wave_family waves
[organ_voice_base::wave_count_small
];
256 static organ_voice_base::big_wave_family big_waves
[organ_voice_base::wave_count_big
];
257 organ_voice_base::waves
= &waves
;
258 organ_voice_base::big_waves
= &big_waves
;
260 float progress
= 0.0;
261 int totalwaves
= 1 + wave_count_big
;
263 reporter
->report_progress(0, "Precalculating small waveforms");
264 float tmp
[ORGAN_WAVE_SIZE
];
265 static bandlimiter
<ORGAN_WAVE_BITS
> bl
;
266 static bandlimiter
<ORGAN_BIG_WAVE_BITS
> blBig
;
267 for (int i
= 0; i
< ORGAN_WAVE_SIZE
; i
++)
268 tmp
[i
] = sin(i
* 2 * M_PI
/ ORGAN_WAVE_SIZE
);
269 waves
[wave_sine
].make(bl
, tmp
);
270 for (int i
= 0; i
< ORGAN_WAVE_SIZE
; i
++)
271 tmp
[i
] = (i
< (ORGAN_WAVE_SIZE
/ 16)) ? 1 : 0;
272 normalize_waveform(tmp
, ORGAN_WAVE_SIZE
);
273 waves
[wave_pulse
].make(bl
, tmp
);
274 for (int i
= 0; i
< ORGAN_WAVE_SIZE
; i
++)
275 tmp
[i
] = i
< (ORGAN_WAVE_SIZE
/ 2) ? sin(i
* 2 * 2 * M_PI
/ ORGAN_WAVE_SIZE
) : 0;
276 waves
[wave_sinepl1
].make(bl
, tmp
);
277 for (int i
= 0; i
< ORGAN_WAVE_SIZE
; i
++)
278 tmp
[i
] = i
< (ORGAN_WAVE_SIZE
/ 3) ? sin(i
* 3 * 2 * M_PI
/ ORGAN_WAVE_SIZE
) : 0;
279 waves
[wave_sinepl2
].make(bl
, tmp
);
280 for (int i
= 0; i
< ORGAN_WAVE_SIZE
; i
++)
281 tmp
[i
] = i
< (ORGAN_WAVE_SIZE
/ 4) ? sin(i
* 4 * 2 * M_PI
/ ORGAN_WAVE_SIZE
) : 0;
282 waves
[wave_sinepl3
].make(bl
, tmp
);
283 for (int i
= 0; i
< ORGAN_WAVE_SIZE
; i
++)
284 tmp
[i
] = (i
< (ORGAN_WAVE_SIZE
/ 2)) ? 1 : -1;
285 normalize_waveform(tmp
, ORGAN_WAVE_SIZE
);
286 waves
[wave_sqr
].make(bl
, tmp
);
287 for (int i
= 0; i
< ORGAN_WAVE_SIZE
; i
++)
288 tmp
[i
] = -1 + (i
* 2.0 / ORGAN_WAVE_SIZE
);
289 normalize_waveform(tmp
, ORGAN_WAVE_SIZE
);
290 waves
[wave_saw
].make(bl
, tmp
);
292 for (int i
= 0; i
< ORGAN_WAVE_SIZE
; i
++)
293 tmp
[i
] = (i
< (ORGAN_WAVE_SIZE
/ 2)) ? 1 : -1;
294 normalize_waveform(tmp
, ORGAN_WAVE_SIZE
);
296 waves
[wave_ssqr
].make(bl
, tmp
);
298 for (int i
= 0; i
< ORGAN_WAVE_SIZE
; i
++)
299 tmp
[i
] = -1 + (i
* 2.0 / ORGAN_WAVE_SIZE
);
300 normalize_waveform(tmp
, ORGAN_WAVE_SIZE
);
302 waves
[wave_ssaw
].make(bl
, tmp
);
304 for (int i
= 0; i
< ORGAN_WAVE_SIZE
; i
++)
305 tmp
[i
] = (i
< (ORGAN_WAVE_SIZE
/ 16)) ? 1 : 0;
306 normalize_waveform(tmp
, ORGAN_WAVE_SIZE
);
308 waves
[wave_spls
].make(bl
, tmp
);
309 for (int i
= 0; i
< ORGAN_WAVE_SIZE
; i
++)
310 tmp
[i
] = i
< (ORGAN_WAVE_SIZE
/ 1.5) ? sin(i
* 1.5 * 2 * M_PI
/ ORGAN_WAVE_SIZE
) : 0;
311 normalize_waveform(tmp
, ORGAN_WAVE_SIZE
);
312 waves
[wave_sinepl05
].make(bl
, tmp
);
313 for (int i
= 0; i
< ORGAN_WAVE_SIZE
; i
++)
314 tmp
[i
] = i
< (ORGAN_WAVE_SIZE
/ 1.5) ? (i
< ORGAN_WAVE_SIZE
/ 3 ? -1 : +1) : 0;
315 normalize_waveform(tmp
, ORGAN_WAVE_SIZE
);
316 waves
[wave_sqr05
].make(bl
, tmp
);
317 for (int i
= 0; i
< ORGAN_WAVE_SIZE
; i
++)
318 tmp
[i
] = sin(i
* M_PI
/ ORGAN_WAVE_SIZE
);
319 normalize_waveform(tmp
, ORGAN_WAVE_SIZE
);
320 waves
[wave_halfsin
].make(bl
, tmp
);
321 for (int i
= 0; i
< ORGAN_WAVE_SIZE
; i
++)
322 tmp
[i
] = sin(i
* 3 * M_PI
/ ORGAN_WAVE_SIZE
);
323 normalize_waveform(tmp
, ORGAN_WAVE_SIZE
);
324 waves
[wave_clvg
].make(bl
, tmp
);
325 for (int i
= 0; i
< ORGAN_WAVE_SIZE
; i
++)
327 float ph
= i
* 2 * M_PI
/ ORGAN_WAVE_SIZE
;
328 float fm
= 0.3 * sin(6*ph
) + 0.2 * sin(11*ph
) + 0.2 * cos(17*ph
) - 0.2 * cos(19*ph
);
329 tmp
[i
] = sin(5*ph
+ fm
) + 0.7 * cos(7*ph
- fm
);
331 normalize_waveform(tmp
, ORGAN_WAVE_SIZE
);
332 waves
[wave_bell
].make(bl
, tmp
, true);
333 for (int i
= 0; i
< ORGAN_WAVE_SIZE
; i
++)
335 float ph
= i
* 2 * M_PI
/ ORGAN_WAVE_SIZE
;
336 float fm
= 0.3 * sin(3*ph
) + 0.3 * sin(11*ph
) + 0.3 * cos(17*ph
) - 0.3 * cos(19*ph
) + 0.3 * cos(25*ph
) - 0.3 * cos(31*ph
) + 0.3 * cos(37*ph
);
337 tmp
[i
] = sin(3*ph
+ fm
) + cos(7*ph
- fm
);
339 normalize_waveform(tmp
, ORGAN_WAVE_SIZE
);
340 waves
[wave_bell2
].make(bl
, tmp
, true);
341 for (int i
= 0; i
< ORGAN_WAVE_SIZE
; i
++)
343 float ph
= i
* 2 * M_PI
/ ORGAN_WAVE_SIZE
;
344 float fm
= 0.5 * sin(3*ph
) + 0.3 * sin(5*ph
) + 0.3 * cos(6*ph
) - 0.3 * cos(9*ph
);
345 tmp
[i
] = sin(4*ph
+ fm
) + cos(ph
- fm
);
347 normalize_waveform(tmp
, ORGAN_WAVE_SIZE
);
348 waves
[wave_w1
].make(bl
, tmp
);
349 for (int i
= 0; i
< ORGAN_WAVE_SIZE
; i
++)
351 float ph
= i
* 2 * M_PI
/ ORGAN_WAVE_SIZE
;
352 tmp
[i
] = sin(ph
) * sin(2 * ph
) * sin(4 * ph
) * sin(8 * ph
);
354 normalize_waveform(tmp
, ORGAN_WAVE_SIZE
);
355 waves
[wave_w2
].make(bl
, tmp
);
356 for (int i
= 0; i
< ORGAN_WAVE_SIZE
; i
++)
358 float ph
= i
* 2 * M_PI
/ ORGAN_WAVE_SIZE
;
359 tmp
[i
] = sin(ph
) * sin(3 * ph
) * sin(5 * ph
) * sin(7 * ph
) * sin(9 * ph
);
361 normalize_waveform(tmp
, ORGAN_WAVE_SIZE
);
362 waves
[wave_w3
].make(bl
, tmp
);
363 for (int i
= 0; i
< ORGAN_WAVE_SIZE
; i
++)
365 float ph
= i
* 2 * M_PI
/ ORGAN_WAVE_SIZE
;
366 tmp
[i
] = sin(ph
+ 2 * sin(ph
+ 2 * sin(ph
)));
368 normalize_waveform(tmp
, ORGAN_WAVE_SIZE
);
369 waves
[wave_w4
].make(bl
, tmp
);
370 for (int i
= 0; i
< ORGAN_WAVE_SIZE
; i
++)
372 float ph
= i
* 2 * M_PI
/ ORGAN_WAVE_SIZE
;
373 tmp
[i
] = ph
* sin(ph
);
375 normalize_waveform(tmp
, ORGAN_WAVE_SIZE
);
376 waves
[wave_w5
].make(bl
, tmp
);
377 for (int i
= 0; i
< ORGAN_WAVE_SIZE
; i
++)
379 float ph
= i
* 2 * M_PI
/ ORGAN_WAVE_SIZE
;
380 tmp
[i
] = ph
* sin(ph
) + (2 * M_PI
- ph
) * sin(2 * ph
);
382 normalize_waveform(tmp
, ORGAN_WAVE_SIZE
);
383 waves
[wave_w6
].make(bl
, tmp
);
384 for (int i
= 0; i
< ORGAN_WAVE_SIZE
; i
++)
386 float ph
= i
* 1.0 / ORGAN_WAVE_SIZE
;
387 tmp
[i
] = exp(-ph
* ph
);
389 normalize_waveform(tmp
, ORGAN_WAVE_SIZE
);
390 waves
[wave_w7
].make(bl
, tmp
);
391 for (int i
= 0; i
< ORGAN_WAVE_SIZE
; i
++)
393 float ph
= i
* 1.0 / ORGAN_WAVE_SIZE
;
394 tmp
[i
] = exp(-ph
* sin(2 * M_PI
* ph
));
396 normalize_waveform(tmp
, ORGAN_WAVE_SIZE
);
397 waves
[wave_w8
].make(bl
, tmp
);
398 for (int i
= 0; i
< ORGAN_WAVE_SIZE
; i
++)
400 float ph
= i
* 1.0 / ORGAN_WAVE_SIZE
;
401 tmp
[i
] = sin(2 * M_PI
* ph
* ph
);
403 normalize_waveform(tmp
, ORGAN_WAVE_SIZE
);
404 waves
[wave_w9
].make(bl
, tmp
);
406 for (int i
= 0; i
< ORGAN_WAVE_SIZE
; i
++)
407 tmp
[i
] = -1 + (i
* 2.0 / ORGAN_WAVE_SIZE
);
408 normalize_waveform(tmp
, ORGAN_WAVE_SIZE
);
410 waves
[wave_dsaw
].make(bl
, tmp
);
412 for (int i
= 0; i
< ORGAN_WAVE_SIZE
; i
++)
413 tmp
[i
] = (i
< (ORGAN_WAVE_SIZE
/ 2)) ? 1 : -1;
414 normalize_waveform(tmp
, ORGAN_WAVE_SIZE
);
416 waves
[wave_dsqr
].make(bl
, tmp
);
418 for (int i
= 0; i
< ORGAN_WAVE_SIZE
; i
++)
419 tmp
[i
] = (i
< (ORGAN_WAVE_SIZE
/ 16)) ? 1 : 0;
420 normalize_waveform(tmp
, ORGAN_WAVE_SIZE
);
422 waves
[wave_dpls
].make(bl
, tmp
);
424 LARGE_WAVEFORM_PROGRESS();
425 for (int i
= 0; i
< ORGAN_WAVE_SIZE
; i
++)
426 tmp
[i
] = -1 + (i
* 2.0 / ORGAN_WAVE_SIZE
);
427 normalize_waveform(tmp
, ORGAN_WAVE_SIZE
);
428 bl
.compute_spectrum(tmp
);
429 padsynth(bl
, blBig
, big_waves
[wave_strings
- wave_count_small
], 15);
431 LARGE_WAVEFORM_PROGRESS();
432 for (int i
= 0; i
< ORGAN_WAVE_SIZE
; i
++)
433 tmp
[i
] = -1 + (i
* 2.0 / ORGAN_WAVE_SIZE
);
434 normalize_waveform(tmp
, ORGAN_WAVE_SIZE
);
435 bl
.compute_spectrum(tmp
);
436 padsynth(bl
, blBig
, big_waves
[wave_strings2
- wave_count_small
], 40);
438 LARGE_WAVEFORM_PROGRESS();
439 for (int i
= 0; i
< ORGAN_WAVE_SIZE
; i
++)
440 tmp
[i
] = sin(i
* 2 * M_PI
/ ORGAN_WAVE_SIZE
);
441 normalize_waveform(tmp
, ORGAN_WAVE_SIZE
);
442 bl
.compute_spectrum(tmp
);
443 padsynth(bl
, blBig
, big_waves
[wave_sinepad
- wave_count_small
], 20);
445 LARGE_WAVEFORM_PROGRESS();
446 for (int i
= 0; i
< ORGAN_WAVE_SIZE
; i
++)
448 float ph
= i
* 2 * M_PI
/ ORGAN_WAVE_SIZE
;
449 float fm
= 0.3 * sin(6*ph
) + 0.2 * sin(11*ph
) + 0.2 * cos(17*ph
) - 0.2 * cos(19*ph
);
450 tmp
[i
] = sin(5*ph
+ fm
) + 0.7 * cos(7*ph
- fm
);
452 normalize_waveform(tmp
, ORGAN_WAVE_SIZE
);
453 bl
.compute_spectrum(tmp
);
454 padsynth(bl
, blBig
, big_waves
[wave_bellpad
- wave_count_small
], 30, 30, true);
456 LARGE_WAVEFORM_PROGRESS();
457 for (int i
= 0; i
< ORGAN_WAVE_SIZE
; i
++)
459 float ph
= i
* 2 * M_PI
/ ORGAN_WAVE_SIZE
;
460 float fm
= 0.3 * sin(3*ph
) + 0.2 * sin(4*ph
) + 0.2 * cos(5*ph
) - 0.2 * cos(6*ph
);
461 tmp
[i
] = sin(2*ph
+ fm
) + 0.7 * cos(3*ph
- fm
);
463 normalize_waveform(tmp
, ORGAN_WAVE_SIZE
);
464 bl
.compute_spectrum(tmp
);
465 padsynth(bl
, blBig
, big_waves
[wave_space
- wave_count_small
], 30, 30);
467 LARGE_WAVEFORM_PROGRESS();
468 for (int i
= 0; i
< ORGAN_WAVE_SIZE
; i
++)
470 float ph
= i
* 2 * M_PI
/ ORGAN_WAVE_SIZE
;
471 float fm
= 0.5 * sin(ph
) + 0.5 * sin(2*ph
) + 0.5 * sin(3*ph
);
472 tmp
[i
] = sin(ph
+ fm
) + 0.5 * cos(7*ph
- 2 * fm
) + 0.25 * cos(13*ph
- 4 * fm
);
474 normalize_waveform(tmp
, ORGAN_WAVE_SIZE
);
475 bl
.compute_spectrum(tmp
);
476 padsynth(bl
, blBig
, big_waves
[wave_choir
- wave_count_small
], 50, 10);
478 LARGE_WAVEFORM_PROGRESS();
479 for (int i
= 0; i
< ORGAN_WAVE_SIZE
; i
++)
481 float ph
= i
* 2 * M_PI
/ ORGAN_WAVE_SIZE
;
483 tmp
[i
] = sin(ph
+ fm
) + 0.25 * cos(11*ph
- 2 * fm
) + 0.125 * cos(23*ph
- 2 * fm
) + 0.0625 * cos(49*ph
- 2 * fm
);
485 normalize_waveform(tmp
, ORGAN_WAVE_SIZE
);
486 bl
.compute_spectrum(tmp
);
487 padsynth(bl
, blBig
, big_waves
[wave_choir2
- wave_count_small
], 50, 10);
489 LARGE_WAVEFORM_PROGRESS();
490 for (int i
= 0; i
< ORGAN_WAVE_SIZE
; i
++)
492 float ph
= i
* 2 * M_PI
/ ORGAN_WAVE_SIZE
;
494 tmp
[i
] = sin(ph
+ 4 * fm
) + 0.5 * sin(2 * ph
+ 4 * ph
);
496 normalize_waveform(tmp
, ORGAN_WAVE_SIZE
);
497 bl
.compute_spectrum(tmp
);
498 padsynth(bl
, blBig
, big_waves
[wave_choir3
- wave_count_small
], 50, 10);
499 LARGE_WAVEFORM_PROGRESS();
505 organ_voice_base::organ_voice_base(organ_parameters
*_parameters
, int &_sample_rate_ref
, bool &_released_ref
)
506 : parameters(_parameters
)
507 , sample_rate_ref(_sample_rate_ref
)
508 , released_ref(_released_ref
)
513 void organ_voice_base::render_percussion_to(float (*buf
)[2], int nsamples
)
518 if (!pamp
.get_active())
520 if (parameters
->percussion_level
< small_value
<float>())
522 float level
= parameters
->percussion_level
* 9;
523 static float zeros
[ORGAN_WAVE_SIZE
];
524 // XXXKF the decay needs work!
525 double age_const
= parameters
->perc_decay_const
;
526 double fm_age_const
= parameters
->perc_fm_decay_const
;
527 int timbre
= parameters
->get_percussion_wave();
528 if (timbre
< 0 || timbre
>= wave_count_small
)
530 int timbre2
= parameters
->get_percussion_fm_wave();
531 if (timbre2
< 0 || timbre2
>= wave_count_small
)
533 float *fmdata
= (*waves
)[timbre2
].get_level(moddphase
.get());
536 float *data
= (*waves
)[timbre
].get_level(dpphase
.get());
541 float s
= parameters
->percussion_stereo
* ORGAN_WAVE_SIZE
* (0.5 / 360.0);
542 for (int i
= 0; i
< nsamples
; i
++) {
543 float fm
= wave(fmdata
, modphase
);
544 fm
*= ORGAN_WAVE_SIZE
* parameters
->percussion_fm_depth
* fm_amp
.get();
545 modphase
+= moddphase
;
546 fm_amp
.age_exp(fm_age_const
, 1.0 / 32768.0);
548 float lamp
= level
* pamp
.get();
549 buf
[i
][0] += lamp
* wave(data
, pphase
+ dsp::fixed_point
<int64_t, 52>(fm
- s
));
550 buf
[i
][1] += lamp
* wave(data
, pphase
+ dsp::fixed_point
<int64_t, 52>(fm
+ s
));
552 pamp
.age_lin(rel_age_const
,0.0);
554 pamp
.age_exp(age_const
, 1.0 / 32768.0);
559 void organ_voice_base::perc_reset()
568 //////////////////////////////////////////////////////////////////////////////////////////////////////
570 void organ_vibrato::reset()
572 for (int i
= 0; i
< VibratoSize
; i
++)
573 vibrato_x1
[i
][0] = vibrato_y1
[i
][0] = vibrato_x1
[i
][1] = vibrato_y1
[i
][1] = 0.f
;
574 vibrato
[0].a0
= vibrato
[1].a0
= 0;
578 void organ_vibrato::process(organ_parameters
*parameters
, float (*data
)[2], unsigned int len
, float sample_rate
)
580 float lfo1
= lfo_phase
< 0.5 ? 2 * lfo_phase
: 2 - 2 * lfo_phase
;
581 float lfo_phase2
= lfo_phase
+ parameters
->lfo_phase
* (1.0 / 360.0);
582 if (lfo_phase2
>= 1.0)
584 float lfo2
= lfo_phase2
< 0.5 ? 2 * lfo_phase2
: 2 - 2 * lfo_phase2
;
585 lfo_phase
+= parameters
->lfo_rate
* len
/ sample_rate
;
586 if (lfo_phase
>= 1.0)
590 float olda0
[2] = {vibrato
[0].a0
, vibrato
[1].a0
};
591 vibrato
[0].set_ap(3000 + 7000 * parameters
->lfo_amt
* lfo1
* lfo1
, sample_rate
);
592 vibrato
[1].set_ap(3000 + 7000 * parameters
->lfo_amt
* lfo2
* lfo2
, sample_rate
);
593 float ilen
= 1.0 / len
;
594 float deltaa0
[2] = {(vibrato
[0].a0
- olda0
[0])*ilen
, (vibrato
[1].a0
- olda0
[1])*ilen
};
596 float vib_wet
= parameters
->lfo_wet
;
597 for (int c
= 0; c
< 2; c
++)
599 for (unsigned int i
= 0; i
< len
; i
++)
601 float v
= data
[i
][c
];
603 float coeff
= olda0
[c
] + deltaa0
[c
] * i
;
604 for (int t
= 0; t
< VibratoSize
; t
++)
605 v
= vibrato
[c
].process_ap(v
, vibrato_x1
[t
][c
], vibrato_y1
[t
][c
], coeff
);
607 data
[i
][c
] += (v
- v0
) * vib_wet
;
609 for (int t
= 0; t
< VibratoSize
; t
++)
611 sanitize(vibrato_x1
[t
][c
]);
612 sanitize(vibrato_y1
[t
][c
]);
617 void scanner_vibrato::reset()
620 for (int i
= 0; i
< ScannerSize
; i
++)
625 void scanner_vibrato::process(organ_parameters
*parameters
, float (*data
)[2], unsigned int len
, float sample_rate
)
630 int vtype
= (int)parameters
->lfo_type
;
631 if (!vtype
|| vtype
> organ_enums::lfotype_cvfull
)
633 legacy
.process(parameters
, data
, len
, sample_rate
);
637 // I bet the original components of the line box had some tolerance,
638 // hence two different values of cutoff frequency
639 scanner
[0].set_lp_rbj(4000, 0.707, sample_rate
);
640 scanner
[1].set_lp_rbj(4200, 0.707, sample_rate
);
641 for (int t
= 2; t
< ScannerSize
; t
++)
643 scanner
[t
].copy_coeffs(scanner
[t
& 1]);
646 float lfo_phase2
= lfo_phase
+ parameters
->lfo_phase
* (1.0 / 360.0);
647 if (lfo_phase2
>= 1.0)
649 float vib_wet
= parameters
->lfo_wet
;
650 float dphase
= parameters
->lfo_rate
/ sample_rate
;
651 static const int v1
[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 8 };
652 static const int v2
[] = { 0, 1, 2, 4, 6, 8, 9, 10, 12 };
653 static const int v3
[] = { 0, 1, 3, 6, 11, 12, 15, 17, 18, 18, 18 };
654 static const int vfull
[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 18 };
655 static const int *vtypes
[] = { NULL
, v1
, v2
, v3
, vfull
};
656 const int *vib
= vtypes
[vtype
];
658 float vibamt
= 8 * parameters
->lfo_amt
;
659 if (vtype
== organ_enums::lfotype_cvfull
)
660 vibamt
= 17 * parameters
->lfo_amt
;
661 for (unsigned int i
= 0; i
< len
; i
++)
663 float line
[ScannerSize
+ 1];
664 float v0
= (data
[i
][0] + data
[i
][1]) * 0.5;
667 for (int t
= 0; t
< ScannerSize
; t
++)
668 line
[t
+ 1] = scanner
[t
].process(line
[t
]) * 1.03;
670 float lfo1
= lfo_phase
< 0.5 ? 2 * lfo_phase
: 2 - 2 * lfo_phase
;
671 float lfo2
= lfo_phase2
< 0.5 ? 2 * lfo_phase2
: 2 - 2 * lfo_phase2
;
673 float pos
= vibamt
* lfo1
;
675 float vl
= lerp(line
[vib
[ipos
]], line
[vib
[ipos
+ 1]], pos
- ipos
);
679 float vr
= lerp(line
[vib
[ipos
]], line
[vib
[ipos
+ 1]], pos
- ipos
);
682 if (lfo_phase
>= 1.0)
684 lfo_phase2
+= dphase
;
685 if (lfo_phase2
>= 1.0)
688 data
[i
][0] += (vl
- v0
) * vib_wet
;
689 data
[i
][1] += (vr
- v0
) * vib_wet
;
691 for (int t
= 0; t
< ScannerSize
; t
++)
693 scanner
[t
].sanitize();
696 //////////////////////////////////////////////////////////////////////////////////////////////////////
698 void organ_voice::update_pitch()
700 organ_voice_base::update_pitch();
701 dphase
.set(dsp::midi_note_to_phase(note
, 100 * parameters
->global_transpose
+ parameters
->global_detune
, sample_rate
) * inertia_pitchbend
.get_last());
704 void organ_voice::render_block(int snapshot
) {
708 dsp::zero(&output_buffer
[0][0], Channels
* BlockSize
);
709 dsp::zero(&aux_buffers
[1][0][0], 2 * Channels
* BlockSize
);
710 if (!amp
.get_active())
712 if (use_percussion())
713 render_percussion_to(output_buffer
, BlockSize
);
717 inertia_pitchbend
.set_inertia(parameters
->pitch_bend
);
718 inertia_pitchbend
.step();
720 dsp::fixed_point
<int, 20> tphase
, tdphase
;
721 unsigned int foldvalue
= parameters
->foldvalue
* inertia_pitchbend
.get_last();
722 int vibrato_mode
= fastf2i_drm(parameters
->lfo_mode
);
723 for (int h
= 0; h
< 9; h
++)
725 float amp
= parameters
->drawbars
[h
];
726 if (amp
< small_value
<float>())
729 dsp::fixed_point
<int, 24> hm
= dsp::fixed_point
<int, 24>(parameters
->multiplier
[h
]);
730 int waveid
= (int)parameters
->waveforms
[h
];
731 if (waveid
< 0 || waveid
>= wave_count
)
734 uint32_t rate
= (dphase
* hm
).get();
735 if (waveid
>= wave_count_small
)
737 float *data
= (*big_waves
)[waveid
- wave_count_small
].get_level(rate
>> (ORGAN_BIG_WAVE_BITS
- ORGAN_WAVE_BITS
+ ORGAN_BIG_WAVE_SHIFT
));
740 hm
.set(hm
.get() >> ORGAN_BIG_WAVE_SHIFT
);
741 dsp::fixed_point
<int64_t, 20> tphase
, tdphase
;
742 tphase
.set(((phase
* hm
).get()) + parameters
->phaseshift
[h
]);
743 tdphase
.set(rate
>> ORGAN_BIG_WAVE_SHIFT
);
744 float ampl
= amp
* 0.5f
* (1 - parameters
->pan
[h
]);
745 float ampr
= amp
* 0.5f
* (1 + parameters
->pan
[h
]);
746 float (*out
)[Channels
] = aux_buffers
[dsp::fastf2i_drm(parameters
->routing
[h
])];
748 for (int i
=0; i
< (int)BlockSize
; i
++) {
749 float wv
= big_wave(data
, tphase
);
750 out
[i
][0] += wv
* ampl
;
751 out
[i
][1] += wv
* ampr
;
757 unsigned int foldback
= 0;
758 while (rate
> foldvalue
)
763 hm
.set(hm
.get() >> foldback
);
764 data
= (*waves
)[waveid
].get_level(rate
);
767 tphase
.set((uint32_t)((phase
* hm
).get()) + parameters
->phaseshift
[h
]);
768 tdphase
.set((uint32_t)rate
);
769 float ampl
= amp
* 0.5f
* (1 - parameters
->pan
[h
]);
770 float ampr
= amp
* 0.5f
* (1 + parameters
->pan
[h
]);
771 float (*out
)[Channels
] = aux_buffers
[dsp::fastf2i_drm(parameters
->routing
[h
])];
773 for (int i
=0; i
< (int)BlockSize
; i
++) {
774 float wv
= wave(data
, tphase
);
775 out
[i
][0] += wv
* ampl
;
776 out
[i
][1] += wv
* ampr
;
782 bool is_quad
= parameters
->quad_env
>= 0.5f
;
784 expression
.set_inertia(parameters
->cutoff
);
785 phase
+= dphase
* BlockSize
;
786 float escl
[EnvCount
], eval
[EnvCount
];
787 for (int i
= 0; i
< EnvCount
; i
++)
788 escl
[i
] = (1.f
+ parameters
->envs
[i
].velscale
* (velocity
- 1.f
));
792 for (int i
= 0; i
< EnvCount
; i
++)
793 eval
[i
] = envs
[i
].value
* envs
[i
].value
* escl
[i
];
797 for (int i
= 0; i
< EnvCount
; i
++)
798 eval
[i
] = envs
[i
].value
* escl
[i
];
800 for (int i
= 0; i
< FilterCount
; i
++)
802 float mod
= parameters
->filters
[i
].envmod
[0] * eval
[0] ;
803 mod
+= parameters
->filters
[i
].keyf
* 100 * (note
- 60);
804 for (int j
= 1; j
< EnvCount
; j
++)
806 mod
+= parameters
->filters
[i
].envmod
[j
] * eval
[j
];
808 if (i
) mod
+= expression
.get() * 1200 * 4;
809 float fc
= parameters
->filters
[i
].cutoff
* pow(2.0f
, mod
* (1.f
/ 1200.f
));
810 if (i
== 0 && parameters
->filter1_type
>= 0.5f
)
811 filterL
[i
].set_hp_rbj(dsp::clip
<float>(fc
, 10, 18000), parameters
->filters
[i
].resonance
, sample_rate
);
813 filterL
[i
].set_lp_rbj(dsp::clip
<float>(fc
, 10, 18000), parameters
->filters
[i
].resonance
, sample_rate
);
814 filterR
[i
].copy_coeffs(filterL
[i
]);
816 float amp_pre
[ampctl_count
- 1], amp_post
[ampctl_count
- 1];
817 for (int i
= 0; i
< ampctl_count
- 1; i
++)
822 bool any_running
= false;
823 for (int i
= 0; i
< EnvCount
; i
++)
827 int mode
= fastf2i_drm(parameters
->envs
[i
].ampctl
);
828 if (!envs
[i
].stopped())
830 if (mode
== ampctl_none
)
832 float post
= (is_quad
? envs
[i
].value
: 1) * envs
[i
].value
* escl
[i
];
833 amp_pre
[mode
- 1] *= pre
;
834 amp_post
[mode
- 1] *= post
;
836 if (vibrato_mode
>= lfomode_direct
&& vibrato_mode
<= lfomode_filter2
)
837 vibrato
.process(parameters
, aux_buffers
[vibrato_mode
- lfomode_direct
], BlockSize
, sample_rate
);
840 // calculate delta from pre and post
841 for (int i
= 0; i
< ampctl_count
- 1; i
++)
842 amp_post
[i
] = (amp_post
[i
] - amp_pre
[i
]) * (1.0 / BlockSize
);
843 float a0
= amp_pre
[0], a1
= amp_pre
[1], a2
= amp_pre
[2], a3
= amp_pre
[3];
844 float d0
= amp_post
[0], d1
= amp_post
[1], d2
= amp_post
[2], d3
= amp_post
[3];
845 if (parameters
->filter_chain
>= 0.5f
)
847 for (int i
=0; i
< (int) BlockSize
; i
++) {
848 output_buffer
[i
][0] = a3
* (a0
* output_buffer
[i
][0] + a2
* filterL
[1].process(a1
* filterL
[0].process(aux_buffers
[1][i
][0]) + aux_buffers
[2][i
][0]));
849 output_buffer
[i
][1] = a3
* (a0
* output_buffer
[i
][1] + a2
* filterR
[1].process(a1
* filterR
[0].process(aux_buffers
[1][i
][1]) + aux_buffers
[2][i
][1]));
850 a0
+= d0
, a1
+= d1
, a2
+= d2
, a3
+= d3
;
855 for (int i
=0; i
< (int) BlockSize
; i
++) {
856 output_buffer
[i
][0] = a3
* (a0
* output_buffer
[i
][0] + a1
* filterL
[0].process(aux_buffers
[1][i
][0]) + a2
* filterL
[1].process(aux_buffers
[2][i
][0]));
857 output_buffer
[i
][1] = a3
* (a0
* output_buffer
[i
][1] + a1
* filterR
[0].process(aux_buffers
[1][i
][1]) + a2
* filterR
[1].process(aux_buffers
[2][i
][1]));
858 a0
+= d0
, a1
+= d1
, a2
+= d2
, a3
+= d3
;
861 filterL
[0].sanitize();
862 filterR
[0].sanitize();
863 filterL
[1].sanitize();
864 filterR
[1].sanitize();
865 if (vibrato_mode
== lfomode_voice
)
866 vibrato
.process(parameters
, output_buffer
, BlockSize
, sample_rate
);
870 for (int i
= 0; i
< (int) BlockSize
; i
++) {
871 output_buffer
[i
][0] *= amp
.get();
872 output_buffer
[i
][1] *= amp
.get();
873 amp
.age_lin((1.0/44100.0)/0.03,0.0);
877 if (use_percussion())
878 render_percussion_to(output_buffer
, BlockSize
);
882 void organ_voice::note_on(int note
, int vel
)
886 perc_released
= false;
890 const float sf
= 0.001f
;
891 for (int i
= 0; i
< EnvCount
; i
++)
893 organ_parameters::organ_env_parameters
&p
= parameters
->envs
[i
];
894 envs
[i
].set(sf
* p
.attack
, sf
* p
.decay
, p
.sustain
, sf
* p
.release
, sample_rate
/ BlockSize
);
898 velocity
= vel
* 1.0 / 127.0;
900 perc_note_on(note
, vel
);
903 void organ_voice::note_off(int /* vel */)
905 // reset age to 0 (because decay will turn from exponential to linear, necessary because of error cumulation prevention)
906 perc_released
= true;
907 if (pamp
.get_active())
911 rel_age_const
= pamp
.get() * ((1.0/44100.0)/0.03);
912 for (int i
= 0; i
< EnvCount
; i
++)
916 void organ_voice::steal()
918 perc_released
= true;
923 void organ_voice::reset()
925 inertia_pitchbend
.ramp
.set_length(sample_rate
/ (BlockSize
* 30)); // 1/30s
928 for (int i
= 0; i
< FilterCount
; i
++)
935 ///////////////////////////////////////////////////////////////////////////////////////////////////
937 void drawbar_organ::update_params()
939 parameters
->perc_decay_const
= dsp::decay::calc_exp_constant(1.0 / 1024.0, 0.001 * parameters
->percussion_time
* sample_rate
);
940 parameters
->perc_fm_decay_const
= dsp::decay::calc_exp_constant(1.0 / 1024.0, 0.001 * parameters
->percussion_fm_time
* sample_rate
);
941 for (int i
= 0; i
< 9; i
++)
943 parameters
->multiplier
[i
] = parameters
->harmonics
[i
] * pow(2.0, parameters
->detune
[i
] * (1.0 / 1200.0));
944 parameters
->phaseshift
[i
] = int(parameters
->phase
[i
] * 65536 / 360) << 16;
946 double dphase
= dsp::midi_note_to_phase((int)parameters
->foldover
, 0, sample_rate
);
947 parameters
->foldvalue
= (int)(dphase
);
950 dsp::voice
*drawbar_organ::alloc_voice()
952 block_voice
<organ_voice
> *v
= new block_voice
<organ_voice
>();
953 v
->parameters
= parameters
;
957 void drawbar_organ::percussion_note_on(int note
, int vel
)
959 percussion
.perc_note_on(note
, vel
);
962 void drawbar_organ::setup(int sr
)
964 basic_synth::setup(sr
);
965 percussion
.setup(sr
);
966 parameters
->cutoff
= 0;
968 global_vibrato
.reset();
971 bool drawbar_organ::check_percussion() {
972 switch(dsp::fastf2i_drm(parameters
->percussion_trigger
))
974 case organ_voice_base::perctrig_first
:
975 return active_voices
.empty();
976 case organ_voice_base::perctrig_each
:
979 case organ_voice_base::perctrig_eachplus
:
980 return !percussion
.get_noticable();
981 case organ_voice_base::perctrig_polyphonic
:
986 void drawbar_organ::pitch_bend(int amt
)
988 parameters
->pitch_bend
= pow(2.0, (amt
* parameters
->pitch_bend_range
) / (1200.0 * 8192.0));
989 for (voice_array::iterator i
= active_voices
.begin(); i
!= active_voices
.end(); i
++)
991 organ_voice
*v
= dynamic_cast<organ_voice
*>(*i
);
994 percussion
.update_pitch();
997 void organ_audio_module::execute(int cmd_no
)
1007 void organ_voice_base::perc_note_on(int note
, int vel
)
1010 released_ref
= false;
1012 if (parameters
->percussion_level
> 0)
1013 pamp
.set(1.0f
+ (vel
- 127) * parameters
->percussion_vel2amp
/ 127.0);
1015 float (*kt
)[2] = parameters
->percussion_keytrack
;
1016 // assume last point (will be put there by padding)
1017 fm_keytrack
= kt
[ORGAN_KEYTRACK_POINTS
- 1][1];
1018 // yes binary search would be nice if we had more than those crappy 4 points
1019 for (int i
= 0; i
< ORGAN_KEYTRACK_POINTS
- 1; i
++)
1021 float &lower
= kt
[i
][0], upper
= kt
[i
+ 1][0];
1022 if (note
>= lower
&& note
< upper
)
1024 fm_keytrack
= kt
[i
][1] + (note
- lower
) * (kt
[i
+ 1][1] - kt
[i
][1]) / (upper
- lower
);
1028 fm_amp
.set(fm_keytrack
* (1.0f
+ (vel
- 127) * parameters
->percussion_vel2fm
/ 127.0));
1031 char *organ_audio_module::configure(const char *key
, const char *value
)
1033 if (!strcmp(key
, "map_curve"))
1036 value
= "2\n0 1\n1 1\n";
1037 var_map_curve
= value
;
1038 stringstream
ss(value
);
1045 for (i
= 0; i
< points
; i
++)
1047 static const int whites
[] = { 0, 2, 4, 5, 7, 9, 11 };
1049 int wkey
= (int)(x
* 71);
1050 x
= whites
[wkey
% 7] + 12 * (wkey
/ 7);
1051 parameters
->percussion_keytrack
[i
][0] = x
;
1052 parameters
->percussion_keytrack
[i
][1] = y
;
1053 // cout << "(" << x << ", " << y << ")" << endl;
1056 // pad with constant Y
1057 for (; i
< ORGAN_KEYTRACK_POINTS
; i
++) {
1058 parameters
->percussion_keytrack
[i
][0] = x
;
1059 parameters
->percussion_keytrack
[i
][1] = y
;
1063 cout
<< "Set unknown configure value " << key
<< " to " << value
<< endl
;
1067 void organ_audio_module::send_configures(send_configure_iface
*sci
)
1069 sci
->send_configure("map_curve", var_map_curve
.c_str());
1072 void organ_audio_module::deactivate()
1077 void drawbar_organ::render_separate(float *output
[], int nsamples
)
1079 float buf
[MAX_SAMPLE_RUN
][2];
1080 dsp::zero(&buf
[0][0], 2 * nsamples
);
1081 basic_synth::render_to(buf
, nsamples
);
1082 if (dsp::fastf2i_drm(parameters
->lfo_mode
) == organ_voice_base::lfomode_global
)
1084 for (int i
= 0; i
< nsamples
; i
+= 64)
1085 global_vibrato
.process(parameters
, buf
+ i
, std::min(64, nsamples
- i
), sample_rate
);
1087 if (percussion
.get_active())
1088 percussion
.render_percussion_to(buf
, nsamples
);
1089 float gain
= parameters
->master
* (1.0 / 8);
1090 eq_l
.set(parameters
->bass_freq
, parameters
->bass_gain
, parameters
->treble_freq
, parameters
->treble_gain
, sample_rate
);
1091 eq_r
.copy_coeffs(eq_l
);
1092 for (int i
=0; i
<nsamples
; i
++) {
1093 output
[0][i
] = gain
*eq_l
.process(buf
[i
][0]);
1094 output
[1][i
] = gain
*eq_r
.process(buf
[i
][1]);