Sometime before I did two scripts for this
1) Reposition items on each track
Code:
function bla() end
function nothing() reaper.defer(bla) end
local count_items = reaper.CountSelectedMediaItems(0)
if count_items > 0 then
reaper.Undo_BeginBlock()
reaper.PreventUIRefresh(1)
for i=0, count_items-1 do
local get_item = reaper.GetSelectedMediaItem(0,i)
if get_item then
local item_track = reaper.GetMediaItem_Track(get_item)
local start_item = reaper.GetMediaItemInfo_Value(get_item, 'D_POSITION')
local end_item = start_item + reaper.GetMediaItemInfo_Value(get_item, 'D_LENGTH')
local get_item_2 = reaper.GetSelectedMediaItem(0,i+1)
if get_item_2 then
local item_track_2 = reaper.GetMediaItem_Track(get_item_2)
if item_track == item_track_2 then
reaper.SetMediaItemInfo_Value(get_item_2, 'D_POSITION', end_item)
end
end
end
end
reaper.Undo_EndBlock('Auto reposition items',-1)
reaper.PreventUIRefresh(-1)
else
nothing()
end
2) Reposition items relative to any track
Code:
function bla() end
function nothing()
reaper.defer(bla)
end
if reaper.CountSelectedMediaItems(0) == 0 then
nothing() return
end
reaper.Undo_BeginBlock()
reaper.PreventUIRefresh(1)
local t = {}
for i=1, reaper.CountSelectedMediaItems(0) do
local item = reaper.GetSelectedMediaItem(0,i-1)
local start_item = reaper.GetMediaItemInfo_Value(item,'D_POSITION')
t[i] = {item, start_item}
end
table.sort(t, function(a,b) return b[2] > a[2] end)
for i=1, #t do
local item_end =
reaper.GetMediaItemInfo_Value(t[i][1],'D_POSITION') + reaper.GetMediaItemInfo_Value(t[i][1],'D_LENGTH')
if t[i+1] then
reaper.SetMediaItemInfo_Value(t[i+1][1],'D_POSITION', item_end)
end
end
reaper.Undo_EndBlock('Reposition selected items relative to any track', -1)
reaper.PreventUIRefresh(-1)