X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fardour%2Fmidi_model.h;h=e74bc26c36204bd51caf09c3615a39444ef22a08;hb=777fe3c68fef42d8fee79432830787bcebdfcb59;hp=31df5ef040d1ef237d5fafe45c65ca19f51b94f9;hpb=c1cfa12d6e5136d2e3e5501e83ff74c5009a9e60;p=ardour.git diff --git a/libs/ardour/ardour/midi_model.h b/libs/ardour/ardour/midi_model.h index 31df5ef040..e74bc26c36 100644 --- a/libs/ardour/ardour/midi_model.h +++ b/libs/ardour/ardour/midi_model.h @@ -21,19 +21,22 @@ #ifndef __ardour_midi_model_h__ #define __ardour_midi_model_h__ -#include #include +#include #include + #include #include + #include "pbd/command.h" -#include "ardour/libardour_visibility.h" -#include "ardour/types.h" -#include "ardour/midi_buffer.h" -#include "ardour/midi_ring_buffer.h" + #include "ardour/automatable_sequence.h" #include "ardour/libardour_visibility.h" +#include "ardour/libardour_visibility.h" +#include "ardour/types.h" #include "ardour/types.h" +#include "ardour/variant.h" + #include "evoral/Note.hpp" #include "evoral/Sequence.hpp" @@ -49,9 +52,9 @@ class MidiSource; * Because of this MIDI controllers and automatable controllers/widgets/etc * are easily interchangeable. */ -class LIBARDOUR_API MidiModel : public AutomatableSequence { +class LIBARDOUR_API MidiModel : public AutomatableSequence { public: - typedef Evoral::MusicalTime TimeType; + typedef Temporal::Beats TimeType; MidiModel (boost::shared_ptr); @@ -103,8 +106,15 @@ public: void remove (const NotePtr note); void side_effect_remove (const NotePtr note); - void change (const NotePtr note, Property prop, uint8_t new_value); - void change (const NotePtr note, Property prop, TimeType new_time); + void change (const NotePtr note, Property prop, uint8_t new_value) { + change(note, prop, Variant(new_value)); + } + + void change (const NotePtr note, Property prop, TimeType new_time) { + change(note, prop, Variant(new_time)); + } + + void change (const NotePtr note, Property prop, const Variant& new_value); bool adds_or_removes() const { return !_added_notes.empty() || !_removed_notes.empty(); @@ -112,23 +122,29 @@ public: NoteDiffCommand& operator+= (const NoteDiffCommand& other); - private: + static Variant get_value (const NotePtr note, Property prop); + + static Variant::Type value_type (Property prop); + struct NoteChange { NoteDiffCommand::Property property; NotePtr note; uint32_t note_id; - uint8_t old_value; // or... - TimeType old_time; // this - uint8_t new_value; // or... - TimeType new_time; // this + Variant old_value; + Variant new_value; }; - typedef std::list ChangeList; - ChangeList _changes; - + typedef std::list ChangeList; typedef std::list< boost::shared_ptr< Evoral::Note > > NoteList; - NoteList _added_notes; - NoteList _removed_notes; + + const ChangeList& changes() const { return _changes; } + const NoteList& added_notes() const { return _added_notes; } + const NoteList& removed_notes() const { return _removed_notes; } + + private: + ChangeList _changes; + NoteList _added_notes; + NoteList _removed_notes; std::set side_effect_removals; @@ -159,8 +175,9 @@ public: private: struct Change { + Change () : sysex_id (0) {} boost::shared_ptr > sysex; - gint sysex_id; + gint sysex_id; SysExDiffCommand::Property property; TimeType old_time; TimeType new_time; @@ -234,16 +251,23 @@ public: PatchChangePtr unmarshal_patch_change (XMLNode *); }; - MidiModel::NoteDiffCommand* new_note_diff_command (const std::string name = "midi edit"); - MidiModel::SysExDiffCommand* new_sysex_diff_command (const std::string name = "midi edit"); - MidiModel::PatchChangeDiffCommand* new_patch_change_diff_command (const std::string name = "midi edit"); + MidiModel::NoteDiffCommand* new_note_diff_command (const std::string& name = "midi edit"); + MidiModel::SysExDiffCommand* new_sysex_diff_command (const std::string& name = "midi edit"); + MidiModel::PatchChangeDiffCommand* new_patch_change_diff_command (const std::string& name = "midi edit"); void apply_command (Session& session, Command* cmd); + void apply_command (Session* session, Command* cmd) { if (session) { apply_command (*session, cmd); } } void apply_command_as_subcommand (Session& session, Command* cmd); - bool sync_to_source (); - bool write_to(boost::shared_ptr source); - bool write_section_to (boost::shared_ptr source, Evoral::MusicalTime begin = Evoral::MinMusicalTime, - Evoral::MusicalTime end = Evoral::MaxMusicalTime); + bool sync_to_source (const Glib::Threads::Mutex::Lock& source_lock); + + bool write_to(boost::shared_ptr source, + const Glib::Threads::Mutex::Lock& source_lock); + + bool write_section_to(boost::shared_ptr source, + const Glib::Threads::Mutex::Lock& source_lock, + Temporal::Beats begin = Temporal::Beats(), + Temporal::Beats end = std::numeric_limits::max(), + bool offset_events = false); // MidiModel doesn't use the normal AutomationList serialisation code // since controller data is stored in the .mid @@ -251,6 +275,7 @@ public: int set_state(const XMLNode&) { return 0; } PBD::Signal0 ContentsChanged; + PBD::Signal1 ContentsShifted; boost::shared_ptr midi_source (); void set_midi_source (boost::shared_ptr); @@ -266,7 +291,7 @@ public: boost::shared_ptr control_factory(const Evoral::Parameter& id); void insert_silence_at_start (TimeType); - void transpose (TimeType, TimeType, int); + void transpose (NoteDiffCommand *, const NotePtr, int); protected: int resolve_overlaps_unlocked (const NotePtr, void* arg = 0); @@ -285,7 +310,6 @@ private: public: WriteLock edit_lock(); - WriteLock write_lock(); private: friend class DeltaCommand;