From 7aea02083a207402405cc4869b892dd63da191b6 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Fri, 19 Sep 2008 17:24:52 +0000 Subject: [PATCH] Restore visible CC/etc automation tracks on session load. Fix CC/channel mismatch when creating a new CC track. Always display CC with 1-based numbering (like channel). git-svn-id: svn://localhost/ardour2/branches/3.0@3763 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/add_midi_cc_track_dialog.cc | 8 ++++---- gtk2_ardour/automation_time_axis.cc | 4 +++- gtk2_ardour/midi_time_axis.cc | 25 +++++++++++++++++++------ gtk2_ardour/midi_time_axis.h | 1 + gtk2_ardour/route_time_axis.cc | 23 +++++++++++++++++++++++ gtk2_ardour/route_time_axis.h | 2 ++ libs/ardour/automatable.cc | 2 +- 7 files changed, 53 insertions(+), 12 deletions(-) diff --git a/gtk2_ardour/add_midi_cc_track_dialog.cc b/gtk2_ardour/add_midi_cc_track_dialog.cc index fcd3ebbe40..98fd501a95 100644 --- a/gtk2_ardour/add_midi_cc_track_dialog.cc +++ b/gtk2_ardour/add_midi_cc_track_dialog.cc @@ -37,9 +37,9 @@ using namespace ARDOUR; AddMidiCCTrackDialog::AddMidiCCTrackDialog () : Dialog (_("ardour: add midi controller track")) - , _chan_adjustment (1, 1, 16, 8) + , _chan_adjustment (1, 1, 16, 1, 8, 8) , _chan_spinner (_chan_adjustment) - , _cc_num_adjustment (1, 0, 127, 1, 10) + , _cc_num_adjustment (1, 1, 128, 1, 10, 10) , _cc_num_spinner (_cc_num_adjustment) { set_name ("AddMidiCCTrackDialog"); @@ -78,8 +78,8 @@ ARDOUR::Parameter AddMidiCCTrackDialog::parameter () { int chan = _chan_spinner.get_value_as_int() - 1; - int cc_num = _cc_num_spinner.get_value_as_int(); + int cc_num = _cc_num_spinner.get_value_as_int() - 1; - return Parameter(MidiCCAutomation, cc_num, chan); + return Parameter(MidiCCAutomation, chan, cc_num); } diff --git a/gtk2_ardour/automation_time_axis.cc b/gtk2_ardour/automation_time_axis.cc index 07a47f274e..7ef763c235 100644 --- a/gtk2_ardour/automation_time_axis.cc +++ b/gtk2_ardour/automation_time_axis.cc @@ -868,7 +868,7 @@ AutomationTimeAxisView::color_handler () int AutomationTimeAxisView::set_state (const XMLNode& node) { - return TimeAxisView::set_state (node); + TimeAxisView::set_state (node); XMLNodeList kids; XMLNodeConstIterator iter; @@ -894,6 +894,8 @@ AutomationTimeAxisView::set_state (const XMLNode& node) if (!_marked_for_display) hide(); + + return 0; } XMLNode* diff --git a/gtk2_ardour/midi_time_axis.cc b/gtk2_ardour/midi_time_axis.cc index 53da98d829..500b81cb01 100644 --- a/gtk2_ardour/midi_time_axis.cc +++ b/gtk2_ardour/midi_time_axis.cc @@ -286,6 +286,20 @@ MidiTimeAxisView::update_range() } } +void +MidiTimeAxisView::show_all_automation () +{ + if (midi_track()) { + const set params = midi_track()->midi_diskstream()-> + midi_playlist()->contained_automation(); + + for (set::const_iterator i = params.begin(); i != params.end(); ++i) + create_automation_child(*i, true); + } + + RouteTimeAxisView::show_all_automation (); +} + void MidiTimeAxisView::show_existing_automation () { @@ -324,8 +338,7 @@ MidiTimeAxisView::add_controller_track() void MidiTimeAxisView::create_automation_child (Parameter param, bool show) { - if ( - param.type() == MidiCCAutomation || + if ( param.type() == MidiCCAutomation || param.type() == MidiPgmChangeAutomation || param.type() == MidiPitchBenderAutomation || param.type() == MidiChannelAftertouchAutomation @@ -333,6 +346,10 @@ MidiTimeAxisView::create_automation_child (Parameter param, bool show) /* FIXME: don't create AutomationList for track itself * (not actually needed or used, since the automation is region-ey) */ + + AutomationTracks::iterator existing = _automation_tracks.find(param); + if (existing != _automation_tracks.end()) + return; boost::shared_ptr c = boost::dynamic_pointer_cast(_route->control(param)); @@ -343,10 +360,6 @@ MidiTimeAxisView::create_automation_child (Parameter param, bool show) _route->add_control(c); } - AutomationTracks::iterator existing = _automation_tracks.find(param); - if (existing != _automation_tracks.end()) - return; - boost::shared_ptr track(new AutomationTimeAxisView (_session, _route, _route, c, editor, diff --git a/gtk2_ardour/midi_time_axis.h b/gtk2_ardour/midi_time_axis.h index cdbf6907e1..e06e5cd534 100644 --- a/gtk2_ardour/midi_time_axis.h +++ b/gtk2_ardour/midi_time_axis.h @@ -66,6 +66,7 @@ class MidiTimeAxisView : public RouteTimeAxisView guint32 show_at (double y, int& nth, Gtk::VBox *parent); void hide (); + void show_all_automation (); void show_existing_automation (); void add_controller_track (); void create_automation_child (ARDOUR::Parameter param, bool show); diff --git a/gtk2_ardour/route_time_axis.cc b/gtk2_ardour/route_time_axis.cc index 61c87d01de..2eceeb4974 100644 --- a/gtk2_ardour/route_time_axis.cc +++ b/gtk2_ardour/route_time_axis.cc @@ -415,6 +415,29 @@ RouteTimeAxisView::automation_click () automation_action_menu->popup (1, gtk_get_current_event_time()); } +int +RouteTimeAxisView::set_state (const XMLNode& node) +{ + TimeAxisView::set_state (node); + + XMLNodeList kids = node.children(); + XMLNodeConstIterator iter; + const XMLProperty* prop; + + for (iter = kids.begin(); iter != kids.end(); ++iter) { + if ((*iter)->name() == AutomationTimeAxisView::state_node_name) { + if ((prop = (*iter)->property ("automation-id")) != 0) { + Parameter param(prop->value()); + bool show = ((prop = (*iter)->property ("shown")) != 0) && prop->value() == "yes"; + create_automation_child(param, show); + } else { + warning << "Automation child has no ID" << endmsg; + } + } + } + return 0; +} + void RouteTimeAxisView::build_automation_action_menu () { diff --git a/gtk2_ardour/route_time_axis.h b/gtk2_ardour/route_time_axis.h index 230ea45b86..69dc47580a 100644 --- a/gtk2_ardour/route_time_axis.h +++ b/gtk2_ardour/route_time_axis.h @@ -105,6 +105,8 @@ public: void remove_underlay (StreamView*); void build_underlay_menu(Gtk::Menu*); + int set_state (const XMLNode&); + /* This is a bit nasty to expose :/ */ struct RouteAutomationNode { ARDOUR::Parameter param; diff --git a/libs/ardour/automatable.cc b/libs/ardour/automatable.cc index 349c09e136..5595ebc2cf 100644 --- a/libs/ardour/automatable.cc +++ b/libs/ardour/automatable.cc @@ -155,7 +155,7 @@ Automatable::describe_parameter (Parameter param) return (string_compose(_("Pan %1"), param.id() + 1)); } else if (param.type() == MidiCCAutomation) { return string_compose("CC %1 (%2) [%3]", - param.id(), midi_name(param.id()), int(param.channel()) + 1); + param.id() + 1, midi_name(param.id()), int(param.channel()) + 1); } else if (param.type() == MidiPgmChangeAutomation) { return string_compose("Program [%1]", int(param.channel()) + 1); } else if (param.type() == MidiPitchBenderAutomation) { -- 2.30.2