diff --git a/plugins/wtsynth/WTSynth.cpp b/plugins/wtsynth/WTSynth.cpp index c59d8d0d4..1c7272200 100644 --- a/plugins/wtsynth/WTSynth.cpp +++ b/plugins/wtsynth/WTSynth.cpp @@ -412,8 +412,9 @@ void WTSynthInstrument::playNote( NotePlayHandle * _n, // envelope parameters const float envAmt = m_envAmt.value(); const float envAtt = ( m_envAtt.value() * w->samplerate() ) / 1000.0f; + const float envHold = ( m_envHold.value() * w->samplerate() ) / 1000.0f; const float envDec = ( m_envDec.value() * w->samplerate() ) / 1000.0f; - const float envLen = envAtt + envDec; + const float envLen = envAtt + envDec + envHold; const float tfp_ = static_cast( _n->totalFramesPlayed() ); // if sample-exact is enabled, use sample-exact calculations... @@ -430,9 +431,13 @@ void WTSynthInstrument::playNote( NotePlayHandle * _n, { mixvalue = qBound( -100.0f, mixvalue + ( tfp / envAtt * envAmt ), 100.0f ); } + else if ( tfp >= envAtt && tfp < envAtt + envHold ) + { + mixvalue = qBound( -100.0f, mixvalue + envAmt, 100.0f ); + } else { - mixvalue = qBound( -100.0f, mixvalue + envAmt - ( ( tfp - envAtt ) / envDec * envAmt ), 100.0f ); + mixvalue = qBound( -100.0f, mixvalue + envAmt - ( ( tfp - ( envAtt + envHold ) ) / envDec * envAmt ), 100.0f ); } } // get knob values in sample-exact way @@ -461,9 +466,13 @@ void WTSynthInstrument::playNote( NotePlayHandle * _n, { mixvalue = qBound( -100.0f, mixvalue + ( tfp / envAtt * envAmt ), 100.0f ); } + else if ( tfp >= envAtt && tfp < envAtt + envHold ) + { + mixvalue = qBound( -100.0f, mixvalue + envAmt, 100.0f ); + } else { - mixvalue = qBound( -100.0f, mixvalue + envAmt - ( ( tfp - envAtt ) / envDec * envAmt ), 100.0f ); + mixvalue = qBound( -100.0f, mixvalue + envAmt - ( ( tfp - ( envAtt + envHold ) ) / envDec * envAmt ), 100.0f ); } // get knob values @@ -549,6 +558,7 @@ void WTSynthInstrument::saveSettings( QDomDocument & _doc, m_abmix.saveSettings( _doc, _this, "abmix" ); m_envAmt.saveSettings( _doc, _this, "envAmt" ); m_envAtt.saveSettings( _doc, _this, "envAtt" ); + m_envHold.saveSettings( _doc, _this, "envHold" ); m_envDec.saveSettings( _doc, _this, "envDec" ); m_amod.saveSettings( _doc, _this, "amod" ); @@ -603,6 +613,7 @@ void WTSynthInstrument::loadSettings( const QDomElement & _this ) m_envAmt.loadSettings( _this, "envAmt" ); m_envAtt.loadSettings( _this, "envAtt" ); + m_envHold.loadSettings( _this, "envHold" ); m_envDec.loadSettings( _this, "envDec" ); m_amod.loadSettings( _this, "amod" ); @@ -677,8 +688,10 @@ WTSynthView::WTSynthView( Instrument * _instrument, makeknob( m_abmixKnob, 4, 3, "A-B Mix", "", "mixKnob" ) makeknob( m_envAmtKnob, 88, 3, "Mix envelope amount", "", "mixenvKnob" ) - makeknob( m_envAttKnob, 88, A1ROW, "Mix envelope attack", " ms", "mixenvKnob" ) - makeknob( m_envDecKnob, 88, A2ROW, "Mix envelope decay", " ms", "mixenvKnob" ) + + maketsknob( m_envAttKnob, 88, A1ROW, "Mix envelope attack", " ms", "mixenvKnob" ) + maketsknob( m_envHoldKnob, 88, A2ROW, "Mix envelope hold", " ms", "mixenvKnob" ) + maketsknob( m_envDecKnob, 88, B1ROW, "Mix envelope decay", " ms", "mixenvKnob" ) // let's set volume knobs a1_volKnob -> setVolumeKnob( true ); @@ -1199,6 +1212,7 @@ void WTSynthView::modelChanged() m_envAmtKnob -> setModel( &w -> m_envAmt ); m_envAttKnob -> setModel( &w -> m_envAtt ); + m_envHoldKnob -> setModel( &w -> m_envHold ); m_envDecKnob -> setModel( &w -> m_envDec ); } diff --git a/plugins/wtsynth/WTSynth.h b/plugins/wtsynth/WTSynth.h index 3b09d3003..599d0d487 100644 --- a/plugins/wtsynth/WTSynth.h +++ b/plugins/wtsynth/WTSynth.h @@ -37,7 +37,14 @@ #define makeknob( name, x, y, hint, unit, oname ) \ - name = new knob( knobStyled, this); \ + name = new knob( knobStyled, this ); \ + name ->move( x, y ); \ + name ->setHintText( tr( hint ) + " ", unit ); \ + name ->setObjectName( oname ); \ + name ->setFixedSize( 19, 19 ); + +#define maketsknob( name, x, y, hint, unit, oname ) \ + name = new TempoSyncKnob( knobStyled, this ); \ name ->move( x, y ); \ name ->setHintText( tr( hint ) + " ", unit ); \ name ->setObjectName( oname ); \ @@ -198,8 +205,10 @@ private: FloatModel m_abmix; FloatModel m_envAmt; - FloatModel m_envAtt; - FloatModel m_envDec; + + TempoSyncKnobModel m_envAtt; + TempoSyncKnobModel m_envHold; + TempoSyncKnobModel m_envDec; IntModel m_amod; IntModel m_bmod; @@ -268,8 +277,10 @@ private: knob * m_abmixKnob; knob * m_envAmtKnob; - knob * m_envAttKnob; - knob * m_envDecKnob; + + TempoSyncKnob * m_envAttKnob; + TempoSyncKnob * m_envHoldKnob; + TempoSyncKnob * m_envDecKnob; automatableButtonGroup * m_selectedGraphGroup; automatableButtonGroup * m_aModGroup; diff --git a/plugins/wtsynth/artwork.png b/plugins/wtsynth/artwork.png index c908695ef..56413dcea 100644 Binary files a/plugins/wtsynth/artwork.png and b/plugins/wtsynth/artwork.png differ