X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fmidi_region.cc;h=092915cefb117eaebe81a6cf86a5502c859afd21;hb=bc3e1a212250a67e53e86c972287a275834a967a;hp=ba926211a3fa2f5512cbd80c201443558bee4aa2;hpb=a473d630eb165272992e90f8d854b1d66ec0be63;p=ardour.git diff --git a/libs/ardour/midi_region.cc b/libs/ardour/midi_region.cc index ba926211a3..092915cefb 100644 --- a/libs/ardour/midi_region.cc +++ b/libs/ardour/midi_region.cc @@ -30,15 +30,17 @@ #include "pbd/xml++.h" #include "pbd/enumwriter.h" -#include "ardour/midi_region.h" -#include "ardour/session.h" -#include "ardour/gain.h" +#include "ardour/automation_control.h" #include "ardour/dB.h" -#include "ardour/playlist.h" +#include "ardour/midi_model.h" +#include "ardour/midi_region.h" +#include "ardour/midi_ring_buffer.h" #include "ardour/midi_source.h" +#include "ardour/playlist.h" #include "ardour/region_factory.h" +#include "ardour/session.h" +#include "ardour/tempo.h" #include "ardour/types.h" -#include "ardour/midi_ring_buffer.h" #include "i18n.h" #include @@ -50,6 +52,7 @@ using namespace PBD; namespace ARDOUR { namespace Properties { PBD::PropertyDescriptor midi_data; + PBD::PropertyDescriptor start_beats; PBD::PropertyDescriptor length_beats; } } @@ -59,6 +62,8 @@ MidiRegion::make_property_quarks () { Properties::midi_data.property_id = g_quark_from_static_string (X_("midi-data")); DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for midi-data = %1\n", Properties::midi_data.property_id)); + Properties::start_beats.property_id = g_quark_from_static_string (X_("start-beats")); + DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for start-beats = %1\n", Properties::start_beats.property_id)); Properties::length_beats.property_id = g_quark_from_static_string (X_("length-beats")); DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for length-beats = %1\n", Properties::length_beats.property_id)); } @@ -66,12 +71,14 @@ MidiRegion::make_property_quarks () void MidiRegion::register_properties () { + add_property (_start_beats); add_property (_length_beats); } /* Basic MidiRegion constructor (many channels) */ MidiRegion::MidiRegion (const SourceList& srcs) : Region (srcs) + , _start_beats (Properties::start_beats, 0) , _length_beats (Properties::length_beats, midi_source(0)->length_beats()) { register_properties (); @@ -84,6 +91,7 @@ MidiRegion::MidiRegion (const SourceList& srcs) MidiRegion::MidiRegion (boost::shared_ptr other) : Region (other) + , _start_beats (Properties::start_beats, other->_start_beats) , _length_beats (Properties::length_beats, (Evoral::MusicalTime) 0) { update_length_beats (); @@ -94,14 +102,16 @@ MidiRegion::MidiRegion (boost::shared_ptr other) model_changed (); } -/** Create a new MidiRegion, that is part of an existing one */ +/** Create a new MidiRegion that is part of an existing one */ MidiRegion::MidiRegion (boost::shared_ptr other, frameoffset_t offset) : Region (other, offset) + , _start_beats (Properties::start_beats, (Evoral::MusicalTime) 0) , _length_beats (Properties::length_beats, (Evoral::MusicalTime) 0) { BeatsFramesConverter bfc (_session.tempo_map(), _position); Evoral::MusicalTime const offset_beats = bfc.from (offset); + _start_beats = other->_start_beats + offset_beats; _length_beats = other->_length_beats - offset_beats; register_properties (); @@ -118,7 +128,7 @@ MidiRegion::~MidiRegion () /** Create a new MidiRegion that has its own version of some/all of the Source used by another. */ boost::shared_ptr -MidiRegion::clone () +MidiRegion::clone () const { BeatsFramesConverter bfc (_session.tempo_map(), _position); Evoral::MusicalTime const bbegin = bfc.from (_start); @@ -131,6 +141,7 @@ MidiRegion::clone () plist.add (Properties::name, ms->name()); plist.add (Properties::whole_file, true); plist.add (Properties::start, _start); + plist.add (Properties::start_beats, _start_beats); plist.add (Properties::length, _length); plist.add (Properties::length_beats, _length_beats); plist.add (Properties::layer, 0); @@ -141,11 +152,22 @@ MidiRegion::clone () void MidiRegion::post_set (const PropertyChange& pc) { + Region::post_set (pc); + if (pc.contains (Properties::length) && !pc.contains (Properties::length_beats)) { update_length_beats (); + } else if (pc.contains (Properties::start) && !pc.contains (Properties::start_beats)) { + set_start_beats_from_start_frames (); } } +void +MidiRegion::set_start_beats_from_start_frames () +{ + BeatsFramesConverter c (_session.tempo_map(), _position - _start); + _start_beats = c.from (_start); +} + void MidiRegion::set_length_internal (framecnt_t len) { @@ -153,6 +175,17 @@ MidiRegion::set_length_internal (framecnt_t len) update_length_beats (); } +void +MidiRegion::update_after_tempo_map_change () +{ + Region::update_after_tempo_map_change (); + + /* _position has now been updated for the new tempo map */ + _start = _position - _session.tempo_map().framepos_minus_beats (_position, _start_beats); + + send_change (Properties::start); +} + void MidiRegion::update_length_beats () { @@ -220,13 +253,11 @@ MidiRegion::_read_at (const SourceList& /*srcs*/, Evoral::EventSink& return 0; /* read nothing */ } - _read_data_count = 0; - boost::shared_ptr src = midi_source(chan_n); src->set_note_mode(mode); /* - cerr << "MR read @ " << position << " * " << to_read + cerr << "MR " << name () << " read @ " << position << " * " << to_read << " _position = " << _position << " _start = " << _start << " intoffset = " << internal_offset @@ -246,8 +277,6 @@ MidiRegion::_read_at (const SourceList& /*srcs*/, Evoral::EventSink& return 0; /* "read nothing" */ } - _read_data_count += src->read_data_count(); - return to_read; } @@ -296,10 +325,28 @@ MidiRegion::separate_by_channel (ARDOUR::Session&, vector< boost::shared_ptr +MidiRegion::control (const Evoral::Parameter& id, bool create) { - return -1; + return model()->control(id, create); +} + +boost::shared_ptr +MidiRegion::control (const Evoral::Parameter& id) const +{ + return model()->control(id); +} + +boost::shared_ptr +MidiRegion::model() +{ + return midi_source()->model(); +} + +boost::shared_ptr +MidiRegion::model() const +{ + return midi_source()->model(); } boost::shared_ptr