[SCM] calf/master: + Monosynth: add Scale Detune knob, replace Skewed waveforms, simplify PW interpolation

js at users.alioth.debian.org js at users.alioth.debian.org
Tue May 7 15:39:29 UTC 2013


The following commit has been merged in the master branch:
commit a72a087aebe77b4ee4a57a8e9d53e8b6e410fabb
Author: Krzysztof Foltman <wdev at foltman.com>
Date:   Sun Mar 22 19:23:16 2009 +0000

    + Monosynth: add Scale Detune knob, replace Skewed waveforms, simplify PW interpolation

diff --git a/gui/gui-monosynth.xml b/gui/gui-monosynth.xml
index b85c12c..c484732 100644
--- a/gui/gui-monosynth.xml
+++ b/gui/gui-monosynth.xml
@@ -55,9 +55,14 @@
           <hbox>
             <vbox>
               <label param="o12_detune"/>
-              <knob param="o12_detune" expand="0" fill="0"/>
+              <knob param="o12_detune"/>
               <value param="o12_detune"/>
             </vbox>
+            <vbox>
+              <label param="scale_detune"/>
+              <knob param="scale_detune"/>
+              <value param="scale_detune"/>
+            </vbox>
             <align>
               <vbox>
                 <label param="phase_mode"/>
diff --git a/src/calf/metadata.h b/src/calf/metadata.h
index 0398730..6c20017 100644
--- a/src/calf/metadata.h
+++ b/src/calf/metadata.h
@@ -99,7 +99,7 @@ struct monosynth_metadata: public plugin_metadata<monosynth_metadata>
     enum { flt_lp12, flt_lp24, flt_2lp12, flt_hp12, flt_lpbr, flt_hpbr, flt_bp6, flt_2bp6 };
     enum { par_wave1, par_wave2, par_pw1, par_pw2, par_detune, par_osc2xpose, par_oscmode, par_oscmix, par_filtertype, par_cutoff, par_resonance, par_cutoffsep, par_envmod, par_envtores, par_envtoamp, par_attack, par_decay, par_sustain, par_fade, par_release, 
         par_keyfollow, par_legato, par_portamento, par_vel2filter, par_vel2amp, par_master, par_pwhlrange, 
-        par_lforate, par_lfodelay, par_lfofilter, par_lfopitch, par_lfopw, par_mwhl_lfo,
+        par_lforate, par_lfodelay, par_lfofilter, par_lfopitch, par_lfopw, par_mwhl_lfo, par_scaledetune,
         param_count };
     enum { in_count = 0, out_count = 2, support_midi = true, require_midi = true, rt_capable = true };
     enum { step_size = 64, step_shift = 6 };
diff --git a/src/calf/modules_synths.h b/src/calf/modules_synths.h
index cc76545..80a7c40 100644
--- a/src/calf/modules_synths.h
+++ b/src/calf/modules_synths.h
@@ -55,11 +55,22 @@ public:
     dsp::onepole<float> phaseshifter;
     dsp::biquad_d1_lerp<float> filter;
     dsp::biquad_d1_lerp<float> filter2;
-    int wave1, wave2, prev_wave1, prev_wave2, filter_type, last_filter_type;
+    /// Waveform number - OSC1
+    int wave1;
+    /// Waveform number - OSC2
+    int wave2;
+    /// Last used waveform number - OSC1
+    int prev_wave1;
+    /// Last used waveform number - OSC2
+    int prev_wave2;
+    int filter_type, last_filter_type;
     float freq, start_freq, target_freq, cutoff, decay_factor, fgain, fgain_delta, separation;
     float detune, xpose, xfade, ampctl, fltctl, queue_vel;
     float odcr, porta_time, lfo_bend, lfo_clock, last_lfov, modwheel_value;
-    float last_pwoffset1, last_pwoffset2;
+    /// Last value of phase shift for pulse width emulation for OSC1
+    int32_t last_pwshift1;
+    /// Last value of phase shift for pulse width emulation for OSC2
+    int32_t last_pwshift2;
     int queue_note_on, stop_count, modwheel_value_int;
     int legato;
     dsp::adsr envelope;
@@ -86,6 +97,8 @@ public:
     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]);
         osc1.set_freq(freq * (1 - detune_scaled) * inertia_pitchbend.get_last() * lfo_bend, srate);
         osc2.set_freq(freq * (1 + detune_scaled)  * inertia_pitchbend.get_last() * lfo_bend * xpose, srate);
     }
diff --git a/src/modules.cpp b/src/modules.cpp
index 41c06b4..ac0c4a1 100644
--- a/src/modules.cpp
+++ b/src/modules.cpp
@@ -299,6 +299,8 @@ CALF_PORT_PROPS(monosynth) = {
     { 100,        0, 1200,  0, PF_FLOAT | PF_SCALE_QUAD | PF_CTL_KNOB | PF_UNIT_CENTS, NULL, "lfo2pitch", "LFO->Pitch" },
     { 0,          0,    1,  0.1, PF_FLOAT | PF_SCALE_PERC | PF_CTL_KNOB, NULL, "lfo2pw", "LFO->PW" },
     { 1,          0,    1,  0.1, PF_FLOAT | PF_SCALE_PERC | PF_CTL_KNOB, NULL, "mwhl2lfo", "ModWheel->LFO" },
+
+    { 1,          0,    1,    0, PF_FLOAT | PF_SCALE_PERC | PF_CTL_KNOB, NULL, "scale_detune", "Scale Detune" },
 };
 
 ////////////////////////////////////////////////////////////////////////////
diff --git a/src/monosynth.cpp b/src/monosynth.cpp
index 47f059e..b36ab37 100644
--- a/src/monosynth.cpp
+++ b/src/monosynth.cpp
@@ -53,6 +53,7 @@ void monosynth_audio_module::activate() {
     filter.reset();
     filter2.reset();
     stack.clear();
+    last_pwshift1 = last_pwshift2 = 0;
 }
 
 waveform_family<MONOSYNTH_WAVE_BITS> *monosynth_audio_module::waves;
@@ -90,7 +91,6 @@ void monosynth_audio_module::precalculate_waves(progress_report_iface *reporter)
         data[i] = (float)(i < (64 * S / 2048)? -1.f : 1.f);
     waves[wave_pulse].make(bl, data);
 
-    // XXXKF sure this is a waste of space, this will be fixed some day by better bandlimiter
     for (int i = 0 ; i < S; i++)
         data[i] = (float)sin(i * M_PI / HS);
     waves[wave_sine].make(bl, data);
@@ -111,11 +111,11 @@ void monosynth_audio_module::precalculate_waves(progress_report_iface *reporter)
     waves[wave_varistep].make(bl, data);
 
     for (int i = 0; i < S; i++) {
-        data[i] = (min(1.f, (float)(i / 64.f))) * (1.0 - i * 1.0 / S) * (-1 + fmod (i * i / 262144.0, 2.0));
+        data[i] = (min(1.f, (float)(i / 64.f))) * (1.0 - i * 1.0 / S) * (-1 + fmod (i * i * 8/ (S * S * 1.0), 2.0));
     }
     waves[wave_skewsaw].make(bl, data);
     for (int i = 0; i < S; i++) {
-        data[i] = (min(1.f, (float)(i / 64.f))) * (1.0 - i * 1.0 / S) * (fmod (i * i / 262144.0, 2.0) < 1.0 ? -1.0 : +1.0);
+        data[i] = (min(1.f, (float)(i / 64.f))) * (1.0 - i * 1.0 / S) * (fmod (i * i * 8/ (S * S * 1.0), 2.0) < 1.0 ? -1.0 : +1.0);
     }
     waves[wave_skewsqr].make(bl, data);
 
@@ -190,8 +190,9 @@ bool monosynth_audio_module::get_graph(int index, int subindex, float *data, int
         float value = *params[index];
         int wave = dsp::clip(dsp::fastf2i_drm(value), 0, (int)wave_count - 1);
 
-        float offset = *params[index == par_wave1 ? par_pw1 : par_pw2];
-        uint32_t shift = (int32_t)(0x78000000 * clip11(offset + (running ? last_lfov : 0) * *params[par_lfopw]));
+        uint32_t shift = index == par_wave1 ? last_pwshift1 : last_pwshift2;
+        if (!running)
+            shift = (int32_t)(0x78000000 * (*params[index == par_wave1 ? par_pw1 : par_pw2]));
         int flag = (wave == wave_sqr);
                 
         shift = (flag ? S/2 : 0) + (shift >> (32 - MONOSYNTH_WAVE_BITS));
@@ -228,17 +229,17 @@ bool monosynth_audio_module::get_graph(int index, int subindex, float *data, int
 
 void monosynth_audio_module::calculate_buffer_oscs(float lfo)
 {
-    int32_t shift1 = (int32_t)(0x78000000 * dsp::clip11(last_pwoffset1 + last_lfov * *params[par_lfopw]));
-    int32_t shift2 = (int32_t)(0x78000000 * dsp::clip11(last_pwoffset2 + last_lfov * *params[par_lfopw]));
     int flag1 = (wave1 == wave_sqr);
     int flag2 = (wave2 == wave_sqr);
+    int32_t shift1 = last_pwshift1;
+    int32_t shift2 = last_pwshift2;
     int32_t shift_target1 = (int32_t)(0x78000000 * dsp::clip11(*params[par_pw1] + lfo * *params[par_lfopw]));
     int32_t shift_target2 = (int32_t)(0x78000000 * dsp::clip11(*params[par_pw2] + lfo * *params[par_lfopw]));
-    int32_t shift_delta1 = (shift_target1 - shift1) >> step_shift;
-    int32_t shift_delta2 = (shift_target2 - shift2) >> step_shift;
+    int32_t shift_delta1 = ((shift_target1 >> 1) - (last_pwshift1 >> 1)) >> (step_shift - 1);
+    int32_t shift_delta2 = ((shift_target2 >> 1) - (last_pwshift2 >> 1)) >> (step_shift - 1);
     last_lfov = lfo;
-    last_pwoffset1 = *params[par_pw1];
-    last_pwoffset2 = *params[par_pw2];
+    last_pwshift1 = shift_target1;
+    last_pwshift2 = shift_target2;
     
     shift1 += (flag1 << 31);
     shift2 += (flag2 << 31);

-- 
calf audio plugins packaging



More information about the pkg-multimedia-commits mailing list