Compare commits

...

8 Commits

Author SHA1 Message Date
Ben Loftis 828d1245c9 range analysis was only accessible by context-click; add to main menu 2022-06-06 14:17:39 -05:00
Ben Loftis 24df1503a8 add menu item for Consolidate Range 2022-06-06 14:17:39 -05:00
Ben Loftis c431575f22 add menu-accessible actions for Consolidate Range 2022-06-06 14:17:38 -05:00
Ben Loftis bd62f76875 fix redundant bounced-clips from a Consolidate operation 2022-06-06 14:17:35 -05:00
Ben Loftis d842326999 add some keybindings (for Nathan at Harrison)
* expand/shrink track height
* stem-export selected tracks
* create a range from selected regions
* consolidate range
* add a single Range marker for selected region(s)
* unlink (fork) midi region from linked regions
* toggle plugin manager window
* fixed shortcut for Crop

* moved "audio patchbay" from Alt-P to Alt-Shift-A,
    making it more consistent with Alt-Shift-M: MIDI patchbay
2022-06-06 14:16:57 -05:00
Ben Loftis c41ed2f133 keybindings: reformat for readability (no-op) 2022-06-06 14:16:57 -05:00
Ben Loftis 0fda55e4fe ftm-bindings tool: strip whitespace in input files 2022-06-06 14:16:57 -05:00
Ben Loftis 7225773660 fix Crop operation: all layers, preserve fades 2022-06-06 14:16:57 -05:00
5 changed files with 313 additions and 273 deletions

View File

@ -107,6 +107,8 @@ This mode provides many different operations on both regions and control points,
@vis|Editor/temporal-zoom-in| equal|zoom in
@vis|Editor/temporal-zoom-out| minus|zoom out
@vis|Editor/expand-tracks| <@TERTIARY@>plus|expand track height
@vis|Editor/shrink-tracks| <@TERTIARY@>equal|shrink track height
@vis|Editor/zoom-to-session| <@TERTIARY@>underscore|zoom to session
@eep|Editor/edit-cursor-to-previous-region-sync| apostrophe|EP to prev region sync
@eep|Editor/edit-cursor-to-next-region-sync| semicolon|EP to next region sync
@ -132,7 +134,6 @@ This mode provides many different operations on both regions and control points,
@rop|Region/trim-to-next-region| <@PRIMARY@>k|trim region to start of next region
@ranges|Editor/set-loop-from-edit-range| bracketright|set loop range from edit range
@ranges|Editor/set-punch-from-edit-range| bracketleft|set punch range from edit range
@ -160,16 +161,20 @@ This mode provides many different operations on both regions and control points,
@select|Editor/select-all-before-edit-cursor| <@PRIMARY@>e|select all before EP
@rop|Region/export-region| <@PRIMARY@><@SECONDARY@>e|export selected region(s)
@sess|Main/ExportAudio| <@SECONDARY@>e|export session
@sess|Main/StemExport| <@SECONDARY@><@TERTIARY@>e|stem export selected tracks
@select|Editor/select-all-after-edit-cursor| <@PRIMARY@><@TERTIARY@>e|select all after EP
@vis|Editor/show-editor-mixer| <@TERTIARY@>e|toggle editor window mixer
@mmode|MouseMode/set-mouse-mode-range| r|range mode
@edit|Editor/redo| <@PRIMARY@>r|redo
@edit|Editor/select-from-regions| <@PRIMARY@><@TERTIARY@>r|set Range to selected regions
@rop|Region/add-range-marker-from-region| <@SECONDARY@><@TERTIARY@>r|Add single Range marker from selection
@trans|Transport/Record| <@TERTIARY@>r|engage record
@mmode|MouseMode/set-mouse-mode-timefx| t|timefx mode
@gselect|Common/select-all-visible-lanes| <@PRIMARY@>t|select all visible lanes
@edit|Editor/alternate-redo| <@PRIMARY@>y|redo
@select|Editor/select-all-between-cursors|<@PRIMARY@>u|all enclosed by edit range
@select|Editor/select-all-within-cursors|u|all present in edit range
@select|Editor/select-all-between-cursors| <@PRIMARY@>u|select all regions enclosed by Range
@select|Editor/select-all-within-cursors| u|select all regions touched by Range
@rop|Region/fork-region| <@TERTIARY@>u|unlink midi from other regions
@eep|Region/insert-region-from-source-list| i|insert from region list
@sess|Common/addExistingAudioFiles| <@PRIMARY@>i|import audio files
@gselect|Common/invert-selection| <@PRIMARY@><@TERTIARY@>i|invert selection
@ -178,7 +183,6 @@ This mode provides many different operations on both regions and control points,
@sess|Main/Recent| <@PRIMARY@><@TERTIARY@>o|open a recent session
@wvis|Window/toggle-session-options-editor| <@SECONDARY@>o|toggle preferences dialog
@edit|Editor/set-playhead| p|set playhead position
@wvis|Window/toggle-audio-connection-manager|<@SECONDARY@>p|toggle global audio patchbay
;; MIDDLE ROW
@ -188,7 +192,8 @@ This mode provides many different operations on both regions and control points,
@aep|Region/align-regions-sync| <@TERTIARY@>a|align sync points
@aep|Region/align-regions-start| <@PRIMARY@><@SECONDARY@>a|align start(s)
@aep|Region/align-regions-start-relative| <@PRIMARY@><@TERTIARY@>a|align start(s) relative
@rop|Editor/split-region|s|split
@wvis|Window/toggle-audio-connection-manager| <@SECONDARY@><@TERTIARY@>a|toggle audio patchbay
@rop|Editor/split-region| s|split/separate
@sess|Common/Save| <@PRIMARY@>s|save session
@sess|Main/SnapshotStay| <@PRIMARY@><@TERTIARY@>s|snapshot session
@edtrk|Editor/track-solo-toggle| <@SECONDARY@>s|toggle track solo status
@ -207,7 +212,6 @@ This mode provides many different operations on both regions and control points,
@edit|Region/play-selected-regions| h|play selected region(s)
@eep|Region/trim-front| j|trim front
@eep|Region/trim-back| k|trim back
@wvis|Window/toggle-key-editor|<@SECONDARY@>k|toggle key bindings editor
@trans|Transport/Loop| l|loop play (the loop range)
@select|Editor/select-all-in-loop-range| <@PRIMARY@>l|select all in loop range
@wvis|Window/toggle-locations| <@SECONDARY@>l| toggle locations dialog
@ -224,16 +228,17 @@ This mode provides many different operations on both regions and control points,
@mmode|MouseMode/set-mouse-mode-cut| c|cut mode
@edit|Editor/editor-copy| <@PRIMARY@>c|copy
@wvis|Window/toggle-big-clock| <@SECONDARY@>c|toggle big clock
@-edit|Editor/crop|<@PRIMARY@><@TERTIARY@>c|crop
@edit|Editor/editor-crop| <@PRIMARY@><@TERTIARY@>c|crop range
@edit|Editor/editor-consolidate| <@SECONDARY@><@TERTIARY@>c|consolidate range
@rop|Region/set-region-sync-position| v|set region sync point
@edit|Editor/editor-paste| <@PRIMARY@>v|paste
@edit|Editor/ToggleJadeo| <@SECONDARY@>v|video window
@wvis|Common/toggle-meterbridge| <@SECONDARY@>b|show meter bridge
@edtrk|Editor/track-record-enable-toggle| <@TERTIARY@>b|toggle track rec-enable
@sess|Main/AddTrackBus| <@PRIMARY@><@TERTIARY@>n|add track(s) or bus(ses)
@rop|Region/add-region-cue-marker|m|add a region/cue marker
@sess|Main/New| <@PRIMARY@>n|open a new session
@wvis|Window/toggle-midi-connection-manager|<@SECONDARY@><@TERTIARY@>m|toggle global midi patchbay
@rop|Region/add-region-cue-marker| m|add a region/cue marker
@wvis|Window/toggle-midi-connection-manager| <@SECONDARY@><@TERTIARY@>m|toggle midi patchbay
@wvis|Common/show-mixer| <@SECONDARY@>m|show mixer window
@gmon|Monitor Section/monitor-cut-all| <@PRIMARY@>m|monitor cut all

View File

@ -232,7 +232,14 @@
<menuitem action='separate-under-region'/>
<menuitem action='separate-from-loop'/>
<menuitem action='separate-from-punch'/>
<separator/>
</menu>
<menu action="ConsolidateMenu">
<menuitem action='editor-consolidate'/>
#ifndef MIXBUS
<menuitem action='editor-consolidate-with-processing'/>
#endif
<menuitem action='combine-regions'/>
<menuitem action='uncombine-regions'/>
</menu>
<menu action="AlignMenu">
<menuitem action='align-regions-start'/>
@ -249,6 +256,12 @@
<menuitem action='set-fade-out-length'/>
<menuitem action='toggle-region-fade-out'/>
</menu>
<separator/>
<menu action="AnalyzeMenu">
<menuitem action='editor-analyze-spectrum'/>
<menuitem action='editor-analyze-loudness'/>
<menuitem action='editor-loudness-assistant'/>
</menu>
<separator/>
<menuitem action='tag-last-capture'/>
<menuitem action='remove-last-capture'/>

View File

@ -169,6 +169,8 @@ Editor::register_actions ()
ActionManager::register_action (editor_menu_actions, X_("Select"), _("Select"));
ActionManager::register_action (editor_menu_actions, X_("SelectMenu"), _("Select"));
ActionManager::register_action (editor_menu_actions, X_("SeparateMenu"), _("Separate"));
ActionManager::register_action (editor_menu_actions, X_("ConsolidateMenu"), _("Consolidate"));
ActionManager::register_action (editor_menu_actions, X_("AnalyzeMenu"), _("Analyze"));
ActionManager::register_action (editor_menu_actions, X_("SetLoopMenu"), _("Loop"));
ActionManager::register_action (editor_menu_actions, X_("SetPunchMenu"), _("Punch"));
ActionManager::register_action (editor_menu_actions, X_("Solo"), _("Solo"));
@ -396,6 +398,18 @@ Editor::register_actions ()
act = reg_sens (editor_actions, "editor-crop", _("Crop"), sigc::mem_fun(*this, &Editor::crop_region_to_selection));
ActionManager::time_selection_sensitive_actions.push_back (act);
act = reg_sens (editor_actions, "editor-consolidate-with-processing", _("Consolidate Range (with processing)"), sigc::bind (sigc::mem_fun(*this, &Editor::bounce_range_selection), ReplaceRange, true));
ActionManager::time_selection_sensitive_actions.push_back (act);
act = reg_sens (editor_actions, "editor-consolidate", _("Consolidate Range"), sigc::bind (sigc::mem_fun(*this, &Editor::bounce_range_selection), ReplaceRange, false));
ActionManager::time_selection_sensitive_actions.push_back (act);
act = reg_sens (editor_actions, "editor-analyze-loudness", _("Loudness Analysis"), sigc::mem_fun(*this, &Editor::loudness_analyze_range_selection));
ActionManager::time_selection_sensitive_actions.push_back (act);
act = reg_sens (editor_actions, "editor-analyze-spectrum", _("Spectral Analysis"), sigc::mem_fun(*this, &Editor::spectral_analyze_range_selection));
ActionManager::time_selection_sensitive_actions.push_back (act);
act = reg_sens (editor_actions, "editor-loudness-assistant", _("Loudness Assistant"), sigc::bind (sigc::mem_fun(*this, &Editor::loudness_assistant), true));
ActionManager::time_selection_sensitive_actions.push_back (act);
reg_sens (editor_actions, "editor-cut", _("Cut"), sigc::mem_fun(*this, &Editor::cut));
reg_sens (editor_actions, "editor-delete", _("Delete"), sigc::mem_fun(*this, &Editor::delete_));
reg_sens (editor_actions, "alternate-editor-delete", _("Delete"), sigc::mem_fun(*this, &Editor::delete_));

View File

@ -3500,43 +3500,52 @@ Editor::crop_region_to (timepos_t const & start, timepos_t const & end)
return;
}
timepos_t pos;
timepos_t new_start;
timepos_t new_end;
timecnt_t new_length;
for (vector<boost::shared_ptr<Playlist> >::iterator i = playlists.begin(); i != playlists.end(); ++i) {
/* Only the top regions at start and end have to be cropped */
boost::shared_ptr<Region> region_at_start = (*i)->top_region_at(start);
boost::shared_ptr<Region> region_at_end = (*i)->top_region_at(end);
vector<boost::shared_ptr<Region> > regions;
if (region_at_start != 0) {
regions.push_back (region_at_start);
boost::shared_ptr<RegionList> regions_at_start = (*i)->regions_at(start);
for (RegionList::const_iterator r = regions_at_start->begin(); r != regions_at_start->end(); ++r) {
boost::shared_ptr<AudioRegion> ar = boost::dynamic_pointer_cast<AudioRegion>(*r);
if (ar) {
//if we cut an audio region during the fade, keep the fade handle at the same spot
ar->playlist()->clear_owned_changes ();
samplepos_t pos = start.samples ();
samplecnt_t fade_length;
samplepos_t fade_start = ar->position_sample() + ar->fade_in()->back()->when.samples();
if (pos <= fade_start) {
fade_length = fade_start - pos;
ar->set_fade_in_length (fade_length);
}
if (region_at_end != 0) {
regions.push_back (region_at_end);
vector<Command*> cmds;
ar->playlist()->rdiff (cmds);
_session->add_commands (cmds);
}
/* now adjust lengths */
for (vector<boost::shared_ptr<Region> >::iterator i = regions.begin(); i != regions.end(); ++i) {
pos = (*i)->position();
new_start = max (start, pos);
if (timepos_t::max (pos.time_domain()).earlier (pos) > (*i)->length()) {
new_end = (*i)->end();
} else {
new_end = timepos_t::max (pos.time_domain());
(*r)->trim_front (start);
_session->add_command (new StatefulDiffCommand (*r));
}
new_end = min (end, new_end);
new_length = new_start.distance (new_end);
(*i)->clear_changes ();
(*i)->trim_to (new_start, new_length);
_session->add_command (new StatefulDiffCommand (*i));
boost::shared_ptr<RegionList> regions_at_end = (*i)->regions_at(end);
for (RegionList::const_iterator r = regions_at_end->begin(); r != regions_at_end->end(); ++r) {
boost::shared_ptr<AudioRegion> ar = boost::dynamic_pointer_cast<AudioRegion>(*r);
if (ar) {
//if we cut an audio region during the fade, keep the fade handle at the same spot
ar->playlist()->clear_owned_changes ();
samplepos_t pos = end.samples ();
samplecnt_t fade_length;
samplepos_t fade_end = ar->position_sample() + ar->length_samples() - ar->fade_out()->back()->when.samples();
if (pos >= fade_end) {
fade_length = pos - fade_end ;
ar->set_fade_out_length (fade_length);
}
vector<Command*> cmds;
ar->playlist()->rdiff (cmds);
_session->add_commands (cmds);
}
(*r)->trim_end (end);
_session->add_command (new StatefulDiffCommand (*r));
}
}
}
@ -4249,8 +4258,8 @@ Editor::bounce_range_selection (BounceTarget target, bool with_processing)
}
}
timepos_t start = selection->time[clicked_selection].start();
timepos_t end = selection->time[clicked_selection].end();
timepos_t start = selection->time.start_time();
timepos_t end = selection->time.end_time();
timecnt_t cnt = start.distance (end);
bool in_command = false;
@ -4323,10 +4332,6 @@ Editor::bounce_range_selection (BounceTarget target, bool with_processing)
rtv->track ()->presentation_info ().set_trigger_track (true);
}
if (copy_to_clip_library) {
export_to_clip_library (r);
}
vector<Command*> cmds;
playlist->rdiff (cmds);
_session->add_commands (cmds);

View File

@ -258,6 +258,9 @@ while (<SOURCE>) {
$gkey =~ s/^-//;
$owner = $group_owners{$gkey};
# strip white space from the binding; this allows reformatting the input file for legibility
$binding =~ s/^\s+|\s+$//g;
# substitute bindings
$gtk_binding = $binding;