diff options
Diffstat (limited to 'gtk2_ardour/midi_time_axis.cc')
-rw-r--r-- | gtk2_ardour/midi_time_axis.cc | 76 |
1 files changed, 43 insertions, 33 deletions
diff --git a/gtk2_ardour/midi_time_axis.cc b/gtk2_ardour/midi_time_axis.cc index 2f5c80497c..9f3da122c5 100644 --- a/gtk2_ardour/midi_time_axis.cc +++ b/gtk2_ardour/midi_time_axis.cc @@ -304,13 +304,15 @@ MidiTimeAxisView::build_automation_action_menu () automation_items.push_back (SeparatorElem()); automation_items.push_back (MenuElem (_("Controller..."), mem_fun(*this, &MidiTimeAxisView::add_cc_track))); + automation_items.push_back (MenuElem (_("Program Change"), + sigc::bind(mem_fun(*this, &MidiTimeAxisView::add_parameter_track), + Evoral::Parameter(MidiPgmChangeAutomation)))); automation_items.push_back (MenuElem (_("Bender"), sigc::bind(mem_fun(*this, &MidiTimeAxisView::add_parameter_track), Evoral::Parameter(MidiPitchBenderAutomation)))); automation_items.push_back (MenuElem (_("Pressure"), sigc::bind(mem_fun(*this, &MidiTimeAxisView::add_parameter_track), Evoral::Parameter(MidiChannelPressureAutomation)))); - } Gtk::Menu* @@ -467,49 +469,57 @@ MidiTimeAxisView::add_cc_track() void MidiTimeAxisView::add_parameter_track(const Evoral::Parameter& param) { - create_automation_child(param, true); + if ( param.type() != MidiCCAutomation && + param.type() != MidiPgmChangeAutomation && + param.type() != MidiPitchBenderAutomation && + param.type() != MidiChannelPressureAutomation + ) { + error << "MidiTimeAxisView: unknown automation child " + << ARDOUR::EventTypeMap::instance().to_symbol(param) << endmsg; + return; + } + + // create the parameter lane for each selected channel + uint16_t selected_channels = _channel_selector.get_selected_channels(); + + for (uint8_t i = 0; i < 16; i++) { + if (selected_channels & (0x0001 << i)) { + Evoral::Parameter param_with_channel(param.type(), i, param.id()); + create_automation_child(param_with_channel, true); + } + } } void MidiTimeAxisView::create_automation_child (const Evoral::Parameter& param, bool show) { - if ( param.type() == MidiCCAutomation || - param.type() == MidiPgmChangeAutomation || - param.type() == MidiPitchBenderAutomation || - param.type() == MidiChannelPressureAutomation - ) { - - /* These controllers are region "automation", so we do not create - * an AutomationList/Line for the track */ + /* These controllers are region "automation", so we do not create + * an AutomationList/Line for the track */ - AutomationTracks::iterator existing = _automation_tracks.find(param); - if (existing != _automation_tracks.end()) - return; + AutomationTracks::iterator existing = _automation_tracks.find(param); + if (existing != _automation_tracks.end()) + return; - boost::shared_ptr<AutomationControl> c - = boost::dynamic_pointer_cast<AutomationControl>(_route->data().control(param)); + boost::shared_ptr<AutomationControl> c + = boost::dynamic_pointer_cast<AutomationControl>(_route->data().control(param)); - if (!c) { - c = boost::dynamic_pointer_cast<AutomationControl>(_route->control_factory(param)); - _route->add_control(c); - } - - boost::shared_ptr<AutomationTimeAxisView> track(new AutomationTimeAxisView (_session, - _route, boost::shared_ptr<ARDOUR::Automatable>(), c, - _editor, - *this, - true, - parent_canvas, - _route->describe_parameter(param))); - - add_automation_child(param, track, show); - - } else { - error << "MidiTimeAxisView: unknown automation child " - << ARDOUR::EventTypeMap::instance().to_symbol(param) << endmsg; + if (!c) { + c = boost::dynamic_pointer_cast<AutomationControl>(_route->control_factory(param)); + _route->add_control(c); } + + boost::shared_ptr<AutomationTimeAxisView> track(new AutomationTimeAxisView (_session, + _route, boost::shared_ptr<ARDOUR::Automatable>(), c, + _editor, + *this, + true, + parent_canvas, + _route->describe_parameter(param))); + + add_automation_child(param, track, show); } + void MidiTimeAxisView::route_active_changed () { |