问题详情
给一些媒体块做了分组,但用reaper.GetMediaItemInfo_Value(it, 'I_GROUPID ')得到的结果却是0,这会是什么原因呢?或者有什么其他方法可以获取分组信息?
请教大神们
给一些媒体块做了分组,但用reaper.GetMediaItemInfo_Value(it, 'I_GROUPID ')得到的结果却是0,这会是什么原因呢?或者有什么其他方法可以获取分组信息?
请教大神们
尝试了一下很正常,你没提供什么信息判断不了具体情况,只能推测,确保你的对象是确实有分组的,确保你用的分组是以这个方式 Item grouping: Group items。如果都没问题,那就贴上操作过程的动图和完整的代码
大致脚本如下:
local cur=reaper.GetCursorPosition() --获取当前光标位置
local tr=reaper.GetSelectedTrack(0, 0) --获取选中的轨道
function get_item_group(tr)
local num=reaper.CountTrackMediaItems(tr)
if num==0 then
msg(‘该轨道上没有媒体块’)
return
end
for i=0, num-1 do
it=reaper.GetTrackMediaItem(tr, i) --依次获取媒体块
itpos=reaper.GetMediaItemInfo_Value(it, 'D_POSITION') --获取媒体块的横坐标位置
itlen=reaper.GetMediaItemInfo_Value(it, 'D_LENGTH') --获取媒体块长度
if cur<=itpos+itlen then --获取在光标时间后最近的媒体块(含重合)
break
end
end
itgroup=reaper.GetMediaItemInfo_Value(it, 'I_GROUPID ') --获取该媒体块的分组
msg(itgroup)
end
啊不好意思,低级错误,I_GROUPID后面多了个空格。。。。
sorry
代码犯了一些基本错误,说说怎么修改,具体原理要自己去查资料
local cur=reaper.GetCursorPosition() --获取当前光标位置
local tr=reaper.GetSelectedTrack(0, 0) --获取选中的轨道
function get_item_group(tr)
local num=reaper.CountTrackMediaItems(tr)
if num==0 then
msg('该轨道上没有媒体块')
return
end
local target --保存目标item
for i=0, num-1 do
local it=reaper.GetTrackMediaItem(tr, i) --依次获取媒体块
local itpos=reaper.GetMediaItemInfo_Value(it, 'D_POSITION') --获取媒体块的横坐标位置
local itlen=reaper.GetMediaItemInfo_Value(it, 'D_LENGTH') --获取媒体块长度
if cur<=itpos+itlen then --获取在光标时间后最近的媒体块(含重合)
target=it
break
end
end
itgroup=reaper.GetMediaItemInfo_Value(target, 'I_GROUPID') --获取该媒体块的分组
msg(itgroup)
end
呃,你指的是哪些基本错误?
应该说是一些不好的习惯。你在一个函数里,特别是一个循环里用了很多全局变量,这样写很容易出问题,特别是你的变量名是it这样简单的命名。所以我为什么在开始循环之前先定义一个叫target的局部变量,为了把循环中获取到的目标item保存下来,同时让循环时用到的变量都改成局部变量,达到用完即弃的效果。大部分情况下函数和循环里用到的变量都应该是独立的,不影响外部的
明白,的确有些不太好的习惯,也是刚接触Lua不太久,多谢指教
怎么知道局部变量的范围?我一直对这个不太了解,我也很少定义局部变量,对于一些大型运算,速度会有明显提升吗?
局部变量只会在他被声明开始的那一个范围内生效,在if里声明,if结束后消失,在循环里声明,循环结束后消失,在一个函数里声明,函数结束时消失。对性能没有影响,但全用全局变量的话有被意外覆盖掉数值的危险,一般无脑local就对了