summaryrefslogtreecommitdiff
path: root/libs/evoral/src/ControlList.cpp
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2014-12-06 13:37:08 -0500
committerDavid Robillard <d@drobilla.net>2014-12-06 13:40:35 -0500
commit4650912ae36ef79fd342a6e183e0bc205d3326c2 (patch)
tree3af63c1b0dc9dfdbb16441e35b7c0a966c254d3f /libs/evoral/src/ControlList.cpp
parent96a9292a407dd90b85ed6bebae932c096b357ce8 (diff)
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...
Diffstat (limited to 'libs/evoral/src/ControlList.cpp')
-rw-r--r--libs/evoral/src/ControlList.cpp11
1 files changed, 10 insertions, 1 deletions
diff --git a/libs/evoral/src/ControlList.cpp b/libs/evoral/src/ControlList.cpp
index 61bac6148e..70500ba8de 100644
--- a/libs/evoral/src/ControlList.cpp
+++ b/libs/evoral/src/ControlList.cpp
@@ -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;
}