Помогите создать экшн / кастом экшн / скрипт

  • Автор темы Автор темы @Michael
  • Дата начала Дата начала
@Erundolog Все правильно! Но хотелось бы все одним экшином только указать в самом скрипте дицебелы (плюс или минус) или минус и все это на итеме (раскрыть и закрыть) Вроде кюбейсковской истории если не ошибаюсь его уже забыл.
 
@Maestro Sound, Если Вам надо быстрее по времени то вариант предложенный мной мне кажется немного оперативнее, чем вбивать каждый раз в всплывающее окно сколько понизить повысить.
В любом случае, это все организовано экшенами, я скрипты писать не умею, это не ко мне
 
Есть скрипт DeBreath. Отлично работает с Эсс-ками и дыханием и чем угодно по выделению и в плюс и в минус.
 
@Erundolog, Это ни к Вам. Хотелось бы чтобы это делалось скрытно и не заграмождало интерфейс а +- db указать в скрипте
 
@Maestro Sound, сделайте кастом как у меня, только добавьте в начале "показать енвелоп" а после операции "скрыть" а на сколько понижать/повышать задайте в экшене. И скрипт не придется ждать
 
Нужна помощь при создании экшена/скрипта
Есть трек/В нем айтемы/в них тейки. Нужно чтоб по нажатию шортката становился активным тейк который находится под мышкой и тут же курсор перескакивал на выбранный тейк и начиналось воспроизведение. Опять навел мышку на тейк другой, нажал шорткат, тейк активировался и с его начала пошло воспроизведение.
 
@Erundolog,

PHP:
    -----------------------------------------------------------------------------
    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)

Обновленно 18.05.18
Take item under mouse cursor,select,solo take,start play,watch items in background(restore mute state )
 
Последнее редактирование:
  • Like
Реакции: incubator и Erundolog
@Archchie, бляха работает! Спасибо, уважил, аж настроение поднял. Просто писец. Больше никаких протулзов и фруктов! Навечная любовь к риперу

А можно попросить чтоб он был универсальным. Работал как с тейками так и с айтемами?

Супер! Рад как ребенок
 
Последнее редактирование:
Помогите пожалуйста создать новый скрипт "Выделить итем только на следующем треке", модернизируя старый скрипт "me2beats_Select item in next track".
Задача такая: точкой отсчета всегда выступает курсор на любом выделенном треке в проекте.Активизируя скрипт происходит также выделение следующего итема на треке что распложен ниже, как в скрипте у me2beats. Разница в том что выделение происходит всегда только первого итема расположенного правее курсора, т.е. итема что идет впереди на треке ниже. При повторном задействовании скрипта у me2beats, проиходил скачок на следующей трек, потом нажимая на скрипт еще раз происходил опять скачок на другой трек. В данном случае эти скачки на другие треки не требуются! Задумка такая что скрипт работает только на трек что расположен ниже и все, и если активировать повторно скрипт то не должно ничего происходить. Также скрипт должен понимать ситуацию если курсор расположен в таком месте, что впереди на треке ниже больше нет ни одного итема - в этом случае также активируя скрипт не должно происходить никакого выделения. Скрипт срабатывает только ели есть итемы впереди(на треке ниже) и все!
 
Последнее редактирование:
Задумка такая что скрипт работает только на трек что расположен ниже и все, и если активировать повторно скрипт то не должно ничего происходить.
А как скрипт должен понимать, запускался ли он уже ранее или же это первый его вызов?
 
А как скрипт должен понимать, запускался ли он уже ранее или же это первый его вызов?
Если на треке ниже нет ни одного выделенного итема ,стоящего впереди, по отношению к позиции курсора - то это первый вызов скрипта.
Если на треке ниже есть уже выделенный итем,стоящий впереди, по отношению к позиции курсора - то скрипт понимает и ничего не происходит при активации.
 
@Archchie, нет так получается. Поведение скрипта совсем другое. Возьмите для примера два трека и на каждом нарежьте итемов. Поставьте курсор на первом треке для примера между нарезанными итемами и запуская скрипт, выделение должно подхватывать ниже распложенный итем, но идущий следующим по счету, а не расположенный четко под кусором.Именно следюущий итем. Я протестировал ваш скрипт, в этой ситуации когда курсор стоит на первом треке между итемаами и ни одного итема не выделено- скрипт вообще не срабатывает. У вас скрипт срабатывает только если курсор стоит на выделенном итеме первого трека, т.е. итем у вас всегда должен быть выделен для активации скрипта-это не верное поведение.У вас выделение происходит четко расположенного итема ниже,а нужно следующего. Нужно чтобы не зависимо от того где стоит курсор на верхнем треке(либо между нарезанными итемами , либо на выделенном итеме) скрипт срабатывает и выделяет следующий итем по счету, расположенный треком ниже.
 
Последнее редактирование:
@Archchie, Не верное поведение скрипта. Если в проекте 3 трека и более у вас также происходят дальнейшие скачки по трекам, если несколько раз активировать скрипт подряд.
Как это было у me2beats-это не требуется.
Если изначально в проекте курсор стоял между итемами и происходит выделение на последнем нижнем треке при скачках у вас всплывает ошибка: "attempt to call a nil value (global 'no_undo')".
Ошибка возникает когда несолько раз подряд нажимаешь на хоткей активируя скрипт. Если же была ситуация когда изначально курсор стоял на выделенном итеме,
то ошибки не возникает.Поправьте пожалуйста этот момент.
Что касается поведения скрипта, то опять не правильно срабатывает выделение. Пример: У меня на первом треке 5 итемов и на втором предположим 6 итемов.Количество итемов может быть любым. Курсор стоит на первом треке между итемами, но расположение курсора задевает один из итемов расположенного на втором треке.И задевать итем второго трека он может как в начале итема, в серидине итема или в конце итема нижнего трека, т.е. в любом месте! Выделение должно происходить итема на втором треке, идущим следующим по счету, т.е. выделяется итем ,который никак не задевается расположением курсора!
 
проверьте по новой
Проверил, теперь ошибок никаких не всплывает. Заметил момент со скачками по трекам: Если изначально курсор стоял на между итемами на верхнем треке, то поведение скрипта в плане скачков по трекам происходит правильное,т.е. после выделения итема на нижнем треке- дальнейшего скачка по другим трекам не происходит,если повтороно задействовать скрипт подряд.
А вот если изначально курсор стоял на выделенном итеме верхнего трека, то происходят дальнейшие скачки на трек ниже, затем еще на трек ниже и т.д, при повтрном задействовании скрипта. Причем обычно эти скачки на дальнейшие треки срабатывают когда курсор стоит не просто на выделенном итеме а еще распложен в положении от начала до середины этого итема в плане длины. Если же курсор стоит на выделенном итеме в положении от середины до конца этого итема-то ненужные скачки на другие треки не просходят.
 
@Archchie, браво! Спасибо большое все получилось, теперь правильное поведение скрипта.
Не заметил пока разницы в двух последних версиях, чем они отличаются?
 
@HDVulcan, у меня есть вариант, который не реагирует ни на курсор, ни на выделенный трек, а за точку отсчёта берёт выделенный айтем. Может, подойдёт?
 
Последнее редактирование:
@Archchie, поведение скрипта в последнем варианте "код 2" мне больше подходит. Потестировал более углубленно. Выяснилось следующее не удобное поведение последнего скрипта, а именно:
Предположим у нас в проекте идет 3 трека.В проекте выделен верхний первый трек и курсор стоит между итемами или на на каком-то из итемов первого трека- то поведение скрипта полностью правильное;
Но если в такой-же ситуации был выделен предварительно впереди стоящий какой-то из итемов , предположим на втором треке или третьем треке,причем расположены выделеные итемы именно впереди,
то тут поведение скрипта становится не верным,скрипт совсем не срабатывает, т.е. ничего не происходит. Но если был предварительно выделен итем на втором или третьем треке, который стоит до курсора то тут поведение скрипта идет верное и он правильно выделяет итем. Добавьте пожалуйста в последний скрипт(код 2) это условие,чтобы скрипт понимал ситуации когда могут быть предварительно выделены быть итем/итемы на всех ниже расположенных треках, т.е. где бы не был выделен итем или группа итемов в проекте, после активации скрипта, выделение перескакивает на следующий итем нижнего трека от позиции курсора выделеного трека.
@CerberPic, спасибо вам большое.Сейчас протестирую отпишусь.
 
@CerberPic, я протестировал. Поведение скрипта не верное.У вас почему-то срабатывает скрипт только на первых двух треках в проекте. Ведь может быть сиуация когда за точку отсчета будет браться предположим выделенный итем со второго трека, а не только итем с первого трека. У вас скрипт срабатывает только на условие что итем был выделен именно с первого трека.Это не верно. Второй момент, если под выделенным итемом стоит точно такой итем по длине на нижнем треке(или у этих итемов совпадают начало), то при активации скрипта выделяется этот нижестоящий итем, а должен выделяться следующий итем по счету на нижнем треке.
 
@HDVulcan, у меня на всех треках срабатывает, как и должно быть (см. гиф). По второму пункту поправил (в том же посте).
 

Вложения

  • gif.gif
    gif.gif
    601,7 KB · Просмотры: 82
Народ привет1. как сделать актион чтобы по нажатию(на выделенном треке) по кнопке появлялся раздел громкости(из trip) повторным нажатием исчезал.(первый вопрос решил-оказывается там на кнопке v
2. Я пытался найти такой актион, но там(в, action-find) тока есть такая штука на trip volume, собственно второй вопрос что такое trip volume?
 
Так вы же изначально просили что бы он срабатывал только один раз что если впереди есть выделенные итемы то скрипт уже сработал
вот он и думает что уже сработал
А можно скорректировать условие в коде 2, так чтобы скрипт понимал, что он уже сработал только в том случае,если уже изначально был выделен только один следующий итем по отношению к позиции курсора на нижнем треке, а если на нижнем треке были выделены любые другие итемы, кроме следующего итема, то скрипт запускается как обычно.

@CerberPic, посмотрел гифку. Когда у вас выделен первый итем на первом треке, то должен выделяться четвертый итем второго трека, т.к. он идет следующим по отношению к длине первоначально выделенного итема. В случае выделения итема третьего трека на гифке, у вас правильно срабатывает выделение следующего итема нижнего трека. И в третьем случае на гифке когда у вас выделяется итем пятого трека, у вас выделение срабатывает на ниже распложенный итем шестого трека, а должен выделяться итем следующий по счету на шестом треке. Т.е. выделяется всегда итем начало которого идет впереди от точки отсчета. В вашем случае точка отсчета это выделенный итем. Между точкой отсчета(конец итема) и будущим выделенным итемом всегда есть какое-то расстояние.
 
Последнее редактирование:
подправил немного (если итем выделен на первом треке ,а трек например выделен пятый то выберется второй трек ,а не шестой как раньше )
подправленный вами вариант хорошо дополняет предыдущий вариант. Более удобное поведение. Единственно что осталось, прописать условие что если на нижних треках от точки отсчета, уже есть в проекте изначально выделенные итем или итемы впереди, но эти выделенные итем/итемы стоят не первым по счету от точки отсчета то скрипт срабатывает. И единственное исключение, если от точки отсчета на нижнем треке уже выделен первый по счету итем, в этом случае активизируя скрипт не должно ничего происходить.
Archchie, внесите пожалуйста изменения в этот подправленный вариант.
Нашел неудобство, предположим в проекте идет 10 треков, итемы есть только на шести первых треках, а четыре последних трека идут пустые без итемов. Так вот если курсор поставить на шестой трек, т.е. на последний трек с итемами, то нажимая повторно на скрипт, происходит автоматическое переключение выделения на 7 трек, далее нажимая на скрипт происходит выделение 8-го трека ит.д. до 10 трека.Пропишите пожалуйста в скрипт ситуацию,что если итемов нет на треке то не надо на этот трек переключаться, т.е. в данном примере выделение должно оставастаться на последнем треке с итемами, а повторные нажатия скрипта не должны ничего менять на этом треке.
Но может быть ситуация,если например среди последних четырех треков один из них идет с итемами.Предположим 7-й трек пустой, 8 -й трек пустой, 9-й трек с итемами, 10-й трек пустой.
В идеале было здорово, если бы скрипт умел автоматически пропускать пустые треки без итемов и выделять итемы уже сразу на последнем треке с итемами, т.е. в данном случае после шестого трека запустив снова скрипт мы автоматически попадали бы на 9-й трек с итемами а далее, активируя повторно скрипт,на нем же и оставались, как на последнем треке с итемами.

По поводу последнего варианта "как то как?", я плохо наверное расписал, вы меня не верно поняли. Я также писал все о том же.
Здесь уже совсем другое поведение скрипта.Последний ваш вариант в хозяйстве тоже может пригодиться,спасибо вам! ,но он уже заточен со скачками по всем трекам в проекте при повторной активации скрипта.Сейчас это не требуется, но в будущем могут возникнуть и такие сиуации где и такой вариант отлично подойдет.Еще раз спасибо!
 
Последнее редактирование:
на какой трек переместил больше на том треке не работает
Ну так, вроде как, и должно быть. Хотя да, понимаю, что не должно.

Когда у вас выделен первый итем на первом треке, то должен выделяться четвертый итем второго трека, т.к. он идет следующим по отношению к длине первоначально выделенного итема.
То есть, за точку отсчёта следует брать конец выделенного айтема?
 
То есть, за точку отсчёта следует брать конец выделенного айтема?
Да, совершенно верно. И если под концом выделенного итема находится итем на нижнем треке, то этот итем пропускается и выделяется следующий по счету итем.
Как в случае с треком №5 на гифке.
 
@HDVulcan, Определитесь пожалуйста до конца - что вам нужно !!!
Что бы выделить следующий итем отталкиваясь от конца предыдущего итема или отталкиваясь от курсора? это два разных скрипта.
От начала до конца решите что он должен делать ? А то хотели одно, потом второе, затем третье (вообще не понятно что вам нужно)
 
@HDVulcan, опишите нам в подробностях, в каких конкретных ситуациях этот скрипт будет использоваться. По возможности с гифкой и пояснениями, почему должно быть так, а не иначе. А то так мы можем только гадать, что вам на самом деле нужно.
 
@Archchie, я давно определился. То что я вам написал мне то и надо. Сделайте пожалуйста правки в подправленном варианте, в последнем сообщении где выложен код.
Точкой отсчета как и было остается курсор.Мне это и нужно.
А что касается варианта предложенного CerberPic, я не просил, это инициатива его, сделать дополнительно скрипт где отправная точкой уже является выделенный итем. Если CerberPic удастся сделать такой скрипт, то он тоже пригодится в будущем. Archchie,вас я прошу доделать свой вариант скрипта и все. Я не просил вас сделать вариант еще предложенный CerberPic, где отправной точкой будет итем.

@CerberPic, если вам удастся сделать вариант скрипта где отправной точкой выступает выделенный итем это тоже будет прекрасно и конечно пригодится в будущем.
 
Обновлено

Выбрать первый элемент от позиции курсора в следующем треке от выбранного элемента и,или от трека,выбрать трек
PHP:
    -----------------------------------------------------------------------------
    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

PHP:
    -----------------------------------------------------------------------------
    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% работы.

Вот теперь я вас понимаю :)
сколько лишней работы в малейшей недосказанности :(
 
Последнее редактирование:
@HDVulcan, пробуйте
PHP:
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)

В идеале было здорово, если бы скрипт умел автоматически пропускать пустые треки без итемов
Умеет :)
 

Сейчас просматривают