summaryrefslogtreecommitdiff
path: root/libs/ardour/midi_region.cc
diff options
context:
space:
mode:
Diffstat (limited to 'libs/ardour/midi_region.cc')
-rw-r--r--libs/ardour/midi_region.cc23
1 files changed, 23 insertions, 0 deletions
diff --git a/libs/ardour/midi_region.cc b/libs/ardour/midi_region.cc
index 936ce047ee..eaac23300b 100644
--- a/libs/ardour/midi_region.cc
+++ b/libs/ardour/midi_region.cc
@@ -37,6 +37,7 @@
#include "ardour/dB.h"
#include "ardour/playlist.h"
#include "ardour/midi_source.h"
+#include "ardour/region_factory.h"
#include "ardour/types.h"
#include "ardour/midi_ring_buffer.h"
@@ -68,6 +69,28 @@ MidiRegion::~MidiRegion ()
{
}
+/** Create a new MidiRegion that has its own version of some/all of the Source used by another.
+ */
+boost::shared_ptr<MidiRegion>
+MidiRegion::clone ()
+{
+ BeatsFramesConverter bfc (_session.tempo_map(), _position);
+ double bbegin = bfc.from (_position);
+ double bend = bfc.from (last_frame() + 1);
+
+ boost::shared_ptr<MidiSource> ms = midi_source(0)->clone (bbegin, bend);
+
+ PropertyList plist;
+
+ plist.add (Properties::name, ms->name());
+ plist.add (Properties::whole_file, true);
+ plist.add (Properties::start, 0);
+ plist.add (Properties::length, _length);
+ plist.add (Properties::layer, 0);
+
+ return boost::dynamic_pointer_cast<MidiRegion> (RegionFactory::create (ms, plist, true));
+}
+
void
MidiRegion::set_position_internal (framepos_t pos, bool allow_bbt_recompute)
{