From fb1fbf71af452ecff0a257bda228d1b31912c8ee Mon Sep 17 00:00:00 2001 From: David Robillard Date: Fri, 2 May 2008 21:34:00 +0000 Subject: [PATCH] Fix range problems for pitch wheel controller. git-svn-id: svn://localhost/ardour2/branches/3.0@3308 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/automation_line.cc | 10 ++++++---- gtk2_ardour/midi_time_axis.cc | 3 ++- libs/ardour/automation_event.cc | 1 + libs/ardour/midi_model.cc | 12 +++++++----- 4 files changed, 16 insertions(+), 10 deletions(-) diff --git a/gtk2_ardour/automation_line.cc b/gtk2_ardour/automation_line.cc index 81e4d34989..8c721c7e84 100644 --- a/gtk2_ardour/automation_line.cc +++ b/gtk2_ardour/automation_line.cc @@ -1169,6 +1169,7 @@ AutomationLine::set_state (const XMLNode &node) void AutomationLine::view_to_model_y (double& y) { + /* TODO: This should be more generic ... */ if (alist->parameter().type() == GainAutomation) { y = slider_position_to_gain (y); y = max (0.0, y); @@ -1176,25 +1177,26 @@ AutomationLine::view_to_model_y (double& y) } else if (alist->parameter().type() == PanAutomation) { // vertical coordinate axis reversal y = 1.0 - y; - } else if (alist->parameter().type() == MidiCCAutomation) { - y = (int)(y * 127.0); } else if (alist->parameter().type() == PluginAutomation) { y = y * (double)(alist->get_max_y()- alist->get_min_y()) + alist->get_min_y(); + } else { + y = (int)(y * alist->parameter().max()); } } void AutomationLine::model_to_view_y (double& y) { + /* TODO: This should be more generic ... */ if (alist->parameter().type() == GainAutomation) { y = gain_to_slider_position (y); } else if (alist->parameter().type() == PanAutomation) { // vertical coordinate axis reversal y = 1.0 - y; - } else if (alist->parameter().type() == MidiCCAutomation) { - y = y / 127.0; } else if (alist->parameter().type() == PluginAutomation) { y = (y - alist->get_min_y()) / (double)(alist->get_max_y()- alist->get_min_y()); + } else { + y = y / (double)alist->parameter().max(); /* ... like this */ } } diff --git a/gtk2_ardour/midi_time_axis.cc b/gtk2_ardour/midi_time_axis.cc index cf17543040..95b77abaf4 100644 --- a/gtk2_ardour/midi_time_axis.cc +++ b/gtk2_ardour/midi_time_axis.cc @@ -339,7 +339,8 @@ MidiTimeAxisView::create_automation_child (Parameter param, bool show) boost::shared_ptr c = _route->control(param); if (!c) { - boost::shared_ptr al(new ARDOUR::AutomationList(param, 0, 127, 64)); + boost::shared_ptr al(new ARDOUR::AutomationList(param, + param.min(), param.max(), (param.max() - param.min() / 2))); c = boost::shared_ptr(_route->control_factory(al)); _route->add_control(c); } diff --git a/libs/ardour/automation_event.cc b/libs/ardour/automation_event.cc index e01e349281..af390953f4 100644 --- a/libs/ardour/automation_event.cc +++ b/libs/ardour/automation_event.cc @@ -55,6 +55,7 @@ static void dumpit (const AutomationList& al, string prefix = "") } #endif +/* XXX: min_val max_val redundant? (param.min() param.max()) */ AutomationList::AutomationList (Parameter id, double min_val, double max_val, double default_val) : _parameter(id) , _interpolation(Linear) diff --git a/libs/ardour/midi_model.cc b/libs/ardour/midi_model.cc index a05bc7278a..cda36ad50a 100644 --- a/libs/ardour/midi_model.cc +++ b/libs/ardour/midi_model.cc @@ -109,8 +109,8 @@ MidiModel::const_iterator::const_iterator(const MidiModel& model, double t) } assert(x >= 0); - assert(y >= 0); - assert(y <= UINT8_MAX); + assert(y >= i->first.min()); + assert(y <= i->first.max()); const MidiControlIterator new_iter(i->second->list(), x, y); @@ -202,7 +202,7 @@ MidiModel::const_iterator::operator++() for (std::vector::iterator i = _control_iters.begin(); i != _control_iters.end(); ++i) { - if (i->x < _control_iter->x && i != old_control_iter) { + if (i->x < _control_iter->x) { _control_iter = i; } } @@ -227,7 +227,9 @@ MidiModel::const_iterator::operator++() } // Use the next earliest controller iff it's earlier than the note event - if (_control_iter != _control_iters.end() && _control_iter->x != DBL_MAX) + if (_control_iter != _control_iters.end() + && _control_iter->x != DBL_MAX + && _control_iter != old_control_iter) if (type == NIL || _control_iter->x < t) type = AUTOMATION; @@ -386,7 +388,7 @@ MidiModel::control_to_midi_event(MIDI::Event& ev, const MidiControlIterator& ite assert(iter.automation_list); assert(iter.automation_list->parameter().channel() < 16); assert(iter.automation_list->parameter().id() <= INT8_MAX); - assert(iter.y <= INT8_MAX); + assert(iter.y < (1<<14)); ev.buffer()[0] = MIDI_CMD_BENDER + iter.automation_list->parameter().channel(); ev.buffer()[1] = ((Byte)iter.y) & 0x7F; // LSB ev.buffer()[2] = (((Byte)iter.y) >> 7) & 0x7F; // MSB