# HG changeset patch
# User Chris Cannam
# Date 1195836503 0
# Node ID 516819f2b97b7dd5b03febef1122e097e5cebbfb
# Parent ba30f4a3e3be07d13cd23fc38a63e619ba1e9608
* Add Erase tool and mode
* Add icons for Normalize buttons in property boxes, and for Show Peaks
* Add support for velocity in notes -- not yet reflected in display or
editable in the note edit dialog, but they are imported from MIDI,
played, and exported
* Begin work on making pastes align pasted times (subtler than I thought)
diff -r ba30f4a3e3be -r 516819f2b97b base/Clipboard.cpp
--- a/base/Clipboard.cpp Thu Nov 22 14:17:19 2007 +0000
+++ b/base/Clipboard.cpp Fri Nov 23 16:48:23 2007 +0000
@@ -21,7 +21,11 @@
m_haveValue(false),
m_haveDuration(false),
m_haveLabel(true),
- m_label(label)
+ m_label(label),
+ m_haveLevel(false),
+ m_level(0.f),
+ m_haveReferenceFrame(false),
+ m_referenceFrame(frame)
{
}
@@ -32,7 +36,11 @@
m_value(value),
m_haveDuration(false),
m_haveLabel(true),
- m_label(label)
+ m_label(label),
+ m_haveLevel(false),
+ m_level(0.f),
+ m_haveReferenceFrame(false),
+ m_referenceFrame(frame)
{
}
@@ -44,7 +52,27 @@
m_haveDuration(true),
m_duration(duration),
m_haveLabel(true),
- m_label(label)
+ m_label(label),
+ m_haveLevel(false),
+ m_level(0.f),
+ m_haveReferenceFrame(false),
+ m_referenceFrame(frame)
+{
+}
+
+Clipboard::Point::Point(long frame, float value, size_t duration, float level, QString label) :
+ m_haveFrame(true),
+ m_frame(frame),
+ m_haveValue(true),
+ m_value(value),
+ m_haveDuration(true),
+ m_duration(duration),
+ m_haveLabel(true),
+ m_label(label),
+ m_haveLevel(true),
+ m_level(level),
+ m_haveReferenceFrame(false),
+ m_referenceFrame(frame)
{
}
@@ -56,7 +84,11 @@
m_haveDuration(point.m_haveDuration),
m_duration(point.m_duration),
m_haveLabel(point.m_haveLabel),
- m_label(point.m_label)
+ m_label(point.m_label),
+ m_haveLevel(point.m_haveLevel),
+ m_level(point.m_level),
+ m_haveReferenceFrame(point.m_haveReferenceFrame),
+ m_referenceFrame(point.m_referenceFrame)
{
}
@@ -72,6 +104,10 @@
m_duration = point.m_duration;
m_haveLabel = point.m_haveLabel;
m_label = point.m_label;
+ m_haveLevel = point.m_haveLevel;
+ m_level = point.m_level;
+ m_haveReferenceFrame = point.m_haveReferenceFrame;
+ m_referenceFrame = point.m_referenceFrame;
return *this;
}
@@ -123,6 +159,37 @@
return m_label;
}
+bool
+Clipboard::Point::haveLevel() const
+{
+ return m_haveLevel;
+}
+
+float
+Clipboard::Point::getLevel() const
+{
+ return m_level;
+}
+
+bool
+Clipboard::Point::haveReferenceFrame() const
+{
+ return m_haveReferenceFrame;
+}
+
+long
+Clipboard::Point::getReferenceFrame() const
+{
+ return m_referenceFrame;
+}
+
+void
+Clipboard::Point::setReferenceFrame(long f)
+{
+ if (f != m_frame) m_haveReferenceFrame = true;
+ m_referenceFrame = f;
+}
+
Clipboard::Clipboard() { }
Clipboard::~Clipboard() { }
@@ -156,3 +223,13 @@
m_points.push_back(point);
}
+bool
+Clipboard::haveReferenceFrames() const
+{
+ for (PointList::const_iterator i = m_points.begin();
+ i != m_points.end(); ++i) {
+ if (i->haveReferenceFrame()) return true;
+ }
+ return false;
+}
+
diff -r ba30f4a3e3be -r 516819f2b97b base/Clipboard.h
--- a/base/Clipboard.h Thu Nov 22 14:17:19 2007 +0000
+++ b/base/Clipboard.h Fri Nov 23 16:48:23 2007 +0000
@@ -28,6 +28,7 @@
Point(long frame, QString label);
Point(long frame, float value, QString label);
Point(long frame, float value, size_t duration, QString label);
+ Point(long frame, float value, size_t duration, float level, QString label);
Point(const Point &point);
Point &operator=(const Point &point);
@@ -43,6 +44,13 @@
bool haveLabel() const;
QString getLabel() const;
+ bool haveLevel() const;
+ float getLevel() const;
+
+ bool haveReferenceFrame() const;
+ long getReferenceFrame() const;
+ void setReferenceFrame(long);
+
private:
bool m_haveFrame;
long m_frame;
@@ -52,6 +60,10 @@
size_t m_duration;
bool m_haveLabel;
QString m_label;
+ bool m_haveLevel;
+ float m_level;
+ bool m_haveReferenceFrame;
+ long m_referenceFrame;
};
Clipboard();
@@ -65,6 +77,8 @@
void setPoints(const PointList &points);
void addPoint(const Point &point);
+ bool haveReferenceFrames() const;
+
protected:
PointList m_points;
};
diff -r ba30f4a3e3be -r 516819f2b97b base/PropertyContainer.cpp
--- a/base/PropertyContainer.cpp Thu Nov 22 14:17:19 2007 +0000
+++ b/base/PropertyContainer.cpp Fri Nov 23 16:48:23 2007 +0000
@@ -29,12 +29,6 @@
return PropertyList();
}
-//QString
-//PropertyContainer::getPropertyLabel(const PropertyName &) const
-//{
-// return "";
-//}
-
PropertyContainer::PropertyType
PropertyContainer::getPropertyType(const PropertyName &) const
{
@@ -42,6 +36,12 @@
}
QString
+PropertyContainer::getPropertyIconName(const PropertyName &) const
+{
+ return QString();
+}
+
+QString
PropertyContainer::getPropertyGroupName(const PropertyName &) const
{
return QString();
diff -r ba30f4a3e3be -r 516819f2b97b base/PropertyContainer.h
--- a/base/PropertyContainer.h Thu Nov 22 14:17:19 2007 +0000
+++ b/base/PropertyContainer.h Fri Nov 23 16:48:23 2007 +0000
@@ -62,6 +62,11 @@
virtual PropertyType getPropertyType(const PropertyName &) const;
/**
+ * Return an icon for the property, if any.
+ */
+ virtual QString getPropertyIconName(const PropertyName &) const;
+
+ /**
* If this property has something in common with other properties
* on this container, return a name that can be used to group them
* (in order to save screen space, for example). e.g. "Window
diff -r ba30f4a3e3be -r 516819f2b97b data/fileio/MIDIFileReader.cpp
--- a/data/fileio/MIDIFileReader.cpp Thu Nov 22 14:17:19 2007 +0000
+++ b/data/fileio/MIDIFileReader.cpp Fri Nov 23 16:48:23 2007 +0000
@@ -1021,8 +1021,10 @@
QString noteLabel = tr("%1 - vel %2")
.arg(pitchLabel).arg(int((*i)->getVelocity()));
+ float level = float((*i)->getVelocity()) / 128.f;
+
Note note(startFrame, (*i)->getPitch(),
- endFrame - startFrame, noteLabel);
+ endFrame - startFrame, level, noteLabel);
// std::cerr << "Adding note " << startFrame << "," << (endFrame-startFrame) << " : " << int((*i)->getPitch()) << std::endl;
diff -r ba30f4a3e3be -r 516819f2b97b data/fileio/MIDIFileWriter.cpp
--- a/data/fileio/MIDIFileWriter.cpp Thu Nov 22 14:17:19 2007 +0000
+++ b/data/fileio/MIDIFileWriter.cpp Fri Nov 23 16:48:23 2007 +0000
@@ -369,8 +369,10 @@
double quarters = (seconds * m_tempo) / 60.0;
unsigned long midiTime = lrint(quarters * m_timingDivision);
- // We don't support velocity in note models yet
int velocity = 100;
+ if (i->level > 0.f && i->level <= 1.f) {
+ velocity = lrintf(i->level * 127.f);
+ }
// Get the sounding time for the matching NOTE_OFF
seconds = double(frame + duration) / double(m_model->getSampleRate());
diff -r ba30f4a3e3be -r 516819f2b97b data/model/Model.cpp
--- a/data/model/Model.cpp Thu Nov 22 14:17:19 2007 +0000
+++ b/data/model/Model.cpp Fri Nov 23 16:48:23 2007 +0000
@@ -113,9 +113,8 @@
else return frame;
}
size_t refFrame = m_alignment->toReference(frame);
- //!!! this should be totally wrong, but because alignToReference and
- // alignFromReference are the wrong way around, it's right... *sigh*
- if (refFrame > getEndFrame()) refFrame = getEndFrame();
+ const Model *m = m_alignment->getReferenceModel();
+ if (m && refFrame > m->getEndFrame()) refFrame = m->getEndFrame();
return refFrame;
}
@@ -127,6 +126,7 @@
else return refFrame;
}
size_t frame = m_alignment->fromReference(refFrame);
+ if (frame > getEndFrame()) frame = getEndFrame();
return frame;
}
diff -r ba30f4a3e3be -r 516819f2b97b data/model/NoteModel.h
--- a/data/model/NoteModel.h Thu Nov 22 14:17:19 2007 +0000
+++ b/data/model/NoteModel.h Fri Nov 23 16:48:23 2007 +0000
@@ -32,15 +32,16 @@
struct Note
{
public:
- Note(long _frame) : frame(_frame), value(0.0f), duration(0) { }
- Note(long _frame, float _value, size_t _duration, QString _label) :
- frame(_frame), value(_value), duration(_duration), label(_label) { }
+ Note(long _frame) : frame(_frame), value(0.0f), duration(0), level(1.f) { }
+ Note(long _frame, float _value, size_t _duration, float _level, QString _label) :
+ frame(_frame), value(_value), duration(_duration), level(_level), label(_label) { }
int getDimensions() const { return 3; }
long frame;
float value;
size_t duration;
+ float level;
QString label;
QString getLabel() const { return label; }
@@ -50,8 +51,8 @@
QString extraAttributes = "") const
{
stream <<
- QString("%1\n")
- .arg(indent).arg(frame).arg(value).arg(duration).arg(label).arg(extraAttributes);
+ QString("%1\n")
+ .arg(indent).arg(frame).arg(value).arg(duration).arg(level).arg(label).arg(extraAttributes);
}
QString toDelimitedDataString(QString delimiter, size_t sampleRate) const
@@ -59,7 +60,8 @@
QStringList list;
list << RealTime::frame2RealTime(frame, sampleRate).toString().c_str();
list << QString("%1").arg(value);
- list << QString("%1").arg(duration);
+ list << RealTime::frame2RealTime(duration, sampleRate).toString().c_str();
+ list << QString("%1").arg(level);
if (label != "") list << label;
return list.join(delimiter);
}
@@ -70,6 +72,7 @@
if (p1.frame != p2.frame) return p1.frame < p2.frame;
if (p1.value != p2.value) return p1.value < p2.value;
if (p1.duration != p2.duration) return p1.duration < p2.duration;
+ if (p1.level != p2.level) return p1.level < p2.level;
return p1.label < p2.label;
}
};
diff -r ba30f4a3e3be -r 516819f2b97b plugin/transform/FeatureExtractionModelTransformer.cpp
--- a/plugin/transform/FeatureExtractionModelTransformer.cpp Thu Nov 22 14:17:19 2007 +0000
+++ b/plugin/transform/FeatureExtractionModelTransformer.cpp Fri Nov 23 16:48:23 2007 +0000
@@ -495,12 +495,15 @@
float velocity = 100;
if (feature.values.size() > 2) velocity = feature.values[2];
+ if (velocity < 0) velocity = 127;
+ if (velocity > 127) velocity = 127;
NoteModel *model = getOutput();
if (!model) return;
model->addPoint(NoteModel::Point(frame, pitch,
lrintf(duration),
+ velocity / 127.f,
feature.label.c_str()));
} else {