From e40fc849149dd97c248866a4a1d026dda5e57b62 Mon Sep 17 00:00:00 2001
From: Robert Jonsson <spamatica@gmail.com>
Date: Mon, 7 Mar 2011 19:01:11 +0000
Subject: clean3

---
 .../plugins/freeverb/CMakeLists.txt                |  33 +++
 .../muse_qt4_evolution/plugins/freeverb/allpass.h  |  47 +++++
 attic/muse_qt4_evolution/plugins/freeverb/comb.h   |  63 ++++++
 .../plugins/freeverb/denormals.h                   |  38 ++++
 .../plugins/freeverb/freeverb.cpp                  | 166 +++++++++++++++
 .../muse_qt4_evolution/plugins/freeverb/readme.txt | 147 +++++++++++++
 .../plugins/freeverb/revmodel.cpp                  | 232 +++++++++++++++++++++
 .../muse_qt4_evolution/plugins/freeverb/revmodel.h |  79 +++++++
 attic/muse_qt4_evolution/plugins/freeverb/tuning.h |  60 ++++++
 9 files changed, 865 insertions(+)
 create mode 100644 attic/muse_qt4_evolution/plugins/freeverb/CMakeLists.txt
 create mode 100644 attic/muse_qt4_evolution/plugins/freeverb/allpass.h
 create mode 100644 attic/muse_qt4_evolution/plugins/freeverb/comb.h
 create mode 100644 attic/muse_qt4_evolution/plugins/freeverb/denormals.h
 create mode 100644 attic/muse_qt4_evolution/plugins/freeverb/freeverb.cpp
 create mode 100644 attic/muse_qt4_evolution/plugins/freeverb/readme.txt
 create mode 100644 attic/muse_qt4_evolution/plugins/freeverb/revmodel.cpp
 create mode 100644 attic/muse_qt4_evolution/plugins/freeverb/revmodel.h
 create mode 100644 attic/muse_qt4_evolution/plugins/freeverb/tuning.h

(limited to 'attic/muse_qt4_evolution/plugins/freeverb')

diff --git a/attic/muse_qt4_evolution/plugins/freeverb/CMakeLists.txt b/attic/muse_qt4_evolution/plugins/freeverb/CMakeLists.txt
new file mode 100644
index 00000000..0a86454f
--- /dev/null
+++ b/attic/muse_qt4_evolution/plugins/freeverb/CMakeLists.txt
@@ -0,0 +1,33 @@
+#=============================================================================
+#  MusE
+#  Linux Music Editor
+#  $Id:$
+#
+#  Copyright (C) 2002-2006 by Werner Schweer and others
+#
+#  This program is free software; you can redistribute it and/or modify
+#  it under the terms of the GNU General Public License version 2.
+#
+#  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., 675 Mass Ave, Cambridge, MA 02139, USA.
+#=============================================================================
+
+add_library ( freeverb SHARED
+      freeverb.cpp revmodel.cpp
+      )
+
+# tell cmake to name the target freeverb.so instead of
+# libfreeverb.so
+#
+set_target_properties (freeverb
+      PROPERTIES PREFIX ""
+      COMPILE_FLAGS "-O2"
+      )
+
+install_targets ( /lib/${MusE_INSTALL_NAME}/plugins freeverb)
diff --git a/attic/muse_qt4_evolution/plugins/freeverb/allpass.h b/attic/muse_qt4_evolution/plugins/freeverb/allpass.h
new file mode 100644
index 00000000..2f27691e
--- /dev/null
+++ b/attic/muse_qt4_evolution/plugins/freeverb/allpass.h
@@ -0,0 +1,47 @@
+// Allpass filter declaration
+//
+// Written by Jezar at Dreampoint, June 2000
+// http://www.dreampoint.co.uk
+// This code is public domain
+
+#ifndef _allpass_
+#define _allpass_
+#include "denormals.h"
+
+//---------------------------------------------------------
+//   allpass
+//---------------------------------------------------------
+
+class allpass
+      {
+	float	feedback;
+	float	*buffer;
+	int bufsize;
+	int bufidx;
+
+   public:
+      allpass() { bufidx = 0; }
+	void	setbuffer(float *buf, int size) {
+      	buffer = buf;
+	      bufsize = size;
+            }
+      float process(float input) {
+	      float bufout = buffer[bufidx];
+      	undenormalise(bufout);
+	      float output = -input + bufout;
+      	buffer[bufidx] = input + (bufout*feedback);
+            if (++bufidx >= bufsize)
+                  bufidx = 0;
+//            bufidx = ++bufidx % bufsize;
+      	return output;
+            }
+	void	mute() {
+      	for (int i=0; i<bufsize; i++)
+	      	buffer[i]=0;
+            }
+	void	setfeedback(float val)  { feedback = val; }
+	float	getfeedback()           { return feedback; }
+      };
+
+
+#endif//_allpass
diff --git a/attic/muse_qt4_evolution/plugins/freeverb/comb.h b/attic/muse_qt4_evolution/plugins/freeverb/comb.h
new file mode 100644
index 00000000..22f5591b
--- /dev/null
+++ b/attic/muse_qt4_evolution/plugins/freeverb/comb.h
@@ -0,0 +1,63 @@
+// Comb filter class declaration
+//
+// Written by Jezar at Dreampoint, June 2000
+// http://www.dreampoint.co.uk
+// This code is public domain
+
+#ifndef _comb_
+#define _comb_
+
+#include "denormals.h"
+
+
+//---------------------------------------------------------
+//   comb
+//---------------------------------------------------------
+
+class comb
+      {
+	float	feedback;
+	float	filterstore;
+	float	damp1;
+	float	damp2;
+	float	*buffer;
+	int bufsize;
+	int bufidx;
+
+public:
+      comb() {
+	      filterstore = 0;
+	      bufidx = 0;
+            }
+	void	setbuffer(float *buf, int size) {
+	      buffer = buf;
+	      bufsize = size;
+            }
+      float process(float input) {
+      	float output = buffer[bufidx];
+	      undenormalise(output);
+      	filterstore = (output*damp2) + (filterstore*damp1);
+	      undenormalise(filterstore);
+      	buffer[bufidx] = input + (filterstore*feedback);
+            if (++bufidx >= bufsize)
+                  bufidx = 0;
+//            bufidx = ++bufidx % bufsize;
+      	return output;
+            }
+	void	mute() {
+      	for (int i=0; i<bufsize; i++)
+	      	buffer[i]=0;
+            }
+	void	setdamp(float val) {
+	      damp1 = val;
+	      damp2 = 1-val;
+            }
+	float	getdamp()              { return damp1; }
+	void	setfeedback(float val) { feedback = val; }
+	float	getfeedback()          { return feedback; }
+      };
+
+
+#endif //_comb_
+
+//ends
diff --git a/attic/muse_qt4_evolution/plugins/freeverb/denormals.h b/attic/muse_qt4_evolution/plugins/freeverb/denormals.h
new file mode 100644
index 00000000..37d3ed27
--- /dev/null
+++ b/attic/muse_qt4_evolution/plugins/freeverb/denormals.h
@@ -0,0 +1,38 @@
+// Macro for killing denormalled numbers
+//
+// Written by Jezar at Dreampoint, June 2000
+// http://www.dreampoint.co.uk
+// Based on IS_DENORMAL macro by Jon Watte
+// This code is public domain
+
+#ifndef _denormals_
+#define _denormals_
+
+// this does not work with at least gcc3.3 and -O2:
+// #define undenormalise(sample) if(((*(unsigned int*)&sample)&0x7f800000)==0) sample=0.0f
+//
+// from Laurent de Soras Paper: Denormal numbers in floating point
+//    signal processing applications
+// (ws)
+
+#if 0
+#define undenormalise(sample)       \
+      {                             \
+      float anti_denormal = 1e-18;  \
+      sample += anti_denormal;      \
+      sample -= anti_denormal;      \
+      }
+#endif
+
+// from beast-0.7.2  (Tim Janik/Stefan Westerfeld):
+
+#define undenormalise(sample)       \
+      do {                             \
+            volatile float __forced_float = 1e-29 + sample;  \
+            sample = __forced_float - 1e-29;      \
+      } while (0)
+
+#endif//_denormals_
+
+//ends
+
diff --git a/attic/muse_qt4_evolution/plugins/freeverb/freeverb.cpp b/attic/muse_qt4_evolution/plugins/freeverb/freeverb.cpp
new file mode 100644
index 00000000..0385e887
--- /dev/null
+++ b/attic/muse_qt4_evolution/plugins/freeverb/freeverb.cpp
@@ -0,0 +1,166 @@
+//=========================================================
+//  MusE
+//  Linux Music Editor
+//    $Id: freeverb.cpp,v 1.1.1.1 2003/10/27 18:57:03 wschweer Exp $
+//  (C) Copyright 2000 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "revmodel.h"
+
+//---------------------------------------------------------
+//   instantiateFreeverb
+//    Construct a new plugin instance.
+//---------------------------------------------------------
+
+LADSPA_Handle instantiate(const LADSPA_Descriptor* /*Descriptor*/,
+   unsigned long /* samplerate*/)
+      {
+      return new Revmodel;
+      }
+
+//---------------------------------------------------------
+//   connectPortToFreeverb
+//    Connect a port to a data location.
+//---------------------------------------------------------
+
+void connect(LADSPA_Handle Instance, unsigned long port,
+   LADSPA_Data* data)
+      {
+      ((Revmodel *)Instance)->port[port] = data;
+      }
+
+//---------------------------------------------------------
+//   activate
+//---------------------------------------------------------
+
+void activate(LADSPA_Handle instance)
+      {
+      ((Revmodel *)instance)->activate();
+      }
+
+//---------------------------------------------------------
+//   deactivate
+//---------------------------------------------------------
+
+void deactivate(LADSPA_Handle /*Instance*/)
+      {
+      }
+
+//---------------------------------------------------------
+//   runFreeverb
+//---------------------------------------------------------
+
+void run(LADSPA_Handle Instance, unsigned long n)
+      {
+      ((Revmodel*)Instance)->processreplace(n);
+      }
+
+//---------------------------------------------------------
+//   runAddingFreeverb
+//    *ADD* the output to the output buffer.
+//---------------------------------------------------------
+
+void runAdding(LADSPA_Handle Instance, unsigned long n)
+      {
+      ((Revmodel*)Instance)->processmix(n);
+      }
+
+//---------------------------------------------------------
+//   setFreeverbRunAddingGain
+//---------------------------------------------------------
+
+void setGain(LADSPA_Handle /*Instance*/, LADSPA_Data /*Gain*/)
+      {
+//      ((Freeverb *)Instance)->m_fRunAddingGain = Gain;
+      }
+
+//---------------------------------------------------------
+//   cleanupFreeverb
+//---------------------------------------------------------
+
+void cleanup(LADSPA_Handle Instance)
+      {
+      delete (Revmodel *)Instance;
+      }
+
+static const char* portNames[] = {
+      "Input (Left)",
+      "Input (Right)",
+      "Output (Left)",
+      "Output (Right)",
+      "Room Size",
+      "Damping",
+      "Wet Level",
+      };
+
+LADSPA_PortDescriptor portDescriptors[] = {
+      LADSPA_PORT_INPUT  | LADSPA_PORT_AUDIO,
+      LADSPA_PORT_INPUT  | LADSPA_PORT_AUDIO,
+      LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO,
+      LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO,
+      LADSPA_PORT_INPUT  | LADSPA_PORT_CONTROL,
+      LADSPA_PORT_INPUT  | LADSPA_PORT_CONTROL,
+      LADSPA_PORT_INPUT  | LADSPA_PORT_CONTROL,
+      };
+
+LADSPA_PortRangeHint portRangeHints[] = {
+      { 0, 0.0, 0.0 },
+      { 0, 0.0, 0.0 },
+      { 0, 0.0, 0.0 },
+      { 0, 0.0, 0.0 },
+      { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW,  0.0, 1.0 },
+      { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_LOGARITHMIC, 0.0, 1.0 },
+      { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_LOGARITHMIC, 0.0, 1.0 },
+      };
+
+LADSPA_Descriptor descriptor = {
+      1050,
+      "freeverb1",
+      LADSPA_PROPERTY_HARD_RT_CAPABLE,
+      "Freeverb",
+      "Werner Schweer",
+      "None",
+      7,
+      portDescriptors,
+      portNames,
+      portRangeHints,
+      0,                // impl. data
+      instantiate,
+      connect,
+      activate,
+      run,
+      runAdding,
+      setGain,
+      deactivate,
+      cleanup
+      };
+
+//---------------------------------------------------------
+//   _init
+//    called automatically when the plugin library is first
+//    loaded.
+//---------------------------------------------------------
+
+void _init()
+      {
+      }
+
+//---------------------------------------------------------
+//   _fini
+//    called automatically when the library is unloaded.
+//---------------------------------------------------------
+
+void _fini()
+      {
+      }
+
+//---------------------------------------------------------
+//   ladspa_descriptor
+//    Return a descriptor of the requested plugin type.
+//---------------------------------------------------------
+
+const LADSPA_Descriptor* ladspa_descriptor(unsigned long i)
+      {
+      return (i == 0) ? &descriptor : 0;
+      }
+
diff --git a/attic/muse_qt4_evolution/plugins/freeverb/readme.txt b/attic/muse_qt4_evolution/plugins/freeverb/readme.txt
new file mode 100644
index 00000000..2c1349a3
--- /dev/null
+++ b/attic/muse_qt4_evolution/plugins/freeverb/readme.txt
@@ -0,0 +1,147 @@
+readme from original freeverb-source:
+==============================================
+
+
+Freeverb - Free, studio-quality reverb SOURCE CODE in the public domain
+-----------------------------------------------------------------------
+
+Written by Jezar at Dreampoint - http://www.dreampoint.co.uk
+
+
+Introduction
+------------
+
+Hello.
+
+I'll try to keep this "readme" reasonably small.
+There are few things in the world that I hate more than long "readme" files.
+Except "coding conventions" - but more on that later...
+
+In this zip file you will find two folders of C++ source code:
+
+"Components" - Contains files that should clean-compile
+      ON ANY TYPE OF COMPUTER OR SYSTEM WHATSOEVER. It should not be necessary
+      to make ANY changes to these files to get them to compile, except to make
+      up for inadequacies of certain compilers. These files create three classes
+      - a comb filter, an allpass filter, and a reverb model made up of a number
+      of instances of the filters, with some features to control the filters at
+      a macro level. You will need to link these classes into another program that
+      interfaces with them. The files in the components drawer are completely
+      independant, and can be built without dependancies on anything else.
+      Because of the simple interface, it should be possible to interface
+      these files to any system - VST, DirectX, anything - without changing
+      them AT ALL.
+
+"FreeverbVST" - Contains a Steinberg VST implementation of this version of
+      Freeverb, using the components in (surprise) the components folder.
+      It was built on a PC but may compile properly for the Macintosh with
+      no problems. I don't know - I don't have a Macintosh. If you've
+      figured out how to compile the examples in the Steinberg VST
+      Development Kit, then you should easilly figure out how to bring the
+      files into a project and get it working in a few minutes. It should
+      be very simple.
+
+Note that this version of Freeverb doesn't contain predelay, or any EQ.
+I thought that might make it difficult to understand the "reverb" part of
+the code. Once you figure out how Freeverb works, you should find it trivial
+to add such features with little CPU overhead.
+
+Also, the code in this version of Freeverb has been optimised. This has changed
+the sound *slightly*, but not significantly compared to how much processing
+power it saves.
+
+Finally, note that there is also a built copy of this version of Freeverb called
+"Freeverb3.dll" - this is a VST plugin for the PC. If you want a version for
+the Mac or anything else, then you'll need to build it yourself from the code.
+
+
+Technical Explanation
+---------------------
+
+Freeverb is a simple implementation of the standard Schroeder/Moorer reverb
+model. I guess the only reason why it sounds better than other reverbs,
+is simply because I spent a long while doing listening tests in order to create
+the values found in "tuning.h". It uses 8 comb filters on both the left and right
+channels), and you might possibly be able to get away with less if CPU power
+is a serious constraint for you. It then feeds the result of the reverb through
+4 allpass filters on both the left and right channels. These "smooth" the sound.
+Adding more than four allpasses doesn't seem to add anything significant
+to the sound, and if you use less, the sound gets a bit "grainy".
+The filters on the right channel are slightly detuned compared to the left channel
+in order to create a stereo effect.
+
+Hopefully, you should find the code in the components drawer a model of
+brevity and clarity. Notice that I don't use any "coding conventions".
+Personally, I think that coding conventions suck. They are meant to make
+the code "clearer", but they inevitably do the complete opposite, making
+the code completely unfathomable. Anyone whose done Windows programming
+with its - frankly stupid - "Hungarian notation" will know exactly what
+I mean. Coding conventions typically promote issues that are irrelevant
+up to the status of appearing supremely important. It may have helped back
+people in the days when compilers where somewhat feeble in their type-safety,
+but not in the new millenium with advanced C++ compilers.
+
+Imagine if we rewrote the English language to conform to coding conventions.
+After all, The arguments should be just as valid for the English language as
+they are for a computer language. For example, we could put a lower-case "n"
+in front of every noun, a lower-case "p" in front of a persons name,
+a lower-case "v" in front of every verb, and a lower-case "a" in front
+of every adjective. Can you imagine what the English language would look like?
+All in the name of "clarity". It's just as stupid to do this for computer
+code as it would be to do it for the English language. I hope that the
+code for Freeverb in the components drawer demonstrates this, and helps start
+a movement back towards sanity in coding practices.
+
+
+Background
+----------
+
+Why is the Freeverb code now public domain? Simple. I only intended to create
+Freeverb to provide me and my friends with studio-quality reverb for free.
+I never intended to make any money out of it. However, I simply do not have the
+time to develop it any further. I'm working on a "concept album" at the moment,
+and I'll never finish it if I spend any more time programming.
+
+In any case, I make more far money as a contract programmer - making Mobile
+Internet products - than I ever could writing plugins, so it simply doesn't
+make financial sense for me to spend any more time on it.
+
+Rather than give Freeverb to any particular individual or organisation
+to profit from it, I've decided to give it away to the internet community
+at large, so that quality, FREE (or at the very least, low-cost) reverbs can
+be developed for all platforms.
+
+Feel free to use the source code for Freeverb in any of your own products,
+whether they are also available for free, or even if they are commercial -
+I really don't mind. You may do with the code whatever you wish. If you use
+it in a product (whether commercial or not), it would be very nice of you,
+if you were to send me a copy of your product - although I appreciate that
+this isn't always possible in all circumstances.
+
+HOWEVER, please don't bug me with questions about how to use this code.
+I gave away Freeverb because I don't have time to maintain it. That means
+I *certainly* don't have time to answer questions about the source code, so
+please don't email questions to me. I *will* ignore them. If you can't figure
+the code for Freeverb out - then find somebody who can. I hope that either
+way, you enjoy experimenting with it.
+
+
+Disclaimer
+----------
+
+This software and source code is given away for free, without any warranties
+of any kind. It has been given away to the internet community as a free gift,
+so please treat it in the same spirit.
+
+
+I hope this code is useful and interesting to you all!
+I hope you have lots of fun experimenting with it and make good products!
+
+Very best regards,
+Jezar.
+Technology Consultant
+Dreampoint Design and Engineering
+http://www.dreampoint.co.uk
+
+
+//ends
diff --git a/attic/muse_qt4_evolution/plugins/freeverb/revmodel.cpp b/attic/muse_qt4_evolution/plugins/freeverb/revmodel.cpp
new file mode 100644
index 00000000..c72ee22b
--- /dev/null
+++ b/attic/muse_qt4_evolution/plugins/freeverb/revmodel.cpp
@@ -0,0 +1,232 @@
+// Reverb model implementation
+//
+// Written by Jezar at Dreampoint, June 2000
+// http://www.dreampoint.co.uk
+// This code is public domain
+
+#include <stdio.h>
+#include "revmodel.h"
+
+//---------------------------------------------------------
+//   Revmodel
+//---------------------------------------------------------
+
+Revmodel::Revmodel()
+      {
+	// Tie the components to their buffers
+	combL[0].setbuffer(bufcombL1,combtuningL1);
+	combR[0].setbuffer(bufcombR1,combtuningR1);
+	combL[1].setbuffer(bufcombL2,combtuningL2);
+	combR[1].setbuffer(bufcombR2,combtuningR2);
+	combL[2].setbuffer(bufcombL3,combtuningL3);
+	combR[2].setbuffer(bufcombR3,combtuningR3);
+	combL[3].setbuffer(bufcombL4,combtuningL4);
+	combR[3].setbuffer(bufcombR4,combtuningR4);
+	combL[4].setbuffer(bufcombL5,combtuningL5);
+	combR[4].setbuffer(bufcombR5,combtuningR5);
+	combL[5].setbuffer(bufcombL6,combtuningL6);
+	combR[5].setbuffer(bufcombR6,combtuningR6);
+	combL[6].setbuffer(bufcombL7,combtuningL7);
+	combR[6].setbuffer(bufcombR7,combtuningR7);
+	combL[7].setbuffer(bufcombL8,combtuningL8);
+	combR[7].setbuffer(bufcombR8,combtuningR8);
+	allpassL[0].setbuffer(bufallpassL1,allpasstuningL1);
+	allpassR[0].setbuffer(bufallpassR1,allpasstuningR1);
+	allpassL[1].setbuffer(bufallpassL2,allpasstuningL2);
+	allpassR[1].setbuffer(bufallpassR2,allpasstuningR2);
+	allpassL[2].setbuffer(bufallpassL3,allpasstuningL3);
+	allpassR[2].setbuffer(bufallpassR3,allpasstuningR3);
+	allpassL[3].setbuffer(bufallpassL4,allpasstuningL4);
+	allpassR[3].setbuffer(bufallpassR4,allpasstuningR4);
+
+	// Set default values
+	allpassL[0].setfeedback(0.5f);
+	allpassR[0].setfeedback(0.5f);
+	allpassL[1].setfeedback(0.5f);
+	allpassR[1].setfeedback(0.5f);
+	allpassL[2].setfeedback(0.5f);
+	allpassR[2].setfeedback(0.5f);
+	allpassL[3].setfeedback(0.5f);
+	allpassR[3].setfeedback(0.5f);
+
+      param[0] = initialroom;
+      param[1] = initialdamp;
+      param[2] = initialwet;
+
+	setroomsize(initialroom);
+	setdamp(initialdamp);
+	setwidth(initialwidth);
+	setmode(initialmode);
+
+	// Buffer will be full of rubbish - so we MUST mute them
+
+	for (int i = 0; i < numcombs; i++) {
+		combL[i].mute();
+		combR[i].mute();
+            }
+	for (int i=0;i<numallpasses;i++) {
+		allpassL[i].mute();
+		allpassR[i].mute();
+            }
+      }
+
+//---------------------------------------------------------
+//   activate
+//---------------------------------------------------------
+
+void Revmodel::activate()
+      {
+      *port[4] = param[0];
+      *port[5] = param[1];
+      *port[6] = param[2];
+      }
+
+//---------------------------------------------------------
+//   processreplace
+//---------------------------------------------------------
+
+void Revmodel::processreplace(long n)
+      {
+      if (param[0] != *port[4]) {
+            param[0] = *port[4];
+            setroomsize(param[0]);
+            }
+      if (param[1] != *port[5]) {
+            param[1] = *port[5];
+            setdamp(param[1]);
+            }
+
+      float wet  = (1.0f - *port[6]) * scalewet;
+      float dry  = *port[6] * scaledry;
+	float wet1 = wet * (width/2 + 0.5f);
+	float wet2 = wet * ((1-width)/2);
+
+	for (int i = 0; i < n; ++i) {
+		float outL  = 0;
+		float outR  = 0;
+		float input = (port[0][i] + port[1][i]) * gain;
+
+		// Accumulate comb filters in parallel
+		for (int k = 0; k < numcombs; k++) {
+			outL += combL[k].process(input);
+			outR += combR[k].process(input);
+		      }
+
+		// Feed through allpasses in series
+		for (int k=0; k < numallpasses; k++) {
+			outL = allpassL[k].process(outL);
+			outR = allpassR[k].process(outR);
+		      }
+
+		// Calculate output REPLACING anything already there
+		port[2][i] = outL*wet1 + outR*wet2 + port[0][i]*dry;
+		port[3][i] = outR*wet1 + outL*wet2 + port[1][i]*dry;
+	      }
+      }
+
+void Revmodel::processmix(long n)
+      {
+      if (param[0] != *port[4]) {
+            param[0] = *port[4];
+            setroomsize(param[0]);
+            }
+      if (param[1] != *port[5]) {
+            param[1] = *port[5];
+            setdamp(param[1]);
+            }
+
+      float wet  = (1.0f - *port[6]) * scalewet;
+      float dry  = *port[6] * scaledry;
+	float wet1 = wet * (width/2 + 0.5f);
+	float wet2 = wet * ((1-width)/2);
+
+	for (int i = 0; i < n; ++i) {
+		float outL  = 0;
+		float outR  = 0;
+		float input = (port[0][i] + port[1][i]) * gain;
+
+		// Accumulate comb filters in parallel
+		for (int k = 0; k < numcombs; k++) {
+			outL += combL[k].process(input);
+			outR += combR[k].process(input);
+		      }
+
+		// Feed through allpasses in series
+		for (int k=0; k < numallpasses; k++) {
+			outL = allpassL[k].process(outL);
+			outR = allpassR[k].process(outR);
+		      }
+
+		// Calculate output REPLACING anything already there
+		port[2][i] += outL*wet1 + outR*wet2 + port[0][i]*dry;
+		port[3][i] += outR*wet1 + outL*wet2 + port[1][i]*dry;
+	      }
+      }
+
+//---------------------------------------------------------
+//   update
+//    Recalculate internal values after parameter change
+//---------------------------------------------------------
+
+void Revmodel::update()
+      {
+	if (mode >= freezemode) {
+		roomsize1 = 1;
+		damp1     = 0;
+		gain      = muted;
+            }
+	else {
+            roomsize1 = roomsize;
+		damp1     = damp;
+		gain      = fixedgain;
+            }
+
+	for (int i = 0; i < numcombs; i++) {
+		combL[i].setfeedback(roomsize1);
+		combR[i].setfeedback(roomsize1);
+            }
+
+	for (int i = 0; i < numcombs; i++) {
+		combL[i].setdamp(damp1);
+		combR[i].setdamp(damp1);
+            }
+      }
+
+// The following get/set functions are not inlined, because
+// speed is never an issue when calling them, and also
+// because as you develop the reverb model, you may
+// wish to take dynamic action when they are called.
+
+void Revmodel::setroomsize(float value)
+      {
+	roomsize = (value*scaleroom) + offsetroom;
+	update();
+      }
+
+float Revmodel::getroomsize()
+      {
+	return (roomsize-offsetroom)/scaleroom;
+      }
+
+void Revmodel::setdamp(float value)
+      {
+	damp = value*scaledamp;
+	update();
+      }
+
+void Revmodel::setwidth(float value)
+      {
+	width = value;
+	update();
+      }
+
+void Revmodel::setmode(float value)
+      {
+	mode = value;
+	update();
+      }
+
+float Revmodel::getmode()
+      {
+	return (mode >= freezemode) ? 1 : 0;
+      }
diff --git a/attic/muse_qt4_evolution/plugins/freeverb/revmodel.h b/attic/muse_qt4_evolution/plugins/freeverb/revmodel.h
new file mode 100644
index 00000000..bfa1f0b3
--- /dev/null
+++ b/attic/muse_qt4_evolution/plugins/freeverb/revmodel.h
@@ -0,0 +1,79 @@
+// Reverb model declaration
+//
+// Written by Jezar at Dreampoint, June 2000
+// http://www.dreampoint.co.uk
+// This code is public domain
+
+#ifndef _revmodel_
+#define _revmodel_
+
+#include "comb.h"
+#include "allpass.h"
+#include "tuning.h"
+#include "../../muse/ladspa.h"
+
+//---------------------------------------------------------
+//   Revmodel
+//---------------------------------------------------------
+
+class Revmodel {
+      float	gain;
+      float	roomsize,roomsize1;
+      float	damp,damp1;
+      float	width;
+      float	mode;
+
+      // Comb filters
+      comb combL[numcombs];
+      comb combR[numcombs];
+
+      // Allpass filters
+      allpass allpassL[numallpasses];
+      allpass allpassR[numallpasses];
+
+      // Buffers for the combs
+      float	bufcombL1[combtuningL1];
+      float	bufcombR1[combtuningR1];
+      float	bufcombL2[combtuningL2];
+      float	bufcombR2[combtuningR2];
+      float	bufcombL3[combtuningL3];
+      float	bufcombR3[combtuningR3];
+      float	bufcombL4[combtuningL4];
+      float	bufcombR4[combtuningR4];
+      float	bufcombL5[combtuningL5];
+      float	bufcombR5[combtuningR5];
+      float	bufcombL6[combtuningL6];
+      float	bufcombR6[combtuningR6];
+      float	bufcombL7[combtuningL7];
+      float	bufcombR7[combtuningR7];
+      float	bufcombL8[combtuningL8];
+      float	bufcombR8[combtuningR8];
+
+      // Buffers for the allpasses
+      float	bufallpassL1[allpasstuningL1];
+      float	bufallpassR1[allpasstuningR1];
+      float	bufallpassL2[allpasstuningL2];
+      float	bufallpassR2[allpasstuningR2];
+      float	bufallpassL3[allpasstuningL3];
+      float	bufallpassR3[allpasstuningR3];
+      float	bufallpassL4[allpasstuningL4];
+      float	bufallpassR4[allpasstuningR4];
+      void update();
+
+   public:
+      LADSPA_Data* port[7];
+      float param[3];
+
+      Revmodel();
+	void	processmix(long numsamples);
+	void	processreplace(long numsamples);
+	void	setroomsize(float value);
+	float	getroomsize();
+	void	setdamp(float value);
+	void	setwidth(float value);
+	void	setmode(float value);
+	float	getmode();
+      void activate();
+      };
+
+#endif
diff --git a/attic/muse_qt4_evolution/plugins/freeverb/tuning.h b/attic/muse_qt4_evolution/plugins/freeverb/tuning.h
new file mode 100644
index 00000000..ced89252
--- /dev/null
+++ b/attic/muse_qt4_evolution/plugins/freeverb/tuning.h
@@ -0,0 +1,60 @@
+// Reverb model tuning values
+//
+// Written by Jezar at Dreampoint, June 2000
+// http://www.dreampoint.co.uk
+// This code is public domain
+
+#ifndef _tuning_
+#define _tuning_
+
+const int	numcombs		= 8;
+const int	numallpasses	= 4;
+const float	muted			= 0;
+const float	fixedgain		= 0.015f;
+const float scalewet		= 3;
+const float scaledry		= 2;
+const float scaledamp		= 0.4f;
+const float scaleroom		= 0.28f;
+const float offsetroom		= 0.7f;
+const float initialroom		= 0.5f;
+const float initialdamp		= 0.5f;
+const float initialwet		= 1/scalewet;
+const float initialdry		= 0;
+const float initialwidth	= 1;
+const float initialmode		= 0;
+const float freezemode		= 0.5f;
+const int	stereospread	= 23;
+
+// These values assume 44.1KHz sample rate
+// they will probably be OK for 48KHz sample rate
+// but would need scaling for 96KHz (or other) sample rates.
+// The values were obtained by listening tests.
+const int combtuningL1		= 1116;
+const int combtuningR1		= 1116+stereospread;
+const int combtuningL2		= 1188;
+const int combtuningR2		= 1188+stereospread;
+const int combtuningL3		= 1277;
+const int combtuningR3		= 1277+stereospread;
+const int combtuningL4		= 1356;
+const int combtuningR4		= 1356+stereospread;
+const int combtuningL5		= 1422;
+const int combtuningR5		= 1422+stereospread;
+const int combtuningL6		= 1491;
+const int combtuningR6		= 1491+stereospread;
+const int combtuningL7		= 1557;
+const int combtuningR7		= 1557+stereospread;
+const int combtuningL8		= 1617;
+const int combtuningR8		= 1617+stereospread;
+const int allpasstuningL1	= 556;
+const int allpasstuningR1	= 556+stereospread;
+const int allpasstuningL2	= 441;
+const int allpasstuningR2	= 441+stereospread;
+const int allpasstuningL3	= 341;
+const int allpasstuningR3	= 341+stereospread;
+const int allpasstuningL4	= 225;
+const int allpasstuningR4	= 225+stereospread;
+
+#endif//_tuning_
+
+//ends
+
-- 
cgit v1.2.3