ardour/gtk2_ardour/midi_automation_line.cc
Paul Davis dd3683bc06 fix another #warning from the pianorule refactoring
There is one single place in AutomationLine code where we need to callback
to its AutomationTimeAxisView, if it is part of one, regarding automation
state. This permits that to happen
2025-03-16 15:43:11 -06:00

99 lines
3.2 KiB
C++

/*
* Copyright (C) 2010-2012 Carl Hetherington <carl@carlh.net>
* Copyright (C) 2010-2014 David Robillard <d@drobilla.net>
* Copyright (C) 2010-2017 Paul Davis <paul@linuxaudiosystems.com>
* Copyright (C) 2013-2019 Robin Gareus <robin@gareus.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include "ardour/midi_automation_list_binder.h"
#include "ardour/midi_region.h"
#include "midi++/midnam_patch.h"
#include "midi_automation_line.h"
#include "midi_time_axis.h"
#include "pbd/i18n.h"
using namespace std;
MidiAutomationLine::MidiAutomationLine (
const std::string& name,
TimeAxisView& tav,
ArdourCanvas::Item& parent,
std::shared_ptr<ARDOUR::AutomationList> list,
std::shared_ptr<ARDOUR::MidiRegion> region,
Evoral::Parameter parameter)
: EditorAutomationLine (name, tav, parent, list, parameter)
, _region (region)
, _parameter (parameter)
{
}
MementoCommandBinder<ARDOUR::AutomationList>*
MidiAutomationLine::memento_command_binder ()
{
/* some weirdness here since _region->midi_source() returns a
* shared_ptr<> but the binder accepts a reference.
*/
return new ARDOUR::MidiAutomationListBinder (*(_region->midi_source().get()), _parameter);
}
Temporal::timepos_t
MidiAutomationLine::get_origin() const
{
/* Events in the automation list are relative to the start of the
source, not the start of the region, so we need to use the
position-of-the-start-of-the-source, rather than just the
position-of-the-region.
*/
return _region->source_position();
}
string
MidiAutomationLine::get_verbose_cursor_string (double fraction) const
{
using namespace MIDI::Name;
if (_parameter.type() != ARDOUR::MidiCCAutomation) {
return EditorAutomationLine::get_verbose_cursor_string(fraction);
}
MidiTimeAxisView* const mtv = dynamic_cast<MidiTimeAxisView*>(trackview.get_parent());
if (!mtv) {
return EditorAutomationLine::get_verbose_cursor_string(fraction);
}
const uint8_t channel = mtv->get_preferred_midi_channel();
std::shared_ptr<const ValueNameList> value_names = mtv->route()->instrument_info().value_name_list_by_control (channel, _parameter.id());
if (!value_names) {
return EditorAutomationLine::get_verbose_cursor_string(fraction);
}
const uint16_t cc_value = floor(std::max(std::min(fraction * 127.0, 127.0), 0.0));
std::shared_ptr<const Value> value = value_names->max_value_below(cc_value);
if (!value) {
return EditorAutomationLine::get_verbose_cursor_string(fraction);
}
return value->name();
}