annotate data/model/NoteModel.h @ 360:ac300d385ab2

* Various fixes to object lifetime management, particularly in the spectrum layer and for notification of main model deletion. The main purpose of this is to improve the behaviour of the spectrum, but I think it may also help with #1840922 Various crashes in Layer Summary window.
author Chris Cannam
date Wed, 23 Jan 2008 15:43:27 +0000
parents 700cd3350391
children 5858cc462d0a
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@147 7 This file copyright 2006 Chris Cannam.
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 _NOTE_MODEL_H_
Chris@147 17 #define _NOTE_MODEL_H_
Chris@147 18
Chris@147 19 #include "SparseValueModel.h"
Chris@150 20 #include "base/PlayParameterRepository.h"
Chris@147 21 #include "base/RealTime.h"
Chris@147 22
Chris@147 23 /**
Chris@147 24 * Note type for use in a SparseModel or SparseValueModel. All we
Chris@147 25 * mean by a "note" is something that has an onset time, a single
Chris@147 26 * value, and a duration. Like other points, it can also have a
Chris@147 27 * label. With this point type, the model can be thought of as
Chris@147 28 * representing a simple MIDI-type piano roll, except that the y
Chris@147 29 * coordinates (values) do not have to be discrete integers.
Chris@147 30 */
Chris@147 31
Chris@147 32 struct Note
Chris@147 33 {
Chris@147 34 public:
Chris@340 35 Note(long _frame) : frame(_frame), value(0.0f), duration(0), level(1.f) { }
Chris@340 36 Note(long _frame, float _value, size_t _duration, float _level, QString _label) :
Chris@340 37 frame(_frame), value(_value), duration(_duration), level(_level), label(_label) { }
Chris@147 38
Chris@147 39 int getDimensions() const { return 3; }
Chris@147 40
Chris@147 41 long frame;
Chris@147 42 float value;
Chris@147 43 size_t duration;
Chris@340 44 float level;
Chris@147 45 QString label;
Chris@147 46
Chris@338 47 QString getLabel() const { return label; }
Chris@338 48
Chris@314 49 void toXml(QTextStream &stream,
Chris@314 50 QString indent = "",
Chris@314 51 QString extraAttributes = "") const
Chris@147 52 {
Chris@314 53 stream <<
Chris@340 54 QString("%1<point frame=\"%2\" value=\"%3\" duration=\"%4\" level=\"%5\" label=\"%6\" %7/>\n")
Chris@340 55 .arg(indent).arg(frame).arg(value).arg(duration).arg(level).arg(label).arg(extraAttributes);
Chris@147 56 }
Chris@147 57
Chris@147 58 QString toDelimitedDataString(QString delimiter, size_t sampleRate) const
Chris@147 59 {
Chris@147 60 QStringList list;
Chris@147 61 list << RealTime::frame2RealTime(frame, sampleRate).toString().c_str();
Chris@147 62 list << QString("%1").arg(value);
Chris@340 63 list << RealTime::frame2RealTime(duration, sampleRate).toString().c_str();
Chris@340 64 list << QString("%1").arg(level);
Chris@318 65 if (label != "") list << label;
Chris@147 66 return list.join(delimiter);
Chris@147 67 }
Chris@147 68
Chris@147 69 struct Comparator {
Chris@147 70 bool operator()(const Note &p1,
Chris@147 71 const Note &p2) const {
Chris@147 72 if (p1.frame != p2.frame) return p1.frame < p2.frame;
Chris@147 73 if (p1.value != p2.value) return p1.value < p2.value;
Chris@147 74 if (p1.duration != p2.duration) return p1.duration < p2.duration;
Chris@340 75 if (p1.level != p2.level) return p1.level < p2.level;
Chris@147 76 return p1.label < p2.label;
Chris@147 77 }
Chris@147 78 };
Chris@147 79
Chris@147 80 struct OrderComparator {
Chris@147 81 bool operator()(const Note &p1,
Chris@147 82 const Note &p2) const {
Chris@147 83 return p1.frame < p2.frame;
Chris@147 84 }
Chris@147 85 };
Chris@147 86 };
Chris@147 87
Chris@147 88
Chris@147 89 class NoteModel : public SparseValueModel<Note>
Chris@147 90 {
Chris@147 91 public:
Chris@147 92 NoteModel(size_t sampleRate, size_t resolution,
Chris@256 93 bool notifyOnAdd = true) :
Chris@256 94 SparseValueModel<Note>(sampleRate, resolution,
Chris@256 95 notifyOnAdd),
Chris@256 96 m_valueQuantization(0)
Chris@256 97 {
Chris@256 98 PlayParameterRepository::getInstance()->addModel(this);
Chris@256 99 }
Chris@256 100
Chris@256 101 NoteModel(size_t sampleRate, size_t resolution,
Chris@147 102 float valueMinimum, float valueMaximum,
Chris@147 103 bool notifyOnAdd = true) :
Chris@147 104 SparseValueModel<Note>(sampleRate, resolution,
Chris@147 105 valueMinimum, valueMaximum,
Chris@147 106 notifyOnAdd),
Chris@147 107 m_valueQuantization(0)
Chris@147 108 {
Chris@147 109 PlayParameterRepository::getInstance()->addModel(this);
Chris@147 110 }
Chris@147 111
Chris@147 112 float getValueQuantization() const { return m_valueQuantization; }
Chris@147 113 void setValueQuantization(float q) { m_valueQuantization = q; }
Chris@147 114
Chris@147 115 /**
Chris@147 116 * Notes have a duration, so this returns all points that span any
Chris@147 117 * of the given range (as well as the usual additional few before
Chris@147 118 * and after). Consequently this can be very slow (optimised data
Chris@147 119 * structures still to be done!).
Chris@147 120 */
Chris@147 121 virtual PointList getPoints(long start, long end) const;
Chris@147 122
Chris@147 123 /**
Chris@147 124 * Notes have a duration, so this returns all points that span the
Chris@147 125 * given frame. Consequently this can be very slow (optimised
Chris@147 126 * data structures still to be done!).
Chris@147 127 */
Chris@147 128 virtual PointList getPoints(long frame) const;
Chris@147 129
Chris@345 130 QString getTypeName() const { return tr("Note"); }
Chris@345 131
Chris@288 132 virtual void toXml(QTextStream &out,
Chris@288 133 QString indent = "",
Chris@288 134 QString extraAttributes = "") const
Chris@147 135 {
Chris@318 136 std::cerr << "NoteModel::toXml: extraAttributes = \""
Chris@318 137 << extraAttributes.toStdString() << std::endl;
Chris@318 138
Chris@314 139 SparseValueModel<Note>::toXml
Chris@288 140 (out,
Chris@288 141 indent,
Chris@147 142 QString("%1 valueQuantization=\"%2\"")
Chris@147 143 .arg(extraAttributes).arg(m_valueQuantization));
Chris@147 144 }
Chris@147 145
Chris@147 146 protected:
Chris@147 147 float m_valueQuantization;
Chris@147 148 };
Chris@147 149
Chris@147 150 #endif