R1.A1, R1.A2, R2, R2.A1, ... */
}
- if (internal_editing ()) {
+ if (ts.size() == 1 && cut_buffer->lines.size() == 1 &&
+ dynamic_cast<AutomationTimeAxisView*>(ts.front())) {
+ /* Only one line copied, and one automation track selected. Do a
+ "greedy" paste from one automation type to another. */
+
+ begin_reversible_command (Operations::paste);
+
+ PasteContext ctx(paste_count, times, ItemCounts(), true);
+ ts.front()->paste (position, *cut_buffer, ctx);
+
+ commit_reversible_command ();
+
+ } else if (internal_editing ()) {
/* undo/redo is handled by individual tracks/regions */
RegionSelection rs;
get_regions_at (rs, position, ts);
- if (ts.size() == 1 && cut_buffer->lines.size() == 1) {
- AutomationTimeAxisView* atv = dynamic_cast<AutomationTimeAxisView*>(ts.front());
- if (atv) {
- /* Only one line, and one automation track selected. Do a
- "greedy" paste from one automation type to another. */
- PasteContext ctx(paste_count, times, ItemCounts(), true);
- begin_reversible_command (Operations::paste);
- atv->paste (position, *cut_buffer, ctx);
- commit_reversible_command ();
- return;
- }
- }
-
PasteContext ctx(paste_count, times, ItemCounts(), false);
for (RegionSelection::iterator r = rs.begin(); r != rs.end(); ++r) {
MidiRegionView* mrv = dynamic_cast<MidiRegionView*> (*r);
where = upper_bound (_events.begin(), _events.end(), &cp, time_comparator);
for (const_iterator i = alist.begin();i != alist.end(); ++i) {
- _events.insert (where, new ControlEvent( (*i)->when+pos,( *i)->value));
+ double value = (*i)->value;
+ if (alist.parameter() != parameter()) {
+ const ParameterDescriptor& src_desc = alist.descriptor();
+
+ value -= src_desc.lower; // translate to 0-relative
+ value /= (src_desc.upper - src_desc.lower); // normalize range
+ value *= (_desc.upper - _desc.lower); // scale to our range
+ value += _desc.lower; // translate to our offset
+ }
+ _events.insert (where, new ControlEvent((*i)->when + pos, value));
end = (*i)->when + pos;
}