From 164a2f7a01fca6b5724c51527fd15c292e7c6c35 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Fri, 20 Jan 2006 12:11:31 +0000 Subject: [PATCH] added BitInvader-plugin git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/trunk/lmms@50 0778d3d1-df1d-0410-868b-ea421aaaa00d --- ChangeLog | 8 + configure.in | 5 +- plugins/Makefile.am | 3 +- plugins/bit_invader/Makefile.am | 33 ++ plugins/bit_invader/artwork.png | Bin 0 -> 52325 bytes plugins/bit_invader/bit_invader.cpp | 659 ++++++++++++++++++++++++++++ plugins/bit_invader/bit_invader.h | 133 ++++++ plugins/bit_invader/graph.cpp | 176 ++++++++ plugins/bit_invader/graph.h | 86 ++++ plugins/bit_invader/logo.png | Bin 0 -> 226 bytes plugins/bit_invader/wavegraph.png | Bin 0 -> 12490 bytes 11 files changed, 1099 insertions(+), 4 deletions(-) create mode 100644 plugins/bit_invader/Makefile.am create mode 100644 plugins/bit_invader/artwork.png create mode 100644 plugins/bit_invader/bit_invader.cpp create mode 100644 plugins/bit_invader/bit_invader.h create mode 100644 plugins/bit_invader/graph.cpp create mode 100644 plugins/bit_invader/graph.h create mode 100644 plugins/bit_invader/logo.png create mode 100644 plugins/bit_invader/wavegraph.png diff --git a/ChangeLog b/ChangeLog index 4f883b1df..9911ca20f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2006-01-19 Andreas M. Brandmaier + + * plugins/bit_invader/bit_invader.h: + * plugins/bit_invader/bit_invader.cpp: + * plugins/bit_invader/graph.h: + * plugins/bit_invader/graph.cpp: + added "BitInvader"-plugin, a usereditable wavetable-synthesizer + 2006-01-16 Tobias Doerffel * src/lib/mmp.cpp: diff --git a/configure.in b/configure.in index 775382dbd..8c80d0a20 100644 --- a/configure.in +++ b/configure.in @@ -2,8 +2,8 @@ # Process this file with autoconf to produce a configure script. AC_PREREQ(2.50) -AC_INIT(lmms, 0.1.2-cvs20060116, tobydox/at/users.sourceforge.net) -AM_INIT_AUTOMAKE(lmms, 0.1.2-cvs20060116) +AC_INIT(lmms, 0.1.2-cvs20060119, tobydox/at/users.sourceforge.net) +AM_INIT_AUTOMAKE(lmms, 0.1.2-cvs20060119) AM_CONFIG_HEADER(config.h) @@ -410,6 +410,7 @@ AC_CONFIG_FILES([Makefile midi-maps/Makefile plugins/Makefile plugins/audio_file_processor/Makefile + plugins/bit_invader/Makefile plugins/plucked_string_synth/Makefile plugins/triple_oscillator/Makefile plugins/vestige/Makefile diff --git a/plugins/Makefile.am b/plugins/Makefile.am index 8f5fbb81a..707e95dc6 100644 --- a/plugins/Makefile.am +++ b/plugins/Makefile.am @@ -2,6 +2,5 @@ if VST_SUPPORT VESTIGE_SUBDIR=vestige endif -SUBDIRS = audio_file_processor plucked_string_synth triple_oscillator $(VESTIGE_SUBDIR) - +SUBDIRS = audio_file_processor bit_invader plucked_string_synth triple_oscillator $(VESTIGE_SUBDIR) diff --git a/plugins/bit_invader/Makefile.am b/plugins/bit_invader/Makefile.am new file mode 100644 index 000000000..57260eeba --- /dev/null +++ b/plugins/bit_invader/Makefile.am @@ -0,0 +1,33 @@ +AUTOMAKE_OPTIONS = foreign 1.4 + + +INCLUDES = -I$(top_srcdir)/include -I$(top_srcdir)/src/lib -I. + + +AM_CXXFLAGS := $(AM_CXXFLAGS) $(QT_CXXFLAGS) -DPLUGIN_NAME="bitinvader" + + +%.moc: ./%.h + $(MOC) -o $@ $< + + +MOC_FILES = ./bit_invader.moc ./graph.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= libbitinvader.la + +libbitinvader_la_SOURCES = bit_invader.cpp bit_invader.h graph.cpp graph.h + +$(libbitinvader_la_SOURCES): ./embedded_resources.h diff --git a/plugins/bit_invader/artwork.png b/plugins/bit_invader/artwork.png new file mode 100644 index 0000000000000000000000000000000000000000..43ee1356feb9ee3ee1f0c0c9b6f912cb66c4f223 GIT binary patch literal 52325 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 Jvd$@?2>{p}ht&W8 literal 0 HcmV?d00001 diff --git a/plugins/bit_invader/bit_invader.cpp b/plugins/bit_invader/bit_invader.cpp new file mode 100644 index 000000000..471eedcc5 --- /dev/null +++ b/plugins/bit_invader/bit_invader.cpp @@ -0,0 +1,659 @@ +/* + * bit_invader.cpp - instrument which uses a usereditable wavetable + * + * 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. + * + */ + + +#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 "bit_invader.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 "embed.cpp" + + + +extern "C" +{ + +plugin::descriptor bitinvader_plugin_descriptor = +{ + STRINGIFY_PLUGIN_NAME( PLUGIN_NAME ), + "BitInvader", + QT_TRANSLATE_NOOP( "pluginBrowser", + "Rough & Dirty Wavetable Synthesizer." ), + "Andreas Brandmaier ", + 0x0100, + plugin::INSTRUMENT, + PLUGIN_NAME::findEmbeddedData( "logo.png" ) +} ; + +} + +QPixmap * bitInvader::s_artwork = NULL; + + +bSynth::bSynth(float* shape, int length, float _pitch, bool _interpolation, float factor) +{ + + interpolation = _interpolation; + + // init variables +// sample_length = static_cast(_val1); + + sample_length = length; + sample_shape = new float[sample_length]; + for (int i=0; i < length; i++) + { + sample_shape[i] = shape[i] * factor; + } + + + sample_index = 0; + sample_realindex = 0; + + + sample_step = static_cast( sample_length / + ((float)mixer::inst()->sampleRate() / _pitch) ); + +/* cout << "Sample length: " << sample_length << endl << + "Sample rate : " << mixer::inst()->sampleRate() << endl << + "Frequency : " << _pitch << endl << + "Sample step : " << sample_step << endl; +*/ +} + + +bSynth::~bSynth() +{ + delete[] sample_shape; +} + +sampleType bSynth::nextStringSample( void ) +{ + + + // check overflow + while (sample_realindex >= sample_length) { + sample_realindex -= sample_length; + } + + sampleType sample; + + if (interpolation) { + + // find position in shape + int a = static_cast(sample_realindex); + int b; + if (a < (sample_length-1)) { + b = static_cast(sample_realindex+1); + } else { + b = 0; + } + + // Nachkommaanteil + float frac = sample_realindex - static_cast(sample_realindex); + + sample = sample_shape[a]*(1-frac) + sample_shape[b]*(frac); + + } else { + // No interpolation + sample_index = static_cast(sample_realindex); + sample = sample_shape[sample_index]; + } + + // progress in shape + sample_realindex += sample_step; + +// cout << sample_index << "\t"; + + return sample; +} + +/*********************************************************************** +* +* class BitInvader +* +* lmms - plugin +* +***********************************************************************/ + + +bitInvader::bitInvader( channelTrack * _channel_track ) : + instrument( _channel_track, + &bitinvader_plugin_descriptor ), + specialBgHandlingWidget( PLUGIN_NAME::getIconPixmap( "artwork" ) ) +{ + + + m_graph = NULL; + normalize = false; + interpolation = false; + + if( s_artwork == NULL ) + { + s_artwork = new QPixmap( PLUGIN_NAME::getIconPixmap( + "artwork" ) ); + } + + + m_pickKnob = new knob( knobDark_28, this, tr( "Samplelength" ) ); + m_pickKnob->setRange( 8, 128, 1 ); + m_pickKnob->setValue( 128, TRUE ); + m_pickKnob->move( 10, 120 ); + m_pickKnob->setHintText( tr( "Sample Length" ) + " ", "" ); + + connect( m_pickKnob, SIGNAL( valueChanged( float ) ), + this, SLOT ( sampleSizeChanged( float ) ) + ); + + m_interpolationToggle = new ledCheckBox( "Interpolation", this ); + m_interpolationToggle->move( 55,80 ); + + connect( m_interpolationToggle, SIGNAL( toggled( bool ) ), + this, SLOT ( interpolationToggle( bool ) ) ); + + m_normalizeToggle = new ledCheckBox( "Normalize", this ); + m_normalizeToggle->move( 55, 100 ); + + connect( m_normalizeToggle, SIGNAL( toggled( bool ) ), + this, SLOT ( normalizeToggle( bool ) ) ); + + sample_length = 128; + sample_shape = new float[128]; + emit( sinWaveClicked() ); + + m_graph = new graph( "", this ); + m_graph->move(55,120); + m_graph->setSamplePointer( sample_shape, sample_length ); + + QPixmap p = embed::getIconPixmap("wavegraph") ; + + m_graph->setBackground( &p ); + + connect( m_graph, SIGNAL ( sampleSizeChanged( float ) ), + this, SLOT (sampleSizeChanged( float ) ) ); + + connect( m_graph, SIGNAL ( sampleChanged( void ) ), + this, SLOT ( sampleChanged( void ) ) ); + + sinWaveBtn = new pixmapButton( this ); + sinWaveBtn->move( 188, 120 ); + sinWaveBtn->setActiveGraphic( embed::getIconPixmap( + "sin_wave_inactive" ) ); + sinWaveBtn->setInactiveGraphic( embed::getIconPixmap( + "sin_wave_inactive" ) ); + sinWaveBtn->setChecked( TRUE ); + toolTip::add( sinWaveBtn, + tr( "Click here if you want a sine-wave for " + "current oscillator." ) ); + + triangleWaveBtn = new pixmapButton( this ); + triangleWaveBtn->move( 188, 136 ); + triangleWaveBtn->setActiveGraphic( + embed::getIconPixmap( "triangle_wave_inactive" ) ); + triangleWaveBtn->setInactiveGraphic( + embed::getIconPixmap( "triangle_wave_inactive" ) ); + toolTip::add( triangleWaveBtn, + tr( "Click here if you want a triangle-wave " + "for current oscillator." ) ); + + sawWaveBtn = new pixmapButton( this ); + sawWaveBtn->move( 188, 152 ); + sawWaveBtn->setActiveGraphic( embed::getIconPixmap( + "saw_wave_inactive" ) ); + sawWaveBtn->setInactiveGraphic( embed::getIconPixmap( + "saw_wave_inactive" ) ); + toolTip::add( sawWaveBtn, + tr( "Click here if you want a saw-wave for " + "current oscillator." ) ); + + sqrWaveBtn = new pixmapButton( this ); + sqrWaveBtn->move( 188, 168 ); + sqrWaveBtn->setActiveGraphic( embed::getIconPixmap( + "square_wave_inactive" ) ); + sqrWaveBtn->setInactiveGraphic( embed::getIconPixmap( + "square_wave_inactive" ) ); + toolTip::add( sqrWaveBtn, + tr( "Click here if you want a square-wave for " + "current oscillator." ) ); + + whiteNoiseWaveBtn = new pixmapButton( this ); + whiteNoiseWaveBtn->move( 188, 184 ); + whiteNoiseWaveBtn->setActiveGraphic( + embed::getIconPixmap( "white_noise_wave_inactive" ) ); + whiteNoiseWaveBtn->setInactiveGraphic( + embed::getIconPixmap( "white_noise_wave_inactive" ) ); + toolTip::add( whiteNoiseWaveBtn, + tr( "Click here if you want a white-noise for " + "current oscillator." ) ); + + + connect( sinWaveBtn, SIGNAL (clicked ( void ) ), + this, SLOT ( sinWaveClicked( void ) ) ); + connect( triangleWaveBtn, SIGNAL ( clicked ( void ) ), + this, SLOT ( triangleWaveClicked( void ) ) ); + connect( sawWaveBtn, SIGNAL (clicked ( void ) ), + this, SLOT ( sawWaveClicked( void ) ) ); + connect( sqrWaveBtn, SIGNAL ( clicked ( void ) ), + this, SLOT ( sqrWaveClicked( void ) ) ); + connect( whiteNoiseWaveBtn, SIGNAL ( clicked ( void ) ), + this, SLOT ( noiseWaveClicked( void ) ) ); + +#ifdef QT4 + QPalette pal; + pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( + "artwork" ) ); + setPalette( pal ); +#else + setErasePixmap( PLUGIN_NAME::getIconPixmap( "artwork" ) ); +#endif +} + + + +void bitInvader::paintEvent( QPaintEvent * ) +{ +#ifdef QT4 + QPainter p( this ); +#else + QPixmap pm( rect().size() ); + pm.fill( this, rect().topLeft() ); + + QPainter p( &pm, this ); +#endif + p.drawPixmap( 0, 0, *s_artwork ); + + p.setPen( QColor( 255, 255, 255 ) ); +// p.setPen( QColor( 0xFF, 0xAA, 0x00 ) ); + +// p.drawLine(0,0,200,200); + +#ifndef QT4 + bitBlt( this, rect().topLeft(), &pm ); +#endif + + +} + + +void bitInvader::sinWaveClicked( void ) +{ + // generate sample data + for (int i=0; i < sample_length; i++) + { + // sin(x) + sample_shape[i] = sinf(i * 6.2831853 / sample_length); + } + + sampleChanged(); +} + + +void bitInvader::triangleWaveClicked( void ) +{ + int half_sample_length = sample_length / 2; + + if ((sample_length % 2) == 0) { + + for (int i=0; i < half_sample_length; i++) + { + // triangle + sample_shape[i] = (((float)i) / half_sample_length * 2) - 1; + } + for (int i=half_sample_length; i < sample_length; i++) + { + // triangle + sample_shape[i] = - (((float)(i-half_sample_length)) / half_sample_length * 2) + 1; + } + + } else { + for (int i=0; i < half_sample_length; i++) + { + // triangle + sample_shape[i] = (((float)i) / half_sample_length * 2) - 1; + } + sample_shape[half_sample_length] = 1; + for (int i=half_sample_length+1; i < sample_length; i++) + { + // triangle + sample_shape[i] = - (((float)(i-half_sample_length)) / half_sample_length * 2) + 1; + } + + } + + sampleChanged(); +} + +void bitInvader::sawWaveClicked( void ) +{ + for (int i=0; i < sample_length; i++) + { + // saw + sample_shape[i] = (((float)i) / sample_length * 2) - 1; + } + + sampleChanged(); +} + +void bitInvader::sqrWaveClicked( void ) +{ + int half_sample_length = sample_length / 2; + + for (int i=0; i < half_sample_length; i++) + { + // triangle + sample_shape[i] = 1; + } + for (int i=half_sample_length; i < sample_length; i++) + { + // triangle + sample_shape[i] = -1; + } + + sampleChanged(); + + +} + +void bitInvader::noiseWaveClicked( void) +{ + srand(time(NULL)); + + for (int i=0; i < sample_length; i++) + { + sample_shape[i]= ((float)rand() / RAND_MAX * 2.0) - 1.0; + } + + sampleChanged(); + +} + +bitInvader::~bitInvader() +{ +} + + + + +void bitInvader::saveSettings( QDomDocument & _doc, + QDomElement & _parent ) +{ + + QDomElement to_de = _doc.createElement( nodeName() ); + + // Save plugin version + to_de.setAttribute( "version", "0.1" ); + + // Save sample length + to_de.setAttribute( "sampleLength", QString::number( sample_length ) ); + + // Save sample shape + for( int i = 0; i < sample_length; ++i ) + { + QString is = QString::number( i ); + to_de.setAttribute( "s"+is, QString::number( sample_shape[i] ) ); + } + + // save sampleLength knob + to_de.setAttribute( "knob1", m_pickKnob->value() ); + + // save LED normalize + to_de.setAttribute( "interpolation", m_interpolationToggle->isChecked() ); + + // save LED + to_de.setAttribute( "normalize", m_normalizeToggle->isChecked() ); + + _parent.appendChild( to_de ); + + +} + + + + +void bitInvader::loadSettings( const QDomElement & _this ) +{ + // Load knobs (fires change SIGNAL?) + m_pickKnob->setValue( _this.attribute("knob1").toFloat() ); + + + // Load sample length + sample_length = _this.attribute( "sampleLength" ).toInt() ; + + // Load sample shape + delete[] sample_shape; //TODO: necessary? + sample_shape = new float[sample_length]; + for( int i = 0; i < sample_length; ++i ) + { + QString is = QString::number( i ); + + sample_shape[i] = _this.attribute( "s"+is ).toFloat(); + } + + // Load LED normalize + if ( _this.attribute( "interpolation" ).toInt() == 1 ) { + m_interpolationToggle->setChecked( true ); + } else { + m_interpolationToggle->setChecked( false ); + } + // Load LED + if ( _this.attribute( "normalize" ).toInt() == 1) { + m_normalizeToggle->setChecked( true ); + } else { + m_normalizeToggle->setChecked( false ); + } + + update(); +// m_graph->update(); +} + +void bitInvader::interpolationToggle( bool value ) +{ + interpolation = value; +} + +void bitInvader::normalizeToggle( bool value ) +{ + normalize = value; +} + + +QString bitInvader::nodeName( void ) const +{ + return( bitinvader_plugin_descriptor.name ); +} + + + + +void bitInvader::playNote( notePlayHandle * _n ) +{ + if ( _n->totalFramesPlayed() == 0 ) + { + + float freq = getChannelTrack()->frequency( _n ); + + float factor; + if (!normalize) { + factor = 1.0; + } else { + factor = normalizeFactor; + } + + _n->m_pluginData = new bSynth( sample_shape, sample_length,freq + , interpolation, factor + //, m_pickKnob->value() + //m_pickupKnob->value() + ); + } + + const Uint32 frames = mixer::inst()->framesPerAudioBuffer(); + sampleFrame * buf = bufferAllocator::alloc( frames ); + + bSynth * ps = static_cast( _n->m_pluginData ); + for( Uint32 frame = 0; frame < frames; ++frame ) + { + const sampleType cur = ps->nextStringSample(); + for( Uint8 chnl = 0; chnl < DEFAULT_CHANNELS; ++chnl ) + { + buf[frame][chnl] = cur; + } + } + + getChannelTrack()->processAudioBuffer( buf, frames, _n ); + + bufferAllocator::free( buf ); +} + + + + +void bitInvader::deleteNotePluginData( notePlayHandle * _n ) +{ + delete static_cast( _n->m_pluginData ); +} + + +void bitInvader::sampleSizeChanged( float _new_sample_length ) +{ + int new_sample_length = static_cast(_new_sample_length); + + // ** grow array + if (new_sample_length > sample_length) { + + // store values in temporary array + float* temp = new float[sample_length]; + for (int i=0; i < sample_length; i++) + { + temp[i] = sample_shape[i]; + } + + // reinitialize sample array + delete[] sample_shape; + sample_shape = new float[new_sample_length]; + for (int i=0; i < new_sample_length; i++) + { + sample_shape[i] = 0; + } + + // fill in old values + for (int i=0; i < sample_length; i++) + { + sample_shape[i] = temp[i]; + } + + delete[] temp; + sample_length = new_sample_length; + + } + + // ** shrink array + if (new_sample_length < sample_length) { + + sample_length = new_sample_length; + + } + +// sample_length = static_cast(value); +// delete[] sample_shape; +// sample_shape = new float[sample_length]; + + // ** repaint + + m_graph->setSamplePointer( sample_shape, sample_length ); + m_graph->repaint(); +} + +void bitInvader::sampleChanged() +{ + + // analyze + float max = 0; + for (int i=0; i < sample_length; i++) + { + if (fabs(sample_shape[i]) > max) { max = fabs(sample_shape[i]); } + } + normalizeFactor = 1.0 / max; + +// cout << "MAX:" << max << "\tnormalizeFactor : " << normalizeFactor << endl; + + // update + if (m_graph != NULL) { + m_graph->update(); + } + +} + + + +extern "C" +{ + +// neccessary for getting instance out of shared lib +plugin * lmms_plugin_main( void * _data ) +{ + return( new bitInvader( + static_cast( _data ) ) ); +} + + +} + + diff --git a/plugins/bit_invader/bit_invader.h b/plugins/bit_invader/bit_invader.h new file mode 100644 index 000000000..f23a114cb --- /dev/null +++ b/plugins/bit_invader/bit_invader.h @@ -0,0 +1,133 @@ +/* + * 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 _BIT_INVADER_H +#define _BIT_INVADER_H + + +#ifdef QT4 + +#include + +#else + +#include +#include + +#endif + + +#include "instrument.h" +#include "spc_bg_hndl_widget.h" +#include "graph.h" +#include "led_checkbox.h" + + +class knob; +class notePlayHandle; +class pixmapButton; + +class bSynth +{ +public: + bSynth(float* sample, int length, float _pitch, bool _interpolation, float factor); + virtual ~bSynth(); + + sampleType nextStringSample(); + + +private: + + int sample_index; + float sample_realindex; + int sample_length; + float* sample_shape; + float sample_step; + + bool interpolation; +} ; + +class bitInvader : public instrument, public specialBgHandlingWidget +{ + Q_OBJECT +public: + bitInvader(channelTrack * _channel_track ); + virtual ~bitInvader(); + + 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; + +public slots: + void sampleSizeChanged( float _new_sample_length ); + void sampleChanged( void ); + void interpolationToggle( bool value ); + void normalizeToggle( bool value ); + void sinWaveClicked( void ); + void triangleWaveClicked( void ); + void sqrWaveClicked( void ); + void sawWaveClicked( void ); + void noiseWaveClicked( void ); + +protected: + virtual void paintEvent( QPaintEvent * ); + + +private: + knob * m_pickKnob; + knob * m_pickupKnob; + + pixmapButton * sinWaveBtn; + pixmapButton * triangleWaveBtn; + pixmapButton * sqrWaveBtn; + pixmapButton * sawWaveBtn; + pixmapButton * whiteNoiseWaveBtn; + + static QPixmap * s_artwork; + + graph * m_graph; + ledCheckBox * m_interpolationToggle; + ledCheckBox * m_normalizeToggle; + + int sample_length; + float* sample_shape; + + bool interpolation; + bool normalize; + float normalizeFactor; +} ; + + +#include "bit_invader.moc" + + +#endif diff --git a/plugins/bit_invader/graph.cpp b/plugins/bit_invader/graph.cpp new file mode 100644 index 000000000..7921c05e9 --- /dev/null +++ b/plugins/bit_invader/graph.cpp @@ -0,0 +1,176 @@ +/* + * graph.cpp - a QT widget for displaying and manipulating waveforms + * + * 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. + * + */ + + +#include "qt3support.h" + +#ifdef QT4 + +#include +#include +#include + +#else + +#include +#include + +#endif + + +#include "graph.h" + +#include +#include + +using namespace std; + +graph::graph( const QString & _text, QWidget * _parent) : + QWidget( _parent ) +{ + + m_background = 0; + + setFixedSize( 128, 101 ); + + + +} + + + + +graph::~graph() +{ + delete m_background; +} + +void graph::setBackground( QPixmap * pixmap ) +{ +// m_background = pixmap; +// setErasePixmap ( *m_background ); + +} + +void graph::setSamplePointer( float * pointer, int length ) +{ + samplePointer = pointer; + sampleLength = length; +} + +void graph::mouseMoveEvent ( QMouseEvent * _me ) +{ + + + // get position + int x = _me->x(); + if (x < 0) { return; } + if (x > sampleLength) { return; } + + int y = _me->y(); + if (y < 0) { return; } + if (y >= 100) { return; } + + y = 100 - y; + + samplePointer[x] = (y-50.0)/50.0; + + emit sampleChanged(); + + +} + +void graph::mousePressEvent( QMouseEvent * _me ) +{ +/* if( _me->button() == Qt::LeftButton ) + { + toggle(); + }*/ + + + // get position + int x = _me->x(); + if (x < 0) { return; } + if (x > sampleLength) { return; } + + int y = _me->y(); + if (y < 0) { return; } + if (y >= 100) { return; } + + y = 100 - y; + + samplePointer[x] = (y-50.0)/50.0; + + emit sampleChanged(); + + +} + + +void sampleChanged() {} + + +void graph::paintEvent( QPaintEvent * ) +{ + +#ifdef QT4 + QPainter p( this ); +#else + QPixmap draw_pm( rect().size() ); + draw_pm.fill( this, rect().topLeft() ); + + QPainter p( &draw_pm, this ); +#endif + + if (m_background != 0) { + p.drawPixmap( 0, 0, *m_background ); + } + + p.setPen( QColor( 0xFF, 0xAA, 0x00 ) ); + + p.drawLine( sampleLength, 0, sampleLength, 100); + +// float xscale = 200.0 / sampleLength; + float xscale = 1.0; + + for (int i=0; i < sampleLength-1; i++) + { + p.drawLine(static_cast(i*xscale), + static_cast(-samplePointer[i]*50) + 50, + static_cast((i+1)*xscale), + static_cast(-samplePointer[i+1]*50 + 50) + ); + } + + +#ifndef QT4 + // and blit all the drawn stuff on the screen... + bitBlt( this, rect().topLeft(), &draw_pm ); +#endif + +} + + + +#include "graph.moc" diff --git a/plugins/bit_invader/graph.h b/plugins/bit_invader/graph.h new file mode 100644 index 000000000..103bc24e2 --- /dev/null +++ b/plugins/bit_invader/graph.h @@ -0,0 +1,86 @@ +/* + * graph.h - a QT widget for displaying and manipulating waveforms + * + * 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 _GRAPH_H +#define _GRAPH_H + +#include "qt3support.h" + +#ifdef QT4 + +#include +#include + +#else + +#include +#include +#endif + + +//class QPixmap; + + +class graph : public QWidget +{ + Q_OBJECT +public: +/* enum ledColors + { + YELLOW, GREEN, TOTAL_COLORS + } ; +*/ + graph( const QString & _txt, QWidget * _parent//, + //ledColors _color = YELLOW + ); + virtual ~graph(); + + + void setSamplePointer( float * pointer, int length ); + + void setBackground ( QPixmap * pixmap ); + +signals: + void sampleSizeChanged( float f ); + void sampleChanged( void ); + +protected: + virtual void paintEvent( QPaintEvent * _pe ); + virtual void mousePressEvent( QMouseEvent * _me ); + virtual void mouseMoveEvent( QMouseEvent * _me ); + +private: + QPixmap * m_background; + + + float *samplePointer; + int sampleLength; + +//signals: +// void toggled( bool ); + +} ; + +#endif diff --git a/plugins/bit_invader/logo.png b/plugins/bit_invader/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d7f887c8067e499548955b28e68aa3ae3dfbec27 GIT binary patch literal 226 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