LMMS
Loading...
Searching...
No Matches
organ.h
Go to the documentation of this file.
1/* Calf DSP Library
2 * Drawbar organ emulator.
3 *
4 * Copyright (C) 2007 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 02111-1307, USA.
20 */
21
22#ifndef __CALF_ORGAN_H
23#define __CALF_ORGAN_H
24
25#include "audio_fx.h"
26#include "envelope.h"
27#include "metadata.h"
28#include "osc.h"
29#include "synth.h"
30
31#define ORGAN_KEYTRACK_POINTS 4
32
33namespace dsp
34{
35
37 enum { FilterCount = 2, EnvCount = 3 };
45
50
52 // these parameters are binary-copied from control ports (order is important!)
53
54 float drawbars[9];
55 float harmonics[9];
56 float waveforms[9];
57 float detune[9];
58 float phase[9];
59 float pan[9];
60 float routing[9];
61 float foldover;
76 float master;
77
80 float lfo_rate;
81 float lfo_amt;
82 float lfo_wet;
83 float lfo_phase;
84 float lfo_mode;
85 float lfo_type;
86
89
90 float polyphony;
91
92 float quad_env;
93
95
96 float bass_freq;
97 float bass_gain;
100
102
104 // these parameters are calculated
105
107 float multiplier[9];
109 float cutoff;
110 unsigned int foldvalue;
112
114
116
119};
120
121#define ORGAN_WAVE_BITS 12
122#define ORGAN_WAVE_SIZE 4096
123#define ORGAN_BIG_WAVE_BITS 17
124#define ORGAN_BIG_WAVE_SIZE 131072
126#define ORGAN_BIG_WAVE_SHIFT 5
127
129{
130public:
133public:
135protected:
138
139 int note;
152
153 organ_voice_base(organ_parameters *_parameters, int &_sample_rate_ref, bool &_released_ref);
154
155 inline float wave(float *data, dsp::fixed_point<int, 20> ph) {
156 return ph.lerp_table_lookup_float(data);
157 }
158 inline float big_wave(float *data, dsp::fixed_point<int64_t, 20> &ph) {
159 // wrap to fit within the wave
161 }
162public:
163 static inline small_wave_family &get_wave(int wave) {
164 return (*waves)[wave];
165 }
166 static inline big_wave_family &get_big_wave(int wave) {
167 return (*big_waves)[wave];
168 }
170 void update_pitch();
171 // this doesn't really have a voice interface
172 void render_percussion_to(float (*buf)[2], int nsamples);
173 void perc_note_on(int note, int vel);
174 void perc_note_off(int note, int vel);
175 void perc_reset();
176};
177
180{
181protected:
182 enum { VibratoSize = 6 };
186public:
187 void reset();
188 void process(organ_parameters *parameters, float (*data)[2], unsigned int len, float sample_rate);
189};
190
205{
206protected:
207 enum { ScannerSize = 18 };
211public:
212 void reset();
213 void process(organ_parameters *parameters, float (*data)[2], unsigned int len, float sample_rate);
214};
215
217protected:
219 union {
222 };
228 float velocity;
233
234public:
242
243 void reset();
244 void note_on(int note, int vel);
245 void note_off(int /* vel */);
246 virtual float get_priority() { return stolen ? 20000 : (perc_released ? 1 : (sostenuto ? 200 : 100)); }
247 virtual void steal();
248 void render_block(int current_snapshot);
249
250 virtual int get_current_note() {
251 return note;
252 }
253 virtual bool get_active() {
254 // printf("note %d getactive %d use_percussion %d pamp active %d\n", note, amp.get_active(), use_percussion(), pamp.get_active());
255 return (note != -1) && (amp.get_active() || (use_percussion() && pamp.get_active()));
256 }
257 void update_pitch();
258 inline bool use_percussion()
259 {
260 return dsp::fastf2i_drm(parameters->percussion_trigger) == perctrig_polyphonic && parameters->percussion_level > 0;
261 }
262};
263
266public:
269
271 : organ_voice_base(_parameters, sample_rate, released)
272 , released(false)
273 {
274 }
275
276 bool get_active() {
277 return (note != -1) && pamp.get_active();
278 }
280 return (note != -1) && (pamp.get() > 0.2 * parameters->percussion_level);
281 }
282 void setup(int sr) {
283 sample_rate = sr;
284 }
285};
286
292
294 : parameters(_parameters)
295 , percussion(_parameters) {
296 init_voices(36);
297 }
298 void render_separate(float *output[], int nsamples);
300 virtual void percussion_note_on(int note, int vel);
301 virtual void params_changed() = 0;
302 virtual void setup(int sr);
303 void update_params();
308 void pitch_bend(int amt);
309 virtual bool check_percussion();
310};
311
312};
313
314namespace calf_plugins {
315
316struct organ_audio_module: public audio_module<organ_metadata>, public dsp::drawbar_organ, public line_graph_iface
317{
318public:
319 using drawbar_organ::note_on;
320 using drawbar_organ::note_off;
321 using drawbar_organ::control_change;
322 using drawbar_organ::pitch_bend;
323 enum { param_count = drawbar_organ::param_count};
327 mutable bool redraw;
328
330 std::string var_map_curve;
331
333
335
337 srate = sr;
338 }
339 void params_changed();
340
341 void activate();
342 void deactivate();
343 uint32_t process(uint32_t offset, uint32_t nsamples, uint32_t inputs_mask, uint32_t outputs_mask);
345 bool is_cv(int param_no) const { return false; }
347 bool is_noisy(int param_no) const { return true; }
348 void execute(int cmd_no);
349 bool get_graph(int index, int subindex, int phase, float *data, int points, cairo_iface *context, int *mode) const;
350 bool get_layers(int index, int generation, unsigned int &layers) const;
351 char *configure(const char *key, const char *value);
353 uint32_t message_run(const void *valid_inputs, void *output_ports);
354public:
355 // overrides
356 virtual void note_on(int channel, int note, int velocity) { if (*params[par_midi] && channel != *params[par_midi]) return; dsp::drawbar_organ::note_on(note, velocity); }
357 virtual void note_off(int channel, int note, int velocity) { if (*params[par_midi] && channel != *params[par_midi]) return; dsp::drawbar_organ::note_off(note, velocity); }
358 virtual void control_change(int channel, int controller, int value) { if (*params[par_midi] && channel != *params[par_midi]) return; dsp::drawbar_organ::control_change(controller, value); }
359 virtual void pitch_bend(int channel, int value) { if (*params[par_midi] && channel != *params[par_midi]) return; dsp::drawbar_organ::pitch_bend(value); }
360};
361
362};
363
364#endif
#define NULL
Definition CarlaBridgeFormat.cpp:30
Controller controller
Definition main.C:5
float * params[organ_metadata::param_count]
Definition giface.h:527
Definition envelope.h:33
Definition primitives.h:281
Algorithm for a constant time linear ramp.
Definition inertia.h:67
Definition fixed_point.h:38
U lerp_table_lookup_float_mask(U *data, unsigned int mask) const
Definition fixed_point.h:238
U lerp_table_lookup_float(U *data) const
Definition fixed_point.h:232
Definition inertia.h:108
Algorithm for a constant time linear ramp.
Definition inertia.h:29
Definition onepole.h:35
A simple (and bad) simulation of scanner vibrato based on a series of modulated allpass filters.
Definition organ.h:180
float lfo_phase
Definition organ.h:184
dsp::onepole< float > vibrato[2]
Definition organ.h:185
float vibrato_y1[VibratoSize][2]
Definition organ.h:183
void process(organ_parameters *parameters, float(*data)[2], unsigned int len, float sample_rate)
Definition organ.cpp:581
float vibrato_x1[VibratoSize][2]
Definition organ.h:183
@ VibratoSize
Definition organ.h:182
void reset()
Definition organ.cpp:573
dsp::fixed_point< int64_t, 20 > modphase
Definition organ.h:146
float rel_age_const
pamp per-sample (linear) step during release stage (calculated on release so that it will take 30ms f...
Definition organ.h:151
static big_wave_family(* big_waves)[wave_count_big]
Definition organ.h:137
dsp::decay amp
Definition organ.h:140
organ_parameters * parameters
Definition organ.h:134
waveform_family< ORGAN_WAVE_BITS > small_wave_family
Definition organ.h:131
static small_wave_family(* waves)[wave_count_small]
Definition organ.h:136
void render_percussion_to(float(*buf)[2], int nsamples)
Definition organ.cpp:516
dsp::fixed_point< int64_t, 20 > moddphase
Definition organ.h:146
waveform_family< ORGAN_BIG_WAVE_BITS > big_wave_family
Definition organ.h:132
bool & released_ref
Definition organ.h:149
organ_voice_base(organ_parameters *_parameters, int &_sample_rate_ref, bool &_released_ref)
Definition organ.cpp:508
float fm_keytrack
Definition organ.h:147
int & sample_rate_ref
Definition organ.h:148
int note
Definition organ.h:139
void perc_reset()
Definition organ.cpp:562
static small_wave_family & get_wave(int wave)
Definition organ.h:163
dsp::fixed_point< int64_t, 20 > pphase
Definition organ.h:145
float wave(float *data, dsp::fixed_point< int, 20 > ph)
Definition organ.h:155
void perc_note_on(int note, int vel)
Definition organ.cpp:1010
static big_wave_family & get_big_wave(int wave)
Definition organ.h:166
static void precalculate_waves(calf_plugins::progress_report_iface *reporter)
Definition organ.cpp:253
dsp::decay pamp
percussion FM carrier amplitude envelope
Definition organ.h:142
float big_wave(float *data, dsp::fixed_point< int64_t, 20 > &ph)
Definition organ.h:158
dsp::decay fm_amp
percussion FM modulator amplitude envelope
Definition organ.h:144
dsp::fixed_point< int64_t, 20 > dpphase
Definition organ.h:145
void update_pitch()
Definition organ.cpp:246
void perc_note_off(int note, int vel)
float aux_buffers[3][BlockSize][Channels]
Definition organ.h:221
dsp::inertia< dsp::linear_ramp > expression
Definition organ.h:226
dsp::fixed_point< int64_t, 52 > dphase
Definition organ.h:223
void note_off(int)
a note was released
Definition organ.cpp:906
dsp::biquad_d1 filterR[2]
Definition organ.h:224
virtual bool get_active()
check if voice can be removed from active voice list
Definition organ.h:253
virtual float get_priority()
Definition organ.h:246
dsp::inertia< dsp::exponential_ramp > inertia_pitchbend
Definition organ.h:232
virtual void steal()
very fast note off
Definition organ.cpp:919
dsp::biquad_d1 filterL[2]
Definition organ.h:224
float velocity
Definition organ.h:228
bool perc_released
Definition organ.h:229
bool use_percussion()
Definition organ.h:258
void render_block(int current_snapshot)
Definition organ.cpp:707
void reset()
reset voice to default state (used when a voice is to be reused)
Definition organ.cpp:926
dsp::fixed_point< int64_t, 52 > phase
Definition organ.h:223
organ_voice()
Definition organ.h:235
scanner_vibrato vibrato
Definition organ.h:227
float output_buffer[BlockSize][Channels]
Definition organ.h:220
void note_on(int note, int vel)
a note was pressed
Definition organ.cpp:885
virtual int get_current_note()
return the note used by this voice
Definition organ.h:250
adsr envs[EnvCount]
Definition organ.h:225
bool finishing
The envelopes have ended and the voice is in final fadeout stage.
Definition organ.h:231
void update_pitch()
Definition organ.cpp:701
@ EnvCount
Definition organ.h:218
@ BlockSize
Definition organ.h:218
@ MaxSampleRun
Definition organ.h:218
@ Channels
Definition organ.h:218
@ FilterCount
Definition organ.h:218
Not a true voice, just something with similar-ish interface.
Definition organ.h:265
bool get_active()
Definition organ.h:276
bool released
Definition organ.h:268
bool get_noticable()
Definition organ.h:279
int sample_rate
Definition organ.h:267
percussion_voice(organ_parameters *_parameters)
Definition organ.h:270
void setup(int sr)
Definition organ.h:282
Definition organ.h:205
dsp::biquad_d2 scanner[ScannerSize]
Definition organ.h:209
@ ScannerSize
Definition organ.h:207
float lfo_phase
Definition organ.h:208
organ_vibrato legacy
Definition organ.h:210
void reset()
Definition organ.cpp:620
void process(organ_parameters *parameters, float(*data)[2], unsigned int len, float sample_rate)
Definition organ.cpp:628
Definition audio_fx.h:485
Definition synth.h:105
int sample_rate
Definition synth.h:107
bool stolen
Definition synth.h:108
bool sostenuto
Definition synth.h:108
static PuglViewHint int value
Definition pugl.h:1708
JSAMPIMAGE data
Definition jpeglib.h:945
unsigned int uint32_t
Definition mid.cpp:100
Definition benchmark.cpp:53
@ MAX_SAMPLE_RUN
Definition giface.h:38
Definition audio_fx.h:36
T sine_table< T, N, Multiplier >::data[N+1]
Definition primitives.h:442
int fastf2i_drm(float f)
fast float to int conversion using default rounding mode
Definition primitives.h:445
#define false
Definition ordinals.h:83
#define ORGAN_KEYTRACK_POINTS
Definition organ.h:31
#define ORGAN_BIG_WAVE_SIZE
Definition organ.h:124
png_structrp int mode
Definition png.h:1139
Definition giface.h:160
'provides live line graph values' interface
Definition giface.h:198
uint32_t message_run(const void *valid_inputs, void *output_ports)
Definition organ.cpp:121
void params_changed()
Called when params are changed (before processing).
Definition organ.cpp:67
bool get_graph(int index, int subindex, int phase, float *data, int points, cairo_iface *context, int *mode) const
Definition organ.cpp:83
dsp::organ_parameters par_values
Definition organ.h:324
uint32_t srate
Definition organ.h:325
virtual void control_change(int channel, int controller, int value)
Handle MIDI Control Change.
Definition organ.h:358
bool panic_flag
Definition organ.h:326
virtual void pitch_bend(int channel, int value)
Definition organ.h:359
char * configure(const char *key, const char *value)
DSSI configure call.
Definition organ.cpp:1034
organ_audio_module()
Definition organ.cpp:36
@ param_count
Definition organ.h:323
void set_sample_rate(uint32_t sr)
Set sample rate for the plugin.
Definition organ.h:336
void activate()
LADSPA-esque activate function, except it is called after ports are connected, not before.
Definition organ.cpp:42
uint32_t process(uint32_t offset, uint32_t nsamples, uint32_t inputs_mask, uint32_t outputs_mask)
The audio processing loop; assumes numsamples <= MAX_SAMPLE_RUN, for larger buffers,...
Definition organ.cpp:54
std::string var_map_curve
Value for configure variable map_curve.
Definition organ.h:330
void send_configures(send_configure_iface *)
Send all understood configure vars (none by default).
Definition organ.cpp:1070
virtual void note_on(int channel, int note, int velocity)
Handle MIDI Note On.
Definition organ.h:356
bool is_cv(int param_no) const
No CV inputs for now.
Definition organ.h:345
virtual void note_off(int channel, int note, int velocity)
Handle MIDI Note Off.
Definition organ.h:357
void deactivate()
LADSPA-esque deactivate function.
Definition organ.cpp:1075
bool is_noisy(int param_no) const
Practically all the stuff here is noisy.
Definition organ.h:347
void post_instantiate(uint32_t sample_rate)
Called after instantiating (after all the feature pointers are set - including interfaces like progre...
Definition organ.cpp:48
bool redraw
Definition organ.h:327
bool get_layers(int index, int generation, unsigned int &layers) const
Definition organ.cpp:78
void execute(int cmd_no)
Execute menu command with given number.
Definition organ.cpp:1000
Definition metadata.h:856
@ par_midi
Definition metadata.h:886
@ wave_count_big
Definition metadata.h:905
@ wave_count_small
Definition metadata.h:895
@ perctrig_polyphonic
Definition metadata.h:936
'may receive configure variables' interface
Definition giface.h:291
Definition synth.h:278
int sample_rate
Current sample rate.
Definition synth.h:282
virtual void control_change(int ctl, int val)
Definition synth.cpp:156
virtual void note_off(int note, int vel)
Definition synth.cpp:123
void init_voices(int count)
Definition synth.cpp:26
virtual void note_on(int note, int vel)
Definition synth.cpp:102
Definition biquad.h:346
Definition biquad.h:430
Definition organ.h:287
organ_parameters * parameters
Definition organ.h:288
percussion_voice percussion
Definition organ.h:289
virtual void percussion_note_on(int note, int vel)
Definition organ.cpp:960
virtual void setup(int sr)
Definition organ.cpp:965
void control_change(int controller, int value)
Definition organ.h:304
two_band_eq eq_l
Definition organ.h:291
void pitch_bend(int amt)
amt = -8192 to 8191
Definition organ.cpp:989
dsp::voice * alloc_voice()
Definition organ.cpp:953
drawbar_organ(organ_parameters *_parameters)
Definition organ.h:293
void render_separate(float *output[], int nsamples)
Definition organ.cpp:1080
two_band_eq eq_r
Definition organ.h:291
virtual bool check_percussion()
Definition organ.cpp:974
scanner_vibrato global_vibrato
Definition organ.h:290
virtual void params_changed()=0
void update_params()
Definition organ.cpp:940
float envmod[organ_parameters::EnvCount]
Definition organ.h:42
Definition organ.h:36
organ_env_parameters envs[organ_parameters::EnvCount]
Definition organ.h:79
float lfo_type
Definition organ.h:85
float pan[9]
Definition organ.h:59
float percussion_trigger
Definition organ.h:72
float bass_freq
Definition organ.h:96
float bass_gain
Definition organ.h:97
float polyphony
Definition organ.h:90
double perc_decay_const
Definition organ.h:106
float global_transpose
Definition organ.h:87
float percussion_keytrack[ORGAN_KEYTRACK_POINTS][2]
Definition organ.h:113
float percussion_vel2amp
Definition organ.h:66
float master
Definition organ.h:76
float treble_freq
Definition organ.h:98
float percussion_vel2fm
Definition organ.h:71
float treble_gain
Definition organ.h:99
unsigned int foldvalue
Definition organ.h:110
float percussion_harmonic
Definition organ.h:65
float phase[9]
Definition organ.h:58
float pitch_bend_range
Definition organ.h:94
float lfo_mode
Definition organ.h:84
float waveforms[9]
Definition organ.h:56
float cutoff
Definition organ.h:109
float percussion_wave
Definition organ.h:64
float harmonics[9]
Definition organ.h:55
float routing[9]
Definition organ.h:60
float percussion_fm_depth
Definition organ.h:68
@ EnvCount
Definition organ.h:37
@ FilterCount
Definition organ.h:37
float global_detune
Definition organ.h:88
float percussion_fm_harmonic
Definition organ.h:70
float percussion_fm_wave
Definition organ.h:69
float multiplier[9]
Definition organ.h:107
float filter1_type
Definition organ.h:75
float detune[9]
Definition organ.h:57
float percussion_stereo
Definition organ.h:73
float foldover
Definition organ.h:61
int phaseshift[9]
Definition organ.h:108
int get_percussion_wave()
Definition organ.h:117
float lfo_amt
Definition organ.h:81
float lfo_phase
Definition organ.h:83
float percussion_time
Definition organ.h:62
float pitch_bend
Definition organ.h:111
float lfo_wet
Definition organ.h:82
float percussion_fm_time
Definition organ.h:67
organ_filter_parameters filters[organ_parameters::FilterCount]
Definition organ.h:78
float drawbars[9]
Definition organ.h:54
double perc_fm_decay_const
Definition organ.h:106
float quad_env
Definition organ.h:92
float lfo_rate
Definition organ.h:80
float filter_chain
Definition organ.h:74
organ_parameters()
Definition organ.h:115
int get_percussion_fm_wave()
Definition organ.h:118
float dummy_mapcurve
Definition organ.h:101
float percussion_level
Definition organ.h:63
Set of bandlimited wavetables.
Definition osc.h:164
ZCONST char * key
Definition crypt.c:587