4PointCutting: fix track alignment of pasted items if first source tracks are empty in time selection. closes #4
This commit is contained in:
		
							parent
							
								
									9817465681
								
							
						
					
					
						commit
						a5072fc596
					
				| @ -5,7 +5,7 @@ | ||||
| -- Git: https://files.eleton-audio.de/gitea/Ludwig/Reaper-Scripts.git | ||||
| -- License: GPL v3.0 | ||||
| -- Requires: Reaper 5 or 6 | ||||
| -- Requires: SWS extensions, if not present no crossfades are created. http://standingwaterstudios.com | ||||
| -- Requires: SWS extensions. http://standingwaterstudios.com | ||||
| -- Requires: This script goes with several other scripts that work closely together. | ||||
| 
 | ||||
| local stored_cursorPos = 0 | ||||
| @ -23,6 +23,7 @@ local mark_dstin_pos = -1 | ||||
| local mark_dstin_id = -1 | ||||
| local mark_dstout_pos = -1 | ||||
| local mark_dstout_id = -1 | ||||
| local dst_track_offset = 0 -- if the uppermost item is not on the first sourcetrack, this offset needs to be applied to the dst-track selection | ||||
| local edit_mode = 0  | ||||
| local sws_present = false | ||||
| -- edit modes: 0=not enough markers set; 1=src-in, src-out, dst-in; 2=src-in, src-out, dst-out; | ||||
| @ -39,6 +40,35 @@ function round(num, numDecimalPlaces) | ||||
|     return math.floor(num * mult + 0.5) / mult | ||||
| end | ||||
| 
 | ||||
| -- Calculate offset between first source track and uppermost source item (how many  | ||||
| -- tracks are empty in source selection on top). This needs to be applied to destination | ||||
| -- track selection, otherwise the items will be pasted shifted upwards. | ||||
| -- This function depends on the source tracks AND items to be already selected, | ||||
| -- it does not care about any markers or stored sourcetracks! | ||||
| function calculate_track_offset() | ||||
|     local first_sel_track = 9999 | ||||
|     local uppermost_item_track = 9999 | ||||
| 
 | ||||
|     -- get number of first selected track | ||||
|     for i = 0, reaper.CountSelectedTracks(0)-1 do | ||||
|         local nof_track = reaper.GetMediaTrackInfo_Value(reaper.GetSelectedTrack(0, i), "IP_TRACKNUMBER") | ||||
|         if nof_track < first_sel_track then | ||||
|             first_sel_track = nof_track | ||||
|         end | ||||
|     end | ||||
| 
 | ||||
|     -- get tracknumber of first selected item | ||||
|     for i = 0, reaper.CountSelectedMediaItems(0)-1 do | ||||
|         local trackno_item = reaper.GetMediaTrackInfo_Value(reaper.GetMediaItemTrack(reaper.GetSelectedMediaItem(0, i)), "IP_TRACKNUMBER") | ||||
|         if trackno_item < uppermost_item_track then | ||||
|             uppermost_item_track = trackno_item | ||||
|         end | ||||
|     end | ||||
| 
 | ||||
|     -- calculate offset | ||||
|     dst_track_offset = uppermost_item_track - first_sel_track | ||||
| end | ||||
| 
 | ||||
| -- Selects the source tracks, or, if not stored in rpp, selects all tracks | ||||
| function select_src_tracks() | ||||
|     local tracks_str = '' | ||||
| @ -64,15 +94,36 @@ function select_src_tracks() | ||||
| end | ||||
| 
 | ||||
| -- Select the destination tracks, or, if not stored in rpp, the first track | ||||
| -- Also a offset must be specified which will be applied to the tracknumber to select | ||||
| function select_dst_track_only() | ||||
|     local track_str = '' | ||||
|     local retval | ||||
|     local raw_dst_track | ||||
| 
 | ||||
|     -- Get "raw" track, without offset | ||||
|     retval, track_str = reaper.GetProjExtState(0, '4PointCut', 'dst_track') | ||||
|     if retval > 0 then -- variable exists in rpp | ||||
|         reaper.SetOnlyTrackSelected(reaper.BR_GetMediaTrackByGUID(0, track_str)) | ||||
|        raw_dst_track = reaper.BR_GetMediaTrackByGUID(0, track_str) | ||||
|     else --default to first track | ||||
|         reaper.SetOnlyTrackSelected(reaper.GetTrack(0, 0)) | ||||
|         raw_dst_track = reaper.GetTrack(0, 0) | ||||
|     end | ||||
| 
 | ||||
|     if dst_track_offset <= 0 then | ||||
|         -- no offset to respect, easy | ||||
|         reaper.SetOnlyTrackSelected(raw_dst_track) | ||||
|     else | ||||
|         local trackno_dst_track = reaper.GetMediaTrackInfo_Value(raw_dst_track, "IP_TRACKNUMBER") + dst_track_offset | ||||
|         -- Run trough all tracks, select the one with the matching tracknumber and return | ||||
|         for i = 0, reaper.CountTracks(0)-1 do | ||||
|             local nof_track = reaper.GetMediaTrackInfo_Value(reaper.GetTrack(0, i), "IP_TRACKNUMBER") | ||||
|             if nof_track == trackno_dst_track then | ||||
|                 reaper.SetOnlyTrackSelected(reaper.GetTrack(0, i)) | ||||
|                 return | ||||
|             end | ||||
|         end | ||||
|     end | ||||
|     -- In theory should never be reached, use raw track as fallback, probably something is wrong with the offset: | ||||
|     reaper.SetOnlyTrackSelected(raw_dst_track) | ||||
| end | ||||
| 
 | ||||
| -- START HERE vvvvvvvvvvvvvvvvvvvvvvvvvv | ||||
| @ -176,9 +227,12 @@ end | ||||
| reaper.Main_OnCommand(40718, 0) -- select items on selected tracks under time selection | ||||
| reaper.Main_OnCommand(40060, 0) -- copy selected items under time selection 41383 | ||||
| 
 | ||||
| -- Calculate track offset between first selected item and first dst-track | ||||
| calculate_track_offset() | ||||
| 
 | ||||
| -- Move edit cursor to Dest-In and Paste | ||||
| reaper.GoToMarker(0, mark_dstin_id, false) | ||||
| select_dst_track_only() | ||||
| select_dst_track_only()  | ||||
| --reaper.Main_OnCommand(40058, 0) -- paste item  | ||||
| reaper.Main_OnCommand( reaper.NamedCommandLookup('_SWS_AWPASTE'), 0 ) -- SWS Paste | ||||
| 
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user