annotate data/model/DenseThreeDimensionalModel.h @ 892:451f7f3ab6e7

Make octave numbering configurable, and change default to C4 = middle C
author Chris Cannam
date Thu, 27 Mar 2014 13:32:56 +0000
parents 68f3eaefe297
children 59e7fe1b1003
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@152 36 virtual size_t 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@182 41 virtual size_t getWidth() const = 0;
Chris@147 42
Chris@147 43 /**
Chris@182 44 * Return the number of bins in each column.
Chris@182 45 */
Chris@182 46 virtual size_t 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@182 58 /**
Chris@182 59 * Return true if there are data available for the given column.
Chris@223 60 * This should return true only if getColumn(column) would not
Chris@223 61 * have to do any substantial work to calculate its return values.
Chris@223 62 * If this function returns false, it may still be possible to
Chris@223 63 * retrieve the column, but its values may have to be calculated.
Chris@182 64 */
Chris@182 65 virtual bool isColumnAvailable(size_t column) const = 0;
Chris@182 66
Chris@533 67 typedef QVector<float> Column;
Chris@147 68
Chris@147 69 /**
Chris@182 70 * Get data from the given column of bin values.
Chris@147 71 */
Chris@533 72 virtual Column getColumn(size_t column) const = 0;
Chris@147 73
Chris@147 74 /**
Chris@182 75 * Get the single data point from the n'th bin of the given column.
Chris@147 76 */
Chris@182 77 virtual float getValueAt(size_t column, size_t n) const = 0;
Chris@147 78
Chris@182 79 /**
Chris@182 80 * Get the name of a given bin (i.e. a label to associate with
Chris@182 81 * that bin across all columns).
Chris@182 82 */
Chris@152 83 virtual QString getBinName(size_t n) const = 0;
Chris@147 84
Chris@182 85 /**
Chris@887 86 * Return true if the bins have values as well as names. If this
Chris@887 87 * returns true, getBinValue() may be used to retrieve the values.
Chris@887 88 */
Chris@887 89 virtual bool hasBinValues() const { return false; }
Chris@887 90
Chris@887 91 /**
Chris@887 92 * Return the value of bin n, if any. This is a "vertical scale"
Chris@887 93 * value which does not vary from one column to the next. This is
Chris@887 94 * only meaningful if hasBinValues() returns true.
Chris@887 95 */
Chris@887 96 virtual float getBinValue(size_t n) const { return n; }
Chris@887 97
Chris@887 98 /**
Chris@887 99 * Obtain the name of the unit of the values returned from
Chris@887 100 * getBinValue(), if any.
Chris@887 101 */
Chris@887 102 virtual QString getBinValueUnit() const { return ""; }
Chris@887 103
Chris@887 104 /**
Chris@478 105 * Estimate whether a logarithmic scale might be appropriate for
Chris@478 106 * the value scale.
Chris@478 107 */
Chris@478 108 virtual bool shouldUseLogValueScale() const = 0;
Chris@478 109
Chris@478 110 /**
Chris@182 111 * Utility function to query whether a given bin is greater than
Chris@182 112 * its (vertical) neighbours.
Chris@182 113 */
Chris@182 114 bool isLocalPeak(size_t x, size_t y) {
Chris@182 115 float value = getValueAt(x, y);
Chris@182 116 if (y > 0 && value < getValueAt(x, y - 1)) return false;
Chris@182 117 if (y < getHeight() - 1 && value < getValueAt(x, y + 1)) return false;
Chris@182 118 return true;
Chris@182 119 }
Chris@182 120
Chris@182 121 /**
Chris@182 122 * Utility function to query whether a given bin is greater than a
Chris@182 123 * certain threshold.
Chris@182 124 */
Chris@182 125 bool isOverThreshold(size_t x, size_t y, float threshold) {
Chris@182 126 return getValueAt(x, y) > threshold;
Chris@182 127 }
Chris@182 128
Chris@345 129 QString getTypeName() const { return tr("Dense 3-D"); }
Chris@345 130
Chris@152 131 virtual int getCompletion() const = 0;
Chris@147 132
Chris@500 133 /*
Chris@500 134 TabularModel methods.
Chris@500 135 This class is non-editable -- subclasses may be editable.
Chris@500 136 Row and column are transposed for the tabular view (which is
Chris@500 137 "on its side").
Chris@500 138 */
Chris@500 139
Chris@500 140 virtual int getRowCount() const { return getWidth(); }
Chris@500 141 virtual int getColumnCount() const { return getHeight() + 2; }
Chris@500 142
Chris@500 143 virtual QString getHeading(int column) const
Chris@500 144 {
Chris@500 145 switch (column) {
Chris@500 146 case 0: return tr("Time");
Chris@500 147 case 1: return tr("Frame");
Chris@500 148 default: return getBinName(column - 2);
Chris@500 149 }
Chris@500 150 }
Chris@500 151
Chris@568 152 virtual QVariant getData(int row, int column, int) const
Chris@500 153 {
Chris@500 154 switch (column) {
Chris@500 155 case 0: {
Chris@500 156 RealTime rt = RealTime::frame2RealTime(row * getResolution(),
Chris@500 157 getSampleRate());
Chris@500 158 return rt.toText().c_str();
Chris@500 159 }
Chris@500 160 case 1:
Chris@500 161 return int(row * getResolution());
Chris@500 162 default:
Chris@500 163 return getValueAt(row, column - 2);
Chris@500 164 }
Chris@500 165 }
Chris@500 166
Chris@500 167 virtual bool isColumnTimeValue(int col) const {
Chris@500 168 return col < 2;
Chris@500 169 }
Chris@568 170 virtual SortType getSortType(int) const {
Chris@500 171 return SortNumeric;
Chris@500 172 }
Chris@500 173
Chris@500 174 virtual long getFrameForRow(int row) const {
Chris@500 175 return row * getSampleRate();
Chris@500 176 }
Chris@500 177 virtual int getRowForFrame(long frame) const {
Chris@500 178 return frame / getSampleRate();
Chris@500 179 }
Chris@500 180
Chris@147 181 protected:
Chris@152 182 DenseThreeDimensionalModel() { }
Chris@147 183 };
Chris@147 184
Chris@147 185 #endif