[SCM] calf/master: + Framework: separate some plugin .so specific code and data into separate .cpp file, move small plugins' code to separate .cpp file, reduce dependencies, make a simpler version of null_plugin base class for use in small plugins, use qualified names for stuff from std namespace in primitives.h instead of 'using' keyword, other minor cleanups

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


The following commit has been merged in the master branch:
commit 519d79ac28b749988c6444438e4ec5ad560ec70c
Author: kfoltman <kfoltman at 78b06b96-2940-0410-b7fc-879d825d01d8>
Date:   Tue Sep 23 22:27:49 2008 +0000

    + Framework: separate some plugin .so specific code and data into separate .cpp file, move small plugins' code to separate .cpp file, reduce dependencies, make a simpler version of null_plugin base class for use in small plugins, use qualified names for stuff from std namespace in primitives.h instead of 'using' keyword, other minor cleanups
    
    
    git-svn-id: https://calf.svn.sourceforge.net/svnroot/calf/trunk@293 78b06b96-2940-0410-b7fc-879d825d01d8

diff --git a/src/Makefile.am b/src/Makefile.am
index bcf602a..c0510b2 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -34,7 +34,7 @@ endif
 
 AM_CXXFLAGS += $(GLIB_DEPS_CFLAGS)
 noinst_PROGRAMS += calfmakerdf
-calfmakerdf_SOURCES = makerdf.cpp
+calfmakerdf_SOURCES = makerdf.cpp 
 calfmakerdf_LDADD = libcalfstatic.la
 
 calfbenchmark_SOURCES = benchmark.cpp
@@ -47,7 +47,7 @@ calfbenchmark_CXXFLAGS = $(AM_CXXFLAGS) -DTEST_OSC
 calfbenchmark_LDADD += libcalfgui.la
 endif
 
-calf_la_SOURCES = modules.cpp modules_small.cpp giface.cpp monosynth.cpp organ.cpp osctl.cpp preset.cpp synth.cpp utils.cpp
+calf_la_SOURCES = modules.cpp modules_small.cpp giface.cpp monosynth.cpp organ.cpp osctl.cpp plugin.cpp preset.cpp synth.cpp utils.cpp
 if USE_DEBUG
 calf_la_LDFLAGS = -rpath $(ladspadir) -avoid-version -module -lexpat 
 else
@@ -55,7 +55,7 @@ calf_la_LDFLAGS = -rpath $(ladspadir) -avoid-version -module -lexpat -export-sym
 endif
 
 if USE_LV2_GUI
-calflv2gui_la_SOURCES = gui.cpp ctl_curve.cpp ctl_keyboard.cpp custom_ctl.cpp modules.cpp modules_small.cpp giface.cpp monosynth.cpp organ.cpp preset.cpp synth.cpp lv2gui.cpp main_win.cpp
+calflv2gui_la_SOURCES = gui.cpp ctl_curve.cpp ctl_keyboard.cpp custom_ctl.cpp modules.cpp giface.cpp monosynth.cpp organ.cpp preset.cpp synth.cpp lv2gui.cpp main_win.cpp
 if USE_DEBUG
 calflv2gui_la_LDFLAGS = -rpath $(lv2dir) -avoid-version -module -lexpat $(GUI_DEPS_LIBS) 
 else
diff --git a/src/calf/giface.h b/src/calf/giface.h
index d0eeb16..39afeaa 100644
--- a/src/calf/giface.h
+++ b/src/calf/giface.h
@@ -210,7 +210,7 @@ struct midi_event {
     float param3;
 };
 
-struct ladspa_info
+struct ladspa_plugin_info
 {
     uint32_t unique_id;
     const char *label;
@@ -222,7 +222,7 @@ struct ladspa_info
 
 struct giface_plugin_info
 {
-    ladspa_info *info;
+    ladspa_plugin_info *info;
     int inputs, outputs, params;
     bool rt_capable, midi_in_capable;
     parameter_properties *param_props;
@@ -237,7 +237,7 @@ extern void get_all_small_plugins(plugin_list_info_iface *plii);
 
 #if USE_LADSPA
 
-extern std::string generate_ladspa_rdf(const ladspa_info &info, parameter_properties *params, const char *param_names[], unsigned int count, unsigned int ctl_ofs);
+extern std::string generate_ladspa_rdf(const ladspa_plugin_info &info, parameter_properties *params, const char *param_names[], unsigned int count, unsigned int ctl_ofs);
 
 template<class Module>
 struct ladspa_instance: public Module, public plugin_ctl_iface
@@ -342,9 +342,9 @@ struct ladspa_wrapper
     static std::vector<plugin_preset> *presets;
     static std::vector<DSSI_Program_Descriptor> *preset_descs;
 #endif
-    ladspa_info &info;
+    ladspa_plugin_info &info;
     
-    ladspa_wrapper(ladspa_info &i) 
+    ladspa_wrapper(ladspa_plugin_info &i) 
     : info(i)
     {
         init_descriptor(i);
@@ -363,7 +363,7 @@ struct ladspa_wrapper
 #endif
     }
 
-    void init_descriptor(ladspa_info &inf)
+    void init_descriptor(ladspa_plugin_info &inf)
     {
         int ins = Module::in_count;
         int outs = Module::out_count;
@@ -616,9 +616,6 @@ struct ladspa_wrapper
         delete mod;
     }
     
-    std::string generate_rdf() {
-        return synth::generate_ladspa_rdf(info, Module::param_props, (const char **)descriptor.PortNames, Module::param_count, Module::in_count + Module::out_count);
-    }
 };
 
 template<class Module>
diff --git a/src/calf/lv2wrap.h b/src/calf/lv2wrap.h
index c81fb65..b8c5837 100644
--- a/src/calf/lv2wrap.h
+++ b/src/calf/lv2wrap.h
@@ -109,7 +109,7 @@ struct lv2_wrapper
     static LV2_Descriptor descriptor;
     std::string uri;
     
-    lv2_wrapper(ladspa_info &info)
+    lv2_wrapper(ladspa_plugin_info &info)
     {
         uri = "http://calf.sourceforge.net/plugins/" + std::string(info.label);
         descriptor.URI = uri.c_str();
@@ -310,9 +310,7 @@ struct lv2_small_wrapper
     }
 };
 
-#define PUT_DESCRIPTORS_HERE \
-    template<class Module> LV2_Descriptor lv2_small_wrapper<Module>::descriptor; \
-    template<class Module> LV2_Descriptor lv2_wrapper<Module>::descriptor;
+extern const LV2_Descriptor *lv2_small_descriptor(uint32_t index);
 
 };
 
diff --git a/src/calf/modulelist.h b/src/calf/modulelist.h
index ffebaa8..2ce31e7 100644
--- a/src/calf/modulelist.h
+++ b/src/calf/modulelist.h
@@ -7,25 +7,25 @@
     PER_MODULE_ITEM(rotary_speaker, false, "rotaryspeaker")
     PER_MODULE_ITEM(phaser, false, "phaser")
 #ifdef ENABLE_EXPERIMENTAL
-    PER_SMALL_MODULE_ITEM(small_lp_filter, "lowpass12")
-    PER_SMALL_MODULE_ITEM(small_hp_filter, "highpass12")
-    PER_SMALL_MODULE_ITEM(small_bp_filter, "bandpass6")
-    PER_SMALL_MODULE_ITEM(small_br_filter, "notch6")
-    PER_SMALL_MODULE_ITEM(small_onepole_lp_filter, "lowpass6")
-    PER_SMALL_MODULE_ITEM(small_onepole_hp_filter, "highpass6")
-    PER_SMALL_MODULE_ITEM(small_onepole_ap_filter, "allpass")
-    PER_SMALL_MODULE_ITEM(small_min, "min")
-    PER_SMALL_MODULE_ITEM(small_max, "max")
-    PER_SMALL_MODULE_ITEM(small_minus, "minus")
-    PER_SMALL_MODULE_ITEM(small_mul, "mul")
-    PER_SMALL_MODULE_ITEM(small_neg, "neg")
-    PER_SMALL_MODULE_ITEM(small_map_lin2exp, "lin2exp")
-    PER_SMALL_MODULE_ITEM(small_square_osc, "square_osc")
-    PER_SMALL_MODULE_ITEM(small_saw_osc, "saw_osc")
-    PER_SMALL_MODULE_ITEM(small_print, "print")
-    PER_SMALL_MODULE_ITEM(small_print2, "print2")
-    PER_SMALL_MODULE_ITEM(small_quadpower_a, "quadpower_a")
-    PER_SMALL_MODULE_ITEM(small_quadpower_c, "quadpower_c")
+    PER_SMALL_MODULE_ITEM(lp_filter, "lowpass12")
+    PER_SMALL_MODULE_ITEM(hp_filter, "highpass12")
+    PER_SMALL_MODULE_ITEM(bp_filter, "bandpass6")
+    PER_SMALL_MODULE_ITEM(br_filter, "notch6")
+    PER_SMALL_MODULE_ITEM(onepole_lp_filter, "lowpass6")
+    PER_SMALL_MODULE_ITEM(onepole_hp_filter, "highpass6")
+    PER_SMALL_MODULE_ITEM(onepole_ap_filter, "allpass")
+    PER_SMALL_MODULE_ITEM(min, "min")
+    PER_SMALL_MODULE_ITEM(max, "max")
+    PER_SMALL_MODULE_ITEM(minus, "minus")
+    PER_SMALL_MODULE_ITEM(mul, "mul")
+    PER_SMALL_MODULE_ITEM(neg, "neg")
+    PER_SMALL_MODULE_ITEM(map_lin2exp, "lin2exp")
+    PER_SMALL_MODULE_ITEM(square_osc, "square_osc")
+    PER_SMALL_MODULE_ITEM(saw_osc, "saw_osc")
+    PER_SMALL_MODULE_ITEM(print, "print")
+    PER_SMALL_MODULE_ITEM(print2, "print2")
+    PER_SMALL_MODULE_ITEM(quadpower_a, "quadpower_a")
+    PER_SMALL_MODULE_ITEM(quadpower_c, "quadpower_c")
 #endif
 #undef PER_MODULE_ITEM
 #undef PER_SMALL_MODULE_ITEM
diff --git a/src/calf/modules.h b/src/calf/modules.h
index ab77f99..462541d 100644
--- a/src/calf/modules.h
+++ b/src/calf/modules.h
@@ -27,32 +27,15 @@
 #include "audio_fx.h"
 #include "giface.h"
 
-#if USE_LADSPA
-#define LADSPA_WRAPPER(mod) static synth::ladspa_wrapper<mod##_audio_module> ladspa_##mod(mod##_info);
-#else
-#define LADSPA_WRAPPER(mod)
-#endif
-
-#if USE_LV2
-#define LV2_WRAPPER(mod) static synth::lv2_wrapper<mod##_audio_module> lv2_##mod(mod##_info);
-#define LV2_SMALL_WRAPPER(mod, name) static synth::lv2_small_wrapper<mod##_audio_module> lv2_##mod(name);
-#else
-#define LV2_WRAPPER(...)
-#define LV2_SMALL_WRAPPER(...)
-#endif
-
-#define ALL_WRAPPERS(mod) LADSPA_WRAPPER(mod) LV2_WRAPPER(mod)
-
-#define SMALL_WRAPPERS(mod, name) LV2_SMALL_WRAPPER(mod, name)
-
 namespace synth {
 
 using namespace dsp;
 
 class null_audio_module;
+struct ladspa_plugin_info;
     
 /// Empty implementations for plugin functions. Note, that functions aren't virtual, because they're called via the particular
-/// subclass (flanger_audio_module etc) via template wrappers (ladspa_wrapper<> etc), not via base class
+/// subclass (flanger_audio_module etc) via template wrappers (ladspa_wrapper<> etc), not via base class pointer/reference
 class null_audio_module: public line_graph_iface
 {
 public:
@@ -131,6 +114,7 @@ public:
     enum { par_delay, par_depth, par_rate, par_fb, par_stereo, par_reset, par_amount, param_count };
     enum { in_count = 2, out_count = 2, support_midi = false, rt_capable = true };
     static const char *port_names[in_count + out_count];
+    static synth::ladspa_plugin_info plugin_info;
     dsp::simple_flanger<float, 2048> left, right;
     float *ins[in_count]; 
     float *outs[out_count];
@@ -203,6 +187,7 @@ public:
     enum { par_freq, par_depth, par_rate, par_fb, par_stages, par_stereo, par_reset, par_amount, param_count };
     enum { in_count = 2, out_count = 2, support_midi = false, rt_capable = true };
     static const char *port_names[in_count + out_count];
+    static synth::ladspa_plugin_info plugin_info;
     float *ins[in_count]; 
     float *outs[out_count];
     float *params[param_count];
@@ -277,6 +262,7 @@ public:
     enum { par_decay, par_hfdamp, par_roomsize, par_diffusion, par_amount, param_count };
     enum { in_count = 2, out_count = 2, support_midi = false, rt_capable = true };
     static const char *port_names[in_count + out_count];
+    static synth::ladspa_plugin_info plugin_info;
     dsp::reverb<float> reverb;
     uint32_t srate;
     gain_smoothing amount;
@@ -333,6 +319,7 @@ public:
     dsp::biquad<float> left[3], right[3];
     uint32_t srate;
     static parameter_properties param_props[];
+    static synth::ladspa_plugin_info plugin_info;
     int order;
     inertia<exponential_ramp> inertia_cutoff, inertia_resonance;
     once_per_n timer;
@@ -486,6 +473,7 @@ public:
     float *outs[out_count];
     float *params[param_count];
     static const char *port_names[in_count + out_count];
+    static synth::ladspa_plugin_info plugin_info;
     float buffers[2][MAX_DELAY];
     int bufptr, deltime_l, deltime_r, mixmode, medium, old_medium;
     gain_smoothing amt_left, amt_right, fb_left, fb_right;
@@ -605,6 +593,7 @@ public:
     uint32_t srate;
     int vibrato_mode;
     static parameter_properties param_props[];
+    static synth::ladspa_plugin_info plugin_info;
     /// Current CC1 (Modulation) value, normalized to [0, 1]
     float mwhl_value;
     /// Current CC64 (Hold) value, normalized to [0, 1]
@@ -701,12 +690,12 @@ public:
     inline bool incr_towards(float &aspeed, float raspeed, float delta_decc, float delta_acc)
     {
         if (aspeed < raspeed) {
-            aspeed = min(raspeed, aspeed + delta_acc);
+            aspeed = std::min(raspeed, aspeed + delta_acc);
             return true;
         }
         else if (aspeed > raspeed) 
         {
-            aspeed = max(raspeed, aspeed - delta_decc);
+            aspeed = std::max(raspeed, aspeed - delta_decc);
             return true;
         }        
         return false;
@@ -788,6 +777,7 @@ public:
 };
 
 extern std::string get_builtin_modules_rdf();
+extern const char *calf_copyright_info;
 
 };
 
diff --git a/src/calf/modules_small.h b/src/calf/modules_small.h
index e5838fa..f7a7587 100644
--- a/src/calf/modules_small.h
+++ b/src/calf/modules_small.h
@@ -21,500 +21,16 @@
 #ifndef __CALF_MODULES_SMALL_H
 #define __CALF_MODULES_SMALL_H
 
-#include <assert.h>
-#include "biquad.h"
-#include "inertia.h"
-#include "audio_fx.h"
-#include "giface.h"
-#include "modules.h"
-#include "plugininfo.h"
-
-namespace synth {
-
-using namespace dsp;
-
-class small_filter_audio_module: public null_audio_module
-{
-public:    
-    enum { in_signal, in_cutoff, in_resonance, in_count };
-    enum { out_signal, out_count};
-    float *ins[in_count]; 
-    float *outs[out_count];
-    static void port_info(plugin_info_iface *pii)
-    {
-        pii->audio_port("in", "In").input();
-        pii->control_port("cutoff", "Cutoff", 1000).input().log_range(20, 20000);
-        pii->control_port("res", "Resonance", 0.707).input().log_range(0.707, 20);
-        pii->audio_port("out", "Out").output();
-    }
-    dsp::biquad<float> filter;
-    uint32_t srate;
-    
-    void activate() {
-        filter.reset_d1();
-    }
-    void set_sample_rate(uint32_t sr) {
-        srate = sr;
-    }
-    inline void process_inner(uint32_t count) {
-        for (uint32_t i = 0; i < count; i++)
-            outs[out_signal][i] = filter.process_d1(ins[in_signal][i]);
-        filter.sanitize_d1();
-    }
-};
-
-class small_lp_filter_audio_module: public small_filter_audio_module
-{
-public:
-    inline void process(uint32_t count) {
-        filter.set_lp_rbj(clip<float>(*ins[in_cutoff], 0.0001, 0.48 * srate), *ins[in_resonance], srate);
-        process_inner(count);
-    }
-    static void plugin_info(plugin_info_iface *pii)
-    {
-        pii->names("lowpass12", "12dB/oct RBJ Lowpass", "lv2:LowpassPlugin");
-        port_info(pii);
-    }
-};
-
-class small_hp_filter_audio_module: public small_filter_audio_module
-{
-public:
-    inline void process(uint32_t count) {
-        filter.set_hp_rbj(clip<float>(*ins[in_cutoff], 0.0001, 0.48 * srate), *ins[in_resonance], srate);
-        process_inner(count);
-    }
-    static void plugin_info(plugin_info_iface *pii)
-    {
-        pii->names("highpass12", "12dB/oct RBJ Highpass", "lv2:HighpassPlugin");
-        port_info(pii);
-    }
-};
-
-class small_bp_filter_audio_module: public small_filter_audio_module
-{
-public:
-    inline void process(uint32_t count) {
-        filter.set_bp_rbj(clip<float>(*ins[in_cutoff], 0.0001, 0.48 * srate), *ins[in_resonance], srate);
-        process_inner(count);
-    }
-    static void plugin_info(plugin_info_iface *pii)
-    {
-        pii->names("bandpass6", "6dB/oct RBJ Bandpass", "lv2:BandpassPlugin");
-        port_info(pii);
-    }
-};
-
-class small_br_filter_audio_module: public small_filter_audio_module
-{
-public:
-    inline void process(uint32_t count) {
-        filter.set_br_rbj(clip<float>(*ins[in_cutoff], 0.0001, 0.48 * srate), *ins[in_resonance], srate);
-        process_inner(count);
-    }
-    static void plugin_info(plugin_info_iface *pii)
-    {
-        pii->names("notch6", "6dB/oct RBJ Bandpass", "lv2:FilterPlugin");
-        port_info(pii);
-    }
-};
-
-class small_onepole_filter_audio_module: public null_audio_module
-{
-public:    
-    enum { in_signal, in_cutoff, in_count };
-    enum { out_signal, out_count};
-    float *ins[in_count]; 
-    float *outs[out_count];
-    dsp::onepole<float> filter;
-    uint32_t srate;
-    static parameter_properties param_props[];
-    
-    void set_sample_rate(uint32_t sr) {
-        srate = sr;
-    }
-    static void port_info(plugin_info_iface *pii)
-    {
-        pii->audio_port("In", "in").input();
-        pii->control_port("Cutoff", "cutoff", 1000).input().log_range(20, 20000);
-        pii->audio_port("Out", "out").output();
-    }
-    /// do not export mode and inertia as CVs, as those are settings and not parameters
-    void activate() {
-        filter.reset();
-    }
-};
-
-class small_onepole_lp_filter_audio_module: public small_onepole_filter_audio_module
-{
-public:
-    void process(uint32_t count) {
-        filter.set_lp(clip<float>(*ins[in_cutoff], 0.0001, 0.48 * srate), srate);
-        for (uint32_t i = 0; i < count; i++)
-            outs[0][i] = filter.process_lp(ins[0][i]);
-        filter.sanitize();
-    }
-    static void plugin_info(plugin_info_iface *pii)
-    {
-        pii->names("lowpass6", "6dB/oct Lowpass Filter", "lv2:LowpassPlugin");
-        port_info(pii);
-    }
-};
-
-class small_onepole_hp_filter_audio_module: public small_onepole_filter_audio_module
-{
-public:
-    void process(uint32_t count) {
-        filter.set_hp(clip<float>(*ins[in_cutoff], 0.0001, 0.48 * srate), srate);
-        for (uint32_t i = 0; i < count; i++)
-            outs[0][i] = filter.process_hp(ins[0][i]);
-        filter.sanitize();
-    }
-    static void plugin_info(plugin_info_iface *pii)
-    {
-        pii->names("highpass6", "6dB/oct Highpass Filter", "lv2:HighpassPlugin");
-        port_info(pii);
-    }
-};
-
-class small_onepole_ap_filter_audio_module: public small_onepole_filter_audio_module
-{
-public:
-    void process(uint32_t count) {
-        filter.set_ap(clip<float>(*ins[in_cutoff], 0.0001, 0.48 * srate), srate);
-        for (uint32_t i = 0; i < count; i++)
-            outs[0][i] = filter.process_ap(ins[0][i]);
-        filter.sanitize();
-    }
-    static void plugin_info(plugin_info_iface *pii)
-    {
-        pii->names("allpass", "1-pole 1-zero Allpass Filter", "lv2:AllpassPlugin");
-        port_info(pii);
-    }
-};
-
-/// This works for 1 or 2 operands only...
-template<int Inputs>
-class audio_operator_audio_module: public null_audio_module
-{
-public:    
-    enum { in_count = Inputs, out_count = 1 };
-    float *ins[in_count]; 
-    float *outs[out_count];
-    uint32_t srate;
-    
-    static void port_info(plugin_info_iface *pii)
-    {
-        if (Inputs == 1)
-            pii->audio_port("in", "In").input();
-        else
-        {
-            pii->audio_port("in_1", "In 1").input();
-            pii->audio_port("in_2", "In 2").input();
-        }
-        pii->audio_port("out", "Out").output();
-    }
-    void set_sample_rate(uint32_t sr) {
-        srate = sr;
-    }
-};
-
-class small_min_audio_module: public audio_operator_audio_module<2>
-{
-public:
-    void process(uint32_t count) {
-        for (uint32_t i = 0; i < count; i++)
-            outs[0][i] = std::min(ins[0][i], ins[1][i]);
-    }
-    static void plugin_info(plugin_info_iface *pii)
-    {
-        pii->names("min", "Function min", "lv2:UtilityPlugin");
-        port_info(pii);
-    }
-};
-
-class small_max_audio_module: public audio_operator_audio_module<2>
-{
-public:
-    void process(uint32_t count) {
-        for (uint32_t i = 0; i < count; i++)
-            outs[0][i] = std::max(ins[0][i], ins[1][i]);
-    }
-    static void plugin_info(plugin_info_iface *pii)
-    {
-        pii->names("max", "Function max", "lv2:UtilityPlugin");
-        port_info(pii);
-    }
-};
-
-class small_minus_audio_module: public audio_operator_audio_module<2>
+/// Empty implementations for plugin functions. Note, that functions aren't virtual, because they're called via the particular
+/// subclass via template wrappers (ladspa_small_wrapper<> etc), not via base class pointer/reference
+class null_small_audio_module
 {
 public:
-    void process(uint32_t count) {
-        for (uint32_t i = 0; i < count; i++)
-            outs[0][i] = ins[0][i] - ins[1][i];
-    }
-    static void plugin_info(plugin_info_iface *pii)
-    {
-        pii->names("minus", "Subtract", "lv2:UtilityPlugin");
-        port_info(pii);
-    }
+    /// LADSPA-esque activate function, except it is called after ports are connected, not before
+    inline void activate() {}
+    /// LADSPA-esque deactivate function
+    inline void deactivate() {}
+    /// Set sample rate for the plugin
+    inline void set_sample_rate(uint32_t sr) { }
 };
-
-class small_mul_audio_module: public audio_operator_audio_module<2>
-{
-public:
-    void process(uint32_t count) {
-        for (uint32_t i = 0; i < count; i++)
-            outs[0][i] = ins[0][i] * ins[1][i];
-    }
-    static void plugin_info(plugin_info_iface *pii)
-    {
-        pii->names("mul", "Multiply", "lv2:UtilityPlugin");
-        port_info(pii);
-    }
-};
-
-class small_neg_audio_module: public audio_operator_audio_module<1>
-{
-public:
-    void process(uint32_t count) {
-        for (uint32_t i = 0; i < count; i++)
-            outs[0][i] = -ins[0][i];
-    }
-    static void plugin_info(plugin_info_iface *pii)
-    {
-        pii->names("neg", "Negative value", "lv2:UtilityPlugin");
-        port_info(pii);
-    }
-};
-
-class small_map_lin2exp_audio_module: public null_audio_module
-{
-public:    
-    enum { in_signal, in_from_min, in_from_max, in_to_min, in_to_max, in_count };
-    enum { out_signal, out_count };
-    float *ins[in_count]; 
-    float *outs[out_count];
-    uint32_t srate;
-    
-    static void plugin_info(plugin_info_iface *pii)
-    {
-        pii->names("lin2exp", "Lin-Exp Mapper", "lv2:UtilityPlugin");
-        pii->control_port("in", "In", 0.f).input();
-        pii->control_port("from_min", "Min (from)", 0).input();
-        pii->control_port("from_max", "Max (from)", 1).input();
-        pii->control_port("to_min", "Min (to)", 20).input();
-        pii->control_port("to_max", "Max (to)", 20000).input();
-        pii->control_port("out", "Out", 0.f).output();
-    }
-    void set_sample_rate(uint32_t sr) {
-        srate = sr;
-    }
-    void process(uint32_t count) {
-        float normalized = (*ins[in_signal] - *ins[in_from_min]) / (*ins[in_from_max] - *ins[in_from_min]);
-        *outs[out_signal] = *ins[in_to_min] * pow(*ins[in_to_max] / *ins[in_to_min], normalized);
-    }
-};
-
-#define SMALL_OSC_TABLE_BITS 12
-
-class small_freq_only_osc_audio_module: public null_audio_module
-{
-public:    
-    typedef waveform_family<SMALL_OSC_TABLE_BITS> waves_type;
-    enum { in_freq, in_count };
-    enum { out_signal, out_count};
-    enum { wave_size = 1 << SMALL_OSC_TABLE_BITS };
-    float *ins[in_count]; 
-    float *outs[out_count];
-    waves_type *waves;
-    waveform_oscillator<SMALL_OSC_TABLE_BITS> osc;
-    uint32_t srate;
-    double odsr;
-
-    /// Fill the array with the original, non-bandlimited, waveform
-    virtual void get_original_waveform(float data[wave_size]) = 0;
-    /// This function needs to be virtual to ensure a separate wave family for each class (but not each instance)
-    virtual waves_type *get_waves() = 0;
-    void activate() {
-        waves = get_waves();
-    }
-    void set_sample_rate(uint32_t sr) {
-        srate = sr;
-        odsr = 1.0 / sr;
-    }
-    void process(uint32_t count)
-    {
-        osc.set_freq_odsr(*ins[in_freq], odsr);
-        osc.waveform = waves->get_level(osc.phasedelta);
-        if (osc.waveform)
-        {
-            for (uint32_t i = 0; i < count; i++)
-                outs[out_signal][i] = osc.get();
-        }
-        else
-            dsp::zero(outs[out_signal], count);
-    }
-    static void port_info(plugin_info_iface *pii)
-    {
-        pii->control_port("freq", "Frequency", 440).input().log_range(20, 20000);
-        pii->audio_port("out", "Out").output();
-    }
-    /// Generate a wave family (bandlimit levels) from the original wave
-    waves_type *create_waves() {
-        waves_type *ptr = new waves_type;
-        float source[wave_size];
-        get_original_waveform(source);
-        bandlimiter<SMALL_OSC_TABLE_BITS> bl;
-        ptr->make(bl, source);
-        return ptr;
-    }
-};
-
-#define OSC_MODULE_GET_WAVES() \
-    virtual waves_type *get_waves() { \
-        static waves_type *waves = NULL; \
-        if (!waves) \
-            waves = create_waves(); \
-        return waves; \
-    }
-
-class small_square_osc_audio_module: public small_freq_only_osc_audio_module
-{
-public:
-    OSC_MODULE_GET_WAVES()
-
-    virtual void get_original_waveform(float data[wave_size]) {
-        for (int i = 0; i < wave_size; i++)
-            data[i] = (i < wave_size / 2) ? +1 : -1;
-    }
-    static void plugin_info(plugin_info_iface *pii)
-    {
-        pii->names("squareosc", "Square Oscillator", "lv2:OscillatorPlugin");
-        port_info(pii);
-    }
-};
-
-class small_saw_osc_audio_module: public small_freq_only_osc_audio_module
-{
-public:
-    OSC_MODULE_GET_WAVES()
-
-    virtual void get_original_waveform(float data[wave_size]) {
-        for (int i = 0; i < wave_size; i++)
-            data[i] = (i * 2.0 / wave_size) - 1;
-    }
-    static void plugin_info(plugin_info_iface *pii)
-    {
-        pii->names("sawosc", "Saw Oscillator", "lv2:OscillatorPlugin");
-        port_info(pii);
-    }
-};
-
-class small_print_audio_module: public null_audio_module
-{
-public:    
-    enum { in_count = 1, out_count = 0 };
-    float *ins[in_count]; 
-    float *outs[out_count];
-    uint32_t srate;
-    
-    static void plugin_info(plugin_info_iface *pii)
-    {
-        pii->names("print", "Print To Console (C)", "lv2:UtilityPlugin");
-        pii->control_port("in", "In", 0).input();
-    }
-    void set_sample_rate(uint32_t sr) {
-        srate = sr;
-    }
-    void process(uint32_t)
-    {
-        printf("%f\n", *ins[0]);
-    }
-};
-
-class small_print2_audio_module: public null_audio_module
-{
-public:    
-    enum { in_count = 1, out_count = 0 };
-    float *ins[in_count]; 
-    float *outs[out_count];
-    uint32_t srate;
-    
-    static void plugin_info(plugin_info_iface *pii)
-    {
-        pii->names("print2", "Print To Console (A)", "lv2:UtilityPlugin");
-        pii->audio_port("in", "In").input();
-    }
-    void set_sample_rate(uint32_t sr) {
-        srate = sr;
-    }
-    void process(uint32_t)
-    {
-        printf("%f\n", *ins[0]);
-    }
-};
-
-template<bool audio>
-class small_quadpower_audio_module: public null_audio_module
-{
-public:    
-    enum { in_value, in_factor, in_count , out_count = 4 };
-    float *ins[in_count]; 
-    float *outs[out_count];
-    
-    static void plugin_info(plugin_info_iface *pii)
-    {
-        const char *names[8] = {"xa", "x*a^1", "xaa", "x*a^2", "xaaa", "x*a^3", "xaaaa", "x*a^4" };
-        if (audio)
-            pii->names("quadpower_a", "Quad Power (A)", "lv2:UtilityPlugin");
-        else
-            pii->names("quadpower_c", "Quad Power (C)", "lv2:UtilityPlugin");
-        if (audio)
-            pii->audio_port("x", "x").input();
-        else
-            pii->control_port("x", "x", 1).input();
-        pii->control_port("a", "a", 1).input();
-        for (int i = 0; i < 8; i += 2)
-            if (audio)
-                pii->audio_port(names[i], names[i+1]).output();
-            else
-                pii->control_port(names[i], names[i+1], 0).output();
-    }
-};
-
-class small_quadpower_a_audio_module: public small_quadpower_audio_module<true>
-{
-public:
-    void process(uint32_t count)
-    {
-        float a = *ins[in_factor];
-        for (uint32_t i = 0; i < count; i++)
-        {
-            float x = ins[in_value][i];
-            outs[0][i] = x * a;
-            outs[1][i] = x * a * a;
-            outs[2][i] = x * a * a * a;
-            outs[3][i] = x * a * a * a * a;
-        }
-    }
-};
-
-class small_quadpower_c_audio_module: public small_quadpower_audio_module<false>
-{
-public:
-    void process(uint32_t)
-    {
-        float x = *ins[in_value];
-        float a = *ins[in_factor];
-        *outs[0] = x * a;
-        *outs[1] = x * a * a;
-        *outs[2] = x * a * a * a;
-        *outs[3] = x * a * a * a * a;
-    }
-};
-
-};
-
 #endif
diff --git a/src/calf/modules_synths.h b/src/calf/modules_synths.h
index 47943bc..e834ed4 100644
--- a/src/calf/modules_synths.h
+++ b/src/calf/modules_synths.h
@@ -44,6 +44,7 @@ public:
     enum { in_count = 0, out_count = 2, support_midi = true, rt_capable = true };
     enum { step_size = 64 };
     static const char *port_names[];
+    static synth::ladspa_plugin_info plugin_info;
     float *ins[in_count]; 
     float *outs[out_count];
     float *params[param_count];
@@ -121,7 +122,7 @@ public:
     /// Update variables from control ports.
     void params_changed() {
         float sf = 0.001f;
-        envelope.set(*params[par_attack] * sf, *params[par_decay] * sf, min(0.999f, *params[par_sustain]), *params[par_release] * sf, srate / step_size);
+        envelope.set(*params[par_attack] * sf, *params[par_decay] * sf, std::min(0.999f, *params[par_sustain]), *params[par_release] * sf, srate / step_size);
         filter_type = fastf2i_drm(*params[par_filtertype]);
         decay_factor = odcr * 1000.0 / *params[par_decay];
         separation = pow(2.0, *params[par_cutoffsep] / 1200.0);
@@ -234,6 +235,7 @@ public:
     {
     }
     static parameter_properties param_props[];
+    static synth::ladspa_plugin_info plugin_info;
     static const char *get_gui_xml();
 
     void set_sample_rate(uint32_t sr) {
diff --git a/src/calf/organ.h b/src/calf/organ.h
index 1eb48ac..e16b3fa 100644
--- a/src/calf/organ.h
+++ b/src/calf/organ.h
@@ -367,7 +367,7 @@ struct drawbar_organ: public synth::basic_synth {
         if (fastf2i_drm(parameters->lfo_mode) == organ_voice_base::lfomode_global)
         {
             for (int i = 0; i < nsamples; i += 64)
-                global_vibrato.process(parameters, buf + i, min(64, nsamples - i), sample_rate);
+                global_vibrato.process(parameters, buf + i, std::min(64, nsamples - i), sample_rate);
         }
         if (percussion.get_active())
             percussion.render_percussion_to(buf, nsamples);
diff --git a/src/calf/osc.h b/src/calf/osc.h
index 68c4e90..942fccb 100644
--- a/src/calf/osc.h
+++ b/src/calf/osc.h
@@ -82,7 +82,7 @@ struct bandlimiter
     void compute_spectrum(float input[SIZE])
     {
         dsp::fft<float, SIZE_BITS> &fft = get_fft();
-        std::complex<float> *data = new complex<float>[SIZE];
+        std::complex<float> *data = new std::complex<float>[SIZE];
         for (int i = 0; i < SIZE; i++)
             data[i] = input[i];
         fft.calculate(data, spectrum, false);
@@ -93,7 +93,7 @@ struct bandlimiter
     void compute_waveform(float output[SIZE])
     {
         dsp::fft<float, SIZE_BITS> &fft = get_fft();
-        std::complex<float> *data = new complex<float>[SIZE];
+        std::complex<float> *data = new std::complex<float>[SIZE];
         fft.calculate(spectrum, data, true);
         for (int i = 0; i < SIZE; i++)
             output[i] = data[i].real();
@@ -111,7 +111,7 @@ struct bandlimiter
     void make_waveform(float output[SIZE], int cutoff, bool foldover = false)
     {
         dsp::fft<float, SIZE_BITS> &fft = get_fft();
-        vector<std::complex<float> > new_spec, iffted;
+        std::vector<std::complex<float> > new_spec, iffted;
         new_spec.resize(SIZE);
         iffted.resize(SIZE);
         // Copy original harmonics up to cutoff point
@@ -154,12 +154,12 @@ struct bandlimiter
 
 /// Set of bandlimited wavetables
 template<int SIZE_BITS>
-struct waveform_family: public map<uint32_t, float *>
+struct waveform_family: public std::map<uint32_t, float *>
 {
     enum { SIZE = 1 << SIZE_BITS };
-    using map<uint32_t, float *>::iterator;
-    using map<uint32_t, float *>::end;
-    using map<uint32_t, float *>::lower_bound;
+    using std::map<uint32_t, float *>::iterator;
+    using std::map<uint32_t, float *>::end;
+    using std::map<uint32_t, float *>::lower_bound;
     float original[SIZE];
     
     /// Fill the family using specified bandlimiter and original waveform. Optionally apply foldover. 
@@ -236,7 +236,7 @@ static inline void normalize_waveform(float *table, unsigned int size)
         table[i] -= dc;
     float thismax = 0;
     for (unsigned int i = 0; i < size; i++)
-        thismax = std::max(thismax, fabs(table[i]));
+        thismax = std::max(thismax, fabsf(table[i]));
     if (thismax < 0.000001f)
         return;
     double divv = 1.0 / thismax;
diff --git a/src/calf/primitives.h b/src/calf/primitives.h
index b0ab66c..f9e8e62 100644
--- a/src/calf/primitives.h
+++ b/src/calf/primitives.h
@@ -24,11 +24,11 @@
 #include <stack>
 #include <map>
 #include <cmath>
+#include <cstdlib>
+#include <stdint.h>
 
 namespace dsp {
 
-using namespace std;
-
 /// Set a float to zero
 inline void zero(float &v) {
     v = 0;
@@ -377,7 +377,7 @@ public:
         time++;
     }
     void set(int pos, task *t) {
-        timeline.insert(pair<unsigned int, task *>(time+pos, t));
+        timeline.insert(std::pair<unsigned int, task *>(time+pos, t));
         next_task = timeline.begin()->first;
     }
     void do_tasks() {
diff --git a/src/giface.cpp b/src/giface.cpp
index 373db7c..560f7f8 100644
--- a/src/giface.cpp
+++ b/src/giface.cpp
@@ -234,7 +234,7 @@ static std::string scale_to_string(parameter_properties &props)
     return tmp+"        </ladspa:Scale></ladspa:hasScale></ladspa:InputControlPort";
 }
 
-std::string synth::generate_ladspa_rdf(const ladspa_info &info, parameter_properties *params, const char *param_names[], unsigned int count,
+std::string synth::generate_ladspa_rdf(const ladspa_plugin_info &info, parameter_properties *params, const char *param_names[], unsigned int count,
                                        unsigned int ctl_ofs)
 {
     string rdf;
@@ -273,4 +273,3 @@ std::string synth::generate_ladspa_rdf(const ladspa_info &info, parameter_proper
 }
 
 #endif
-
diff --git a/src/jackhost.cpp b/src/jackhost.cpp
index 35f1af8..e71ab45 100644
--- a/src/jackhost.cpp
+++ b/src/jackhost.cpp
@@ -32,7 +32,6 @@
 #include <calf/jackhost.h>
 #include <calf/modules.h>
 #include <calf/modules_dev.h>
-#include <calf/modules_small.h>
 #include <calf/gui.h>
 #include <calf/preset.h>
 #include <calf/preset_gui.h>
diff --git a/src/makerdf.cpp b/src/makerdf.cpp
index fe37d32..7e68846 100644
--- a/src/makerdf.cpp
+++ b/src/makerdf.cpp
@@ -53,7 +53,12 @@ void make_rdf()
     
     rdf += "<rdf:RDF xmlns:rdf=\"&rdf;\" xmlns:rdfs=\"&rdfs;\" xmlns:dc=\"&dc;\" xmlns:ladspa=\"&ladspa;\">\n";
 
-    rdf += synth::get_builtin_modules_rdf();
+    #define RDF_EXPR(Module) \
+        synth::generate_ladspa_rdf(Module::plugin_info, Module::param_props, Module::port_names, Module::param_count, Module::in_count + Module::out_count);
+    
+    #define PER_MODULE_ITEM(name, isSynth, jackname) if (!isSynth) rdf += RDF_EXPR(name##_audio_module)
+    #define PER_SMALL_MODULE_ITEM(...)
+    #include <calf/modulelist.h>
     
     rdf += "</rdf:RDF>\n";
     
diff --git a/src/modules.cpp b/src/modules.cpp
index 4b7c474..870e740 100644
--- a/src/modules.cpp
+++ b/src/modules.cpp
@@ -28,13 +28,12 @@
 #include <calf/lv2wrap.h>
 #include <calf/modules.h>
 #include <calf/modules_dev.h>
-#ifdef ENABLE_EXPERIMENTAL
-#include <calf/modules_small.h>
-#endif
 
 using namespace synth;
 
-static const char *copyright = "(C) 2001-2008 Krzysztof Foltman, license: LGPL";
+template<class Module> LV2_Descriptor lv2_small_wrapper<Module>::descriptor;
+
+const char *synth::calf_copyright_info = "(C) 2001-2008 Krzysztof Foltman, license: LGPL";
 
 ////////////////////////////////////////////////////////////////////////////
 
@@ -50,9 +49,7 @@ parameter_properties flanger_audio_module::param_props[] = {
     { 1,          0, 2,     0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_COEF | PF_PROP_NOBOUNDS, NULL, "amount", "Amount" },
 };
 
-static synth::ladspa_info flanger_info = { 0x847d, "Flanger", "Calf Flanger", "Krzysztof Foltman", copyright, "FlangerPlugin" };
-
-ALL_WRAPPERS(flanger)
+synth::ladspa_plugin_info flanger_audio_module::plugin_info = { 0x847d, "Flanger", "Calf Flanger", "Krzysztof Foltman", synth::calf_copyright_info, "FlangerPlugin" };
 
 ////////////////////////////////////////////////////////////////////////////
 
@@ -69,9 +66,7 @@ parameter_properties phaser_audio_module::param_props[] = {
     { 1,          0, 2,     0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_COEF | PF_PROP_NOBOUNDS, NULL, "amount", "Amount" },
 };
 
-static synth::ladspa_info phaser_info = { 0x847d, "Phaser", "Calf Phaser", "Krzysztof Foltman", copyright, "PhaserPlugin" };
-
-ALL_WRAPPERS(phaser)
+synth::ladspa_plugin_info phaser_audio_module::plugin_info = { 0x847d, "Phaser", "Calf Phaser", "Krzysztof Foltman", synth::calf_copyright_info, "PhaserPlugin" };
 
 ////////////////////////////////////////////////////////////////////////////
 
@@ -87,9 +82,7 @@ parameter_properties reverb_audio_module::param_props[] = {
     { 0.25,       0,    2,    0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_COEF | PF_PROP_NOBOUNDS, NULL, "amount", "Amount" },
 };
 
-static synth::ladspa_info reverb_info = { 0x847e, "Reverb", "Calf Reverb", "Krzysztof Foltman", copyright, "ReverbPlugin" };
-
-ALL_WRAPPERS(reverb)
+synth::ladspa_plugin_info reverb_audio_module::plugin_info = { 0x847e, "Reverb", "Calf Reverb", "Krzysztof Foltman", synth::calf_copyright_info, "ReverbPlugin" };
 
 ////////////////////////////////////////////////////////////////////////////
 
@@ -111,9 +104,7 @@ parameter_properties filter_audio_module::param_props[] = {
     { 20,         5,  100,    20, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_MSEC, NULL, "inertia", "Inertia"},
 };
 
-static synth::ladspa_info filter_info = { 0x847f, "Filter", "Calf Filter", "Krzysztof Foltman", copyright, "FilterPlugin" };
-
-ALL_WRAPPERS(filter)
+synth::ladspa_plugin_info filter_audio_module::plugin_info = { 0x847f, "Filter", "Calf Filter", "Krzysztof Foltman", synth::calf_copyright_info, "FilterPlugin" };
 
 ////////////////////////////////////////////////////////////////////////////
 
@@ -141,9 +132,7 @@ parameter_properties vintage_delay_audio_module::param_props[] = {
     { 1,         0,    2,     0, PF_ENUM | PF_CTL_COMBO, vintage_delay_fbmodes, "medium", "Medium" },
 };
 
-static synth::ladspa_info vintage_delay_info = { 0x8482, "VintageDelay", "Calf Vintage Delay", "Krzysztof Foltman", copyright, "DelayPlugin" };
-
-ALL_WRAPPERS(vintage_delay)
+synth::ladspa_plugin_info vintage_delay_audio_module::plugin_info = { 0x8482, "VintageDelay", "Calf Vintage Delay", "Krzysztof Foltman", synth::calf_copyright_info, "DelayPlugin" };
 
 ////////////////////////////////////////////////////////////////////////////
 
@@ -162,88 +151,20 @@ parameter_properties rotary_speaker_audio_module::param_props[] = {
     { 0.3,        0,    1,  101, PF_FLOAT | PF_CTL_KNOB | PF_SCALE_PERC, NULL, "reflection", "Reflection" },
 };
 
-static synth::ladspa_info rotary_speaker_info = { 0x8483, "RotarySpeaker", "Calf Rotary Speaker", "Krzysztof Foltman", copyright, "SimulationPlugin" };
-
-ALL_WRAPPERS(rotary_speaker)
+synth::ladspa_plugin_info rotary_speaker_audio_module::plugin_info = { 0x8483, "RotarySpeaker", "Calf Rotary Speaker", "Krzysztof Foltman", synth::calf_copyright_info, "SimulationPlugin" };
 
 ////////////////////////////////////////////////////////////////////////////
 
-static synth::ladspa_info organ_info = { 0x8481, "Organ", "Calf Organ", "Krzysztof Foltman", copyright, "SynthesizerPlugin" };
-
-ALL_WRAPPERS(organ)
+synth::ladspa_plugin_info organ_audio_module::plugin_info = { 0x8481, "Organ", "Calf Organ", "Krzysztof Foltman", synth::calf_copyright_info, "SynthesizerPlugin" };
 
 ////////////////////////////////////////////////////////////////////////////
 
-static synth::ladspa_info monosynth_info = { 0x8480, "Monosynth", "Calf Monosynth", "Krzysztof Foltman", copyright, "SynthesizerPlugin" };
-
-ALL_WRAPPERS(monosynth)
+synth::ladspa_plugin_info monosynth_audio_module::plugin_info = { 0x8480, "Monosynth", "Calf Monosynth", "Krzysztof Foltman", synth::calf_copyright_info, "SynthesizerPlugin" };
 
 ////////////////////////////////////////////////////////////////////////////
 
-#ifdef ENABLE_EXPERIMENTAL
-
-#define PER_MODULE_ITEM(...) 
-#define PER_SMALL_MODULE_ITEM(name, id) SMALL_WRAPPERS(name, id)
-#include <calf/modulelist.h>
-
-#endif
-
-#if USE_LV2
-extern "C" {
-
-const LV2_Descriptor *lv2_descriptor(uint32_t index)
-{
-    #define PER_MODULE_ITEM(name, isSynth, jackname) if (!(index--)) return &::lv2_##name.descriptor;
-    #define PER_SMALL_MODULE_ITEM(name, id) if (!(index--)) return &::lv2_##name.descriptor;
-    #include <calf/modulelist.h>
-    return NULL;
-}
-
-};
-
-#endif
-#if USE_LADSPA
-extern "C" {
-
-const LADSPA_Descriptor *ladspa_descriptor(unsigned long Index)
-{
-    #define PER_MODULE_ITEM(name, isSynth, jackname) if (!isSynth && !(Index--)) return &::ladspa_##name.descriptor;
-    #define PER_SMALL_MODULE_ITEM(...)
-    #include <calf/modulelist.h>
-    return NULL;
-}
-
-};
-
-#if USE_DSSI
-extern "C" {
-
-const DSSI_Descriptor *dssi_descriptor(unsigned long Index)
-{
-    #define PER_MODULE_ITEM(name, isSynth, jackname) if (!(Index--)) return &::ladspa_##name.dssi_descriptor;
-    #define PER_SMALL_MODULE_ITEM(...)
-    #include <calf/modulelist.h>
-    return NULL;
-}
-
-};
-#endif
-
-std::string synth::get_builtin_modules_rdf()
-{
-    std::string rdf;
-    
-    #define PER_MODULE_ITEM(name, isSynth, jackname) if (!isSynth) rdf += ::ladspa_##name.generate_rdf();
-    #define PER_SMALL_MODULE_ITEM(...)
-    #include <calf/modulelist.h>
-    
-    return rdf;
-}
-
-#endif
-
 template<class Module>
-giface_plugin_info create_plugin_info(ladspa_info &info)
+giface_plugin_info create_plugin_info(ladspa_plugin_info &info)
 {
     giface_plugin_info pi;
     pi.info = &info;
@@ -260,17 +181,8 @@ giface_plugin_info create_plugin_info(ladspa_info &info)
 
 void synth::get_all_plugins(std::vector<giface_plugin_info> &plugins)
 {
-    #define PER_MODULE_ITEM(name, isSynth, jackname) plugins.push_back(create_plugin_info<name##_audio_module>(name##_info));
+    #define PER_MODULE_ITEM(name, isSynth, jackname) plugins.push_back(create_plugin_info<name##_audio_module>(name##_audio_module::plugin_info));
     #define PER_SMALL_MODULE_ITEM(...)
     #include <calf/modulelist.h>
 }
 
-void synth::get_all_small_plugins(plugin_list_info_iface *iface)
-{
-    #define PER_MODULE_ITEM(name, isSynth, jackname) 
-    #define PER_SMALL_MODULE_ITEM(name, id) { plugin_info_iface *pii = &iface->plugin(id); name##_audio_module::plugin_info(pii); pii->finalize(); }
-    #include <calf/modulelist.h>
-}
-
-// instantiate descriptor templates
-PUT_DESCRIPTORS_HERE
diff --git a/src/modules_small.cpp b/src/modules_small.cpp
index 5e8993c..ff77f08 100644
--- a/src/modules_small.cpp
+++ b/src/modules_small.cpp
@@ -21,14 +21,534 @@
 #include <config.h>
 #include <assert.h>
 #include <memory.h>
-#if USE_JACK
-#include <jack/jack.h>
-#endif
+#include <calf/primitives.h>
+#include <calf/biquad.h>
+#include <calf/inertia.h>
+#include <calf/audio_fx.h>
+#include <calf/plugininfo.h>
 #include <calf/giface.h>
 #include <calf/lv2wrap.h>
-#include <calf/modules.h>
-#include <calf/modules_dev.h>
+#include <calf/osc.h>
 #include <calf/modules_small.h>
 
+#ifdef ENABLE_EXPERIMENTAL
+
+#if USE_LV2
+#define LV2_SMALL_WRAPPER(mod, name) static synth::lv2_small_wrapper<small_##mod##_audio_module> lv2_small_##mod(name);
+#else
+#define LV2_SMALL_WRAPPER(...)
+#endif
+
+#define SMALL_WRAPPERS(mod, name) LV2_SMALL_WRAPPER(mod, name)
+
+#if USE_LV2
+
 using namespace synth;
+using namespace dsp;
+using namespace std;
+
+template<class Module> LV2_Descriptor lv2_small_wrapper<Module>::descriptor;
+
+class small_filter_audio_module: public null_small_audio_module
+{
+public:    
+    enum { in_signal, in_cutoff, in_resonance, in_count };
+    enum { out_signal, out_count};
+    float *ins[in_count]; 
+    float *outs[out_count];
+    static void port_info(plugin_info_iface *pii)
+    {
+        pii->audio_port("in", "In").input();
+        pii->control_port("cutoff", "Cutoff", 1000).input().log_range(20, 20000);
+        pii->control_port("res", "Resonance", 0.707).input().log_range(0.707, 20);
+        pii->audio_port("out", "Out").output();
+    }
+    dsp::biquad<float> filter;
+    uint32_t srate;
+    
+    void activate() {
+        filter.reset_d1();
+    }
+    void set_sample_rate(uint32_t sr) {
+        srate = sr;
+    }
+    inline void process_inner(uint32_t count) {
+        for (uint32_t i = 0; i < count; i++)
+            outs[out_signal][i] = filter.process_d1(ins[in_signal][i]);
+        filter.sanitize_d1();
+    }
+};
+
+class small_lp_filter_audio_module: public small_filter_audio_module
+{
+public:
+    inline void process(uint32_t count) {
+        filter.set_lp_rbj(clip<float>(*ins[in_cutoff], 0.0001, 0.48 * srate), *ins[in_resonance], srate);
+        process_inner(count);
+    }
+    static void plugin_info(plugin_info_iface *pii)
+    {
+        pii->names("lowpass12", "12dB/oct RBJ Lowpass", "lv2:LowpassPlugin");
+        port_info(pii);
+    }
+};
+
+class small_hp_filter_audio_module: public small_filter_audio_module
+{
+public:
+    inline void process(uint32_t count) {
+        filter.set_hp_rbj(clip<float>(*ins[in_cutoff], 0.0001, 0.48 * srate), *ins[in_resonance], srate);
+        process_inner(count);
+    }
+    static void plugin_info(plugin_info_iface *pii)
+    {
+        pii->names("highpass12", "12dB/oct RBJ Highpass", "lv2:HighpassPlugin");
+        port_info(pii);
+    }
+};
+
+class small_bp_filter_audio_module: public small_filter_audio_module
+{
+public:
+    inline void process(uint32_t count) {
+        filter.set_bp_rbj(clip<float>(*ins[in_cutoff], 0.0001, 0.48 * srate), *ins[in_resonance], srate);
+        process_inner(count);
+    }
+    static void plugin_info(plugin_info_iface *pii)
+    {
+        pii->names("bandpass6", "6dB/oct RBJ Bandpass", "lv2:BandpassPlugin");
+        port_info(pii);
+    }
+};
+
+class small_br_filter_audio_module: public small_filter_audio_module
+{
+public:
+    inline void process(uint32_t count) {
+        filter.set_br_rbj(clip<float>(*ins[in_cutoff], 0.0001, 0.48 * srate), *ins[in_resonance], srate);
+        process_inner(count);
+    }
+    static void plugin_info(plugin_info_iface *pii)
+    {
+        pii->names("notch6", "6dB/oct RBJ Bandpass", "lv2:FilterPlugin");
+        port_info(pii);
+    }
+};
+
+class small_onepole_filter_audio_module: public null_small_audio_module
+{
+public:    
+    enum { in_signal, in_cutoff, in_count };
+    enum { out_signal, out_count};
+    float *ins[in_count]; 
+    float *outs[out_count];
+    dsp::onepole<float> filter;
+    uint32_t srate;
+    static parameter_properties param_props[];
+    
+    void set_sample_rate(uint32_t sr) {
+        srate = sr;
+    }
+    static void port_info(plugin_info_iface *pii)
+    {
+        pii->audio_port("In", "in").input();
+        pii->control_port("Cutoff", "cutoff", 1000).input().log_range(20, 20000);
+        pii->audio_port("Out", "out").output();
+    }
+    /// do not export mode and inertia as CVs, as those are settings and not parameters
+    void activate() {
+        filter.reset();
+    }
+};
+
+class small_onepole_lp_filter_audio_module: public small_onepole_filter_audio_module
+{
+public:
+    void process(uint32_t count) {
+        filter.set_lp(clip<float>(*ins[in_cutoff], 0.0001, 0.48 * srate), srate);
+        for (uint32_t i = 0; i < count; i++)
+            outs[0][i] = filter.process_lp(ins[0][i]);
+        filter.sanitize();
+    }
+    static void plugin_info(plugin_info_iface *pii)
+    {
+        pii->names("lowpass6", "6dB/oct Lowpass Filter", "lv2:LowpassPlugin");
+        port_info(pii);
+    }
+};
+
+class small_onepole_hp_filter_audio_module: public small_onepole_filter_audio_module
+{
+public:
+    void process(uint32_t count) {
+        filter.set_hp(clip<float>(*ins[in_cutoff], 0.0001, 0.48 * srate), srate);
+        for (uint32_t i = 0; i < count; i++)
+            outs[0][i] = filter.process_hp(ins[0][i]);
+        filter.sanitize();
+    }
+    static void plugin_info(plugin_info_iface *pii)
+    {
+        pii->names("highpass6", "6dB/oct Highpass Filter", "lv2:HighpassPlugin");
+        port_info(pii);
+    }
+};
+
+class small_onepole_ap_filter_audio_module: public small_onepole_filter_audio_module
+{
+public:
+    void process(uint32_t count) {
+        filter.set_ap(clip<float>(*ins[in_cutoff], 0.0001, 0.48 * srate), srate);
+        for (uint32_t i = 0; i < count; i++)
+            outs[0][i] = filter.process_ap(ins[0][i]);
+        filter.sanitize();
+    }
+    static void plugin_info(plugin_info_iface *pii)
+    {
+        pii->names("allpass", "1-pole 1-zero Allpass Filter", "lv2:AllpassPlugin");
+        port_info(pii);
+    }
+};
+
+/// This works for 1 or 2 operands only...
+template<int Inputs>
+class audio_operator_audio_module: public null_small_audio_module
+{
+public:    
+    enum { in_count = Inputs, out_count = 1 };
+    float *ins[in_count]; 
+    float *outs[out_count];
+    uint32_t srate;
+    
+    static void port_info(plugin_info_iface *pii)
+    {
+        if (Inputs == 1)
+            pii->audio_port("in", "In").input();
+        else
+        {
+            pii->audio_port("in_1", "In 1").input();
+            pii->audio_port("in_2", "In 2").input();
+        }
+        pii->audio_port("out", "Out").output();
+    }
+    void set_sample_rate(uint32_t sr) {
+        srate = sr;
+    }
+};
+
+class small_min_audio_module: public audio_operator_audio_module<2>
+{
+public:
+    void process(uint32_t count) {
+        for (uint32_t i = 0; i < count; i++)
+            outs[0][i] = std::min(ins[0][i], ins[1][i]);
+    }
+    static void plugin_info(plugin_info_iface *pii)
+    {
+        pii->names("min", "Function min", "lv2:UtilityPlugin");
+        port_info(pii);
+    }
+};
+
+class small_max_audio_module: public audio_operator_audio_module<2>
+{
+public:
+    void process(uint32_t count) {
+        for (uint32_t i = 0; i < count; i++)
+            outs[0][i] = std::max(ins[0][i], ins[1][i]);
+    }
+    static void plugin_info(plugin_info_iface *pii)
+    {
+        pii->names("max", "Function max", "lv2:UtilityPlugin");
+        port_info(pii);
+    }
+};
+
+class small_minus_audio_module: public audio_operator_audio_module<2>
+{
+public:
+    void process(uint32_t count) {
+        for (uint32_t i = 0; i < count; i++)
+            outs[0][i] = ins[0][i] - ins[1][i];
+    }
+    static void plugin_info(plugin_info_iface *pii)
+    {
+        pii->names("minus", "Subtract", "lv2:UtilityPlugin");
+        port_info(pii);
+    }
+};
+
+class small_mul_audio_module: public audio_operator_audio_module<2>
+{
+public:
+    void process(uint32_t count) {
+        for (uint32_t i = 0; i < count; i++)
+            outs[0][i] = ins[0][i] * ins[1][i];
+    }
+    static void plugin_info(plugin_info_iface *pii)
+    {
+        pii->names("mul", "Multiply", "lv2:UtilityPlugin");
+        port_info(pii);
+    }
+};
+
+class small_neg_audio_module: public audio_operator_audio_module<1>
+{
+public:
+    void process(uint32_t count) {
+        for (uint32_t i = 0; i < count; i++)
+            outs[0][i] = -ins[0][i];
+    }
+    static void plugin_info(plugin_info_iface *pii)
+    {
+        pii->names("neg", "Negative value", "lv2:UtilityPlugin");
+        port_info(pii);
+    }
+};
+
+class small_map_lin2exp_audio_module: public null_small_audio_module
+{
+public:    
+    enum { in_signal, in_from_min, in_from_max, in_to_min, in_to_max, in_count };
+    enum { out_signal, out_count };
+    float *ins[in_count]; 
+    float *outs[out_count];
+    uint32_t srate;
+    
+    static void plugin_info(plugin_info_iface *pii)
+    {
+        pii->names("lin2exp", "Lin-Exp Mapper", "lv2:UtilityPlugin");
+        pii->control_port("in", "In", 0.f).input();
+        pii->control_port("from_min", "Min (from)", 0).input();
+        pii->control_port("from_max", "Max (from)", 1).input();
+        pii->control_port("to_min", "Min (to)", 20).input();
+        pii->control_port("to_max", "Max (to)", 20000).input();
+        pii->control_port("out", "Out", 0.f).output();
+    }
+    void set_sample_rate(uint32_t sr) {
+        srate = sr;
+    }
+    void process(uint32_t count) {
+        float normalized = (*ins[in_signal] - *ins[in_from_min]) / (*ins[in_from_max] - *ins[in_from_min]);
+        *outs[out_signal] = *ins[in_to_min] * pow(*ins[in_to_max] / *ins[in_to_min], normalized);
+    }
+};
+
+#define SMALL_OSC_TABLE_BITS 12
+
+class small_freq_only_osc_audio_module: public null_small_audio_module
+{
+public:    
+    typedef waveform_family<SMALL_OSC_TABLE_BITS> waves_type;
+    enum { in_freq, in_count };
+    enum { out_signal, out_count};
+    enum { wave_size = 1 << SMALL_OSC_TABLE_BITS };
+    float *ins[in_count]; 
+    float *outs[out_count];
+    waves_type *waves;
+    waveform_oscillator<SMALL_OSC_TABLE_BITS> osc;
+    uint32_t srate;
+    double odsr;
+
+    /// Fill the array with the original, non-bandlimited, waveform
+    virtual void get_original_waveform(float data[wave_size]) = 0;
+    /// This function needs to be virtual to ensure a separate wave family for each class (but not each instance)
+    virtual waves_type *get_waves() = 0;
+    void activate() {
+        waves = get_waves();
+    }
+    void set_sample_rate(uint32_t sr) {
+        srate = sr;
+        odsr = 1.0 / sr;
+    }
+    void process(uint32_t count)
+    {
+        osc.set_freq_odsr(*ins[in_freq], odsr);
+        osc.waveform = waves->get_level(osc.phasedelta);
+        if (osc.waveform)
+        {
+            for (uint32_t i = 0; i < count; i++)
+                outs[out_signal][i] = osc.get();
+        }
+        else
+            dsp::zero(outs[out_signal], count);
+    }
+    static void port_info(plugin_info_iface *pii)
+    {
+        pii->control_port("freq", "Frequency", 440).input().log_range(20, 20000);
+        pii->audio_port("out", "Out").output();
+    }
+    /// Generate a wave family (bandlimit levels) from the original wave
+    waves_type *create_waves() {
+        waves_type *ptr = new waves_type;
+        float source[wave_size];
+        get_original_waveform(source);
+        bandlimiter<SMALL_OSC_TABLE_BITS> bl;
+        ptr->make(bl, source);
+        return ptr;
+    }
+};
+
+#define OSC_MODULE_GET_WAVES() \
+    virtual waves_type *get_waves() { \
+        static waves_type *waves = NULL; \
+        if (!waves) \
+            waves = create_waves(); \
+        return waves; \
+    }
+
+class small_square_osc_audio_module: public small_freq_only_osc_audio_module
+{
+public:
+    OSC_MODULE_GET_WAVES()
+
+    virtual void get_original_waveform(float data[wave_size]) {
+        for (int i = 0; i < wave_size; i++)
+            data[i] = (i < wave_size / 2) ? +1 : -1;
+    }
+    static void plugin_info(plugin_info_iface *pii)
+    {
+        pii->names("squareosc", "Square Oscillator", "lv2:OscillatorPlugin");
+        port_info(pii);
+    }
+};
+
+class small_saw_osc_audio_module: public small_freq_only_osc_audio_module
+{
+public:
+    OSC_MODULE_GET_WAVES()
+
+    virtual void get_original_waveform(float data[wave_size]) {
+        for (int i = 0; i < wave_size; i++)
+            data[i] = (i * 2.0 / wave_size) - 1;
+    }
+    static void plugin_info(plugin_info_iface *pii)
+    {
+        pii->names("sawosc", "Saw Oscillator", "lv2:OscillatorPlugin");
+        port_info(pii);
+    }
+};
+
+class small_print_audio_module: public null_small_audio_module
+{
+public:    
+    enum { in_count = 1, out_count = 0 };
+    float *ins[in_count]; 
+    float *outs[out_count];
+    uint32_t srate;
+    
+    static void plugin_info(plugin_info_iface *pii)
+    {
+        pii->names("print", "Print To Console (C)", "lv2:UtilityPlugin");
+        pii->control_port("in", "In", 0).input();
+    }
+    void set_sample_rate(uint32_t sr) {
+        srate = sr;
+    }
+    void process(uint32_t)
+    {
+        printf("%f\n", *ins[0]);
+    }
+};
+
+class small_print2_audio_module: public null_small_audio_module
+{
+public:    
+    enum { in_count = 1, out_count = 0 };
+    float *ins[in_count]; 
+    float *outs[out_count];
+    uint32_t srate;
+    
+    static void plugin_info(plugin_info_iface *pii)
+    {
+        pii->names("print2", "Print To Console (A)", "lv2:UtilityPlugin");
+        pii->audio_port("in", "In").input();
+    }
+    void set_sample_rate(uint32_t sr) {
+        srate = sr;
+    }
+    void process(uint32_t)
+    {
+        printf("%f\n", *ins[0]);
+    }
+};
+
+template<bool audio>
+class small_quadpower_audio_module: public null_small_audio_module
+{
+public:    
+    enum { in_value, in_factor, in_count , out_count = 4 };
+    float *ins[in_count]; 
+    float *outs[out_count];
+    
+    static void plugin_info(plugin_info_iface *pii)
+    {
+        const char *names[8] = {"xa", "x*a^1", "xaa", "x*a^2", "xaaa", "x*a^3", "xaaaa", "x*a^4" };
+        if (audio)
+            pii->names("quadpower_a", "Quad Power (A)", "lv2:UtilityPlugin");
+        else
+            pii->names("quadpower_c", "Quad Power (C)", "lv2:UtilityPlugin");
+        if (audio)
+            pii->audio_port("x", "x").input();
+        else
+            pii->control_port("x", "x", 1).input();
+        pii->control_port("a", "a", 1).input();
+        for (int i = 0; i < 8; i += 2)
+            if (audio)
+                pii->audio_port(names[i], names[i+1]).output();
+            else
+                pii->control_port(names[i], names[i+1], 0).output();
+    }
+};
+
+class small_quadpower_a_audio_module: public small_quadpower_audio_module<true>
+{
+public:
+    void process(uint32_t count)
+    {
+        float a = *ins[in_factor];
+        for (uint32_t i = 0; i < count; i++)
+        {
+            float x = ins[in_value][i];
+            outs[0][i] = x * a;
+            outs[1][i] = x * a * a;
+            outs[2][i] = x * a * a * a;
+            outs[3][i] = x * a * a * a * a;
+        }
+    }
+};
+
+class small_quadpower_c_audio_module: public small_quadpower_audio_module<false>
+{
+public:
+    void process(uint32_t)
+    {
+        float x = *ins[in_value];
+        float a = *ins[in_factor];
+        *outs[0] = x * a;
+        *outs[1] = x * a * a;
+        *outs[2] = x * a * a * a;
+        *outs[3] = x * a * a * a * a;
+    }
+};
+
+#define PER_MODULE_ITEM(...) 
+#define PER_SMALL_MODULE_ITEM(name, id) SMALL_WRAPPERS(name, id)
+#include <calf/modulelist.h>
+
+const LV2_Descriptor *synth::lv2_small_descriptor(uint32_t index)
+{
+    #define PER_MODULE_ITEM(...) 
+    #define PER_SMALL_MODULE_ITEM(name, id) if (!(index--)) return &::lv2_small_##name.descriptor;
+    #include <calf/modulelist.h>
+    return NULL;
+}
+#endif
+#endif
+
+void synth::get_all_small_plugins(plugin_list_info_iface *iface)
+{
+    #define PER_MODULE_ITEM(name, isSynth, jackname) 
+    #define PER_SMALL_MODULE_ITEM(name, id) { plugin_info_iface *pii = &iface->plugin(id); small_##name##_audio_module::plugin_info(pii); pii->finalize(); }
+    #include <calf/modulelist.h>
+}
 
diff --git a/src/plugin.cpp b/src/plugin.cpp
new file mode 100644
index 0000000..f27e4cd
--- /dev/null
+++ b/src/plugin.cpp
@@ -0,0 +1,90 @@
+/* Calf DSP Library
+ * Example audio modules - LADSPA/DSSI/LV2 wrapper instantiation
+ *
+ * Copyright (C) 2001-2008 Krzysztof Foltman
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+#include <calf/modules.h>
+
+#if USE_LADSPA
+#define LADSPA_WRAPPER(mod) static synth::ladspa_wrapper<mod##_audio_module> ladspa_##mod(mod##_audio_module::plugin_info);
+#else
+#define LADSPA_WRAPPER(mod)
+#endif
+
+#if USE_LV2
+#define LV2_WRAPPER(mod) static synth::lv2_wrapper<mod##_audio_module> lv2_##mod(mod##_audio_module::plugin_info);
+#else
+#define LV2_WRAPPER(...)
+#endif
+
+#define ALL_WRAPPERS(mod) LADSPA_WRAPPER(mod) LV2_WRAPPER(mod)
+
+#if USE_LV2
+// instantiate descriptor templates
+template<class Module> LV2_Descriptor synth::lv2_wrapper<Module>::descriptor;
+
+extern "C" {
+
+const LV2_Descriptor *lv2_descriptor(uint32_t index)
+{
+    #define PER_MODULE_ITEM(name, isSynth, jackname) if (!(index--)) return &::lv2_##name.descriptor;
+    #define PER_SMALL_MODULE_ITEM(...) 
+    #include <calf/modulelist.h>
+#ifdef ENABLE_EXPERIMENTAL
+    return lv2_small_descriptor(index);
+#else
+    return NULL;
+#endif
+}
+
+};
+
+#endif
+#if USE_LADSPA
+extern "C" {
+
+const LADSPA_Descriptor *ladspa_descriptor(unsigned long Index)
+{
+    #define PER_MODULE_ITEM(name, isSynth, jackname) if (!isSynth && !(Index--)) return &::ladspa_##name.descriptor;
+    #define PER_SMALL_MODULE_ITEM(...)
+    #include <calf/modulelist.h>
+    return NULL;
+}
+
+};
+
+#if USE_DSSI
+extern "C" {
+
+const DSSI_Descriptor *dssi_descriptor(unsigned long Index)
+{
+    #define PER_MODULE_ITEM(name, isSynth, jackname) if (!(Index--)) return &::ladspa_##name.dssi_descriptor;
+    #define PER_SMALL_MODULE_ITEM(...)
+    #include <calf/modulelist.h>
+    return NULL;
+}
+
+};
+#endif
+
+#endif
+
+#define PER_MODULE_ITEM(name, isSynth, jackname) ALL_WRAPPERS(name)
+#define PER_SMALL_MODULE_ITEM(...)
+#include <calf/modulelist.h>
+
diff --git a/src/synth.cpp b/src/synth.cpp
index f659fe8..2cb770f 100644
--- a/src/synth.cpp
+++ b/src/synth.cpp
@@ -29,6 +29,7 @@
 
 using namespace dsp;
 using namespace synth;
+using namespace std;
 
 void basic_synth::kill_note(int note, int vel, bool just_one)
 {

-- 
calf audio plugins packaging



More information about the pkg-multimedia-commits mailing list