summaryrefslogtreecommitdiff
path: root/attic/muse/plugins/doublechorus
diff options
context:
space:
mode:
Diffstat (limited to 'attic/muse/plugins/doublechorus')
-rw-r--r--attic/muse/plugins/doublechorus/Makefile.am16
-rw-r--r--attic/muse/plugins/doublechorus/doublechorus.cpp173
-rw-r--r--attic/muse/plugins/doublechorus/doublechorusmodel.cpp214
-rw-r--r--attic/muse/plugins/doublechorus/doublechorusmodel.h72
-rw-r--r--attic/muse/plugins/doublechorus/simplechorusmodel.cpp157
-rw-r--r--attic/muse/plugins/doublechorus/simplechorusmodel.h96
6 files changed, 728 insertions, 0 deletions
diff --git a/attic/muse/plugins/doublechorus/Makefile.am b/attic/muse/plugins/doublechorus/Makefile.am
new file mode 100644
index 00000000..40022184
--- /dev/null
+++ b/attic/muse/plugins/doublechorus/Makefile.am
@@ -0,0 +1,16 @@
+include $(top_srcdir)/common.am
+include $(top_srcdir)/plugins/plugins-install.am
+
+AM_CXXFLAGS += -O3 -fno-exceptions -fno-rtti -ffast-math
+
+plugins_LTLIBRARIES = doublechorus.la
+
+plugins_DATA =
+
+doublechorus_la_SOURCES = \
+ doublechorus.cpp \
+ doublechorusmodel.cpp doublechorusmodel.h \
+ simplechorusmodel.cpp simplechorusmodel.h
+doublechorus_la_LDFLAGS = -module -avoid-version
+
+
diff --git a/attic/muse/plugins/doublechorus/doublechorus.cpp b/attic/muse/plugins/doublechorus/doublechorus.cpp
new file mode 100644
index 00000000..27d84336
--- /dev/null
+++ b/attic/muse/plugins/doublechorus/doublechorus.cpp
@@ -0,0 +1,173 @@
+//=========================================================
+// DoubleChorus for MusE
+//
+// (C) Copyright 2006 Nil Geisweiller
+//=========================================================
+
+#include "doublechorusmodel.h"
+#include <stdio.h>
+
+//---------------------------------------------------------
+// instantiate doublechorus
+// Construct a new plugin instance.
+//---------------------------------------------------------
+
+LADSPA_Handle instantiate(const LADSPA_Descriptor* /*Descriptor*/,
+ unsigned long samplerate)
+{
+ return new DoubleChorusModel(samplerate);
+}
+
+//---------------------------------------------------------
+// connect PortTo doublechorus
+// Connect a port to a data location.
+//---------------------------------------------------------
+
+void connect(LADSPA_Handle Instance, unsigned long port,
+ LADSPA_Data* data)
+{
+ ((DoubleChorusModel *)Instance)->port[port] = data;
+}
+
+//---------------------------------------------------------
+// activate
+//---------------------------------------------------------
+
+void activate(LADSPA_Handle instance)
+{
+ ((DoubleChorusModel *)instance)->activate();
+}
+
+//---------------------------------------------------------
+// deactivate
+//---------------------------------------------------------
+
+void deactivate(LADSPA_Handle /*Instance*/)
+{
+}
+
+//---------------------------------------------------------
+// run doublechorus
+//---------------------------------------------------------
+
+void run(LADSPA_Handle Instance, unsigned long n)
+{
+ ((DoubleChorusModel *)Instance)->processReplace(n);
+}
+
+//---------------------------------------------------------
+// runAdding doublechorus
+// *ADD* the output to the output buffer.
+//---------------------------------------------------------
+
+void runAdding(LADSPA_Handle Instance, unsigned long n)
+{
+ ((DoubleChorusModel *)Instance)->processMix(n);
+}
+
+//---------------------------------------------------------
+// set doublechorus RunAddingGain
+//---------------------------------------------------------
+
+void setGain(LADSPA_Handle /*Instance*/, LADSPA_Data /*Gain*/)
+{
+ printf("TEST setGain\n");
+ // ((DoubleChorusModel *)Instance)->m_fRunAddingGain = Gain;
+}
+
+//---------------------------------------------------------
+// cleanup doublechorus
+//---------------------------------------------------------
+
+void cleanup(LADSPA_Handle Instance)
+{
+ delete (DoubleChorusModel *)Instance;
+}
+
+static const char* portNames[] = {
+ "Input (Left)",
+ "Input (Right)",
+ "Output (Left)",
+ "Output (Right)",
+ "Pan 1",
+ "LFOFreq 1",
+ "Depth 1",
+ "Pan 2",
+ "LFOFreq 2",
+ "Depth 2",
+ "Dry/Wet"
+};
+
+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_PORT_INPUT | LADSPA_PORT_CONTROL,
+ 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 | LADSPA_HINT_DEFAULT_HIGH, 0.0, 1.0 },
+ { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_LOGARITHMIC | LADSPA_HINT_DEFAULT_HIGH, MINFREQ, MAXFREQ },
+ { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_DEFAULT_LOW, 0.0, 1.0 },
+ { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_DEFAULT_LOW, 0.0, 1.0 },
+ { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_LOGARITHMIC | LADSPA_HINT_DEFAULT_MIDDLE, MINFREQ, MAXFREQ },
+ { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_DEFAULT_LOW, 0.0, 1.0 },
+ { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_DEFAULT_MIDDLE, 0.0, 1.0 },
+};
+
+LADSPA_Descriptor descriptor = {
+ 1051,
+ "doublechorus1",
+ LADSPA_PROPERTY_HARD_RT_CAPABLE,
+ "DoubleChorus",
+ "Nil Geisweiller",
+ "GPL",
+ NBRPARAM + 4,
+ 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/plugins/doublechorus/doublechorusmodel.cpp b/attic/muse/plugins/doublechorus/doublechorusmodel.cpp
new file mode 100644
index 00000000..01def026
--- /dev/null
+++ b/attic/muse/plugins/doublechorus/doublechorusmodel.cpp
@@ -0,0 +1,214 @@
+//===========================================================================
+//
+// doublechorusmodel
+//
+// Version 0.0.1
+//
+//
+//
+//
+// Copyright (c) 2006 Nil Geisweiller
+//
+//
+//
+// 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., 59 Temple Place - Suite 330, Boston, MA
+// 02111-1307, USA or point your web browser to http://www.gnu.org.
+//===========================================================================
+
+#include "doublechorusmodel.h"
+
+//---------------------------------------------------------
+// DoubleChorusModel
+//---------------------------------------------------------
+
+DoubleChorusModel::DoubleChorusModel(unsigned long samplerate) {
+ _simpleChorus1 = new SimpleChorusModel((float)samplerate);
+ _simpleChorus2 = new SimpleChorusModel((float)samplerate);
+
+ param[0] = getPan1();
+ param[1] = getLFOFreq1();
+ param[2] = getDepth1();
+ param[3] = getPan2();
+ param[4] = getLFOFreq2();
+ param[5] = getDepth2();
+ param[6] = getDryWet();
+}
+
+DoubleChorusModel::~DoubleChorusModel() {
+ delete(_simpleChorus1);
+ delete(_simpleChorus2);
+}
+
+//---------------------------------------------------------
+// activate
+//---------------------------------------------------------
+
+void DoubleChorusModel::activate() {
+ *port[4] = param[0];
+ *port[5] = param[1];
+ *port[6] = param[2];
+ *port[7] = param[3];
+ *port[8] = param[4];
+ *port[9] = param[5];
+ *port[10] = param[6];
+}
+
+//---------------------------------------------------------
+// processReplace
+//---------------------------------------------------------
+
+void DoubleChorusModel::processReplace(long n) {
+ float tmpLeftOutput1;
+ float tmpRightOutput1;
+ float tmpLeftOutput2;
+ float tmpRightOutput2;
+ //update parameters
+ if (param[0] != *port[4]) {
+ param[0] = *port[4];
+ setPan1(param[0]);
+ }
+ if (param[1] != *port[5]) {
+ param[1] = *port[5];
+ setLFOFreq1(param[1]);
+ }
+ if (param[2] != *port[6]) {
+ param[2] = *port[6];
+ setDepth1(param[2]);
+ }
+ if (param[3] != *port[7]) {
+ param[3] = *port[7];
+ setPan2(param[3]);
+ }
+ if (param[4] != *port[8]) {
+ param[4] = *port[8];
+ setLFOFreq2(param[4]);
+ }
+ if (param[5] != *port[9]) {
+ param[5] = *port[9];
+ setDepth2(param[5]);
+ }
+ if (param[6] != *port[10]) {
+ param[6] = *port[10];
+ setDryWet(param[6]);
+ }
+ //process the effect
+ for (int i = 0; i < n; ++i) {
+ _simpleChorus1->process_chorus(port[0][i], port[1][i],
+ &tmpLeftOutput1, &tmpRightOutput1);
+ _simpleChorus2->process_chorus(port[0][i], port[1][i],
+ &tmpLeftOutput2, &tmpRightOutput2);
+ port[2][i] = _dryWet * (tmpLeftOutput1 + tmpLeftOutput2)
+ + (1.0 - _dryWet) * port[0][i];
+ port[3][i] = _dryWet * (tmpRightOutput1 + tmpRightOutput2)
+ + (1.0 - _dryWet) * port[1][i];
+ }
+}
+
+void DoubleChorusModel::processMix(long n) {
+ float tmpLeftOutput1;
+ float tmpRightOutput1;
+ float tmpLeftOutput2;
+ float tmpRightOutput2;
+ //update parameters
+ if (param[0] != *port[4]) {
+ param[0] = *port[4];
+ setPan1(param[0]);
+ }
+ if (param[1] != *port[5]) {
+ param[1] = *port[5];
+ setLFOFreq1(param[1]);
+ }
+ if (param[2] != *port[6]) {
+ param[2] = *port[6];
+ setDepth1(param[2]);
+ }
+ if (param[3] != *port[7]) {
+ param[3] = *port[7];
+ setPan2(param[3]);
+ }
+ if (param[4] != *port[8]) {
+ param[4] = *port[8];
+ setLFOFreq2(param[4]);
+ }
+ if (param[5] != *port[9]) {
+ param[5] = *port[9];
+ setDepth2(param[5]);
+ }
+ if (param[6] != *port[10]) {
+ param[6] = *port[10];
+ setDryWet(param[6]);
+ }
+ //process the effect
+ for (int i = 0; i < n; ++i) {
+ _simpleChorus1->process_chorus(port[0][i], port[1][i],
+ &tmpLeftOutput1, &tmpRightOutput1);
+ _simpleChorus2->process_chorus(port[0][i], port[1][i],
+ &tmpLeftOutput2, &tmpRightOutput2);
+ port[2][i] += _dryWet * (tmpLeftOutput1 + tmpLeftOutput2)
+ + (1.0 - _dryWet) * port[0][i];
+ port[3][i] += _dryWet * (tmpRightOutput1 + tmpRightOutput2)
+ + (1.0 - _dryWet) * port[1][i];
+ }
+}
+
+//------------------------------------------------------------------
+// set parameters
+//------------------------------------------------------------------
+void DoubleChorusModel::setPan1(float value) {
+ _simpleChorus1->setPan(value);
+}
+void DoubleChorusModel::setLFOFreq1(float value) {
+ _simpleChorus1->setLFOFreq(value);
+}
+void DoubleChorusModel::setDepth1(float value) {
+ _simpleChorus1->setDepth(value);
+}
+void DoubleChorusModel::setPan2(float value) {
+ _simpleChorus2->setPan(value);
+}
+void DoubleChorusModel::setLFOFreq2(float value) {
+ _simpleChorus2->setLFOFreq(value);
+}
+void DoubleChorusModel::setDepth2(float value) {
+ _simpleChorus2->setDepth(value);
+}
+void DoubleChorusModel::setDryWet(float value) {
+ _dryWet = value;
+}
+
+//----------------------------------------------------------------
+// get parameters
+//----------------------------------------------------------------
+float DoubleChorusModel::getPan1() {
+ return _simpleChorus1->getPan();
+}
+float DoubleChorusModel::getLFOFreq1() {
+ return _simpleChorus1->getLFOFreq();
+}
+float DoubleChorusModel::getDepth1() {
+ return _simpleChorus1->getDepth();
+}
+float DoubleChorusModel::getPan2() {
+ return _simpleChorus2->getPan();
+}
+float DoubleChorusModel::getLFOFreq2() {
+ return _simpleChorus2->getLFOFreq();
+}
+float DoubleChorusModel::getDepth2() {
+ return _simpleChorus2->getDepth();
+}
+float DoubleChorusModel::getDryWet() {
+ return _dryWet;
+}
diff --git a/attic/muse/plugins/doublechorus/doublechorusmodel.h b/attic/muse/plugins/doublechorus/doublechorusmodel.h
new file mode 100644
index 00000000..40ce9f3f
--- /dev/null
+++ b/attic/muse/plugins/doublechorus/doublechorusmodel.h
@@ -0,0 +1,72 @@
+//===========================================================================
+//
+// doublechorusmodel
+//
+// Version 0.0.1
+//
+//
+//
+//
+// Copyright (c) 2006 Nil Geisweiller
+//
+//
+//
+// 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., 59 Temple Place - Suite 330, Boston, MA
+// 02111-1307, USA or point your web browser to http://www.gnu.org.
+//===========================================================================
+
+#ifndef __DOUBLECHORUSMODEL_H
+#define __DOUBLECHORUSMODEL_H
+
+#include "simplechorusmodel.h"
+#include "../../muse/ladspa.h"
+
+#define NBRPARAM 7
+
+class SimpleChorusModel;
+
+class DoubleChorusModel {
+ SimpleChorusModel* _simpleChorus1;
+ SimpleChorusModel* _simpleChorus2;
+
+ float _dryWet; //0.0 : dry, 1.0 : wet
+
+ public:
+ LADSPA_Data* port[NBRPARAM + 4];
+ float param[NBRPARAM];
+
+ DoubleChorusModel(unsigned long samplerate);
+ ~DoubleChorusModel();
+ void processMix(long numsamples);
+ void processReplace(long numsamples);
+ void setPan1(float value);
+ void setLFOFreq1(float value);
+ void setDepth1(float value);
+ void setPan2(float value);
+ void setLFOFreq2(float value);
+ void setDepth2(float value);
+ void setDryWet(float value);
+ float getPan1();
+ float getLFOFreq1();
+ float getDepth1();
+ float getPan2();
+ float getLFOFreq2();
+ float getDepth2();
+ float getDryWet();
+
+ void activate();
+};
+
+#endif
diff --git a/attic/muse/plugins/doublechorus/simplechorusmodel.cpp b/attic/muse/plugins/doublechorus/simplechorusmodel.cpp
new file mode 100644
index 00000000..72015465
--- /dev/null
+++ b/attic/muse/plugins/doublechorus/simplechorusmodel.cpp
@@ -0,0 +1,157 @@
+//===========================================================================
+//
+// simplechorus
+//
+// Version 0.0.1
+//
+//
+//
+//
+// Copyright (c) 2006 Nil Geisweiller
+//
+//
+//
+// 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., 59 Temple Place - Suite 330, Boston, MA
+// 02111-1307, USA or point your web browser to http://www.gnu.org.
+//===========================================================================
+
+#include "simplechorusmodel.h"
+#include <math.h>
+#include <stdio.h>
+
+#define ABS(x) (x>=0?x:-x)
+
+// Linearly interpolate [ = a * (1 - f) + b * f]
+inline float lin_interp(float f, float a, float b) {
+ return a + f * (b - a);
+}
+
+// Cubic interpolation function
+inline float cube_interp(const float fr,
+ const float inm1,
+ const float in,
+ const float inp1,
+ const float inp2) {
+ return in + 0.5f * fr * (inp1 - inm1 +
+ fr * (4.0f * inp1 + 2.0f * inm1 - 5.0f * in - inp2 +
+ fr * (3.0f * (in - inp1) - inm1 + inp2)));
+}
+
+float SimpleChorusModel::sinus[MAXSINUSRESOLUTION];
+int SimpleChorusModel::useCount = 0;
+
+SimpleChorusModel::SimpleChorusModel(float samplerate) {
+ _sampleRate = samplerate;
+ //sinus
+ if (useCount++ == 0)
+ for(int i = 0; i < MAXSINUSRESOLUTION; i++)
+ sinus[i] = (float)(sin(((double)i * 2.0 * M_PI) /
+ (double)MAXSINUSRESOLUTION));
+ _index = 0.0;
+ //init buffer
+ for(int i = 0; i < MAXBUFFERLENGTH; i++) {
+ _leftBuffer[i] = 0.0;
+ _rightBuffer[i] = 0.0;
+ }
+ _position = 0;
+ //initial parameters
+ _pan = 0.5;
+ _LFOFreq = 1.0;
+ _depth = 0.5;
+ setChorus();
+}
+
+SimpleChorusModel::~SimpleChorusModel() {
+}
+
+void SimpleChorusModel::process_chorus(float leftInput, float rightInput,
+ float* leftOutput, float* rightOutput) {
+ float ocsDiff;
+
+ _ocsDistance = _depthAmp * sinus[(int)_index];
+
+ ocsDiff = _ocsDistance - floorf(_ocsDistance);
+
+ _past_position_left = MAXBUFFERLENGTH //to be sure that _past_position_left>0
+ + _position - _leftMidDistance + (int)_ocsDistance;
+ _past_position_right = MAXBUFFERLENGTH
+ + _position - _rightMidDistance + (int)_ocsDistance;
+
+ *leftOutput = _leftAmp *
+ lin_interp(ocsDiff, _leftBuffer[_past_position_left%MAXBUFFERLENGTH],
+ _leftBuffer[(_past_position_left+1)%MAXBUFFERLENGTH]);
+ *rightOutput = _rightAmp *
+ lin_interp(ocsDiff, _rightBuffer[_past_position_right%MAXBUFFERLENGTH],
+ _rightBuffer[(_past_position_right+1)%MAXBUFFERLENGTH]);
+
+ _leftBuffer[_position] = leftInput;
+ _rightBuffer[_position] = rightInput;
+
+ _position++;
+ _position %= MAXBUFFERLENGTH;
+
+ _index += _inct;
+ _index = (_index<MAXSINUSRESOLUTION?_index:_index-MAXSINUSRESOLUTION);
+}
+
+void SimpleChorusModel::setPan(float p) {
+ _pan = p;
+ setChorus();
+}
+void SimpleChorusModel::setLFOFreq(float l) {
+ _LFOFreq = l;
+ setChorus();
+}
+void SimpleChorusModel::setDepth(float d) {
+ _depth = d;
+ setChorus();
+}
+void SimpleChorusModel::setSampleRate(float s) {
+ _sampleRate = s;
+ setChorus();
+}
+
+float SimpleChorusModel::getPan() {
+ return _pan;
+}
+float SimpleChorusModel::getLFOFreq() {
+ return _LFOFreq;
+}
+float SimpleChorusModel::getDepth() {
+ return _depth;
+}
+
+void SimpleChorusModel::setChorus() {
+ //inct
+ _inct = (float)MAXSINUSRESOLUTION/_sampleRate * _LFOFreq;
+ //left & right amp
+ _leftAmp = lin_interp(1.0 - _pan, 1.0 - PANAMP, 1.0 + PANAMP);
+ _rightAmp = lin_interp(_pan, 1.0 - PANAMP, 1.0 + PANAMP);
+ //left & right midDistance
+ float leftmdm; //left mid distance in meter
+ float rightmdm; //right mid distance in meter
+ leftmdm = MIDSOURCEDISTANCE - EARSDISTANCE * (0.5 - _pan);
+ rightmdm = MIDSOURCEDISTANCE + EARSDISTANCE * (0.5 - _pan);
+
+ _leftMidDistance = (int)(_sampleRate * leftmdm / SOUNDSPEED);
+ _rightMidDistance = (int)(_sampleRate * rightmdm / SOUNDSPEED);
+
+ //depthAmp
+ _depthAmp =
+ _sampleRate * (MAXDEPTH * _depth) /SOUNDSPEED;
+ //filter coef
+ _filterCoef1 = 1 - COEFFILTER;
+ _filterCoef2 = COEFFILTER;
+}
diff --git a/attic/muse/plugins/doublechorus/simplechorusmodel.h b/attic/muse/plugins/doublechorus/simplechorusmodel.h
new file mode 100644
index 00000000..797e7030
--- /dev/null
+++ b/attic/muse/plugins/doublechorus/simplechorusmodel.h
@@ -0,0 +1,96 @@
+//===========================================================================
+//
+// simplechorus
+//
+// Version 0.0.1
+//
+//
+//
+//
+// Copyright (c) 2006 Nil Geisweiller
+//
+//
+//
+// 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., 59 Temple Place - Suite 330, Boston, MA
+// 02111-1307, USA or point your web browser to http://www.gnu.org.
+//===========================================================================
+
+#ifndef __SIMPLECHORUSMODEL_H
+#define __SIMPLECHORUSMODEL_H
+
+#define MAXBUFFERLENGTH 192000
+#define MAXSINUSRESOLUTION 192000
+#define MINFREQ 0.05 //in Hz
+#define MAXFREQ 5.0 //in Hz
+#define EARSDISTANCE 0.12 //in meter
+#define MIDSOURCEDISTANCE 2.0 //in meter
+#define MAXDEPTH 1.0 //in meter, radius
+#define SOUNDSPEED 330.0 //in meter per second
+#define MINDELAYSEC 0.01 //in second
+#define MAXDELAYSEC 1.0 //in second
+#define COEFFILTER 0.97576 //0.26795
+#define PANAMP 0.75
+//with cutoff = samplerate/256
+//following (2-cos(x)) - sqrt((2-cos(x))^2 - 1) with x = 2*pi*cutoff/samplerate
+//#define M_PI 3.14159265358979
+
+class SimpleChorusModel {
+ private :
+ //parameters
+ float _pan;
+ float _LFOFreq;
+ float _depth;
+ //parameter state
+ float _sampleRate;
+ float _depthAmp;
+ float _leftAmp;
+ float _rightAmp;
+ float _filterCoef1;
+ float _filterCoef2;
+ int _leftMidDistance; //distance of the left micro in samples
+ int _rightMidDistance; //distance of the right micro in samples
+ //state
+ float _inct;
+ float _index; //time at the scale of sampleRate
+ float _leftBuffer[MAXBUFFERLENGTH];
+ float _rightBuffer[MAXBUFFERLENGTH];
+ float _ocsDistance; //in sample, distance of the micro with initial position
+ int _past_position_left;
+ int _past_position_right;
+ int _position;
+ public :
+ static int useCount;
+ static float sinus[MAXSINUSRESOLUTION];
+
+
+ void process_chorus(float leftInput, float rightInput,
+ float* leftOutput, float* rightOutput);
+
+ void setPan(float);
+ void setLFOFreq(float);
+ void setDepth(float);
+ void setSampleRate(float);
+ float getPan();
+ float getLFOFreq();
+ float getDepth();
+
+ void setChorus();
+
+ SimpleChorusModel(float samplerate);
+ ~SimpleChorusModel();
+
+};
+
+#endif