annotate data/model/DenseThreeDimensionalModel.h @ 1008:d9e0e59a1581

When using an aggregate model to pass data to a transform, zero-pad the shorter input to the duration of the longer rather than truncating the longer. (This is better behaviour for e.g. MATCH, and in any case the code was previously truncating incorrectly and ending up with garbage data at the end.)
author Chris Cannam
date Fri, 14 Nov 2014 13:51:33 +0000
parents f073d924a7c3
children cc27f35aa75c
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@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@929 65 virtual bool isColumnAvailable(int 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@929 72 virtual Column getColumn(int 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@929 77 virtual float getValueAt(int column, int 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@929 83 virtual QString getBinName(int 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@929 96 virtual float getBinValue(int 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@929 114 bool isLocalPeak(int x, int 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@929 125 bool isOverThreshold(int x, int 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@985 175 return row * getResolution();
Chris@500 176 }
Chris@500 177 virtual int getRowForFrame(long frame) const {
Chris@985 178 return frame / getResolution();
Chris@500 179 }
Chris@500 180
Chris@147 181 protected:
Chris@152 182 DenseThreeDimensionalModel() { }
Chris@147 183 };
Chris@147 184
Chris@147 185 #endif