[SCM] calf/master: + Organ: first attempt at adding some subtractive synthesis elements to signal path (VERY incomplete and unoptimized, still fun!)

js at users.alioth.debian.org js at users.alioth.debian.org
Tue May 7 15:37:07 UTC 2013


The following commit has been merged in the master branch:
commit 520f37b630f30e575b2814d2d5bdfe4f113265bd
Author: kfoltman <kfoltman at 78b06b96-2940-0410-b7fc-879d825d01d8>
Date:   Thu Apr 3 23:30:25 2008 +0000

    + Organ: first attempt at adding some subtractive synthesis elements to signal path (VERY incomplete and unoptimized, still fun!)
    
    
    
    git-svn-id: https://calf.svn.sourceforge.net/svnroot/calf/trunk@143 78b06b96-2940-0410-b7fc-879d825d01d8

diff --git a/src/calf/modules_synths.h b/src/calf/modules_synths.h
index 84fde40..2d91fc6 100644
--- a/src/calf/modules_synths.h
+++ b/src/calf/modules_synths.h
@@ -204,7 +204,10 @@ public:
         par_phase1, par_phase2, par_phase3, par_phase4, par_phase5, par_phase6, par_phase7, par_phase8, par_phase9, 
         par_pan1, par_pan2, par_pan3, par_pan4, par_pan5, par_pan6, par_pan7, par_pan8, par_pan9, 
         par_foldover,
-        par_percdecay, par_perclevel, par_percharm, par_master, param_count };
+        par_percdecay, par_perclevel, par_percharm, par_master, 
+        par_f1cutoff, par_f1res, par_f1env1,
+        par_eg1attack, par_eg1decay, par_eg1sustain, par_eg1release,
+        param_count };
     enum { in_count = 0, out_count = 2, support_midi = true, rt_capable = true };
     static const char *port_names[];
     float *ins[in_count]; 
diff --git a/src/calf/organ.h b/src/calf/organ.h
index bba3267..82e9343 100644
--- a/src/calf/organ.h
+++ b/src/calf/organ.h
@@ -27,14 +27,20 @@
 namespace synth 
 {
 
-struct organproc_parameters
-{
-    float cutoff;
-    float resonance;
-    float attack, decay, sustain, release;
-};
-    
 struct organ_parameters {
+    enum { FilterCount = 1, EnvCount = 1 };
+    struct organ_filter_parameters
+    {
+        float cutoff;
+        float resonance;
+        float envmod[organ_parameters::EnvCount];
+    };
+
+    struct organ_env_parameters
+    {
+        float attack, decay, sustain, release;
+    };
+        
     float drawbars[9];
     float harmonics[9];
     float waveforms[9];
@@ -47,7 +53,8 @@ struct organ_parameters {
     float percussion_harmonic;
     float master;
     
-    organproc_parameters procs[2];
+    organ_filter_parameters filters[organ_parameters::FilterCount];
+    organ_env_parameters envs[organ_parameters::EnvCount];
     
     double perc_decay_const;
     float multiplier[9];
@@ -80,10 +87,13 @@ public:
 
 class organ_voice: public synth::voice, public organ_voice_base {
 protected:    
-    enum { Channels = 2, BlockSize = 32 };
+    enum { Channels = 2, BlockSize = 32, EnvCount = organ_parameters::EnvCount, FilterCount = organ_parameters::FilterCount };
     float output_buffer[BlockSize][Channels];
     bool released;
     dsp::fixed_point<int64_t, 52> phase, dphase;
+    biquad<float> filterL, filterR;
+    adsr envs[EnvCount];
+    int age;
 
 public:
     organ_voice()
@@ -92,11 +102,21 @@ public:
 
     void reset() {
         phase = 0;
+        filterL.reset();
+        filterR.reset();
+        age = 0;
     }
 
     void note_on(int note, int /*vel*/) {
         reset();
         this->note = note;
+        for (int i = 0; i < EnvCount; i++)
+        {
+            organ_parameters::organ_env_parameters &p = parameters->envs[i];
+            float sf = 0.001f;
+            envs[i].set(sf * p.attack, sf * p.decay, p.sustain, sf * p.release, sample_rate / BlockSize);
+            envs[i].note_on();
+        }
         dphase.set(synth::midi_note_to_phase(note, 0, sample_rate));
         amp.set(1.0f);
         released = false;
@@ -145,6 +165,15 @@ public:
             }
         }
         phase += dphase * BlockSize;
+        float fc = parameters->filters[0].cutoff * pow(2.0, parameters->filters[0].envmod[0] * envs[0].value * (1.f / 1200.f));
+        filterL.set_lp_rbj(dsp::clip<float>(fc, 10, 18000), parameters->filters[0].resonance, sample_rate);
+        filterR.copy_coeffs(filterL);
+        envs[0].advance();
+        age++;
+        for (int i=0; i < (int) BlockSize; i++) {
+            output_buffer[i][0] = filterL.process_d1(output_buffer[i][0]);
+            output_buffer[i][1] = filterR.process_d1(output_buffer[i][1]);
+        }
         if (released)
         {
             for (int i=0; i < (int) BlockSize; i++) {
diff --git a/src/organ.cpp b/src/organ.cpp
index 57e7805..0f98ed5 100644
--- a/src/organ.cpp
+++ b/src/organ.cpp
@@ -94,6 +94,36 @@ const char *organ_audio_module::get_gui_xml()
             DRAWBAR_UI("8")
             DRAWBAR_UI("9")
         "</table>"
+        "<hbox>"
+            "<vbox>"
+            "  <label param=\"f1_cutoff\" />"
+            "  <align><knob param=\"f1_cutoff\" expand=\"0\" fill=\"0\"/></align><value param=\"f1_cutoff\"/>"
+            "</vbox>"
+            "<vbox>"
+            "  <label param=\"f1_res\" />"
+            "  <align><knob param=\"f1_res\" expand=\"0\" fill=\"0\"/></align><value param=\"f1_res\"/>"
+            "</vbox>"
+            "<vbox>"
+            "  <label param=\"f1_env1\" />"
+            "  <align><knob param=\"f1_env1\" expand=\"0\" fill=\"0\"/></align><value param=\"f1_env1\"/>"
+            "</vbox>"
+            "<vbox>"
+            "  <label param=\"adsr_a\" />"
+            "  <align><knob param=\"adsr_a\" expand=\"0\" fill=\"0\"/></align><value param=\"adsr_a\"/>"
+            "</vbox>"
+            "<vbox>"
+            "  <label param=\"adsr_d\" />"
+            "  <align><knob param=\"adsr_d\" expand=\"0\" fill=\"0\"/></align><value param=\"adsr_d\"/>"
+            "</vbox>"
+            "<vbox>"
+            "  <label param=\"adsr_s\" />"
+            "  <align><knob param=\"adsr_s\" expand=\"0\" fill=\"0\"/></align><value param=\"adsr_s\"/>"
+            "</vbox>"
+            "<vbox>"
+            "  <label param=\"adsr_r\" />"
+            "  <align><knob param=\"adsr_r\" expand=\"0\" fill=\"0\"/></align><value param=\"adsr_r\"/>"
+            "</vbox>"
+        "</hbox>"
     "</vbox>"
     ;
 }
@@ -171,6 +201,15 @@ parameter_properties organ_audio_module::param_props[] = {
     { 3,         2,  3, 1, PF_ENUM | PF_CTL_COMBO, organ_percussion_harmonic_names, "perc_harm", "Perc. harmonic" },
 
     { 0.1,         0,  1, 100, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB, NULL, "master", "Volume" },
+    
+    { 2000,   20, 20000, 100, PF_FLOAT | PF_SCALE_LOG | PF_UNIT_HZ | PF_CTL_KNOB, NULL, "f1_cutoff", "F1 Cutoff" },
+    { 2,        0.7,    8,    0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB, NULL, "f1_res", "F1 Res" },
+    { 8000,  -10800,10800,    0, PF_FLOAT | PF_SCALE_LINEAR | PF_CTL_KNOB | PF_UNIT_CENTS, NULL, "f1_env1", "F1 Env1" },
+
+    { 1,          1,20000,    0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_MSEC, NULL, "adsr_a", "EG1 Attack" },
+    { 350,       10,20000,    0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_MSEC, NULL, "adsr_d", "EG1 Decay" },
+    { 0.5,        0,    1,    0, PF_FLOAT | PF_SCALE_PERC, NULL, "adsr_s", "EG1 Sustain" },
+    { 50,       10,20000,     0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_MSEC, NULL, "adsr_r", "EG1 Release" },
 };
 
 ////////////////////////////////////////////////////////////////////////////

-- 
calf audio plugins packaging



More information about the pkg-multimedia-commits mailing list