annotate data/model/EditableDenseThreeDimensionalModel.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 59e7fe1b1003
children cc27f35aa75c
rev   line source
Chris@152 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@152 2
Chris@152 3 /*
Chris@152 4 Sonic Visualiser
Chris@152 5 An audio file viewer and annotation editor.
Chris@152 6 Centre for Digital Music, Queen Mary, University of London.
Chris@202 7 This file copyright 2006 Chris Cannam and QMUL.
Chris@152 8
Chris@152 9 This program is free software; you can redistribute it and/or
Chris@152 10 modify it under the terms of the GNU General Public License as
Chris@152 11 published by the Free Software Foundation; either version 2 of the
Chris@152 12 License, or (at your option) any later version. See the file
Chris@152 13 COPYING included with this distribution for more information.
Chris@152 14 */
Chris@152 15
Chris@152 16 #ifndef _EDITABLE_DENSE_THREE_DIMENSIONAL_MODEL_H_
Chris@152 17 #define _EDITABLE_DENSE_THREE_DIMENSIONAL_MODEL_H_
Chris@152 18
Chris@152 19 #include "DenseThreeDimensionalModel.h"
Chris@152 20
Chris@536 21 #include <QReadWriteLock>
Chris@536 22
Chris@533 23 #include <vector>
Chris@533 24
Chris@152 25 class EditableDenseThreeDimensionalModel : public DenseThreeDimensionalModel
Chris@152 26 {
Chris@152 27 Q_OBJECT
Chris@152 28
Chris@152 29 public:
Chris@535 30
Chris@535 31 // EditableDenseThreeDimensionalModel supports a basic compression
Chris@535 32 // method that reduces the size of multirate data (e.g. wavelet
Chris@535 33 // transform outputs) that are stored as plain 3d grids by about
Chris@535 34 // 60% or thereabouts. However, it can only be used for models
Chris@535 35 // whose columns are set in order from 0 and never subsequently
Chris@535 36 // changed. If the model is going to be actually edited, it must
Chris@535 37 // have NoCompression.
Chris@535 38
Chris@535 39 enum CompressionType
Chris@535 40 {
Chris@535 41 NoCompression,
Chris@535 42 BasicMultirateCompression
Chris@535 43 };
Chris@535 44
Chris@929 45 EditableDenseThreeDimensionalModel(int sampleRate,
Chris@929 46 int resolution,
Chris@929 47 int yBinCount,
Chris@535 48 CompressionType compression,
Chris@152 49 bool notifyOnAdd = true);
Chris@152 50
Chris@152 51 virtual bool isOK() const;
Chris@152 52
Chris@929 53 virtual int getSampleRate() const;
Chris@929 54 virtual int getStartFrame() const;
Chris@929 55 virtual int getEndFrame() const;
Chris@152 56
Chris@152 57 virtual Model *clone() const;
Chris@152 58
Chris@152 59
Chris@152 60 /**
Chris@611 61 * Set the frame offset of the first column.
Chris@611 62 */
Chris@929 63 virtual void setStartFrame(int);
Chris@611 64
Chris@611 65 /**
Chris@152 66 * Return the number of sample frames covered by each set of bins.
Chris@152 67 */
Chris@929 68 virtual int getResolution() const;
Chris@152 69
Chris@152 70 /**
Chris@152 71 * Set the number of sample frames covered by each set of bins.
Chris@152 72 */
Chris@929 73 virtual void setResolution(int sz);
Chris@152 74
Chris@152 75 /**
Chris@182 76 * Return the number of columns.
Chris@182 77 */
Chris@929 78 virtual int getWidth() const;
Chris@182 79
Chris@182 80 /**
Chris@152 81 * Return the number of bins in each set of bins.
Chris@152 82 */
Chris@929 83 virtual int getHeight() const;
Chris@152 84
Chris@152 85 /**
Chris@152 86 * Set the number of bins in each set of bins.
Chris@152 87 */
Chris@929 88 virtual void setHeight(int sz);
Chris@152 89
Chris@152 90 /**
Chris@152 91 * Return the minimum value of the value in each bin.
Chris@152 92 */
Chris@152 93 virtual float getMinimumLevel() const;
Chris@152 94
Chris@152 95 /**
Chris@152 96 * Set the minimum value of the value in a bin.
Chris@152 97 */
Chris@152 98 virtual void setMinimumLevel(float sz);
Chris@152 99
Chris@152 100 /**
Chris@152 101 * Return the maximum value of the value in each bin.
Chris@152 102 */
Chris@152 103 virtual float getMaximumLevel() const;
Chris@152 104
Chris@152 105 /**
Chris@152 106 * Set the maximum value of the value in a bin.
Chris@152 107 */
Chris@152 108 virtual void setMaximumLevel(float sz);
Chris@152 109
Chris@182 110 /**
Chris@182 111 * Return true if there are data available for the given column.
Chris@182 112 */
Chris@929 113 virtual bool isColumnAvailable(int x) const { return x < getWidth(); }
Chris@152 114
Chris@152 115 /**
Chris@182 116 * Get the set of bin values at the given column.
Chris@152 117 */
Chris@929 118 virtual Column getColumn(int x) const;
Chris@152 119
Chris@152 120 /**
Chris@182 121 * Get a single value, from the n'th bin of the given column.
Chris@152 122 */
Chris@929 123 virtual float getValueAt(int x, int n) const;
Chris@152 124
Chris@152 125 /**
Chris@182 126 * Set the entire set of bin values at the given column.
Chris@152 127 */
Chris@929 128 virtual void setColumn(int x, const Column &values);
Chris@152 129
Chris@881 130 /**
Chris@881 131 * Return the name of bin n. This is a single label per bin that
Chris@881 132 * does not vary from one column to the next.
Chris@881 133 */
Chris@929 134 virtual QString getBinName(int n) const;
Chris@881 135
Chris@881 136 /**
Chris@881 137 * Set the name of bin n.
Chris@881 138 */
Chris@929 139 virtual void setBinName(int n, QString);
Chris@881 140
Chris@881 141 /**
Chris@881 142 * Set the names of all bins.
Chris@881 143 */
Chris@152 144 virtual void setBinNames(std::vector<QString> names);
Chris@152 145
Chris@881 146 /**
Chris@886 147 * Return true if the bins have values as well as names. (The
Chris@886 148 * values may have been derived from the names, e.g. by parsing
Chris@886 149 * numbers from them.) If this returns true, getBinValue() may be
Chris@886 150 * used to retrieve the values.
Chris@886 151 */
Chris@886 152 virtual bool hasBinValues() const;
Chris@886 153
Chris@886 154 /**
Chris@886 155 * Return the value of bin n, if any. This is a "vertical scale"
Chris@886 156 * value which does not vary from one column to the next. This is
Chris@886 157 * only meaningful if hasBinValues() returns true.
Chris@886 158 */
Chris@929 159 virtual float getBinValue(int n) const;
Chris@886 160
Chris@886 161 /**
Chris@886 162 * Set the values of all bins (separate from their labels). These
Chris@886 163 * are "vertical scale" values which do not vary from one column
Chris@886 164 * to the next.
Chris@886 165 */
Chris@886 166 virtual void setBinValues(std::vector<float> values);
Chris@886 167
Chris@886 168 /**
Chris@886 169 * Obtain the name of the unit of the values returned from
Chris@886 170 * getBinValue(), if any.
Chris@886 171 */
Chris@886 172 virtual QString getBinValueUnit() const;
Chris@886 173
Chris@886 174 /**
Chris@886 175 * Set the name of the unit of the values return from
Chris@886 176 * getBinValue() if any.
Chris@886 177 */
Chris@886 178 virtual void setBinValueUnit(QString unit);
Chris@886 179
Chris@886 180 /**
Chris@881 181 * Return true if the distribution of values in the bins is such
Chris@881 182 * as to suggest a log scale (mapping to colour etc) may be better
Chris@881 183 * than a linear one.
Chris@881 184 */
Chris@478 185 bool shouldUseLogValueScale() const;
Chris@478 186
Chris@333 187 virtual void setCompletion(int completion, bool update = true);
Chris@152 188 virtual int getCompletion() const { return m_completion; }
Chris@152 189
Chris@345 190 QString getTypeName() const { return tr("Editable Dense 3-D"); }
Chris@345 191
Chris@318 192 virtual QString toDelimitedDataString(QString delimiter) const;
Chris@929 193 virtual QString toDelimitedDataStringSubset(QString delimiter, int f0, int f1) const;
Chris@318 194
Chris@152 195 virtual void toXml(QTextStream &out,
Chris@152 196 QString indent = "",
Chris@152 197 QString extraAttributes = "") const;
Chris@152 198
Chris@152 199 protected:
Chris@533 200 typedef QVector<Column> ValueMatrix;
Chris@152 201 ValueMatrix m_data;
Chris@152 202
Chris@535 203 // m_trunc is used for simple compression. If at least the top N
Chris@535 204 // elements of column x (for N = some proportion of the column
Chris@535 205 // height) are equal to those of an earlier column x', then
Chris@535 206 // m_trunc[x] will contain x-x' and column x will be truncated so
Chris@535 207 // as to remove the duplicate elements. If the equal elements are
Chris@535 208 // at the bottom, then m_trunc[x] will contain x'-x (a negative
Chris@535 209 // value). If m_trunc[x] is 0 then the whole of column x is
Chris@535 210 // stored.
Chris@535 211 std::vector<signed char> m_trunc;
Chris@929 212 void truncateAndStore(int index, const Column & values);
Chris@929 213 Column expandAndRetrieve(int index) const;
Chris@534 214
Chris@152 215 std::vector<QString> m_binNames;
Chris@886 216 std::vector<float> m_binValues;
Chris@886 217 QString m_binValueUnit;
Chris@152 218
Chris@929 219 int m_startFrame;
Chris@929 220 int m_sampleRate;
Chris@929 221 int m_resolution;
Chris@929 222 int m_yBinCount;
Chris@535 223 CompressionType m_compression;
Chris@152 224 float m_minimum;
Chris@152 225 float m_maximum;
Chris@256 226 bool m_haveExtents;
Chris@152 227 bool m_notifyOnAdd;
Chris@152 228 long m_sinceLastNotifyMin;
Chris@152 229 long m_sinceLastNotifyMax;
Chris@152 230 int m_completion;
Chris@152 231
Chris@536 232 mutable QReadWriteLock m_lock;
Chris@152 233 };
Chris@152 234
Chris@152 235 #endif