From b9c4451d0956416d7c656653422c9adfd617611e Mon Sep 17 00:00:00 2001 From: Krzysztof Foltman Date: Tue, 29 Sep 2009 23:19:07 +0100 Subject: [PATCH] + Monosynth: code cleanup (move more things to .cpp file, ignore the negligible performance hit) (cherry picked from commit 24f4661a73fe39e70db8e74b9a5c1279859b6fb3) (cherry picked from commit 66a5ae5066e2e5a2150f06c6cc2e045e96e9a612) --- .../ladspa_effect/calf/calf/modules_synths.h | 32 +--------------- plugins/ladspa_effect/calf/calf/osc.h | 4 ++ plugins/ladspa_effect/calf/src/monosynth.cpp | 38 ++++++++++++++++++- 3 files changed, 43 insertions(+), 31 deletions(-) diff --git a/plugins/ladspa_effect/calf/calf/modules_synths.h b/plugins/ladspa_effect/calf/calf/modules_synths.h index 615d9a19b..090acbdca 100644 --- a/plugins/ladspa_effect/calf/calf/modules_synths.h +++ b/plugins/ladspa_effect/calf/calf/modules_synths.h @@ -110,39 +110,11 @@ public: inertia_pitchbend.set_inertia(pow(2.0, (value * *params[par_pwhlrange]) / (1200.0 * 8192.0))); } /// Update oscillator frequency based on base frequency, detune amount, pitch bend scaling factor and sample rate. - inline void set_frequency() - { - float detune_scaled = (detune - 1); // * log(freq / 440); - if (*params[par_scaledetune] > 0) - detune_scaled *= pow(20.0 / freq, *params[par_scaledetune]); - float p1 = 1, p2 = 1; - if (moddest[moddest_o1detune] != 0) - p1 = pow(2.0, moddest[moddest_o1detune] * (1.0 / 1200.0)); - if (moddest[moddest_o2detune] != 0) - p2 = pow(2.0, moddest[moddest_o2detune] * (1.0 / 1200.0)); - osc1.set_freq(freq * (1 - detune_scaled) * p1 * inertia_pitchbend.get_last() * lfo_bend, srate); - osc2.set_freq(freq * (1 + detune_scaled) * p2 * inertia_pitchbend.get_last() * lfo_bend * xpose, srate); - } + void set_frequency(); /// Handle control change messages. void control_change(int controller, int value); /// Update variables from control ports. - void params_changed() { - float sf = 0.001f; - envelope.set(*params[par_attack] * sf, *params[par_decay] * sf, std::min(0.999f, *params[par_sustain]), *params[par_release] * sf, srate / step_size, *params[par_fade] * sf); - filter_type = dsp::fastf2i_drm(*params[par_filtertype]); - decay_factor = odcr * 1000.0 / *params[par_decay]; - separation = pow(2.0, *params[par_cutoffsep] / 1200.0); - wave1 = dsp::clip(dsp::fastf2i_drm(*params[par_wave1]), 0, (int)wave_count - 1); - wave2 = dsp::clip(dsp::fastf2i_drm(*params[par_wave2]), 0, (int)wave_count - 1); - detune = pow(2.0, *params[par_detune] / 1200.0); - xpose = pow(2.0, *params[par_osc2xpose] / 12.0); - xfade = *params[par_oscmix]; - legato = dsp::fastf2i_drm(*params[par_legato]); - master.set_inertia(*params[par_master]); - set_frequency(); - if (wave1 != prev_wave1 || wave2 != prev_wave2) - lookup_waveforms(); - } + void params_changed(); void activate(); void deactivate(); void post_instantiate() diff --git a/plugins/ladspa_effect/calf/calf/osc.h b/plugins/ladspa_effect/calf/calf/osc.h index 166f579a5..36c19fe3c 100644 --- a/plugins/ladspa_effect/calf/calf/osc.h +++ b/plugins/ladspa_effect/calf/calf/osc.h @@ -241,6 +241,10 @@ struct waveform_oscillator: public simple_oscillator { enum { SIZE = 1 << SIZE_BITS, MASK = SIZE - 1, SCALE = 1 << (32 - SIZE_BITS) }; float *waveform; + waveform_oscillator() + { + waveform = NULL; + } inline float get() { uint32_t wpos = phase >> (32 - SIZE_BITS); diff --git a/plugins/ladspa_effect/calf/src/monosynth.cpp b/plugins/ladspa_effect/calf/src/monosynth.cpp index ef64c6f99..7c1b10927 100644 --- a/plugins/ladspa_effect/calf/src/monosynth.cpp +++ b/plugins/ladspa_effect/calf/src/monosynth.cpp @@ -622,7 +622,43 @@ void monosynth_audio_module::deactivate() stack.clear(); } -uint32_t monosynth_audio_module::process(uint32_t offset, uint32_t nsamples, uint32_t inputs_mask, uint32_t outputs_mask) { +void monosynth_audio_module::set_frequency() +{ + float detune_scaled = (detune - 1); // * log(freq / 440); + if (*params[par_scaledetune] > 0) + detune_scaled *= pow(20.0 / freq, *params[par_scaledetune]); + float p1 = 1, p2 = 1; + if (moddest[moddest_o1detune] != 0) + p1 = pow(2.0, moddest[moddest_o1detune] * (1.0 / 1200.0)); + if (moddest[moddest_o2detune] != 0) + p2 = pow(2.0, moddest[moddest_o2detune] * (1.0 / 1200.0)); + osc1.set_freq(freq * (1 - detune_scaled) * p1 * inertia_pitchbend.get_last() * lfo_bend, srate); + osc2.set_freq(freq * (1 + detune_scaled) * p2 * inertia_pitchbend.get_last() * lfo_bend * xpose, srate); +} + + +void monosynth_audio_module::params_changed() +{ + float sf = 0.001f; + envelope.set(*params[par_attack] * sf, *params[par_decay] * sf, std::min(0.999f, *params[par_sustain]), *params[par_release] * sf, srate / step_size, *params[par_fade] * sf); + filter_type = dsp::fastf2i_drm(*params[par_filtertype]); + decay_factor = odcr * 1000.0 / *params[par_decay]; + separation = pow(2.0, *params[par_cutoffsep] / 1200.0); + wave1 = dsp::clip(dsp::fastf2i_drm(*params[par_wave1]), 0, (int)wave_count - 1); + wave2 = dsp::clip(dsp::fastf2i_drm(*params[par_wave2]), 0, (int)wave_count - 1); + detune = pow(2.0, *params[par_detune] / 1200.0); + xpose = pow(2.0, *params[par_osc2xpose] / 12.0); + xfade = *params[par_oscmix]; + legato = dsp::fastf2i_drm(*params[par_legato]); + master.set_inertia(*params[par_master]); + set_frequency(); + if (wave1 != prev_wave1 || wave2 != prev_wave2) + lookup_waveforms(); +} + + +uint32_t monosynth_audio_module::process(uint32_t offset, uint32_t nsamples, uint32_t inputs_mask, uint32_t outputs_mask) +{ if (!running && queue_note_on == -1) { for (uint32_t i = 0; i < nsamples / step_size; i++) envelope.advance();