diff --git a/data/themes/default/random_wave_active.png b/data/themes/default/random_wave_active.png new file mode 100644 index 000000000..38b089c63 Binary files /dev/null and b/data/themes/default/random_wave_active.png differ diff --git a/data/themes/default/random_wave_inactive.png b/data/themes/default/random_wave_inactive.png new file mode 100644 index 000000000..9a35c9d16 Binary files /dev/null and b/data/themes/default/random_wave_inactive.png differ diff --git a/include/EnvelopeAndLfoParameters.h b/include/EnvelopeAndLfoParameters.h index 1d795bd9e..bcac7b812 100644 --- a/include/EnvelopeAndLfoParameters.h +++ b/include/EnvelopeAndLfoParameters.h @@ -157,6 +157,7 @@ private: float m_lfoAmount; bool m_lfoAmountIsZero; sample_t * m_lfoShapeData; + sample_t m_random; bool m_bad_lfoShapeData; SampleBuffer m_userWave; @@ -167,11 +168,13 @@ private: SawWave, SquareWave, UserDefinedWave, + RandomWave, NumLfoShapes } ; sample_t lfoShapeSample( fpp_t _frame_offset ); void updateLfoShapeData(); + void updateRandomWave(); diff --git a/src/core/EnvelopeAndLfoParameters.cpp b/src/core/EnvelopeAndLfoParameters.cpp index 668fb9d18..a709d0aea 100644 --- a/src/core/EnvelopeAndLfoParameters.cpp +++ b/src/core/EnvelopeAndLfoParameters.cpp @@ -218,6 +218,14 @@ inline sample_t EnvelopeAndLfoParameters::lfoShapeSample( fpp_t _frame_offset ) case UserDefinedWave: shape_sample = m_userWave.userWaveSample( phase ); break; + case RandomWave: + shape_sample = m_random; + if( frame == 0 ) + { + updateRandomWave(); + shape_sample = m_random; + } + break; case SineWave: default: shape_sample = Oscillator::sinSample( phase ); @@ -242,6 +250,14 @@ void EnvelopeAndLfoParameters::updateLfoShapeData() +void EnvelopeAndLfoParameters::updateRandomWave() +{ + m_random = Oscillator::noiseSample( 0.0f ); +} + + + + inline void EnvelopeAndLfoParameters::fillLfoLevel( float * _buf, f_cnt_t _frame, const fpp_t _frames ) diff --git a/src/gui/widgets/EnvelopeAndLfoView.cpp b/src/gui/widgets/EnvelopeAndLfoView.cpp index 034e00d76..d44325996 100644 --- a/src/gui/widgets/EnvelopeAndLfoView.cpp +++ b/src/gui/widgets/EnvelopeAndLfoView.cpp @@ -250,8 +250,17 @@ EnvelopeAndLfoView::EnvelopeAndLfoView( QWidget * _parent ) : sqr_lfo_btn->setWhatsThis( tr( "Click here for a square-wave." ) ); + pixmapButton * random_lfo_btn = new pixmapButton( this, NULL ); + random_lfo_btn->move( LFO_SHAPES_X+60, LFO_SHAPES_Y ); + random_lfo_btn->setActiveGraphic( embed::getIconPixmap( + "random_wave_active" ) ); + random_lfo_btn->setInactiveGraphic( embed::getIconPixmap( + "random_wave_inactive" ) ); + random_lfo_btn->setWhatsThis( + tr( "Click here for random wave." ) ); + m_userLfoBtn = new pixmapButton( this, NULL ); - m_userLfoBtn->move( LFO_SHAPES_X+60, LFO_SHAPES_Y ); + m_userLfoBtn->move( LFO_SHAPES_X+75, LFO_SHAPES_Y ); m_userLfoBtn->setActiveGraphic( embed::getIconPixmap( "usr_wave_active" ) ); m_userLfoBtn->setInactiveGraphic( embed::getIconPixmap( @@ -269,6 +278,7 @@ EnvelopeAndLfoView::EnvelopeAndLfoView( QWidget * _parent ) : m_lfoWaveBtnGrp->addButton( triangle_lfo_btn ); m_lfoWaveBtnGrp->addButton( saw_lfo_btn ); m_lfoWaveBtnGrp->addButton( sqr_lfo_btn ); + m_lfoWaveBtnGrp->addButton( random_lfo_btn ); m_lfoWaveBtnGrp->addButton( m_userLfoBtn ); @@ -525,6 +535,9 @@ void EnvelopeAndLfoView::paintEvent( QPaintEvent * ) case EnvelopeAndLfoParameters::SquareWave: val = Oscillator::squareSample( phase ); break; + case EnvelopeAndLfoParameters::RandomWave: + val = Oscillator::squareSample( phase );// <- dummy! + break; case EnvelopeAndLfoParameters::UserDefinedWave: val = m_params->m_userWave. userWaveSample( phase );