diff options
author | Robert Jonsson <spamatica@gmail.com> | 2011-04-27 18:41:35 +0000 |
---|---|---|
committer | Robert Jonsson <spamatica@gmail.com> | 2011-04-27 18:41:35 +0000 |
commit | d8ac618f4dc9afd0731a9a3531d4641c9e7ea6fd (patch) | |
tree | 559d73385e4c65bc4bc23e9fe0617680cb2c5ed3 /muse2/muse/widgets | |
parent | 499ccec21dd2ac636fb019c98a902c351b4ec165 (diff) |
feedback parameters
Diffstat (limited to 'muse2/muse/widgets')
-rw-r--r-- | muse2/muse/widgets/CMakeLists.txt | 8 | ||||
-rw-r--r-- | muse2/muse/widgets/meter.cpp | 217 | ||||
-rw-r--r-- | muse2/muse/widgets/meter.h | 49 | ||||
-rw-r--r-- | muse2/muse/widgets/verticalmeter.cpp | 209 | ||||
-rw-r--r-- | muse2/muse/widgets/verticalmeter.h | 43 |
5 files changed, 524 insertions, 2 deletions
diff --git a/muse2/muse/widgets/CMakeLists.txt b/muse2/muse/widgets/CMakeLists.txt index e3921f70..261c27a2 100644 --- a/muse2/muse/widgets/CMakeLists.txt +++ b/muse2/muse/widgets/CMakeLists.txt @@ -42,6 +42,7 @@ QT4_WRAP_CPP (widget_mocs intlabel.h knob.h lcombo.h + meter.h metronome.h midisyncimpl.h mixdowndialog.h @@ -75,7 +76,8 @@ QT4_WRAP_CPP (widget_mocs # ttoolbar.h ttoolbutton.h velocity.h - view.h + verticalmeter.h + view.h vscale.h visibletracks.h ) @@ -137,6 +139,7 @@ file (GLOB widgets_source_files intlabel.cpp knob.cpp lcombo.cpp + meter.cpp metronome.cpp midisyncimpl.cpp mixdowndialog.cpp @@ -174,7 +177,8 @@ file (GLOB widgets_source_files ttoolbutton.cpp utils.cpp velocity.cpp - view.cpp + verticalmeter.cpp + view.cpp vscale.cpp visibletracks.cpp ) diff --git a/muse2/muse/widgets/meter.cpp b/muse2/muse/widgets/meter.cpp new file mode 100644 index 00000000..6619d1dc --- /dev/null +++ b/muse2/muse/widgets/meter.cpp @@ -0,0 +1,217 @@ +//========================================================= +// MusE +// Linux Music Editor +// $Id: meter.cpp,v 1.4.2.2 2009/05/03 04:14:00 terminator356 Exp $ +// +// (C) Copyright 2000 Werner Schweer (ws@seh.de) +//========================================================= + +#include <stdio.h> +#include <cmath> + +#include <QMouseEvent> +#include <QPainter> +#include <QResizeEvent> + +#include "meter.h" +#include "gconfig.h" +#include "fastlog.h" + +//--------------------------------------------------------- +// Meter +//--------------------------------------------------------- + +Meter::Meter(QWidget* parent, MeterType type) + : QFrame(parent) //Qt::WNoAutoErase + { + setBackgroundRole(QPalette::NoRole); + setAttribute(Qt::WA_NoSystemBackground); + setAttribute(Qt::WA_StaticContents); + // This is absolutely required for speed! Otherwise painfully slow because we get + // full rect paint events even on small scrolls! See help on QPainter::scroll(). + setAttribute(Qt::WA_OpaquePaintEvent); + + mtype = type; + overflow = false; + val = 0.0; + maxVal = 0.0; + minScale = mtype == DBMeter ? config.minMeter : 0.0; // min value in dB or int + maxScale = mtype == DBMeter ? 10.0 : 127.0; + yellowScale = -10; + redScale = 0; + setLineWidth(0); + setMidLineWidth(0); + } + +//--------------------------------------------------------- +// setVal +//--------------------------------------------------------- + +void Meter::setVal(double v, double max, bool ovl) + { + overflow = ovl; + bool ud = false; + + if(mtype == DBMeter) + { + double minScaleLin = pow(10.0, minScale/20.0); + if((v >= minScaleLin && val != v) || val >= minScaleLin) + { + val = v; + ud = true; + } + } + else + { + if(val != v) + { + val = v; + ud = true; + } + } + + if(maxVal != max) + { + maxVal = max; + ud = true; + } + + if(ud) + update(); + } +//--------------------------------------------------------- +// resetPeaks +// reset peak and overflow indicator +//--------------------------------------------------------- + +void Meter::resetPeaks() + { + maxVal = val; + overflow = val > 0.0; + update(); + } + +//--------------------------------------------------------- +// setRange +//--------------------------------------------------------- + +void Meter::setRange(double min, double max) + { + minScale = min; + maxScale = max; + update(); + } + +//--------------------------------------------------------- +// paintEvent +//--------------------------------------------------------- + +void Meter::paintEvent(QPaintEvent* /*ev*/) + { + // TODO: Could make better use of event rectangle, for speed. + + QPainter p(this); + + double range = maxScale - minScale; + + int fw = frameWidth(); + int w = width() - 2*fw; + int h = height() - 2*fw; + int yv; + + if(mtype == DBMeter) + yv = val == 0 ? h : int(((maxScale - (fast_log10(val) * 20.0)) * h)/range); + else + yv = val == 0 ? h : int(((maxScale - val) * h)/range); + + if(yv > h) yv = h; + + // Draw the red, green, and yellow sections. + drawVU(p, w, h, yv); + + // Draw the peak white line. + int ymax; + if(mtype == DBMeter) + ymax = maxVal == 0 ? 0 : int(((maxScale - (fast_log10(maxVal) * 20.0)) * h)/range); + else + ymax = maxVal == 0 ? 0 : int(((maxScale - maxVal) * h)/range); + p.setPen(Qt::white); + p.drawLine(0, ymax, w, ymax); + } + +//--------------------------------------------------------- +// drawVU +//--------------------------------------------------------- + +void Meter::drawVU(QPainter& p, int w, int h, int yv) +{ + if(mtype == DBMeter) + { + double range = maxScale - minScale; + int y1 = int((maxScale - redScale) * h / range); + int y2 = int((maxScale - yellowScale) * h / range); + + if(yv < y1) + { + // Red section: + p.fillRect(0, 0, w, yv, QBrush(0x8e0000)); // dark red + p.fillRect(0, yv, w, y1-yv, QBrush(0xff0000)); // light red + + // Yellow section: + p.fillRect(0, y1, w, y2-y1, QBrush(0xffff00)); // light yellow + + // Green section: + p.fillRect(0, y2, w, h-y2, QBrush(0x00ff00)); // light green + } + else + if(yv < y2) + { + // Red section: + p.fillRect(0, 0, w, y1, QBrush(0x8e0000)); // dark red + + // Yellow section: + p.fillRect(0, y1, w, yv-y1, QBrush(0x8e8e00)); // dark yellow + p.fillRect(0, yv, w, y2-yv, QBrush(0xffff00)); // light yellow + + // Green section: + p.fillRect(0, y2, w, h-y2, QBrush(0x00ff00)); // light green + } + else + //if(yv <= y3) + { + // Red section: + p.fillRect(0, 0, w, y1, QBrush(0x8e0000)); // dark red + + // Yellow section: + p.fillRect(0, y1, w, y2-y1, QBrush(0x8e8e00)); // dark yellow + + // Green section: + p.fillRect(0, y2, w, yv-y2, QBrush(0x007000)); // dark green + p.fillRect(0, yv, w, h-yv, QBrush(0x00ff00)); // light green + } + } + else + { + p.fillRect(0, 0, w, yv, QBrush(0x007000)); // dark green + p.fillRect(0, yv, w, h-yv, QBrush(0x00ff00)); // light green + } +} + +//--------------------------------------------------------- +// resizeEvent +//--------------------------------------------------------- + +void Meter::resizeEvent(QResizeEvent* /*ev*/) + { + + } + +//--------------------------------------------------------- +// mousePressEvent +//--------------------------------------------------------- + +void Meter::mousePressEvent(QMouseEvent*) + { + emit mousePress(); + } + diff --git a/muse2/muse/widgets/meter.h b/muse2/muse/widgets/meter.h new file mode 100644 index 00000000..2b816040 --- /dev/null +++ b/muse2/muse/widgets/meter.h @@ -0,0 +1,49 @@ +//========================================================= +// MusE +// Linux Music Editor +// $Id: meter.h,v 1.1.1.1.2.2 2009/05/03 04:14:00 terminator356 Exp $ +// +// (C) Copyright 2000 Werner Schweer (ws@seh.de) +//========================================================= + +#ifndef __METER_H__ +#define __METER_H__ + +#include <QFrame> + +class QResizeEvent; +class QMouseEvent; +class QPainter; + + +class Meter : public QFrame { + public: + enum MeterType {DBMeter, LinMeter}; + private: + MeterType mtype; + bool overflow; + double val; + double maxVal; + double minScale, maxScale; + int yellowScale, redScale; + + void drawVU(QPainter& p, int, int, int); + + Q_OBJECT + void paintEvent(QPaintEvent*); + void resizeEvent(QResizeEvent*); + void mousePressEvent(QMouseEvent*); + + public slots: + void resetPeaks(); + void setVal(double, double, bool); + + signals: + void mousePress(); + + public: + Meter(QWidget* parent, MeterType type = DBMeter); + void setRange(double min, double max); + }; +#endif + diff --git a/muse2/muse/widgets/verticalmeter.cpp b/muse2/muse/widgets/verticalmeter.cpp new file mode 100644 index 00000000..ca846886 --- /dev/null +++ b/muse2/muse/widgets/verticalmeter.cpp @@ -0,0 +1,209 @@ +//========================================================= +// MusE +// Linux Music Editor +// $Id: meter.cpp,v 1.4.2.2 2009/05/03 04:14:00 terminator356 Exp $ +// +// (C) Copyright 2000 Werner Schweer (ws@seh.de) +//========================================================= + +#include <stdio.h> +#include <cmath> + +#include <QMouseEvent> +#include <QPainter> +#include <QResizeEvent> + +#include "verticalmeter.h" +#include "gconfig.h" +#include "fastlog.h" + +//--------------------------------------------------------- +// VerticalMeter +//--------------------------------------------------------- + +VerticalMeter::VerticalMeter(QWidget* parent, MeterType type) + : Meter(parent, type) //Qt::WNoAutoErase + { + setBackgroundRole(QPalette::NoRole); + setAttribute(Qt::WA_NoSystemBackground); + setAttribute(Qt::WA_StaticContents); + // This is absolutely required for speed! Otherwise painfully slow because we get + // full rect paint events even on small scrolls! See help on QPainter::scroll(). + setAttribute(Qt::WA_OpaquePaintEvent); + + mtype = type; + overflow = false; + val = 0.0; + maxVal = 0.0; + minScale = mtype == DBMeter ? config.minMeter : 0.0; // min value in dB or int + maxScale = mtype == DBMeter ? 10.0 : 127.0; + yellowScale = -10; + redScale = 0; + setLineWidth(0); + setMidLineWidth(0); + } + + +//--------------------------------------------------------- +// setVal +//--------------------------------------------------------- + +void VerticalMeter::setVal(double v) //, double max, bool ovl) + { + //overflow = ovl; + bool ud = false; + + if(mtype == DBMeter) + { + double minScaleLin = pow(10.0, minScale/20.0); + if((v >= minScaleLin && val != v) || val >= minScaleLin) + { + val = v; + ud = true; + } + } + else + { + if(val != v) + { + val = v; + ud = true; + } + } + +// if(maxVal != max) +// { +// maxVal = max; +// ud = true; +// } + + if(ud) + update(); + } +//--------------------------------------------------------- +// resetPeaks +// reset peak and overflow indicator +//--------------------------------------------------------- + +void VerticalMeter::resetPeaks() + { + maxVal = val; + overflow = val > 0.0; + update(); + } + +//--------------------------------------------------------- +// setRange +//--------------------------------------------------------- + +void VerticalMeter::setRange(double min, double max) + { + minScale = min; + maxScale = max; + update(); + } + +//--------------------------------------------------------- +// paintEvent +//--------------------------------------------------------- + +void VerticalMeter::paintEvent(QPaintEvent* /*ev*/) + { + // TODO: Could make better use of event rectangle, for speed. + + QPainter p(this); + + double range = maxScale - minScale; + + int fw = frameWidth(); + int w = width() - 2*fw; + int h = height() - 2*fw; + int xv; + + + if(mtype == DBMeter) + xv = val == 0 ? w : int(((maxScale - (fast_log10(val) * 20.0)) * w)/range); + else + xv = val == 0 ? w : int(((maxScale - val) * w)/range); + + if(xv > w) xv = w; + + // Draw the red, green, and yellow sections. + drawVU(p, w, h, xv); + + // Draw the peak white line. + int xcenter; + if(mtype == DBMeter) + xcenter = maxVal == 0 ? 0 : int(((maxScale - (fast_log10(0) * 20.0)) * w)/range); + else + xcenter = maxVal == 0 ? 0 : int(((0) * w)/range); + p.setPen(Qt::white); + p.drawLine(xcenter, 0, xcenter, h); + } + +//--------------------------------------------------------- +// drawVU +//--------------------------------------------------------- + +void VerticalMeter::drawVU(QPainter& p, int w, int h, int xv) +{ + if(mtype == DBMeter) + { + double range = maxScale - minScale; + int x1 = int((maxScale - redScale) * w / range); + int x2 = int((maxScale - yellowScale) * w / range); + + if(xv < x1) + { + // Red section: + p.fillRect(0, 0, xv, h, QBrush(0x8e0000)); // dark red + p.fillRect(xv, 0, x1-xv, h, QBrush(0xff0000)); // light red + + // Yellow section: + p.fillRect(x1, 0, x2-x1, h, QBrush(0xffff00)); // light yellow + + // Green section: + p.fillRect(x2, 0, w-x2, h, QBrush(0x00ff00)); // light green + } + else + if(xv < x2) + { + // Red section: + p.fillRect(0, 0, x1, h, QBrush(0x8e0000)); // dark red + + // Yellow section: + p.fillRect(x1, 0, xv-x1, h, QBrush(0x8e8e00)); // dark yellow + p.fillRect(xv, 0, x2-xv, h, QBrush(0xffff00)); // light yellow + + // Green section: + p.fillRect(x2, 0, w-x2, h, QBrush(0x00ff00)); // light green + } + else + //if(yv <= y3) + { + // Red section: + p.fillRect(0, 0, x1, h, QBrush(0x8e0000)); // dark red + + // Yellow section: + p.fillRect(x1, 0, x2-x1, h, QBrush(0x8e8e00)); // dark yellow + + // Green section: + p.fillRect(x2, 0, xv-x2, h, QBrush(0x007000)); // dark green + p.fillRect(xv, 0, w-xv, h, QBrush(0x00ff00)); // light green + } + } + else + { + p.fillRect(0, 0, xv, h, QBrush(0x00ff00)); // dark green + p.fillRect(xv, 0, w-xv, h, QBrush(0x007000)); // light green + } +} + +//--------------------------------------------------------- +// resizeEvent +//--------------------------------------------------------- + +void VerticalMeter::resizeEvent(QResizeEvent* /*ev*/) + { + + } diff --git a/muse2/muse/widgets/verticalmeter.h b/muse2/muse/widgets/verticalmeter.h new file mode 100644 index 00000000..699be1e5 --- /dev/null +++ b/muse2/muse/widgets/verticalmeter.h @@ -0,0 +1,43 @@ +//========================================================= +// MusE +// Linux Music Editor +// $Id: meter.h,v 1.1.1.1.2.2 2009/05/03 04:14:00 terminator356 Exp $ +// +// (C) Copyright 2000 Werner Schweer (ws@seh.de) +//========================================================= + +#ifndef __VERTICALMETER_H__ +#define __VERTICALMETER_H__ + +#include <QFrame> +#include "meter.h" + +class QResizeEvent; +class QMouseEvent; +class QPainter; + +class VerticalMeter : public Meter { + private: + MeterType mtype; + bool overflow; + double val; + double maxVal; + double minScale, maxScale; + int yellowScale, redScale; + + void drawVU(QPainter& p, int, int, int); + + Q_OBJECT + void paintEvent(QPaintEvent*); + void resizeEvent(QResizeEvent*); + + public slots: + void resetPeaks(); + void setVal(double); + + public: + VerticalMeter(QWidget* parent, MeterType type = DBMeter); + void setRange(double min, double max); + }; +#endif + |