-MidiModel::DiffCommand::marshal_change(const NoteChange& change)
-{
- XMLNode* xml_change = new XMLNode("change");
-
- /* first, the change itself */
-
- xml_change->add_property ("property", enum_2_string (change.property));
-
- {
- ostringstream old_value_str (ios::ate);
- if (change.property == StartTime || change.property == Length) {
- old_value_str << change.old_time;
- } else {
- old_value_str << (unsigned int) change.old_value;
- }
- xml_change->add_property ("old", old_value_str.str());
- }
-
- {
- ostringstream new_value_str (ios::ate);
- if (change.property == StartTime || change.property == Length) {
- new_value_str << change.new_time;
- } else {
- new_value_str << (unsigned int) change.new_value;
- }
- xml_change->add_property ("new", new_value_str.str());
- }
-
- /* now the rest of the note */
-
- const SMFSource* smf = dynamic_cast<const SMFSource*> (_model->midi_source());
-
- if (change.property != NoteNumber) {
- ostringstream note_str;
- note_str << int(change.note->note());
- xml_change->add_property("note", note_str.str());
- }
-
- if (change.property != Channel) {
- ostringstream channel_str;
- channel_str << int(change.note->channel());
- xml_change->add_property("channel", channel_str.str());
- }
-
- if (change.property != StartTime) {
- ostringstream time_str;
- if (smf) {
- time_str << smf->round_to_file_precision (change.note->time());
- } else {
- time_str << change.note->time();
- }
- xml_change->add_property("time", time_str.str());
- }
-
- if (change.property != Length) {
- ostringstream length_str;
- if (smf) {
- length_str << smf->round_to_file_precision (change.note->length());
- } else {
- length_str << change.note->length();
- }
- xml_change->add_property ("length", length_str.str());
- }
-
- if (change.property != Velocity) {
- ostringstream velocity_str;
- velocity_str << int (change.note->velocity());
- xml_change->add_property("velocity", velocity_str.str());
- }
-
- /* and now notes that were remove as a side-effect */
-
- return *xml_change;
-}
-
-MidiModel::DiffCommand::NoteChange
-MidiModel::DiffCommand::unmarshal_change(XMLNode *xml_change)
-{
- XMLProperty* prop;
- NoteChange change;
- unsigned int note;
- unsigned int channel;
- unsigned int velocity;
- Evoral::MusicalTime time;
- Evoral::MusicalTime length;
-
- if ((prop = xml_change->property("property")) != 0) {
- change.property = (Property) string_2_enum (prop->value(), change.property);
- } else {
- fatal << "!!!" << endmsg;
- /*NOTREACHED*/
- }
-
- if ((prop = xml_change->property ("old")) != 0) {
- istringstream old_str (prop->value());
- if (change.property == StartTime || change.property == Length) {
- old_str >> change.old_time;
- } else {
- int integer_value_so_that_istream_does_the_right_thing;
- old_str >> integer_value_so_that_istream_does_the_right_thing;
- change.old_value = integer_value_so_that_istream_does_the_right_thing;
- }
- } else {
- fatal << "!!!" << endmsg;
- /*NOTREACHED*/
- }
-
- if ((prop = xml_change->property ("new")) != 0) {
- istringstream new_str (prop->value());
- if (change.property == StartTime || change.property == Length) {
- new_str >> change.new_time;
- } else {
- int integer_value_so_that_istream_does_the_right_thing;
- new_str >> integer_value_so_that_istream_does_the_right_thing;
- change.new_value = integer_value_so_that_istream_does_the_right_thing;
- }
- } else {
- fatal << "!!!" << endmsg;
- /*NOTREACHED*/
- }
-
- if (change.property != NoteNumber) {
- if ((prop = xml_change->property("note")) != 0) {
- istringstream note_str(prop->value());
- note_str >> note;
- } else {
- warning << "note information missing note value" << endmsg;
- note = 127;
- }
- } else {
- note = change.new_value;
- }
-
- if (change.property != Channel) {
- if ((prop = xml_change->property("channel")) != 0) {
- istringstream channel_str(prop->value());
- channel_str >> channel;
- } else {
- warning << "note information missing channel" << endmsg;
- channel = 0;
- }
- } else {
- channel = change.new_value;
- }
-
- if (change.property != StartTime) {
- if ((prop = xml_change->property("time")) != 0) {
- istringstream time_str(prop->value());
- time_str >> time;
- } else {
- warning << "note information missing time" << endmsg;
- time = 0;
- }
- } else {
- time = change.new_time;
- }
-
- if (change.property != Length) {
- if ((prop = xml_change->property("length")) != 0) {
- istringstream length_str(prop->value());
- length_str >> length;
- } else {
- warning << "note information missing length" << endmsg;
- length = 1;
- }
- } else {
- length = change.new_time;
- }
-
- if (change.property != Velocity) {
- if ((prop = xml_change->property("velocity")) != 0) {
- istringstream velocity_str(prop->value());
- velocity_str >> velocity;
- } else {
- warning << "note information missing velocity" << endmsg;
- velocity = 127;
- }
- } else {
- velocity = change.new_value;
- }
-
- /* we must point at the instance of the note that is actually in the model.
- so go look for it ...
- */
-
- NotePtr new_note (new Evoral::Note<TimeType> (channel, time, length, note, velocity));
-
- change.note = _model->find_note (new_note);
-
- if (!change.note) {
- warning << "MIDI note " << *new_note << " not found in model - programmers should investigate this" << endmsg;
- /* use the actual new note */
- change.note = new_note;
- }
-
- return change;
+MidiModel::SysExDiffCommand::marshal_change (const Change& change)
+{
+ XMLNode* xml_change = new XMLNode ("Change");
+
+ /* first, the change itself */
+
+ xml_change->add_property ("property", enum_2_string (change.property));
+
+ {
+ ostringstream old_value_str (ios::ate);
+ old_value_str << change.old_time;
+ xml_change->add_property ("old", old_value_str.str());
+ }
+
+ {
+ ostringstream new_value_str (ios::ate);
+ new_value_str << change.new_time;
+ xml_change->add_property ("new", new_value_str.str());
+ }
+
+ ostringstream id_str;
+ id_str << change.sysex->id();
+ xml_change->add_property ("id", id_str.str());
+
+ return *xml_change;
+}
+
+MidiModel::SysExDiffCommand::Change
+MidiModel::SysExDiffCommand::unmarshal_change (XMLNode *xml_change)
+{
+ XMLProperty* prop;
+ Change change;
+
+ if ((prop = xml_change->property ("property")) != 0) {
+ change.property = (Property) string_2_enum (prop->value(), change.property);
+ } else {
+ fatal << "!!!" << endmsg;
+ /*NOTREACHED*/
+ }
+
+ if ((prop = xml_change->property ("id")) == 0) {
+ error << _("No SysExID found for sys-ex property change - ignored") << endmsg;
+ return change;
+ }
+
+ gint sysex_id = atoi (prop->value().c_str());
+
+ if ((prop = xml_change->property ("old")) != 0) {
+ istringstream old_str (prop->value());
+ old_str >> change.old_time;
+ } else {
+ fatal << "!!!" << endmsg;
+ /*NOTREACHED*/
+ }
+
+ if ((prop = xml_change->property ("new")) != 0) {
+ istringstream new_str (prop->value());
+ new_str >> change.new_time;
+ } else {
+ fatal << "!!!" << endmsg;
+ /*NOTREACHED*/
+ }
+
+ /* we must point at the instance of the sysex that is actually in the model.
+ so go look for it ...
+ */
+
+ change.sysex = _model->find_sysex (sysex_id);
+ change.sysex_id = sysex_id;
+
+ return change;