summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2010-11-29 17:56:08 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2010-11-29 17:56:08 +0000
commit964411b6888663e6b91d3083e6a7940e4b0a1303 (patch)
tree6abc573f1f56c37c72457d6a7de1bee3c4a03e22 /libs
parentd55c8816262ff7ae10bc9119b2e4914cdf9267ce (diff)
fix conversion of MIDI controller (7 bit) value into a 0..+1.0 range value
git-svn-id: svn://localhost/ardour2/branches/3.0@8124 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs')
-rw-r--r--libs/surfaces/generic_midi/midicontrollable.cc13
1 files changed, 10 insertions, 3 deletions
diff --git a/libs/surfaces/generic_midi/midicontrollable.cc b/libs/surfaces/generic_midi/midicontrollable.cc
index 2319b6c433..9060f010a0 100644
--- a/libs/surfaces/generic_midi/midicontrollable.cc
+++ b/libs/surfaces/generic_midi/midicontrollable.cc
@@ -152,17 +152,24 @@ MIDIControllable::control_to_midi (float val)
float
MIDIControllable::midi_to_control(float val)
{
- const float midi_range = 127.0f; // TODO: NRPN etc.
+ /* fiddle with MIDI value so that we get an odd number of integer steps
+ and can thus represent "middle" precisely as 0.5. this maps to
+ the range 0..+1.0
+
+ TODO: 14bit values
+ */
+
+ val = (val == 0.0f ? 0.0f : (val-1.0f) / 126.0f);
if (controllable->is_gain_like()) {
- return slider_position_to_gain (val/midi_range);
+ return slider_position_to_gain (val);
}
float control_min = controllable->lower ();
float control_max = controllable->upper ();
const float control_range = control_max - control_min;
- return val / midi_range * control_range + control_min;
+ return (val * control_range) + control_min;
}
void