[arch-commits] Commit in guitarix/trunk (2 files)

David Runge dvzrv at archlinux.org
Sun Mar 15 16:57:01 UTC 2020


    Date: Sunday, March 15, 2020 @ 16:56:56
  Author: dvzrv
Revision: 598359

upgpkg: guitarix 0.39.0-3: Adding a lot of upstream patches to be able to use faust in the creation process of the plugins and fix a broken lv2 plugin, that caused trouble in plugin hosts.

Added:
  guitarix/trunk/guitarix-0.39.0-fix_faust_and_lv2_plugins.patch
Modified:
  guitarix/trunk/PKGBUILD

-------------------------------------------------+
 PKGBUILD                                        |   16 
 guitarix-0.39.0-fix_faust_and_lv2_plugins.patch | 3296 ++++++++++++++++++++++
 2 files changed, 3307 insertions(+), 5 deletions(-)

Modified: PKGBUILD
===================================================================
--- PKGBUILD	2020-03-15 16:25:00 UTC (rev 598358)
+++ PKGBUILD	2020-03-15 16:56:56 UTC (rev 598359)
@@ -2,7 +2,7 @@
 
 pkgname=guitarix
 pkgver=0.39.0
-pkgrel=2
+pkgrel=3
 pkgdesc="A simple mono guitar amplifier and FX for JACK using Faust"
 arch=('x86_64')
 url="https://guitarix.org"
@@ -12,12 +12,19 @@
 'glib2' 'glibc' 'glibmm' 'gtk2' 'gtkmm' 'libboost_iostreams.so' 'libcurl.so'
 'libjack.so' 'liblilv-0.so' 'liblrdf.so' 'libsndfile.so' 'libzita-convolver.so'
 'libzita-resampler.so' 'pango' 'pangomm' 'ttf-roboto')
-makedepends=('boost' 'eigen' 'gperf' 'intltool' 'ladspa' 'lv2' 'waf')
+makedepends=('boost' 'eigen' 'faust' 'gperf' 'intltool' 'ladspa' 'lv2' 'waf')
 provides=('libgxw.so' 'libgxwmm.so')
 replaces=('guitarix2')
-source=("${pkgname}-${pkgver}.tar.xz::https://download.sourceforge.net/project/guitarix/guitarix/${pkgname}2-${pkgver}.tar.xz")
-sha512sums=('5eb799498385ab9aa865e3f5a7e79d77f7f62c9bd7ad6875ec32bdec85829ed5b84bed3b0eab786ce74088fe2e1d53080f70afcb25ab1ef8d8f78a676b4947df')
+source=("${pkgname}-${pkgver}.tar.xz::https://download.sourceforge.net/project/guitarix/guitarix/${pkgname}2-${pkgver}.tar.xz"
+        "${pkgname}-0.39.0-fix_faust_and_lv2_plugins.patch")
+sha512sums=('5eb799498385ab9aa865e3f5a7e79d77f7f62c9bd7ad6875ec32bdec85829ed5b84bed3b0eab786ce74088fe2e1d53080f70afcb25ab1ef8d8f78a676b4947df'
+            '19e1573ced97e87dc8b64dcfcb5f9eff01650600fee317e0d75824550e0ac614ec06a98668c34c2d64c9043085318c07de7cce4c1e0a39be61b2fe613c6148b5')
 
+prepare() {
+  cd "${pkgname}-${pkgver}"
+  patch -Np2 -i "../${pkgname}-0.39.0-fix_faust_and_lv2_plugins.patch"
+}
+
 build() {
   cd "${pkgname}-${pkgver}"
   # when building with faust 2.20.2 it fails: https://sourceforge.net/p/guitarix/bugs/86/
@@ -25,7 +32,6 @@
                 --enable-nls \
                 --ladspa \
                 --new-ladspa \
-                --no-faust \
                 --shared-lib \
                 --lib-dev \
                 --ldflags="${LDFLAGS}"

Added: guitarix-0.39.0-fix_faust_and_lv2_plugins.patch
===================================================================
--- guitarix-0.39.0-fix_faust_and_lv2_plugins.patch	                        (rev 0)
+++ guitarix-0.39.0-fix_faust_and_lv2_plugins.patch	2020-03-15 16:56:56 UTC (rev 598359)
@@ -0,0 +1,3296 @@
+From 949555d976d8cb3cd98be56ebe464ce7f859007b Mon Sep 17 00:00:00 2001
+From: brummer10 <brummer- at web.de>
+Date: Tue, 14 Jan 2020 18:59:07 +0100
+Subject: [PATCH 1/8]  fix issue #86
+
+---
+ trunk/src/LV2/faust-generated/highbooster.cc | 4 ++--
+ trunk/src/LV2/faust/highbooster.dsp          | 2 +-
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/trunk/src/LV2/faust-generated/highbooster.cc b/trunk/src/LV2/faust-generated/highbooster.cc
+index 91a19fea..35c95ae9 100644
+--- a/trunk/src/LV2/faust-generated/highbooster.cc
++++ b/trunk/src/LV2/faust-generated/highbooster.cc
+@@ -72,7 +72,7 @@ inline void Dsp::init(uint32_t samplingFreq)
+ 	fConst3 = (0.0 - (1.0 / (fConst2 * fConst0)));
+ 	fConst4 = (1.0 / fConst2);
+ 	fConst5 = (1.0 - fConst1);
+-	fVslider0 = FAUSTFLOAT(0.0);
++	fVslider0 = FAUSTFLOAT(0.5);
+ 	clear_state_f();
+ }
+ 
+@@ -107,7 +107,7 @@ void Dsp::connect(uint32_t port,void* data)
+ 	switch ((PortIndex)port)
+ 	{
+ 	case LEVEL: 
+-		fVslider0_ = (float*)data; // , 0.0, 0.5, 20.0, 0.5 
++		fVslider0_ = (float*)data; // , 0.5, 0.0, 20.0, 0.5 
+ 		break;
+ 	default:
+ 		break;
+diff --git a/trunk/src/LV2/faust/highbooster.dsp b/trunk/src/LV2/faust/highbooster.dsp
+index af4d839a..67a1df85 100644
+--- a/trunk/src/LV2/faust/highbooster.dsp
++++ b/trunk/src/LV2/faust/highbooster.dsp
+@@ -3,7 +3,7 @@ declare category "Tone Control";
+ 
+ import("stdfaust.lib");
+ 
+-level = vslider("Level", 0, 0.5, 20, 0.5) ;
++level = vslider("Level", 0.5, 0.0, 20, 0.5) ;
+ hfboost(level,fx,x) = x + (ba.db2linear(level)-1)*fi.highpass(1,fx,x);
+ 
+ process = hfboost(level, 1500);
+-- 
+2.25.1
+
+
+From a021bf7de6beae98f8c84a0b48b3a578aa8c19cf Mon Sep 17 00:00:00 2001
+From: brummer10 <brummer- at web.de>
+Date: Mon, 20 Jan 2020 07:32:47 +0100
+Subject: [PATCH 2/8]  rename src/LV2/gx_wah.lv2 to src/LV2/gx_colwah.lv2 to
+ avoid install of empty LV2 bundle
+
+---
+ trunk/src/LV2/gx_colwah.lv2/gx_colwah.cpp     | 254 ++++++++++++++
+ trunk/src/LV2/gx_colwah.lv2/gx_colwah.h       |  42 +++
+ trunk/src/LV2/gx_colwah.lv2/gx_colwah.ttl     | 141 ++++++++
+ trunk/src/LV2/gx_colwah.lv2/gx_colwah_gui.cpp | 314 ++++++++++++++++++
+ trunk/src/LV2/gx_colwah.lv2/manifest.ttl.in   |  26 ++
+ trunk/src/LV2/gx_colwah.lv2/modgui.ttl        |   2 +
+ trunk/src/LV2/gx_colwah.lv2/wah.h             |  26 ++
+ trunk/src/LV2/gx_colwah.lv2/widget.cpp        | 268 +++++++++++++++
+ trunk/src/LV2/gx_colwah.lv2/widget.h          |  96 ++++++
+ trunk/src/LV2/gx_colwah.lv2/wscript           |  62 ++++
+ 10 files changed, 1231 insertions(+)
+ create mode 100644 trunk/src/LV2/gx_colwah.lv2/gx_colwah.cpp
+ create mode 100644 trunk/src/LV2/gx_colwah.lv2/gx_colwah.h
+ create mode 100644 trunk/src/LV2/gx_colwah.lv2/gx_colwah.ttl
+ create mode 100644 trunk/src/LV2/gx_colwah.lv2/gx_colwah_gui.cpp
+ create mode 100644 trunk/src/LV2/gx_colwah.lv2/manifest.ttl.in
+ create mode 100644 trunk/src/LV2/gx_colwah.lv2/modgui.ttl
+ create mode 100644 trunk/src/LV2/gx_colwah.lv2/wah.h
+ create mode 100644 trunk/src/LV2/gx_colwah.lv2/widget.cpp
+ create mode 100644 trunk/src/LV2/gx_colwah.lv2/widget.h
+ create mode 100644 trunk/src/LV2/gx_colwah.lv2/wscript
+
+diff --git a/trunk/src/LV2/gx_colwah.lv2/gx_colwah.cpp b/trunk/src/LV2/gx_colwah.lv2/gx_colwah.cpp
+new file mode 100644
+index 00000000..331cf3fb
+--- /dev/null
++++ b/trunk/src/LV2/gx_colwah.lv2/gx_colwah.cpp
+@@ -0,0 +1,254 @@
++/*
++ * Copyright (C) 2014 Guitarix project MOD project
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU 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 General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
++ * --------------------------------------------------------------------------
++ */
++
++
++////////////////////////////// LOCAL INCLUDES //////////////////////////
++
++#include "gx_common.h"      // faust support and denormal protection (SSE)
++#include "gx_colwah.h"        // define struct PortIndex
++#include "gx_pluginlv2.h"   // define struct PluginLV2
++#include "wah.h"    // dsp class generated by faust -> dsp2cc
++
++////////////////////////////// PLUG-IN CLASS ///////////////////////////
++
++#define declare(n) namespace n { PluginLV2 *plugin(); }
++
++declare(colwah);
++declare(dallaswah);
++declare(foxwah);
++declare(jenwah);
++declare(maestrowah);
++declare(selwah);
++declare(voxwah);
++
++static plug wah_model [] = {
++    colwah::plugin, //0
++    dallaswah::plugin, //1
++    foxwah::plugin, //2
++    jenwah::plugin, //3
++    maestrowah::plugin, //4
++    selwah::plugin, //5
++    voxwah::plugin, //6
++};
++
++static const size_t WAH_COUNT = sizeof(wah_model) / sizeof(wah_model[0]);
++
++
++namespace colwah {
++
++class Gx_colwah_
++{
++private:
++  // pointer to buffer
++  float*      output;
++  float*      input;
++  // pointer to dsp class
++  PluginLV2*                   wah[WAH_COUNT];
++  float*                       wahh_model;
++  uint32_t                     wah_model_;
++  uint32_t                     wah_max;
++  // private functions
++  inline void run_dsp_(uint32_t n_samples);
++  inline void connect_(uint32_t port,void* data);
++  inline void init_dsp_(uint32_t rate);
++  inline void connect_all__ports(uint32_t port, void* data);
++  inline void activate_f();
++  inline void clean_up();
++  inline void deactivate_f();
++
++public:
++  // LV2 Descriptor
++  static const LV2_Descriptor descriptor;
++  // static wrapper to private functions
++  static void deactivate(LV2_Handle instance);
++  static void cleanup(LV2_Handle instance);
++  static void run(LV2_Handle instance, uint32_t n_samples);
++  static void activate(LV2_Handle instance);
++  static void connect_port(LV2_Handle instance, uint32_t port, void* data);
++  static LV2_Handle instantiate(const LV2_Descriptor* descriptor,
++                                double rate, const char* bundle_path,
++                                const LV2_Feature* const* features);
++  Gx_colwah_();
++  ~Gx_colwah_();
++};
++
++// constructor
++Gx_colwah_::Gx_colwah_() :
++  output(NULL),
++  input(NULL),
++  wahh_model(NULL),
++  wah_model_(0)  {};
++
++// destructor
++Gx_colwah_::~Gx_colwah_()
++{
++  for(uint32_t i=0; i<WAH_COUNT; i++) {
++    wah[i]->delete_instance(wah[i]);
++  }
++
++};
++
++///////////////////////// PRIVATE CLASS  FUNCTIONS /////////////////////
++
++void Gx_colwah_::init_dsp_(uint32_t rate)
++{
++  AVOIDDENORMALS(); // init the SSE denormal protection
++
++  for(uint32_t i=0; i<WAH_COUNT; i++) {
++        wah[i] = wah_model[i]();
++        wah[i]->set_samplerate(rate, wah[i]);
++    }
++  wah_max = WAH_COUNT-1;
++}
++
++// connect the Ports used by the plug-in class
++void Gx_colwah_::connect_(uint32_t port,void* data)
++{
++  switch ((PortIndex)port)
++    {
++    case EFFECTS_OUTPUT:
++      output = static_cast<float*>(data);
++      break;
++    case EFFECTS_INPUT:
++      input = static_cast<float*>(data);
++      break;
++    case MODEL:
++      wahh_model =  static_cast<float*>(data);
++      break;
++    default:
++      break;
++    }
++}
++
++void Gx_colwah_::activate_f()
++{
++  // allocate the internal DSP mem
++}
++
++void Gx_colwah_::clean_up()
++{
++  // delete the internal DSP mem
++}
++
++void Gx_colwah_::deactivate_f()
++{
++  // delete the internal DSP mem
++}
++
++void Gx_colwah_::run_dsp_(uint32_t n_samples)
++{
++  if (n_samples< 1) return;
++  wah_model_ = min(wah_max, static_cast<uint32_t>(*(wahh_model)));
++  wah[wah_model_]->mono_audio(static_cast<int>(n_samples), input, output, wah[wah_model_]);
++}
++
++void Gx_colwah_::connect_all__ports(uint32_t port, void* data)
++{
++  // connect the Ports used by the plug-in class
++  connect_(port,data); 
++  // connect the Ports used by the DSP class
++  for(uint32_t i=0; i<WAH_COUNT; i++) {
++        wah[i]->connect_ports(port, data, wah[i]);
++    }
++}
++
++////////////////////// STATIC CLASS  FUNCTIONS  ////////////////////////
++
++LV2_Handle 
++Gx_colwah_::instantiate(const LV2_Descriptor* descriptor,
++                            double rate, const char* bundle_path,
++                            const LV2_Feature* const* features)
++{
++  // init the plug-in class
++  Gx_colwah_ *self = new Gx_colwah_();
++  if (!self)
++    {
++      return NULL;
++    }
++
++  self->init_dsp_((uint32_t)rate);
++
++  return (LV2_Handle)self;
++}
++
++void Gx_colwah_::connect_port(LV2_Handle instance, 
++                                   uint32_t port, void* data)
++{
++  // connect all ports
++  static_cast<Gx_colwah_*>(instance)->connect_all__ports(port, data);
++}
++
++void Gx_colwah_::activate(LV2_Handle instance)
++{
++  // allocate needed mem
++  static_cast<Gx_colwah_*>(instance)->activate_f();
++}
++
++void Gx_colwah_::run(LV2_Handle instance, uint32_t n_samples)
++{
++  // run dsp
++  static_cast<Gx_colwah_*>(instance)->run_dsp_(n_samples);
++}
++
++void Gx_colwah_::deactivate(LV2_Handle instance)
++{
++  // free allocated mem
++  static_cast<Gx_colwah_*>(instance)->deactivate_f();
++}
++
++void Gx_colwah_::cleanup(LV2_Handle instance)
++{
++  // well, clean up after us
++  Gx_colwah_* self = static_cast<Gx_colwah_*>(instance);
++  self->clean_up();
++  delete self;
++}
++
++const LV2_Descriptor Gx_colwah_::descriptor =
++{
++  GXPLUGIN_URI "#_colwah_",
++  Gx_colwah_::instantiate,
++  Gx_colwah_::connect_port,
++  Gx_colwah_::activate,
++  Gx_colwah_::run,
++  Gx_colwah_::deactivate,
++  Gx_colwah_::cleanup,
++  NULL
++};
++
++
++} // end namespace colwah
++
++////////////////////////// LV2 SYMBOL EXPORT ///////////////////////////
++
++extern "C"
++LV2_SYMBOL_EXPORT
++const LV2_Descriptor*
++lv2_descriptor(uint32_t index)
++{
++  switch (index)
++    {
++    case 0:
++      return &colwah::Gx_colwah_::descriptor;
++    default:
++      return NULL;
++    }
++}
++
++///////////////////////////// FIN //////////////////////////////////////
+diff --git a/trunk/src/LV2/gx_colwah.lv2/gx_colwah.h b/trunk/src/LV2/gx_colwah.lv2/gx_colwah.h
+new file mode 100644
+index 00000000..9b23a29a
+--- /dev/null
++++ b/trunk/src/LV2/gx_colwah.lv2/gx_colwah.h
+@@ -0,0 +1,42 @@
++/*
++ * Copyright (C) 2014 Guitarix project MOD project
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU 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 General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
++ * --------------------------------------------------------------------------
++ */
++
++#pragma once
++
++#ifndef SRC_HEADERS_GXEFFECTS_H_
++#define SRC_HEADERS_GXEFFECTS_H_
++
++#include <lv2.h>
++
++#define GXPLUGIN_URI "http://guitarix.sourceforge.net/plugins/gx_colwah_"
++#define GXPLUGIN_UI_URI "http://guitarix.sourceforge.net/plugins/gx_colwah_gui"
++
++
++typedef enum
++{
++   EFFECTS_OUTPUT,
++   EFFECTS_INPUT,
++   WAH, 
++   FREQ, 
++   MODE, 
++   MODEL, 
++   WET_DRY, 
++} PortIndex;
++
++#endif //SRC_HEADERS_GXEFFECTS_H_
+diff --git a/trunk/src/LV2/gx_colwah.lv2/gx_colwah.ttl b/trunk/src/LV2/gx_colwah.lv2/gx_colwah.ttl
+new file mode 100644
+index 00000000..5ba01ff6
+--- /dev/null
++++ b/trunk/src/LV2/gx_colwah.lv2/gx_colwah.ttl
+@@ -0,0 +1,141 @@
++#
++# Copyright (C) 2014 Guitarix project MOD project
++# 
++# This program is free software; you can redistribute it and/or modify
++# it under the terms of the GNU 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 General Public License for more details.
++#
++# You should have received a copy of the GNU General Public License
++# along with this program; if not, write to the Free Software
++# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
++# --------------------------------------------------------------------------
++#
++
++
++ at prefix doap: <http://usefulinc.com/ns/doap#> .
++ at prefix foaf: <http://xmlns.com/foaf/0.1/> .
++ at prefix lv2: <http://lv2plug.in/ns/lv2core#> .
++ at prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
++ at prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
++ at prefix guiext: <http://lv2plug.in/ns/extensions/ui#>.
++ at prefix time: <http://lv2plug.in/ns/ext/time#>.
++ at prefix units: <http://lv2plug.in/ns/extensions/units#> .
++
++<http://guitarix.sourceforge.net#me>
++	a foaf:Person ;
++	foaf:name "Guitarix team" ;
++	foaf:mbox <mailto:guitarix-developer at lists.sourceforge.net> ;
++	rdfs:seeAlso <http://guitarix.sourceforge.net> .
++
++<http://guitarix.sourceforge.net/plugins/gx_colwah_>
++	a doap:Project ;
++	doap:maintainer <http://guitarix.sourceforge.net#me> ;
++	doap:name "Gx_colwah_" .
++
++<http://guitarix.sourceforge.net/plugins/gx_colwah_#_colwah_>
++    a lv2:Plugin ,
++        lv2:ModulatorPlugin ;
++    doap:maintainer <http://guitarix.sourceforge.net#me> ;
++    doap:name "GxWahwah";
++    doap:license <http://opensource.org/licenses/isc> ;
++    lv2:project <http://guitarix.sourceforge.net/plugins/gx_colwah_> ;
++    lv2:optionalFeature lv2:hardRTCapable ;
++      
++    lv2:minorVersion 34;
++    lv2:microVersion 0;
++
++  guiext:ui <http://guitarix.sourceforge.net/plugins/gx_colwah_gui#_colwah_>;
++    
++rdfs:comment """
++
++...
++
++""";
++
++    lv2:port  [
++        a lv2:AudioPort ,
++            lv2:OutputPort ;
++        lv2:index 0 ;
++        lv2:symbol "out" ;
++        lv2:name "Out"
++    ] , [
++        a lv2:AudioPort ,
++            lv2:InputPort ;
++        lv2:index 1 ;
++        lv2:symbol "in" ;
++        lv2:name "In" ;
++    ] 
++      , [
++        a lv2:InputPort ,
++            lv2:ControlPort ;
++        lv2:index 2 ;
++        lv2:symbol "WAH" ;
++        lv2:name "WAH" ;
++        lv2:default 0.0 ;
++        lv2:minimum 0.0 ;
++        lv2:maximum 1.0 ;
++    ]      , [
++        a lv2:InputPort ,
++            lv2:ControlPort ;
++        lv2:index 3 ;
++        lv2:symbol "FREQ" ;
++        lv2:name "FREQ" ;
++        lv2:default 24.0 ;
++        lv2:minimum 24.0 ;
++        lv2:maximum 3.6e+02 ;
++    ]      , [
++        a lv2:InputPort ,
++            lv2:ControlPort ;
++        lv2:index 4 ;
++        lv2:symbol "MODE" ;
++        lv2:name "MODE" ;
++        lv2:default 0.0 ;
++        lv2:minimum 0.0 ;
++        lv2:maximum 2.0 ;
++        lv2:portProperty lv2:integer;
++        lv2:portProperty lv2:enumeration ; 
++        lv2:scalePoint [rdfs:label "manual"; rdf:value 0];
++        lv2:scalePoint [rdfs:label "auto"; rdf:value 1];
++        lv2:scalePoint [rdfs:label "alien"; rdf:value 2];
++
++    ]       , [
++        a lv2:InputPort ,
++            lv2:ControlPort ;
++        lv2:index 5 ;
++        lv2:symbol "MODEL" ;
++        lv2:name "MODEL" ;
++        lv2:default 0.0 ;
++        lv2:minimum 0.0 ;
++        lv2:maximum 6.0 ;
++        lv2:portProperty lv2:integer;
++        lv2:portProperty lv2:enumeration ; 
++        lv2:scalePoint [rdfs:label "Colorsound Wah"; rdf:value 0];
++        lv2:scalePoint [rdfs:label "Dallas Wah"; rdf:value 1];
++        lv2:scalePoint [rdfs:label "Foxx Wah"; rdf:value 2];
++        lv2:scalePoint [rdfs:label "Jen Wah"; rdf:value 3];
++        lv2:scalePoint [rdfs:label "Maestro Wah"; rdf:value 4];
++        lv2:scalePoint [rdfs:label "SelmerWah"; rdf:value 5];
++        lv2:scalePoint [rdfs:label "Vox Wah V847"; rdf:value 6];
++
++    ]      , [
++        a lv2:InputPort ,
++            lv2:ControlPort ;
++        lv2:index 6 ;
++        lv2:symbol "WET_DRY" ;
++        lv2:name "WET_DRY" ;
++        lv2:default 1e+02 ;
++        lv2:minimum 0.0 ;
++        lv2:maximum 1e+02 ;
++    ] .
++
++<http://guitarix.sourceforge.net/plugins/gx_colwah_gui#_colwah_>
++  a guiext:GtkUI;
++  guiext:binary <gx_colwah_gui.so>;
++  guiext:requiredFeature guiext:makeResident;
++  .
+diff --git a/trunk/src/LV2/gx_colwah.lv2/gx_colwah_gui.cpp b/trunk/src/LV2/gx_colwah.lv2/gx_colwah_gui.cpp
+new file mode 100644
+index 00000000..449a8d33
+--- /dev/null
++++ b/trunk/src/LV2/gx_colwah.lv2/gx_colwah_gui.cpp
+@@ -0,0 +1,314 @@
++/*
++ * Copyright (C) 2012 Hermann Meyer, Andreas Degert, Pete Shorthose, Steve Poskitt
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU 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 General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
++ * --------------------------------------------------------------------------
++ */
++
++
++#include <string>
++#include <iostream>
++
++#include <gtkmm.h>
++#include "gx_colwah.h"
++#include "widget.h"
++
++
++#include <lv2.h>
++#include <lv2/lv2plug.in/ns/extensions/ui/ui.h>
++
++using namespace std;
++
++class Gx_colwah_GUI
++{
++private:
++  Glib::ustring plugskin;
++  Glib::ustring addKnob;
++  Glib::ustring plug_name;
++  void set_knob(Glib::ustring knob);
++  void set_skin();
++  void set_plug_name(const char * plugin_uri);
++  GtkWidget* make_gui();
++public:
++
++  Widget* widget;
++  static void set_plug_name_static(Gx_colwah_GUI *self, const char * plugin_uri)
++  {
++    self->set_plug_name(plugin_uri);
++  }
++  static GtkWidget* make_gui_static(Gx_colwah_GUI *self)
++  {
++    return self->make_gui();
++  }
++
++  Gx_colwah_GUI () {};
++  ~Gx_colwah_GUI () {};
++} ;
++
++void Gx_colwah_GUI::set_knob( Glib::ustring knob)
++{
++  addKnob =   " style 'gx_";
++  addKnob +=  plug_name;
++  addKnob +=   "_dark_skin_icons'\n"
++               " { \n"
++               "   stock['bigknob'] = {{'";
++  addKnob +=  knob;
++  addKnob +=  ".png'}}\n"
++              "   stock['smallknob'] = {{'";
++  addKnob +=  knob;
++  addKnob +=  "-small.png'}}\n"
++              "   stock['smallknobr'] = {{'";
++  addKnob +=  knob;
++  addKnob +=  "-middle.png'}}\n"
++              "   stock['button_on'] = {{'"
++              "echo-switch_on.png'}}\n"
++              "   stock['button_off'] = {{'"
++              "echo-switch_off.png'}}\n"
++              " }\n"
++              "widget '*.";
++  addKnob +=  plug_name;
++  addKnob +=  "' style 'gx_";
++  addKnob +=  plug_name;
++  addKnob +=  "_dark_skin_icons' \n"
++              "class '*GxToggleImage' style'gx_"; 
++  addKnob +=  plug_name;
++  addKnob +=  "_dark_skin_icons' \n";
++}
++
++void Gx_colwah_GUI::set_skin()
++{
++  Glib::ustring toparse = "pixmap_path  ";
++  toparse +=     " '";
++  toparse +=        GX_LV2_STYLE_DIR;
++  toparse +=     "/'\n";
++  toparse +=     "style \"gx_";
++  toparse +=     plug_name;
++  toparse +=     "_dark-paintbox\"\n"
++                 " { \n"
++                 "    GxPaintBox::icon-set =9\n"
++                 "    stock['gxhead'] = {{'";
++  toparse +=     plugskin;
++  toparse +=     "'}}\n"
++                 " }\n"
++                 "\n"
++                 "style 'gx_head_black_box' \n"
++                 " { \n"
++                 "    font_name = 'sans bold 7.5'\n"
++                 "    fg[NORMAL] = '#ff9000' \n"
++                 " }\n";
++  toparse +=     addKnob;
++
++  toparse +=     " widget '*.amplabel' style:highest 'gx_head_black_box'\n"
++                 "widget '*.";
++  toparse +=     plug_name;
++  toparse +=     "' style 'gx_";
++  toparse +=     plug_name;
++  toparse +=     "_dark-paintbox' ";
++
++  toparse +=     "style 'guitarix_default' {\n"
++    
++                 "    GxPaintBox::bevel                  = 0.11\n"
++                 "    GxPaintBox::inverse                = 0\n"
++                 "    GxPaintBox::alternate-box          = { 0, 0, 30, 15 }\n"
++
++                 "    fg[NORMAL]              = '#ff9000'\n"
++                 "    fg[ACTIVE]              = { 1.0, 1.0, 1.0 }\n"
++                 "    fg[PRELIGHT]            = { 1.0, 1.0, 1.0 }\n"
++                 "    fg[INSENSITIVE]         = { 0.5, 0.5, 0.5 }\n"
++                 "    fg[SELECTED]            = { 0.9, 0.9, 0.9 }\n"
++    
++                 "    bg[NORMAL]              = { 0.13, 0.13, 0.13 }\n"
++                 "    bg[ACTIVE]              = { 0.0, 0.0, 0.0 }\n"
++                 "    bg[PRELIGHT]            = { 0.25, 0.25, 0.25 }\n"
++                 "    bg[INSENSITIVE]         = { 0.2, 0.2, 0.2 }\n"
++                 "    bg[SELECTED]            = { 0.25, 0.25, 0.25 }\n"
++    
++                 "    text[NORMAL]            = { 0.9, 0.9, 0.9 }\n"
++                 "    text[ACTIVE]            = '#ff9000'\n"
++                 "    text[PRELIGHT]          = { 1.0, 1.0, 1.0 }\n"
++                 "    text[INSENSITIVE]       = { 0.5, 0.5, 0.5 }\n"
++                 "    text[SELECTED]          = { 1.0, 1.0, 1.0 }\n"
++    
++                 "    base[NORMAL]            = { 0.0, 0.0, 0.0 }\n"
++                 "    base[ACTIVE]            = { 0.18, 0.18, 0.18 }\n"
++                 "    base[PRELIGHT]          = { 0.1, 0.1, 0.1 }\n"
++                 "    base[INSENSITIVE]       = { 0.2, 0.2, 0.2 }\n"
++                 "    base[SELECTED]          = { 0.8, 0.18, 0.18 }\n"
++                 "}\n"
++                 "widget '*.";
++  toparse +=     plug_name;
++  toparse +=     "' style:highest 'guitarix_default'\n";
++  toparse +=     " style 'gx_selector'\n"
++                 " {\n"
++                 " fg[NORMAL]     = '#ff9000'   \n"
++                 " fg[PRELIGHT]   = '#ffffff'    \n"
++                 " bg[NORMAL]     = '#2f2f2f'     \n"
++                 " bg[PRELIGHT]   = '#2f2f2f'      \n"
++                 " base[NORMAL]   = { 0.05, 0.05, 0.05 } \n"
++                 " base[PRELIGHT] = '#000000'      \n"
++                 " text[NORMAL]   = '#ff9000'     \n"
++                 " text[PRELIGHT] = '#ffffff'    \n"
++                 " GxRegler::value-border      = { 4, 4, 2, 2 } \n"
++                 " GxRegler::border-radius     = 6\n"
++                 " GxRegler::bevel             = 0.12\n"
++                 " GtkRange::trough-border = 2\n"
++                 " GtkRange::stepper-size = 8\n"
++                 " GtkRange::stepper-spacing = 2\n"
++                 " GxRegler::value-border = { 2, 0, 0, 0 }\n"
++                 " font_name = 'sans bold 7.5'\n"
++                 " xthickness = 8\n"
++                 " ythickness = 4\n"
++                 " }\n"
++                 "class '*GxSelector' style:highest 'gx_selector'\n";
++  toparse +=     " style 'guitarix_knobs' {\n"
++                 "    fg[INSENSITIVE] = '#211006'\n"
++                 "}\n"
++                 "class 'GxKnob' style:highest 'guitarix_knobs'\n"
++
++                 "style 'guitarix_small_knob' {\n"
++                 "    GxKnob::x_center          = -1\n"
++                 "    GxKnob::y_center          = -1\n"
++                 "    GxKnob::ring_radius       = 15\n"
++                 "    GxKnob::ring_width        = 2\n"
++                 "    GxKnob::ring_led_size     = 3\n"
++                 "    GxKnob::ring_led_distance = 2\n"
++                 "    GxKnob::indicator_radius  = 11\n"
++                 "    GxKnob::indicator_width   = 2\n"
++                 "    GxKnob::indicator_length  = 5\n"
++                 "}\n"
++                 "widget_class '*GxSmallKnob' style:highest 'guitarix_small_knob'\n"
++
++                 "style 'guitarix_small_knob_r' {\n"
++                 "    GxKnob::x_center          = -1\n"
++                 "    GxKnob::y_center          = -1\n"
++                 "    GxKnob::ring_radius       = 26\n"
++                 "    GxKnob::ring_width        = 3\n"
++                 "    GxKnob::ring_led_size     = 3\n"
++                 "    GxKnob::ring_led_distance = 2\n"
++                 "    GxKnob::indicator_radius  = 12\n"
++                 "    GxKnob::indicator_width   = 3\n"
++                 "    GxKnob::indicator_length  = 3\n"
++                 "}\n"
++                 "widget_class '*GxSmallKnobR' style:highest 'guitarix_small_knob_r'\n"
++
++                 "style 'guitarix_mid_knob' {\n"
++                 "    GxKnob::x_center          = -1\n"
++                 "    GxKnob::y_center          = -1\n"
++                 "    GxKnob::ring_radius       = 35\n"
++                 "    GxKnob::ring_width        = 6\n"
++                 "    GxKnob::ring_led_size     = 2\n"
++                 "    GxKnob::ring_led_distance = 2\n"
++                 "    GxKnob::indicator_radius  = 27\n"
++                 "    GxKnob::indicator_width   = 2\n"
++                 "    GxKnob::indicator_length  = 6\n"
++                 "}\n"
++                 "widget_class '*GxMidKnob' style:highest 'guitarix_mid_knob'\n"
++
++                 "style 'guitarix_big_knob' {\n"
++                 "    GxKnob::x_center          = -1\n"
++                 "    GxKnob::y_center          = -1\n"
++                 "    GxKnob::ring_radius       = 50.5\n"
++                 "    GxKnob::ring_width        = 3\n"
++                 "    GxKnob::ring_led_size     = 0\n"
++                 "    GxKnob::ring_led_distance = 0\n"
++                 "    GxKnob::indicator_radius  = 46\n"
++                 "    GxKnob::indicator_width   = 3\n"
++                 "    GxKnob::indicator_length  = 6\n"
++                 "}\n"
++                 "widget_class '*GxBigKnob' style:highest 'guitarix_big_knob'\n"
++              " \n";
++
++  gtk_rc_parse_string (toparse.c_str());
++}
++
++void Gx_colwah_GUI::set_plug_name( const char * plugin_uri)
++{
++  addKnob = "";
++
++  if (strcmp("http://guitarix.sourceforge.net/plugins/gx_colwah_gui#_colwah_", plugin_uri) == 0)
++    {
++      plug_name = "Wahwah";
++      //set_knob("nk-knob");
++    }
++  else
++    {
++      plug_name = "Wahwah";
++    }
++}
++
++GtkWidget* Gx_colwah_GUI::make_gui()
++{
++  // init the gxwmm library
++  Gxw::init();
++  set_skin();
++  GtkWidget* container = gtk_vbox_new(FALSE, 2);
++  widget = new Widget(plug_name);
++  GtkWidget* cWidget = GTK_WIDGET(widget->gobj());
++  gtk_container_add(GTK_CONTAINER(container), cWidget );
++
++  return container;
++}
++
++
++static LV2UI_Handle instantiate(const struct _LV2UI_Descriptor * descriptor,
++                                const char * plugin_uri,
++                                const char * bundle_path,
++                                LV2UI_Write_Function write_function,
++                                LV2UI_Controller controller,
++                                LV2UI_Widget * widget,
++                                const LV2_Feature * const * features)
++{
++  Gx_colwah_GUI* self = new Gx_colwah_GUI();
++  if (self == NULL) return NULL;
++  self->set_plug_name_static(self, plugin_uri);
++  *widget = (LV2UI_Widget)self->make_gui_static(self);
++  self->widget->controller = controller;
++  self->widget->write_function = write_function;
++  return (LV2UI_Handle)self;
++}
++
++static void cleanup(LV2UI_Handle ui)
++{
++  Gx_colwah_GUI *pluginGui = static_cast<Gx_colwah_GUI*>(ui);
++  delete pluginGui->widget;
++  delete pluginGui;
++}
++
++static void port_event(LV2UI_Handle ui,
++                       uint32_t port_index,
++                       uint32_t buffer_size,
++                       uint32_t format,
++                       const void * buffer)
++{
++  Gx_colwah_GUI *self = static_cast<Gx_colwah_GUI*>(ui);
++  self->widget->set_value_static( port_index, buffer_size, format, buffer, self->widget);
++  return;
++}
++
++static LV2UI_Descriptor descriptors[] =
++{
++  {GXPLUGIN_UI_URI"#_colwah_", instantiate, cleanup, port_event, NULL}
++};
++
++const LV2UI_Descriptor * lv2ui_descriptor(uint32_t index)
++{
++  //printf("lv2ui_descriptor(%u) called\n", (uint32_t)index);
++  if (index >= sizeof(descriptors) / sizeof(descriptors[0]))
++    {
++      return NULL;
++    }
++  return descriptors + index;
++}
++
+diff --git a/trunk/src/LV2/gx_colwah.lv2/manifest.ttl.in b/trunk/src/LV2/gx_colwah.lv2/manifest.ttl.in
+new file mode 100644
+index 00000000..d67c6974
+--- /dev/null
++++ b/trunk/src/LV2/gx_colwah.lv2/manifest.ttl.in
+@@ -0,0 +1,26 @@
++#
++# Copyright (C) 2012 Hermann Meyer, Andreas Degert, Pete Shorthose, Steve Poskitt
++# 
++# This program is free software; you can redistribute it and/or modify
++# it under the terms of the GNU 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 General Public License for more details.
++#
++# You should have received a copy of the GNU General Public License
++# along with this program; if not, write to the Free Software
++# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
++# --------------------------------------------------------------------------
++#
++
++ at prefix lv2:  <http://lv2plug.in/ns/lv2core#> .
++ at prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
++
++<http://guitarix.sourceforge.net/plugins/gx_colwah_#_colwah_>
++    a lv2:Plugin ;
++    lv2:binary <gx_colwah at LIB_EXT@>  ;
++    rdfs:seeAlso <gx_colwah.ttl> , <modgui.ttl>.
+diff --git a/trunk/src/LV2/gx_colwah.lv2/modgui.ttl b/trunk/src/LV2/gx_colwah.lv2/modgui.ttl
+new file mode 100644
+index 00000000..4e30c382
+--- /dev/null
++++ b/trunk/src/LV2/gx_colwah.lv2/modgui.ttl
+@@ -0,0 +1,2 @@
++ at prefix modgui: <http://moddevices.com/ns/modgui#> .
++ at prefix lv2:    <http://lv2plug.in/ns/lv2core#> .
+diff --git a/trunk/src/LV2/gx_colwah.lv2/wah.h b/trunk/src/LV2/gx_colwah.lv2/wah.h
+new file mode 100644
+index 00000000..01bd2fcb
+--- /dev/null
++++ b/trunk/src/LV2/gx_colwah.lv2/wah.h
+@@ -0,0 +1,26 @@
++/*
++ * Copyright (C) 2014 Guitarix project MOD project
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU 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 General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
++ * --------------------------------------------------------------------------
++ */
++
++#include "colwah.cc"
++#include "dallaswah.cc"
++#include "foxwah.cc"
++#include "jenwah.cc"
++#include "maestrowah.cc"
++#include "selwah.cc"
++#include "voxwah.cc"
+diff --git a/trunk/src/LV2/gx_colwah.lv2/widget.cpp b/trunk/src/LV2/gx_colwah.lv2/widget.cpp
+new file mode 100644
+index 00000000..8575d25f
+--- /dev/null
++++ b/trunk/src/LV2/gx_colwah.lv2/widget.cpp
+@@ -0,0 +1,268 @@
++/*
++ * Copyright (C) 2012 Hermann Meyer, Andreas Degert, Pete Shorthose, Steve Poskitt
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU 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 General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
++ * --------------------------------------------------------------------------
++ */
++
++
++#include "widget.h"
++
++#include <iostream>
++
++
++/*    @get controller by port
++ *  this function is used by make_selector() make_controller_box()
++ *  set_value() and on_value_changed()
++ *  so controller widgets needs only here asined to a port, 
++ *  and all functions which need acess to the controller widget pointer 
++ *  can receive them by port number
++ */
++
++Gtk::Widget* Widget::get_controller_by_port(uint32_t port_index)
++{
++  switch ((PortIndex)port_index )
++  {
++    case WAH:
++      return &m_bigknob[0];
++    case FREQ:
++      return &m_bigknob[1];
++    case MODE:
++      return &m_selector[0];
++    case MODEL:
++      return &m_selector[1];
++    case WET_DRY:
++      return &m_bigknob[2];
++
++    default:
++      return NULL;
++  } 
++}
++
++Widget::Widget(Glib::ustring plugname):
++plug_name(plugname),
++logo(plugname)
++{
++  Glib::ustring enumMODEL[] = {"Colorsound Wah","Dallas Wah","Foxx Wah","Jen Wah","Maestro Wah","Selmer Wah","Vox Wah V847"};
++  static const size_t enumMODEL_size = sizeof(enumMODEL) / sizeof(enumMODEL[0]);
++  make_selector_box(&m_vboxs[0],"MODEL", enumMODEL, enumMODEL_size, 0,1.0, MODEL);
++
++  Glib::ustring enumMODE[] = {"manual","auto","alien"};
++  static const size_t enumMODE_size = sizeof(enumMODE) / sizeof(enumMODE[0]);
++  make_selector_box(&m_vboxs[1],"MODE", enumMODE, enumMODE_size, 0,1.0, MODE);
++
++  // create controllers for port name
++  make_controller_box(&m_vboxc[0], "WAH", 0.0, 1.0, 0.01, WAH);
++  make_controller_box(&m_vboxc[1], "ALIEN FREQ", 24.0, 3.6e+02, 1.0, FREQ);
++  make_controller_box(&m_vboxc[2], "WET_DRY", 0.0, 1e+02, 1.0, WET_DRY);
++
++  // set propertys for the main paintbox holding the skin
++  m_paintbox.set_border_width(10);
++  m_paintbox.set_spacing(6);
++  m_paintbox.set_homogeneous(false);
++  m_paintbox.set_name(plug_name);
++  m_paintbox.property_paint_func() = "rack_unit_expose";
++  add(m_paintbox);
++  // box for the controllers
++  m_hbox_.set_spacing(25);
++  m_hbox_.set_border_width(24);
++  m_hbox_.set_homogeneous(false);
++  // set a vertical box in the paintbox
++  m_vbox.set_border_width(14);
++  m_vbox1.set_border_width(14);
++  m_paintbox.pack_start(m_vbox_);
++
++  // modify logo layout
++  Pango::FontDescription font_desc = logo.get_style()->get_font();
++  font_desc.set_size(int(14*Pango::SCALE));
++  font_desc.set_weight(Pango::WEIGHT_BOLD);
++  logo.modify_font(font_desc);
++
++  // and controller box on top
++  //m_hbox1_.set_border_width(24);
++  m_hbox1_.set_spacing(64);
++  logo.set_name("amplabel");
++  m_vbox_.pack_start(m_hbox1_, Gtk::PACK_SHRINK);
++  m_hbox1_.pack_start(m_vbox1_, Gtk::PACK_EXPAND_PADDING);
++  m_hbox1_.pack_end(m_vbox2_, Gtk::PACK_SHRINK);
++  m_hbox1_.pack_end(logo, Gtk::PACK_SHRINK);
++  m_vbox_.pack_start(m_hbox_, Gtk::PACK_SHRINK);
++  m_vbox_.set_homogeneous(false);
++   // put boxed controllers into controller box
++  m_hbox_.pack_start(m_vbox1, Gtk::PACK_EXPAND_PADDING);
++  for (int i = 0; i<2;i++) {
++    m_vboxs_.pack_start(m_vboxs[i]);
++  }
++  m_vboxs_.set_spacing(5);
++  m_hbox_.pack_start(m_vboxs_, Gtk::PACK_EXPAND_PADDING);
++  for (int i = 0; i<3;i++) {
++    m_hbox_.pack_start(m_vboxc[i]);
++  }
++  m_hbox_.pack_start(m_vbox, Gtk::PACK_EXPAND_PADDING);
++
++  // connect expose handler as resize handler
++  m_paintbox.signal_expose_event().connect(
++    sigc::mem_fun(this, &Widget::_expose_event), true);
++
++  set_app_paintable(true);
++  show_all();
++}
++
++Widget::~Widget()
++{
++
++}
++
++// set borderwith for paintbox when widget resize
++// to hold controllers in place
++bool Widget::_expose_event(GdkEventExpose *event)
++{
++  int x, y, width, height, depth;
++  m_paintbox.get_window()->get_geometry(x, y, width, height, depth);
++  //double_t height = m_paintbox.get_window()->get_height();
++  m_paintbox.set_border_width(height/10);
++  return false;
++}
++
++// create selectors from gxwmm
++void Widget::make_selector_box(Gtk::Box *box,
++                               Glib::ustring labela,
++                               Glib::ustring tables[],
++                               size_t _size,
++                               float min, float digits,
++                               PortIndex port_name)
++{
++  Gxw::Selector *regler = static_cast<Gxw::Selector*>
++                                    (get_controller_by_port(port_name));
++  if (regler)
++  {
++    float max = static_cast<float>(_size+1);
++
++    Gtk::TreeModelColumn<Glib::ustring> label;
++    Gtk::TreeModelColumnRecord rec;
++    rec.add(label);
++    Glib::RefPtr<Gtk::ListStore> ls = Gtk::ListStore::create(rec);
++
++    for (uint32_t i = 0 ; i< _size; ++i) {
++      ls->append()->set_value(0, tables[i]);
++    }
++    regler->set_model(ls);
++    regler->set_has_tooltip();
++    regler->set_tooltip_text(labela);
++    regler->cp_configure("SELECTOR", labela, min, max, digits);
++    regler->set_show_value(false);
++    regler->set_name(plug_name);
++    regler->signal_value_changed().connect(sigc::bind(sigc::mem_fun(
++           *this, &Widget::on_value_changed), port_name));
++    box->pack_start(*regler,Gtk::PACK_SHRINK);
++  }
++}
++
++// create stackboxes with controllers for port name
++void Widget::make_controller_box(Gtk::Box *box,
++                                 Glib::ustring label,
++                                 float min, float max,
++                                 float digits,
++                                 PortIndex port_name)
++{
++  Gxw::Regler *regler = static_cast<Gxw::Regler*>(
++                                    get_controller_by_port(port_name));
++  if (regler)
++  {
++    Gtk::Label* pr = new Gtk::Label(label, 0);
++    pr->set_name("amplabel");
++    // use label images instead simple string labes
++    //Glib::ustring  label_image = GX_LV2_STYLE_DIR;
++    //label_image += "/";
++    //label_image += label;
++    //label_image += ".png";
++    //Gtk::Image *pr = new Gtk::Image(label_image);
++
++    Gtk::VBox* b1 = new Gtk::VBox();
++    box->pack_start( *Gtk::manage(b1), Gtk::PACK_EXPAND_PADDING);
++    box->pack_start( *Gtk::manage(pr),Gtk::PACK_SHRINK);
++    regler->cp_configure("KNOB", label, min, max, digits);
++    regler->set_show_value(true);
++    regler->set_name(plug_name);
++    box->pack_start(*regler,Gtk::PACK_SHRINK);
++    Gtk::VBox* b2 = new Gtk::VBox();
++    box->pack_start( *Gtk::manage(b2), Gtk::PACK_EXPAND_PADDING);
++    regler->signal_value_changed().connect(sigc::bind(sigc::mem_fun(
++           *this, &Widget::on_value_changed), port_name));
++  }
++}
++
++// create stackboxes with switch controller for port name
++void Widget::make_switch_box(Gtk::Box *box,
++                             Glib::ustring label,
++                             PortIndex port_name)
++{
++  Gxw::Switch *regler = static_cast<Gxw::Switch*>(
++                                    get_controller_by_port(port_name));
++  if (regler)
++  {
++    Gtk::Label* pr = new Gtk::Label(label, 0);
++    pr->set_name("amplabel");
++    // use label images instead simple string labes
++    /*Glib::ustring  label_image = GX_LV2_STYLE_DIR;
++    label_image += "/"+plug_name+"-";
++    label_image += label;
++    label_image += "-label.png";
++     Gtk::Image *pr = new Gtk::Image(label_image);*/
++ 
++    regler->cp_configure("switch", label, 0, 1, 1);
++    regler->set_name(plug_name);
++    regler->set_base_name( "button" );
++    Gtk::VBox* b1 = new Gtk::VBox();
++    box->pack_start( *Gtk::manage(b1), Gtk::PACK_EXPAND_PADDING);
++    box->pack_start( *Gtk::manage(pr),Gtk::PACK_SHRINK); 
++    box->pack_start(*regler,Gtk::PACK_SHRINK);
++    Gtk::VBox* b2 = new Gtk::VBox();
++    box->pack_start( *Gtk::manage(b2), Gtk::PACK_EXPAND_PADDING);
++    regler->signal_toggled().connect(sigc::bind(sigc::mem_fun(
++        *this, &Widget::on_value_changed), port_name));
++  }
++}
++
++// receive controller value changes from host and set them to controller
++void Widget::set_value(uint32_t port_index,
++                       uint32_t format,
++                       const void * buffer)
++{
++  if ( format == 0 )
++  {
++    Gxw::Regler *regler = static_cast<Gxw::Regler*>(
++                                    get_controller_by_port(port_index));
++    if (regler)
++    {
++      float value = *static_cast<const float*>(buffer);
++      regler->cp_set_value(value);
++    }
++  }
++}
++
++// write (UI) controller value changes to the host->engine
++void Widget::on_value_changed(uint32_t port_index)
++{
++  Gxw::Regler *regler = static_cast<Gxw::Regler*>(
++                                    get_controller_by_port(port_index));
++  if (regler)
++  {
++    float value = regler->cp_get_value();
++    write_function(controller, port_index, sizeof(float), 0,
++                                    static_cast<const void*>(&value));
++  }
++}
++
+diff --git a/trunk/src/LV2/gx_colwah.lv2/widget.h b/trunk/src/LV2/gx_colwah.lv2/widget.h
+new file mode 100644
+index 00000000..7ec76d20
+--- /dev/null
++++ b/trunk/src/LV2/gx_colwah.lv2/widget.h
+@@ -0,0 +1,96 @@
++/*
++ * Copyright (C) 2012 Hermann Meyer, Andreas Degert, Pete Shorthose, Steve Poskitt
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU 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 General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
++ * --------------------------------------------------------------------------
++ */
++
++#pragma once
++
++#ifndef SRC_HEADERS_WIDGET_H_
++#define SRC_HEADERS_WIDGET_H_
++
++#include <gtkmm.h>
++#include <gxwmm.h>
++#include "gx_colwah.h"
++#include "../config.h" // for GX_STYLE_DIR
++// LV2UI stuff
++#include "lv2/lv2plug.in/ns/extensions/ui/ui.h"
++
++class Widget : public Gtk::HBox
++{
++private:
++  Gtk::Widget* get_controller_by_port(uint32_t port_index);
++
++  void on_value_changed(uint32_t port_index);
++
++  void make_controller_box(Gtk::Box *box,
++                           Glib::ustring label,
++                           float min, float max,
++                           float digits,
++                           PortIndex port_name);
++
++  void make_selector_box(Gtk::Box *box,
++                         Glib::ustring label,
++                         Glib::ustring tables[],
++                         size_t _size,
++                         float min, float digits,
++                         PortIndex port_name);
++
++  void make_switch_box(Gtk::Box *box,
++                       Glib::ustring label,
++                       PortIndex port_name);
++
++  bool _expose_event(GdkEventExpose *event);
++
++  void set_value(uint32_t port_index,
++                 uint32_t format,
++                 const void * buffer);
++public:
++
++  // public Lv2 communication stuff
++  LV2UI_Controller controller;
++  LV2UI_Write_Function write_function;
++  static void set_value_static(uint32_t port_index,
++                               uint32_t buffer_size,
++                               uint32_t format,
++                               const void * buffer, Widget *self)
++  {
++    self->set_value(port_index,format,buffer);
++  }
++
++  Widget(Glib::ustring plugname);
++  ~Widget();
++
++protected:
++  Glib::ustring     plug_name;
++  Gtk::Label        logo;
++  Gtk::VBox         m_vbox_;
++  Gtk::VBox         m_vbox1_;
++  Gtk::VBox         m_vbox2_;
++  Gtk::VBox         m_vbox;
++  Gtk::VBox         m_vbox1;
++  Gtk::VBox         m_vboxc[3];
++  Gtk::VBox         m_vboxs[2];
++  Gtk::VBox         m_vboxs_;
++  Gtk::HBox         m_hbox_;
++  Gtk::HBox         m_hbox1_;
++
++  Gxw::PaintBox     m_paintbox;
++  Gxw::Selector     m_selector[2];
++  Gxw::SmallKnobR      m_bigknob[3];
++};
++
++#endif //SRC_HEADERS_WIDGET_H_
+diff --git a/trunk/src/LV2/gx_colwah.lv2/wscript b/trunk/src/LV2/gx_colwah.lv2/wscript
+new file mode 100644
+index 00000000..fa66b426
+--- /dev/null
++++ b/trunk/src/LV2/gx_colwah.lv2/wscript
+@@ -0,0 +1,62 @@
++#!/usr/bin/env python
++# encoding: utf-8
++
++import sys
++
++def configure(conf):
++    pass
++
++def build(bld):
++    bundle = 'gx_colwah.lv2'
++
++    src = ['gx_colwah.cpp'
++           ]
++    incl = ['../faust','./', '../DSP']
++    lib = []
++    if sys.platform.startswith("linux"):
++        lib.append('dl')
++    uselib = ['LV2CORE']
++    cxxflag =[]
++    if not bld.env['OPT'] and bld.env['SSE2']:
++        cxxflag = [ "-msse2", "-mfpmath=sse"]
++    lv2_effects = bld.shlib(
++        includes = incl,
++        lib = lib,
++        uselib = uselib,
++        obj_ext  = '_14.o',
++        cxxflags = cxxflag,
++        defines  = ["LV2_SO"],
++        target   = 'gx_colwah',
++        source   = src,
++        install_path = '${LV2DIR}/%s' % bundle,
++        chmod = 0o755,
++        )
++    lv2_effects.env['cxxshlib_PATTERN'] = '%s.so'
++
++    if bld.env['LV2GUI']:
++        libpath1 = []
++        lib1 = []
++        incl = []
++        if sys.platform.startswith("linux"):
++            lib1.append('dl')
++
++        lv2_plugin_gui = bld.shlib(
++            includes = incl,
++            lib = lib1,
++            libpath = libpath1,
++            use = ['gxwmm','LV2CORE','GTKMM'],
++            linkflags = '-Wl,-z,nodelete',
++            defines  = ["LV2_GUI"],
++            target   = 'gx_colwah_gui',
++            source   = 'widget.cpp gx_colwah_gui.cpp',
++            install_path = '${LV2DIR}/%s' % bundle,
++            chmod = 0o755,
++            )
++        lv2_plugin_gui.env['cxxshlib_PATTERN'] = '%s.so'
++
++    install_path = '${LV2DIR}/%s' % bundle,
++    if bld.env['MODGUI']:
++        bld.install_files('${LV2DIR}/gx_colwah.lv2', bld.path.ant_glob('*.ttl'), relative_trick=True)
++        bld.install_files('${LV2DIR}/gx_colwah.lv2', bld.path.ant_glob('modgui/**/*'), relative_trick=True)
++    else:
++        bld.install_files('${LV2DIR}/gx_colwah.lv2', bld.path.ant_glob('*.ttl', excl=['modgui.ttl']), relative_trick=True)
+-- 
+2.25.1
+
+
+From cd979978eac96372b5a4e5bf228a5c0b0b933ff9 Mon Sep 17 00:00:00 2001
+From: brummer10 <brummer- at web.de>
+Date: Mon, 20 Jan 2020 07:34:31 +0100
+Subject: [PATCH 3/8]  fix rename gx_wah.lv2 to gy_colwah.lv2
+
+---
+ trunk/src/LV2/wscript | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/trunk/src/LV2/wscript b/trunk/src/LV2/wscript
+index 4bcaa063..5a0d96c7 100644
+--- a/trunk/src/LV2/wscript
++++ b/trunk/src/LV2/wscript
+@@ -88,7 +88,7 @@ subdirs = [
+     'gx_mole.lv2',
+     'gx_rangem.lv2',
+     'gx_hogsfoot.lv2',
+-    'gx_wah.lv2',
++    'gx_colwah.lv2',
+     'gx_gcb_95.lv2',
+     'gx_aclipper.lv2',
+     'gx_bmp.lv2',
+-- 
+2.25.1
+
+
+From d9b0f5dedb05914867954611f88a8e81699da0e5 Mon Sep 17 00:00:00 2001
+From: brummer10 <brummer- at web.de>
+Date: Mon, 20 Jan 2020 07:35:19 +0100
+Subject: [PATCH 4/8]  remove gx_wah.lv2
+
+---
+ trunk/src/LV2/gx_wah.lv2/gx_colwah.cpp     | 254 -----------------
+ trunk/src/LV2/gx_wah.lv2/gx_colwah.h       |  42 ---
+ trunk/src/LV2/gx_wah.lv2/gx_colwah.ttl     | 141 ---------
+ trunk/src/LV2/gx_wah.lv2/gx_colwah_gui.cpp | 314 ---------------------
+ trunk/src/LV2/gx_wah.lv2/manifest.ttl.in   |  26 --
+ trunk/src/LV2/gx_wah.lv2/modgui.ttl        |   2 -
+ trunk/src/LV2/gx_wah.lv2/wah.h             |  26 --
+ trunk/src/LV2/gx_wah.lv2/widget.cpp        | 268 ------------------
+ trunk/src/LV2/gx_wah.lv2/widget.h          |  96 -------
+ trunk/src/LV2/gx_wah.lv2/wscript           |  62 ----
+ 10 files changed, 1231 deletions(-)
+ delete mode 100644 trunk/src/LV2/gx_wah.lv2/gx_colwah.cpp
+ delete mode 100644 trunk/src/LV2/gx_wah.lv2/gx_colwah.h
+ delete mode 100644 trunk/src/LV2/gx_wah.lv2/gx_colwah.ttl
+ delete mode 100644 trunk/src/LV2/gx_wah.lv2/gx_colwah_gui.cpp
+ delete mode 100644 trunk/src/LV2/gx_wah.lv2/manifest.ttl.in
+ delete mode 100644 trunk/src/LV2/gx_wah.lv2/modgui.ttl
+ delete mode 100644 trunk/src/LV2/gx_wah.lv2/wah.h
+ delete mode 100644 trunk/src/LV2/gx_wah.lv2/widget.cpp
+ delete mode 100644 trunk/src/LV2/gx_wah.lv2/widget.h
+ delete mode 100644 trunk/src/LV2/gx_wah.lv2/wscript
+
+diff --git a/trunk/src/LV2/gx_wah.lv2/gx_colwah.cpp b/trunk/src/LV2/gx_wah.lv2/gx_colwah.cpp
+deleted file mode 100644
+index 331cf3fb..00000000
+--- a/trunk/src/LV2/gx_wah.lv2/gx_colwah.cpp
++++ /dev/null
+@@ -1,254 +0,0 @@
+-/*
+- * Copyright (C) 2014 Guitarix project MOD project
+- *
+- * This program is free software; you can redistribute it and/or modify
+- * it under the terms of the GNU 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 General Public License for more details.
+- *
+- * You should have received a copy of the GNU General Public License
+- * along with this program; if not, write to the Free Software
+- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+- * --------------------------------------------------------------------------
+- */
+-
+-
+-////////////////////////////// LOCAL INCLUDES //////////////////////////
+-
+-#include "gx_common.h"      // faust support and denormal protection (SSE)
+-#include "gx_colwah.h"        // define struct PortIndex
+-#include "gx_pluginlv2.h"   // define struct PluginLV2
+-#include "wah.h"    // dsp class generated by faust -> dsp2cc
+-
+-////////////////////////////// PLUG-IN CLASS ///////////////////////////
+-
+-#define declare(n) namespace n { PluginLV2 *plugin(); }
+-
+-declare(colwah);
+-declare(dallaswah);
+-declare(foxwah);
+-declare(jenwah);
+-declare(maestrowah);
+-declare(selwah);
+-declare(voxwah);
+-
+-static plug wah_model [] = {
+-    colwah::plugin, //0
+-    dallaswah::plugin, //1
+-    foxwah::plugin, //2
+-    jenwah::plugin, //3
+-    maestrowah::plugin, //4
+-    selwah::plugin, //5
+-    voxwah::plugin, //6
+-};
+-
+-static const size_t WAH_COUNT = sizeof(wah_model) / sizeof(wah_model[0]);
+-
+-
+-namespace colwah {
+-
+-class Gx_colwah_
+-{
+-private:
+-  // pointer to buffer
+-  float*      output;
+-  float*      input;
+-  // pointer to dsp class
+-  PluginLV2*                   wah[WAH_COUNT];
+-  float*                       wahh_model;
+-  uint32_t                     wah_model_;
+-  uint32_t                     wah_max;
+-  // private functions
+-  inline void run_dsp_(uint32_t n_samples);
+-  inline void connect_(uint32_t port,void* data);
+-  inline void init_dsp_(uint32_t rate);
+-  inline void connect_all__ports(uint32_t port, void* data);
+-  inline void activate_f();
+-  inline void clean_up();
+-  inline void deactivate_f();
+-
+-public:
+-  // LV2 Descriptor
+-  static const LV2_Descriptor descriptor;
+-  // static wrapper to private functions
+-  static void deactivate(LV2_Handle instance);
+-  static void cleanup(LV2_Handle instance);
+-  static void run(LV2_Handle instance, uint32_t n_samples);
+-  static void activate(LV2_Handle instance);
+-  static void connect_port(LV2_Handle instance, uint32_t port, void* data);
+-  static LV2_Handle instantiate(const LV2_Descriptor* descriptor,
+-                                double rate, const char* bundle_path,
+-                                const LV2_Feature* const* features);
+-  Gx_colwah_();
+-  ~Gx_colwah_();
+-};
+-
+-// constructor
+-Gx_colwah_::Gx_colwah_() :
+-  output(NULL),
+-  input(NULL),
+-  wahh_model(NULL),
+-  wah_model_(0)  {};
+-
+-// destructor
+-Gx_colwah_::~Gx_colwah_()
+-{
+-  for(uint32_t i=0; i<WAH_COUNT; i++) {
+-    wah[i]->delete_instance(wah[i]);
+-  }
+-
+-};
+-
+-///////////////////////// PRIVATE CLASS  FUNCTIONS /////////////////////
+-
+-void Gx_colwah_::init_dsp_(uint32_t rate)
+-{
+-  AVOIDDENORMALS(); // init the SSE denormal protection
+-
+-  for(uint32_t i=0; i<WAH_COUNT; i++) {
+-        wah[i] = wah_model[i]();
+-        wah[i]->set_samplerate(rate, wah[i]);
+-    }
+-  wah_max = WAH_COUNT-1;
+-}
+-
+-// connect the Ports used by the plug-in class
+-void Gx_colwah_::connect_(uint32_t port,void* data)
+-{
+-  switch ((PortIndex)port)
+-    {
+-    case EFFECTS_OUTPUT:
+-      output = static_cast<float*>(data);
+-      break;
+-    case EFFECTS_INPUT:
+-      input = static_cast<float*>(data);
+-      break;
+-    case MODEL:
+-      wahh_model =  static_cast<float*>(data);
+-      break;
+-    default:
+-      break;
+-    }
+-}
+-
+-void Gx_colwah_::activate_f()
+-{
+-  // allocate the internal DSP mem
+-}
+-
+-void Gx_colwah_::clean_up()
+-{
+-  // delete the internal DSP mem
+-}
+-
+-void Gx_colwah_::deactivate_f()
+-{
+-  // delete the internal DSP mem
+-}
+-
+-void Gx_colwah_::run_dsp_(uint32_t n_samples)
+-{
+-  if (n_samples< 1) return;
+-  wah_model_ = min(wah_max, static_cast<uint32_t>(*(wahh_model)));
+-  wah[wah_model_]->mono_audio(static_cast<int>(n_samples), input, output, wah[wah_model_]);
+-}
+-
+-void Gx_colwah_::connect_all__ports(uint32_t port, void* data)
+-{
+-  // connect the Ports used by the plug-in class
+-  connect_(port,data); 
+-  // connect the Ports used by the DSP class
+-  for(uint32_t i=0; i<WAH_COUNT; i++) {
+-        wah[i]->connect_ports(port, data, wah[i]);
+-    }
+-}
+-
+-////////////////////// STATIC CLASS  FUNCTIONS  ////////////////////////
+-
+-LV2_Handle 
+-Gx_colwah_::instantiate(const LV2_Descriptor* descriptor,
+-                            double rate, const char* bundle_path,
+-                            const LV2_Feature* const* features)
+-{
+-  // init the plug-in class
+-  Gx_colwah_ *self = new Gx_colwah_();
+-  if (!self)
+-    {
+-      return NULL;
+-    }
+-
+-  self->init_dsp_((uint32_t)rate);
+-
+-  return (LV2_Handle)self;
+-}
+-
+-void Gx_colwah_::connect_port(LV2_Handle instance, 
+-                                   uint32_t port, void* data)
+-{
+-  // connect all ports
+-  static_cast<Gx_colwah_*>(instance)->connect_all__ports(port, data);
+-}
+-
+-void Gx_colwah_::activate(LV2_Handle instance)
+-{
+-  // allocate needed mem
+-  static_cast<Gx_colwah_*>(instance)->activate_f();
+-}
+-
+-void Gx_colwah_::run(LV2_Handle instance, uint32_t n_samples)
+-{
+-  // run dsp
+-  static_cast<Gx_colwah_*>(instance)->run_dsp_(n_samples);
+-}
+-
+-void Gx_colwah_::deactivate(LV2_Handle instance)
+-{
+-  // free allocated mem
+-  static_cast<Gx_colwah_*>(instance)->deactivate_f();
+-}
+-
+-void Gx_colwah_::cleanup(LV2_Handle instance)
+-{
+-  // well, clean up after us
+-  Gx_colwah_* self = static_cast<Gx_colwah_*>(instance);
+-  self->clean_up();
+-  delete self;
+-}
+-
+-const LV2_Descriptor Gx_colwah_::descriptor =
+-{
+-  GXPLUGIN_URI "#_colwah_",
+-  Gx_colwah_::instantiate,
+-  Gx_colwah_::connect_port,
+-  Gx_colwah_::activate,
+-  Gx_colwah_::run,
+-  Gx_colwah_::deactivate,
+-  Gx_colwah_::cleanup,
+-  NULL
+-};
+-
+-
+-} // end namespace colwah
+-
+-////////////////////////// LV2 SYMBOL EXPORT ///////////////////////////
+-
+-extern "C"
+-LV2_SYMBOL_EXPORT
+-const LV2_Descriptor*
+-lv2_descriptor(uint32_t index)
+-{
+-  switch (index)
+-    {
+-    case 0:
+-      return &colwah::Gx_colwah_::descriptor;
+-    default:
+-      return NULL;
+-    }
+-}
+-
+-///////////////////////////// FIN //////////////////////////////////////
+diff --git a/trunk/src/LV2/gx_wah.lv2/gx_colwah.h b/trunk/src/LV2/gx_wah.lv2/gx_colwah.h
+deleted file mode 100644
+index 9b23a29a..00000000
+--- a/trunk/src/LV2/gx_wah.lv2/gx_colwah.h
++++ /dev/null
+@@ -1,42 +0,0 @@
+-/*
+- * Copyright (C) 2014 Guitarix project MOD project
+- *
+- * This program is free software; you can redistribute it and/or modify
+- * it under the terms of the GNU 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 General Public License for more details.
+- *
+- * You should have received a copy of the GNU General Public License
+- * along with this program; if not, write to the Free Software
+- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+- * --------------------------------------------------------------------------
+- */
+-
+-#pragma once
+-
+-#ifndef SRC_HEADERS_GXEFFECTS_H_
+-#define SRC_HEADERS_GXEFFECTS_H_
+-
+-#include <lv2.h>
+-
+-#define GXPLUGIN_URI "http://guitarix.sourceforge.net/plugins/gx_colwah_"
+-#define GXPLUGIN_UI_URI "http://guitarix.sourceforge.net/plugins/gx_colwah_gui"
+-
+-
+-typedef enum
+-{
+-   EFFECTS_OUTPUT,
+-   EFFECTS_INPUT,
+-   WAH, 
+-   FREQ, 
+-   MODE, 
+-   MODEL, 
+-   WET_DRY, 
+-} PortIndex;
+-
+-#endif //SRC_HEADERS_GXEFFECTS_H_
+diff --git a/trunk/src/LV2/gx_wah.lv2/gx_colwah.ttl b/trunk/src/LV2/gx_wah.lv2/gx_colwah.ttl
+deleted file mode 100644
+index 5ba01ff6..00000000
+--- a/trunk/src/LV2/gx_wah.lv2/gx_colwah.ttl
++++ /dev/null
+@@ -1,141 +0,0 @@
+-#
+-# Copyright (C) 2014 Guitarix project MOD project
+-# 
+-# This program is free software; you can redistribute it and/or modify
+-# it under the terms of the GNU 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 General Public License for more details.
+-#
+-# You should have received a copy of the GNU General Public License
+-# along with this program; if not, write to the Free Software
+-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+-# --------------------------------------------------------------------------
+-#
+-
+-
+- at prefix doap: <http://usefulinc.com/ns/doap#> .
+- at prefix foaf: <http://xmlns.com/foaf/0.1/> .
+- at prefix lv2: <http://lv2plug.in/ns/lv2core#> .
+- at prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
+- at prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
+- at prefix guiext: <http://lv2plug.in/ns/extensions/ui#>.
+- at prefix time: <http://lv2plug.in/ns/ext/time#>.
+- at prefix units: <http://lv2plug.in/ns/extensions/units#> .
+-
+-<http://guitarix.sourceforge.net#me>
+-	a foaf:Person ;
+-	foaf:name "Guitarix team" ;
+-	foaf:mbox <mailto:guitarix-developer at lists.sourceforge.net> ;
+-	rdfs:seeAlso <http://guitarix.sourceforge.net> .
+-
+-<http://guitarix.sourceforge.net/plugins/gx_colwah_>
+-	a doap:Project ;
+-	doap:maintainer <http://guitarix.sourceforge.net#me> ;
+-	doap:name "Gx_colwah_" .
+-
+-<http://guitarix.sourceforge.net/plugins/gx_colwah_#_colwah_>
+-    a lv2:Plugin ,
+-        lv2:ModulatorPlugin ;
+-    doap:maintainer <http://guitarix.sourceforge.net#me> ;
+-    doap:name "GxWahwah";
+-    doap:license <http://opensource.org/licenses/isc> ;
+-    lv2:project <http://guitarix.sourceforge.net/plugins/gx_colwah_> ;
+-    lv2:optionalFeature lv2:hardRTCapable ;
+-      
+-    lv2:minorVersion 34;
+-    lv2:microVersion 0;
+-
+-  guiext:ui <http://guitarix.sourceforge.net/plugins/gx_colwah_gui#_colwah_>;
+-    
+-rdfs:comment """
+-
+-...
+-
+-""";
+-
+-    lv2:port  [
+-        a lv2:AudioPort ,
+-            lv2:OutputPort ;
+-        lv2:index 0 ;
+-        lv2:symbol "out" ;
+-        lv2:name "Out"
+-    ] , [
+-        a lv2:AudioPort ,
+-            lv2:InputPort ;
+-        lv2:index 1 ;
+-        lv2:symbol "in" ;
+-        lv2:name "In" ;
+-    ] 
+-      , [
+-        a lv2:InputPort ,
+-            lv2:ControlPort ;
+-        lv2:index 2 ;
+-        lv2:symbol "WAH" ;
+-        lv2:name "WAH" ;
+-        lv2:default 0.0 ;
+-        lv2:minimum 0.0 ;
+-        lv2:maximum 1.0 ;
+-    ]      , [
+-        a lv2:InputPort ,
+-            lv2:ControlPort ;
+-        lv2:index 3 ;
+-        lv2:symbol "FREQ" ;
+-        lv2:name "FREQ" ;
+-        lv2:default 24.0 ;
+-        lv2:minimum 24.0 ;
+-        lv2:maximum 3.6e+02 ;
+-    ]      , [
+-        a lv2:InputPort ,
+-            lv2:ControlPort ;
+-        lv2:index 4 ;
+-        lv2:symbol "MODE" ;
+-        lv2:name "MODE" ;
+-        lv2:default 0.0 ;
+-        lv2:minimum 0.0 ;
+-        lv2:maximum 2.0 ;
+-        lv2:portProperty lv2:integer;
+-        lv2:portProperty lv2:enumeration ; 
+-        lv2:scalePoint [rdfs:label "manual"; rdf:value 0];
+-        lv2:scalePoint [rdfs:label "auto"; rdf:value 1];
+-        lv2:scalePoint [rdfs:label "alien"; rdf:value 2];
+-
+-    ]       , [
+-        a lv2:InputPort ,
+-            lv2:ControlPort ;
+-        lv2:index 5 ;
+-        lv2:symbol "MODEL" ;
+-        lv2:name "MODEL" ;
+-        lv2:default 0.0 ;
+-        lv2:minimum 0.0 ;
+-        lv2:maximum 6.0 ;
+-        lv2:portProperty lv2:integer;
+-        lv2:portProperty lv2:enumeration ; 
+-        lv2:scalePoint [rdfs:label "Colorsound Wah"; rdf:value 0];
+-        lv2:scalePoint [rdfs:label "Dallas Wah"; rdf:value 1];
+-        lv2:scalePoint [rdfs:label "Foxx Wah"; rdf:value 2];
+-        lv2:scalePoint [rdfs:label "Jen Wah"; rdf:value 3];
+-        lv2:scalePoint [rdfs:label "Maestro Wah"; rdf:value 4];
+-        lv2:scalePoint [rdfs:label "SelmerWah"; rdf:value 5];
+-        lv2:scalePoint [rdfs:label "Vox Wah V847"; rdf:value 6];
+-
+-    ]      , [
+-        a lv2:InputPort ,
+-            lv2:ControlPort ;
+-        lv2:index 6 ;
+-        lv2:symbol "WET_DRY" ;
+-        lv2:name "WET_DRY" ;
+-        lv2:default 1e+02 ;
+-        lv2:minimum 0.0 ;
+-        lv2:maximum 1e+02 ;
+-    ] .
+-
+-<http://guitarix.sourceforge.net/plugins/gx_colwah_gui#_colwah_>
+-  a guiext:GtkUI;
+-  guiext:binary <gx_colwah_gui.so>;
+-  guiext:requiredFeature guiext:makeResident;
+-  .
+diff --git a/trunk/src/LV2/gx_wah.lv2/gx_colwah_gui.cpp b/trunk/src/LV2/gx_wah.lv2/gx_colwah_gui.cpp
+deleted file mode 100644
+index 449a8d33..00000000
+--- a/trunk/src/LV2/gx_wah.lv2/gx_colwah_gui.cpp
++++ /dev/null
+@@ -1,314 +0,0 @@
+-/*
+- * Copyright (C) 2012 Hermann Meyer, Andreas Degert, Pete Shorthose, Steve Poskitt
+- *
+- * This program is free software; you can redistribute it and/or modify
+- * it under the terms of the GNU 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 General Public License for more details.
+- *
+- * You should have received a copy of the GNU General Public License
+- * along with this program; if not, write to the Free Software
+- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+- * --------------------------------------------------------------------------
+- */
+-
+-
+-#include <string>
+-#include <iostream>
+-
+-#include <gtkmm.h>
+-#include "gx_colwah.h"
+-#include "widget.h"
+-
+-
+-#include <lv2.h>
+-#include <lv2/lv2plug.in/ns/extensions/ui/ui.h>
+-
+-using namespace std;
+-
+-class Gx_colwah_GUI
+-{
+-private:
+-  Glib::ustring plugskin;
+-  Glib::ustring addKnob;
+-  Glib::ustring plug_name;
+-  void set_knob(Glib::ustring knob);
+-  void set_skin();
+-  void set_plug_name(const char * plugin_uri);
+-  GtkWidget* make_gui();
+-public:
+-
+-  Widget* widget;
+-  static void set_plug_name_static(Gx_colwah_GUI *self, const char * plugin_uri)
+-  {
+-    self->set_plug_name(plugin_uri);
+-  }
+-  static GtkWidget* make_gui_static(Gx_colwah_GUI *self)
+-  {
+-    return self->make_gui();
+-  }
+-
+-  Gx_colwah_GUI () {};
+-  ~Gx_colwah_GUI () {};
+-} ;
+-
+-void Gx_colwah_GUI::set_knob( Glib::ustring knob)
+-{
+-  addKnob =   " style 'gx_";
+-  addKnob +=  plug_name;
+-  addKnob +=   "_dark_skin_icons'\n"
+-               " { \n"
+-               "   stock['bigknob'] = {{'";
+-  addKnob +=  knob;
+-  addKnob +=  ".png'}}\n"
+-              "   stock['smallknob'] = {{'";
+-  addKnob +=  knob;
+-  addKnob +=  "-small.png'}}\n"
+-              "   stock['smallknobr'] = {{'";
+-  addKnob +=  knob;
+-  addKnob +=  "-middle.png'}}\n"
+-              "   stock['button_on'] = {{'"
+-              "echo-switch_on.png'}}\n"
+-              "   stock['button_off'] = {{'"
+-              "echo-switch_off.png'}}\n"
+-              " }\n"
+-              "widget '*.";
+-  addKnob +=  plug_name;
+-  addKnob +=  "' style 'gx_";
+-  addKnob +=  plug_name;
+-  addKnob +=  "_dark_skin_icons' \n"
+-              "class '*GxToggleImage' style'gx_"; 
+-  addKnob +=  plug_name;
+-  addKnob +=  "_dark_skin_icons' \n";
+-}
+-
+-void Gx_colwah_GUI::set_skin()
+-{
+-  Glib::ustring toparse = "pixmap_path  ";
+-  toparse +=     " '";
+-  toparse +=        GX_LV2_STYLE_DIR;
+-  toparse +=     "/'\n";
+-  toparse +=     "style \"gx_";
+-  toparse +=     plug_name;
+-  toparse +=     "_dark-paintbox\"\n"
+-                 " { \n"
+-                 "    GxPaintBox::icon-set =9\n"
+-                 "    stock['gxhead'] = {{'";
+-  toparse +=     plugskin;
+-  toparse +=     "'}}\n"
+-                 " }\n"
+-                 "\n"
+-                 "style 'gx_head_black_box' \n"
+-                 " { \n"
+-                 "    font_name = 'sans bold 7.5'\n"
+-                 "    fg[NORMAL] = '#ff9000' \n"
+-                 " }\n";
+-  toparse +=     addKnob;
+-
+-  toparse +=     " widget '*.amplabel' style:highest 'gx_head_black_box'\n"
+-                 "widget '*.";
+-  toparse +=     plug_name;
+-  toparse +=     "' style 'gx_";
+-  toparse +=     plug_name;
+-  toparse +=     "_dark-paintbox' ";
+-
+-  toparse +=     "style 'guitarix_default' {\n"
+-    
+-                 "    GxPaintBox::bevel                  = 0.11\n"
+-                 "    GxPaintBox::inverse                = 0\n"
+-                 "    GxPaintBox::alternate-box          = { 0, 0, 30, 15 }\n"
+-
+-                 "    fg[NORMAL]              = '#ff9000'\n"
+-                 "    fg[ACTIVE]              = { 1.0, 1.0, 1.0 }\n"
+-                 "    fg[PRELIGHT]            = { 1.0, 1.0, 1.0 }\n"
+-                 "    fg[INSENSITIVE]         = { 0.5, 0.5, 0.5 }\n"
+-                 "    fg[SELECTED]            = { 0.9, 0.9, 0.9 }\n"
+-    
+-                 "    bg[NORMAL]              = { 0.13, 0.13, 0.13 }\n"
+-                 "    bg[ACTIVE]              = { 0.0, 0.0, 0.0 }\n"
+-                 "    bg[PRELIGHT]            = { 0.25, 0.25, 0.25 }\n"
+-                 "    bg[INSENSITIVE]         = { 0.2, 0.2, 0.2 }\n"
+-                 "    bg[SELECTED]            = { 0.25, 0.25, 0.25 }\n"
+-    
+-                 "    text[NORMAL]            = { 0.9, 0.9, 0.9 }\n"
+-                 "    text[ACTIVE]            = '#ff9000'\n"
+-                 "    text[PRELIGHT]          = { 1.0, 1.0, 1.0 }\n"
+-                 "    text[INSENSITIVE]       = { 0.5, 0.5, 0.5 }\n"
+-                 "    text[SELECTED]          = { 1.0, 1.0, 1.0 }\n"
+-    
+-                 "    base[NORMAL]            = { 0.0, 0.0, 0.0 }\n"
+-                 "    base[ACTIVE]            = { 0.18, 0.18, 0.18 }\n"
+-                 "    base[PRELIGHT]          = { 0.1, 0.1, 0.1 }\n"
+-                 "    base[INSENSITIVE]       = { 0.2, 0.2, 0.2 }\n"
+-                 "    base[SELECTED]          = { 0.8, 0.18, 0.18 }\n"
+-                 "}\n"
+-                 "widget '*.";
+-  toparse +=     plug_name;
+-  toparse +=     "' style:highest 'guitarix_default'\n";
+-  toparse +=     " style 'gx_selector'\n"
+-                 " {\n"
+-                 " fg[NORMAL]     = '#ff9000'   \n"
+-                 " fg[PRELIGHT]   = '#ffffff'    \n"
+-                 " bg[NORMAL]     = '#2f2f2f'     \n"
+-                 " bg[PRELIGHT]   = '#2f2f2f'      \n"
+-                 " base[NORMAL]   = { 0.05, 0.05, 0.05 } \n"
+-                 " base[PRELIGHT] = '#000000'      \n"
+-                 " text[NORMAL]   = '#ff9000'     \n"
+-                 " text[PRELIGHT] = '#ffffff'    \n"
+-                 " GxRegler::value-border      = { 4, 4, 2, 2 } \n"
+-                 " GxRegler::border-radius     = 6\n"
+-                 " GxRegler::bevel             = 0.12\n"
+-                 " GtkRange::trough-border = 2\n"
+-                 " GtkRange::stepper-size = 8\n"
+-                 " GtkRange::stepper-spacing = 2\n"
+-                 " GxRegler::value-border = { 2, 0, 0, 0 }\n"
+-                 " font_name = 'sans bold 7.5'\n"
+-                 " xthickness = 8\n"
+-                 " ythickness = 4\n"
+-                 " }\n"
+-                 "class '*GxSelector' style:highest 'gx_selector'\n";
+-  toparse +=     " style 'guitarix_knobs' {\n"
+-                 "    fg[INSENSITIVE] = '#211006'\n"
+-                 "}\n"
+-                 "class 'GxKnob' style:highest 'guitarix_knobs'\n"
+-
+-                 "style 'guitarix_small_knob' {\n"
+-                 "    GxKnob::x_center          = -1\n"
+-                 "    GxKnob::y_center          = -1\n"
+-                 "    GxKnob::ring_radius       = 15\n"
+-                 "    GxKnob::ring_width        = 2\n"
+-                 "    GxKnob::ring_led_size     = 3\n"
+-                 "    GxKnob::ring_led_distance = 2\n"
+-                 "    GxKnob::indicator_radius  = 11\n"
+-                 "    GxKnob::indicator_width   = 2\n"
+-                 "    GxKnob::indicator_length  = 5\n"
+-                 "}\n"
+-                 "widget_class '*GxSmallKnob' style:highest 'guitarix_small_knob'\n"
+-
+-                 "style 'guitarix_small_knob_r' {\n"
+-                 "    GxKnob::x_center          = -1\n"
+-                 "    GxKnob::y_center          = -1\n"
+-                 "    GxKnob::ring_radius       = 26\n"
+-                 "    GxKnob::ring_width        = 3\n"
+-                 "    GxKnob::ring_led_size     = 3\n"
+-                 "    GxKnob::ring_led_distance = 2\n"
+-                 "    GxKnob::indicator_radius  = 12\n"
+-                 "    GxKnob::indicator_width   = 3\n"
+-                 "    GxKnob::indicator_length  = 3\n"
+-                 "}\n"
+-                 "widget_class '*GxSmallKnobR' style:highest 'guitarix_small_knob_r'\n"
+-
+-                 "style 'guitarix_mid_knob' {\n"
+-                 "    GxKnob::x_center          = -1\n"
+-                 "    GxKnob::y_center          = -1\n"
+-                 "    GxKnob::ring_radius       = 35\n"
+-                 "    GxKnob::ring_width        = 6\n"
+-                 "    GxKnob::ring_led_size     = 2\n"
+-                 "    GxKnob::ring_led_distance = 2\n"
+-                 "    GxKnob::indicator_radius  = 27\n"
+-                 "    GxKnob::indicator_width   = 2\n"
+-                 "    GxKnob::indicator_length  = 6\n"
+-                 "}\n"
+-                 "widget_class '*GxMidKnob' style:highest 'guitarix_mid_knob'\n"
+-
+-                 "style 'guitarix_big_knob' {\n"
+-                 "    GxKnob::x_center          = -1\n"
+-                 "    GxKnob::y_center          = -1\n"
+-                 "    GxKnob::ring_radius       = 50.5\n"
+-                 "    GxKnob::ring_width        = 3\n"
+-                 "    GxKnob::ring_led_size     = 0\n"
+-                 "    GxKnob::ring_led_distance = 0\n"
+-                 "    GxKnob::indicator_radius  = 46\n"
+-                 "    GxKnob::indicator_width   = 3\n"
+-                 "    GxKnob::indicator_length  = 6\n"
+-                 "}\n"
+-                 "widget_class '*GxBigKnob' style:highest 'guitarix_big_knob'\n"
+-              " \n";
+-
+-  gtk_rc_parse_string (toparse.c_str());
+-}
+-
+-void Gx_colwah_GUI::set_plug_name( const char * plugin_uri)
+-{
+-  addKnob = "";
+-
+-  if (strcmp("http://guitarix.sourceforge.net/plugins/gx_colwah_gui#_colwah_", plugin_uri) == 0)
+-    {
+-      plug_name = "Wahwah";
+-      //set_knob("nk-knob");
+-    }
+-  else
+-    {
+-      plug_name = "Wahwah";
+-    }
+-}
+-
+-GtkWidget* Gx_colwah_GUI::make_gui()
+-{
+-  // init the gxwmm library
+-  Gxw::init();
+-  set_skin();
+-  GtkWidget* container = gtk_vbox_new(FALSE, 2);
+-  widget = new Widget(plug_name);
+-  GtkWidget* cWidget = GTK_WIDGET(widget->gobj());
+-  gtk_container_add(GTK_CONTAINER(container), cWidget );
+-
+-  return container;
+-}
+-
+-
+-static LV2UI_Handle instantiate(const struct _LV2UI_Descriptor * descriptor,
+-                                const char * plugin_uri,
+-                                const char * bundle_path,
+-                                LV2UI_Write_Function write_function,
+-                                LV2UI_Controller controller,
+-                                LV2UI_Widget * widget,
+-                                const LV2_Feature * const * features)
+-{
+-  Gx_colwah_GUI* self = new Gx_colwah_GUI();
+-  if (self == NULL) return NULL;
+-  self->set_plug_name_static(self, plugin_uri);
+-  *widget = (LV2UI_Widget)self->make_gui_static(self);
+-  self->widget->controller = controller;
+-  self->widget->write_function = write_function;
+-  return (LV2UI_Handle)self;
+-}
+-
+-static void cleanup(LV2UI_Handle ui)
+-{
+-  Gx_colwah_GUI *pluginGui = static_cast<Gx_colwah_GUI*>(ui);
+-  delete pluginGui->widget;
+-  delete pluginGui;
+-}
+-
+-static void port_event(LV2UI_Handle ui,
+-                       uint32_t port_index,
+-                       uint32_t buffer_size,
+-                       uint32_t format,
+-                       const void * buffer)
+-{
+-  Gx_colwah_GUI *self = static_cast<Gx_colwah_GUI*>(ui);
+-  self->widget->set_value_static( port_index, buffer_size, format, buffer, self->widget);
+-  return;
+-}
+-
+-static LV2UI_Descriptor descriptors[] =
+-{
+-  {GXPLUGIN_UI_URI"#_colwah_", instantiate, cleanup, port_event, NULL}
+-};
+-
+-const LV2UI_Descriptor * lv2ui_descriptor(uint32_t index)
+-{
+-  //printf("lv2ui_descriptor(%u) called\n", (uint32_t)index);
+-  if (index >= sizeof(descriptors) / sizeof(descriptors[0]))
+-    {
+-      return NULL;
+-    }
+-  return descriptors + index;
+-}
+-
+diff --git a/trunk/src/LV2/gx_wah.lv2/manifest.ttl.in b/trunk/src/LV2/gx_wah.lv2/manifest.ttl.in
+deleted file mode 100644
+index d67c6974..00000000
+--- a/trunk/src/LV2/gx_wah.lv2/manifest.ttl.in
++++ /dev/null
+@@ -1,26 +0,0 @@
+-#
+-# Copyright (C) 2012 Hermann Meyer, Andreas Degert, Pete Shorthose, Steve Poskitt
+-# 
+-# This program is free software; you can redistribute it and/or modify
+-# it under the terms of the GNU 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 General Public License for more details.
+-#
+-# You should have received a copy of the GNU General Public License
+-# along with this program; if not, write to the Free Software
+-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+-# --------------------------------------------------------------------------
+-#
+-
+- at prefix lv2:  <http://lv2plug.in/ns/lv2core#> .
+- at prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
+-
+-<http://guitarix.sourceforge.net/plugins/gx_colwah_#_colwah_>
+-    a lv2:Plugin ;
+-    lv2:binary <gx_colwah at LIB_EXT@>  ;
+-    rdfs:seeAlso <gx_colwah.ttl> , <modgui.ttl>.
+diff --git a/trunk/src/LV2/gx_wah.lv2/modgui.ttl b/trunk/src/LV2/gx_wah.lv2/modgui.ttl
+deleted file mode 100644
+index 4e30c382..00000000
+--- a/trunk/src/LV2/gx_wah.lv2/modgui.ttl
++++ /dev/null
+@@ -1,2 +0,0 @@
+- at prefix modgui: <http://moddevices.com/ns/modgui#> .
+- at prefix lv2:    <http://lv2plug.in/ns/lv2core#> .
+diff --git a/trunk/src/LV2/gx_wah.lv2/wah.h b/trunk/src/LV2/gx_wah.lv2/wah.h
+deleted file mode 100644
+index 01bd2fcb..00000000
+--- a/trunk/src/LV2/gx_wah.lv2/wah.h
++++ /dev/null
+@@ -1,26 +0,0 @@
+-/*
+- * Copyright (C) 2014 Guitarix project MOD project
+- *
+- * This program is free software; you can redistribute it and/or modify
+- * it under the terms of the GNU 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 General Public License for more details.
+- *
+- * You should have received a copy of the GNU General Public License
+- * along with this program; if not, write to the Free Software
+- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+- * --------------------------------------------------------------------------
+- */
+-
+-#include "colwah.cc"
+-#include "dallaswah.cc"
+-#include "foxwah.cc"
+-#include "jenwah.cc"
+-#include "maestrowah.cc"
+-#include "selwah.cc"
+-#include "voxwah.cc"
+diff --git a/trunk/src/LV2/gx_wah.lv2/widget.cpp b/trunk/src/LV2/gx_wah.lv2/widget.cpp
+deleted file mode 100644
+index 8575d25f..00000000
+--- a/trunk/src/LV2/gx_wah.lv2/widget.cpp
++++ /dev/null
+@@ -1,268 +0,0 @@
+-/*
+- * Copyright (C) 2012 Hermann Meyer, Andreas Degert, Pete Shorthose, Steve Poskitt
+- *
+- * This program is free software; you can redistribute it and/or modify
+- * it under the terms of the GNU 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 General Public License for more details.
+- *
+- * You should have received a copy of the GNU General Public License
+- * along with this program; if not, write to the Free Software
+- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+- * --------------------------------------------------------------------------
+- */
+-
+-
+-#include "widget.h"
+-
+-#include <iostream>
+-
+-
+-/*    @get controller by port
+- *  this function is used by make_selector() make_controller_box()
+- *  set_value() and on_value_changed()
+- *  so controller widgets needs only here asined to a port, 
+- *  and all functions which need acess to the controller widget pointer 
+- *  can receive them by port number
+- */
+-
+-Gtk::Widget* Widget::get_controller_by_port(uint32_t port_index)
+-{
+-  switch ((PortIndex)port_index )
+-  {
+-    case WAH:
+-      return &m_bigknob[0];
+-    case FREQ:
+-      return &m_bigknob[1];
+-    case MODE:
+-      return &m_selector[0];
+-    case MODEL:
+-      return &m_selector[1];
+-    case WET_DRY:
+-      return &m_bigknob[2];
+-
+-    default:
+-      return NULL;
+-  } 
+-}
+-
+-Widget::Widget(Glib::ustring plugname):
+-plug_name(plugname),
+-logo(plugname)
+-{
+-  Glib::ustring enumMODEL[] = {"Colorsound Wah","Dallas Wah","Foxx Wah","Jen Wah","Maestro Wah","Selmer Wah","Vox Wah V847"};
+-  static const size_t enumMODEL_size = sizeof(enumMODEL) / sizeof(enumMODEL[0]);
+-  make_selector_box(&m_vboxs[0],"MODEL", enumMODEL, enumMODEL_size, 0,1.0, MODEL);
+-
+-  Glib::ustring enumMODE[] = {"manual","auto","alien"};
+-  static const size_t enumMODE_size = sizeof(enumMODE) / sizeof(enumMODE[0]);
+-  make_selector_box(&m_vboxs[1],"MODE", enumMODE, enumMODE_size, 0,1.0, MODE);
+-
+-  // create controllers for port name
+-  make_controller_box(&m_vboxc[0], "WAH", 0.0, 1.0, 0.01, WAH);
+-  make_controller_box(&m_vboxc[1], "ALIEN FREQ", 24.0, 3.6e+02, 1.0, FREQ);
+-  make_controller_box(&m_vboxc[2], "WET_DRY", 0.0, 1e+02, 1.0, WET_DRY);
+-
+-  // set propertys for the main paintbox holding the skin
+-  m_paintbox.set_border_width(10);
+-  m_paintbox.set_spacing(6);
+-  m_paintbox.set_homogeneous(false);
+-  m_paintbox.set_name(plug_name);
+-  m_paintbox.property_paint_func() = "rack_unit_expose";
+-  add(m_paintbox);
+-  // box for the controllers
+-  m_hbox_.set_spacing(25);
+-  m_hbox_.set_border_width(24);
+-  m_hbox_.set_homogeneous(false);
+-  // set a vertical box in the paintbox
+-  m_vbox.set_border_width(14);
+-  m_vbox1.set_border_width(14);
+-  m_paintbox.pack_start(m_vbox_);
+-
+-  // modify logo layout
+-  Pango::FontDescription font_desc = logo.get_style()->get_font();
+-  font_desc.set_size(int(14*Pango::SCALE));
+-  font_desc.set_weight(Pango::WEIGHT_BOLD);
+-  logo.modify_font(font_desc);
+-
+-  // and controller box on top
+-  //m_hbox1_.set_border_width(24);
+-  m_hbox1_.set_spacing(64);
+-  logo.set_name("amplabel");
+-  m_vbox_.pack_start(m_hbox1_, Gtk::PACK_SHRINK);
+-  m_hbox1_.pack_start(m_vbox1_, Gtk::PACK_EXPAND_PADDING);
+-  m_hbox1_.pack_end(m_vbox2_, Gtk::PACK_SHRINK);
+-  m_hbox1_.pack_end(logo, Gtk::PACK_SHRINK);
+-  m_vbox_.pack_start(m_hbox_, Gtk::PACK_SHRINK);
+-  m_vbox_.set_homogeneous(false);
+-   // put boxed controllers into controller box
+-  m_hbox_.pack_start(m_vbox1, Gtk::PACK_EXPAND_PADDING);
+-  for (int i = 0; i<2;i++) {
+-    m_vboxs_.pack_start(m_vboxs[i]);
+-  }
+-  m_vboxs_.set_spacing(5);
+-  m_hbox_.pack_start(m_vboxs_, Gtk::PACK_EXPAND_PADDING);
+-  for (int i = 0; i<3;i++) {
+-    m_hbox_.pack_start(m_vboxc[i]);
+-  }
+-  m_hbox_.pack_start(m_vbox, Gtk::PACK_EXPAND_PADDING);
+-
+-  // connect expose handler as resize handler
+-  m_paintbox.signal_expose_event().connect(
+-    sigc::mem_fun(this, &Widget::_expose_event), true);
+-
+-  set_app_paintable(true);
+-  show_all();
+-}
+-
+-Widget::~Widget()
+-{
+-
+-}
+-
+-// set borderwith for paintbox when widget resize
+-// to hold controllers in place
+-bool Widget::_expose_event(GdkEventExpose *event)
+-{
+-  int x, y, width, height, depth;
+-  m_paintbox.get_window()->get_geometry(x, y, width, height, depth);
+-  //double_t height = m_paintbox.get_window()->get_height();
+-  m_paintbox.set_border_width(height/10);
+-  return false;
+-}
+-
+-// create selectors from gxwmm
+-void Widget::make_selector_box(Gtk::Box *box,
+-                               Glib::ustring labela,
+-                               Glib::ustring tables[],
+-                               size_t _size,
+-                               float min, float digits,
+-                               PortIndex port_name)
+-{
+-  Gxw::Selector *regler = static_cast<Gxw::Selector*>
+-                                    (get_controller_by_port(port_name));
+-  if (regler)
+-  {
+-    float max = static_cast<float>(_size+1);
+-
+-    Gtk::TreeModelColumn<Glib::ustring> label;
+-    Gtk::TreeModelColumnRecord rec;
+-    rec.add(label);
+-    Glib::RefPtr<Gtk::ListStore> ls = Gtk::ListStore::create(rec);
+-
+-    for (uint32_t i = 0 ; i< _size; ++i) {
+-      ls->append()->set_value(0, tables[i]);
+-    }
+-    regler->set_model(ls);
+-    regler->set_has_tooltip();
+-    regler->set_tooltip_text(labela);
+-    regler->cp_configure("SELECTOR", labela, min, max, digits);
+-    regler->set_show_value(false);
+-    regler->set_name(plug_name);
+-    regler->signal_value_changed().connect(sigc::bind(sigc::mem_fun(
+-           *this, &Widget::on_value_changed), port_name));
+-    box->pack_start(*regler,Gtk::PACK_SHRINK);
+-  }
+-}
+-
+-// create stackboxes with controllers for port name
+-void Widget::make_controller_box(Gtk::Box *box,
+-                                 Glib::ustring label,
+-                                 float min, float max,
+-                                 float digits,
+-                                 PortIndex port_name)
+-{
+-  Gxw::Regler *regler = static_cast<Gxw::Regler*>(
+-                                    get_controller_by_port(port_name));
+-  if (regler)
+-  {
+-    Gtk::Label* pr = new Gtk::Label(label, 0);
+-    pr->set_name("amplabel");
+-    // use label images instead simple string labes
+-    //Glib::ustring  label_image = GX_LV2_STYLE_DIR;
+-    //label_image += "/";
+-    //label_image += label;
+-    //label_image += ".png";
+-    //Gtk::Image *pr = new Gtk::Image(label_image);
+-
+-    Gtk::VBox* b1 = new Gtk::VBox();
+-    box->pack_start( *Gtk::manage(b1), Gtk::PACK_EXPAND_PADDING);
+-    box->pack_start( *Gtk::manage(pr),Gtk::PACK_SHRINK);
+-    regler->cp_configure("KNOB", label, min, max, digits);
+-    regler->set_show_value(true);
+-    regler->set_name(plug_name);
+-    box->pack_start(*regler,Gtk::PACK_SHRINK);
+-    Gtk::VBox* b2 = new Gtk::VBox();
+-    box->pack_start( *Gtk::manage(b2), Gtk::PACK_EXPAND_PADDING);
+-    regler->signal_value_changed().connect(sigc::bind(sigc::mem_fun(
+-           *this, &Widget::on_value_changed), port_name));
+-  }
+-}
+-
+-// create stackboxes with switch controller for port name
+-void Widget::make_switch_box(Gtk::Box *box,
+-                             Glib::ustring label,
+-                             PortIndex port_name)
+-{
+-  Gxw::Switch *regler = static_cast<Gxw::Switch*>(
+-                                    get_controller_by_port(port_name));
+-  if (regler)
+-  {
+-    Gtk::Label* pr = new Gtk::Label(label, 0);
+-    pr->set_name("amplabel");
+-    // use label images instead simple string labes
+-    /*Glib::ustring  label_image = GX_LV2_STYLE_DIR;
+-    label_image += "/"+plug_name+"-";
+-    label_image += label;
+-    label_image += "-label.png";
+-     Gtk::Image *pr = new Gtk::Image(label_image);*/
+- 
+-    regler->cp_configure("switch", label, 0, 1, 1);
+-    regler->set_name(plug_name);
+-    regler->set_base_name( "button" );
+-    Gtk::VBox* b1 = new Gtk::VBox();
+-    box->pack_start( *Gtk::manage(b1), Gtk::PACK_EXPAND_PADDING);
+-    box->pack_start( *Gtk::manage(pr),Gtk::PACK_SHRINK); 
+-    box->pack_start(*regler,Gtk::PACK_SHRINK);
+-    Gtk::VBox* b2 = new Gtk::VBox();
+-    box->pack_start( *Gtk::manage(b2), Gtk::PACK_EXPAND_PADDING);
+-    regler->signal_toggled().connect(sigc::bind(sigc::mem_fun(
+-        *this, &Widget::on_value_changed), port_name));
+-  }
+-}
+-
+-// receive controller value changes from host and set them to controller
+-void Widget::set_value(uint32_t port_index,
+-                       uint32_t format,
+-                       const void * buffer)
+-{
+-  if ( format == 0 )
+-  {
+-    Gxw::Regler *regler = static_cast<Gxw::Regler*>(
+-                                    get_controller_by_port(port_index));
+-    if (regler)
+-    {
+-      float value = *static_cast<const float*>(buffer);
+-      regler->cp_set_value(value);
+-    }
+-  }
+-}
+-
+-// write (UI) controller value changes to the host->engine
+-void Widget::on_value_changed(uint32_t port_index)
+-{
+-  Gxw::Regler *regler = static_cast<Gxw::Regler*>(
+-                                    get_controller_by_port(port_index));
+-  if (regler)
+-  {
+-    float value = regler->cp_get_value();
+-    write_function(controller, port_index, sizeof(float), 0,
+-                                    static_cast<const void*>(&value));
+-  }
+-}
+-
+diff --git a/trunk/src/LV2/gx_wah.lv2/widget.h b/trunk/src/LV2/gx_wah.lv2/widget.h
+deleted file mode 100644
+index 7ec76d20..00000000
+--- a/trunk/src/LV2/gx_wah.lv2/widget.h
++++ /dev/null
+@@ -1,96 +0,0 @@
+-/*
+- * Copyright (C) 2012 Hermann Meyer, Andreas Degert, Pete Shorthose, Steve Poskitt
+- *
+- * This program is free software; you can redistribute it and/or modify
+- * it under the terms of the GNU 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 General Public License for more details.
+- *
+- * You should have received a copy of the GNU General Public License
+- * along with this program; if not, write to the Free Software
+- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+- * --------------------------------------------------------------------------
+- */
+-
+-#pragma once
+-
+-#ifndef SRC_HEADERS_WIDGET_H_
+-#define SRC_HEADERS_WIDGET_H_
+-
+-#include <gtkmm.h>
+-#include <gxwmm.h>
+-#include "gx_colwah.h"
+-#include "../config.h" // for GX_STYLE_DIR
+-// LV2UI stuff
+-#include "lv2/lv2plug.in/ns/extensions/ui/ui.h"
+-
+-class Widget : public Gtk::HBox
+-{
+-private:
+-  Gtk::Widget* get_controller_by_port(uint32_t port_index);
+-
+-  void on_value_changed(uint32_t port_index);
+-
+-  void make_controller_box(Gtk::Box *box,
+-                           Glib::ustring label,
+-                           float min, float max,
+-                           float digits,
+-                           PortIndex port_name);
+-
+-  void make_selector_box(Gtk::Box *box,
+-                         Glib::ustring label,
+-                         Glib::ustring tables[],
+-                         size_t _size,
+-                         float min, float digits,
+-                         PortIndex port_name);
+-
+-  void make_switch_box(Gtk::Box *box,
+-                       Glib::ustring label,
+-                       PortIndex port_name);
+-
+-  bool _expose_event(GdkEventExpose *event);
+-
+-  void set_value(uint32_t port_index,
+-                 uint32_t format,
+-                 const void * buffer);
+-public:
+-
+-  // public Lv2 communication stuff
+-  LV2UI_Controller controller;
+-  LV2UI_Write_Function write_function;
+-  static void set_value_static(uint32_t port_index,
+-                               uint32_t buffer_size,
+-                               uint32_t format,
+-                               const void * buffer, Widget *self)
+-  {
+-    self->set_value(port_index,format,buffer);
+-  }
+-
+-  Widget(Glib::ustring plugname);
+-  ~Widget();
+-
+-protected:
+-  Glib::ustring     plug_name;
+-  Gtk::Label        logo;
+-  Gtk::VBox         m_vbox_;
+-  Gtk::VBox         m_vbox1_;
+-  Gtk::VBox         m_vbox2_;
+-  Gtk::VBox         m_vbox;
+-  Gtk::VBox         m_vbox1;
+-  Gtk::VBox         m_vboxc[3];
+-  Gtk::VBox         m_vboxs[2];
+-  Gtk::VBox         m_vboxs_;
+-  Gtk::HBox         m_hbox_;
+-  Gtk::HBox         m_hbox1_;
+-
+-  Gxw::PaintBox     m_paintbox;
+-  Gxw::Selector     m_selector[2];
+-  Gxw::SmallKnobR      m_bigknob[3];
+-};
+-
+-#endif //SRC_HEADERS_WIDGET_H_
+diff --git a/trunk/src/LV2/gx_wah.lv2/wscript b/trunk/src/LV2/gx_wah.lv2/wscript
+deleted file mode 100644
+index fa66b426..00000000
+--- a/trunk/src/LV2/gx_wah.lv2/wscript
++++ /dev/null
+@@ -1,62 +0,0 @@
+-#!/usr/bin/env python
+-# encoding: utf-8
+-
+-import sys
+-
+-def configure(conf):
+-    pass
+-
+-def build(bld):
+-    bundle = 'gx_colwah.lv2'
+-
+-    src = ['gx_colwah.cpp'
+-           ]
+-    incl = ['../faust','./', '../DSP']
+-    lib = []
+-    if sys.platform.startswith("linux"):
+-        lib.append('dl')
+-    uselib = ['LV2CORE']
+-    cxxflag =[]
+-    if not bld.env['OPT'] and bld.env['SSE2']:
+-        cxxflag = [ "-msse2", "-mfpmath=sse"]
+-    lv2_effects = bld.shlib(
+-        includes = incl,
+-        lib = lib,
+-        uselib = uselib,
+-        obj_ext  = '_14.o',
+-        cxxflags = cxxflag,
+-        defines  = ["LV2_SO"],
+-        target   = 'gx_colwah',
+-        source   = src,
+-        install_path = '${LV2DIR}/%s' % bundle,
+-        chmod = 0o755,
+-        )
+-    lv2_effects.env['cxxshlib_PATTERN'] = '%s.so'
+-
+-    if bld.env['LV2GUI']:
+-        libpath1 = []
+-        lib1 = []
+-        incl = []
+-        if sys.platform.startswith("linux"):
+-            lib1.append('dl')
+-
+-        lv2_plugin_gui = bld.shlib(
+-            includes = incl,
+-            lib = lib1,
+-            libpath = libpath1,
+-            use = ['gxwmm','LV2CORE','GTKMM'],
+-            linkflags = '-Wl,-z,nodelete',
+-            defines  = ["LV2_GUI"],
+-            target   = 'gx_colwah_gui',
+-            source   = 'widget.cpp gx_colwah_gui.cpp',
+-            install_path = '${LV2DIR}/%s' % bundle,
+-            chmod = 0o755,
+-            )
+-        lv2_plugin_gui.env['cxxshlib_PATTERN'] = '%s.so'
+-
+-    install_path = '${LV2DIR}/%s' % bundle,
+-    if bld.env['MODGUI']:
+-        bld.install_files('${LV2DIR}/gx_colwah.lv2', bld.path.ant_glob('*.ttl'), relative_trick=True)
+-        bld.install_files('${LV2DIR}/gx_colwah.lv2', bld.path.ant_glob('modgui/**/*'), relative_trick=True)
+-    else:
+-        bld.install_files('${LV2DIR}/gx_colwah.lv2', bld.path.ant_glob('*.ttl', excl=['modgui.ttl']), relative_trick=True)
+-- 
+2.25.1
+
+
+From 2addb8b8028486992b1ca93f4a6c000d39cb0911 Mon Sep 17 00:00:00 2001
+From: brummer10 <brummer- at web.de>
+Date: Mon, 20 Jan 2020 07:38:47 +0100
+Subject: [PATCH 5/8]  introduce new midi toggle behavior Toggle, fix bug #79
+
+---
+ trunk/src/gx_head/engine/gx_paramtable.cpp | 8 ++++++++
+ trunk/src/headers/gx_main_midi.h           | 3 ++-
+ trunk/src/headers/gx_parameter.h           | 2 +-
+ 3 files changed, 11 insertions(+), 2 deletions(-)
+
+diff --git a/trunk/src/gx_head/engine/gx_paramtable.cpp b/trunk/src/gx_head/engine/gx_paramtable.cpp
+index caa65a34..0b8f87a2 100644
+--- a/trunk/src/gx_head/engine/gx_paramtable.cpp
++++ b/trunk/src/gx_head/engine/gx_paramtable.cpp
+@@ -326,6 +326,14 @@ bool MidiController::set_midi(int n, int last_value, bool update) {
+                 }
+                 break;
+             }
++            case Parameter::toggle_type::Toggle: {
++                if (param->on_off_value() && !n) {
++                    ret = param->midi_set(0, 127, _lower, _upper);
++                } else {
++                    ret = param->midi_set(127, 127, _lower, _upper);
++                }
++                break;
++            }
+         }
+     } else {
+         //fprintf(stderr,"continues %s \n",param->id().c_str());
+diff --git a/trunk/src/headers/gx_main_midi.h b/trunk/src/headers/gx_main_midi.h
+index 9c0ebc4d..c68502e5 100644
+--- a/trunk/src/headers/gx_main_midi.h
++++ b/trunk/src/headers/gx_main_midi.h
+@@ -77,7 +77,8 @@ class MidiConnect {
+     enum { RESPONSE_DELETE = 1 };
+     std::map<gx_engine::Parameter::toggle_type, const char*> toggle_behaviour_descriptions {
+         { gx_engine::Parameter::toggle_type::OnOff, "off /on states transition toggle" },
+-        { gx_engine::Parameter::toggle_type::Constant, "constant state toggle" }
++        { gx_engine::Parameter::toggle_type::Constant, "constant state toggle" },
++        { gx_engine::Parameter::toggle_type::Toggle, "toggle state" }
+     };
+     GtkTreeSelection* selection;
+     GtkListStore* store;
+diff --git a/trunk/src/headers/gx_parameter.h b/trunk/src/headers/gx_parameter.h
+index fa0fb680..c4c9cca5 100644
+--- a/trunk/src/headers/gx_parameter.h
++++ b/trunk/src/headers/gx_parameter.h
+@@ -106,7 +106,7 @@ class FileParameter;
+ class Parameter: boost::noncopyable {
+ public:
+     enum ctrl_type { None, Continuous, Switch, Enum };
+-    enum toggle_type { OnOff = 0, Constant = 1, _Count = 2 };
++    enum toggle_type { OnOff = 0, Constant = 1, Toggle = 2, _Count = 3 };
+ private:
+     virtual bool midi_set(float n, float high, float llimit, float ulimit); //RT
+     virtual bool midi_set_bpm(float n, float high, float llimit, float ulimit); //RT
+-- 
+2.25.1
+
+
+From 504e88037300f6252aa9620d9f3e1d08be7d9b68 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Hubert=20Figui=C3=A8re?= <hub at figuiere.net>
+Date: Sun, 26 Jan 2020 11:03:44 -0500
+Subject: [PATCH 7/8] Gxw::FastMeter: add missing properties
+
+---
+ trunk/libgxwmm/gxwmm/fastmeter.hg | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/trunk/libgxwmm/gxwmm/fastmeter.hg b/trunk/libgxwmm/gxwmm/fastmeter.hg
+index 2d525758..60c1cd25 100644
+--- a/trunk/libgxwmm/gxwmm/fastmeter.hg
++++ b/trunk/libgxwmm/gxwmm/fastmeter.hg
+@@ -33,6 +33,8 @@ class FastMeter: public Gtk::DrawingArea {
+ 	_WRAP_METHOD(void set_hold_count(int val), gx_fast_meter_set_hold_count)
+ 	_WRAP_PROPERTY(hold, int)
+ 	_WRAP_PROPERTY(dimen, int)
++	_WRAP_PROPERTY(horiz, bool)
++	_WRAP_PROPERTY(type, int)
+ 	_WRAP_PROPERTY("var-id", Glib::ustring)
+ };
+ 
+-- 
+2.25.1
+
+
+From 872954ce5c41890f2a1975726803e9e6e75d3387 Mon Sep 17 00:00:00 2001
+From: Andreas Degert <ad at papyrus-gmbh.de>
+Date: Wed, 29 Jan 2020 22:01:58 +0100
+Subject: [PATCH 8/8] dsp2cc, dsp2insert: make it work with Faust 2.20.2
+
+ - 2 variables in Faust output are renamed, the tools now detect the
+   correct variable name (so it still works with Faust 2.15.11)
+
+ - added an option --no-version-header to suppress the Faust version
+   number in der generated output (so two different Faust versions
+   have a chance to produce identical output)
+
+In an attempt to find (and fix) the cause of a long-standing Faust bug
+which leads to random order of output terms, I found commit
+18c4b269 Introduction of serial numbers in trees (2019-04-02)
+which might have fixed the bug. It's included in Faust 2.20.2, so
+maybe we have reproducible output if we switch to that version.
+---
+ trunk/tools/dsp2cc     | 123 +++++++++++++++++++++--------------------
+ trunk/tools/dsp2insert |  56 +++++++++----------
+ 2 files changed, 91 insertions(+), 88 deletions(-)
+
+diff --git a/trunk/tools/dsp2cc b/trunk/tools/dsp2cc
+index 4951ba59..9bc272c7 100755
+--- a/trunk/tools/dsp2cc
++++ b/trunk/tools/dsp2cc
+@@ -193,63 +193,59 @@ class Parser(object):
+                 return line
+         return ""
+ 
++    @staticmethod
++    def remove_indentation(cp):
++        m = re.compile(r"\t*").match
++        n = 10
++        for l in cp:
++            if l != "\n":
++                n = min(n, len(m(l).group(0)))
++        return [l[n:] for l in cp]
++
+     def copy(self, exp, line=None):
+         cp = []
+         if line:
+             cp.append(line)
+         m = re.compile(exp).match
+-        p = re.compile(r"\tint fSamplingFreq;").match
++        p = re.compile(r"\tint (fSamplingFreq|fSampleRate);").match
+         o = re.compile(r" public:").match
+         for line in self.lines:
+             if not line.strip():
+                 continue
+-            if p(line):
++            t = p(line)
++            if t:
++                self.sample_rate_var = t.group(1)
+                 continue
+             if m(line):
+                 break
+             if o(line):
+                 break
+             cp.append(line)
+-        # remove indentation
+-        m = re.compile(r"\t*").match
+-        n = 10
+-        for l in cp:
+-            if l != "\n":
+-                n = min(n, len(m(l).group(0)))
+-        return [l[n:] for l in cp]
++        return self.remove_indentation(cp)
+ 
+     def read_init(self, exp, line=None):
+         cp = []
+         if line:
+             cp.append(line)
+         m = re.compile(exp).match
+-        n = re.compile("		}").match
+-        p = re.compile(r"\tint fSamplingFreq;").match
+         o = re.compile(r" public:").match
+         for line in self.lines:
+             if not line.strip():
+                 continue
+-            if p(line):
+-                continue
+-            if n(line):
+-                continue
+             if m(line):
+                 break
+             if o(line):
+                 break
+             if line.startswith("		for"):
+                 line = line.replace("{\n","")
+-                line = line.replace("\t","")
+                 l = next(self.lines)
+                 line += l.replace("\t","")
++                l = next(self.lines)
++                if not l.strip():
++                    l = next(self.lines)
++                assert l.strip() == '}', repr(l)
+             cp.append(line)
+-        # remove indentation
+-        m = re.compile(r"\t*").match
+-        n = 10
+-        for l in cp:
+-            if l != "\n":
+-                n = min(n, len(m(l).group(0)))
+-        return [l[n:] for l in cp]
++        return self.remove_indentation(cp)
+ 
+     def get_section_list(self):
+         return "includes", "incl_class", "var-decl", "alias-defines", "alias-undefines", "var-init", "var-free", "ui", "compute", "post_compute"
+@@ -579,7 +575,12 @@ class Parser(object):
+         s = {}
+         self.ui = UIDefs()
+         #self.readMeta()  # (needed only for faust 9.4
+-        self.headvers = self.skip_until(r"\s*\s*(Code generated with Faust.*)").group(1)
++        headvers = self.skip_until(r"\s*\s*((Code generated with Faust *)([^  ]*)(.*))")
++        self.faust_version = headvers.group(3)
++        if self.options.version_header:
++            self.headvers = headvers.group(1)
++        else:
++            self.headvers = headvers.group(2) + headvers.group(4).lstrip()
+         cl,self.l,s["includes"] = self.readIncludes(r"#ifndef FAUSTCLASS")
+         if cl:
+             s["incl_class"] = self.readClass(r"#ifndef FAUSTCLASS")
+@@ -600,8 +601,8 @@ class Parser(object):
+         self.skip_until(r"\s*virtual void instanceResetUserInterface")
+         s["var-init"] += self.copy(r"\s*}$")
+         self.skip_until(r"\s*virtual void instanceClear")
+-        s["var-init"] += self.read_init(r"\s*virtual void init")
+-        del s["var-init"] [-1]
++        s["var-init"] += self.read_init(r'\t}')
++        self.sample_rate_param = self.skip_until(r"\s*virtual void init\(int ([a-zA-Z_]+)\)").group(1)
+         self.skip_until(r"\s*virtual void buildUserInterface")
+         s["ui"] = self.readUI(r"\s*}$")
+         s["var-decl"], s["alias-defines"], s["alias-undefines"] = self.change_var_decl(var_decl,options.init_type)
+@@ -854,7 +855,7 @@ namespace %(namespace)s {
+ #if %(has_activate)s
+ static bool mem_allocated = false;
+ #endif
+-static int	fSamplingFreq;
++static int	%(sample_rate_var)s;
+ 
+ #if %(has_state)s
+ static void clear_state_f(PluginDef* = 0)
+@@ -863,7 +864,7 @@ static void clear_state_f(PluginDef* = 0)
+ }
+ 
+ #endif
+-static void init(unsigned int samplingFreq, PluginDef* = 0)
++static void init(unsigned int %(sample_rate_param)s, PluginDef* = 0)
+ {
+ %(init_body)s\
+ #if %(has_state_no_activate)s
+@@ -1054,16 +1055,16 @@ private:
+ #if %(has_stereo)s
+ 	gx_resample::FixedRateResampler smps;
+ #endif
+-	int samplingFreq;
++	int %(sample_rate_param)s;
+ #endif
+ #if %(has_oversample)s
+ 	gx_resample::FixedRateResampler smp;
+ #if %(has_stereo)s
+ 	gx_resample::FixedRateResampler smps;
+ #endif
+-	int samplingFreq;
++	int %(sample_rate_param)s;
+ #endif
+-	int fSamplingFreq;
++	int %(sample_rate_var)s;
+ %(var_decl)s\
+ 
+ #if %(has_insert_p)s
+@@ -1097,7 +1098,7 @@ public:
+ 	static const char *glade_def;
+ #endif
+ #endif
+-	void init(unsigned int samplingFreq);
++	void init(unsigned int %(sample_rate_param)s);
+ 	void compute(int %(countname)s%(compute_args)s);
+ 	int register_par(const ParamReg& reg);
+ #if %(has_plugindef)s
+@@ -1111,7 +1112,7 @@ public:
+ #if %(has_ui)s
+ 	static int load_ui_f_static(const UiBuilder& b, int form);
+ #endif
+-	static void init_static(unsigned int samplingFreq, PluginDef*);
++	static void init_static(unsigned int %(sample_rate_param)s, PluginDef*);
+ 	static void compute_static(int %(countname)s%(compute_args)s, PluginDef*);
+ 	static int register_params_static(const ParamReg& reg);
+ 	static void del_instance(PluginDef *p);
+@@ -1189,23 +1190,23 @@ void Dsp::clear_state_f_static(PluginDef *p)
+ #if %(has_fixedrate)s
+ inline void Dsp::init(unsigned int RsamplingFreq)
+ {
+-	samplingFreq = %(fixedrate)s;
+-	smp.setup(RsamplingFreq, samplingFreq);
++	%(sample_rate_param)s = %(fixedrate)s;
++	smp.setup(RsamplingFreq, %(sample_rate_param)s);
+ #if %(has_stereo)s
+-	smps.setup(RsamplingFreq, samplingFreq);
++	smps.setup(RsamplingFreq, %(sample_rate_param)s);
+ #endif
+ #endif
+ #if %(has_oversample)s
+ inline void Dsp::init(unsigned int RsamplingFreq)
+ {
+-	samplingFreq = %(oversample)s * RsamplingFreq;
+-	smp.setup(RsamplingFreq, samplingFreq);
++	%(sample_rate_param)s = %(oversample)s * RsamplingFreq;
++	smp.setup(RsamplingFreq, %(sample_rate_param)s);
+ #if %(has_stereo)s
+-	smps.setup(RsamplingFreq, samplingFreq);
++	smps.setup(RsamplingFreq, %(sample_rate_param)s);
+ #endif
+ #endif
+ #if %(no_oversample)s
+-inline void Dsp::init(unsigned int samplingFreq)
++inline void Dsp::init(unsigned int %(sample_rate_param)s)
+ {
+ #endif
+ %(init_body)s\
+@@ -1218,9 +1219,9 @@ inline void Dsp::init(unsigned int samplingFreq)
+ }
+ 
+ #if %(has_plugindef)s
+-void Dsp::init_static(unsigned int samplingFreq, PluginDef *p)
++void Dsp::init_static(unsigned int %(sample_rate_param)s, PluginDef *p)
+ {
+-	static_cast<Dsp*>(p)->init(samplingFreq);
++	static_cast<Dsp*>(p)->init(%(sample_rate_param)s);
+ }
+ 
+ #endif
+@@ -1470,16 +1471,16 @@ private:
+ #if %(has_stereo)s
+ 	gx_resample::FixedRateResampler smps;
+ #endif
+-	uint32_t samplingFreq;
++	uint32_t %(sample_rate_param)s;
+ #endif
+ #if %(has_oversample)s
+ 	gx_resample::FixedRateResampler smp;
+ #if %(has_stereo)s
+ 	gx_resample::FixedRateResampler smps;
+ #endif
+-	uint32_t samplingFreq;
++	uint32_t %(sample_rate_param)s;
+ #endif
+-	uint32_t fSamplingFreq;
++	uint32_t %(sample_rate_var)s;
+ %(var_decl)s\
+ 
+ #if %(has_insert_p)s
+@@ -1512,7 +1513,7 @@ public:
+ #if %(has_activate)s
+ 	int activate(bool start);
+ #endif
+-	void init(uint32_t samplingFreq);
++	void init(uint32_t %(sample_rate_param)s);
+ 	void compute(int %(countname)s%(compute_args)s);
+ #if %(has_plugindef)s
+ 
+@@ -1522,7 +1523,7 @@ public:
+ #if %(has_activate)s
+ 	static int activate_static(bool start, PluginLV2*);
+ #endif
+-	static void init_static(uint32_t samplingFreq, PluginLV2*);
++	static void init_static(uint32_t %(sample_rate_param)s, PluginLV2*);
+ 	static void compute_static(int %(countname)s%(compute_args)s, PluginLV2*);
+ 	static void del_instance(PluginLV2 *p);
+ #if %(has_lv2)s
+@@ -1596,23 +1597,23 @@ void Dsp::clear_state_f_static(PluginLV2 *p)
+ #if %(has_fixedrate)s
+ inline void Dsp::init(uint32_t RsamplingFreq)
+ {
+-	samplingFreq = %(fixedrate)s;
+-	smp.setup(RsamplingFreq, samplingFreq);
++	%(sample_rate_param)s = %(fixedrate)s;
++	smp.setup(RsamplingFreq, %(sample_rate_param)s);
+ #if %(has_stereo)s
+-	smps.setup(RsamplingFreq, samplingFreq);
++	smps.setup(RsamplingFreq, %(sample_rate_param)s);
+ #endif
+ #endif
+ #if %(has_oversample)s
+ inline void Dsp::init(uint32_t RsamplingFreq)
+ {
+-	samplingFreq = %(oversample)s * RsamplingFreq;
+-	smp.setup(RsamplingFreq, samplingFreq);
++	%(sample_rate_param)s = %(oversample)s * RsamplingFreq;
++	smp.setup(RsamplingFreq, %(sample_rate_param)s);
+ #if %(has_stereo)s
+-	smps.setup(RsamplingFreq, samplingFreq);
++	smps.setup(RsamplingFreq, %(sample_rate_param)s);
+ #endif
+ #endif
+ #if %(no_oversample)s
+-inline void Dsp::init(uint32_t samplingFreq)
++inline void Dsp::init(uint32_t %(sample_rate_param)s)
+ {
+ #endif
+ %(init_body)s\
+@@ -1625,9 +1626,9 @@ inline void Dsp::init(uint32_t samplingFreq)
+ }
+ 
+ #if %(has_plugindef)s
+-void Dsp::init_static(uint32_t samplingFreq, PluginLV2 *p)
++void Dsp::init_static(uint32_t %(sample_rate_param)s, PluginLV2 *p)
+ {
+-	static_cast<Dsp*>(p)->init(samplingFreq);
++	static_cast<Dsp*>(p)->init(%(sample_rate_param)s);
+ }
+ 
+ #endif
+@@ -2177,6 +2178,8 @@ class Output(object):
+             has_separate_header = fp_head is not None,
+             header_name = h_name,
+             sharedlib = self.options.template_type == "sharedlib",
++            sample_rate_param = self.parser.sample_rate_param,
++            sample_rate_var = self.parser.sample_rate_var,
+             ))
+         s.seek(0)
+         preprocess(s, fp, fp_head)
+@@ -2193,18 +2196,18 @@ class Output(object):
+         self.parser.write(fp, "var-decl", dct=dict(static="static "))
+         if self.has_activate:
+             fp.write("static bool mem_allocated = false;\n")
+-        fp.write("static int\tfSamplingFreq;\n\n")
++        fp.write("static int\t%s;\n\n" % self.parser.sample_rate_var)
+         if self.state_init:
+             fp.write("static void clear_state_f(PluginDef* = 0)\n{\n")
+             fp.write(self.state_init);
+             fp.write("}\n\n")
+         if self.state_init and not self.has_activate:
+-            fp.write("static void init(unsigned int samplingFreq, PluginDef* = 0)\n{\n")
++            fp.write("static void init(unsigned int %s, PluginDef* = 0)\n{\n" % self.parser.sample_rate_param)
+             self.parser.write(fp, "var-init", 1, filt=self.parser.ui.var_filter(1))
+             fp.write('\tclear_state_f();\n')
+             fp.write("}\n\n")
+         else:
+-            fp.write("static void init(unsigned int samplingFreq, PluginDef* = 0)\n{\n")
++            fp.write("static void init(unsigned int %s, PluginDef* = 0)\n{\n" % self.parser.sample_rate_param)
+             self.parser.write(fp, "var-init", 1, filt=self.parser.ui.var_filter(1))
+             fp.write("}\n\n")
+         if self.has_activate:
+@@ -2276,6 +2279,8 @@ def main():
+                   help="put definitions inside an extra namespace")
+     op.add_option("-e", "--param-warn", dest="param_warn", action="store_true", default=False,
+                   help="don't signal an error when the ui definition references an unknown dsp parameter")
++    op.add_option("--no-version-header", dest="version_header", action="store_false", default=True,
++                  help="don't display the faust version in generated files")
+     options, args = op.parse_args()
+     if options.init_type not in init_opts:
+         op.error("unknown init-type")
+diff --git a/trunk/tools/dsp2insert b/trunk/tools/dsp2insert
+index b54c03bb..0a298fe2 100755
+--- a/trunk/tools/dsp2insert
++++ b/trunk/tools/dsp2insert
+@@ -187,63 +187,59 @@ class Parser(object):
+                 return line
+         return ""
+ 
++    @staticmethod
++    def remove_indentation(cp):
++        m = re.compile(r"\t*").match
++        n = 10
++        for l in cp:
++            if l != "\n":
++                n = min(n, len(m(l).group(0)))
++        return [l[n:] for l in cp]
++
+     def copy(self, exp, line=None):
+         cp = []
+         if line:
+             cp.append(line)
+         m = re.compile(exp).match
+-        p = re.compile(r"\tint fSamplingFreq;").match
++        p = re.compile(r"\tint (fSamplingFreq|fSampleRate);").match
+         o = re.compile(r" public:").match
+         for line in self.lines:
+             if not line.strip():
+                 continue
+-            if p(line):
++            t = p(line)
++            if t:
++                self.sample_rate_var = t.group(1)
+                 continue
+             if m(line):
+                 break
+             if o(line):
+                 break
+             cp.append(line)
+-        # remove indentation
+-        m = re.compile(r"\t*").match
+-        n = 10
+-        for l in cp:
+-            if l != "\n":
+-                n = min(n, len(m(l).group(0)))
+-        return [l[n:] for l in cp]
++        return self.remove_indentation(cp)
+ 
+     def read_init(self, exp, line=None):
+         cp = []
+         if line:
+             cp.append(line)
+         m = re.compile(exp).match
+-        n = re.compile("		}").match
+-        p = re.compile(r"\tint fSamplingFreq;").match
+         o = re.compile(r" public:").match
+         for line in self.lines:
+             if not line.strip():
+                 continue
+-            if p(line):
+-                continue
+-            if n(line):
+-                continue
+             if m(line):
+                 break
+             if o(line):
+                 break
+             if line.startswith("		for"):
+                 line = line.replace("{\n","")
+-                line = line.replace("\t","")
+                 l = next(self.lines)
+                 line += l.replace("\t","")
++                l = next(self.lines)
++                if not l.strip():
++                    l = next(self.lines)
++                assert l.strip() == '}', repr(l)
+             cp.append(line)
+-        # remove indentation
+-        m = re.compile(r"\t*").match
+-        n = 10
+-        for l in cp:
+-            if l != "\n":
+-                n = min(n, len(m(l).group(0)))
+-        return [l[n:] for l in cp]
++        return self.remove_indentation(cp)
+ 
+     def get_section_list(self):
+         return "includes", "var-decl", "alias-defines", "alias-undefines", "var-init", "var-free", "ui", "compute"
+@@ -551,8 +547,8 @@ class Parser(object):
+         self.skip_until(r"\s*virtual void instanceResetUserInterface")
+         s["var-init"] += self.copy(r"\s*}$")
+         self.skip_until(r"\s*virtual void instanceClear")
+-        s["var-init"] += self.read_init(r"\s*virtual void init")
+-        del s["var-init"] [-1]
++        s["var-init"] += self.read_init(r'\t}')
++        self.sample_rate_param = self.skip_until(r"\s*virtual void init\(int ([a-zA-Z_]+)\)").group(1)
+         self.skip_until(r"\s*virtual void buildUserInterface")
+         s["ui"] = self.readUI(r"\s*}$")
+         s["var-decl"], s["alias-defines"], s["alias-undefines"] = self.change_var_decl(var_decl,options.init_type)
+@@ -686,7 +682,7 @@ insert_p1_incl = \"\"\"
+ 
+ insert_p1_class = \"\"\"
+ #if %(has_oversample)s
+-	int samplingFreq;
++	int %(sample_rate_param)s;
+ 	gx_resample::FixedRateResampler smpCl;
+ #if %(has_stereo)s
+ 	gx_resample::FixedRateResampler smpsCl;
+@@ -697,10 +693,10 @@ insert_p1_class = \"\"\"
+ 
+ insert_p1_init = \"\"\"
+ #if %(has_oversample)s
+-	samplingFreq = %(oversample)s;
+-	smpCl.setup(fSamplingFreq, samplingFreq);
++	%(sample_rate_param)s = %(oversample)s;
++	smpCl.setup(%(sample_rate_var)s, %(sample_rate_param)s);
+ #if %(has_stereo)s
+-	smpsCl.setup(fSamplingFreq, samplingFreq);
++	smpsCl.setup(%(sample_rate_var)s, %(sample_rate_param)s);
+ #endif
+ #endif
+ %(init_body)s\
+@@ -864,6 +860,8 @@ class Output(object):
+             compute_body = self.parser_sect("compute", 1),
+             undefines = self.parser_sect("alias-undefines", 0),
+             register_body = self.parser_ui("reg."),
++            sample_rate_param = self.parser.sample_rate_param,
++            sample_rate_var = self.parser.sample_rate_var,
+             ))
+         s.seek(0)
+         preprocess(s, fp, fp_head)
+-- 
+2.25.1
+



More information about the arch-commits mailing list