summaryrefslogtreecommitdiff
path: root/libs/ardour/midi_model.cc
diff options
context:
space:
mode:
Diffstat (limited to 'libs/ardour/midi_model.cc')
-rw-r--r--libs/ardour/midi_model.cc113
1 files changed, 35 insertions, 78 deletions
diff --git a/libs/ardour/midi_model.cc b/libs/ardour/midi_model.cc
index f64a5f6d0c..e68068de2b 100644
--- a/libs/ardour/midi_model.cc
+++ b/libs/ardour/midi_model.cc
@@ -164,85 +164,38 @@ MidiModel::NoteDiffCommand::side_effect_remove (const NotePtr note)
side_effect_removals.insert (note);
}
-void
-MidiModel::NoteDiffCommand::change (const NotePtr note, Property prop,
- uint8_t new_value)
+Variant
+MidiModel::NoteDiffCommand::get_value (const NotePtr note, Property prop)
{
- assert (note);
-
- NoteChange change;
-
switch (prop) {
case NoteNumber:
- if (new_value == note->note()) {
- return;
- }
- change.old_value = note->note();
- break;
+ return Variant(note->note());
case Velocity:
- if (new_value == note->velocity()) {
- return;
- }
- change.old_value = note->velocity();
- break;
+ return Variant(note->velocity());
case Channel:
- if (new_value == note->channel()) {
- return;
- }
- change.old_value = note->channel();
- break;
-
-
+ return Variant(note->channel());
case StartTime:
- fatal << "MidiModel::DiffCommand::change() with integer argument called for start time" << endmsg;
- abort(); /*NOTREACHED*/
- break;
+ return Variant(note->time());
case Length:
- fatal << "MidiModel::DiffCommand::change() with integer argument called for length" << endmsg;
- abort(); /*NOTREACHED*/
- break;
+ return Variant(note->length());
}
-
- change.note = note;
- change.property = prop;
- change.new_value = new_value;
-
- _changes.push_back (change);
}
void
-MidiModel::NoteDiffCommand::change (const NotePtr note, Property prop,
- TimeType new_time)
+MidiModel::NoteDiffCommand::change (const NotePtr note,
+ Property prop,
+ const Variant& new_value)
{
assert (note);
- NoteChange change;
-
- switch (prop) {
- case NoteNumber:
- case Channel:
- case Velocity:
- fatal << "MidiModel::NoteDiffCommand::change() with time argument called for note, channel or velocity" << endmsg;
- break;
+ const NoteChange change = {
+ prop, note, 0, get_value(note, prop), new_value
+ };
- case StartTime:
- if (note->time() == new_time) {
- return;
- }
- change.old_time = note->time();
- break;
- case Length:
- if (note->length() == new_time) {
- return;
- }
- change.old_time = note->length();
- break;
+ if (change.old_value == new_value) {
+ return;
}
- change.note = note;
- change.property = prop;
- change.new_time = new_time;
-
_changes.push_back (change);
}
@@ -304,7 +257,7 @@ MidiModel::NoteDiffCommand::operator() ()
_model->remove_note_unlocked (i->note);
temporary_removals.insert (i->note);
}
- i->note->set_note (i->new_value);
+ i->note->set_note (i->new_value.get_int());
break;
case StartTime:
@@ -312,7 +265,7 @@ MidiModel::NoteDiffCommand::operator() ()
_model->remove_note_unlocked (i->note);
temporary_removals.insert (i->note);
}
- i->note->set_time (i->new_time);
+ i->note->set_time (i->new_value.get_beats());
break;
case Channel:
@@ -320,18 +273,18 @@ MidiModel::NoteDiffCommand::operator() ()
_model->remove_note_unlocked (i->note);
temporary_removals.insert (i->note);
}
- i->note->set_channel (i->new_value);
+ i->note->set_channel (i->new_value.get_int());
break;
/* no remove-then-add required for these properties, since we do not index them
*/
case Velocity:
- i->note->set_velocity (i->new_value);
+ i->note->set_velocity (i->new_value.get_int());
break;
case Length:
- i->note->set_length (i->new_time);
+ i->note->set_length (i->new_value.get_beats());
break;
}
@@ -411,7 +364,7 @@ MidiModel::NoteDiffCommand::undo ()
_model->remove_note_unlocked (i->note);
temporary_removals.insert (i->note);
}
- i->note->set_note (i->old_value);
+ i->note->set_note (i->old_value.get_int());
break;
case StartTime:
@@ -423,7 +376,7 @@ MidiModel::NoteDiffCommand::undo ()
_model->remove_note_unlocked (i->note);
temporary_removals.insert (i->note);
}
- i->note->set_time (i->old_time);
+ i->note->set_time (i->old_value.get_beats());
break;
case Channel:
@@ -435,18 +388,18 @@ MidiModel::NoteDiffCommand::undo ()
_model->remove_note_unlocked (i->note);
temporary_removals.insert (i->note);
}
- i->note->set_channel (i->old_value);
+ i->note->set_channel (i->old_value.get_int());
break;
/* no remove-then-add required for these properties, since we do not index them
*/
case Velocity:
- i->note->set_velocity (i->old_value);
+ i->note->set_velocity (i->old_value.get_int());
break;
case Length:
- i->note->set_length (i->old_time);
+ i->note->set_length (i->old_value.get_beats());
break;
}
}
@@ -593,9 +546,9 @@ MidiModel::NoteDiffCommand::marshal_change (const NoteChange& change)
{
ostringstream old_value_str (ios::ate);
if (change.property == StartTime || change.property == Length) {
- old_value_str << change.old_time;
+ old_value_str << change.old_value.get_beats();
} else {
- old_value_str << (unsigned int) change.old_value;
+ old_value_str << change.old_value.get_int();
}
xml_change->add_property ("old", old_value_str.str());
}
@@ -603,9 +556,9 @@ MidiModel::NoteDiffCommand::marshal_change (const NoteChange& change)
{
ostringstream new_value_str (ios::ate);
if (change.property == StartTime || change.property == Length) {
- new_value_str << change.new_time;
+ new_value_str << change.new_value.get_beats();
} else {
- new_value_str << (unsigned int) change.new_value;
+ new_value_str << change.new_value.get_int();
}
xml_change->add_property ("new", new_value_str.str());
}
@@ -640,7 +593,9 @@ MidiModel::NoteDiffCommand::unmarshal_change (XMLNode *xml_change)
if ((prop = xml_change->property ("old")) != 0) {
istringstream old_str (prop->value());
if (change.property == StartTime || change.property == Length) {
- old_str >> change.old_time;
+ Evoral::MusicalTime old_time;
+ old_str >> old_time;
+ change.old_value = old_time;
} else {
int integer_value_so_that_istream_does_the_right_thing;
old_str >> integer_value_so_that_istream_does_the_right_thing;
@@ -654,7 +609,9 @@ MidiModel::NoteDiffCommand::unmarshal_change (XMLNode *xml_change)
if ((prop = xml_change->property ("new")) != 0) {
istringstream new_str (prop->value());
if (change.property == StartTime || change.property == Length) {
- new_str >> change.new_time;
+ Evoral::MusicalTime new_time;
+ new_str >> new_time;
+ change.new_value = Variant(new_time);
} else {
int integer_value_so_that_istream_does_the_right_thing;
new_str >> integer_value_so_that_istream_does_the_right_thing;