写了一个非常好用的建立区间的脚本,但是工程大了有点卡,请大佬们指点一下

问题详情

就是工程大了卡,别的没问题,该怎么优化呢?

function do_locate4()
reaper.PreventUIRefresh(1)
reaper.Undo_BeginBlock()
-- 获取选中媒体对象并获取其名称
local item = reaper.GetSelectedMediaItem(0, 0)
if item then
item_name = reaper.GetTakeName(reaper.GetActiveTake(item))
else
item_name = ''
end
reaper.Main_OnCommand(40289, 0) -- 对象: 取消选择全部对象
local editCursorPos = reaper.GetCursorPosition()-- 保存编辑光标位置
local cursor_pos = reaper.GetCursorPosition()
local num_markers = reaper.CountProjectMarkers()
local nearest_region_pos, nearest_region_name
-- 判断光标后是否有区域
local has_region_after_cursor = false
for i = 0, num_markers - 1 do
local retval, isrgn, pos, rgnend, name, markrgnindexnumber = reaper.EnumProjectMarkers3(0, i)
if isrgn and pos >= cursor_pos then
has_region_after_cursor = true
break
end
end
-- 如果光标后没有区域,则执行一些操作
if not has_region_after_cursor then
reaper.Main_OnCommand(reaper.NamedCommandLookup('_SWS_AWSELTOEND'), 0) --SWS/AW: 选择从光标到工程的结束处 (对象和时间选区)
reaper.Main_OnCommand(40717, 0) -- 对象: 全选当前时间选区内的对象
reaper.MoveEditCursor(600, false) -- 光标向右移动120个单位
reaper.Main_OnCommand(41205, 0) -- 将对象的位置移动到编辑光标
reaper.Main_OnCommand(40630, 0) -- 转到时间选区的开始处
reaper.Main_OnCommand(40635, 0) -- 取消时间选区

end

reaper.Main_OnCommand(40626, 0)--时间选区: 设置结束点
reaper.Main_OnCommand(40631, 0)--转到时间选区的结束处
for i = 0, num_markers - 1 do
local retval, isrgn, pos, rgnend, name, markrgnindexnumber = reaper.EnumProjectMarkers3(0, i)
if isrgn and rgnend < cursor_pos then
if not nearest_region_pos or pos > nearest_region_pos then
nearest_region_pos = rgnend
nearest_region_name = name
end
end
end
if nearest_region_pos then
reaper.SetEditCurPos2(0, nearest_region_pos, false, false)--移动光标到上一个区间结束处
else
reaper.Main_OnCommand(40042, 0)-- 转到工程的开始处
end
reaper.Main_OnCommand(40625, 0)--时间选区: 设置开始点
reaper.Main_OnCommand(40717, 0)--对象: 全选当前时间选区内的对象
reaper.MoveEditCursor(60,false)--右移光标1分钟
reaper.Main_OnCommand(40635, 0)--移除 (取消选择) 时间选区
reaper.Main_OnCommand(41205, 0)--将对象的位置移动到编辑光标
reaper.Main_OnCommand(41173, 0)-- 将光标移动到对象的开始处
reaper.Main_OnCommand(40836, 0) --移动光标到对象中最近的瞬态
reaper.Main_OnCommand(40541, 0) --设置吸附偏移量到光标
reaper.MoveEditCursor(-0.2,false) --光标左移0.2秒
reaper.Main_OnCommand(40511,0)--修剪光标左侧对象
reaper.Main_OnCommand(41174, 0) --光标移动到对象结束处
reaper.Main_OnCommand(40836, 0)--移动光标到对象中最近的瞬态
reaper.Main_OnCommand(40541, 0) --设置吸附偏移量到光标
reaper.MoveEditCursor(0.2,false)
reaper.Main_OnCommand(40512,0)--修剪光标右侧对象
--获取选中媒体对象数量
local numSelectedItems = reaper.CountSelectedMediaItems()
--如果没有选中媒体对象,则停止执行并返回
if numSelectedItems == 0 then
-- 还原编辑光标位置
reaper.SetEditCurPos(editCursorPos, false, false)
return
end

local startTime, endTime -- 定义变量用于存储最终的开始时间和结束时间
-- 遍历选中的媒体对象
for i = 0, reaper.CountSelectedMediaItems(0) - 1 do
local item = reaper.GetSelectedMediaItem(0, i)
local itemStart = reaper.GetMediaItemInfo_Value(item, "D_POSITION")
local itemEnd = itemStart + reaper.GetMediaItemInfo_Value(item, "D_LENGTH")

-- 如果是第一个媒体对象,则直接将开始时间和结束时间设置为该媒体对象的开始时间和结束时间
if i == 0 then
    startTime = itemStart-0.8
    endTime = itemEnd+0.8
else
    -- 如果不是第一个媒体对象,则分别判断该媒体对象的开始时间和结束时间是否超出当前最终的时间范围
    if itemStart < startTime then
        startTime = itemStart-0.8
    end
    
    if itemEnd > endTime then
        endTime = itemEnd+0.8
    end
end

end
reaper.AddProjectMarker2(0, true, startTime, endTime, item_name, -1, 0) -- 创建名为 item_name 的区间

reaper.SetEditCurPos(editCursorPos, false, false)-- 还原编辑光标位置
reaper.Main_OnCommand(40289, 0)--对象: 取消选择(清除选择)全部对象
reaper.UpdateArrange()
reaper.PreventUIRefresh(-1)
reaper.Undo_BeginBlock('',0)
end

做过的尝试

直接把脚本发上来吧,这样看得费劲

感谢Z佬的回复
从光标位置向左建立区间并以所选对象命名(首尾各1秒,间隔1分钟).lua (4.5 KB)

reaper.Main_OnCommand(40625, 0)--时间选区: 设置开始点
reaper.Main_OnCommand(40717, 0)--对象: 全选当前时间选区内的对象
reaper.MoveEditCursor(60,false)--右移光标1分钟
reaper.Main_OnCommand(40635, 0)--移除 (取消选择) 时间选区
reaper.Main_OnCommand(41205, 0)--将对象的位置移动到编辑光标
reaper.Main_OnCommand(41173, 0)-- 将光标移动到对象的开始处
reaper.Main_OnCommand(40836, 0) --移动光标到对象中最近的瞬态
reaper.Main_OnCommand(40541, 0) --设置吸附偏移量到光标
reaper.MoveEditCursor(-0.2,false) --光标左移0.2秒
reaper.Main_OnCommand(40511,0)--修剪光标左侧对象

这种方式去找瞬态的话,在大量的item情况下会很卡,换种方式

不会呀,小白一个,求大神改改

33_Create region before cursor to Prevregion.lua (2.9 KB)

可以运行,但是没有不能以所选对象命名,而且每一个区间在下面一个会锁定

这自己改就是了

感谢大大的帮助

Z佬有啥高招吗?

我还没看。上面不是解决了吗

哦,看看不同的方法,学习学习

搞明白了,果然高明,受教了,谢谢

老师好,有没有简单的只是光标右移1秒的脚本呀?

reaper.MoveEditCursor(number adjamt, boolean dosel)

谢谢大神,纯小白,写进去不好使 :joy:

reaper.MoveEditCursor(1,false)

感谢大佬!