diff options
author | Hans Baier <hansfbaier@googlemail.com> | 2009-01-21 08:32:23 +0000 |
---|---|---|
committer | Hans Baier <hansfbaier@googlemail.com> | 2009-01-21 08:32:23 +0000 |
commit | 33852a0728d081864b83e74e900802be7ab6f2aa (patch) | |
tree | 1d8d6098a6652db161bacdcc96f2952f7f975ccc /gtk2_ardour | |
parent | c5659dda6e5840d60b58420d6b8a730955a8052e (diff) |
* Added Menu to add a Program change parameter lane
* made adding automation lanes add them for every active channel on the track
* Evoral::Parameter.hpp: Strict weak ordering again: make the proof a bit easier to read
Make the implementation conform to the proof
order Parameters according to type, then channel, then id
git-svn-id: svn://localhost/ardour2/branches/3.0@4421 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour')
-rw-r--r-- | gtk2_ardour/midi_time_axis.cc | 76 | ||||
-rw-r--r-- | gtk2_ardour/route_time_axis.cc | 3 |
2 files changed, 45 insertions, 34 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 () { diff --git a/gtk2_ardour/route_time_axis.cc b/gtk2_ardour/route_time_axis.cc index 5035814fa2..e544122ccd 100644 --- a/gtk2_ardour/route_time_axis.cc +++ b/gtk2_ardour/route_time_axis.cc @@ -1665,7 +1665,8 @@ RouteTimeAxisView::automation_track_hidden (Evoral::Parameter param) if (!ran) { return; } - + + // if Evoral::Parameter::operator< doesn't obey strict weak ordering, we may crash here.... _show_automation.erase(param); ran->track->get_state_node()->add_property (X_("shown"), X_("no")); |