33 #include "midi++/events.h"
120 #define NOTE_DIFF_COMMAND_ELEMENT "NoteDiffCommand"
121 #define DIFF_NOTES_ELEMENT "ChangedNotes"
122 #define ADDED_NOTES_ELEMENT "AddedNotes"
123 #define REMOVED_NOTES_ELEMENT "RemovedNotes"
124 #define SIDE_EFFECT_REMOVALS_ELEMENT "SideEffectRemovals"
125 #define SYSEX_DIFF_COMMAND_ELEMENT "SysExDiffCommand"
126 #define DIFF_SYSEXES_ELEMENT "ChangedSysExes"
127 #define PATCH_CHANGE_DIFF_COMMAND_ELEMENT "PatchChangeDiffCommand"
128 #define ADDED_PATCH_CHANGES_ELEMENT "AddedPatchChanges"
129 #define REMOVED_PATCH_CHANGES_ELEMENT "RemovedPatchChanges"
130 #define DIFF_PATCH_CHANGES_ELEMENT "ChangedPatchChanges"
150 _removed_notes.remove(note);
151 _added_notes.push_back(note);
157 _added_notes.remove(note);
158 _removed_notes.push_back(note);
164 side_effect_removals.insert (note);
174 return Variant(note->velocity());
176 return Variant(note->channel());
180 return Variant(note->length());
210 prop, note, 0,
get_value(note, prop), new_value
217 _changes.push_back (change);
223 if (
this == &other) {
227 if (_model != other.
_model) {
234 _changes.insert (_changes.end(), other.
_changes.begin(), other.
_changes.end());
245 for (NoteList::iterator i = _added_notes.begin(); i != _added_notes.end(); ++i) {
246 if (!_model->add_note_unlocked(*i)) {
250 _removed_notes.remove (*i);
254 for (NoteList::iterator i = _removed_notes.begin(); i != _removed_notes.end(); ++i) {
255 _model->remove_note_unlocked(*i);
259 set<NotePtr> temporary_removals;
261 for (ChangeList::iterator i = _changes.begin(); i != _changes.end(); ++i) {
268 i->note = _model->find_note (i->note_id);
274 if (temporary_removals.find (i->note) == temporary_removals.end()) {
275 _model->remove_note_unlocked (i->note);
276 temporary_removals.insert (i->note);
278 i->note->set_note (i->new_value.get_int());
282 if (temporary_removals.find (i->note) == temporary_removals.end()) {
283 _model->remove_note_unlocked (i->note);
284 temporary_removals.insert (i->note);
286 i->note->set_time (i->new_value.get_beats());
290 if (temporary_removals.find (i->note) == temporary_removals.end()) {
291 _model->remove_note_unlocked (i->note);
292 temporary_removals.insert (i->note);
294 i->note->set_channel (i->new_value.get_int());
301 i->note->set_velocity (i->new_value.get_int());
305 i->note->set_length (i->new_value.get_beats());
311 for (set<NotePtr>::iterator i = temporary_removals.begin(); i != temporary_removals.end(); ++i) {
313 if (_model->add_note_unlocked (*i, &side_effects)) {
315 *
this += side_effects;
321 _removed_notes.push_back (*i);
325 if (!side_effect_removals.empty()) {
327 for (set<NotePtr>::iterator i = side_effect_removals.begin(); i != side_effect_removals.end(); ++i) {
328 cerr <<
"\t" << *i <<
' ' << **i << endl;
333 _model->ContentsChanged();
342 for (NoteList::iterator i = _added_notes.begin(); i != _added_notes.end(); ++i) {
343 _model->remove_note_unlocked(*i);
354 set<NotePtr> temporary_removals;
361 for (ChangeList::iterator i = _changes.begin(); i != _changes.end(); ++i) {
363 i->note = _model->find_note (i->note_id);
368 for (ChangeList::iterator i = _changes.begin(); i != _changes.end(); ++i) {
373 if (temporary_removals.find (i->note) == temporary_removals.end() &&
374 find (_removed_notes.begin(), _removed_notes.end(), i->note) == _removed_notes.end()) {
382 _model->remove_note_unlocked (i->note);
383 temporary_removals.insert (i->note);
385 i->note->set_note (i->old_value.get_int());
389 if (temporary_removals.find (i->note) == temporary_removals.end() &&
390 find (_removed_notes.begin(), _removed_notes.end(), i->note) == _removed_notes.end()) {
394 _model->remove_note_unlocked (i->note);
395 temporary_removals.insert (i->note);
397 i->note->set_time (i->old_value.get_beats());
401 if (temporary_removals.find (i->note) == temporary_removals.end() &&
402 find (_removed_notes.begin(), _removed_notes.end(), i->note) == _removed_notes.end()) {
406 _model->remove_note_unlocked (i->note);
407 temporary_removals.insert (i->note);
409 i->note->set_channel (i->old_value.get_int());
416 i->note->set_velocity (i->old_value.get_int());
420 i->note->set_length (i->old_value.get_beats());
425 for (NoteList::iterator i = _removed_notes.begin(); i != _removed_notes.end(); ++i) {
426 _model->add_note_unlocked(*i);
429 for (set<NotePtr>::iterator i = temporary_removals.begin(); i != temporary_removals.end(); ++i) {
430 _model->add_note_unlocked (*i);
438 for (set<NotePtr>::iterator i = side_effect_removals.begin(); i != side_effect_removals.end(); ++i) {
439 _model->add_note_unlocked (*i);
443 _model->ContentsChanged();
452 ostringstream id_str(ios::ate);
453 id_str << int(note->id());
458 ostringstream note_str(ios::ate);
459 note_str << int(note->note());
464 ostringstream channel_str(ios::ate);
465 channel_str << int(note->channel());
470 ostringstream time_str(ios::ate);
471 time_str << note->time();
476 ostringstream length_str(ios::ate);
477 length_str << note->length();
482 ostringstream velocity_str(ios::ate);
483 velocity_str << (
unsigned int) note->velocity();
495 unsigned int channel;
498 unsigned int velocity;
501 if ((prop = xml_note->
property(
"id")) != 0) {
502 istringstream id_str(prop->
value());
505 error <<
"note information missing ID value" <<
endmsg;
509 if ((prop = xml_note->
property(
"note")) != 0) {
510 istringstream note_str(prop->
value());
517 if ((prop = xml_note->
property(
"channel")) != 0) {
518 istringstream channel_str(prop->
value());
519 channel_str >> channel;
525 if ((prop = xml_note->
property(
"time")) != 0) {
526 istringstream time_str(prop->
value());
533 if ((prop = xml_note->
property(
"length")) != 0) {
534 istringstream length_str(prop->
value());
541 if ((prop = xml_note->
property(
"velocity")) != 0) {
542 istringstream velocity_str(prop->
value());
543 velocity_str >> velocity;
550 note_ptr->set_id (
id);
565 ostringstream old_value_str (ios::ate);
575 ostringstream new_value_str (ios::ate);
584 ostringstream id_str;
586 id_str << change.
note->id();
606 if ((prop = xml_change->
property(
"property")) != 0) {
613 if ((prop = xml_change->
property (
"id")) == 0) {
614 error <<
_(
"No NoteID found for note property change - ignored") <<
endmsg;
618 gint note_id =
atoi (prop->
value().c_str());
620 if ((prop = xml_change->
property (
"old")) != 0) {
621 istringstream old_str (prop->
value());
627 int integer_value_so_that_istream_does_the_right_thing;
628 old_str >> integer_value_so_that_istream_does_the_right_thing;
629 change.
old_value = integer_value_so_that_istream_does_the_right_thing;
636 if ((prop = xml_change->
property (
"new")) != 0) {
637 istringstream new_str (prop->
value());
643 int integer_value_so_that_istream_does_the_right_thing;
644 new_str >> integer_value_so_that_istream_does_the_right_thing;
645 change.
new_value = integer_value_so_that_istream_does_the_right_thing;
658 change.
note = _model->find_note (note_id);
673 _added_notes.clear();
677 transform(notes.begin(), notes.end(), back_inserter(_added_notes),
684 _removed_notes.clear();
688 transform(notes.begin(), notes.end(), back_inserter(_removed_notes),
701 transform (notes.begin(), notes.end(), back_inserter(_changes),
708 side_effect_removals.clear();
712 if (side_effect_notes) {
714 for (XMLNodeList::iterator n = notes.begin(); n != notes.end(); ++n) {
715 side_effect_removals.insert (unmarshal_note (*n));
726 diff_command->
add_property(
"midi-source", _model->midi_source()->id().to_s());
729 for_each(_changes.begin(), _changes.end(),
735 for_each(_added_notes.begin(), _added_notes.end(),
741 for_each(_removed_notes.begin(), _removed_notes.end(),
749 if (!side_effect_removals.empty()) {
751 for_each(side_effect_removals.begin(), side_effect_removals.end(),
757 return *diff_command;
777 _changes.push_back (change);
786 for (list<SysExPtr>::iterator i = _removed.begin(); i != _removed.end(); ++i) {
787 _model->remove_sysex_unlocked (*i);
792 for (ChangeList::iterator i = _changes.begin(); i != _changes.end(); ++i) {
794 i->sysex = _model->find_sysex (i->sysex_id);
799 for (ChangeList::iterator i = _changes.begin(); i != _changes.end(); ++i) {
800 switch (i->property) {
802 i->sysex->set_time (i->new_time);
807 _model->ContentsChanged ();
816 for (list<SysExPtr>::iterator i = _removed.begin(); i != _removed.end(); ++i) {
817 _model->add_sysex_unlocked (*i);
822 for (ChangeList::iterator i = _changes.begin(); i != _changes.end(); ++i) {
824 i->sysex = _model->find_sysex (i->sysex_id);
829 for (ChangeList::iterator i = _changes.begin(); i != _changes.end(); ++i) {
830 switch (i->property) {
832 i->sysex->set_time (i->old_time);
839 _model->ContentsChanged();
845 _removed.push_back(sysex);
858 ostringstream old_value_str (ios::ate);
864 ostringstream new_value_str (ios::ate);
869 ostringstream id_str;
870 id_str << change.
sysex->id();
882 if ((prop = xml_change->
property (
"property")) != 0) {
889 if ((prop = xml_change->
property (
"id")) == 0) {
890 error <<
_(
"No SysExID found for sys-ex property change - ignored") <<
endmsg;
894 gint sysex_id =
atoi (prop->
value().c_str());
896 if ((prop = xml_change->
property (
"old")) != 0) {
897 istringstream old_str (prop->
value());
904 if ((prop = xml_change->
property (
"new")) != 0) {
905 istringstream new_str (prop->
value());
916 change.
sysex = _model->find_sysex (sysex_id);
935 if (changed_sysexes) {
937 transform (sysexes.begin(), sysexes.end(), back_inserter (_changes),
949 diff_command->
add_property (
"midi-source", _model->midi_source()->id().to_s());
952 for_each (_changes.begin(), _changes.end(),
957 return *diff_command;
976 _added.push_back (p);
982 _removed.push_back (p);
994 _changes.push_back (c);
1007 _changes.push_back (c);
1020 _changes.push_back (c);
1032 _changes.push_back (c);
1041 for (list<PatchChangePtr>::iterator i = _added.begin(); i != _added.end(); ++i) {
1042 _model->add_patch_change_unlocked (*i);
1045 for (list<PatchChangePtr>::iterator i = _removed.begin(); i != _removed.end(); ++i) {
1046 _model->remove_patch_change_unlocked (*i);
1051 for (ChangeList::iterator i = _changes.begin(); i != _changes.end(); ++i) {
1053 i->patch = _model->find_patch_change (i->patch_id);
1058 set<PatchChangePtr> temporary_removals;
1060 for (ChangeList::iterator i = _changes.begin(); i != _changes.end(); ++i) {
1061 switch (i->property) {
1063 if (temporary_removals.find (i->patch) == temporary_removals.end()) {
1064 _model->remove_patch_change_unlocked (i->patch);
1065 temporary_removals.insert (i->patch);
1067 i->patch->set_time (i->new_time);
1071 i->patch->set_channel (i->new_channel);
1075 i->patch->set_program (i->new_program);
1079 i->patch->set_bank (i->new_bank);
1084 for (set<PatchChangePtr>::iterator i = temporary_removals.begin(); i != temporary_removals.end(); ++i) {
1085 _model->add_patch_change_unlocked (*i);
1089 _model->ContentsChanged ();
1098 for (list<PatchChangePtr>::iterator i = _added.begin(); i != _added.end(); ++i) {
1099 _model->remove_patch_change_unlocked (*i);
1102 for (list<PatchChangePtr>::iterator i = _removed.begin(); i != _removed.end(); ++i) {
1103 _model->add_patch_change_unlocked (*i);
1108 for (ChangeList::iterator i = _changes.begin(); i != _changes.end(); ++i) {
1110 i->patch = _model->find_patch_change (i->patch_id);
1115 set<PatchChangePtr> temporary_removals;
1117 for (ChangeList::iterator i = _changes.begin(); i != _changes.end(); ++i) {
1118 switch (i->property) {
1120 if (temporary_removals.find (i->patch) == temporary_removals.end()) {
1121 _model->remove_patch_change_unlocked (i->patch);
1122 temporary_removals.insert (i->patch);
1124 i->patch->set_time (i->old_time);
1128 i->patch->set_channel (i->old_channel);
1132 i->patch->set_program (i->old_program);
1136 i->patch->set_bank (i->old_bank);
1141 for (set<PatchChangePtr>::iterator i = temporary_removals.begin(); i != temporary_removals.end(); ++i) {
1142 _model->add_patch_change_unlocked (*i);
1147 _model->ContentsChanged ();
1156 ostringstream s (ios::ate);
1157 s << int (p->id ());
1162 ostringstream s (ios::ate);
1168 ostringstream s (ios::ate);
1169 s << int (p->channel ());
1174 ostringstream s (ios::ate);
1175 s << int (p->program ());
1180 ostringstream s (ios::ate);
1181 s << int (p->bank ());
1196 ostringstream s (ios::ate);
1199 }
else if (c.
property == Channel) {
1201 }
else if (c.
property == Program) {
1211 ostringstream s (ios::ate);
1215 }
else if (c.
property == Channel) {
1217 }
else if (c.
property == Program) {
1228 s << c.
patch->id ();
1246 if ((prop_id = n->
property (
"id")) != 0) {
1247 istringstream s (prop_id->
value());
1251 if ((prop = n->
property (
"time")) != 0) {
1252 istringstream s (prop->
value ());
1256 if ((prop = n->
property (
"channel")) != 0) {
1257 istringstream s (prop->
value ());
1261 if ((prop = n->
property (
"program")) != 0) {
1262 istringstream s (prop->
value ());
1266 if ((prop = n->
property (
"bank")) != 0) {
1267 istringstream s (prop->
value ());
1299 istringstream s (prop->value ());
1302 }
else if (c.
property == Channel) {
1305 }
else if (c.
property == Program) {
1317 istringstream s (prop->value ());
1321 }
else if (c.
property == Channel) {
1324 }
else if (c.
property == Program) {
1333 c.
patch = _model->find_patch_change (
id);
1374 diff_command->
add_property(
"midi-source", _model->midi_source()->id().to_s());
1377 for_each (_added.begin(), _added.end(),
1385 for_each (_removed.begin(), _removed.end(),
1393 for_each (_changes.begin(), _changes.end(),
1400 return *diff_command;
1452 error <<
"MIDI model has no source to sync to" <<
endmsg;
1500 if (ev.
time() >= begin_time && ev.
time() < end_time) {
1552 Notes::iterator l =
notes().lower_bound(other);
1555 for (; (*l)->time() == other->time(); ++l) {
1561 if (**l == *other) {
1578 if ((*l)->id() == note_id) {
1590 if ((*i)->id() == id) {
1606 if ((*l)->id() == sysex_id) {
1651 set<NotePtr> to_be_deleted;
1652 bool set_note_length =
false;
1653 bool set_note_time =
false;
1655 TimeType note_length = note->length();
1659 for (Pitches::const_iterator i = p.lower_bound (search_note);
1660 i != p.end() && (*i)->note() == note->note(); ++i) {
1666 if ((sb > sa) && (eb <= ea)) {
1668 }
else if ((eb >= sa) && (eb <= ea)) {
1670 }
else if ((sb > sa) && (sb <= ea)) {
1672 }
else if ((sa >= sb) && (sa <= eb) && (ea <= eb)) {
1680 "\toverlap is %1 for (%2,%3) vs (%4,%5)\n",
1690 cerr <<
"OverlapStart\n";
1694 to_be_deleted.insert (*i);
1700 (*i)->set_length (note->time() - (*i)->time());
1703 set_note_time =
true;
1704 set_note_length =
true;
1705 note_time = (*i)->time() + (*i)->length();
1706 note_length = min (note_length, (*i)->length() - ((*i)->end_time() - note->time()));
1712 (*i)->set_length (note->end_time() - (*i)->time());
1723 cerr <<
"OverlapEnd\n";
1727 to_be_deleted.insert (*i);
1737 set_note_length =
true;
1738 note_length = min (note_length, ((*i)->time() - note->time()));
1747 to_be_deleted.insert (*i);
1748 set_note_length =
true;
1749 note_length = min (note_length, (*i)->end_time() - note->time());
1759 cerr <<
"OverlapExt\n";
1763 to_be_deleted.insert (*i);
1778 cerr <<
"OverlapInt\n";
1786 to_be_deleted.insert (*i);
1802 for (set<NotePtr>::iterator i = to_be_deleted.begin(); i != to_be_deleted.end(); ++i) {
1810 if (set_note_time) {
1814 note->set_time (note_time);
1817 if (set_note_length) {
1821 note->set_length (note_length);
1871 control(p)->list()->set_interpolation (s);
1944 for (Notes::const_iterator i =
notes().
begin(); i !=
notes().end(); ++i) {
1965 for (Controls::iterator i =
controls().begin(); i !=
controls().end(); ++i) {
1968 i->second->list()->shift (0, t.
to_double());
1979 c->
change (*i, (*i)->time() + t);
2003 if ((*i)->time() >= to) {
2008 }
else if ((*i)->time() >= from) {
2010 int new_note = (*i)->note() + semitones;
2014 }
else if (new_note > 127) {
bool transport_rolling() const
void set_automation_state(AutoState)
void apply_command(Session &session, Command *cmd)
LIBPBD_API Transmitter fatal
NoteMode note_mode() const
int atoi(const string &s)
Change unmarshal_change(XMLNode *)
SysExDiffCommand::Property property
virtual void mark_streaming_midi_write_started(const Lock &lock, NoteMode mode)
PBD::ScopedConnectionList _midi_source_connections
boost::shared_ptr< Evoral::Control > control_factory(const Evoral::Parameter &id)
Change unmarshal_change(XMLNode *)
void begin_reversible_command(const std::string &cmd_name)
void control_list_interpolation_changed(Evoral::Parameter, Evoral::ControlList::InterpolationStyle)
NoteDiffCommand & operator+=(const NoteDiffCommand &other)
void change_channel(PatchChangePtr, uint8_t)
const std::string & value() const
std::multiset< NotePtr, NoteNumberComparator > Pitches
Glib::Threads::Mutex::Lock Lock
boost::shared_ptr< MidiModel > _model
PBD::Signal2< void, Evoral::Parameter, AutoState > AutomationStateChanged
NoteDiffCommand::Property property
bool write_section_to(boost::shared_ptr< MidiSource > source, const Glib::Threads::Mutex::Lock &source_lock, Evoral::Beats begin=Evoral::MinBeats, Evoral::Beats end=Evoral::MaxBeats)
Session & session() const
#define NOTE_DIFF_COMMAND_ELEMENT
void change(boost::shared_ptr< Evoral::Event< TimeType > >, TimeType)
InsertMergePolicy insert_merge_policy() const
void insert_silence_at_start(TimeType)
shared_ptr< T > dynamic_pointer_cast(shared_ptr< U > const &r)
void change_time(PatchChangePtr, TimeType)
const std::string & name() const
PatchChangeDiffCommand(boost::shared_ptr< MidiModel >, const std::string &)
void add_command(Command *const cmd)
virtual void mark_streaming_write_completed(const Lock &lock)
boost::shared_ptr< Control > control(const Parameter &id, bool create_if_missing=false)
NoteDiffCommand(boost::shared_ptr< MidiModel > m, const std::string &name)
#define SYSEX_DIFF_COMMAND_ELEMENT
AutoState automation_state_of(Evoral::Parameter) const
PatchChangePtr unmarshal_patch_change(XMLNode *)
void set_interpolation_of(Evoral::Parameter, Evoral::ControlList::InterpolationStyle)
void set_automation_state_of(Evoral::Parameter, AutoState)
LIBPBD_API Transmitter error
LIBPBD_API Transmitter warning
PBD::Signal2< void, Evoral::Parameter, Evoral::ControlList::InterpolationStyle > InterpolationChanged
#define DIFF_PATCH_CHANGES_ELEMENT
const XMLNodeList & children(const std::string &str=std::string()) const
DiffCommand(boost::shared_ptr< MidiModel > m, const std::string &name)
void drop_model(const Glib::Threads::Mutex::Lock &lock)
std::ostream & endmsg(std::ostream &ostr)
PBD::Signal0< void > ContentsChanged
SessionConfiguration config
#define SIDE_EFFECT_REMOVALS_ELEMENT
void change_bank(PatchChangePtr, int)
LIBEVORAL_API uint64_t Sequence
XMLNode * add_child(const char *)
#define DIFF_NOTES_ELEMENT
MidiModel::SysExDiffCommand * new_sysex_diff_command(const std::string name="midi edit")
bool write_to(boost::shared_ptr< MidiSource > source, const Glib::Threads::Mutex::Lock &source_lock)
XMLNode & marshal_patch_change(constPatchChangePtr)
std::list< XMLNode * > XMLNodeList
Glib::Threads::Mutex _control_lock
#define DIFF_SYSEXES_ELEMENT
#define ADDED_PATCH_CHANGES_ELEMENT
MidiModel::NoteDiffCommand * new_note_diff_command(const std::string name="midi edit")
void source_interpolation_changed(Evoral::Parameter, Evoral::ControlList::InterpolationStyle)
PatchChanges & patch_changes()
void resolve_notes(MidiBuffer &buffer, framepos_t time)
int set_state(const XMLNode &, int version)
boost::shared_ptr< MidiModel > model()
XMLNode & marshal_note(const NotePtr note)
PatchChangePtr find_patch_change(Evoral::event_id_t)
virtual void append_event_beats(const Lock &lock, const Evoral::Event< Evoral::Beats > &ev)=0
static Variant get_value(const NotePtr note, Property prop)
NoteChange unmarshal_change(XMLNode *xml_note)
XMLProperty * property(const char *)
boost::shared_ptr< const MidiSource > midi_source()
#define string_2_enum(str, e)
void remove(SysExPtr sysex)
const const_iterator & end() const
boost::shared_ptr< Evoral::Event< TimeType > > sysex
void change(const NotePtr note, Property prop, uint8_t new_value)
void commit_reversible_command(Command *cmd=0)
void apply_command_as_subcommand(Session &session, Command *cmd)
boost::shared_ptr< Evoral::Note< Evoral::Beats > > NotePtr
virtual ReadLock read_lock() const
NotePtr unmarshal_note(XMLNode *xml_note)
#define DEBUG_TRACE(bits, str)
#define ADDED_NOTES_ELEMENT
void automation_list_automation_state_changed(Evoral::Parameter, AutoState)
bool sync_to_source(const Glib::Threads::Mutex::Lock &source_lock)
Evoral::ControlList::InterpolationStyle interpolation_of(Evoral::Parameter) const
static int loading_state_version
const Evoral::Beats & get_beats() const
void remove_note_unlocked(const constNotePtr note)
Pitches & pitches(uint8_t chan)
#define REMOVED_PATCH_CHANGES_ELEMENT
XMLProperty * add_property(const char *name, const std::string &value)
Glib::Threads::Mutex & mutex()
void source_automation_state_changed(Evoral::Parameter, AutoState)
boost::shared_ptr< WriteLockImpl > WriteLock
void add_child_nocopy(XMLNode &)
void control_list_marked_dirty()
void remove(uint8_t note, uint8_t chn)
MidiModel::PatchChangeDiffCommand * new_patch_change_diff_command(const std::string name="midi edit")
void set_percussive(bool p)
boost::shared_ptr< ControlList > list()
XMLNode & marshal_change(const NoteChange &)
const_iterator begin(Evoral::Beatst=Evoral::Beats(), bool force_discrete=false, const std::set< Evoral::Parameter > &f=std::set< Evoral::Parameter >(), const std::set< WeakNotePtr > *active_notes=NULL) const
boost::shared_ptr< Evoral::Note< TimeType > > find_note(NotePtr)
void change_program(PatchChangePtr, uint8_t)
boost::shared_ptr< Evoral::Control > control_factory(const Evoral::Parameter &id)
std::set< NotePtr > side_effect_removals
XMLNode & marshal_change(const Change &)
void remove(const NotePtr note)
void transpose(TimeType, TimeType, int)
Glib::Threads::RWLock _lock
void side_effect_remove(const NotePtr note)
XMLNode * child(const char *) const
XMLNode & marshal_change(const Change &)
int resolve_overlaps_unlocked(const NotePtr, void *arg=0)
LIBEVORAL_API uint64_t Beats
void add(uint8_t note, uint8_t chn)
boost::shared_ptr< AutomationList > alist() const
const std::string & name() const
#define PATCH_CHANGE_DIFF_COMMAND_ELEMENT
#define REMOVED_NOTES_ELEMENT
SysExDiffCommand(boost::shared_ptr< MidiModel > m, const XMLNode &node)
int set_state(const XMLNode &, int version)
static LilvNode * get_value(LilvWorld *world, const LilvNode *subject, const LilvNode *predicate)
boost::shared_ptr< Evoral::Event< TimeType > > find_sysex(gint)
void set_midi_source(boost::shared_ptr< MidiSource >)
boost::shared_ptr< PatchChange< Evoral::Beats > > PatchChangePtr
void remove(PatchChangePtr)
std::set< WeakNotePtr > _active_notes
void add(const NotePtr note)
static Variant::Type value_type(Property prop)
int set_state(const XMLNode &, int version)
bool active(uint8_t note, uint8_t channel)
std::string string_compose(const std::string &fmt, const T1 &o1)
void invalidate(const Glib::Threads::Mutex::Lock &lock, std::set< Evoral::Sequence< Evoral::Beats >::WeakNotePtr > *notes=NULL)
LIBARDOUR_API PBD::PropertyDescriptor< framecnt_t > length
boost::weak_ptr< MidiSource > _midi_source
virtual void control_list_marked_dirty()