From 8a57da7d94d35c7c3b07ee33c5c99548d874e927 Mon Sep 17 00:00:00 2001 From: Andreas Brandmaier Date: Sat, 18 Feb 2006 15:38:35 +0000 Subject: [PATCH] added new plugin: Organic added presets git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/trunk/lmms@84 0778d3d1-df1d-0410-868b-ea421aaaa00d --- configure.in | 2 + plugins/Makefile.am | 2 +- plugins/organic/Makefile.am | 32 +++ plugins/organic/artwork.png | Bin 0 -> 11387 bytes plugins/organic/logo.png | Bin 0 -> 2576 bytes plugins/organic/organic.cpp | 457 ++++++++++++++++++++++++++++++++++++ plugins/organic/organic.h | 106 +++++++++ 7 files changed, 598 insertions(+), 1 deletion(-) create mode 100644 plugins/organic/Makefile.am create mode 100644 plugins/organic/artwork.png create mode 100644 plugins/organic/logo.png create mode 100644 plugins/organic/organic.cpp create mode 100644 plugins/organic/organic.h diff --git a/configure.in b/configure.in index 651279d8c..d40035949 100644 --- a/configure.in +++ b/configure.in @@ -423,12 +423,14 @@ AC_CONFIG_FILES([Makefile plugins/Makefile plugins/audio_file_processor/Makefile plugins/bit_invader/Makefile + plugins/organic/Makefile plugins/plucked_string_synth/Makefile plugins/triple_oscillator/Makefile plugins/vestige/Makefile presets/Makefile presets/AudioFileProcessor/Makefile presets/BitInvader/Makefile + presets/Organic/Makefile presets/PluckedStringSynth/Makefile presets/TripleOscillator/Makefile presets/VeSTige/Makefile diff --git a/plugins/Makefile.am b/plugins/Makefile.am index 707e95dc6..33e6ecfd2 100644 --- a/plugins/Makefile.am +++ b/plugins/Makefile.am @@ -2,5 +2,5 @@ if VST_SUPPORT VESTIGE_SUBDIR=vestige endif -SUBDIRS = audio_file_processor bit_invader plucked_string_synth triple_oscillator $(VESTIGE_SUBDIR) +SUBDIRS = audio_file_processor bit_invader organic plucked_string_synth triple_oscillator $(VESTIGE_SUBDIR) diff --git a/plugins/organic/Makefile.am b/plugins/organic/Makefile.am new file mode 100644 index 000000000..5b18ca26c --- /dev/null +++ b/plugins/organic/Makefile.am @@ -0,0 +1,32 @@ +AUTOMAKE_OPTIONS = foreign 1.4 + + +INCLUDES = -I$(top_srcdir)/include -I$(top_srcdir)/src/lib -I. + + +AM_CXXFLAGS := $(AM_CXXFLAGS) $(QT_CXXFLAGS) -DPLUGIN_NAME="organic" + + +%.moc: ./%.h + $(MOC) -o $@ $< + + +MOC_FILES = ./organic.moc + +BUILT_SOURCES = $(MOC_FILES) ./embedded_resources.h +EMBEDDED_RESOURCES = $(wildcard *png) + +./embedded_resources.h: $(EMBEDDED_RESOURCES) + $(top_builddir)/buildtools/bin2res $(EMBEDDED_RESOURCES) > $@ + +EXTRA_DIST = $(EMBEDDED_RESOURCES) + + +CLEANFILES = $(MOC_FILES) ./embedded_resources.h + + + +pkglib_LTLIBRARIES= liborganic.la + +liborganic_la_SOURCES = organic.cpp organic.h +$(liborganic_la_SOURCES): ./embedded_resources.h diff --git a/plugins/organic/artwork.png b/plugins/organic/artwork.png new file mode 100644 index 0000000000000000000000000000000000000000..9904d669edf20088189cfbdb904d3c77fc3327f1 GIT binary patch literal 11387 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 m3-f2;rzqLk*%R;+mHz=wKGzQ<0<=#60000 + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + */ + + +#include "qt3support.h" + +#ifdef QT4 + +#include +#include +#include +#include +#include +#include + +#else + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#endif + +#include +#include +#include +#include "math.h" + +using namespace std; + + +#include "organic.h" +#include "channel_track.h" +#include "note_play_handle.h" +#include "templates.h" +#include "buffer_allocator.h" +#include "knob.h" +#include "pixmap_button.h" +#include "tooltip.h" +#include "song_editor.h" +#include "oscillator.h" +#include "sample_buffer.h" +#include "embed.cpp" +#include "base64.h" + + +extern "C" +{ + +plugin::descriptor organic_plugin_descriptor = +{ + STRINGIFY_PLUGIN_NAME( PLUGIN_NAME ), + "Organic", + QT_TRANSLATE_NOOP( "pluginBrowser", + "Additive Synthesizer for organ-like sounds" ), + "Andreas Brandmaier ", + 0x0100, + plugin::INSTRUMENT, + PLUGIN_NAME::findEmbeddedData( "logo.png" ) +} ; + +} + +QPixmap * organicInstrument::s_artwork = NULL; + + +/*********************************************************************** +* +* class BitInvader +* +* lmms - plugin +* +***********************************************************************/ + + +organicInstrument::organicInstrument( channelTrack * _channel_track ) : + instrument( _channel_track, + &organic_plugin_descriptor ), + specialBgHandlingWidget( PLUGIN_NAME::getIconPixmap( "artwork" ) ) +{ + + + m_num_oscillators = 8; + + m_osc = new oscillatorData[m_num_oscillators]; + + for (int i=0; i < m_num_oscillators; i++) + { + m_osc[i].waveShape = oscillator::SIN_WAVE; + + // setup volume-knob + m_osc[i].volKnob = new knob( knobGreen_17, this, tr( + "Osc %1 volume" ).arg( i+1 ), eng() ); + m_osc[i].volKnob->move( 25+i*20, 90 ); + m_osc[i].volKnob->setRange( 0, 100, 1.0f ); + m_osc[i].volKnob->setValue( 100, TRUE ); + m_osc[i].volKnob->setHintText( tr( "Osc %1 volume:" ).arg( + i+1 ) + " ", "%" ); + + // setup panning-knob + m_osc[i].panKnob = new knob( knobGreen_17, this, + tr( "Osc %1 panning" ).arg( i + 1 ), eng() ); + m_osc[i].panKnob->move( 25+i*20, 110 ); + m_osc[i].panKnob->setRange( PANNING_LEFT, PANNING_RIGHT, 1.0f ); + m_osc[i].panKnob->setValue( DEFAULT_PANNING, TRUE ); + m_osc[i].panKnob->setHintText( tr("Osc %1 panning:").arg( i+1 ) + + " ", "" ); + + // setup knob for left fine-detuning + m_osc[i].detuneKnob = new knob( knobGreen_17, this, + tr( "Osc %1 fine detuning left" ).arg( i+1 ), + eng() ); + m_osc[i].detuneKnob->move( 25+i*20, 130 ); + m_osc[i].detuneKnob->setRange( -100.0f, 100.0f, 1.0f ); + m_osc[i].detuneKnob->setValue( 0.0f, TRUE ); + m_osc[i].detuneKnob->setHintText( tr( "Osc %1 fine detuning " + "left:" ).arg( i + 1 ) + + " ", " " + + tr( "cents" ) ); + + + + } + + // setup knob for FX1 + fx1Knob = new knob( knobGreen_17, this, + tr( "FX1" ), + eng() ); + fx1Knob->move( 20, 160 ); + fx1Knob->setRange( 0.0f, 0.99f, 0.01f ); + fx1Knob->setValue( 0.0f, TRUE ); + + // setup volume-knob + volKnob = new knob( knobGreen_17, this, tr( + "Osc %1 volume" ).arg( 1 ), eng() ); + volKnob->move( 50, 160 ); + volKnob->setRange( 0, 200, 1.0f ); + volKnob->setValue( 100, TRUE ); + volKnob->setHintText( tr( "Osc %1 volume:" ).arg( + 1 ) + " ", "%" ); + + + m_osc[0].harmonic = 0.5f; // one octave below + m_osc[1].harmonic = 0.75f; // a fifth below + m_osc[2].harmonic = 1.0f; // base freq + m_osc[3].harmonic = 2.0f; // first overtone + m_osc[4].harmonic = 3.0f; // second overtone + m_osc[5].harmonic = 4.0f; // . + m_osc[6].harmonic = 5.0f; // . + m_osc[7].harmonic = 6.0f; // . + + + if( s_artwork == NULL ) + { + s_artwork = new QPixmap( PLUGIN_NAME::getIconPixmap( + "artwork" ) ); + } + + + +#ifdef QT4 + QPalette pal; + pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( + "artwork" ) ); + setPalette( pal ); +#else + setErasePixmap( PLUGIN_NAME::getIconPixmap( "artwork" ) ); +#endif +} + + + +organicInstrument::~organicInstrument() +{ +} + + + + +void organicInstrument::saveSettings( QDomDocument & _doc, + QDomElement & _parent ) +{ + + QDomElement to_de = _doc.createElement( nodeName() ); + + to_de.setAttribute( "num_osc", QString::number( m_num_oscillators ) ); + to_de.setAttribute( "foldback", QString::number( fx1Knob->value() ) ); + to_de.setAttribute( "vol", QString::number( volKnob->value() ) ); + + for( int i = 0; i < m_num_oscillators; ++i ) + { + QString is = QString::number( i ); + to_de.setAttribute( "vol" + is, QString::number( + m_osc[i].volKnob->value() ) ); + to_de.setAttribute( "pan" + is, QString::number( + m_osc[i].panKnob->value() ) ); + to_de.setAttribute( "harmonic" + is, QString::number( + m_osc[i].harmonic ) ); + to_de.setAttribute( "detune" + is, QString::number( + m_osc[i].detuneKnob->value() ) ); + to_de.setAttribute( "wavetype" + is, QString::number( + m_osc[i].waveShape ) ); + } + + + + _parent.appendChild( to_de ); + + +} + + + + +void organicInstrument::loadSettings( const QDomElement & _this ) +{ +// m_num_oscillators = _this.attribute( "num_osc" ). + // toInt(); + + for( int i = 0; i < m_num_oscillators; ++i ) + { + QString is = QString::number( i ); + m_osc[i].volKnob->setValue( _this.attribute( "vol" + is ). + toFloat() ); + m_osc[i].detuneKnob->setValue( _this.attribute( "detune" + is ). + toFloat() ); + m_osc[i].panKnob->setValue( _this.attribute( "pan" + is ). + toFloat() ); + // m_osc[i].waveShape = _this.attribute( "wavetype"+is ).toInt(); + } + + volKnob->setValue( _this.attribute( "vol" ). + toFloat() ); + fx1Knob->setValue( _this.attribute( "foldback" ). + toFloat() ); +} + + +QString organicInstrument::nodeName( void ) const +{ + return( organic_plugin_descriptor.name ); +} + + + + +void organicInstrument::playNote( notePlayHandle * _n ) +{ + if( _n->totalFramesPlayed() == 0 ) + { + float freq = getChannelTrack()->frequency( _n ); + + oscillator * oscs_l[m_num_oscillators]; + oscillator * oscs_r[m_num_oscillators]; + + for( Sint8 i = m_num_oscillators-1; i >= 0; --i ) + { + + // volume + float volume = m_osc[i].volKnob->value() / 100.0 / m_num_oscillators ; + float volume_l = volume * ( m_osc[i].panKnob->value() + + PANNING_RIGHT ) / 100.0f; + float volume_r = volume * ( PANNING_RIGHT - + m_osc[i].panKnob->value() ) / + 100.0f; + + // detuning + float osc_detuning_l = +m_osc[i].detuneKnob->value() / 10.0f; + float osc_detuning_r = -m_osc[i].detuneKnob->value() / 10.0f; + + // frequency + float freq_l = freq * m_osc[i].harmonic + osc_detuning_l; + float freq_r = freq * m_osc[i].harmonic + osc_detuning_r; + + // randomize the phaseOffset [0,360] + int phase_l = (int) (rand() * 360.0); + int phase_r = (int) (rand() * 360.0); + + + + // Nyquist boundary check + if (freq > (eng()->getMixer()->sampleRate() >> 2)) + { + volume = 0; + } + + // initialise ocillators + + if (i == (m_num_oscillators-1)) { + // create left oscillator + oscs_l[i] = oscillator::createOsc( + m_osc[i].waveShape, + oscillator::MIX, + freq_l, + phase_l, + volume_l, + eng()->getMixer()->sampleRate() ); + // create right oscillator + oscs_r[i] = oscillator::createOsc( + m_osc[i].waveShape, + oscillator::MIX, + freq_r, + phase_r, + volume_r, + eng()->getMixer()->sampleRate() ); + + } else { + // create left oscillator + oscs_l[i] = oscillator::createOsc( + m_osc[i].waveShape, + oscillator::MIX, + freq_l, + phase_l, + volume_l, + eng()->getMixer()->sampleRate(), + oscs_l[i + 1] ); + // create right oscillator + oscs_r[i] = oscillator::createOsc( + m_osc[i].waveShape, + oscillator::MIX, + freq_r, + phase_r, + volume_r, + eng()->getMixer()->sampleRate(), + oscs_r[i + 1] ); + + } + + + } + + _n->m_pluginData = new oscPtr; + static_cast( _n->m_pluginData )->oscLeft = oscs_l[0]; + static_cast< oscPtr *>( _n->m_pluginData )->oscRight = + oscs_r[0]; + } + + oscillator * osc_l = static_cast( _n->m_pluginData )->oscLeft; + oscillator * osc_r = static_cast( _n->m_pluginData + )->oscRight; + + const fpab_t frames = eng()->getMixer()->framesPerAudioBuffer(); + sampleFrame * buf = bufferAllocator::alloc( frames ); + + osc_l->update( buf, frames, 0 ); + osc_r->update( buf, frames, 1 ); + + + // -- fx section -- + + // fxKnob is [0;1] + float t = fx1Knob->value() * 5.0f;t++; + + for (int i=0 ; i < frames ; i++) + { + buf[i][0] = distort( buf[i][0], t ) * volKnob->value() / 100.0; + buf[i][1] = distort( buf[i][1], t ) * volKnob->value() / 100.0; + } + + // -- -- + + getChannelTrack()->processAudioBuffer( buf, frames, _n ); + + bufferAllocator::free( buf ); +} + + + + +void organicInstrument::deleteNotePluginData( notePlayHandle * _n ) +{ + if( _n->m_pluginData == NULL ) + { + return; + } + delete static_cast( static_cast( + _n->m_pluginData )->oscLeft ); + delete static_cast( static_cast( + _n->m_pluginData )->oscRight ); + delete static_cast( _n->m_pluginData ); +} + +float organicInstrument::foldback(float in, float threshold) +{ + if (in>threshold || in<-threshold) + { + in= fabs(fabs(fmod(in - threshold, threshold*4)) - threshold*2) - threshold; + } + return in; +} + +float organicInstrument::distort(float in, float dist) +{ + in *= dist; + if (in >= 1.0f) { + return 1.0f; + } else { + return in; + } + +} + +float organicInstrument::saturate(float x, float t) +{ + if(fabs(x) 0.f) + return t + (1.f-t)*tanh((x-t)/(1-t)); + else + return -(t + (1.f-t)*tanh((-x-t)/(1-t))); + } +} + + + +extern "C" +{ + +// neccessary for getting instance out of shared lib +plugin * lmms_plugin_main( void * _data ) +{ + return( new organicInstrument( static_cast( _data ) ) ); +} + + +} + + diff --git a/plugins/organic/organic.h b/plugins/organic/organic.h new file mode 100644 index 000000000..aee1142a6 --- /dev/null +++ b/plugins/organic/organic.h @@ -0,0 +1,106 @@ +/* + * bit_invader.h - declaration of class bitInvader and bSynth which + * are a wavetable synthesizer + * + * Copyright (c) 2006 Andreas Brandmaier + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + */ + + +#ifndef _ORGANIC_H +#define _ORGANIC_H + + +#ifdef QT4 + +#include + +#else + +#include +#include + +#endif + + +#include "instrument.h" +#include "spc_bg_hndl_widget.h" +#include "led_checkbox.h" +#include "oscillator.h" + +class knob; +class notePlayHandle; +class pixmapButton; + + +class organicInstrument : public instrument, public specialBgHandlingWidget +{ + Q_OBJECT +public: + organicInstrument(channelTrack * _channel_track ); + virtual ~organicInstrument(); + + virtual void FASTCALL playNote( notePlayHandle * _n ); + virtual void FASTCALL deleteNotePluginData( notePlayHandle * _n ); + + + virtual void FASTCALL saveSettings( QDomDocument & _doc, + QDomElement & _parent ); + virtual void FASTCALL loadSettings( const QDomElement & _this ); + + virtual QString nodeName( void ) const; + +private: + + float foldback(float in, float threshold); + float saturate(float x, float t); + float distort(float in, float dist); + + static QPixmap * s_artwork; + + int m_num_oscillators; + + struct oscillatorData + { + oscillator::waveShapes waveShape; + knob * volKnob; + knob * panKnob; + knob * detuneKnob; + float harmonic; + }; + + oscillatorData* m_osc; + + struct oscPtr + { + oscillator * oscLeft; + oscillator * oscRight; + } ; + + knob * fx1Knob; + knob * volKnob; + +} ; + + +#include "organic.moc" + + +#endif