重新定位對象脚本3件套

【重新定位对象】将所有选定的对象按照先后顺序重新定位。支持对话框输入X秒,按照需要设定每个item之间的距离。
第一个选项:时间间隔,单位秒;
第二个选项:从对象的开始位置定位(填0),或对象的结束位置定位(填1)。

相似功能: Xenakios/SWS: Reposition selected items…,不过两者功能上有所区别,SWS版本是每个轨道的item单独定位,我的脚本是所有选中的item(不区分轨道)一起定位。

!1604721408820-repos-item.gif

食用方法:

把以下代码另存为 .lua 文件放到 C:\REAPER\Scripts 脚本文件中,在动作列表里面载入就可以用了。
或从ReaPack下载(新版本暂未上传)。

重新定位选中的对象

--zaibuyidao_Reposition Items.lua
count_sel_items = reaper.CountSelectedMediaItems(0)

if count_sel_items > 0 then
    reaper.PreventUIRefresh(1)
    reaper.Undo_BeginBlock() -- 撤消塊開始

    local interval = reaper.GetExtState("RepositionItems", "Interval")
    local toggle = reaper.GetExtState("RepositionItems", "Toggle")
    if (interval == "") then interval = "1" end
    if (toggle == "") then toggle = "1" end

    local user_ok, user_input_csv = reaper.GetUserInputs("重新定位對象", 2, "時間間隔(秒),0=對象開始 1=對象結束", interval ..','.. toggle)
    if not user_ok or not tonumber(interval) then return end
    interval, toggle = user_input_csv:match("(.*),(.*)")
    if not tonumber(interval) or not tonumber(toggle) then return end

    reaper.SetExtState("RepositionItems", "Interval", interval, false)
    reaper.SetExtState("RepositionItems", "Toggle", toggle, false)

    local item_list = {} -- 收集所有選定item

    for i = 0, count_sel_items - 1 do
        item = reaper.GetSelectedMediaItem(0, i)
        table.insert(item_list, item)
    end

    for k, item in ipairs(item_list) do
        item_next_start = reaper.GetMediaItemInfo_Value(item_list[k], "D_POSITION")
        item_next_end = reaper.GetMediaItemInfo_Value(item_list[k], "D_LENGTH") + item_next_start
        
        if k < count_sel_items then
            if toggle == "1" then
                reaper.SetMediaItemInfo_Value(item_list[k + 1], "D_POSITION", item_next_end + interval)
            elseif toggle == "0" then
                reaper.SetMediaItemInfo_Value(item_list[k + 1], "D_POSITION", item_next_start + interval)
            end
        end
    end

    reaper.Undo_EndBlock("重新定位對象", -1) -- 撤消塊結束
    reaper.UpdateArrange()
    reaper.PreventUIRefresh(-1)
end

另外一个脚本,将所有选中的item移动到第一个选中的item所在的轨道

--zaibuyidao_Move Items To Track Of First Selected Item.lua
count_sel_items = reaper.CountSelectedMediaItems(0)

if count_sel_items > 0 then
    reaper.PreventUIRefresh(1)
    reaper.Undo_BeginBlock() -- 撤消塊開始
    for i = 0, count_sel_items - 1 do
        item = reaper.GetSelectedMediaItem(0, i)
        if i == 0 then 
          track = reaper.GetMediaItem_Track(item)
        end
        reaper.MoveMediaItemToTrack(item, track)
    end
    reaper.Undo_EndBlock("Move Items To Track Of First Selected Item", -1) -- 撤消塊結束
    reaper.UpdateArrange()
    reaper.PreventUIRefresh(-1)
end

重新定位对象更新

模式0选定的item按轨道单独排序,模式1选定的item按时间线排序,模式2选定的item按先后位置排序。
!1623512061764-reposition-items.gif

合并展开选定的Item
!1623512066974-move-items-to-track.gif

脚本名:
zaibuyidao_Reposition Items
zaibuyidao_Move Items To Track Of First Selected Item.lua (合并)
zaibuyidao_Move Items To Track In Track Row Order.lua(展开)

从 Reapack 仓库下载:
https://github.com/zaibuyidao/ReaScripts/raw/master/index.xml
https://forum.reaget.com/mirrors/zaibuyidao/ReaScripts/index.xml(Tee佬提供的国内专线)