annotate data/model/NoteModel.h @ 392:183ee2a55fc7

* More work to abstract out interactive components used in the data library, so that it does not need to depend on QtGui.
author Chris Cannam
date Fri, 14 Mar 2008 17:14:21 +0000
parents 5858cc462d0a
children 6a96bff0bd59
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@391 20 #include "base/RealTime.h"
Chris@150 21 #include "base/PlayParameterRepository.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@391 98 PlayParameterRepository::getInstance()->addPlayable(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@391 109 PlayParameterRepository::getInstance()->addPlayable(this);
Chris@391 110 }
Chris@391 111
Chris@391 112 virtual ~NoteModel()
Chris@391 113 {
Chris@391 114 PlayParameterRepository::getInstance()->removePlayable(this);
Chris@147 115 }
Chris@147 116
Chris@147 117 float getValueQuantization() const { return m_valueQuantization; }
Chris@147 118 void setValueQuantization(float q) { m_valueQuantization = q; }
Chris@147 119
Chris@147 120 /**
Chris@147 121 * Notes have a duration, so this returns all points that span any
Chris@147 122 * of the given range (as well as the usual additional few before
Chris@147 123 * and after). Consequently this can be very slow (optimised data
Chris@147 124 * structures still to be done!).
Chris@147 125 */
Chris@147 126 virtual PointList getPoints(long start, long end) const;
Chris@147 127
Chris@147 128 /**
Chris@147 129 * Notes have a duration, so this returns all points that span the
Chris@147 130 * given frame. Consequently this can be very slow (optimised
Chris@147 131 * data structures still to be done!).
Chris@147 132 */
Chris@147 133 virtual PointList getPoints(long frame) const;
Chris@147 134
Chris@345 135 QString getTypeName() const { return tr("Note"); }
Chris@345 136
Chris@391 137 virtual bool canPlay() const { return true; }
Chris@391 138
Chris@391 139 virtual QString getDefaultPlayPluginId() const
Chris@391 140 {
Chris@391 141 return "dssi:_builtin:sample_player";
Chris@391 142 }
Chris@391 143
Chris@391 144 virtual QString getDefaultPlayPluginConfiguration() const
Chris@391 145 {
Chris@391 146 return "<plugin program=\"piano\"/>";
Chris@391 147 }
Chris@391 148
Chris@288 149 virtual void toXml(QTextStream &out,
Chris@288 150 QString indent = "",
Chris@288 151 QString extraAttributes = "") const
Chris@147 152 {
Chris@318 153 std::cerr << "NoteModel::toXml: extraAttributes = \""
Chris@318 154 << extraAttributes.toStdString() << std::endl;
Chris@318 155
Chris@314 156 SparseValueModel<Note>::toXml
Chris@288 157 (out,
Chris@288 158 indent,
Chris@147 159 QString("%1 valueQuantization=\"%2\"")
Chris@147 160 .arg(extraAttributes).arg(m_valueQuantization));
Chris@147 161 }
Chris@147 162
Chris@147 163 protected:
Chris@147 164 float m_valueQuantization;
Chris@147 165 };
Chris@147 166
Chris@147 167 #endif