diff --git a/data/themes/classic/style.css b/data/themes/classic/style.css index a952e81dc..be17ee58f 100644 --- a/data/themes/classic/style.css +++ b/data/themes/classic/style.css @@ -158,6 +158,9 @@ GroupBox { VisualizationWidget { background: none; border: none; + qproperty-normalColor: rgb(71, 253, 133); + qproperty-warningColor: rgb(255, 192, 64); + qproperty-clippingColor: rgb(255, 64, 64); } /* main toolbar cpu load widget - this can have transparent bg now */ diff --git a/data/themes/default/style.css b/data/themes/default/style.css index a0ddd3b41..625d8657a 100644 --- a/data/themes/default/style.css +++ b/data/themes/default/style.css @@ -177,6 +177,9 @@ GroupBox { VisualizationWidget { background: none; border: none; + qproperty-normalColor: rgb(71, 253, 133); + qproperty-warningColor: rgb(255, 192, 64); + qproperty-clippingColor: rgb(255, 64, 64); } /* main toolbar cpu load widget - this can have transparent bg now */ diff --git a/include/VisualizationWidget.h b/include/VisualizationWidget.h index 4d73f052d..a178b1ad8 100644 --- a/include/VisualizationWidget.h +++ b/include/VisualizationWidget.h @@ -36,6 +36,9 @@ class VisualizationWidget : public QWidget { Q_OBJECT public: + Q_PROPERTY( QColor normalColor READ normalColor WRITE setNormalColor ) + Q_PROPERTY( QColor warningColor READ warningColor WRITE setWarningColor ) + Q_PROPERTY( QColor clippingColor READ clippingColor WRITE setClippingColor ) enum visualizationTypes { Simple // add more here @@ -47,6 +50,15 @@ public: void setActive( bool _active ); + QColor const & normalColor() const; + void setNormalColor(QColor const & normalColor); + + QColor const & warningColor() const; + void setWarningColor(QColor const & warningColor); + + QColor const & clippingColor() const; + void setClippingColor(QColor const & clippingColor); + protected: virtual void paintEvent( QPaintEvent * _pe ); @@ -56,6 +68,8 @@ protected: protected slots: void updateAudioBuffer( const surroundSampleFrame * buffer ); +private: + QColor const & determineLineColor(float level) const; private: QPixmap s_background; @@ -64,6 +78,9 @@ private: sampleFrame * m_buffer; bool m_active; + QColor m_normalColor; + QColor m_warningColor; + QColor m_clippingColor; } ; #endif diff --git a/plugins/FreeBoy/FreeBoy.cpp b/plugins/FreeBoy/FreeBoy.cpp index 1f720b825..dd05444a6 100644 --- a/plugins/FreeBoy/FreeBoy.cpp +++ b/plugins/FreeBoy/FreeBoy.cpp @@ -283,9 +283,6 @@ void FreeBoyInstrument::playNote( NotePlayHandle * _n, data += m_ch4SweepStepLengthModel.value(); papu->write_register( fakeClock(), 0xff21, data ); - //channel 4 init - papu->write_register( fakeClock(), 0xff23, 128 ); - _n->m_pluginData = papu; } @@ -387,6 +384,9 @@ void FreeBoyInstrument::playNote( NotePlayHandle * _n, data = data << 3; data += ropt; papu->write_register( fakeClock(), 0xff22, data ); + + //channel 4 init + papu->write_register( fakeClock(), 0xff23, 128 ); } int const buf_size = 2048; diff --git a/src/core/NotePlayHandle.cpp b/src/core/NotePlayHandle.cpp index 6379ad769..d652def42 100644 --- a/src/core/NotePlayHandle.cpp +++ b/src/core/NotePlayHandle.cpp @@ -235,13 +235,6 @@ void NotePlayHandle::play( sampleFrame * _working_buffer ) // decreasing release of an instrument-track while the note is active if( framesLeft() > 0 ) { - // clear offset frames if we're at the first period - // skip for single-streamed instruments, because in their case NPH::play() could be called from an IPH without a buffer argument - // ... also, they don't actually render the sound in NPH's, which is an even better reason to skip... - if( m_totalFramesPlayed == 0 && ! ( m_instrumentTrack->instrument()->flags() & Instrument::IsSingleStreamed ) ) - { - memset( _working_buffer, 0, sizeof( sampleFrame ) * offset() ); - } // play note! m_instrumentTrack->playNote( this, _working_buffer ); } diff --git a/src/gui/widgets/VisualizationWidget.cpp b/src/gui/widgets/VisualizationWidget.cpp index df0012816..7234331df 100644 --- a/src/gui/widgets/VisualizationWidget.cpp +++ b/src/gui/widgets/VisualizationWidget.cpp @@ -43,7 +43,10 @@ VisualizationWidget::VisualizationWidget( const QPixmap & _bg, QWidget * _p, QWidget( _p ), s_background( _bg ), m_points( new QPointF[Engine::mixer()->framesPerPeriod()] ), - m_active( false ) + m_active( false ), + m_normalColor(71, 253, 133), + m_warningColor(255, 192, 64), + m_clippingColor(255, 64, 64) { setFixedSize( s_background.width(), s_background.height() ); setAttribute( Qt::WA_OpaquePaintEvent, true ); @@ -109,6 +112,35 @@ void VisualizationWidget::setActive( bool _active ) } +QColor const & VisualizationWidget::normalColor() const +{ + return m_normalColor; +} + +void VisualizationWidget::setNormalColor(QColor const & normalColor) +{ + m_normalColor = normalColor; +} + +QColor const & VisualizationWidget::warningColor() const +{ + return m_warningColor; +} + +void VisualizationWidget::setWarningColor(QColor const & warningColor) +{ + m_warningColor = warningColor; +} + +QColor const & VisualizationWidget::clippingColor() const +{ + return m_clippingColor; +} + +void VisualizationWidget::setClippingColor(QColor const & clippingColor) +{ + m_clippingColor = clippingColor; +} void VisualizationWidget::paintEvent( QPaintEvent * ) @@ -122,47 +154,32 @@ void VisualizationWidget::paintEvent( QPaintEvent * ) Mixer const * mixer = Engine::mixer(); float master_output = mixer->masterGain(); - int w = width()-4; - const float half_h = -( height() - 6 ) / 3.0 * master_output - 1; - int x_base = 2; - const float y_base = height()/2 - 0.5f; - -// p.setClipRect( 2, 2, w, height()-4 ); - const fpp_t frames = mixer->framesPerPeriod(); Mixer::StereoSample peakValues = mixer->getPeakValues(m_buffer, frames); const float max_level = qMax( peakValues.left, peakValues.right ); - // and set color according to that... - if( max_level * master_output < 0.9 ) - { - p.setPen( QColor( 71, 253, 133 ) ); - } - else if( max_level * master_output < 1.0 ) - { - p.setPen( QColor( 255, 192, 64 ) ); - } - else - { - p.setPen( QColor( 255, 64, 64 ) ); - } + // Set the color of the line according to the maximum level + float const maxLevelWithAppliedMasterGain = max_level * master_output; + p.setPen(QPen(determineLineColor(maxLevelWithAppliedMasterGain), 0.7)); - p.setPen( QPen( p.pen().color(), 0.7 ) ); - - const float xd = (float) w / frames; p.setRenderHint( QPainter::Antialiasing ); // now draw all that stuff + int w = width() - 4; + const qreal xd = static_cast(w) / frames; + const qreal half_h = -( height() - 6 ) / 3.0 * static_cast(master_output) - 1; + int x_base = 2; + const qreal y_base = height() / 2 - 0.5; + for( ch_cnt_t ch = 0; ch < DEFAULT_CHANNELS; ++ch ) { for( int frame = 0; frame < frames; ++frame ) { + sample_t const clippedSample = Mixer::clip(m_buffer[frame][ch]); m_points[frame] = QPointF( - x_base + (float) frame * xd, - y_base + ( Mixer::clip( - m_buffer[frame][ch] ) * - half_h ) ); + x_base + static_cast(frame) * xd, + y_base + ( static_cast(clippedSample) * half_h ) ); } p.drawPolyline( m_points, frames ); } @@ -187,7 +204,21 @@ void VisualizationWidget::mousePressEvent( QMouseEvent * _me ) } - +QColor const & VisualizationWidget::determineLineColor(float level) const +{ + if( level < 0.9f ) + { + return normalColor(); + } + else if( level < 1.0f ) + { + return warningColor(); + } + else + { + return clippingColor(); + } +}