annotate data/model/DenseThreeDimensionalModel.h @ 1186:12a8daa89970 spectrogram-minor-refactor

Mid-refactor to pull out the bulk of paintDrawBuffer into chunks
author Chris Cannam
date Mon, 13 Jun 2016 16:17:44 +0100
parents abb78e824820
children fd40a5335968
rev   line source
Chris@147 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@147 2
Chris@147 3 /*
Chris@147 4 Sonic Visualiser
Chris@147 5 An audio file viewer and annotation editor.
Chris@147 6 Centre for Digital Music, Queen Mary, University of London.
Chris@202 7 This file copyright 2006 Chris Cannam and QMUL.
Chris@147 8
Chris@147 9 This program is free software; you can redistribute it and/or
Chris@147 10 modify it under the terms of the GNU General Public License as
Chris@147 11 published by the Free Software Foundation; either version 2 of the
Chris@147 12 License, or (at your option) any later version. See the file
Chris@147 13 COPYING included with this distribution for more information.
Chris@147 14 */
Chris@147 15
Chris@147 16 #ifndef _DENSE_THREE_DIMENSIONAL_MODEL_H_
Chris@147 17 #define _DENSE_THREE_DIMENSIONAL_MODEL_H_
Chris@147 18
Chris@150 19 #include "Model.h"
Chris@500 20 #include "TabularModel.h"
Chris@147 21 #include "base/ZoomConstraint.h"
Chris@500 22 #include "base/RealTime.h"
Chris@147 23
Chris@147 24 #include <QMutex>
Chris@533 25 #include <QVector>
Chris@147 26
Chris@500 27 class DenseThreeDimensionalModel : public Model,
Chris@500 28 public TabularModel
Chris@147 29 {
Chris@147 30 Q_OBJECT
Chris@147 31
Chris@147 32 public:
Chris@147 33 /**
Chris@182 34 * Return the number of sample frames covered by each column of bins.
Chris@147 35 */
Chris@929 36 virtual int getResolution() const = 0;
Chris@147 37
Chris@147 38 /**
Chris@182 39 * Return the number of columns of bins in the model.
Chris@147 40 */
Chris@929 41 virtual int getWidth() const = 0;
Chris@147 42
Chris@147 43 /**
Chris@182 44 * Return the number of bins in each column.
Chris@182 45 */
Chris@929 46 virtual int getHeight() const = 0;
Chris@182 47
Chris@182 48 /**
Chris@182 49 * Return the minimum permissible value in each bin.
Chris@147 50 */
Chris@152 51 virtual float getMinimumLevel() const = 0;
Chris@147 52
Chris@147 53 /**
Chris@182 54 * Return the maximum permissible value in each bin.
Chris@147 55 */
Chris@152 56 virtual float getMaximumLevel() const = 0;
Chris@147 57
Chris@1154 58 typedef std::vector<float> Column;
Chris@147 59
Chris@147 60 /**
Chris@182 61 * Get data from the given column of bin values.
Chris@147 62 */
Chris@929 63 virtual Column getColumn(int column) const = 0;
Chris@147 64
Chris@147 65 /**
Chris@182 66 * Get the single data point from the n'th bin of the given column.
Chris@147 67 */
Chris@929 68 virtual float getValueAt(int column, int n) const = 0;
Chris@147 69
Chris@182 70 /**
Chris@182 71 * Get the name of a given bin (i.e. a label to associate with
Chris@182 72 * that bin across all columns).
Chris@182 73 */
Chris@929 74 virtual QString getBinName(int n) const = 0;
Chris@147 75
Chris@182 76 /**
Chris@887 77 * Return true if the bins have values as well as names. If this
Chris@887 78 * returns true, getBinValue() may be used to retrieve the values.
Chris@887 79 */
Chris@887 80 virtual bool hasBinValues() const { return false; }
Chris@887 81
Chris@887 82 /**
Chris@887 83 * Return the value of bin n, if any. This is a "vertical scale"
Chris@887 84 * value which does not vary from one column to the next. This is
Chris@887 85 * only meaningful if hasBinValues() returns true.
Chris@887 86 */
Chris@1038 87 virtual float getBinValue(int n) const { return float(n); }
Chris@887 88
Chris@887 89 /**
Chris@887 90 * Obtain the name of the unit of the values returned from
Chris@887 91 * getBinValue(), if any.
Chris@887 92 */
Chris@887 93 virtual QString getBinValueUnit() const { return ""; }
Chris@887 94
Chris@887 95 /**
Chris@478 96 * Estimate whether a logarithmic scale might be appropriate for
Chris@478 97 * the value scale.
Chris@478 98 */
Chris@478 99 virtual bool shouldUseLogValueScale() const = 0;
Chris@478 100
Chris@478 101 /**
Chris@182 102 * Utility function to query whether a given bin is greater than
Chris@182 103 * its (vertical) neighbours.
Chris@182 104 */
Chris@929 105 bool isLocalPeak(int x, int y) {
Chris@182 106 float value = getValueAt(x, y);
Chris@182 107 if (y > 0 && value < getValueAt(x, y - 1)) return false;
Chris@182 108 if (y < getHeight() - 1 && value < getValueAt(x, y + 1)) return false;
Chris@182 109 return true;
Chris@182 110 }
Chris@182 111
Chris@182 112 /**
Chris@182 113 * Utility function to query whether a given bin is greater than a
Chris@182 114 * certain threshold.
Chris@182 115 */
Chris@929 116 bool isOverThreshold(int x, int y, float threshold) {
Chris@182 117 return getValueAt(x, y) > threshold;
Chris@182 118 }
Chris@182 119
Chris@345 120 QString getTypeName() const { return tr("Dense 3-D"); }
Chris@345 121
Chris@152 122 virtual int getCompletion() const = 0;
Chris@147 123
Chris@500 124 /*
Chris@500 125 TabularModel methods.
Chris@500 126 This class is non-editable -- subclasses may be editable.
Chris@500 127 Row and column are transposed for the tabular view (which is
Chris@500 128 "on its side").
Chris@500 129 */
Chris@500 130
Chris@500 131 virtual int getRowCount() const { return getWidth(); }
Chris@500 132 virtual int getColumnCount() const { return getHeight() + 2; }
Chris@500 133
Chris@500 134 virtual QString getHeading(int column) const
Chris@500 135 {
Chris@500 136 switch (column) {
Chris@500 137 case 0: return tr("Time");
Chris@500 138 case 1: return tr("Frame");
Chris@500 139 default: return getBinName(column - 2);
Chris@500 140 }
Chris@500 141 }
Chris@500 142
Chris@568 143 virtual QVariant getData(int row, int column, int) const
Chris@500 144 {
Chris@500 145 switch (column) {
Chris@500 146 case 0: {
Chris@1171 147 RealTime rt = RealTime::frame2RealTime
Chris@1171 148 (row * getResolution() + getStartFrame(), getSampleRate());
Chris@500 149 return rt.toText().c_str();
Chris@500 150 }
Chris@500 151 case 1:
Chris@1171 152 return int(row * getResolution() + getStartFrame());
Chris@500 153 default:
Chris@500 154 return getValueAt(row, column - 2);
Chris@500 155 }
Chris@500 156 }
Chris@500 157
Chris@500 158 virtual bool isColumnTimeValue(int col) const {
Chris@500 159 return col < 2;
Chris@500 160 }
Chris@568 161 virtual SortType getSortType(int) const {
Chris@500 162 return SortNumeric;
Chris@500 163 }
Chris@500 164
Chris@1038 165 virtual sv_frame_t getFrameForRow(int row) const {
Chris@1171 166 return sv_frame_t(row) * getResolution() + getStartFrame();
Chris@500 167 }
Chris@1038 168 virtual int getRowForFrame(sv_frame_t frame) const {
Chris@1171 169 return int((frame - getStartFrame()) / getResolution());
Chris@500 170 }
Chris@500 171
Chris@147 172 protected:
Chris@152 173 DenseThreeDimensionalModel() { }
Chris@147 174 };
Chris@147 175
Chris@147 176 #endif