From e062c3c9ee1105d31e96707bbd9c8b0d3a48484b Mon Sep 17 00:00:00 2001 From: Paul Giblock Date: Tue, 15 Apr 2008 03:12:25 +0000 Subject: [PATCH] Added stereophonic matrix git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/trunk/lmms@921 0778d3d1-df1d-0410-868b-ea421aaaa00d --- ChangeLog | 15 +++ configure.in | 1 + plugins/Makefile.am | 1 + plugins/stereo_matrix/Makefile.am | 38 ++++++ plugins/stereo_matrix/logo.png | Bin 0 -> 3280 bytes plugins/stereo_matrix/stereo_matrix.cpp | 111 ++++++++++++++++++ plugins/stereo_matrix/stereo_matrix.h | 60 ++++++++++ .../stereomatrix_control_dialog.cpp | 72 ++++++++++++ .../stereomatrix_control_dialog.h | 44 +++++++ .../stereo_matrix/stereomatrix_controls.cpp | 82 +++++++++++++ plugins/stereo_matrix/stereomatrix_controls.h | 79 +++++++++++++ 11 files changed, 503 insertions(+) create mode 100644 plugins/stereo_matrix/Makefile.am create mode 100644 plugins/stereo_matrix/logo.png create mode 100644 plugins/stereo_matrix/stereo_matrix.cpp create mode 100644 plugins/stereo_matrix/stereo_matrix.h create mode 100644 plugins/stereo_matrix/stereomatrix_control_dialog.cpp create mode 100644 plugins/stereo_matrix/stereomatrix_control_dialog.h create mode 100644 plugins/stereo_matrix/stereomatrix_controls.cpp create mode 100644 plugins/stereo_matrix/stereomatrix_controls.h diff --git a/ChangeLog b/ChangeLog index 83a5d7db7..240446b51 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,18 @@ +2008-04-14 Paul Giblock + + * plugins/stereo_matrix: + * plugins/stereo_matrix/stereo_matrix.cpp: + * plugins/stereo_matrix/stereo_matrix.h: + * plugins/stereo_matrix/stereomatrix_controls.cpp: + * plugins/stereo_matrix/stereomatrix_controls.h: + * plugins/stereo_matrix/stereomatrix_control_dialog.cpp: + * plugins/stereo_matrix/stereomatrix_control_dialog.h: + * plugins/stereo_matrix/logo.png: + * plugins/stereo_matrix/Makefile.am: + * configure.in: + * plugins/Makefile.am: + Add stereo matrix plugin for real panning and stereo-swapping + 2008-04-14 Tobias Doerffel * plugins/sf2_player/sf2_player.cpp: diff --git a/configure.in b/configure.in index 92b7d7bdb..b6bbdc13b 100644 --- a/configure.in +++ b/configure.in @@ -696,6 +696,7 @@ AC_CONFIG_FILES([Makefile plugins/vst_base/Makefile plugins/vst_effect/Makefile plugins/stereo_enhancer/Makefile + plugins/stereo_matrix/Makefile lmms.spec]) LOCAL_EXTRA_PLUGINS AC_OUTPUT diff --git a/plugins/Makefile.am b/plugins/Makefile.am index 8446e9c05..f9e6c1c16 100644 --- a/plugins/Makefile.am +++ b/plugins/Makefile.am @@ -30,4 +30,5 @@ SUBDIRS = \ $(VST_DIRS) \ vibed \ stereo_enhancer \ + stereo_matrix \ $(EXTRA_PLUGINS) diff --git a/plugins/stereo_matrix/Makefile.am b/plugins/stereo_matrix/Makefile.am new file mode 100644 index 000000000..cbc37e867 --- /dev/null +++ b/plugins/stereo_matrix/Makefile.am @@ -0,0 +1,38 @@ +AUTOMAKE_OPTIONS = foreign 1.4 + + +INCLUDES = -I$(top_srcdir)/include -I$(top_srcdir)/src/gui + + +AM_CXXFLAGS := $(AM_CXXFLAGS) $(QT_CXXFLAGS) -DPLUGIN_NAME="stereomatrix" + + +%.moc: ./%.h + $(MOC) -o $@ $< + + +MOC_FILES = ./stereomatrix_controls.moc + +BUILT_SOURCES = $(MOC_FILES) ./embedded_resources.h +EMBEDDED_RESOURCES = $(wildcard *png) + +./embedded_resources.h: $(EMBEDDED_RESOURCES) + $(BIN2RES) $(EMBEDDED_RESOURCES) > $@ + +EXTRA_DIST = $(EMBEDDED_RESOURCES) + + +CLEANFILES = $(MOC_FILES) ./embedded_resources.h + + + +pkglib_LTLIBRARIES= libstereomatrix.la + +libstereomatrix_la_SOURCES = stereo_matrix.cpp \ + stereo_matrix.h \ + stereomatrix_control_dialog.cpp \ + stereomatrix_control_dialog.h \ + stereomatrix_controls.cpp \ + stereomatrix_controls.h + +$(libstereomatrix_la_SOURCES): ./embedded_resources.h diff --git a/plugins/stereo_matrix/logo.png b/plugins/stereo_matrix/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..6d757a2b04f134e5392f1384922633f11a039c46 GIT binary patch literal 3280 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 O0000 + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 (see COPYING); if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + * + */ + + +#include "stereo_matrix.h" + + +#undef SINGLE_SOURCE_COMPILE +#include "embed.cpp" + + +extern "C" +{ + +plugin::descriptor stereomatrix_plugin_descriptor = +{ + STRINGIFY_PLUGIN_NAME( PLUGIN_NAME ), + "Stereophonic Matrix", + QT_TRANSLATE_NOOP( "pluginBrowser", + "Plugin for freely manipulating stereo output" ), + "Paul Giblock ", + 0x0100, + plugin::Effect, + new QPixmap( PLUGIN_NAME::getIconPixmap( "logo" ) ), + NULL +} ; + +} + + + +stereoMatrixEffect::stereoMatrixEffect( + model * _parent, + const descriptor::subPluginFeatures::key * _key ) : + effect( &stereomatrix_plugin_descriptor, _parent, _key ), + m_smControls( this ) +{ +} + + + + +stereoMatrixEffect::~stereoMatrixEffect() +{ +} + + + +bool stereoMatrixEffect::processAudioBuffer( sampleFrame * _buf, + const fpp_t _frames ) +{ + + // This appears to be used for determining whether or not to continue processing + // audio with this effect + if( !isEnabled() || !isRunning() ) + { + return( FALSE ); + } + + + for( fpp_t f = 0; f < _frames; ++f ) + { + sample_t l = _buf[f][0]; + sample_t r = _buf[f][1]; + _buf[f][0] = m_smControls.m_llModel.value( f ) * l + + m_smControls.m_rlModel.value( f ) * r; + + _buf[f][1] = m_smControls.m_lrModel.value( f ) * l + + m_smControls.m_rrModel.value( f ) * r; + } + + return( isRunning() ); +} + + + + +extern "C" +{ + +// neccessary for getting instance out of shared lib +plugin * lmms_plugin_main( model * _parent, void * _data ) +{ + return( new stereoMatrixEffect( _parent, + static_cast( + _data ) ) ); +} + +} + diff --git a/plugins/stereo_matrix/stereo_matrix.h b/plugins/stereo_matrix/stereo_matrix.h new file mode 100644 index 000000000..6b2c7866d --- /dev/null +++ b/plugins/stereo_matrix/stereo_matrix.h @@ -0,0 +1,60 @@ +/* + * stereo_matrix.h - stereo-matrix-effect-plugin + * + * Copyright (c) 2008 Paul Giblock + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 (see COPYING); if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + * + */ + + +#ifndef _STEREO_MATRIX_H +#define _STEREO_MATRIX_H + +#include + +#include "effect.h" +#include "effect_lib.h" +#include "engine.h" +#include "main_window.h" +#include "stereomatrix_controls.h" + +class stereoMatrixEffect : public effect +{ +public: + stereoMatrixEffect( model * parent, + const descriptor::subPluginFeatures::key * _key ); + virtual ~stereoMatrixEffect(); + virtual bool processAudioBuffer( sampleFrame * _buf, + const fpp_t _frames ); + + virtual effectControls * getControls( void ) + { + return( &m_smControls ); + } + + +private: + stereoMatrixControls m_smControls; + + friend class stereoMatrixControls; +} ; + + + +#endif diff --git a/plugins/stereo_matrix/stereomatrix_control_dialog.cpp b/plugins/stereo_matrix/stereomatrix_control_dialog.cpp new file mode 100644 index 000000000..86baa7eef --- /dev/null +++ b/plugins/stereo_matrix/stereomatrix_control_dialog.cpp @@ -0,0 +1,72 @@ +/* + * stereomatrix_control_dialog.cpp - control dialog for stereoMatrix-effect + * + * Copyright (c) 2008 Paul Giblock + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 (see COPYING); if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + * + */ + + + +#include +#include + +#include "stereomatrix_control_dialog.h" +#include "stereomatrix_controls.h" + + + +stereoMatrixControlDialog::stereoMatrixControlDialog( + stereoMatrixControls * _controls ) : + effectControlDialog( _controls ) +{ + + setFixedSize( 64, 64 ); + + QGridLayout * l = new QGridLayout( this ); + + knob * llKnob = new knob( knobBright_26, this, tr( "Left to Left" ) ); + llKnob->setModel( &_controls->m_llModel ); + llKnob->setHintText( tr( "Volume:" ) + " ", "" ); + + knob * lrKnob = new knob( knobBright_26, this, tr( "Left to Right" ) ); + lrKnob->setModel( &_controls->m_lrModel ); + lrKnob->setHintText( tr( "Volume:" ) + " ", "" ); + + knob * rlKnob = new knob( knobBright_26, this, tr( "Right to Left" ) ); + rlKnob->setModel( &_controls->m_rlModel ); + rlKnob->setHintText( tr( "Volume:" ) + " ", "" ); + + knob * rrKnob = new knob( knobBright_26, this, tr( "Right to Right" ) ); + rrKnob->setModel( &_controls->m_rrModel ); + rrKnob->setHintText( tr( "Volume:" ) + " ", "" ); + + l->addWidget( new QLabel( "L", this ), 1, 0); + l->addWidget( new QLabel( "R", this ), 2, 0); + l->addWidget( new QLabel( "L", this ), 0, 1); + l->addWidget( new QLabel( "R", this ), 0, 2); + + l->addWidget( llKnob, 1, 1 ); + l->addWidget( lrKnob, 1, 2 ); + l->addWidget( rlKnob, 2, 1 ); + l->addWidget( rrKnob, 2, 2 ); + + this->setLayout(l); +} + diff --git a/plugins/stereo_matrix/stereomatrix_control_dialog.h b/plugins/stereo_matrix/stereomatrix_control_dialog.h new file mode 100644 index 000000000..c18945b92 --- /dev/null +++ b/plugins/stereo_matrix/stereomatrix_control_dialog.h @@ -0,0 +1,44 @@ +/* + * stereomatrix_control_dialog.h - control dialog for stereoMatrix-effect + * + * Copyright (c) 2008 Paul Giblock + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 (see COPYING); if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + * + */ + +#ifndef _STEREOMATRIX_CONTROL_DIALOG_H +#define _STEREOMATRIX_CONTROL_DIALOG_H + +#include "effect_control_dialog.h" + +class stereoMatrixControls; + + +class stereoMatrixControlDialog : public effectControlDialog +{ +public: + stereoMatrixControlDialog( stereoMatrixControls * _controls ); + virtual ~stereoMatrixControlDialog() + { + } + +}; + + +#endif diff --git a/plugins/stereo_matrix/stereomatrix_controls.cpp b/plugins/stereo_matrix/stereomatrix_controls.cpp new file mode 100644 index 000000000..c2c4f8a70 --- /dev/null +++ b/plugins/stereo_matrix/stereomatrix_controls.cpp @@ -0,0 +1,82 @@ +/* + * stereomatrix_controls.cpp - controls for stereoMatrix-effect + * + * Copyright (c) 2008 Paul Giblock + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 (see COPYING); if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + * + */ + +#include "stereomatrix_controls.h" +#include "stereo_matrix.h" +#include "automatable_model_templates.h" + + +stereoMatrixControls::stereoMatrixControls( stereoMatrixEffect * _eff ) : + effectControls( _eff ), + m_effect( _eff ), + m_llModel( 1.0f, 0.0f, 1.0f, 0.01f ), + m_lrModel( 0.0f, 0.0f, 1.0f, 0.01f ), + m_rlModel( 0.0f, 0.0f, 1.0f, 0.01f ), + m_rrModel( 1.0f, 0.0f, 1.0f, 0.01f ) +{ + connect( &m_llModel, SIGNAL( dataChanged( void ) ), + this, SLOT( changeMatrix( void ) ) ); + connect( &m_lrModel, SIGNAL( dataChanged( void ) ), + this, SLOT( changeMatrix( void ) ) ); + connect( &m_rlModel, SIGNAL( dataChanged( void ) ), + this, SLOT( changeMatrix( void ) ) ); + connect( &m_rrModel, SIGNAL( dataChanged( void ) ), + this, SLOT( changeMatrix( void ) ) ); + + changeMatrix(); +} + + + +void stereoMatrixControls::changeMatrix( void ) +{ +} + + + +void FASTCALL stereoMatrixControls::loadSettings( + const QDomElement & _this ) +{ + m_llModel.setValue( _this.attribute( "l-l" ).toFloat() ); + m_lrModel.setValue( _this.attribute( "l-r" ).toFloat() ); + m_rlModel.setValue( _this.attribute( "r-l" ).toFloat() ); + m_rrModel.setValue( _this.attribute( "r-r" ).toFloat() ); +} + + + + +void FASTCALL stereoMatrixControls::saveSettings( QDomDocument & _doc, + QDomElement & _this ) +{ + _this.setAttribute( "l-l", m_llModel.value() ); + _this.setAttribute( "l-r", m_llModel.value() ); + _this.setAttribute( "r-l", m_llModel.value() ); + _this.setAttribute( "r-r", m_llModel.value() ); +} + + + +#include "stereomatrix_controls.moc" + diff --git a/plugins/stereo_matrix/stereomatrix_controls.h b/plugins/stereo_matrix/stereomatrix_controls.h new file mode 100644 index 000000000..c10efa1f6 --- /dev/null +++ b/plugins/stereo_matrix/stereomatrix_controls.h @@ -0,0 +1,79 @@ +/* + * stereomatrix_controls.h - controls for stereoMatrix-effect + * + * Copyright (c) 2008 Paul Giblock + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 (see COPYING); if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + * + */ + +#ifndef _STEREO_MATRIX_CONTROLS_H +#define _STEREO_MATRIX_CONTROLS_H + +#include "effect_controls.h" +#include "stereomatrix_control_dialog.h" +#include "knob.h" + +class stereoMatrixEffect; + +class stereoMatrixControls : public effectControls +{ + Q_OBJECT +public: + stereoMatrixControls( stereoMatrixEffect( * _eff ) ); + virtual ~stereoMatrixControls() + { + } + + virtual void saveSettings( QDomDocument & _doc, QDomElement & _parent ); + virtual void loadSettings( const QDomElement & _this ); + inline virtual QString nodeName( void ) const + { + return( "stereomatrixcontrols" ); + } + + virtual ch_cnt_t getControlCount( void ) + { + return( 1 ); + } + + virtual effectControlDialog * createView( void ) + { + return new stereoMatrixControlDialog( this ); + } + + +private slots: + void changeMatrix( void ); + + +private: + stereoMatrixEffect * m_effect; + + knobModel m_llModel; + knobModel m_lrModel; + knobModel m_rlModel; + knobModel m_rrModel; + + friend class stereoMatrixControlDialog; + friend class stereoMatrixEffect; + +} ; + + +#endif