X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fardour%2Fmidi_model.h;h=e74bc26c36204bd51caf09c3615a39444ef22a08;hb=777fe3c68fef42d8fee79432830787bcebdfcb59;hp=dc1c7af0e9796daf97c14a29e06f567543bbbea7;hpb=ad017365f7a73f8ba57f667cc1aa36478b48c50e;p=ardour.git diff --git a/libs/ardour/ardour/midi_model.h b/libs/ardour/ardour/midi_model.h index dc1c7af0e9..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,28 +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; - - union { - uint8_t old_value; - TimeType old_time; - }; - union { - uint8_t new_value; - TimeType new_time; - }; + uint32_t note_id; + 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; @@ -164,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; @@ -209,16 +221,16 @@ public: struct Change { PatchChangePtr patch; Property property; - gint patch_id; + gint patch_id; + TimeType old_time; union { - TimeType old_time; uint8_t old_channel; int old_bank; uint8_t old_program; }; + TimeType new_time; union { uint8_t new_channel; - TimeType new_time; uint8_t new_program; int new_bank; }; @@ -239,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 @@ -256,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); @@ -271,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); @@ -290,7 +310,6 @@ private: public: WriteLock edit_lock(); - WriteLock write_lock(); private: friend class DeltaCommand; @@ -311,7 +330,5 @@ private: } /* namespace ARDOUR */ -/* This is a very long comment and stuff oh my god it's so long what are we going to do oh no oh no*/ - #endif /* __ardour_midi_model_h__ */