Mercurial > hg > svgui
changeset 690:8072264dc61f
Pull out PianoScale into separate class
author | Chris Cannam |
---|---|
date | Tue, 03 Dec 2013 17:32:25 +0000 |
parents | d8fc9659a206 |
children | 5674950ed82a |
files | layer/PianoScale.cpp layer/PianoScale.h layer/SpectrogramLayer.cpp svgui.pro |
diffstat | 4 files changed, 125 insertions(+), 52 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/layer/PianoScale.cpp Tue Dec 03 17:32:25 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 <QPainter> + +#include <cmath> + +#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; + } +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/layer/PianoScale.h Tue Dec 03 17:32:25 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 <QRect> + +class QPainter; +class View; + +class PianoScale +{ +public: + void paintPianoVertical + (View *v, QPainter &paint, QRect rect, float minf, float maxf); +}; + +#endif + + +
--- a/layer/SpectrogramLayer.cpp Tue Dec 03 12:34:38 2013 +0000 +++ b/layer/SpectrogramLayer.cpp Tue Dec 03 17:32:25 2013 +0000 @@ -27,6 +27,7 @@ #include "ColourMapper.h" #include "ImageRegionFinder.h" #include "data/model/Dense3DModelPeakCache.h" +#include "PianoScale.h" #include <QPainter> #include <QImage> @@ -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;
--- a/svgui.pro Tue Dec 03 12:34:38 2013 +0000 +++ b/svgui.pro Tue Dec 03 17:32:25 2013 +0000 @@ -36,6 +36,7 @@ layer/LayerFactory.h \ layer/NoteLayer.h \ layer/PaintAssistant.h \ + layer/PianoScale.h \ layer/RegionLayer.h \ layer/SingleColourLayer.h \ layer/SliceableLayer.h \ @@ -56,6 +57,7 @@ layer/LayerFactory.cpp \ layer/NoteLayer.cpp \ layer/PaintAssistant.cpp \ + layer/PianoScale.cpp \ layer/RegionLayer.cpp \ layer/SingleColourLayer.cpp \ layer/SliceLayer.cpp \