From 07e0f785f80eb7b57a05c091dc454d4e4d0cce88 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Thu, 10 Jul 2014 08:17:22 -0400 Subject: add "fade range" operation, bound to alt-f at present by default --- gtk2_ardour/editor.h | 2 ++ gtk2_ardour/editor_actions.cc | 2 ++ gtk2_ardour/editor_ops.cc | 16 ++++++++++++++++ gtk2_ardour/mnemonic-us.bindings.in | 1 + gtk2_ardour/route_time_axis.cc | 35 +++++++++++++++++++++++++++++++++++ gtk2_ardour/route_time_axis.h | 1 + gtk2_ardour/time_axis_view.h | 2 ++ 7 files changed, 59 insertions(+) diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index 3c9d4f38ac..d96ac0c8f6 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -1385,6 +1385,8 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void set_fade_in_active (bool); void set_fade_out_active (bool); + void fade_range (); + std::set > motion_frozen_playlists; bool _dragging_playhead; diff --git a/gtk2_ardour/editor_actions.cc b/gtk2_ardour/editor_actions.cc index 31f368684b..7e37b02a08 100644 --- a/gtk2_ardour/editor_actions.cc +++ b/gtk2_ardour/editor_actions.cc @@ -336,6 +336,8 @@ Editor::register_actions () reg_sens (editor_actions, "editor-copy", _("Copy"), sigc::mem_fun(*this, &Editor::copy)); reg_sens (editor_actions, "editor-paste", _("Paste"), sigc::mem_fun(*this, &Editor::keyboard_paste)); + reg_sens (editor_actions, "editor-fade-range", _("Fade Range Selection"), sigc::mem_fun(*this, &Editor::fade_range)); + reg_sens (editor_actions, "set-tempo-from-edit-range", _("Set Tempo from Edit Range = Bar"), sigc::mem_fun(*this, &Editor::use_range_as_bar)); toggle_reg_sens (editor_actions, "toggle-log-window", _("Log"), diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc index a2f8048fec..eb5b22ee62 100644 --- a/gtk2_ardour/editor_ops.cc +++ b/gtk2_ardour/editor_ops.cc @@ -5260,6 +5260,22 @@ Editor::toggle_solo_isolate () { } + +void +Editor::fade_range () +{ + TrackViewList ts = selection->tracks.filter_to_unique_playlists (); + + begin_reversible_command (_("fade range")); + + for (TrackViewList::iterator i = ts.begin(); i != ts.end(); ++i) { + (*i)->fade_range (selection->time); + } + + commit_reversible_command (); +} + + void Editor::set_fade_length (bool in) { diff --git a/gtk2_ardour/mnemonic-us.bindings.in b/gtk2_ardour/mnemonic-us.bindings.in index 035912810d..b5948bede4 100644 --- a/gtk2_ardour/mnemonic-us.bindings.in +++ b/gtk2_ardour/mnemonic-us.bindings.in @@ -190,6 +190,7 @@ This mode provides many different operations on both regions and control points, @select|Editor/select-all-in-punch-range|<@PRIMARY@>d|select all in punch range @vis|Editor/fit-tracks|f|fit tracks vertically @trans|Editor/toggle-follow-playhead|<@PRIMARY@>f|toggle playhead tracking +@trans|Editor/editor-fade-range|<@SECONDARY@>f|fade range selection @trans|Transport/ToggleFollowEdits|<@TERTIARY@>f|toggle playhead follows edits @wvis|Common/ToggleMaximalEditor|<@PRIMARY@><@SECONDARY@>f|maximise editor space @wvis|Common/ToggleMaximalMixer|F12|maximise mixer space diff --git a/gtk2_ardour/route_time_axis.cc b/gtk2_ardour/route_time_axis.cc index 77fb0815bc..36b2cdb2e9 100644 --- a/gtk2_ardour/route_time_axis.cc +++ b/gtk2_ardour/route_time_axis.cc @@ -1384,6 +1384,41 @@ RouteTimeAxisView::find_next_region_boundary (framepos_t pos, int32_t dir) return -1; } +void +RouteTimeAxisView::fade_range (TimeSelection& selection) +{ + boost::shared_ptr what_we_got; + boost::shared_ptr tr = track (); + boost::shared_ptr playlist; + + if (tr == 0) { + /* route is a bus, not a track */ + return; + } + + playlist = tr->playlist(); + + TimeSelection time (selection); + float const speed = tr->speed(); + if (speed != 1.0f) { + for (TimeSelection::iterator i = time.begin(); i != time.end(); ++i) { + (*i).start = session_frame_to_track_frame((*i).start, speed); + (*i).end = session_frame_to_track_frame((*i).end, speed); + } + } + + playlist->clear_changes (); + playlist->clear_owned_changes (); + + playlist->fade_range (time); + + vector cmds; + playlist->rdiff (cmds); + _session->add_commands (cmds); + _session->add_command (new StatefulDiffCommand (playlist)); + +} + void RouteTimeAxisView::cut_copy_clear (Selection& selection, CutCopyOp op) { diff --git a/gtk2_ardour/route_time_axis.h b/gtk2_ardour/route_time_axis.h index f56b747a8f..cfc71d89fa 100644 --- a/gtk2_ardour/route_time_axis.h +++ b/gtk2_ardour/route_time_axis.h @@ -104,6 +104,7 @@ public: void uncombine_regions (); void uncombine_region (RegionView*); void toggle_automation_track (const Evoral::Parameter& param); + void fade_range (TimeSelection&); /* The editor calls these when mapping an operation across multiple tracks */ void use_new_playlist (bool prompt, std::vector > const &); diff --git a/gtk2_ardour/time_axis_view.h b/gtk2_ardour/time_axis_view.h index 4c183ddc6a..c2c7f7db53 100644 --- a/gtk2_ardour/time_axis_view.h +++ b/gtk2_ardour/time_axis_view.h @@ -167,6 +167,8 @@ class TimeAxisView : public virtual AxisView virtual void set_selected_regionviews (RegionSelection&) {} virtual void set_selected_points (PointSelection&) {} + virtual void fade_range (TimeSelection&) {} + virtual boost::shared_ptr find_next_region (framepos_t /*pos*/, ARDOUR::RegionPoint, int32_t /*dir*/) { return boost::shared_ptr (); } -- cgit v1.2.3