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

Тема в разделе "Reaper", создана пользователем @Michael, 2 авг 2015.

  1. HDVulcan

    HDVulcan Active Member

    Регистрация:
    23 окт 2016
    Сообщения:
    155
    Симпатии:
    31
    Пол:
    Мужской
    Если на треке ниже нет ни одного выделенного итема ,стоящего впереди, по отношению к позиции курсора - то это первый вызов скрипта.
    Если на треке ниже есть уже выделенный итем,стоящий впереди, по отношению к позиции курсора - то скрипт понимает и ничего не происходит при активации.
     
  2. HDVulcan

    HDVulcan Active Member

    Регистрация:
    23 окт 2016
    Сообщения:
    155
    Симпатии:
    31
    Пол:
    Мужской
    @Archchie, нет так получается. Поведение скрипта совсем другое. Возьмите для примера два трека и на каждом нарежьте итемов. Поставьте курсор на первом треке для примера между нарезанными итемами и запуская скрипт, выделение должно подхватывать ниже распложенный итем, но идущий следующим по счету, а не расположенный четко под кусором.Именно следюущий итем. Я протестировал ваш скрипт, в этой ситуации когда курсор стоит на первом треке между итемаами и ни одного итема не выделено- скрипт вообще не срабатывает. У вас скрипт срабатывает только если курсор стоит на выделенном итеме первого трека, т.е. итем у вас всегда должен быть выделен для активации скрипта-это не верное поведение.У вас выделение происходит четко расположенного итема ниже,а нужно следующего. Нужно чтобы не зависимо от того где стоит курсор на верхнем треке(либо между нарезанными итемами , либо на выделенном итеме) скрипт срабатывает и выделяет следующий итем по счету, расположенный треком ниже.
     
    Последнее редактирование: 12 май 2018
  3. HDVulcan

    HDVulcan Active Member

    Регистрация:
    23 окт 2016
    Сообщения:
    155
    Симпатии:
    31
    Пол:
    Мужской
    @Archchie, Не верное поведение скрипта. Если в проекте 3 трека и более у вас также происходят дальнейшие скачки по трекам, если несколько раз активировать скрипт подряд.
    Как это было у me2beats-это не требуется.
    Если изначально в проекте курсор стоял между итемами и происходит выделение на последнем нижнем треке при скачках у вас всплывает ошибка: "attempt to call a nil value (global 'no_undo')".
    Ошибка возникает когда несолько раз подряд нажимаешь на хоткей активируя скрипт. Если же была ситуация когда изначально курсор стоял на выделенном итеме,
    то ошибки не возникает.Поправьте пожалуйста этот момент.
    Что касается поведения скрипта, то опять не правильно срабатывает выделение. Пример: У меня на первом треке 5 итемов и на втором предположим 6 итемов.Количество итемов может быть любым. Курсор стоит на первом треке между итемами, но расположение курсора задевает один из итемов расположенного на втором треке.И задевать итем второго трека он может как в начале итема, в серидине итема или в конце итема нижнего трека, т.е. в любом месте! Выделение должно происходить итема на втором треке, идущим следующим по счету, т.е. выделяется итем ,который никак не задевается расположением курсора!
     
  4. HDVulcan

    HDVulcan Active Member

    Регистрация:
    23 окт 2016
    Сообщения:
    155
    Симпатии:
    31
    Пол:
    Мужской
    Проверил, теперь ошибок никаких не всплывает. Заметил момент со скачками по трекам: Если изначально курсор стоял на между итемами на верхнем треке, то поведение скрипта в плане скачков по трекам происходит правильное,т.е. после выделения итема на нижнем треке- дальнейшего скачка по другим трекам не происходит,если повтороно задействовать скрипт подряд.
    А вот если изначально курсор стоял на выделенном итеме верхнего трека, то происходят дальнейшие скачки на трек ниже, затем еще на трек ниже и т.д, при повтрном задействовании скрипта. Причем обычно эти скачки на дальнейшие треки срабатывают когда курсор стоит не просто на выделенном итеме а еще распложен в положении от начала до середины этого итема в плане длины. Если же курсор стоит на выделенном итеме в положении от середины до конца этого итема-то ненужные скачки на другие треки не просходят.
     
  5. HDVulcan

    HDVulcan Active Member

    Регистрация:
    23 окт 2016
    Сообщения:
    155
    Симпатии:
    31
    Пол:
    Мужской
    @Archchie, браво! Спасибо большое все получилось, теперь правильное поведение скрипта.
    Не заметил пока разницы в двух последних версиях, чем они отличаются?
     
  6. CerberPic

    CerberPic Member

    Регистрация:
    17 фев 2017
    Сообщения:
    69
    Симпатии:
    22
    Пол:
    Мужской
    @HDVulcan, у меня есть вариант, который не реагирует ни на курсор, ни на выделенный трек, а за точку отсчёта берёт выделенный айтем. Может, подойдёт?
     
    Последнее редактирование: 13 май 2018
  7. HDVulcan

    HDVulcan Active Member

    Регистрация:
    23 окт 2016
    Сообщения:
    155
    Симпатии:
    31
    Пол:
    Мужской
    @Archchie, поведение скрипта в последнем варианте "код 2" мне больше подходит. Потестировал более углубленно. Выяснилось следующее не удобное поведение последнего скрипта, а именно:
    Предположим у нас в проекте идет 3 трека.В проекте выделен верхний первый трек и курсор стоит между итемами или на на каком-то из итемов первого трека- то поведение скрипта полностью правильное;
    Но если в такой-же ситуации был выделен предварительно впереди стоящий какой-то из итемов , предположим на втором треке или третьем треке,причем расположены выделеные итемы именно впереди,
    то тут поведение скрипта становится не верным,скрипт совсем не срабатывает, т.е. ничего не происходит. Но если был предварительно выделен итем на втором или третьем треке, который стоит до курсора то тут поведение скрипта идет верное и он правильно выделяет итем. Добавьте пожалуйста в последний скрипт(код 2) это условие,чтобы скрипт понимал ситуации когда могут быть предварительно выделены быть итем/итемы на всех ниже расположенных треках, т.е. где бы не был выделен итем или группа итемов в проекте, после активации скрипта, выделение перескакивает на следующий итем нижнего трека от позиции курсора выделеного трека.
    @CerberPic, спасибо вам большое.Сейчас протестирую отпишусь.
     
  8. HDVulcan

    HDVulcan Active Member

    Регистрация:
    23 окт 2016
    Сообщения:
    155
    Симпатии:
    31
    Пол:
    Мужской
    @CerberPic, я протестировал. Поведение скрипта не верное.У вас почему-то срабатывает скрипт только на первых двух треках в проекте. Ведь может быть сиуация когда за точку отсчета будет браться предположим выделенный итем со второго трека, а не только итем с первого трека. У вас скрипт срабатывает только на условие что итем был выделен именно с первого трека.Это не верно. Второй момент, если под выделенным итемом стоит точно такой итем по длине на нижнем треке(или у этих итемов совпадают начало), то при активации скрипта выделяется этот нижестоящий итем, а должен выделяться следующий итем по счету на нижнем треке.
     
  9. CerberPic

    CerberPic Member

    Регистрация:
    17 фев 2017
    Сообщения:
    69
    Симпатии:
    22
    Пол:
    Мужской
    @HDVulcan, у меня на всех треках срабатывает, как и должно быть (см. гиф). По второму пункту поправил (в том же посте).
     

    Вложения:

    • gif.gif
      gif.gif
      Размер файла:
      601,7 КБ
      Просмотров:
      23
  10. andykarm

    andykarm Member

    Регистрация:
    19 мар 2018
    Сообщения:
    34
    Симпатии:
    1
    Пол:
    Мужской
    Народ привет1. как сделать актион чтобы по нажатию(на выделенном треке) по кнопке появлялся раздел громкости(из trip) повторным нажатием исчезал.(первый вопрос решил-оказывается там на кнопке v
    2. Я пытался найти такой актион, но там(в, action-find) тока есть такая штука на trip volume, собственно второй вопрос что такое trip volume?
     
  11. HDVulcan

    HDVulcan Active Member

    Регистрация:
    23 окт 2016
    Сообщения:
    155
    Симпатии:
    31
    Пол:
    Мужской
    А можно скорректировать условие в коде 2, так чтобы скрипт понимал, что он уже сработал только в том случае,если уже изначально был выделен только один следующий итем по отношению к позиции курсора на нижнем треке, а если на нижнем треке были выделены любые другие итемы, кроме следующего итема, то скрипт запускается как обычно.

    @CerberPic, посмотрел гифку. Когда у вас выделен первый итем на первом треке, то должен выделяться четвертый итем второго трека, т.к. он идет следующим по отношению к длине первоначально выделенного итема. В случае выделения итема третьего трека на гифке, у вас правильно срабатывает выделение следующего итема нижнего трека. И в третьем случае на гифке когда у вас выделяется итем пятого трека, у вас выделение срабатывает на ниже распложенный итем шестого трека, а должен выделяться итем следующий по счету на шестом треке. Т.е. выделяется всегда итем начало которого идет впереди от точки отсчета. В вашем случае точка отсчета это выделенный итем. Между точкой отсчета(конец итема) и будущим выделенным итемом всегда есть какое-то расстояние.
     
    Последнее редактирование: 12 май 2018
  12. HDVulcan

    HDVulcan Active Member

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

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

    CerberPic Member

    Регистрация:
    17 фев 2017
    Сообщения:
    69
    Симпатии:
    22
    Пол:
    Мужской
    Ну так, вроде как, и должно быть. Хотя да, понимаю, что не должно.

    То есть, за точку отсчёта следует брать конец выделенного айтема?
     
  14. HDVulcan

    HDVulcan Active Member

    Регистрация:
    23 окт 2016
    Сообщения:
    155
    Симпатии:
    31
    Пол:
    Мужской
    Да, совершенно верно. И если под концом выделенного итема находится итем на нижнем треке, то этот итем пропускается и выделяется следующий по счету итем.
    Как в случае с треком №5 на гифке.
     
  15. Archchie

    Archchie Active Member

    Регистрация:
    24 окт 2017
    Сообщения:
    352
    Симпатии:
    175
    Пол:
    Мужской
    @HDVulcan, Определитесь пожалуйста до конца - что вам нужно !!!
    Что бы выделить следующий итем отталкиваясь от конца предыдущего итема или отталкиваясь от курсора? это два разных скрипта.
    От начала до конца решите что он должен делать ? А то хотели одно, потом второе, затем третье (вообще не понятно что вам нужно)
     
  16. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    16.914
    Симпатии:
    9.168
    Пол:
    Мужской
    Адрес:
    Киев
    Стандартная ситауация.
    Продуманное техническое задание - это 50% работы.
     
    Archchie нравится это.
  17. CerberPic

    CerberPic Member

    Регистрация:
    17 фев 2017
    Сообщения:
    69
    Симпатии:
    22
    Пол:
    Мужской
    @HDVulcan, опишите нам в подробностях, в каких конкретных ситуациях этот скрипт будет использоваться. По возможности с гифкой и пояснениями, почему должно быть так, а не иначе. А то так мы можем только гадать, что вам на самом деле нужно.
     
  18. HDVulcan

    HDVulcan Active Member

    Регистрация:
    23 окт 2016
    Сообщения:
    155
    Симпатии:
    31
    Пол:
    Мужской
    @Archchie, я давно определился. То что я вам написал мне то и надо. Сделайте пожалуйста правки в подправленном варианте, в последнем сообщении где выложен код.
    Точкой отсчета как и было остается курсор.Мне это и нужно.
    А что касается варианта предложенного CerberPic, я не просил, это инициатива его, сделать дополнительно скрипт где отправная точкой уже является выделенный итем. Если CerberPic удастся сделать такой скрипт, то он тоже пригодится в будущем. Archchie,вас я прошу доделать свой вариант скрипта и все. Я не просил вас сделать вариант еще предложенный CerberPic, где отправной точкой будет итем.

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

    Archchie Active Member

    Регистрация:
    24 окт 2017
    Сообщения:
    352
    Симпатии:
    175
    Пол:
    Мужской
    Обновлено

    Выбрать первый элемент от позиции курсора в следующем треке от выбранного элемента и,или от трека,выбрать трек
    PHP:
          
      
        
    -----------------------------------------------------------------------------
        
    local function No_Undo()endlocal function no_undo()reaper.defer(No_Undo)end
        
    -----------------------------------------------------------------------------



        
    local function GetFirstSelItemInFirstSelTrackOrJustFirstSelItem()
            
    local Sel_itemIt_trackselGetx
            
    for 1reaper.CountSelectedMediaItems)  do
                
    Sel_item reaper.GetSelectedMediaItem(0i-1)
                
    It_track reaper.GetMediaItem_TrackSel_item )
                
    sel reaper.GetMediaTrackInfo_ValueIt_track,'I_SELECTED')
                if 
    sel == 1 then
                     Get 
    reaper.GetSelectedMediaItem(0i-1);1;break
                
    end
            end
            
    if not x then Get=reaper.GetSelectedMediaItem(0,0)end
            
    return Get
        end
        
    ---
      
      
        
    local SelectAllMediaItems = function(selected)
            for 
    reaper.CountMediaItems)-1,0,-do
                
    reaper.SetMediaItemSelected(reaper.GetMediaItem(0,i),selected)
            
    end
        end
        
    ---


        
    local Sel_fir_it GetFirstSelItemInFirstSelTrackOrJustFirstSelItem()
        
    local sel_track reaper.GetSelectedTrack0)
        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)
        if 
    Sel_fir_it then
            local It_track 
    reaper.GetMediaItem_TrackSel_fir_it )
            
    local num_It_track = (reaper.GetMediaTrackInfo_Value(It_track,'IP_TRACKNUMBER')-1)
            for 
    num_It_track+1count_track-do
                
    local track reaper.GetTrack0)
                
    local Count_tr_item reaper.CountTrackMediaItemstrack )
                if 
    Count_tr_item 0 then
                    local tr_item 
    reaper.GetTrackMediaItemtrackCount_tr_item-)
                    
    local position reaper.GetMediaItemInfo_Valuetr_item,'D_POSITION')
                    if 
    position CurPos then no_undo() return end
                    
    for i2 1,Count_tr_item do
                        
    local tr_item reaper.GetTrackMediaItemtracki2-)
                        
    local position reaper.GetMediaItemInfo_Valuetr_item,'D_POSITION')
                        if 
    position >= CurPos then -- sel it больше или равен от курсора
                            SelectAllMediaItems
    )
                            
    reaper.SetOnlyTrackSelectedtrack )
                            
    reaper.SetMediaItemSelectedtr_item)
                            
    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 
    num_track+1count_track-do
                    
    local track reaper.GetTrack0)
                    
    local Count_tr_item reaper.CountTrackMediaItemstrack )
                    if 
    Count_tr_item 0 then
                        local tr_item 
    reaper.GetTrackMediaItemtrackCount_tr_item-)
                        
    local position reaper.GetMediaItemInfo_Valuetr_item,'D_POSITION')
                        if 
    position CurPos then no_undo() return end
                        
    for i2 1,Count_tr_item do
                            
    local tr_item reaper.GetTrackMediaItemtracki2-)
                            
    local position reaper.GetMediaItemInfo_Valuetr_item,'D_POSITION')
                            if 
    position >= CurPos then -- sel it больше или равен от курсора
                                SelectAllMediaItems
    )
                                
    reaper.SetOnlyTrackSelectedtrack )
                                
    reaper.SetMediaItemSelectedtr_item)
                                
    not_undo 1
                                
    break
                            
    end
                        end
                    
    break
                    
    end
                end
            end
        end
        
    ---
      

        
    local sel_track reaper.GetSelectedTrack0)
        if 
    sel_track then
            local Count_tr_item 
    reaper.CountTrackMediaItemssel_track )
            if 
    Count_tr_item 0 then
                
    for 1,Count_tr_item do
                    
    local tr_item reaper.GetTrackMediaItemsel_tracki-)
                    
    local position reaper.GetMediaItemInfo_Valuetr_item,'D_POSITION')
                    if 
    position >= CurPos then -- sel it больше или равен от курсора
                        reaper
    .SelectAllMediaItems0)
                        
    reaper.SetMediaItemSelectedtr_item)
                        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 
    trackselect track ]],1)
        
    end  


    PHP:

        
    -----------------------------------------------------------------------------
        
    local function No_Undo()endlocal function no_undo()reaper.defer(No_Undo)end
        
    -----------------------------------------------------------------------------



        
    local function GetFirstSelItemInFirstSelTrackOrJustFirstSelItem()
            
    local Sel_itemIt_trackselGetx
            
    for 1reaper.CountSelectedMediaItems)  do
                
    Sel_item reaper.GetSelectedMediaItem(0i-1)
                
    It_track reaper.GetMediaItem_TrackSel_item )
                
    sel reaper.GetMediaTrackInfo_ValueIt_track,'I_SELECTED')
                if 
    sel == 1 then
                     Get 
    reaper.GetSelectedMediaItem(0i-1);1;break
                
    end
            end
            
    if not x then Get=reaper.GetSelectedMediaItem(0,0)end
            
    return Get
        end
        
    ---


        
    local SelectAllMediaItems = function(selected)
            for 
    reaper.CountMediaItems)-1,0,-do
                
    reaper.SetMediaItemSelected(reaper.GetMediaItem(0,i),selected)
            
    end
        end
        
    ---


        
    local Sel_fir_it GetFirstSelItemInFirstSelTrackOrJustFirstSelItem()
        
    local sel_track reaper.GetSelectedTrack0)
        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)
        if 
    Sel_fir_it then
            local position 
    reaper.GetMediaItemInfo_ValueSel_fir_it,'D_POSITION')
            if 
    position CurPos then no_undo() return end
            local It_track 
    reaper.GetMediaItem_TrackSel_fir_it )
            
    local num_It_track = (reaper.GetMediaTrackInfo_Value(It_track,'IP_TRACKNUMBER')-1)
            for 
    num_It_track+1count_track-do
                
    local track reaper.GetTrack0)
                
    local Count_tr_item reaper.CountTrackMediaItemstrack )
                if 
    Count_tr_item 0 then
                    local tr_item 
    reaper.GetTrackMediaItemtrackCount_tr_item-)
                    
    local position reaper.GetMediaItemInfo_Valuetr_item,'D_POSITION')
                    if 
    position <= CurPos then no_undo() return end  ---
                    for 
    i2 1,Count_tr_item do
                        
    local tr_item reaper.GetTrackMediaItemtracki2-)
                        
    local position reaper.GetMediaItemInfo_Valuetr_item,'D_POSITION')
                        if 
    position CurPos then -- sel it больше или равен от курсора
                            SelectAllMediaItems
    )
                            
    reaper.SetOnlyTrackSelectedtrack )
                            
    reaper.SetMediaItemSelectedtr_item)
                            
    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 
    num_track+1count_track-do
                    
    local track reaper.GetTrack0)
                    
    local Count_tr_item reaper.CountTrackMediaItemstrack )
                    if 
    Count_tr_item 0 then
                        local tr_item 
    reaper.GetTrackMediaItemtrackCount_tr_item-)
                        
    local position reaper.GetMediaItemInfo_Valuetr_item,'D_POSITION')
                        if 
    position <= CurPos then no_undo() return end ---
                        for 
    i2 1,Count_tr_item do
                            
    local tr_item reaper.GetTrackMediaItemtracki2-)
                            
    local position reaper.GetMediaItemInfo_Valuetr_item,'D_POSITION')
                            if 
    position CurPos then -- sel it больше или равен от курсора
                                SelectAllMediaItems
    )
                                
    reaper.SetOnlyTrackSelectedtrack )
                                
    reaper.SetMediaItemSelectedtr_item)
                                
    not_undo 1
                                
    break
                            
    end
                        end
                    
    break
                    
    end
                end
            end
        end
        
    ---


        
    local sel_track reaper.GetSelectedTrack0)
        if 
    sel_track then
            local Count_tr_item 
    reaper.CountTrackMediaItemssel_track )
            if 
    Count_tr_item 0 then
                
    for 1,Count_tr_item do
                    
    local tr_item reaper.GetTrackMediaItemsel_tracki-)
                    
    local position reaper.GetMediaItemInfo_Valuetr_item,'D_POSITION')
                    if 
    position CurPos then -- sel it больше или равен от курсора
                        reaper
    .SelectAllMediaItems0)
                        
    reaper.SetMediaItemSelectedtr_item)
                        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 
    trackselect track ]],1)
        
    end
    -----------------------------------------------------------------------------------------------
    Вот теперь я вас понимаю :)
    сколько лишней работы в малейшей недосказанности :(
     
    Последнее редактирование: 21 май 2018
  20. CerberPic

    CerberPic Member

    Регистрация:
    17 фев 2017
    Сообщения:
    69
    Симпатии:
    22
    Пол:
    Мужской
    @HDVulcan, пробуйте
    PHP:
    local script "Select first right item in next track"

    function getval(obj)
        
    local function f(objparmlocal num reaper.GetMediaItemInfo_Value(objparm) return num end
        local pos 
    f(obj'D_POSITION') return pospos f(obj'D_LENGTH')
    end
    function gettr(idxlocal tr reaper.GetTrack(0idx) return tr end
    function setsel(objboolreaper.SetMediaItemSelected(objboolend

    reaper
    .Undo_BeginBlock()
    reaper.PreventUIRefresh(-1)

    for 
    0reaper.CountMediaItems(0) - do
        
    local item reaper.GetMediaItem(0i)
        if 
    reaper.IsMediaItemSelected(item) == true then
            local _
    item_end getval(item)
            
    local it_tr reaper.GetMediaItemTrack(item)
            for 
    0reaper.CountTracks(0) - do
                if 
    gettr(t) == it_tr then
                    local nexttr 
    gettr(1)
                    if 
    not nexttr then return end
                    local it_cnt 
    reaper.CountTrackMediaItems(nexttr)
                    if 
    it_cnt ~= 0 then
                        
    for 0it_cnt do
                            
    local nexttr_item reaper.GetTrackMediaItem(nexttri)
                            if 
    getval(nexttr_item) > item_end then
                                local buf 
    reaper.GetExtState(script"buf")
                                if 
    buf and buf == tostring(itemthen return end
                                setsel
    (itemfalsesetsel(nexttr_itemtrue)
                                
    reaper.SetExtState(script"buf"tostring(nexttr_item), false)
                                break
                            
    end
                        end 
    break
                        else 
    it_trnexttr1
                    end
                end
            end
            
    break
        
    end
    end

    reaper
    .UpdateArrange()
    reaper.PreventUIRefresh(1)
    reaper.Undo_EndBlock(script, -1)

    Умеет :)
     
  21. HDVulcan

    HDVulcan Active Member

    Регистрация:
    23 окт 2016
    Сообщения:
    155
    Симпатии:
    31
    Пол:
    Мужской
    @CerberPic, спасибо большое. Проверил работает хорошо. Добавьте пожалуйста в скрипт два исключения:
    -Чтобы после первого запуска скрипта можно было также выбирать выделенный итем от первого запуска скрипта и повторно запускать скрипт дальше.
    Сейчас скрипт на повторную активацию срабатывает если выбрать любые другие итемы в проекте, кроме того что был выделен от первого запуска.
    - И второй момент в качестве исключения добавьте ситуацию если под концом выделенного итема стоит начало другого итема на нижнем треке, то в этой ситуации выделяется именно этот ниже стоящий итем.
     
  22. CerberPic

    CerberPic Member

    Регистрация:
    17 фев 2017
    Сообщения:
    69
    Симпатии:
    22
    Пол:
    Мужской
    Так если он выделен, на него и ориентируется скрипт, продолжать выполнение или остановиться. В таком случае при повторной активации будет продолжаться выполнение скрипта, а это вам изначально было не нужно.
    Так уже было в одном из ранних вариантов. Но вы сказали:
    Выражайтесь точнее.
     
  23. HDVulcan

    HDVulcan Active Member

    Регистрация:
    23 окт 2016
    Сообщения:
    155
    Симпатии:
    31
    Пол:
    Мужской
    CerberPic, вы меня не поняли, я имел виду что после первичного запуска скрипта у нас выделился итем. Нужно чтобы скрипт понимал ситуацию, если я сразу после этого кликаю мышкой на этот же выделенный итем и после этого опять запускаю скрипт. Нужно чтобы скрипт понимал такую ситуацию и позволял и дальше активировать скрипт, даже если мы выбираем уже выделенный итем после предыдущей активации скрипта.
    Сейчас этого нет и скрипт игнорирует такую ситуацию.
    Все верно, вы правы я писал что между точкой отсчета(конец итема) и будущим выделенным итемом всегда есть какое-то расстояние.
    Я поэтому и написал что это уже в дополнение ,как исключение. Может быть запросто такая ситуацию, что конец выделенного итема и начало нижестоящего итема под ним стоят встык встык, вот в этой ситуации будет полезно не пропускать нижестоящий итем а также его выделять. Это как исключение из общего правила.
    Поправьте пожалуйста эти два момента.
     
  24. CerberPic

    CerberPic Member

    Регистрация:
    17 фев 2017
    Сообщения:
    69
    Симпатии:
    22
    Пол:
    Мужской
    @HDVulcan, второй пункт поправлю, в этом ничего сложного. С первым же всё не так просто.

    Как он может это понять? Скрипт же не будет постоянно висеть в фоне и следить за всеми вашими действиями.
    В который раз вас прошу описать конкретную ситуацию, при которой скрипт должен вести себя подобным образом. Иначе я так и не буду понимать ваших задач. Если дальнейшее выделение всё же планируется, почему для этого необходим дополнительный клик по айтему?
    Для понимания. На данный момент принцип работы скрипта такой:
    При первой активации айтем выделяется и запоминается. При следующей активации скрипт проверяет: если выделенный айтем и тот айтем, что был выделен на предыдущем шаге - это один и тот же объект, то работа скрипта прерывается. В противном случае выделяется и запоминается следующий айтем. Пока это единственное, до чего я додумался в целях предотвращения дальнейшего выделения. И другого пути решения пока что не вижу.

    UPD: Могу предложить вариант, при котором при вторичном запуске выделение производиться не будет, а на третий раз работа снова возобновится. То есть, вместо клика по айтему вам нужно будет дважды запустить скрипт.
     
    Последнее редактирование: 15 май 2018
  25. @Michael

    @Michael Well-Known Member

    Регистрация:
    14 дек 2010
    Сообщения:
    840
    Симпатии:
    1.266
    Пол:
    Мужской
    Адрес:
    Орёл / Москва
    Интересно, сколько ещё страниц взаимоисключающей писанины тут будет, пока станет известно, что и без скрипта этого можно обойтись.
     
  26. CerberPic

    CerberPic Member

    Регистрация:
    17 фев 2017
    Сообщения:
    69
    Симпатии:
    22
    Пол:
    Мужской
    @Archchie, да как бы уже не перемудрить с этим скриптом.
     
  27. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    16.914
    Симпатии:
    9.168
    Пол:
    Мужской
    Адрес:
    Киев
    @@Michael, как тримить айтем (левый, правый его край)?
    Что то по простому только через экшины нашёл. Может есть и в API?
     
  28. Archchie

    Archchie Active Member

    Регистрация:
    24 окт 2017
    Сообщения:
    352
    Симпатии:
    175
    Пол:
    Мужской
  29. Archchie

    Archchie Active Member

    Регистрация:
    24 окт 2017
    Сообщения:
    352
    Симпатии:
    175
    Пол:
    Мужской
    @Erundolog, Посмотри ещё это

    Взять элемент под курсором мыши,выбрать,засолировать,начать воспроизведение(восстановить состояние без звука)
    PHP:
    --[[
       * 
    ВАЖНО:
       * 
    ПРИ ПОВТОРНОМ  ЗАПУСКЕ СКРИПТА ПОЯВИТСЯ ОКНО (Reascript task control):
       * 
    ДЛЯ КОРЕКТНОЙ РАБОТЫ СКРИПТА СТАВИМ ГАЛКУ
       
    * (Remember my answer for this scriptНАЖИМАЕМ New instance
       
    -------------------
       * 
    Category:    item
       
    Descriptiontake item under mouse cursor,select,solo take,start play
                                                                  
    restore mute state )
       * 
    Oписание:    взять элемент под курсором мыши,выбрать,засолировать,
                                 
    начать воспроизведение(восстановить состояние без звука)
       * 
    Author:      Archie
       
    Version:     1.0
    --==================================================================================]]


        --
    local function msg(param);reaper.ShowConsoleMsg(param.."\n")end
        
    -----------------------------------------------------------------------------
        
    local function No_Undo()endlocal function no_undo()reaper.defer(No_Undo)end
        
    -----------------------------------------------------------------------------



        
    local function SaveMuteStateAll_Item()

            
    local guitem,mute,item '',''
            
    --reaper.DeleteExtState'Archie_guit_cur_it䴎''Archie_guit_cur_it䴎'false )
            --
    reaper.DeleteExtState'Archie_mute_cur_it䵵''Archie_mute_cur_it䵵'false )
            for 
    1,  reaper.CountMediaItems) do
                
    item reaper.GetMediaItem(01)
                
    guitem guitem..reaper.BR_GetMediaItemGUIDitem )
                
    mute mute..'&'..reaper.GetMediaItemInfo_Valueitem'B_MUTE')
            
    end
            reaper
    .SetExtState'Archie_guit_cur_it䴎''Archie_guit_cur_it䴎'guitemfalse )
            
    reaper.SetExtState'Archie_mute_cur_it䵵''Archie_mute_cur_it䵵'mutefalse )
        
    end
        
    ---

        
    local function RestoreMuteStateAll_Item()
           ----
            
    local resguitem reaper.GetExtState('Archie_guit_cur_it䴎''Archie_guit_cur_it䴎')
            
    local restomute reaper.GetExtState('Archie_mute_cur_it䵵''Archie_mute_cur_it䵵')

            
    local x00

            
    for guid_i in string.gmatch(resguitem'{..-}' ) do
                
    local it reaper.BR_GetMediaItemByGUID0guid_i )
                if 
    it then
                
    -------
                    for 
    mute_i in string.gmatch(restomute"[^&]+") do
                        if 
    == y then
                            reaper
    .SetMediaItemInfo_Valueit'B_MUTE'mute_i)
                          break
                        
    end
                        y 
    1
                    end
                    y 
    0
                    x 
    1
                
    -------------
                
    end
            end
            reaper
    .DeleteExtState'Archie_guit_cur_it䴎''Archie_guit_cur_it䴎'false )
            
    reaper.DeleteExtState'Archie_mute_cur_it䵵''Archie_mute_cur_it䵵'false )
        
    end



        local count_item 
    reaper.CountMediaItems)
        if 
    count_item == 0 then
            no_undo
    ()
           return
        
    end



        local window
    segmentdetails reaper.BR_GetMouseCursorContext()
        
    local item reaper.BR_GetMouseCursorContext_Item()
        if 
    not item then no_undo() return end


        local it_track 
    reaper.GetMediaItem_Trackitem )
        
    local mute_tr reaper.GetMediaTrackInfo_Valueit_track'B_MUTE')
        if 
    mute_tr == 1 then no_undo() return end


        reaper
    .PreventUIRefresh(1)
        
    reaper.Undo_BeginBlock()

        
    local position reaper.GetMediaItemInfo_Valueitem'D_POSITION' )

        
    reaper.SelectAllMediaItems0)
        
    reaper.SetMediaItemSelecteditem)

        
    local take reaper.BR_GetMouseCursorContext_Take()
        
    reaper.SetActiveTaketake )

        
    reaper.SetEditCurPosposition0)


        
    RestoreMuteStateAll_Item()
        
    SaveMuteStateAll_Item()

        for 
    1,count_item  do

            
    local items reaper.GetMediaItem(01)
            
    local sel reaper.GetMediaItemInfo_Value(items'B_UISEL')
            if 
    sel == 0 then
                reaper
    .SetMediaItemInfo_Value(items'B_MUTE'1)
            else
                
    reaper.SetMediaItemInfo_Value(items'B_MUTE'0)
            
    end
        end

         reaper
    .OnPlayButton()
         
    reaper.UpdateArrange()


         
    reaper.Undo_EndBlock([[take item under mouse cursor,select,solo
                                  take
    ,start play(restore mute state )]],1)
         
    reaper.PreventUIRefresh(-1)


         function 
    main()

            
    local cur reaper.GetPlayState()
            
    local Selitem reaper.GetSelectedMediaItem(00)
            if 
    cur == or cur == or not Selitem then
                def 
    1
                reaper
    .OnStopButton()
                
    RestoreMuteStateAll_Item()
                
    reaper.UpdateArrange()
            
    end
            
    --if not tonumber(t)then t=else t=tonumber(t)end t=t+1 msg(t)
            if 
    not def then reaper.defer(main) else reaper.atexit(mainend
         end

         main
    ()






    Взять элемент под курсором мыши,выбрать,засолировать,начать воспроизведение,смотреть элементы в фоновом режиме(восстановить состояние без звука)
    обратить внимание на 15 строку
    PHP:
    --[[
       * 
    ВАЖНО:
       * 
    ПРИ ПОВТОРНОМ  ЗАПУСКЕ СКРИПТА ПОЯВИТСЯ ОКНО (Reascript task control):
       * 
    ДЛЯ КОРЕКТНОЙ РАБОТЫ СКРИПТА СТАВИМ ГАЛКУ
       
    * (Remember my answer for this scriptНАЖИМАЕМ New instance
       
    -------------------
       * 
    Category:    item
       
    Descriptiontake item under mouse cursor,select,solo take,start play,
                                      
    watch items in background(restore mute state )
       * 
    Oписание:    взять элемент под курсором мыши,выбрать,засолировать,начать
                                         воспроизведение
    ,смотреть элементы в фоновом
                                             режиме
    (восстановить состояние без звука)
       * 
    Author:      Archie
       
    Version:     1.0
    --================================================================================]]



        
    local ClickCursorItem --[[ Если 0 то не надо кликать по элементу,
                                      
    Если 1 то надо кликать по элементу ]]


        --
    local function msg(param);reaper.ShowConsoleMsg(param.."\n")end
        
    -----------------------------------------------------------------------------
        
    local function No_Undo()endlocal function no_undo()reaper.defer(No_Undo)end
        
    -----------------------------------------------------------------------------


        
    local function SaveMuteStateAll_Item()

            
    local guitem,mute,item '',''
            
    --reaper.DeleteExtState'Archie_guit_cur_it䴎''Archie_guit_cur_it䴎'false )
            --
    reaper.DeleteExtState'Archie_mute_cur_it䵵''Archie_mute_cur_it䵵'false )
            for 
    1,  reaper.CountMediaItems) do
                
    item reaper.GetMediaItem(01)
                
    guitem guitem..reaper.BR_GetMediaItemGUIDitem )
                
    mute mute..'&'..reaper.GetMediaItemInfo_Valueitem'B_MUTE')
            
    end
            reaper
    .SetExtState'Archie_guit_cur_it䴎''Archie_guit_cur_it䴎'guitemfalse )
            
    reaper.SetExtState'Archie_mute_cur_it䵵''Archie_mute_cur_it䵵'mutefalse )
        
    end
        
    ---

        
    local function RestoreMuteStateAll_Item()
           ----
            
    local resguitem reaper.GetExtState('Archie_guit_cur_it䴎''Archie_guit_cur_it䴎')
            
    local restomute reaper.GetExtState('Archie_mute_cur_it䵵''Archie_mute_cur_it䵵')

            
    local x00

            
    for guid_i in string.gmatch(resguitem'{..-}' ) do
                
    local it reaper.BR_GetMediaItemByGUID0guid_i )
                if 
    it then
                
    -------
                    for 
    mute_i in string.gmatch(restomute"[^&]+") do
                        if 
    == y then
                            reaper
    .SetMediaItemInfo_Valueit'B_MUTE'mute_i)
                          break
                        
    end
                        y 
    1
                    end
                    y 
    0
                    x 
    1
                
    -------------
                
    end
            end
            reaper
    .DeleteExtState'Archie_guit_cur_it䴎''Archie_guit_cur_it䴎'false )
            
    reaper.DeleteExtState'Archie_mute_cur_it䵵''Archie_mute_cur_it䵵'false )
        
    end



        local count_item 
    reaper.CountMediaItems)
        if 
    count_item == 0 then
            no_undo
    ()
           return
        
    end


        local 
    function PlaySoloActiveTake()

            
    local windowsegmentdetails reaper.BR_GetMouseCursorContext()
            
    local item reaper.BR_GetMouseCursorContext_Item()
            if 
    not item then no_undo() return end


            local it_track 
    reaper.GetMediaItem_Trackitem )
            
    local mute_tr reaper.GetMediaTrackInfo_Valueit_track'B_MUTE')
            if 
    mute_tr == 1 then no_undo() return end


            reaper
    .PreventUIRefresh(1)
            
    reaper.Undo_BeginBlock()

            
    local position reaper.GetMediaItemInfo_Valueitem'D_POSITION' )

            
    reaper.SelectAllMediaItems0)
            
    reaper.SetMediaItemSelecteditem)

            
    local take reaper.BR_GetMouseCursorContext_Take()
            
    reaper.SetActiveTaketake )

            
    reaper.SetEditCurPosposition0)


            
    RestoreMuteStateAll_Item()
            
    SaveMuteStateAll_Item()


            
    local count_item reaper.CountMediaItems)
            for 
    1,count_item  do

                
    local items reaper.GetMediaItem(01)
                
    local sel reaper.GetMediaItemInfo_Value(items'B_UISEL')
                if 
    sel == 0 then
                    reaper
    .SetMediaItemInfo_Value(items'B_MUTE'1)
                else
                    
    reaper.SetMediaItemInfo_Value(items'B_MUTE'0)
                
    end
            end

             reaper
    .OnPlayButton()
             
    reaper.UpdateArrange()


             
    reaper.Undo_EndBlock([=[take item under mouse cursor,select,
                                    
    solo take,start play,watch items in
                                     background 
    (restore mute state )]=],1)    
             
    reaper.PreventUIRefresh(-1)
        
    end

        PlaySoloActiveTake
    ()


        
    local function main()

            if 
    ClickCursorItem == 0 then
                local window
    segmentdetails reaper.BR_GetMouseCursorContext()
            
    end
            local Selitem 
    reaper.GetSelectedMediaItem(00)
            if 
    Selitem then
                local guitem 
    reaper.BR_GetMediaItemGUIDSelitem )
                
    local ItemMouseCur reaper.BR_GetMouseCursorContext_Item()
                if 
    ItemMouseCur  then
                   local  GuItemCur 
    reaper.BR_GetMediaItemGUIDItemMouseCur )
                   if 
    guitem ~= GuItemCur then
                       PlaySoloActiveTake
    ()
                   else
                       if 
    ClickCursorItem == 0 then
                           local take 
    reaper.BR_GetMouseCursorContext_Take()
                           
    reaper.SetActiveTaketake )
                           
    reaper.UpdateArrange()
                       
    end
                   end
                end
            end
            
    --local def
            local PlayState 
    reaper.GetPlayState()
            if 
    PlayState == or PlayState == or not Selitem then
                def 
    1
                reaper
    .OnStopButton()
                
    RestoreMuteStateAll_Item()
                
    reaper.UpdateArrange()
            
    end
            
    --if not tonumber(t)then t=else t=tonumber(t)end t=t+1 msg(t)
            if 
    not def then reaper.defer(main)else reaper.atexit(main)end
         end

         main
    ()

     
    Последнее редактирование: 19 май 2018
    Erundolog нравится это.
  30. Erundolog

    Erundolog Member

    Регистрация:
    4 ноя 2016
    Сообщения:
    152
    Симпатии:
    14
    Пол:
    Мужской
    Адрес:
    Армавир
    @Archchie, Спасибо, кину в копилку. А можно попросить вторую версию скрипта которым до этого меня так выручил, с возможностью воспроизведения не с начала тейка а с положения курсора мыши ?
    Я их буду оба использовать но в разных ситуациях
     
  31. Archchie

    Archchie Active Member

    Регистрация:
    24 окт 2017
    Сообщения:
    352
    Симпатии:
    175
    Пол:
    Мужской
    @Erundolog,
    Так ?

    PHP:
       -----------------------------------------------------------------------------
        
    local function No_Undo()endlocal function no_undo()reaper.defer(No_Undo)end
        
    -----------------------------------------------------------------------------
      
      
      
        
    local windowsegmentdetails reaper.BR_GetMouseCursorContext()
      
        
    local item reaper.BR_GetMouseCursorContext_Item()
        if 
    not item then no_undo() return end

      
        reaper
    .Undo_BeginBlock()
        
        
    reaper.SelectAllMediaItems0)
      
        
    reaper.SetMediaItemSelecteditem)
      
        
    local take reaper.BR_GetMouseCursorContext_Take()
      
        
    reaper.SetActiveTaketake )
      
        
    local windowsegmentdetails reaper.BR_GetMouseCursorContext()
        
    positioncur reaper.BR_GetMouseCursorContext_Position()
      
        
    reaper.SetEditCurPospositioncur0)
      
        
    reaper.OnPlayButton()
      
        
    reaper.UpdateArrange()
      
        
    reaper.Undo_EndBlock("take item under cursor mouse, select play from mouse cursor",1)
     
    Последнее редактирование: 19 май 2018
    Erundolog нравится это.
  32. Erundolog

    Erundolog Member

    Регистрация:
    4 ноя 2016
    Сообщения:
    152
    Симпатии:
    14
    Пол:
    Мужской
    Адрес:
    Армавир
    Да, оно. Все работает. СуперМега Спасибо
     
  33. Oliver_Cray

    Oliver_Cray Well-Known Member

    Регистрация:
    29 окт 2014
    Сообщения:
    3.148
    Симпатии:
    2.613
    Пол:
    Мужской
    Адрес:
    Майкоп
    Как можно выбрать трек по имени (части имени)?
     
  34. borisuperful

    borisuperful Well-Known Member

    Регистрация:
    31 янв 2013
    Сообщения:
    1.044
    Симпатии:
    330
    @Oliver_Cray, Script: me2beats_Select all tracks with name X (without input box).lua
    Изначально там имя Buss вписано, в скрипте меняешь на свое, там где локал нейм вначале
     
    Oliver_Cray нравится это.
  35. Supa75

    Supa75 Active Member

    Регистрация:
    21 мар 2017
    Сообщения:
    445
    Симпатии:
    101
    Пол:
    Мужской
    Адрес:
    Днепр, Украина
    данный скрипт не позволит выбрать треки по ЧАСТИ имени, а только по полному. К тому же не всегда удобно постоянно менять скрипт (сегодня нужно выделить все DRUM, завтра - все GUIT и т.д.), - чем менять постоянно скрипт, будет быстрее выбрать через Track Manager.

    Было бы здорово заиметь скрипт по методу:
    нажал на хоткей, всплыло окно, набрал туда к примеру GUIT, нажал ENTER, и все треки, где в названии есть данный набор символов, - выделились
     
  36. Oliver_Cray

    Oliver_Cray Well-Known Member

    Регистрация:
    29 окт 2014
    Сообщения:
    3.148
    Симпатии:
    2.613
    Пол:
    Мужской
    Адрес:
    Майкоп
    @Supa75, лично мне удобнее без вопроса. Мне нужно выбирать одни и те же папки, месторасположение которых меняется.
     
  37. Archchie

    Archchie Active Member

    Регистрация:
    24 окт 2017
    Сообщения:
    352
    Симпатии:
    175
    Пол:
    Мужской
    Проверяйте.

    PHP:
    --[[
       * 
    Category:    Track
       
    DescriptionSelect a track by name (with an input field or keywordinstruction inside script)
       * 
    Oписание:    Выберите трек по имени (с полем ввода или ключевым словоминструкция внутри скрипта)
       * 
    Author:      Archie
       
    Version:     1.0
    --===================================================================================================]]


        
    local Message_box_to_input_the_name = [[1]] 
                                       --  = [[
    1]] " Show message box to enter name.Otherwise, enter 
                                       --  keywords separated by commas without spaces.
                                       --  "
    Example: = [[drums,track,folder]] 
                                           ------------------------------------
                                       --  = [[
    1]] "Показать окно сообщения для ввода имени.В противном 
                                       --  случае, введите ключевые слова, разделенные запятыми без пробелов.
                                       --  "
    Пример: = [[барабаны,трек,папка]]
                                                                   

        
    local Message_Unselect = (1)   --  Message_Unselect; = 1 show window with warning and choice, = 0 don't show a
                                       --  warning window and does not remove the selection, = -1 do not show
                                       --  the warning window,and unselect the previous tracks
                                       --   ---------------------------------------------------
                                       --  Отменить_Выбор_Сообщения; = 1 показать окно с предупреждением и выбором, 
                                       --  = 0 не показывать окно с предупреждением и не снимать выделение,  = -1
                                       --  не показывать окно с предупреждением и  снять выделение
                                       --  с предыдущих треков'
                     


        
    -----------------------------------------------------------------------------
        
    local function No_Undo()endlocal function no_undo()reaper.defer(No_Undo)end
        
    -----------------------------------------------------------------------------


        
    local CountSelTr reaper.CountSelectedTracks()
        if 
    CountSelTr == 0 then Message_Unselect 0 end
       
       
        local CountTr 
    reaper.CountTracks()
       
        
    local Message,Undo,retval,ret_csv
       
        
    if Message_box_to_input_the_name == '1' then
            retval
    ret_csv reaper.GetUserInputs'Select track by name'1'Enter the name of the track''name')
            if 
    retval == false then no_undo() return end
        
    else
            
    ret_csv Message_box_to_input_the_name 
        end
       
       
        reaper
    .PreventUIRefresh(1)


        for 
    1,CountTr do
            
    local track reaper.GetTrack(0,i-1)
            
    retvalreaper.GetTrackStatetrack )
            for 
    symbol in string.gmatch(retval"[^%s]+") do
                for 
    ret in string.gmatch(ret_csv"[^,]+") do
                    if 
    symbol == ret then
                        Undo 
    1
                        
    if Message_Unselect == 1 then
                            Message 
    reaper.ShowMessageBox'Unselected All track ?','Select track by name')
                            
    Message_Unselect 0
                         
    elseif Message_Unselect == 0 then
                            Message 
    0
                         
    elseif Message_Unselect == -1 then
                            Message 
    1
                         end
                         
    if Message == 1 then
                            local tr 
    reaper.GetTrack(00)
                            
    reaper.SetOnlyTrackSelected(tr)
                            
    reaper.SetTrackSelected(tr0)
                         
    end 
                         reaper
    .SetTrackSelected(track,1)
                    
    end   
                end         
            end
        end
        reaper
    .PreventUIRefresh(-1


        if 
    Undo ~= 1 then
           no_undo
    ()
        else
           
    reaper.Undo_BeginBlock()
           
    reaper.Undo_EndBlock("Select track by name",1)
        
    end


     
    Последнее редактирование: 1 июн 2018
  38. Supa75

    Supa75 Active Member

    Регистрация:
    21 мар 2017
    Сообщения:
    445
    Симпатии:
    101
    Пол:
    Мужской
    Адрес:
    Днепр, Украина
    не работает у меня чего-то
    qwe.gif
     
  39. Archchie

    Archchie Active Member

    Регистрация:
    24 окт 2017
    Сообщения:
    352
    Симпатии:
    175
    Пол:
    Мужской
    Так он по слогам не умеет работать ,введите одно любое слово от имени трека целиком и будет все работать.
    Например: Имя трека "Трек 1" , введите либо Трек, либо 1
     
    Последнее редактирование: 1 июн 2018
  40. vitalker

    vitalker Well-Known Member

    Регистрация:
    8 окт 2013
    Сообщения:
    3.061
    Симпатии:
    1.183
    Адрес:
    Гродно
    1. Использовать Track manager, вписывая в фильтр всё что угодно. Дополнительные квантификаторы:
    vo NOT ka оставит треки с vo, но без ka
    ka AND o оставит треки с ka и c o
    vo OR ro оставит треки с vo или с ro
    Далее достаточно кликнуть на нужный трек в нём и он выделится в TCP/MCP
    2. Использовать ReaConsole. Можно запускать сразу с нужным параметром: SWS: Open console with 'S' to select track(s)
    Этот метод не такой мощный, потому что не работают квантификаторы, зато можно выделять трек под нужным номером, вписывая s 1 для выделения первого трека. Ну и в консоли надо писать первые буквы трека, иначе не работает, в отличие от Track manager.
    @borisuperful, @Supa75, @Archchie,
    P.S. Совет на будущее: прежде чем работать со скриптами, надо разобраться со встроенным функционалом. :)
     
    Aleksandr Oleynik нравится это.
  41. Archchie

    Archchie Active Member

    Регистрация:
    24 окт 2017
    Сообщения:
    352
    Симпатии:
    175
    Пол:
    Мужской
    @Supa75, Лови проверяй,сейчас поправил , теперь выделяет треки по части имени - вплоть до одной буквы. Вводишь первую букву имени трека и скрипт поймет или несколько названий через запятую или пробел(можно так же сокращенно)
    111.gif 222.gif
    Обновленно. / 4.06.
    Исправлена проблема с кирилецей. Если у трека было имя на русском языке то вылетала ошибка
    PHP:


    --[[
       * 
    Category:    Track
       
    DescriptionSelect a track by name (with the"abbreviated input" input
                                                               field 
    or keywordinstruction inside the script)
       * 
    Oписание:    Выберите трек по имени (с полем ввода"сокращенный ввод" или
                                                                ключевым словом
    инструкция внутри скрипта)
       * 
    Author:      Archie
       
    Version:     1.0
    --===================================================================================================]]

         -- 
    Enter keywords or a part of a word in the search fieldseparated by commas or spaces
         
    -- Введите ключевые слова или часть слова в поле поискаразделенные запятыми или пробелами



        local Message_box_to_input_the_name 
    = [[1]]
                                               --  = [[
    1]] " Show message box to enter name.Otherwise, enter
                                              --  keywords separated by commas.
                                             --  "
    Example: = [[drums,trackfolder]]
                                            -----------------------------------------------
                                           --  = [[
    1]] "Показать окно сообщения для ввода имени.В противном
                                          --  случае, введите ключевые слова, разделенные запятыми
                                         --  "
    Пример: = [[барабаны,трекпапка]]


        
    local Message_Unselect = (2)  --  Message_Unselect;
                                     --  = 
    2 show window with warning and choice,
                                    --  = 
    0 don't show a warning window and does not remove the selection,
                                   --   = 1 do not show the warning window,and unselect the previous tracks
                                  -----------------------------------------------
                                 --  ОкноСообщенияОбОтменеВыбораПредыдущих;
                                --  = 2 показать окно с предупреждением и выбором,
                               --  = 0 не показывать окно с предупреждением и не снимать выделение,
                              --  = 1 не показывать окно с предупреждением и снять выделение
                             --  с предыдущих треков'
                            
    -------------------------------------------


        -----------------------------------------------------------------------------
        
    local function No_Undo()endlocal function no_undo()reaper.defer(No_Undo)end
        
    -----------------------------------------------------------------------------



        
    local CountSelTr reaper.CountSelectedTracks()
        if 
    CountSelTr == 0 then Message_Unselect 0 end


        local CountTr 
    reaper.CountTracks()

        
    local MessageUndoretvalret_csv

        
    if Message_box_to_input_the_name == '1' then
            retval
    ret_csv reaper.GetUserInputs'Select track by name'1'Enter the name of the track ''name')
            if 
    retval == false then
               no_undo
    ()
               return
            
    end
        
    else
            
    ret_csv Message_box_to_input_the_name
        end

        local CountString 
    string.len(ret_csv)
        if 
    CountString == 0 then
            no_undo
    () return
        
    end
        local CountString 
    nil


        reaper
    .PreventUIRefresh(1)


        for 
    1CountTr do
            
    local track reaper.GetTrack(01)
            
    local retvalreaper.GetTrackStatetrack )
       
            for var 
    in string.gmatch(ret_csv"[^%s^,]+") do
                               -- 
    http://marker.to/YWIbtQ
                
    local CountString string.len(var)
                                  -- 
    http://marker.to/OB9uXO
                
    for symbol in string.gmatch(retval"[^%s^,^-]+") do
             
                    
    local YB0''symbol
                    
    for var in string.gmatch(S,".") do
                        
    B..var
                        
    1
                        
    if == CountString then break end
                    end

                    
    if == var then
                        Undo 
    1
                        
    if Message_Unselect == 2 then
                            Message 
    reaper.ShowMessageBox'Unselected All track ?''Select track by name')
                        elseif 
    Message_Unselect == 1 then
                            Message 
    1
                        
    elseif Message_Unselect == 0 then
                            Message 
    2
                        end
                        Message_Unselect 
    0
                        
    if Message == 1 then
                            local tr 
    reaper.GetTrack(00)
                            
    reaper.SetOnlyTrackSelected(tr)
                            
    reaper.SetTrackSelected(tr0)
                        
    end
                        reaper
    .SetTrackSelected(track1)
                    
    end
                end
            end
        end

        reaper
    .PreventUIRefresh(1*0)

        if 
    Undo ~= 1 then
            no_undo
    ()
        else
            
    reaper.Undo_BeginBlock()
            
    reaper.Undo_EndBlock("Select track by name"1)
        
    end





     
    Последнее редактирование: 4 июн 2018
  42. Archchie

    Archchie Active Member

    Регистрация:
    24 окт 2017
    Сообщения:
    352
    Симпатии:
    175
    Пол:
    Мужской
    Вот-Вот это точно!!!
    Только теперь покажите мне как при помощи Track manager-a и одного нажатия выделить все треки в проекте с определенными именами ???
     
    Последнее редактирование: 2 июн 2018
  43. vitalker

    vitalker Well-Known Member

    Регистрация:
    8 окт 2013
    Сообщения:
    3.061
    Симпатии:
    1.183
    Адрес:
    Гродно
    @Archchie, я дал 2 способа - через консоль это делается.
     
  44. borisuperful

    borisuperful Well-Known Member

    Регистрация:
    31 янв 2013
    Сообщения:
    1.044
    Симпатии:
    330
    Довольно специфичная идея для создания скрипта, но при подборе динамики для нот может очень зайти. Фишка в стретчинге велосити в геометрической прогресии, не изменяя сами ноты. Методом кастомов смог сделать стретчинг "в одну сторону", а в другую уже сложно. На гифки перый стретч - это кастом, второй стретч - обыкновенный undo history.
    2018-06-02_02-46-03.gif
    Кастом такой:
    Код:
    SWS/BR: Save note selection from active item, slot 01
    Script: mpl_Stretch selected MIDI notes positions by x0.5.lua
    Script: me2beats_Select only odd notes.lua
    Script: mpl_Copy selected notes velocities.lua
    SWS/BR: Restore note selection to active item, slot 01
    Script: mpl_Stretch selected MIDI notes positions by x2.lua
    Script: mpl_Paste selected notes velocities.lua
     
  45. Archchie

    Archchie Active Member

    Регистрация:
    24 окт 2017
    Сообщения:
    352
    Симпатии:
    175
    Пол:
    Мужской
    Через СВСовскую консоль не разу не чего не делал,сейчас попробовал-так то ничего ,если бы не одно но.
    С сокращенными именами она не работает "то есть работает ,но не понятно как, из множества вариаций имен у меня сработала только с одним именем (один раз)"(см.gif 1).
    И если имя состоит из цифр - например: 11 или 22 ,12 и т.д. ( у меня частенько например такое бывает на начальном этапе), то все приплыли, консоль не работает (см.gif 2)., то есть выбирает не по имени ,а по номеру,(а должна по идеи сначала просчитать все имена и если таковы не найдены ,то перейти к нумерации треков )
    333.gif 3033.gif
     
    Последнее редактирование: 2 июн 2018
  46. vitalker

    vitalker Well-Known Member

    Регистрация:
    8 окт 2013
    Сообщения:
    3.061
    Симпатии:
    1.183
    Адрес:
    Гродно
    Я сначала тоже не понял, но потом разобрался - либо пишете номер трека, либо первые буквы, которые индивидуальны для одного трека.
    То есть если у вас есть 4 трека: Admin, Administrator, Admiral, Admak, то первый выделить можно только по номеру или полному имени(как и все остальные), второй по admini, третий по admir, а четвёртый по adma. Если треки называются одинаково, то только по полному имени.
    Кстати, консоль можно использовать в cycle/custom экшнах и скриптах.
    О консоли написано тут: http://www.sws-extension.org/reaconsole.php

    Да, к сожалению, такие треки не выделить этим способом.
    Зато можно использовать Track manager. Закрепляете его в докер и можно выделять.
    mix.gif
     
  47. borisuperful

    borisuperful Well-Known Member

    Регистрация:
    31 янв 2013
    Сообщения:
    1.044
    Симпатии:
    330
    Подскажите, есть скрипт Create stretch-markers at transients от Евгения, возможно ли как-то сделать, чтобы он в истории сохранялся? Закрываю скрипт и после первого редактирования маркеров нажимаю ctrl+z - у меня все маркеры стираются. Но только в том случае, если в скрипте начинаешь что-то редактировать. Где-то на этом этапе, когда вносишь изменения в скрипте, я так понимаю нужно вписать UndoBeginBlock и UndoEndBlock, но как именно?
    UPD: Все, получилось, надо было Undo_BeginBlock и Undo_EndBlock вводить:)
     
    Последнее редактирование: 4 июн 2018
  48. borisuperful

    borisuperful Well-Known Member

    Регистрация:
    31 янв 2013
    Сообщения:
    1.044
    Симпатии:
    330
    Create stretch-markers at transients, с историей разобрался, тогда второй вопрос, как сделать, чтобы он понимал несколько выделенных айтемов?
    Код:
    /*
       * ReaScript Name:Create stretch-markers at transients
       * Lua script for Cockos REAPER
       * Author: EUGEN27771
       * Author URI: http://forum.cockos.com/member.php?u=50462
       * Licence: GPL v3
       * Version: 1.01
    */
    
    // -- Script creates stretch-markers at transients
    function slider_New(x,y,w,h, r,g,b,a, lbl, val,min_val,max_val)
    (
      this.x = x; this.y = y; this.w = w; this.h = h; // coord
      this.r = r; this.g = g; this.b = b; this.a = a; // color
      this.lbl = lbl;
      this.min_val = min_val;
      this.max_val = max_val;
      this.val = val;
      this.norm_val = (val - min_val)/(max_val - min_val);; // norm value
    );
    
    //-- Get mouse ---------------
    function pointIN(p_x, p_y)
    ( // if point in obj area
      p_x>=this.x && p_x <= this.x+this.w &&
      p_y>=this.y && p_y <= this.y+this.h;
    );
    
    function mouseIN()
    ( // if mouse in obj area
      mouse_cap&1==0 && this.pointIN(mouse_x, mouse_y);
    );
    
    function mouseDown()
    ( // if mouse will be pressed in obj area
      mouse_cap&1==1 && this.pointIN(mouse_ox,mouse_oy);
    );
    
    function mouseUp()
    ( // if mouse released(anywhere) and will be pressed in obj area
      mouse_cap&1==0 && this.pointIN(mouse_ox,mouse_oy);
    );
    
    //-- Set value ---------------
    function set_value()
    local(norm_val, K )
    (
      K = 10; // K = coeff(when Ctrl pressed)
      Ctrl ? (
        norm_val = this.norm_val + ((mouse_x-last_x)/(this.w*K));
      ) : (
        norm_val = (mouse_x-this.x)/this.w;
      );
     
      this.norm_val = min( max(norm_val,0), 1 ); // verify and set value
      this.val = this.min_val + (this.max_val-this.min_val) * this.norm_val;
    );
    
    //-- Draw slider -------------
    function slider_draw()
      local(x,y,w,h, r,g,b,a, lbl,lbl_w,lbl_h, val,val_w,val_h)
    (
      x=this.x; y=this.y; w=this.w; h=this.h;
      r=this.r; g=this.g; b=this.b; a=this.a;
      lbl=this.lbl;
      this.mouseIN() ? a=a+0.1;
      this.mouseDown() ? (
        a=a+0.2;
        this.set_value();
        //this.onMove();
      );
      this.mouseUp() ? (
        //this.onUp();
        RunMain = 1;
        mouse_ox = mouse_oy = -1; // reset mouse
      );
      //-- draw body, frame ---
      gfx_set(r,g,b,a);
      gfx_rect(x,y,w,h, 0);
      gfx_rect(x,y,w*this.norm_val,h, 1);
      //-- draw label ---------
      gfx_set(0.9,0.8,0.5,1);
      gfx_measurestr(lbl, lbl_w, lbl_h);
      gfx_x = x+5; gfx_y = y+(h-lbl_h)/2;
      gfx_drawstr(lbl);
      //-- draw value ---------
      val = sprintf(#, "%.2f", this.val);
      gfx_measurestr(val, val_w, val_h);
      gfx_x = x+w-val_w-5; gfx_y = y+(h-val_h)/2;
      gfx_drawstr(val); // draw Slider Value
    
    );
    
    //==========================================================================================================//
    
    //-- Create Sliders --------------------------
    //-- args = (x,y,w,h, r,g,b,a, lbl, val,min_val,max_val)
    Thresh.slider_New(10,10,260,18, 0.5,0.5,0.5,0.3, "Threshold dB",   -10, -60,   0 );
    Sens.slider_New(10,30,260,18, 0.5,0.5,0.5,0.3, "Sensetivity dB",  4.5,   0,  18 );
    Retrig.slider_New(10,50,260,18, 0.5,0.5,0.5,0.3, "Retrig ms",  20,  20, 450 );
    
    
    //==========================================================================================================//
    
    //--------------------------------------------------------------------------------
    //---  Simple Detect Transients Function  ----------------------------------------
    //--------------------------------------------------------------------------------
    function DetectTransients(item, srate, Threshold_dB, Sensitivity_dB, Retrig_sec)
      local(Threshold, Sensitivity, Retrig,
            attTime1, relTime1, attTime2, relTime2, ga1, gr1, ga2, gr2, envOut1, envOut2
            take, item_len, item_len_smpls,
            AA, starttime_sec, samplebuffer, n_blocks, input, smpl, mrk_pos, retrig_cnt)
    (   
      //-- Threshold, Sensitivity, Retrig to norm values ---
      Threshold   = 10^(Threshold_dB/20);    //-- Threshold_dB - to norm value
      Sensitivity = 10^(Sensitivity_dB/20);  //-- Sensitivity_dB - to norm value
      Retrig      = floor(Retrig_sec*srate); //-- Retrig_sec - to samples
    
      //-- Envelopes Attack, Release Time -----------------
      attTime1 = 0.001;           //-- Env1(fast) attack(sec)
      relTime1 = 0.010;           //-- Env1(fast) release(sec)
      attTime2 = 0.007;           //-- Env2(slow) attack(sec)
      relTime2 = 0.015;           //-- Env2(slow) release(sec)
    
      //-- Compute sample frequency related coeffs --------
      ga1 = exp(-1/(srate*attTime1));  //-- attack1 coeff
      gr1 = exp(-1/(srate*relTime1));  //-- release1 coeff
      ga2 = exp(-1/(srate*attTime2));  //-- attack2 coeff
      gr2 = exp(-1/(srate*relTime2));  //-- release2 coeff
      //---------------------------------------------------
      envOut1 = 0;
      envOut2 = 0;
        //-- item, take data ------------------------------
        take = GetActiveTake(item);
        playrate  = GetMediaItemTakeInfo_Value(take, "D_PLAYRATE"); // get orig playrate
        SetMediaItemTakeInfo_Value(take, "D_PLAYRATE", 1);          // set playrate = 1
        item_len  = GetMediaItemInfo_Value(item, "D_LENGTH");
        item_len_smpls = floor(item_len*srate);
        //-------------------------------------------------
        AA = CreateTakeAudioAccessor(take);
        starttime_sec = 0;
        samplebuffer = 0;
        n_blocks = ceil(item_len_smpls/65536);
     
        // -- Detect Transients --------------------------------
        loop(n_blocks,
            GetAudioAccessorSamples(AA, srate, 1, starttime_sec, 65536, samplebuffer);
            smpl=0;
            loop(65536,
                input = abs(samplebuffer[smpl]); // abs sample value(abs envelope)
    
                // -- Envelope1(fast) --------------------------
                envOut1 < input ? (
                  envOut1 = input + ga1*(envOut1 - input);
                ) : (
                  envOut1 = input + gr1*(envOut1 - input);
                );
             
                // -- Envelope2(slow) --------------------------
                envOut2 < input ? (
                  envOut2 = input + ga2*(envOut2 - input);
                ) : (
                  envOut2 = input + gr2*(envOut2 - input);
                );
             
                // -- Trigger ----------------------------------
                retrig_cnt > Retrig ? (
                  envOut1 > Threshold && envOut1/envOut2 > Sensitivity ? (
                    mrk_pos = starttime_sec + smpl/srate;    // Calc mrk pos
                    SetTakeStretchMarker(take, -1, mrk_pos); // Insert marker
                    retrig_cnt = 0;
                  );             
                ) : (         
                  envOut2 = envOut1; // уравнивает огибающие, пока триггер неактивен(здесь важно)
                  retrig_cnt+=1;
                );               
                smpl+=1; 
            );
            starttime_sec+=65536/srate; // To next block
        );
      DestroyAudioAccessor(AA);
      SetMediaItemTakeInfo_Value(take, "D_PLAYRATE", playrate); // restore orig playrate         
      UpdateTimeline();       
    );
    
    
    //==========================================================================================================//
    function MAIN()
    local(item, srate, Threshold_dB, Sensitivity_dB, Retrig_sec)
    (
      Undo_BeginBlock();
      item = GetSelectedMediaItem(0, 0);
     
        item ? (
        //-- Detection settings --
        srate = 44100;
        Threshold_dB   = Thresh.val;
        Sensitivity_dB = Sens.val;
        Retrig_sec     = Retrig.val/1000;
        Main_OnCommand(41844, 0);  // remove old str-marks(All)
        //------------------------
        start = time_precise();
        DetectTransients(item, srate, Threshold_dB, Sensitivity_dB, Retrig_sec);
        //ShowConsoleMsg(sprintf(#, "%f \n", time_precise()-start); );
      );
    Undo_EndBlock("Add stretch markers at transients",-1)
    );
    
    //----------------------------
    function Draw_Sliders()
    (
      Thresh.slider_draw();
      Sens.slider_draw();
      Retrig.slider_draw();
    );
    
    //-- mainloop ----------------
    function mainloop()
    (
      //-- mouse and modkeys --
      mouse_cap&1==1 && last_mouse_cap&1==0  ||       //-- L mouse
      mouse_cap&2==2 && last_mouse_cap&2==0  ||       //-- R mouse
      mouse_cap&64==64 && last_mouse_cap&64==0 ? (    //-- M mouse
        mouse_ox = mouse_x; mouse_oy = mouse_y;
      );
    
      Ctrl  = mouse_cap&4==4;   //-- Ctrl  state
      Shift = mouse_cap&8==8;   //-- Shift state
      Alt   = mouse_cap&16==16; //-- Shift state
      //-- Main functions etc --
      Draw_Sliders();
      RunMain ? (MAIN(); RunMain = 0;);
      //------------------------
      last_mouse_cap = mouse_cap;
      last_x = mouse_x; last_y = mouse_y;
      char = gfx_getchar();
      char >= 0 ? defer("mainloop();");
      gfx_update();
    );
    
    //-- init --------------------
    function init()
      local(width, height, dockstate, xpos, ypos)
    ( //-- window -----------
      width = 280; height = 80; dockstate = 0; xpos = 200; ypos = 300;
      gfx_init("Create stretch-markers at transients(eel)",width,height,dockstate,xpos,ypos);
      gfx_clear = 25 + 25*256 + 25*65536;
      //-- Init mouse -------
      last_mouse_cap = 0;
      last_x = last_y = 0;
      mouse_ox = mouse_oy = -1;
      gfx_setfont(1, "Arial", 15);
    );
    
    RunMain = 1;// for first run
    init();
    mainloop();
    
     
    Последнее редактирование: 5 июн 2018
  49. YuriOl

    YuriOl Active Member

    Регистрация:
    6 май 2005
    Сообщения:
    505
    Симпатии:
    102
    Пол:
    Мужской
    Адрес:
    Луганск
    Ребята, подскажите как создать такой экшн - вкл-выкл миди автоматизации сенда. 123.gif
     
    Wefilev нравится это.
  50. Wefilev

    Wefilev Member

    Регистрация:
    22 мар 2015
    Сообщения:
    182
    Симпатии:
    21
    Пол:
    Мужской
    Темка приятная, поделитесь плиз))
     

Поделиться этой страницей