[SCM] calf/master: + Filterclavier: added gain control for bandpasses

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


The following commit has been merged in the master branch:
commit 9e55b8492b7a87da6464379420fc19fde4d09069
Author: Hans Baier <hansfbaier at googlemail.com>
Date:   Thu Jan 22 15:35:37 2009 +0700

    + Filterclavier: added gain control for bandpasses

diff --git a/src/calf/audio_fx.h b/src/calf/audio_fx.h
index 65528b8..7bcfa01 100644
--- a/src/calf/audio_fx.h
+++ b/src/calf/audio_fx.h
@@ -599,12 +599,14 @@ public:
 class filter_module_iface
 {
 public:
-    virtual void  calculate_filter(float freq, float q, int mode) = 0;
+    virtual void  calculate_filter(float freq, float q, int mode, float gain = 1.0) = 0;
     virtual void  filter_activate() = 0;
+    virtual void  sanitize() = 0;
     virtual int   process_channel(uint16_t channel_no, float *in, float *out, uint32_t numsamples, int inmask) = 0;
     virtual float freq_gain(int subindex, float freq, float srate) = 0;
 };
 
+
 class biquad_filter_module: public filter_module_iface
 {
 private:
@@ -614,17 +616,26 @@ private:
 public:    
     uint32_t srate;
     
+    enum { mode_12db_lp = 0, mode_24db_lp = 1, mode_36db_lp = 2, 
+           mode_12db_hp = 3, mode_24db_hp = 4, mode_36db_hp = 5,
+           mode_12db_bp = 6, mode_24db_bp = 7, mode_36db_bp = 8,
+           mode_count = 9
+    };
+    
 public:
     biquad_filter_module() : order(0) {}
     
-    void calculate_filter(float freq, float q, int mode)
+    void calculate_filter(float freq, float q, int mode, float gain = 1.0)
     {
-        if (mode < 3) {
+        if (mode <= mode_36db_lp) {
             order = mode + 1;
-            left[0].set_lp_rbj(freq, pow(q, 1.0 / order), srate);
-        } else {
+            left[0].set_lp_rbj(freq, pow(q, 1.0 / order), srate, gain);
+        } else if ( mode_12db_hp <= mode && mode <= mode_36db_hp ) {
             order = mode - 2;
-            left[0].set_hp_rbj(freq, pow(q, 1.0 / order), srate);
+            left[0].set_hp_rbj(freq, pow(q, 1.0 / order), srate, gain);
+        } else { // mode_12db_bp <= mode <= mode_36db_bp
+            order = mode - 5;
+            left[0].set_bp_rbj(freq, pow(q, 1.0 / order), srate, gain);
         }
         
         right[0].copy_coeffs(left[0]);
@@ -642,6 +653,14 @@ public:
         }
     }
     
+    void  sanitize()
+    {
+        for (int i=0; i < order; i++) {
+            left[i].sanitize();
+            right[i].sanitize();
+        }
+    }
+    
     inline int process_channel(uint16_t channel_no, float *in, float *out, uint32_t numsamples, int inmask) {
         dsp::biquad_d1<float> *filter;
         switch (channel_no) {
@@ -708,7 +727,7 @@ public:
     {
         float level = 1.0;
         for (int j = 0; j < order; j++)
-            level *= left[j].freq_gain(freq, srate);                
+            level *= left[j].freq_gain(freq, srate);
         return level;
     }
 };
diff --git a/src/calf/modules.h b/src/calf/modules.h
index ffe6870..2753881 100644
--- a/src/calf/modules.h
+++ b/src/calf/modules.h
@@ -585,13 +585,14 @@ public:
     float *outs[Metadata::out_count];
     float *params[Metadata::param_count];
 
-    inertia<exponential_ramp> inertia_cutoff, inertia_resonance;
+    inertia<exponential_ramp> inertia_cutoff, inertia_resonance, inertia_gain;
     once_per_n timer;
     bool is_active;    
     
     filter_module_with_inertia()
     : inertia_cutoff(exponential_ramp(128), 20)
     , inertia_resonance(exponential_ramp(128), 20)
+    , inertia_gain(exponential_ramp(128), 1.0)
     , timer(128)
     {
         is_active = false;
@@ -610,9 +611,10 @@ public:
         if (inertia != inertia_cutoff.ramp.length()) {
             inertia_cutoff.ramp.set_length(inertia);
             inertia_resonance.ramp.set_length(inertia);
+            inertia_gain.ramp.set_length(inertia);
         }
         
-        FilterClass::calculate_filter(freq, q, mode);
+        FilterClass::calculate_filter(freq, q, mode, inertia_gain.get_last());
     }
     
     virtual void params_changed()
@@ -624,6 +626,7 @@ public:
     {
         inertia_cutoff.step();
         inertia_resonance.step();
+        inertia_gain.step();
         calculate_filter();
     }
     
diff --git a/src/calf/modules_dev.h b/src/calf/modules_dev.h
index 578f674..f9162c5 100644
--- a/src/calf/modules_dev.h
+++ b/src/calf/modules_dev.h
@@ -37,9 +37,19 @@ class filterclavier_audio_module:
     {        
         const float min_resonance;
         const float max_resonance;
+        const float min_gain;
+        const float max_gain;
+        
+        int last_note;
             
     public:    
-        filterclavier_audio_module() : min_resonance(0.707), max_resonance(20.0) {}
+        filterclavier_audio_module() 
+            : 
+                min_resonance(0.707), 
+                max_resonance(20.0),
+                min_gain(1.0),
+                max_gain(32.0),
+                last_note(-1) {}
         
         void params_changed()
         { 
@@ -65,20 +75,44 @@ class filterclavier_audio_module:
         /// MIDI control
         virtual void note_on(int note, int vel)
         {
+            last_note = note;
             inertia_filter_module::inertia_cutoff.set_inertia(
                     note_to_hz(note + *params[par_transpose], *params[par_detune]));
+
             inertia_filter_module::inertia_resonance.set_inertia( 
                     (float(vel) / 127.0) * (max_resonance - min_resonance)
                     + min_resonance);
+            
+            int   mode = dsp::fastf2i_drm(*params[par_mode]);
+            // for bandpasses: boost gain for velocities > 0
+            if ( (mode_12db_bp <= mode) && (mode <= mode_36db_bp) ) {
+                // gain for velocity 0:   1.0
+                // gain for velocity 127: 32.0
+                float mode_max_gain = max_gain;
+                // max_gain is right for mode_12db_bp
+                if (mode == mode_24db_bp)
+                    mode_max_gain /= 6.0;
+                if (mode == mode_36db_bp)
+                    mode_max_gain /= 10.5;
+                
+                inertia_filter_module::inertia_gain.set_inertia(
+                        (float(vel) / 127.0) * (mode_max_gain - min_gain) + min_gain);
+            } else {
+                inertia_filter_module::inertia_gain.set_inertia(min_gain);
+            }
+
             inertia_filter_module::calculate_filter();
         }
         
         virtual void note_off(int note, int vel)
         {
-            inertia_filter_module::inertia_resonance.set_inertia(min_resonance);
-            inertia_filter_module::calculate_filter();
-        }        
-        
+            if (note == last_note) {
+                inertia_filter_module::inertia_resonance.set_inertia(min_resonance);
+                inertia_filter_module::inertia_gain.set_inertia(min_gain);
+                inertia_filter_module::calculate_filter();
+            }
+        }
+
         bool get_graph(int index, int subindex, float *data, int points, cairo_iface *context);
         bool get_gridline(int index, int subindex, float &pos, bool &vertical, std::string &legend, cairo_iface *context);
     };
diff --git a/src/giface.cpp b/src/giface.cpp
index b047dce..c496ec1 100644
--- a/src/giface.cpp
+++ b/src/giface.cpp
@@ -298,7 +298,6 @@ static void send_graph_via_osc(osctl::osc_client &client, const std::string &add
     client.send(address, os);
 }
 
-#if USE_DSSI
 calf_plugins::dssi_feedback_sender::dssi_feedback_sender(const char *URI, line_graph_iface *_graph, calf_plugins::parameter_properties *props, int num_params)
 {
     graph = _graph;
diff --git a/src/modules.cpp b/src/modules.cpp
index 7a02a1d..f2678fe 100644
--- a/src/modules.cpp
+++ b/src/modules.cpp
@@ -120,12 +120,15 @@ const char *filterclavier_choices[] = {
     "12dB/oct Highpass",
     "24dB/oct Highpass",
     "36dB/oct Highpass",
+    "12dB/oct Bandpass", // TODO: are we lying here?
+    "24dB/oct Bandpass", // TODO: are we lying here?
+    "36dB/oct Bandpass", // TODO: are we lying here?
 };
 
 CALF_PORT_PROPS(filterclavier) = {
     { 0,        -48,   48, 48*2+1, PF_INT   | PF_SCALE_LINEAR | PF_CTL_KNOB | PF_UNIT_SEMITONES, NULL, "transpose", "Transpose" },
     { 0,       -100,  100,      0, PF_INT   | PF_SCALE_LINEAR | PF_CTL_KNOB | PF_UNIT_CENTS, NULL, "detune", "Detune" },
-    { 0,          0,    5,      1, PF_ENUM  | PF_CTL_COMBO, filterclavier_choices, "mode", "Mode" },
+    { 6,          0,    8,      1, PF_ENUM  | PF_CTL_COMBO, filterclavier_choices, "mode", "Mode" },
     { 20,         1,  2000,    20, PF_FLOAT | PF_SCALE_LOG    | PF_CTL_KNOB | PF_UNIT_MSEC, NULL, "inertia", "Portamento time"}
 };
 

-- 
calf audio plugins packaging



More information about the pkg-multimedia-commits mailing list