}
int
-MidiStretch::run (boost::shared_ptr<Region> r)
+MidiStretch::run (boost::shared_ptr<Region> r, Progress* progress)
{
SourceList nsrcs;
char suffix[32];
boost::shared_ptr<MidiSource> new_src = boost::dynamic_pointer_cast<MidiSource>(nsrcs[0]);
assert(new_src);
- new_src->load_model(true, true);
+ Glib::Mutex::Lock sl (new_src->mutex ());
+
+ new_src->load_model(false, true);
boost::shared_ptr<MidiModel> new_model = new_src->model();
new_model->start_write();
- for (Evoral::Sequence<MidiModel::TimeType>::const_iterator i = old_model->begin();
+ /* Note: pass true into force_discrete for the begin() iterator so that the model doesn't
+ * do interpolation of controller data when we stretch.
+ */
+ for (Evoral::Sequence<MidiModel::TimeType>::const_iterator i = old_model->begin (0, true);
i != old_model->end(); ++i) {
const double new_time = i->time() * _request.time_fraction;
// FIXME: double copy
Evoral::Event<MidiModel::TimeType> ev(*i, true);
ev.time() = new_time;
- new_model->append(ev);
+ new_model->append(ev, Evoral::next_event_id());
}
new_model->end_write();
new_model->set_edited(true);
+ new_src->copy_interpolation_from (src);
+
const int ret = finish (region, nsrcs, new_name);
results[0]->set_length((nframes_t) floor (r->length() * _request.time_fraction), NULL);