[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