@Erundolog Все правильно! Но хотелось бы все одним экшином только указать в самом скрипте дицебелы (плюс или минус) или минус и все это на итеме (раскрыть и закрыть) Вроде кюбейсковской истории если не ошибаюсь его уже забыл.
-----------------------------------------------------------------------------
local function No_Undo()end; local function no_undo()reaper.defer(No_Undo)end
-----------------------------------------------------------------------------
local window, segment, details = reaper.BR_GetMouseCursorContext()
local item = reaper.BR_GetMouseCursorContext_Item()
if not item then no_undo() return end
local position = reaper.GetMediaItemInfo_Value( item, 'D_POSITION' )
reaper.Undo_BeginBlock()
reaper.SelectAllMediaItems( 0, 0 )
reaper.SetMediaItemSelected( item, 1 )
local take = reaper.BR_GetMouseCursorContext_Take()
reaper.SetActiveTake( take )
reaper.SetEditCurPos( position, 0, 0 )
reaper.OnPlayButton()
reaper.UpdateArrange()
reaper.Undo_EndBlock("take item under cursor mouse, select-start play",1)
А как скрипт должен понимать, запускался ли он уже ранее или же это первый его вызов?Задумка такая что скрипт работает только на трек что расположен ниже и все, и если активировать повторно скрипт то не должно ничего происходить.
Если на треке ниже нет ни одного выделенного итема ,стоящего впереди, по отношению к позиции курсора - то это первый вызов скрипта.А как скрипт должен понимать, запускался ли он уже ранее или же это первый его вызов?
Проверил, теперь ошибок никаких не всплывает. Заметил момент со скачками по трекам: Если изначально курсор стоял на между итемами на верхнем треке, то поведение скрипта в плане скачков по трекам происходит правильное,т.е. после выделения итема на нижнем треке- дальнейшего скачка по другим трекам не происходит,если повтороно задействовать скрипт подряд.проверьте по новой
А можно скорректировать условие в коде 2, так чтобы скрипт понимал, что он уже сработал только в том случае,если уже изначально был выделен только один следующий итем по отношению к позиции курсора на нижнем треке, а если на нижнем треке были выделены любые другие итемы, кроме следующего итема, то скрипт запускается как обычно.Так вы же изначально просили что бы он срабатывал только один раз что если впереди есть выделенные итемы то скрипт уже сработал
вот он и думает что уже сработал
подправленный вами вариант хорошо дополняет предыдущий вариант. Более удобное поведение. Единственно что осталось, прописать условие что если на нижних треках от точки отсчета, уже есть в проекте изначально выделенные итем или итемы впереди, но эти выделенные итем/итемы стоят не первым по счету от точки отсчета то скрипт срабатывает. И единственное исключение, если от точки отсчета на нижнем треке уже выделен первый по счету итем, в этом случае активизируя скрипт не должно ничего происходить.подправил немного (если итем выделен на первом треке ,а трек например выделен пятый то выберется второй трек ,а не шестой как раньше )
Ну так, вроде как, и должно быть. Хотя да, понимаю, что не должно.на какой трек переместил больше на том треке не работает
То есть, за точку отсчёта следует брать конец выделенного айтема?Когда у вас выделен первый итем на первом треке, то должен выделяться четвертый итем второго трека, т.к. он идет следующим по отношению к длине первоначально выделенного итема.
Да, совершенно верно. И если под концом выделенного итема находится итем на нижнем треке, то этот итем пропускается и выделяется следующий по счету итем.То есть, за точку отсчёта следует брать конец выделенного айтема?
Стандартная ситауация.А то хотели одно, потом второе, затем третье (вообще не понятно что вам нужно)
-----------------------------------------------------------------------------
local function No_Undo()end; local function no_undo()reaper.defer(No_Undo)end
-----------------------------------------------------------------------------
local function GetFirstSelItemInFirstSelTrackOrJustFirstSelItem()
local Sel_item, It_track, sel, Get, x
for i = 1, reaper.CountSelectedMediaItems( 0 ) do
Sel_item = reaper.GetSelectedMediaItem(0, i-1)
It_track = reaper.GetMediaItem_Track( Sel_item )
sel = reaper.GetMediaTrackInfo_Value( It_track,'I_SELECTED')
if sel == 1 then
Get = reaper.GetSelectedMediaItem(0, i-1);x = 1;break
end
end
if not x then Get=reaper.GetSelectedMediaItem(0,0)end
return Get
end
---
local SelectAllMediaItems = function(selected)
for i = reaper.CountMediaItems( 0 )-1,0,-1 do
reaper.SetMediaItemSelected(reaper.GetMediaItem(0,i),selected)
end
end
---
local Sel_fir_it = GetFirstSelItemInFirstSelTrackOrJustFirstSelItem()
local sel_track = reaper.GetSelectedTrack( 0, 0 )
if not Sel_fir_it and not sel_track then
no_undo()
return
end
---
local not_undo
local CurPos = reaper.GetCursorPosition()
local count_track = reaper.CountTracks( 0 )
if Sel_fir_it then
local It_track = reaper.GetMediaItem_Track( Sel_fir_it )
local num_It_track = (reaper.GetMediaTrackInfo_Value(It_track,'IP_TRACKNUMBER')-1)
for i = num_It_track+1, count_track-1 do
local track = reaper.GetTrack( 0, i )
local Count_tr_item = reaper.CountTrackMediaItems( track )
if Count_tr_item > 0 then
local tr_item = reaper.GetTrackMediaItem( track, Count_tr_item-1 )
local position = reaper.GetMediaItemInfo_Value( tr_item,'D_POSITION')
if position < CurPos then no_undo() return end
for i2 = 1,Count_tr_item do
local tr_item = reaper.GetTrackMediaItem( track, i2-1 )
local position = reaper.GetMediaItemInfo_Value( tr_item,'D_POSITION')
if position >= CurPos then -- sel it больше или равен от курсора
SelectAllMediaItems( 0 )
reaper.SetOnlyTrackSelected( track )
reaper.SetMediaItemSelected( tr_item, 1 )
not_undo = 1
break
end
end
break
end
end
---
else
if sel_track then
local num_track = (reaper.GetMediaTrackInfo_Value(sel_track,'IP_TRACKNUMBER')-1)
for i = num_track+1, count_track-1 do
local track = reaper.GetTrack( 0, i )
local Count_tr_item = reaper.CountTrackMediaItems( track )
if Count_tr_item > 0 then
local tr_item = reaper.GetTrackMediaItem( track, Count_tr_item-1 )
local position = reaper.GetMediaItemInfo_Value( tr_item,'D_POSITION')
if position < CurPos then no_undo() return end
for i2 = 1,Count_tr_item do
local tr_item = reaper.GetTrackMediaItem( track, i2-1 )
local position = reaper.GetMediaItemInfo_Value( tr_item,'D_POSITION')
if position >= CurPos then -- sel it больше или равен от курсора
SelectAllMediaItems( 0 )
reaper.SetOnlyTrackSelected( track )
reaper.SetMediaItemSelected( tr_item, 1 )
not_undo = 1
break
end
end
break
end
end
end
end
---
local sel_track = reaper.GetSelectedTrack( 0, 0 )
if sel_track then
local Count_tr_item = reaper.CountTrackMediaItems( sel_track )
if Count_tr_item > 0 then
for i = 1,Count_tr_item do
local tr_item = reaper.GetTrackMediaItem( sel_track, i-1 )
local position = reaper.GetMediaItemInfo_Value( tr_item,'D_POSITION')
if position >= CurPos then -- sel it больше или равен от курсора
reaper.SelectAllMediaItems( 0, 0 )
reaper.SetMediaItemSelected( tr_item, 1 )
break
end
end
end
end
reaper.UpdateArrange()
if not_undo == 1 then
reaper.Undo_BeginBlock()
reaper.Undo_EndBlock([[ Select first item from position cursor
in next track from selected item and
or track, select track ]],1)
end
-----------------------------------------------------------------------------
local function No_Undo()end; local function no_undo()reaper.defer(No_Undo)end
-----------------------------------------------------------------------------
local function GetFirstSelItemInFirstSelTrackOrJustFirstSelItem()
local Sel_item, It_track, sel, Get, x
for i = 1, reaper.CountSelectedMediaItems( 0 ) do
Sel_item = reaper.GetSelectedMediaItem(0, i-1)
It_track = reaper.GetMediaItem_Track( Sel_item )
sel = reaper.GetMediaTrackInfo_Value( It_track,'I_SELECTED')
if sel == 1 then
Get = reaper.GetSelectedMediaItem(0, i-1);x = 1;break
end
end
if not x then Get=reaper.GetSelectedMediaItem(0,0)end
return Get
end
---
local SelectAllMediaItems = function(selected)
for i = reaper.CountMediaItems( 0 )-1,0,-1 do
reaper.SetMediaItemSelected(reaper.GetMediaItem(0,i),selected)
end
end
---
local Sel_fir_it = GetFirstSelItemInFirstSelTrackOrJustFirstSelItem()
local sel_track = reaper.GetSelectedTrack( 0, 0 )
if not Sel_fir_it and not sel_track then
no_undo()
return
end
---
local not_undo
local CurPos = reaper.GetCursorPosition()
local count_track = reaper.CountTracks( 0 )
if Sel_fir_it then
local position = reaper.GetMediaItemInfo_Value( Sel_fir_it,'D_POSITION')
if position > CurPos then no_undo() return end
local It_track = reaper.GetMediaItem_Track( Sel_fir_it )
local num_It_track = (reaper.GetMediaTrackInfo_Value(It_track,'IP_TRACKNUMBER')-1)
for i = num_It_track+1, count_track-1 do
local track = reaper.GetTrack( 0, i )
local Count_tr_item = reaper.CountTrackMediaItems( track )
if Count_tr_item > 0 then
local tr_item = reaper.GetTrackMediaItem( track, Count_tr_item-1 )
local position = reaper.GetMediaItemInfo_Value( tr_item,'D_POSITION')
if position <= CurPos then no_undo() return end ---
for i2 = 1,Count_tr_item do
local tr_item = reaper.GetTrackMediaItem( track, i2-1 )
local position = reaper.GetMediaItemInfo_Value( tr_item,'D_POSITION')
if position > CurPos then -- sel it больше или равен от курсора
SelectAllMediaItems( 0 )
reaper.SetOnlyTrackSelected( track )
reaper.SetMediaItemSelected( tr_item, 1 )
not_undo = 1
break
end
end
break
end
end
---
else
if sel_track then
local num_track = (reaper.GetMediaTrackInfo_Value(sel_track,'IP_TRACKNUMBER')-1)
for i = num_track+1, count_track-1 do
local track = reaper.GetTrack( 0, i )
local Count_tr_item = reaper.CountTrackMediaItems( track )
if Count_tr_item > 0 then
local tr_item = reaper.GetTrackMediaItem( track, Count_tr_item-1 )
local position = reaper.GetMediaItemInfo_Value( tr_item,'D_POSITION')
if position <= CurPos then no_undo() return end ---
for i2 = 1,Count_tr_item do
local tr_item = reaper.GetTrackMediaItem( track, i2-1 )
local position = reaper.GetMediaItemInfo_Value( tr_item,'D_POSITION')
if position > CurPos then -- sel it больше или равен от курсора
SelectAllMediaItems( 0 )
reaper.SetOnlyTrackSelected( track )
reaper.SetMediaItemSelected( tr_item, 1 )
not_undo = 1
break
end
end
break
end
end
end
end
---
local sel_track = reaper.GetSelectedTrack( 0, 0 )
if sel_track then
local Count_tr_item = reaper.CountTrackMediaItems( sel_track )
if Count_tr_item > 0 then
for i = 1,Count_tr_item do
local tr_item = reaper.GetTrackMediaItem( sel_track, i-1 )
local position = reaper.GetMediaItemInfo_Value( tr_item,'D_POSITION')
if position > CurPos then -- sel it больше или равен от курсора
reaper.SelectAllMediaItems( 0, 0 )
reaper.SetMediaItemSelected( tr_item, 1 )
break
end
end
end
end
reaper.UpdateArrange()
if not_undo == 1 then
reaper.Undo_BeginBlock()
reaper.Undo_EndBlock([[ Select first item from position cursor
in next track from selected item and
or track, select track ]],1)
end
Продуманное техническое задание - это 50% работы.
local script = "Select first right item in next track"
function getval(obj)
local function f(obj, parm) local num = reaper.GetMediaItemInfo_Value(obj, parm) return num end
local pos = f(obj, 'D_POSITION') return pos, pos + f(obj, 'D_LENGTH')
end
function gettr(idx) local tr = reaper.GetTrack(0, idx) return tr end
function setsel(obj, bool) reaper.SetMediaItemSelected(obj, bool) end
reaper.Undo_BeginBlock()
reaper.PreventUIRefresh(-1)
for i = 0, reaper.CountMediaItems(0) - 1 do
local item = reaper.GetMediaItem(0, i)
if reaper.IsMediaItemSelected(item) == true then
local _, item_end = getval(item)
local it_tr = reaper.GetMediaItemTrack(item)
for t = 0, reaper.CountTracks(0) - 1 do
if gettr(t) == it_tr then
local nexttr = gettr(t + 1)
if not nexttr then return end
local it_cnt = reaper.CountTrackMediaItems(nexttr)
if it_cnt ~= 0 then
for i = 0, it_cnt - 1 do
local nexttr_item = reaper.GetTrackMediaItem(nexttr, i)
if getval(nexttr_item) > item_end then
local buf = reaper.GetExtState(script, "buf")
if buf and buf == tostring(item) then return end
setsel(item, false) setsel(nexttr_item, true)
reaper.SetExtState(script, "buf", tostring(nexttr_item), false)
break
end
end break
else it_tr, t = nexttr, t + 1
end
end
end
break
end
end
reaper.UpdateArrange()
reaper.PreventUIRefresh(1)
reaper.Undo_EndBlock(script, -1)
УмеетВ идеале было здорово, если бы скрипт умел автоматически пропускать пустые треки без итемов