Adapt range when copying between automation types.
For things like copying from pitch bender to a CC. Also things like fader to pan, but that seems a bit funny. The conversion probably needs to be a bit smarter here, perhaps taking the normal into consideration...
This commit is contained in:
parent
96a9292a40
commit
4650912ae3
@ -4440,26 +4440,25 @@ Editor::paste_internal (framepos_t position, float times)
|
||||
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);
|
||||
|
@ -57,6 +57,10 @@ public:
|
||||
return (_type == id._type && _channel == id._channel && _id == id._id );
|
||||
}
|
||||
|
||||
inline bool operator!=(const Parameter& id) const {
|
||||
return !operator==(id);
|
||||
}
|
||||
|
||||
/** Strict weak ordering
|
||||
* See: http://www.sgi.com/tech/stl/StrictWeakOrdering.html
|
||||
* Sort Parameters first according to type then to channel and lastly to ID.
|
||||
|
@ -1599,7 +1599,16 @@ ControlList::paste (const ControlList& alist, double pos, float /*times*/)
|
||||
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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user