From 53d39ae4b86882e800d476a420a7e334b4492f7b Mon Sep 17 00:00:00 2001 From: Danny McRae Date: Fri, 4 Jan 2008 03:05:56 +0000 Subject: [PATCH] changed mallets plugin for M/V-architecture git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@640 0778d3d1-df1d-0410-868b-ea421aaaa00d --- ChangeLog | 5 + plugins/stk/mallets/mallets.cpp | 693 +++++++++++++++++--------------- plugins/stk/mallets/mallets.h | 105 +++-- 3 files changed, 435 insertions(+), 368 deletions(-) diff --git a/ChangeLog b/ChangeLog index e13faa50b..ca816bbb5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2008-01-03 Danny McRae + * plugins/stk/mallets/mallets.h: + * plugins/stk/mallets/mallets.cpp: + made plugin work with M/V-architecture + 2008-01-04 Tobias Doerffel * plugins/audio_file_processor/audio_file_processor.cpp: diff --git a/plugins/stk/mallets/mallets.cpp b/plugins/stk/mallets/mallets.cpp index 2c6a1649c..b72d27dfe 100644 --- a/plugins/stk/mallets/mallets.cpp +++ b/plugins/stk/mallets/mallets.cpp @@ -34,9 +34,6 @@ #include "engine.h" #include "gui_templates.h" -#include "instrument_track.h" -#include "knob.h" -#include "note_play_handle.h" #undef SINGLE_SOURCE_COMPILE #include "embed.cpp" @@ -61,17 +58,270 @@ plugin::descriptor malletsstk_plugin_descriptor = } -mallets::mallets( instrumentTrack * _instrument_track ) : - instrument( _instrument_track, &malletsstk_plugin_descriptor ), - m_filesMissing( TRUE ) +malletsInstrument::malletsInstrument( instrumentTrack * _channel_track ): + instrument( _channel_track, &malletsstk_plugin_descriptor ), + m_hardnessModel(64.0f, 0.0f, 128.0f, 0.1f, this), + m_positionModel(64.0f, 0.0f, 128.0f, 0.1f, this), + m_vibratoGainModel(64.0f, 0.0f, 128.0f, 0.1f, this), + m_vibratoFreqModel(64.0f, 0.0f, 128.0f, 0.1f, this), + m_stickModel(64.0f, 0.0f, 128.0f, 0.1f, this), + m_modulatorModel(64.0f, 0.0f, 128.0f, 0.1f, this), + m_crossfadeModel(64.0f, 0.0f, 128.0f, 0.1f, this), + m_lfoSpeedModel(64.0f, 0.0f, 128.0f, 0.1f, this), + m_lfoDepthModel(64.0f, 0.0f, 128.0f, 0.1f, this), + m_adsrModel(64.0f, 0.0f, 128.0f, 0.1f, this), + m_pressureModel(64.0f, 0.0f, 128.0f, 0.1f, this), + m_motionModel(64.0f, 0.0f, 128.0f, 0.1f, this), + m_velocityModel(64.0f, 0.0f, 128.0f, 0.1f, this), + m_strike(NULL), + m_presetsModel(this), + m_spreadModel(0, 0, 255, 1, this) { - m_filesMissing = + m_hardnessModel.setTrack( _channel_track ); + m_positionModel.setTrack( _channel_track ); + m_vibratoGainModel.setTrack( _channel_track ); + m_vibratoFreqModel.setTrack( _channel_track ); + m_stickModel.setTrack( _channel_track ); + m_modulatorModel.setTrack( _channel_track ); + m_crossfadeModel.setTrack( _channel_track ); + m_lfoSpeedModel.setTrack( _channel_track ); + m_lfoDepthModel.setTrack( _channel_track ); + m_adsrModel.setTrack( _channel_track ); + m_pressureModel.setTrack( _channel_track ); + m_motionModel.setTrack( _channel_track ); + m_velocityModel.setTrack( _channel_track ); + m_spreadModel.setTrack( _channel_track ); + + // ModalBar + m_presetsModel.addItem( tr( "Marimba" ) ); + m_scalers.append( 4.0 ); + m_presetsModel.addItem( tr( "Vibraphone" ) ); + m_scalers.append( 4.0 ); + m_presetsModel.addItem( tr( "Agogo" ) ); + m_scalers.append( 5.0 ); + m_presetsModel.addItem( tr( "Wood1" ) ); + m_scalers.append( 4.0 ); + m_presetsModel.addItem( tr( "Reso" ) ); + m_scalers.append( 2.5 ); + m_presetsModel.addItem( tr( "Wood2" ) ); + m_scalers.append( 5.0 ); + m_presetsModel.addItem( tr( "Beats" ) ); + m_scalers.append( 20.0 ); + m_presetsModel.addItem( tr( "Two Fixed" ) ); + m_scalers.append( 5.0 ); + m_presetsModel.addItem( tr( "Clump" ) ); + m_scalers.append( 4.0 ); + + // TubeBell + m_presetsModel.addItem( tr( "Tubular Bells" ) ); + m_scalers.append( 1.8 ); + + // BandedWG + m_presetsModel.addItem( tr( "Uniform Bar" ) ); + m_scalers.append( 25.0 ); + m_presetsModel.addItem( tr( "Tuned Bar" ) ); + m_scalers.append( 10.0 ); + m_presetsModel.addItem( tr( "Glass" ) ); + m_scalers.append( 16.0 ); + m_presetsModel.addItem( tr( "Tibetan Bowl" ) ); + m_scalers.append( 7.0 ); + + m_buffer = new sampleFrame[engine::getMixer()->framesPerPeriod()]; +} + + + + +malletsInstrument::~malletsInstrument() +{ + delete[] m_buffer; +} + + + + +void malletsInstrument::saveSettings( QDomDocument & _doc, QDomElement & _this ) +{ + // ModalBar + m_hardnessModel.saveSettings( _doc, _this, "hardness" ); + m_positionModel.saveSettings( _doc, _this, "position" ); + m_vibratoGainModel.saveSettings( _doc, _this, "vib_gain" ); + m_vibratoFreqModel.saveSettings( _doc, _this, "vib_freq" ); + m_stickModel.saveSettings( _doc, _this, "stick_mix" ); + + // TubeBell + m_modulatorModel.saveSettings( _doc, _this, "modulator" ); + m_crossfadeModel.saveSettings( _doc, _this, "crossfade" ); + m_lfoSpeedModel.saveSettings( _doc, _this, "lfo_speed" ); + m_lfoDepthModel.saveSettings( _doc, _this, "lfo_depth" ); + m_adsrModel.saveSettings( _doc, _this, "adsr" ); + + // BandedWG + m_pressureModel.saveSettings( _doc, _this, "pressure" ); + m_motionModel.saveSettings( _doc, _this, "motion" ); + m_vibratoModel.saveSettings( _doc, _this, "vibrato" ); + m_velocityModel.saveSettings( _doc, _this, "velocity" ); + if( m_strike != NULL ) + { + m_strike->model()->saveSettings( _doc, _this, "strike" ); + } + + m_presetsModel.saveSettings( _doc, _this, "preset" ); + m_spreadModel.saveSettings( _doc, _this, "spread" ); +} + + + + +void malletsInstrument::loadSettings( const QDomElement & _this ) +{ + // ModalBar + m_hardnessModel.loadSettings( _this, "hardness" ); + m_positionModel.loadSettings( _this, "position" ); + m_vibratoGainModel.loadSettings( _this, "vib_gain" ); + m_vibratoFreqModel.loadSettings( _this, "vib_freq" ); + m_stickModel.loadSettings( _this, "stick_mix" ); + + // TubeBell + m_modulatorModel.loadSettings( _this, "modulator" ); + m_crossfadeModel.loadSettings( _this, "crossfade" ); + m_lfoSpeedModel.loadSettings( _this, "lfo_speed" ); + m_lfoDepthModel.loadSettings( _this, "lfo_depth" ); + m_adsrModel.loadSettings( _this, "adsr" ); + + // BandedWG + m_pressureModel.loadSettings( _this, "pressure" ); + m_motionModel.loadSettings( _this, "motion" ); + m_vibratoModel.loadSettings( _this, "vibrato" ); + m_velocityModel.loadSettings( _this, "velocity" ); + if( m_strike != NULL ) + { + m_strike->model()->loadSettings( _this, "strike" ); + } + + m_presetsModel.loadSettings( _this, "preset" ); + m_spreadModel.loadSettings( _this, "spread" ); +} + + + + +QString malletsInstrument::nodeName( void ) const +{ + return( malletsstk_plugin_descriptor.name ); +} + + + + +void malletsInstrument::playNote( notePlayHandle * _n, bool ) +{ + if( m_filesMissing ) + { + return; + } + + int p = m_presetsModel.value(); + + const float freq = _n->frequency(); + if ( _n->totalFramesPlayed() == 0 ) + { + float vel = static_cast( _n->getVolume() ) / 100.0f; + + if( p < 9 ) + { + _n->m_pluginData = new malletsSynth( freq, + vel, + m_vibratoGainModel.value(), + m_hardnessModel.value(), + m_positionModel.value(), + m_stickModel.value(), + m_vibratoFreqModel.value(), + p, + (Uint8) m_spreadModel.value(), + engine::getMixer()->sampleRate() ); + } + else if( p == 9 ) + { + _n->m_pluginData = new malletsSynth( freq, + vel, + p, + m_lfoDepthModel.value(), + m_modulatorModel.value(), + m_crossfadeModel.value(), + m_lfoSpeedModel.value(), + m_adsrModel.value(), + (Uint8) m_spreadModel.value(), + engine::getMixer()->sampleRate() ); + } + else + { + _n->m_pluginData = new malletsSynth( freq, + vel, + m_pressureModel.value(), + m_motionModel.value(), + m_vibratoModel.value(), + p - 10, + m_strike->value() * 128.0, + m_velocityModel.value(), + (Uint8) m_spreadModel.value(), + engine::getMixer()->sampleRate() ); + } + } + + const fpp_t frames = _n->framesLeftForCurrentPeriod(); + + malletsSynth * ps = static_cast( _n->m_pluginData ); + sample_t add_scale = 0.0f; + if( p == 10 ) + { + add_scale = static_cast( m_strike->value() ) * freq * 2.5f; + } + for( fpp_t frame = 0; frame < frames; ++frame ) + { + const sample_t left = ps->nextSampleLeft() * + ( m_scalers[m_presetsModel.value()] + add_scale ); + const sample_t right = ps->nextSampleRight() * + ( m_scalers[m_presetsModel.value()] + add_scale ); + for( Uint8 chnl = 0; chnl < DEFAULT_CHANNELS / 2; ++chnl ) + { + m_buffer[frame][chnl * DEFAULT_CHANNELS / 2] = left; + m_buffer[frame][( chnl + 1 ) * DEFAULT_CHANNELS / 2] = right; + } + } + + getInstrumentTrack()->processAudioBuffer( m_buffer, frames, _n ); +} + + + + +void malletsInstrument::deleteNotePluginData( notePlayHandle * _n ) +{ + delete static_cast( _n->m_pluginData ); +} + + + + +instrumentView * malletsInstrument::createView( QWidget * _parent ) +{ + return( new malletsInstrumentView( this, _parent ) ); +} + + + + +malletsInstrumentView::malletsInstrumentView( malletsInstrument * _instrument, QWidget * _parent ) : + instrumentView( _instrument, _parent ) +{ + _instrument->m_filesMissing = !QDir( configManager::inst()->stkDir() ).exists() || !QFileInfo( configManager::inst()->stkDir() + QDir::separator() + "sinewave.raw" ).exists(); // for some reason this crashes...??? - if( m_filesMissing ) + if( _instrument->m_filesMissing ) { QMessageBox::information( 0, tr( "Missing files" ), tr( "Your Stk-installation seems to be " @@ -80,42 +330,40 @@ mallets::mallets( instrumentTrack * _instrument_track ) : QMessageBox::Ok ); } - m_modalBarWidget = setupModalBarControls( this, _instrument_track ); + m_modalBarWidget = setupModalBarControls( this ); setWidgetBackground( m_modalBarWidget, "artwork" ); - m_tubeBellWidget = setupTubeBellControls( this, _instrument_track ); + m_tubeBellWidget = setupTubeBellControls( this ); setWidgetBackground( m_tubeBellWidget, "artwork" ); m_tubeBellWidget->hide(); - m_bandedWGWidget = setupBandedWGControls( this, _instrument_track ); + m_bandedWGWidget = setupBandedWGControls( this ); setWidgetBackground( m_bandedWGWidget, "artwork" ); m_bandedWGWidget->hide(); - m_presets = setupPresets( this, _instrument_track ); + m_presetsCombo = new comboBox( this, tr( "Instrument" ) ); + m_presetsCombo->setGeometry( 64, 157, 99, 22 ); + m_presetsCombo->setFont( pointSize<8>( m_presetsCombo->font() ) ); - m_spread = new knob( knobBright_26, this, tr( "Spread" ), - _instrument_track ); - m_spread->setLabel( tr( "Spread" ) ); - m_spread->setRange( 0, 255, 1 ); - m_spread->setInitValue( 0 ); - m_spread->move( 178, 173 ); - m_spread->setHintText( tr( "Spread:" ) + " ", "" ); - - m_buffer = new sampleFrame[engine::getMixer()->framesPerPeriod()]; + connect( &_instrument->m_presetsModel, SIGNAL( dataChanged() ), + this, SLOT( changePreset() ) ); + + m_spreadKnob = new knob( knobBright_26, this, tr( "Spread" ) ); + m_spreadKnob->setLabel( tr( "Spread" ) ); + m_spreadKnob->move( 178, 173 ); + m_spreadKnob->setHintText( tr( "Spread:" ) + " ", "" ); } -mallets::~mallets() +malletsInstrumentView::~malletsInstrumentView() { - delete[] m_buffer; } - -void mallets::setWidgetBackground( QWidget * _widget, const QString & _pic ) +void malletsInstrumentView::setWidgetBackground( QWidget * _widget, const QString & _pic ) { _widget->setAutoFillBackground( TRUE ); QPalette pal; @@ -127,50 +375,35 @@ void mallets::setWidgetBackground( QWidget * _widget, const QString & _pic ) -QWidget * mallets::setupModalBarControls( QWidget * _parent, track * _track ) +QWidget * malletsInstrumentView::setupModalBarControls( QWidget * _parent ) { QWidget * widget = new QWidget( _parent ); widget->setFixedSize( 250, 250 ); - m_hardness = new knob( knobBright_26, widget, tr( "Hardness" ), - _track ); - m_hardness->setLabel( tr( "Hardness" ) ); - m_hardness->setRange( 0.0, 128.0, 0.1 ); - m_hardness->setInitValue( 64.0 ); - m_hardness->move( 145, 24 ); - m_hardness->setHintText( tr( "Hardness:" ) + " ", "" ); + m_hardnessKnob = new knob( knobBright_26, widget, tr( "Hardness" ) ); + m_hardnessKnob->setLabel( tr( "Hardness" ) ); + m_hardnessKnob->move( 145, 24 ); + m_hardnessKnob->setHintText( tr( "Hardness:" ) + " ", "" ); - m_position = new knob( knobBright_26, widget, tr( "Position" ), - _track ); - m_position->setLabel( tr( "Position" ) ); - m_position->setRange( 0.0, 128.0, 0.1 ); - m_position->setInitValue( 64.0 ); - m_position->move( 195, 24 ); - m_position->setHintText( tr( "Position:" ) + " ", "" ); + m_positionKnob = new knob( knobBright_26, widget, tr( "Position" ) ); + m_positionKnob->setLabel( tr( "Position" ) ); + m_positionKnob->move( 195, 24 ); + m_positionKnob->setHintText( tr( "Position:" ) + " ", "" ); - m_vibratoGain = new knob( knobBright_26, widget, tr( "Vibrato Gain" ), - _track ); - m_vibratoGain->setLabel( tr( "Vib Gain" ) ); - m_vibratoGain->setRange( 0.0, 128.0, 0.1 ); - m_vibratoGain->setInitValue( 64.0 ); - m_vibratoGain->move( 56, 86 ); - m_vibratoGain->setHintText( tr( "Vib Gain:" ) + " ", "" ); + m_vibratoGainKnob = new knob( knobBright_26, widget, tr( "Vibrato Gain" ) ); + m_vibratoGainKnob->setLabel( tr( "Vib Gain" ) ); + m_vibratoGainKnob->move( 56, 86 ); + m_vibratoGainKnob->setHintText( tr( "Vib Gain:" ) + " ", "" ); - m_vibratoFreq = new knob( knobBright_26, widget, tr( "Vibrato Freq" ), - _track ); - m_vibratoFreq->setLabel( tr( "Vib Freq" ) ); - m_vibratoFreq->setRange( 0.0, 128.0, 0.1 ); - m_vibratoFreq->setInitValue( 64.0 ); - m_vibratoFreq->move( 117, 86 ); - m_vibratoFreq->setHintText( tr( "Vib Freq:" ) + " ", "" ); + m_vibratoFreqKnob = new knob( knobBright_26, widget, tr( "Vibrato Freq" ) ); + m_vibratoFreqKnob->setLabel( tr( "Vib Freq" ) ); + m_vibratoFreqKnob->move( 117, 86 ); + m_vibratoFreqKnob->setHintText( tr( "Vib Freq:" ) + " ", "" ); - m_stick = new knob( knobBright_26, widget, tr( "Stick Mix" ), - _track ); - m_stick->setLabel( tr( "Stick Mix" ) ); - m_stick->setRange( 0.0, 128.0, 0.1 ); - m_stick->setInitValue( 64.0 ); - m_stick->move( 178, 86 ); - m_stick->setHintText( tr( "Stick Mix:" ) + " ", "" ); + m_stickKnob = new knob( knobBright_26, widget, tr( "Stick Mix" ) ); + m_stickKnob->setLabel( tr( "Stick Mix" ) ); + m_stickKnob->move( 178, 86 ); + m_stickKnob->setHintText( tr( "Stick Mix:" ) + " ", "" ); return( widget ); } @@ -178,49 +411,35 @@ QWidget * mallets::setupModalBarControls( QWidget * _parent, track * _track ) -QWidget * mallets::setupTubeBellControls( QWidget * _parent, track * _track ) +QWidget * malletsInstrumentView::setupTubeBellControls( QWidget * _parent ) { QWidget * widget = new QWidget( _parent ); widget->setFixedSize( 250, 250 ); - m_modulator = new knob( knobBright_26, widget, tr( "Modulator" ), - _track ); - m_modulator->setLabel( tr( "Modulator" ) ); - m_modulator->setRange( 0.0, 128.0, 0.1 ); - m_modulator->setInitValue( 100.0 ); - m_modulator->move( 145, 24 ); - m_modulator->setHintText( tr( "Modulator:" ) + " ", "" ); + m_modulatorKnob = new knob( knobBright_26, widget, tr( "Modulator" ) ); + m_modulatorKnob->setLabel( tr( "Modulator" ) ); + m_modulatorKnob->move( 145, 24 ); + m_modulatorKnob->setHintText( tr( "Modulator:" ) + " ", "" ); - m_crossfade = new knob( knobBright_26, widget, tr( "Crossfade" ), - _track ); - m_crossfade->setLabel( tr( "Crossfade" ) ); - m_crossfade->setRange( 0.0, 128.0, 0.1 ); - m_crossfade->setInitValue( 0.0 ); - m_crossfade->move( 195, 24 ); - m_crossfade->setHintText( tr( "Crossfade:" ) + " ", "" ); + m_crossfadeKnob = new knob( knobBright_26, widget, tr( "Crossfade" ) ); + m_crossfadeKnob->setLabel( tr( "Crossfade" ) ); + m_crossfadeKnob->move( 195, 24 ); + m_crossfadeKnob->setHintText( tr( "Crossfade:" ) + " ", "" ); - m_lfoSpeed = new knob( knobBright_26, widget, tr( "LFO Speed" ), - _track ); - m_lfoSpeed->setLabel( tr( "LFO Speed" ) ); - m_lfoSpeed->setRange( 0.0, 128.0, 0.1 ); - m_lfoSpeed->setInitValue( 20.0 ); - m_lfoSpeed->move( 56, 86 ); - m_lfoSpeed->setHintText( tr( "LFO Speed:" ) + " ", "" ); + m_lfoSpeedKnob = new knob( knobBright_26, widget, tr( "LFO Speed" ) ); + m_lfoSpeedKnob->setLabel( tr( "LFO Speed" ) ); + m_lfoSpeedKnob->move( 56, 86 ); + m_lfoSpeedKnob->setHintText( tr( "LFO Speed:" ) + " ", "" ); - m_lfoDepth = new knob( knobBright_26, widget, tr( "LFO Depth" ), - _track ); - m_lfoDepth->setLabel( tr( "LFO Depth" ) ); - m_lfoDepth->setRange( 0.0, 128.0, 0.1 ); - m_lfoDepth->setInitValue( 10.0 ); - m_lfoDepth->move( 117, 86 ); - m_lfoDepth->setHintText( tr( "LFO Depth:" ) + " ", "" ); + m_lfoDepthKnob = new knob( knobBright_26, widget, tr( "LFO Depth" ) ); + m_lfoDepthKnob->setLabel( tr( "LFO Depth" ) ); + m_lfoDepthKnob->move( 117, 86 ); + m_lfoDepthKnob->setHintText( tr( "LFO Depth:" ) + " ", "" ); - m_adsr = new knob( knobBright_26, widget, tr( "ADSR" ), _track ); - m_adsr->setLabel( tr( "ADSR" ) ); - m_adsr->setRange( 0.0, 128.0, 0.1 ); - m_adsr->setInitValue( 0.0 ); - m_adsr->move( 178, 86 ); - m_adsr->setHintText( tr( "ADSR:" ) + " ", "" ); + m_adsrKnob = new knob( knobBright_26, widget, tr( "ADSR" ) ); + m_adsrKnob->setLabel( tr( "ADSR" ) ); + m_adsrKnob->move( 178, 86 ); + m_adsrKnob->setHintText( tr( "ADSR:" ) + " ", "" ); return( widget ); } @@ -228,44 +447,36 @@ QWidget * mallets::setupTubeBellControls( QWidget * _parent, track * _track ) -QWidget * mallets::setupBandedWGControls( QWidget * _parent, track * _track ) +QWidget * malletsInstrumentView::setupBandedWGControls( QWidget * _parent ) { // BandedWG QWidget * widget = new QWidget( _parent ); widget->setFixedSize( 250, 250 ); - m_strike = new ledCheckBox( tr( "Bowed" ), widget, tr( "Bowed" ), - _track ); - m_strike->move( 165, 30 ); + m_strikeLED = new ledCheckBox( tr( "Bowed" ), widget, tr( "Bowed" ) ); + m_strikeLED->move( 165, 30 ); + m_strikeLED->model()->setTrack( castModel()->getInstrumentTrack() ); + castModel()->m_strike = m_strikeLED; - m_pressure = new knob( knobBright_26, widget, tr( "Pressure" ), - _track ); - m_pressure->setLabel( tr( "Pressure" ) ); - m_pressure->setRange( 0.0, 128.0, 0.1 ); - m_pressure->setInitValue( 64.0 ); - m_pressure->move( 56, 86 ); - m_pressure->setHintText( tr( "Pressure:" ) + " ", "" ); + m_pressureKnob = new knob( knobBright_26, widget, tr( "Pressure" ) ); + m_pressureKnob->setLabel( tr( "Pressure" ) ); + m_pressureKnob->move( 56, 86 ); + m_pressureKnob->setHintText( tr( "Pressure:" ) + " ", "" ); - m_motion = new knob( knobBright_26, widget, tr( "Motion" ), _track ); - m_motion->setLabel( tr( "Motion" ) ); - m_motion->setRange( 0.0, 128.0, 0.1 ); - m_motion->setInitValue( 64.0 ); - m_motion->move( 117, 86 ); - m_motion->setHintText( tr( "Motion:" ) + " ", "" ); + m_motionKnob = new knob( knobBright_26, widget, tr( "Motion" ) ); + m_motionKnob->setLabel( tr( "Motion" ) ); + m_motionKnob->move( 117, 86 ); + m_motionKnob->setHintText( tr( "Motion:" ) + " ", "" ); - m_velocity = new knob( knobBright_26, widget, tr( "Speed" ), _track ); - m_velocity->setLabel( tr( "Speed" ) ); - m_velocity->setRange( 0.0, 128.0, 0.1 ); - m_velocity->setInitValue( 74.5 ); - m_velocity->move( 178, 86 ); - m_velocity->setHintText( tr( "Speed:" ) + " ", "" ); + m_velocityKnob = new knob( knobBright_26, widget, tr( "Speed" ) ); + m_velocityKnob->setLabel( tr( "Speed" ) ); + m_velocityKnob->move( 178, 86 ); + m_velocityKnob->setHintText( tr( "Speed:" ) + " ", "" ); - m_vibrato = new knob( knobBright_26, widget, tr( "Vibrato" ), _track ); - m_vibrato->setLabel( tr( "Vibrato" ) ); - m_vibrato->setRange( 0.0, 128.0, 0.1 ); - m_vibrato->setInitValue( 64.0 ); - m_vibrato->move( 178, 129 ); - m_vibrato->setHintText( tr( "Vibrato:" ) + " ", "" ); + m_vibratoKnob = new knob( knobBright_26, widget, tr( "Vibrato" ) ); + m_vibratoKnob->setLabel( tr( "Vibrato" ) ); + m_vibratoKnob->move( 178, 129 ); + m_vibratoKnob->setHintText( tr( "Vibrato:" ) + " ", "" ); return( widget ); } @@ -273,221 +484,37 @@ QWidget * mallets::setupBandedWGControls( QWidget * _parent, track * _track ) -comboBox * mallets::setupPresets( QWidget * _parent, track * _track ) +void malletsInstrumentView::modelChanged( void ) { - comboBox * presets = new comboBox( _parent, tr( "Instrument" ), - _track ); - presets->setGeometry( 64, 157, 99, 22 ); - presets->setFont( pointSize<8>( presets->font() ) ); - - connect( presets, SIGNAL( valueChanged( int ) ), - _parent, SLOT( changePreset( int ) ) ); - - // ModalBar - presets->addItem( tr( "Marimba" ) ); - m_scalers.append( 4.0 ); - presets->addItem( tr( "Vibraphone" ) ); - m_scalers.append( 4.0 ); - presets->addItem( tr( "Agogo" ) ); - m_scalers.append( 5.0 ); - presets->addItem( tr( "Wood1" ) ); - m_scalers.append( 4.0 ); - presets->addItem( tr( "Reso" ) ); - m_scalers.append( 2.5 ); - presets->addItem( tr( "Wood2" ) ); - m_scalers.append( 5.0 ); - presets->addItem( tr( "Beats" ) ); - m_scalers.append( 20.0 ); - presets->addItem( tr( "Two Fixed" ) ); - m_scalers.append( 5.0 ); - presets->addItem( tr( "Clump" ) ); - m_scalers.append( 4.0 ); - - // TubeBell - presets->addItem( tr( "Tubular Bells" ) ); - m_scalers.append( 1.8 ); - - // BandedWG - presets->addItem( tr( "Uniform Bar" ) ); - m_scalers.append( 25.0 ); - presets->addItem( tr( "Tuned Bar" ) ); - m_scalers.append( 10.0 ); - presets->addItem( tr( "Glass" ) ); - m_scalers.append( 16.0 ); - presets->addItem( tr( "Tibetan Bowl" ) ); - m_scalers.append( 7.0 ); - - return( presets ); + malletsInstrument * inst = castModel(); + m_hardnessKnob->setModel( &inst->m_hardnessModel ); + m_positionKnob->setModel( &inst->m_positionModel ); + m_vibratoGainKnob->setModel( &inst->m_vibratoGainModel ); + m_vibratoFreqKnob->setModel( &inst->m_vibratoFreqModel ); + m_stickKnob->setModel( &inst->m_stickModel ); + m_modulatorKnob->setModel( &inst->m_modulatorModel ); + m_crossfadeKnob->setModel( &inst->m_crossfadeModel ); + m_lfoSpeedKnob->setModel( &inst->m_lfoSpeedModel ); + m_lfoDepthKnob->setModel( &inst->m_lfoDepthModel ); + m_adsrKnob->setModel( &inst->m_adsrModel ); + m_pressureKnob->setModel( &inst->m_pressureModel ); + m_motionKnob->setModel( &inst->m_motionModel ); + m_vibratoKnob->setModel( &inst->m_vibratoModel ); + m_velocityKnob->setModel( &inst->m_velocityModel ); + //m_strikeLED->setModel( &inst->m_strikeModel ); + m_presetsCombo->setModel( &inst->m_presetsModel ); + m_spreadKnob->setModel( &inst->m_spreadModel ); } -void mallets::saveSettings( QDomDocument & _doc, QDomElement & _this ) +void malletsInstrumentView::changePreset() { - // ModalBar - m_hardness->saveSettings( _doc, _this, "hardness" ); - m_position->saveSettings( _doc, _this, "position" ); - m_vibratoGain->saveSettings( _doc, _this, "vib_gain" ); - m_vibratoFreq->saveSettings( _doc, _this, "vib_freq" ); - m_stick->saveSettings( _doc, _this, "stick_mix" ); - - // TubeBell - m_modulator->saveSettings( _doc, _this, "modulator" ); - m_crossfade->saveSettings( _doc, _this, "crossfade" ); - m_lfoSpeed->saveSettings( _doc, _this, "lfo_speed" ); - m_lfoDepth->saveSettings( _doc, _this, "lfo_depth" ); - m_adsr->saveSettings( _doc, _this, "adsr" ); + malletsInstrument * inst = castModel(); + int _preset = inst->m_presetsModel.value(); - // BandedWG - m_pressure->saveSettings( _doc, _this, "pressure" ); - m_motion->saveSettings( _doc, _this, "motion" ); - m_vibrato->saveSettings( _doc, _this, "vibrato" ); - m_velocity->saveSettings( _doc, _this, "velocity" ); - m_strike->saveSettings( _doc, _this, "strike" ); - - m_presets->saveSettings( _doc, _this, "preset" ); - m_spread->saveSettings( _doc, _this, "spread" ); -} - - - - -void mallets::loadSettings( const QDomElement & _this ) -{ - // ModalBar - m_hardness->loadSettings( _this, "hardness" ); - m_position->loadSettings( _this, "position" ); - m_vibratoGain->loadSettings( _this, "vib_gain" ); - m_vibratoFreq->loadSettings( _this, "vib_freq" ); - m_stick->loadSettings( _this, "stick_mix" ); - - // TubeBell - m_modulator->loadSettings( _this, "modulator" ); - m_crossfade->loadSettings( _this, "crossfade" ); - m_lfoSpeed->loadSettings( _this, "lfo_speed" ); - m_lfoDepth->loadSettings( _this, "lfo_depth" ); - m_adsr->loadSettings( _this, "adsr" ); - - // BandedWG - m_pressure->loadSettings( _this, "pressure" ); - m_motion->loadSettings( _this, "motion" ); - m_vibrato->loadSettings( _this, "vibrato" ); - m_velocity->loadSettings( _this, "velocity" ); - m_strike->loadSettings( _this, "strike" ); - - m_presets->loadSettings( _this, "preset" ); - m_spread->loadSettings( _this, "spread" ); -} - - - - -QString mallets::nodeName( void ) const -{ - return( malletsstk_plugin_descriptor.name ); -} - - - - -void mallets::playNote( notePlayHandle * _n, bool ) -{ - if( m_filesMissing ) - { - return; - } - - int p = m_presets->value(); - - const float freq = _n->frequency(); - if ( _n->totalFramesPlayed() == 0 ) - { - float vel = static_cast( _n->getVolume() ) / 100.0f; - - if( p < 9 ) - { - _n->m_pluginData = new malletsSynth( - freq, - vel, - m_vibratoGain->value(), - m_hardness->value(), - m_position->value(), - m_stick->value(), - m_vibratoFreq->value(), - p, - (Uint8) m_spread->value(), - engine::getMixer()->sampleRate() ); - } - else if( p == 9 ) - { - _n->m_pluginData = new malletsSynth( - freq, - vel, - p, - m_lfoDepth->value(), - m_modulator->value(), - m_crossfade->value(), - m_lfoSpeed->value(), - m_adsr->value(), - (Uint8) m_spread->value(), - engine::getMixer()->sampleRate() ); - } - else - { - _n->m_pluginData = new malletsSynth( - freq, - vel, - m_pressure->value(), - m_motion->value(), - m_vibrato->value(), - p - 10, - m_strike->value() * 128.0, - m_velocity->value(), - (Uint8) m_spread->value(), - engine::getMixer()->sampleRate() ); - } - } - - const fpp_t frames = _n->framesLeftForCurrentPeriod(); - - malletsSynth * ps = static_cast( _n->m_pluginData ); - sample_t add_scale = 0.0f; - if( p == 10 ) - { - add_scale = - static_cast( m_strike->value() ) * freq * 2.5f; - } - for( fpp_t frame = 0; frame < frames; ++frame ) - { - const sample_t left = ps->nextSampleLeft() * - ( m_scalers[m_presets->value()] + add_scale ); - const sample_t right = ps->nextSampleRight() * - ( m_scalers[m_presets->value()] + add_scale ); - for( Uint8 chnl = 0; chnl < DEFAULT_CHANNELS / 2; ++chnl ) - { - m_buffer[frame][chnl * DEFAULT_CHANNELS / 2] = left; - m_buffer[frame][( chnl + 1 ) * DEFAULT_CHANNELS / 2] = - right; - } - } - - getInstrumentTrack()->processAudioBuffer( m_buffer, frames, _n ); -} - - - - -void mallets::deleteNotePluginData( notePlayHandle * _n ) -{ - delete static_cast( _n->m_pluginData ); -} - - - - -void mallets::changePreset( int _preset ) -{ + printf("malletsInstrumentView %d\n", _preset); if( _preset < 9 ) { m_tubeBellWidget->hide(); @@ -655,7 +682,7 @@ extern "C" // neccessary for getting instance out of shared lib plugin * lmms_plugin_main( void * _data ) { - return( new mallets( static_cast( _data ) ) ); + return( new malletsInstrument( static_cast( _data ) ) ); } diff --git a/plugins/stk/mallets/mallets.h b/plugins/stk/mallets/mallets.h index 8bdc56d5b..3ad500da8 100644 --- a/plugins/stk/mallets/mallets.h +++ b/plugins/stk/mallets/mallets.h @@ -31,11 +31,9 @@ #include "combobox.h" #include "instrument.h" +#include "knob.h" +#include "note_play_handle.h" #include "led_checkbox.h" -#include "mixer.h" - -class knob; -class notePlayHandle; class malletsSynth @@ -118,12 +116,11 @@ protected: -class mallets : public instrument +class malletsInstrument : public instrument { - Q_OBJECT public: - mallets( instrumentTrack * _channel_track ); - virtual ~mallets(); + malletsInstrument( instrumentTrack * _channel_track ); + virtual ~malletsInstrument( void ); virtual void FASTCALL playNote( notePlayHandle * _n, bool _try_parallelizing ); @@ -136,45 +133,83 @@ public: virtual QString nodeName( void ) const; -public slots: - void changePreset( int _preset ); + virtual instrumentView * createView( QWidget * _parent ); private: - void setWidgetBackground( QWidget * _widget, const QString & _pic ); - QWidget * setupModalBarControls( QWidget * _parent, track * _track ); - QWidget * setupTubeBellControls( QWidget * _parent, track * _track ); - QWidget * setupBandedWGControls( QWidget * _parent, track * _track ); - comboBox * setupPresets( QWidget * _parent, track * _track ); + knobModel m_hardnessModel; + knobModel m_positionModel; + knobModel m_vibratoGainModel; + knobModel m_vibratoFreqModel; + knobModel m_stickModel; - QWidget * m_modalBarWidget; - knob * m_hardness; - knob * m_position; - knob * m_vibratoGain; - knob * m_vibratoFreq; - knob * m_stick; + knobModel m_modulatorModel; + knobModel m_crossfadeModel; + knobModel m_lfoSpeedModel; + knobModel m_lfoDepthModel; + knobModel m_adsrModel; - QWidget * m_tubeBellWidget; - knob * m_modulator; - knob * m_crossfade; - knob * m_lfoSpeed; - knob * m_lfoDepth; - knob * m_adsr; + knobModel m_pressureModel; + knobModel m_motionModel; + knobModel m_vibratoModel; + knobModel m_velocityModel; - QWidget * m_bandedWGWidget; - knob * m_pressure; - knob * m_motion; - knob * m_vibrato; - knob * m_velocity; + // FIXME: Can't change the model of a ledCheckBox. ledCheckBox * m_strike; - comboBox * m_presets; - knob * m_spread; + comboBoxModel m_presetsModel; + knobModel m_spreadModel; QVector m_scalers; sampleFrame * m_buffer; + bool m_filesMissing; - + + friend class malletsInstrumentView; } ; +class malletsInstrumentView: public instrumentView +{ + Q_OBJECT +public: + malletsInstrumentView( malletsInstrument * _instrument, + QWidget * _parent ); + virtual ~malletsInstrumentView( void ); + +public slots: + void changePreset( void ); + +private: + virtual void modelChanged( void ); + + void setWidgetBackground( QWidget * _widget, const QString & _pic ); + QWidget * setupModalBarControls( QWidget * _parent ); + QWidget * setupTubeBellControls( QWidget * _parent ); + QWidget * setupBandedWGControls( QWidget * _parent ); + + QWidget * m_modalBarWidget; + knob * m_hardnessKnob; + knob * m_positionKnob; + knob * m_vibratoGainKnob; + knob * m_vibratoFreqKnob; + knob * m_stickKnob; + + QWidget * m_tubeBellWidget; + knob * m_modulatorKnob; + knob * m_crossfadeKnob; + knob * m_lfoSpeedKnob; + knob * m_lfoDepthKnob; + knob * m_adsrKnob; + + QWidget * m_bandedWGWidget; + knob * m_pressureKnob; + knob * m_motionKnob; + knob * m_vibratoKnob; + knob * m_velocityKnob; + ledCheckBox * m_strikeLED; + + comboBox * m_presetsCombo; + knob * m_spreadKnob; +}; + #endif