From e40fc849149dd97c248866a4a1d026dda5e57b62 Mon Sep 17 00:00:00 2001 From: Robert Jonsson Date: Mon, 7 Mar 2011 19:01:11 +0000 Subject: clean3 --- .../muse2/plugins/doublechorus/CMakeLists.txt | 54 ++++++ .../muse2/plugins/doublechorus/doublechorus.cpp | 173 +++++++++++++++++ .../plugins/doublechorus/doublechorusmodel.cpp | 214 +++++++++++++++++++++ .../muse2/plugins/doublechorus/doublechorusmodel.h | 72 +++++++ .../plugins/doublechorus/simplechorusmodel.cpp | 157 +++++++++++++++ .../muse2/plugins/doublechorus/simplechorusmodel.h | 96 +++++++++ 6 files changed, 766 insertions(+) create mode 100644 attic/muse2-oom/muse2/plugins/doublechorus/CMakeLists.txt create mode 100644 attic/muse2-oom/muse2/plugins/doublechorus/doublechorus.cpp create mode 100644 attic/muse2-oom/muse2/plugins/doublechorus/doublechorusmodel.cpp create mode 100644 attic/muse2-oom/muse2/plugins/doublechorus/doublechorusmodel.h create mode 100644 attic/muse2-oom/muse2/plugins/doublechorus/simplechorusmodel.cpp create mode 100644 attic/muse2-oom/muse2/plugins/doublechorus/simplechorusmodel.h (limited to 'attic/muse2-oom/muse2/plugins/doublechorus') diff --git a/attic/muse2-oom/muse2/plugins/doublechorus/CMakeLists.txt b/attic/muse2-oom/muse2/plugins/doublechorus/CMakeLists.txt new file mode 100644 index 00000000..04ea864f --- /dev/null +++ b/attic/muse2-oom/muse2/plugins/doublechorus/CMakeLists.txt @@ -0,0 +1,54 @@ +#============================================================================= +# 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. +#============================================================================= + +## +## List of source files to compile +## +file (GLOB doublechorus_source_files + doublechorus.cpp + doublechorusmodel.cpp + simplechorusmodel.cpp + ) + +## +## Define target +## +add_library ( doublechorus SHARED + ${doublechorus_source_files} + ) + + +## +## Compilation flags and target name +## +# tell cmake to name the target doublechorus.so instead of +# libdoublechorus.so +# +set_target_properties (doublechorus + PROPERTIES PREFIX "" + #COMPILE_FLAGS "-O3" + ) + +## +## Install location +## +install( TARGETS doublechorus + DESTINATION ${MusE_PLUGINS_DIR} + ) diff --git a/attic/muse2-oom/muse2/plugins/doublechorus/doublechorus.cpp b/attic/muse2-oom/muse2/plugins/doublechorus/doublechorus.cpp new file mode 100644 index 00000000..27d84336 --- /dev/null +++ b/attic/muse2-oom/muse2/plugins/doublechorus/doublechorus.cpp @@ -0,0 +1,173 @@ +//========================================================= +// DoubleChorus for MusE +// +// (C) Copyright 2006 Nil Geisweiller +//========================================================= + +#include "doublechorusmodel.h" +#include + +//--------------------------------------------------------- +// 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/muse2-oom/muse2/plugins/doublechorus/doublechorusmodel.cpp b/attic/muse2-oom/muse2/plugins/doublechorus/doublechorusmodel.cpp new file mode 100644 index 00000000..01def026 --- /dev/null +++ b/attic/muse2-oom/muse2/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/muse2-oom/muse2/plugins/doublechorus/doublechorusmodel.h b/attic/muse2-oom/muse2/plugins/doublechorus/doublechorusmodel.h new file mode 100644 index 00000000..40ce9f3f --- /dev/null +++ b/attic/muse2-oom/muse2/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/muse2-oom/muse2/plugins/doublechorus/simplechorusmodel.cpp b/attic/muse2-oom/muse2/plugins/doublechorus/simplechorusmodel.cpp new file mode 100644 index 00000000..72015465 --- /dev/null +++ b/attic/muse2-oom/muse2/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 +#include + +#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