# HG changeset patch # User Chris Cannam # Date 1386093520 0 # Node ID ad12e428785b4d13306e20b749bc08a207f63694 # Parent 212644efa523f61316450bc6ee92f3f5158f68f3# Parent 81c4c44ecc103ac4ca8fdb61de0d8fd4e31a3456 Merge from default branch diff -r 212644efa523 -r ad12e428785b layer/FlexiNoteLayer.cpp --- a/layer/FlexiNoteLayer.cpp Fri Nov 29 14:51:47 2013 +0000 +++ b/layer/FlexiNoteLayer.cpp Tue Dec 03 17:58:40 2013 +0000 @@ -24,6 +24,7 @@ #include "base/RangeMapper.h" #include "ColourDatabase.h" #include "view/View.h" +#include "PianoScale.h" #include "data/model/FlexiNoteModel.h" @@ -856,6 +857,22 @@ paint.restore(); } +int +NoteLayer::getVerticalScaleWidth(View *, bool, QPainter &paint) const +{ + return 10; +} + +void +NoteLayer::paintVerticalScale(View *v, bool, QPainter &paint, QRect) const +{ + float fmin, fmax; + getDisplayExtents(fmin, fmax); + PianoScale().paintPianoVertical + (v, paint, QRect(0, 0, 10, v->height()), fmin, fmax); + paint.drawLine(10, 0, 10, v->height()); +} + void FlexiNoteLayer::drawStart(View *v, QMouseEvent *e) { diff -r 212644efa523 -r ad12e428785b layer/FlexiNoteLayer.h --- a/layer/FlexiNoteLayer.h Fri Nov 29 14:51:47 2013 +0000 +++ b/layer/FlexiNoteLayer.h Tue Dec 03 17:58:40 2013 +0000 @@ -36,6 +36,9 @@ virtual void paint(View *v, QPainter &paint, QRect rect) const; + virtual int getVerticalScaleWidth(View *v, bool, QPainter &) const; + virtual void paintVerticalScale(View *v, bool, QPainter &paint, QRect rect) const; + virtual QString getFeatureDescription(View *v, QPoint &) const; virtual bool snapToFeatureFrame(View *v, int &frame, @@ -121,8 +124,6 @@ virtual void setVerticalZoomStep(int); virtual RangeMapper *getNewVerticalZoomRangeMapper() const; - virtual int getVerticalScaleWidth(View *, bool, QPainter &) const { return 0; } - /** * Add a note-on. Used when recording MIDI "live". The note will * not be finally added to the layer until the corresponding diff -r 212644efa523 -r ad12e428785b layer/NoteLayer.cpp --- a/layer/NoteLayer.cpp Fri Nov 29 14:51:47 2013 +0000 +++ b/layer/NoteLayer.cpp Tue Dec 03 17:58:40 2013 +0000 @@ -23,6 +23,7 @@ #include "base/RangeMapper.h" #include "ColourDatabase.h" #include "view/View.h" +#include "PianoScale.h" #include "data/model/NoteModel.h" @@ -813,6 +814,22 @@ paint.restore(); } +int +NoteLayer::getVerticalScaleWidth(View *, bool, QPainter &paint) const +{ + return 10; +} + +void +NoteLayer::paintVerticalScale(View *v, bool, QPainter &paint, QRect) const +{ + float fmin, fmax; + getDisplayExtents(fmin, fmax); + PianoScale().paintPianoVertical + (v, paint, QRect(0, 0, 10, v->height()), fmin, fmax); + paint.drawLine(10, 0, 10, v->height()); +} + void NoteLayer::drawStart(View *v, QMouseEvent *e) { diff -r 212644efa523 -r ad12e428785b layer/NoteLayer.h --- a/layer/NoteLayer.h Fri Nov 29 14:51:47 2013 +0000 +++ b/layer/NoteLayer.h Tue Dec 03 17:58:40 2013 +0000 @@ -34,6 +34,9 @@ virtual void paint(View *v, QPainter &paint, QRect rect) const; + virtual int getVerticalScaleWidth(View *v, bool, QPainter &) const; + virtual void paintVerticalScale(View *v, bool, QPainter &paint, QRect rect) const; + virtual QString getFeatureDescription(View *v, QPoint &) const; virtual bool snapToFeatureFrame(View *v, int &frame, @@ -102,8 +105,6 @@ virtual void setVerticalZoomStep(int); virtual RangeMapper *getNewVerticalZoomRangeMapper() const; - virtual int getVerticalScaleWidth(View *, bool, QPainter &) const { return 0; } - /** * Add a note-on. Used when recording MIDI "live". The note will * not be finally added to the layer until the corresponding diff -r 212644efa523 -r ad12e428785b layer/PianoScale.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/layer/PianoScale.cpp Tue Dec 03 17:58:40 2013 +0000 @@ -0,0 +1,85 @@ +/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ + +/* + Sonic Visualiser + An audio file viewer and annotation editor. + Centre for Digital Music, Queen Mary, University of London. + This file copyright 2006-2013 Chris Cannam and QMUL. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. See the file + COPYING included with this distribution for more information. +*/ + +#include "PianoScale.h" + +#include + +#include + +#include "base/Pitch.h" + +#include "view/View.h" + +void +PianoScale::paintPianoVertical(View *v, + QPainter &paint, + QRect r, + float minf, + float maxf) +{ + int x0 = r.x(), y0 = r.y(), x1 = r.x() + r.width(), y1 = r.y() + r.height(); + + paint.drawLine(x0, y0, x0, y1); + + int py = y1, ppy = y1; + paint.setBrush(paint.pen().color()); + + for (int i = 0; i < 128; ++i) { + + float f = Pitch::getFrequencyForPitch(i); + int y = lrintf(v->getYForFrequency(f, minf, maxf, true)); + + if (y < y0 - 2) break; + if (y > y1 + 2) { + continue; + } + + int n = (i % 12); + + if (n == 1) { + // C# -- fill the C from here + QColor col = Qt::gray; + if (i == 61) { // filling middle C + col = Qt::blue; + col = col.light(150); + } + if (ppy - y > 2) { + paint.fillRect(x0 + 1, + y, + x1 - x0, + (py + ppy) / 2 - y, + col); + } + } + + if (n == 1 || n == 3 || n == 6 || n == 8 || n == 10) { + // black notes + paint.drawLine(x0 + 1, y, x1, y); + int rh = ((py - y) / 4) * 2; + if (rh < 2) rh = 2; + paint.drawRect(x0 + 1, y - (py-y)/4, (x1 - x0) / 2, rh); + } else if (n == 0 || n == 5) { + // C, F + if (py < y1) { + paint.drawLine(x0 + 1, (y + py) / 2, x1, (y + py) / 2); + } + } + + ppy = py; + py = y; + } +} + diff -r 212644efa523 -r ad12e428785b layer/PianoScale.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/layer/PianoScale.h Tue Dec 03 17:58:40 2013 +0000 @@ -0,0 +1,34 @@ +/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ + +/* + Sonic Visualiser + An audio file viewer and annotation editor. + Centre for Digital Music, Queen Mary, University of London. + This file copyright 2006-2013 Chris Cannam and QMUL. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. See the file + COPYING included with this distribution for more information. +*/ + +#ifndef PIANO_SCALE_H +#define PIANO_SCALE_H + +#include + +class QPainter; +class View; + +class PianoScale +{ +public: + void paintPianoVertical + (View *v, QPainter &paint, QRect rect, float minf, float maxf); +}; + +#endif + + + diff -r 212644efa523 -r ad12e428785b layer/SpectrogramLayer.cpp --- a/layer/SpectrogramLayer.cpp Fri Nov 29 14:51:47 2013 +0000 +++ b/layer/SpectrogramLayer.cpp Tue Dec 03 17:58:40 2013 +0000 @@ -27,6 +27,7 @@ #include "ColourMapper.h" #include "ImageRegionFinder.h" #include "data/model/Dense3DModelPeakCache.h" +#include "PianoScale.h" #include #include @@ -3435,58 +3436,9 @@ // piano keyboard - paint.drawLine(w - pkw - 1, 0, w - pkw - 1, h); - - float minf = getEffectiveMinFrequency(); - float maxf = getEffectiveMaxFrequency(); - - int py = h, ppy = h; - paint.setBrush(paint.pen().color()); - - for (int i = 0; i < 128; ++i) { - - float f = Pitch::getFrequencyForPitch(i); - int y = lrintf(v->getYForFrequency(f, minf, maxf, true)); - - if (y < -2) break; - if (y > h + 2) { - continue; - } - - int n = (i % 12); - - if (n == 1) { - // C# -- fill the C from here - QColor col = Qt::gray; - if (i == 61) { // filling middle C - col = Qt::blue; - col = col.light(150); - } - if (ppy - y > 2) { - paint.fillRect(w - pkw, - y, - pkw, - (py + ppy) / 2 - y, - col); - } - } - - if (n == 1 || n == 3 || n == 6 || n == 8 || n == 10) { - // black notes - paint.drawLine(w - pkw, y, w, y); - int rh = ((py - y) / 4) * 2; - if (rh < 2) rh = 2; - paint.drawRect(w - pkw, y - (py-y)/4, pkw/2, rh); - } else if (n == 0 || n == 5) { - // C, F - if (py < h) { - paint.drawLine(w - pkw, (y + py) / 2, w, (y + py) / 2); - } - } - - ppy = py; - py = y; - } + PianoScale().paintPianoVertical + (v, paint, QRect(w - pkw - 1, 0, pkw, h), + getEffectiveMinFrequency(), getEffectiveMaxFrequency()); } m_haveDetailedScale = detailed; diff -r 212644efa523 -r ad12e428785b layer/TimeValueLayer.cpp --- a/layer/TimeValueLayer.cpp Fri Nov 29 14:51:47 2013 +0000 +++ b/layer/TimeValueLayer.cpp Tue Dec 03 17:58:40 2013 +0000 @@ -30,6 +30,7 @@ #include "widgets/ListInputDialog.h" #include "ColourMapper.h" +#include "PianoScale.h" #include #include @@ -1179,9 +1180,11 @@ ++pointCount; } - if ((m_plotStyle == PlotCurve || m_plotStyle == PlotDiscreteCurves || - m_plotStyle == PlotLines) - && !path.isEmpty()) { + if (m_plotStyle == PlotDiscreteCurves) { + paint.setRenderHint(QPainter::Antialiasing, true); + paint.drawPath(path); + } else if ((m_plotStyle == PlotCurve || m_plotStyle == PlotLines) + && !path.isEmpty()) { paint.setRenderHint(QPainter::Antialiasing, pointCount <= v->width()); paint.drawPath(path); } @@ -1336,6 +1339,16 @@ paint.drawText(5, 5 + paint.fontMetrics().ascent(), m_model->getScaleUnits()); } + + if (logarithmic && + (m_model->getScaleUnits() == "Hz") && + (m_plotStyle != PlotSegmentation)) { + float fmin, fmax; + getDisplayExtents(fmin, fmax); + PianoScale().paintPianoVertical + (v, paint, QRect(w, 0, 10, h), fmin, fmax); + paint.drawLine(w + 10, 0, w + 10, h); + } } void diff -r 212644efa523 -r ad12e428785b svgui.pro --- a/svgui.pro Fri Nov 29 14:51:47 2013 +0000 +++ b/svgui.pro Tue Dec 03 17:58:40 2013 +0000 @@ -37,6 +37,7 @@ layer/NoteLayer.h \ layer/FlexiNoteLayer.h \ layer/PaintAssistant.h \ + layer/PianoScale.h \ layer/RegionLayer.h \ layer/SingleColourLayer.h \ layer/SliceableLayer.h \ @@ -58,6 +59,7 @@ layer/NoteLayer.cpp \ layer/FlexiNoteLayer.cpp \ layer/PaintAssistant.cpp \ + layer/PianoScale.cpp \ layer/RegionLayer.cpp \ layer/SingleColourLayer.cpp \ layer/SliceLayer.cpp \ diff -r 212644efa523 -r ad12e428785b view/ViewManager.cpp --- a/view/ViewManager.cpp Fri Nov 29 14:51:47 2013 +0000 +++ b/view/ViewManager.cpp Tue Dec 03 17:58:40 2013 +0000 @@ -454,6 +454,9 @@ void ViewManager::playStatusChanged(bool /* playing */) { +#ifdef DEBUG_VIEW_MANAGER + cerr << "ViewManager::playStatusChanged" << endl; +#endif checkPlayStatus(); } @@ -483,8 +486,6 @@ } else { - QTimer::singleShot(100, this, SLOT(checkPlayStatus())); - if (m_lastLeft != 0.0 || m_lastRight != 0.0) { emit outputLevelsChanged(0.0, 0.0); m_lastLeft = 0.0; @@ -492,7 +493,7 @@ } #ifdef DEBUG_VIEW_MANAGER -// cerr << "ViewManager::checkPlayStatus: Not playing" << endl; + cerr << "ViewManager::checkPlayStatus: Not playing" << endl; #endif } } diff -r 212644efa523 -r ad12e428785b view/ViewManager.h --- a/view/ViewManager.h Fri Nov 29 14:51:47 2013 +0000 +++ b/view/ViewManager.h Tue Dec 03 17:58:40 2013 +0000 @@ -249,10 +249,10 @@ void viewZoomLevelChanged(unsigned long, bool); void setGlobalCentreFrame(unsigned long); void setPlaybackFrame(unsigned long); + void playStatusChanged(bool playing); protected slots: void checkPlayStatus(); - void playStatusChanged(bool playing); void seek(unsigned long); //!!! void considerZoomChange(void *, unsigned long, bool);