ReaScripts (скрипты для Reaper) - Учимся создавать!!!

Тема в разделе "Reaper", создана пользователем Archchie, 29 дек 2017.

  1. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    15.871
    Симпатии:
    8.368
    Пол:
    Мужской
    Адрес:
    Киев
    Ну так это значит, что место и фанфары - не заняты. :)
     
  2. Alex_V

    Alex_V Active Member

    Регистрация:
    12 апр 2017
    Сообщения:
    337
    Симпатии:
    137
    Пол:
    Мужской
    Зная, как устроены некоторые GUI фреймворки, пожалуй откажусь. У меня нет столько лишнего времени. ;) Понимаете, в том же, например, ctrlr, чтобы получить крутилку с фреймами из png, программирования надо ровно ноль. Но там да, под капотом помимо Lua еще и JUCE.


    Что же касается, отрисовки в рипере готовых фреймов из картинок, то, насколько я понимаю, там особо сложного ничего нет. Вычисляются координаты фрейма внутри png и потом это всё через blit выводится.
     
  3. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    15.871
    Симпатии:
    8.368
    Пол:
    Мужской
    Адрес:
    Киев
    В общих чертах и я понял, а вот чтоб работающий скрипт сделать - так ни фига не выходит.
     
  4. Alex_V

    Alex_V Active Member

    Регистрация:
    12 апр 2017
    Сообщения:
    337
    Симпатии:
    137
    Пол:
    Мужской
    Вроде же как-то так:
    Код:
    gfx.blit(Image, 1, 0, 0, FrameNumber * FrameHeight, FrameWidth, FrameHeight, x, y, FrameWidth, FrameHeight)
    
    Или я чего не понял?
     
  5. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    15.871
    Симпатии:
    8.368
    Пол:
    Мужской
    Адрес:
    Киев
    Да, так, но у меня почему-то выводит полную картинку на все тре фрэйма :(
    Сейчас доделаю простинький скрипт для эксперементов и выложу.

    PS: Таааак, @Alex_V спасибо!
    Начал чистить скрипт: чтоб выложить: и нашлась ошибка :)

    Дооформлю действием мыши (чтоб нажатие мышью переключало изображение) и выложу.
     
    Последнее редактирование: 5 янв 2018
  6. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    15.871
    Симпатии:
    8.368
    Пол:
    Мужской
    Адрес:
    Киев
    Пример скрипта - GUI с подгруженной трёх фрэймовой картинкой -
    GUI TEST 11.gif

    PHP:
    ----------------------------------------------------------------------------------------------------
    local msg = function(Mreaper.ShowConsoleMsg(tostring(M).."\n"end
    ----------------------------------------------------------------------------------------------------
    function 
    get_script_path() -- script_path and name from reaper function
      
    local filename select(2reaper.get_action_context())
      
    local script_pathscript_name filename:match("^(.*)[\\/](.+)")
      return 
    script_pathscript_name
    end
    local script_path
    script_name get_script_path()

    ----------------------------------------
    function 
    SetRGB(RGBa) -- функция задания цвета прям копированием из фотошопа
     gfx
    .= (RGB 0xFF0000) / 16711680 -- 256*256*255
     gfx
    .= (RGB 0x00FF00) / 65280 -- 256*255
     gfx
    .= (RGB 0x0000FF) / 255 -- 255
     gfx
    .or 1
    end

    function InitMouse()
      
    mouse_last_cap 0
      mouse_down_x
    mouse_down_y 00
      mouse_last_x
    mouse_last_y 00
      mouse_captimer 
    0
    end

    function Init()
      
    gfx.init("GUI"1201200600200)
      
    SetRGB(0x0f0f0f0.7) -- 0f0f0f можно копи пастить из фотошопа
      gfx
    .rect(xywh1)  -- зарисовываем прямоугольник под мышкой
      img_fn 
    gfx.loadimg(0script_path .. "/Images/PlayStop_60x60x3.png")
      
    InitMouse()
      
    mainloop () -- основная функция дефера
    end

    function GetMouse()
      -- 
    mouse state -----------------------
      
    mouse_down gfx.mouse_cap&1==and mouse_last_cap&1==0
      mouse_up 
    gfx.mouse_cap&1==and mouse_last_cap&1==1

      
    if mouse_down then mouse_down_xmouse_down_y gfx.mouse_xgfx.mouse_y end
      
    if mouse_up then mouse_up_xmouse_up_y gfx.mouse_xgfx.mouse_y end

      mouse_move 
    = (mouse_last_x ~= gfx.mouse_x) or (mouse_last_y ~= gfx.mouse_y)
    end

    function UpdateMouse()
      -- 
    update mouse last state -----------
      
    mouse_last_cap gfx.mouse_cap
      mouse_last_x 
    gfx.mouse_x
      mouse_last_y 
    gfx.mouse_y
      gfx
    .mouse_wheel 0
      gfx
    .mouse_hwheel 0
    end

    ----------------------------------------------------------------------------------------------------

    function 
    pointIN(pxpyx,y,w,h)
      return 
    px >= and px <= and py >= and py <= h
    end
    ----------------------------------------
    function 
    mouseIN(x,y,w,h)
      return 
    pointIN(gfx.mouse_xgfx.mouse_yx,y,w,h)
    end
    ----------------------------------------
    function 
    mouseDown(x,y,w,h)
      return 
    mouse_down and mouseIN(x,y,w,h)
    end
    ----------------------------------------
    function 
    mouseUp(x,y,w,h)
      return 
    mouse_up and mouseIN(x,y,w,h)
    end
    ----------------------------------------
    function 
    mouseClick(x,y,w,h)
      return 
    mouseUp(x,y,w,h) and pointIN(mouse_down_x,mouse_down_yx,y,w,h)
    end


    ----------------------------------------------------------------------------------------------------

    curfrm 0
    function Draw ()
      
    xyw30306060
      frmw
    frmhnfrms wh3

      
    if mouseClick(x,y,w,hthen
        curfrm 
    curfrm 1
        
    if curfrm == 3 then
          curfrm 
    0
        end
      end
      gfx
    .blit(img_fn100curfrm frmhfrmwfrmhx,y,w,h)
    end



    function mainloop ()
      
    GetMouse()
      
    Draw()
      
    UpdateMouse()

      
    local char gfx.getchar() -- символ с клавиатурыа если =-окно gfx закрыто
      
    if char~=-1 then reaper.defer(mainloopend -- defer(пока окно открыто)
      
    gfx.update() -- обновляет кадр
    end

    ----------------------------------------------------------------------------------------------------

    Init() -- Инициализируем окно
    В скрипте куча функций сделанных Женей.
     

    Вложения:

    Последнее редактирование: 13 янв 2018
  7. elektrozz

    elektrozz Active Member

    Регистрация:
    12 авг 2009
    Сообщения:
    301
    Симпатии:
    105
    Пол:
    Мужской
    Род занятий:
    Sound Prod
    кто нибудь писал скрипты на питоне? какие ограничения у питона перед луа?
     
  8. Alex_V

    Alex_V Active Member

    Регистрация:
    12 апр 2017
    Сообщения:
    337
    Симпатии:
    137
    Пол:
    Мужской
    Как я все это дело вижу с точки зрения новичка в рипере.
    1. Питон требует установки своей среды исполнения, для Lua все встроено в рипер.
    2. На питоне можно написать что-то с более продвинутым GUI. Но, в отличие от Lua не получится интегрировать этот GUI в рипер.

    В остальном все работает через API рипера. Вопросы быстродействия каки-то тоже, наверное, имеют место быть, но это я не знаю. Такие вещи мерять надо.
     
  9. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    15.871
    Симпатии:
    8.368
    Пол:
    Мужской
    Адрес:
    Киев
    Питон ещё медленее чем LUA, на сколько я знаю.
     
  10. EUGEN27771

    EUGEN27771 Well-Known Member

    Регистрация:
    23 апр 2010
    Сообщения:
    2.265
    Симпатии:
    1.913
    Пол:
    Мужской
    @Aleksandr Oleynik, по RGB там ошибочка - недавно говорил
    PHP:
    ----------------------------------------
    function 
    SetRGB(RGBa)
      
    gfx.= (RGB 0xFF0000) / 16711680 -- 256*256*255
      gfx
    .= (RGB 0x00FF00) / 65280 -- 256*255
      gfx
    .= (RGB 0x0000FF) / 255 -- 255
      gfx
    .or 1
    end
    ----
    Это точно. Но мы его все же сделаем. Причем в виде конструктора.
    У меня есть кнопки, чекбоксы, слайдеры, кнобы, спинбоксы и менюшки в готовом виде. Все достаточно продумано.
    Но разбросано там-сям - на eel, lua. Все это нужно разгрести, собрать в кучу основное, допилить, привести в порядок.
     
    a-up нравится это.
  11. Alex_V

    Alex_V Active Member

    Регистрация:
    12 апр 2017
    Сообщения:
    337
    Симпатии:
    137
    Пол:
    Мужской
    Ну, в том или ином виде я это уже где-то в одной библиотеке видел. Но всё, что видел, не имеет под собой реализации parent-child, а без этого нормальный гуй не строится.
     
  12. EUGEN27771

    EUGEN27771 Well-Known Member

    Регистрация:
    23 апр 2010
    Сообщения:
    2.265
    Симпатии:
    1.913
    Пол:
    Мужской
    если я правильно понял - речь об объектах, из которых строится новый элемент?
    ---------
    На мой взгляд - достаточно макс. простого варианта, чтобы любой человек мог по быстрому набросать что-то из простейших элементов и привязать к своим ф-ям. Как пример - редактор для touch osc, допустим. Только из картинок делать.
    Если нужен какой-либо сложный уникальный элемент - его проще будет написать с нуля.
    ---------
    В общем, объясните если можно, этот момент не программисту, на примере. И чем это может быть полезно.
    Кажется, я видел подобное в одной библиотеке для JS, написанной программистом 100%. Это более универсально, но использовать это оказалось очень неудобно. Более того - тот же человек сделал более простой вариант - такой, как я описал выше.
     
    Последнее редактирование: 13 янв 2018
  13. Alex_V

    Alex_V Active Member

    Регистрация:
    12 апр 2017
    Сообщения:
    337
    Симпатии:
    137
    Пол:
    Мужской
    Нет, о реализации концепции, когда у контрола GUI есть родитель. То есть грубо говоря, например есть панелька, на панельке лежат контролы. В этом случае панель является родителем контролов. Из близких к музыкальному софту примеров, где это есть, я могу назвать например Lemur (там есть контейнеры) и Ctrlr, в котором имеются группы и панели с закладками.
     
  14. EUGEN27771

    EUGEN27771 Well-Known Member

    Регистрация:
    23 апр 2010
    Сообщения:
    2.265
    Симпатии:
    1.913
    Пол:
    Мужской
    @Alex_V, ясно, я примерно о том же, просто не знаком с терминологией. И это же не является проблемой, сделать достаточно легко.
    Но чем очевидная польза от этого для простых интерфейсов? То есть стоит ли это делать в ущерб простоте?
     
  15. Alex_V

    Alex_V Active Member

    Регистрация:
    12 апр 2017
    Сообщения:
    337
    Симпатии:
    137
    Пол:
    Мужской
    Сильно упрощает проектирование интерфейса, если он выходит за рамки примитивного.
     
  16. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    15.871
    Симпатии:
    8.368
    Пол:
    Мужской
    Адрес:
    Киев
    На самом деле упрощает только сохранение групп элементов и их вызов при создании.
    В общем то, с жтим заморачиваться стоит только при написании полноценного GUI Editor -а.
    А то, о чём пишет женя - это больше учебное пособие и сокращение рутинного труда.
    --- добавлено 13 янв 2018 ---
    Спасибо!
    Исправил.
     
  17. EUGEN27771

    EUGEN27771 Well-Known Member

    Регистрация:
    23 апр 2010
    Сообщения:
    2.265
    Симпатии:
    1.913
    Пол:
    Мужской
    Да, наверное. Но в основном все укладывается в эти рамки, я за простоту. Почти не встречал плагинов(на них ориентируюсь) с каким-то сложным интерфейсом, а там где есть - лучше бы его там небыло;)
    Кроме того, при сильной необходимости мы сможем сделать и подобие контейнеров сгруппировав элементы в отдельной ф-и, установив зависимости как угодно.
    Без готового примера трудно говорить - а все что я выкладывал это уже сто лет назад было, там все плохо, я иначе сейчас буду делать. На основе того, что уже точно сам успел проверить в плане удобства.
    Ну да, хотя при желании можно будет нарисовать что-то хорошее
     
  18. Alex_V

    Alex_V Active Member

    Регистрация:
    12 апр 2017
    Сообщения:
    337
    Симпатии:
    137
    Пол:
    Мужской
    Как человек нарисовавший этого гуя (в основном - стандартного виндового) чертову прорву, позволю себе не согласиться. ;)
     
  19. Osman

    Osman Потомок янычаров

    Регистрация:
    17 авг 2004
    Сообщения:
    4.271
    Симпатии:
    1.505
    Пол:
    Мужской
    Адрес:
    Перекати поле
  20. Archchie

    Archchie Active Member

    Регистрация:
    24 окт 2017
    Сообщения:
    235
    Симпатии:
    74
    Пол:
    Мужской
    Подскажите пожалуйста!!!Не могу найти функцию - получить только детей
    PHP:
    reaper.GetMediaTrackInfo_Value(track"I_FOLDERDEPTH") ==   0    -- получаем все треки кроме папок и последних в папках
                                                           
    ==   1     -- получаем только папки
                                                           
    ==  -1     -- последний трек в первой папке
                                                           
    ==  -2    -- (не понялне понятно работает)
                                                           <=   
    0    -- получаем все треки кроме папок
    ,а как получить только детей?
    И еще вопрос:
    как получить только детей которые не в свернутом состоянии (свернутые чтобы игнорировались)???
    Спасибо!!!
     
    Последнее редактирование: 19 янв 2018
  21. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    15.871
    Симпатии:
    8.368
    Пол:
    Мужской
    Адрес:
    Киев
    А вот так и получить, через эту функцию.
    Дело то в том, что фолдер трек может быть чайлдом у другого фолдер трека...
     
  22. Archchie

    Archchie Active Member

    Регистрация:
    24 окт 2017
    Сообщения:
    235
    Симпатии:
    74
    Пол:
    Мужской
    каким образом ,можно спросить?
     
  23. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    15.871
    Симпатии:
    8.368
    Пол:
    Мужской
    Адрес:
    Киев
    @Archchie, очень не простыми условиями...
    Но в начале нужно понимать что вам нужно.
    Я же написал, любой трек может быть одновременно и чайлдом и парентом и если вы точно скрипту не расскажете чтож вам нужно то- он вам ни чего путнего и не выдаст.
     
  24. Archchie

    Archchie Active Member

    Регистрация:
    24 окт 2017
    Сообщения:
    235
    Симпатии:
    74
    Пол:
    Мужской
    Мне нужно что бы выделились все дочерние треки,Но которые треки свернуты не тронулись
    Снимок.PNG отмеченные треки надо выделить
     
  25. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    15.871
    Симпатии:
    8.368
    Пол:
    Мужской
    Адрес:
    Киев
    @Archchie, пожалуйста -
    PHP:
    counttracks reaper.CountTracks(0)
    if 
    counttracks == nil then return end
    for 1counttracks do
      
    track reaper.GetTrack(0i-1)
      
    ftr reaper.GetParentTrack(track)
      
    ttr reaper.GetMediaTrackInfo_Value(track"I_FOLDERDEPTH")
      if 
    ftr ~= nil and (ttr == or ttr == -or ttr == -3then
        htr 
    reaper.GetMediaTrackInfo_Value(track"I_WNDH")
        if 
    htr >= 24 then
          reaper
    .SetMediaTrackInfo_Valuetrack"I_SELECTED"1)
        
    end
      end
    end
    Пояснять нужно или разберётесь?
     
    Archchie нравится это.
  26. @Michael

    @Michael Well-Known Member

    Регистрация:
    14 дек 2010
    Сообщения:
    795
    Симпатии:
    1.220
    Пол:
    Мужской
    Адрес:
    Орёл / Москва
    Чтобы избежать подобного, можно использовать контрольную глубину папки:

    PHP:
    depth 0
    for 1reaper.CountTracks(0) do
      
    track reaper.GetTrack(0i-1)
      
    ch_depth reaper.GetMediaTrackInfo_Value(track"I_FOLDERDEPTH")
      
    depth depth ch_depth
      reaper
    .SetTrackSelectedtrackreaper.GetMediaTrackInfo_Value(track"I_WNDH") >=24
                                      
    and depth >= 0
                                      
    and ch_depth <= 0
                                      
    and not (depth==and ch_depth == 0)
                                     )
    end
     
    Archchie и Aleksandr Oleynik нравится это.
  27. @Michael

    @Michael Well-Known Member

    Регистрация:
    14 дек 2010
    Сообщения:
    795
    Симпатии:
    1.220
    Пол:
    Мужской
    Адрес:
    Орёл / Москва
    В случае с SetMediaTrackInfo_Value() это будет выглядеть как

    PHP:
      reaper.SetMediaTrackInfo_Valuetrack"I_SELECTED", (reaper.GetMediaTrackInfo_Value(track"I_WNDH") >=24
                                      
    and depth >= 
                                      
    and reaper.GetMediaTrackInfo_Value(track"I_FOLDERDEPTH") <= 0
                                      
    and not (depth==and reaper.GetMediaTrackInfo_Value(track"I_FOLDERDEPTH") == 0))
                                      and 
    or 0
                                     
    )
     
    Aleksandr Oleynik нравится это.
  28. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    15.871
    Симпатии:
    8.368
    Пол:
    Мужской
    Адрес:
    Киев
    @@Michael, для понимания и тем более обучения, как мне кажется, лучше все условия, выражения и функции разбивать на как можно более подробные части.
    Компактность кода хороша безусловно, но на этапе, когда в голове уже всё уложилось в стройную систему и код читается в лёт.
     
  29. Archchie

    Archchie Active Member

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

    Archchie Active Member

    Регистрация:
    24 окт 2017
    Сообщения:
    235
    Симпатии:
    74
    Пол:
    Мужской
    Еще вопрос
    получил треки и какой функцией их скрыть в MCP ищу функцию по тегам MCP и Hide ничего подобного не могу найти?
     
  31. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    15.871
    Симпатии:
    8.368
    Пол:
    Мужской
    Адрес:
    Киев
    @Archchie, той же функцией - SetMediaTrackInfo_Value и атрибут - B_SHOWINMIXER
     
  32. Archchie

    Archchie Active Member

    Регистрация:
    24 окт 2017
    Сообщения:
    235
    Симпатии:
    74
    Пол:
    Мужской
    Не получается

    делаю из вашего же кода , только последняя строка надо чтоб была теперь не выделить ,а скрыть показать треки в микшере
    Код:
    
    counttracks = reaper.CountTracks(0)
    if counttracks == nil then  return end
    for i = 1, counttracks do
      track = reaper.GetTrack(0, i-1)
      reaper.SetMediaTrackInfo_Value( track, "I_SELECTED", 0)
      ftr = reaper.GetParentTrack(track)
      ttr = reaper.GetMediaTrackInfo_Value(track, "I_FOLDERDEPTH")
      if ftr ~= nil and (ttr == 0 or ttr == -1 or ttr == -3) then
        htr = reaper.GetMediaTrackInfo_Value(track, "I_WNDH")
        if htr >= 24 then
          reaper.SetMediaTrackInfo_Value( track, "B_SHOWINMIXER ", 0)-----??????????
        end
      end
    end
    
    
     
    Последнее редактирование: 21 янв 2018
  33. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    15.871
    Симпатии:
    8.368
    Пол:
    Мужской
    Адрес:
    Киев
    думаю, что получается, но вы не видите результата, так как после подобных функций нужно сделать рефреш GUI Рипера -
    reaper.TrackList_AdjustWindows( false )
     
  34. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    15.871
    Симпатии:
    8.368
    Пол:
    Мужской
    Адрес:
    Киев
    Правильно, но одной строки не хватает (и используйте при публикации кода - PHP) -
    PHP:
    counttracks reaper.CountTracks(0)
    if 
    counttracks == nil then return end
    for 1counttracks do
      
    track reaper.GetTrack(0i-1)
      
    ftr reaper.GetParentTrack(track)
      
    ttr reaper.GetMediaTrackInfo_Value(track"I_FOLDERDEPTH")
      if 
    ftr ~= nil and (ttr == or ttr == -or ttr == -3then
        htr 
    reaper.GetMediaTrackInfo_Value(track"I_WNDH")
        if 
    htr >= 24 then
          reaper
    .SetMediaTrackInfo_Valuetrack"B_SHOWINMIXER"0)
        
    end
      end
    end
    reaper
    .TrackList_AdjustWindows(false)
     
  35. Archchie

    Archchie Active Member

    Регистрация:
    24 окт 2017
    Сообщения:
    235
    Симпатии:
    74
    Пол:
    Мужской
    Объясните мне пожалуйста магию, первый код не работает и ошибки не какой не выдаёт,а второй код работает ,причем они абсолютно идентичны
    PHP:
    counttracks reaper.CountTracks(0)
    if 
    counttracks == nil then  return end
    for 1counttracks do
      
    track reaper.GetTrack(0i-1)
      
    ftr reaper.GetParentTrack(track)
      
    ttr reaper.GetMediaTrackInfo_Value(track"I_FOLDERDEPTH")
      if 
    ftr ~= nil and (ttr == or ttr == -or ttr == -3then
        htr 
    reaper.GetMediaTrackInfo_Value(track"I_WNDH")
        if 
    htr >= 24 then
          reaper
    .SetMediaTrackInfo_Valuetrack"B_SHOWINMIXER "0)
        
    end
      end
    end                                                                                  
    reaper
    .TrackList_AdjustWindows(false)
    PHP:
    counttracks reaper.CountTracks(0)
    if 
    counttracks == nil then return end
    for 1counttracks do
      
    track reaper.GetTrack(0i-1)
      
    ftr reaper.GetParentTrack(track)
      
    ttr reaper.GetMediaTrackInfo_Value(track"I_FOLDERDEPTH")
      if 
    ftr ~= nil and (ttr == or ttr == -or ttr == -3then
        htr 
    reaper.GetMediaTrackInfo_Value(track"I_WNDH")
        if 
    htr >= 24 then
          reaper
    .SetMediaTrackInfo_Valuetrack"B_SHOWINMIXER"0)
        
    end
      end
    end
    reaper
    .TrackList_AdjustWindows(false)
     
  36. Alex_V

    Alex_V Active Member

    Регистрация:
    12 апр 2017
    Сообщения:
    337
    Симпатии:
    137
    Пол:
    Мужской
    Вот тут пробел лишний:
    Код:
    "B_SHOWINMIXER "
    
     
    Archchie и Aleksandr Oleynik нравится это.
  37. Archchie

    Archchie Active Member

    Регистрация:
    24 окт 2017
    Сообщения:
    235
    Симпатии:
    74
    Пол:
    Мужской
    Спасибо!
    А то я делаю и у меня не работает, а @Aleksandr Oleynik, присылает этот же код, и у него работает ,прям магия какая то думаю
     
  38. Archchie

    Archchie Active Member

    Регистрация:
    24 окт 2017
    Сообщения:
    235
    Симпатии:
    74
    Пол:
    Мужской
    Подскажете ! defer не могу отключить,надо что бы когда function close() сработает defer включился (он включается),а
    когда function open() сработает defer отключился,вроде reaper.atexit() прописал но он не вырубается ,что не так?
    PHP:
                                                                  
    reaper.Main_OnCommand
    sws
    =reaper.NamedCommandLookup

    reaper
    .PreventUIRefresh(1)--замораживаем GUI                                                                                                                        
    reaper
    .Undo_BeginBlock()                                                                                                                        
                                                                                                                          
    local counttracks reaper.CountTracks(0)---------получаем кол-ва треков (кроме Мастера)                        
    if 
    counttracks == 0 then--------------------------если треков нет,то
    reaper
    .Undo_EndBlock('',-1) return end-----------Undo и stop                                                                                                                              
    -----
                                                              
    function 
    close()                                                                                                      
        for 
    0counttracks -do-----------------------------------создаём цикл опроса по каждому треку (кроме Мастера)  
          
    local track reaper.GetTrack(0,i)------------------------------получаем  Трек                                  
          reaper
    .SetMediaTrackInfo_Valuetrack'I_SELECTED')-----------снимаем выделение со всех треков          
          
    if reaper.GetMediaTrackInfo_Value(track,"I_FOLDERDEPTH")==1 then-----если трек папка то                    
                reaper
    .SetMediaTrackInfo_Valuetrack'I_SELECTED')-----------------выделить трек                    
                r
    (sws('_SWS_COLLAPSE'),0)------------------------------------SWSSet selected folder(scollapsed
          end                                                                                                        
        end      
          r
    (sws('_SWS_SELCHILDREN'),0)---------------------------SWSSelect only children of selected folders
          r
    (sws('_SWSTL_HIDEMCP'),0)-----------------------------SWSHide selected track(sfrom MCP      
        
    for 0counttracks -do ----------------------------создаём цикл опроса по каждому треку (кроме Мастера)
           
    track reaper.GetTrack(0,i)--------------------------получаем Трек                                                                        
          reaper
    .SetMediaTrackInfo_Valuetrack,'I_SELECTED',0)--снимаем выделение с опрошенного трека                        
        end                                                                                                                            
      reaper
    .Undo_EndBlock('close folder (TCP,MCP)',-1)  
    ---
      function 
    motion()
          
    counttracks reaper.CountTracks(0)
          if 
    counttracks == nil then return end
          
    for 1counttracks do
            
    track reaper.GetTrack(0i-1)
            
    ftr reaper.GetParentTrack(track)
            
    ttr reaper.GetMediaTrackInfo_Value(track"I_FOLDERDEPTH")
            if 
    ftr ~= nil and (ttr == or ttr == -or ttr == -3then
              htr 
    reaper.GetMediaTrackInfo_Value(track"I_WNDH")
              if 
    htr >= 24 then
                reaper
    .SetMediaTrackInfo_Valuetrack"B_SHOWINMIXER"1)
                else
                
    reaper.SetMediaTrackInfo_Valuetrack"B_SHOWINMIXER"0)
              
    end
            end
          end
          reaper
    .TrackList_AdjustWindows(false)
      
    reaper.defer()
      
    end  
      motion
    ()
    end    
    -----
    function 
    open()                                                                                                                                                                                                                                                                                                                
        for 
    0counttracks -do------------------------------------создаём цикл опроса по каждому треку (кроме Мастера)  
          
    local track reaper.GetTrack(0,i)-------------------------------получаем  Трек                                  
          reaper
    .SetMediaTrackInfo_Valuetrack'I_SELECTED')-----------снимаем выделение со всех треков          
          
    if reaper.GetMediaTrackInfo_Value(track,"I_FOLDERDEPTH")==1 then-----если трек папка то                    
                reaper
    .SetMediaTrackInfo_Valuetrack'I_SELECTED')-------выделить трек                                                                                                                                            
                r
    (sws('_SWS_UNCOLLAPSE'),0)--------------------------------SWSSet selected folder(suncollapsed                                                                        
          end                                                                                                                  
        end                        
          r
    (sws('_SWS_SELCHILDREN'),0)---------------------------SWSSelect only children of selected folders
          r
    (sws('_SWSTL_SHOWMCP'),0)-----------------------------SWSShow selected track(sin MCP
        
    for 0counttracks -do-----------------------------создаём цикл опроса по каждому треку (кроме Мастера)  
             
    local track reaper.GetTrack(0,i)------------------получаем  Трек                                  
           reaper
    .SetMediaTrackInfo_Value(track,'I_SELECTED',0)--снимаем выделение со всех треков              
        end                                                                                                                                                                                                                                                                                                                    
      reaper
    .Undo_EndBlock('open folder TCP,MCP',-1)
      
    reaper.atexit()
    end
                                                                                  
    -----
                                                                                                                        
    toggle_state reaper.GetToggleCommandState(sws("_S&M_DUMMY_TGL1"),0)                                                  
    if 
    toggle_state == 0 then
       close
    ()                                                                  
       
    r(sws('_S&M_DUMMY_TGL1'),0)
    else
       
    open()
       
    r(sws('_S&M_DUMMY_TGL1'),0)
    end

    reaper
    .PreventUIRefresh(-1)--размораживаем GUI  

     
    Последнее редактирование: 21 янв 2018
  39. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    15.871
    Симпатии:
    8.368
    Пол:
    Мужской
    Адрес:
    Киев
    Я на это регулярно тоже накалываюсь - по двойному щелчку мыши копирую атрибут, а он какраз с пробелом в конце копируется - вот и....
    --- добавлено 21 янв 2018 ---
    @Archchie, у вас там в коде куча ошибок - исправьте их в начале.
    end=ы пропущенные и ещё что-то не так
    Ну вот в этой строке end нет -
    if counttracks == 0 then--------------------------если треков нет,то

    Ещё, defer должен запускать какую-то функцию, сильно в коде не разбирался, но видимо motion, значит писать нужно - reaper.defer (motion)

    Ну и вот так, ни кто не пишет -

    PHP:
    function close()                                                                                                     
      for 
    0counttracks -do-----------------------------------создаём цикл опроса по каждому треку (кроме Мастера
        
    local track reaper.GetTrack(0,i)------------------------------получаем  Трек                                 
        reaper
    .SetMediaTrackInfo_Valuetrack'I_SELECTED')-----------снимаем выделение со всех треков         
        
    if reaper.GetMediaTrackInfo_Value(track,"I_FOLDERDEPTH")==1 then-----если трек папка то                   
          reaper
    .SetMediaTrackInfo_Valuetrack'I_SELECTED')-----------------выделить трек                   
          r
    (sws('_SWS_COLLAPSE'),0)------------------------------------SWSSet selected folder(scollapsed
        end                                                                                                       
      end     
      r
    (sws('_SWS_SELCHILDREN'),0)---------------------------SWSSelect only children of selected folders
      r
    (sws('_SWSTL_HIDEMCP'),0)-----------------------------SWSHide selected track(sfrom MCP     
      
    for 0counttracks -do ----------------------------создаём цикл опроса по каждому треку (кроме Мастера)
        
    track reaper.GetTrack(0,i)--------------------------получаем Трек                                                                       
        reaper
    .SetMediaTrackInfo_Valuetrack,'I_SELECTED',0)--снимаем выделение с опрошенного трека                       
      end                                                                                                                           
      reaper
    .Undo_EndBlock('close folder (TCP,MCP)',-1)
     
      function 
    motion()
        
    counttracks reaper.CountTracks(0)
        if 
    counttracks == nil then return end
        
    for 1counttracks do
          
    track reaper.GetTrack(0i-1)
          
    ftr reaper.GetParentTrack(track)
          
    ttr reaper.GetMediaTrackInfo_Value(track"I_FOLDERDEPTH")
          if 
    ftr ~= nil and (ttr == or ttr == -or ttr == -3then
            htr 
    reaper.GetMediaTrackInfo_Value(track"I_WNDH")
            if 
    htr >= 24 then
              reaper
    .SetMediaTrackInfo_Valuetrack"B_SHOWINMIXER"1)
            else
              
    reaper.SetMediaTrackInfo_Valuetrack"B_SHOWINMIXER"0)
            
    end
          end
        end
        reaper
    .TrackList_AdjustWindows(false)
        
    reaper.defer()
      
    end 
      motion
    ()
    end
    Не знаю, может и работать не будет....
    Пишут вот так -

    PHP:
    function motion()
      
    counttracks reaper.CountTracks(0)
      if 
    counttracks == nil then return end
      
    for 1counttracks do
        
    track reaper.GetTrack(0i-1)
        
    ftr reaper.GetParentTrack(track)
        
    ttr reaper.GetMediaTrackInfo_Value(track"I_FOLDERDEPTH")
        if 
    ftr ~= nil and (ttr == or ttr == -or ttr == -3then
          htr 
    reaper.GetMediaTrackInfo_Value(track"I_WNDH")
          if 
    htr >= 24 then
            reaper
    .SetMediaTrackInfo_Valuetrack"B_SHOWINMIXER"1)
          else
            
    reaper.SetMediaTrackInfo_Valuetrack"B_SHOWINMIXER"0)
          
    end
        end
      end
      reaper
    .TrackList_AdjustWindows(false)
      
    reaper.defer(motion)
    end 

    function close()                                                                                                     
      for 
    0counttracks -do-----------------------------------создаём цикл опроса по каждому треку (кроме Мастера
        
    local track reaper.GetTrack(0,i)------------------------------получаем  Трек                                 
        reaper
    .SetMediaTrackInfo_Valuetrack'I_SELECTED')-----------снимаем выделение со всех треков         
        
    if reaper.GetMediaTrackInfo_Value(track,"I_FOLDERDEPTH")==1 then-----если трек папка то                   
          reaper
    .SetMediaTrackInfo_Valuetrack'I_SELECTED')-----------------выделить трек                   
          r
    (sws('_SWS_COLLAPSE'),0)------------------------------------SWSSet selected folder(scollapsed
        end                                                                                                       
      end     
      r
    (sws('_SWS_SELCHILDREN'),0)---------------------------SWSSelect only children of selected folders
      r
    (sws('_SWSTL_HIDEMCP'),0)-----------------------------SWSHide selected track(sfrom MCP     
      
    for 0counttracks -do ----------------------------создаём цикл опроса по каждому треку (кроме Мастера)
        
    track reaper.GetTrack(0,i)--------------------------получаем Трек                                                                       
        reaper
    .SetMediaTrackInfo_Valuetrack,'I_SELECTED',0)--снимаем выделение с опрошенного трека                       
      end                                                                                                                           
      reaper
    .Undo_EndBlock('close folder (TCP,MCP)',-1)
     
      
    motion()
    end
    Но повторюсь, я в коде не разбирался, просто грубые ошибки описал.
    atexit() также как правило пишется для запуска при выходи из скрипта (после завершения дефера) какой-то функции, типпа такого -
    PHP:
    function exit ()
    трамтатамтатам
    end

    reaper
    .atexit (exit)
     
    Последнее редактирование: 21 янв 2018
  40. Archchie

    Archchie Active Member

    Регистрация:
    24 окт 2017
    Сообщения:
    235
    Симпатии:
    74
    Пол:
    Мужской
    Да нет прям от сюда #89 код копирую ,все работает !Ничего не пропущенно.(Скопировали плохо наверно)
     
  41. Archchie

    Archchie Active Member

    Регистрация:
    24 окт 2017
    Сообщения:
    235
    Симпатии:
    74
    Пол:
    Мужской
    потому что он в следующий строке
     
  42. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    15.871
    Симпатии:
    8.368
    Пол:
    Мужской
    Адрес:
    Киев
    Тогда лучше писать так -
    PHP:
    if counttracks == 0 then   --если треков нет,то
      reaper
    .Undo_EndBlock('',-1)
      return
    end  --Undo и stop
    В некоторых языках лишний пробел в конце строки - и код работать не будет.
    В такой редактор как Atom, например, можно поставить модуль синтаксиса LUA и по шоткату приводить код в правильный вид, со всеми верными отступами, форматами и параграфами.
     
  43. @Michael

    @Michael Well-Known Member

    Регистрация:
    14 дек 2010
    Сообщения:
    795
    Симпатии:
    1.220
    Пол:
    Мужской
    Адрес:
    Орёл / Москва
    В кучу всё навалено. Лучше сформулировать задачу, а потом уже исследовать варианты, а не тыкать пальцем в небо.
     
    Aleksandr Oleynik нравится это.
  44. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    15.871
    Симпатии:
    8.368
    Пол:
    Мужской
    Адрес:
    Киев
    +1
     
  45. Alex_V

    Alex_V Active Member

    Регистрация:
    12 апр 2017
    Сообщения:
    337
    Симпатии:
    137
    Пол:
    Мужской
    В принципе, от проблем такого рода можно попытаться избавиться, заведя пачку глобальных констант типа такого:
    Код:
      I_FOLDERDEPTH = "I_FOLDERDEPTH"
      I_WNDH = "I_WNDH"
    
    и потом в коде использовать их, а не строковые выражения. После имени переменной количество пробелов значения не имеет. От опечаток в имени переменных это, правда, не спасет. Был бы язык без неявных переменных, и эту проблемку можно было бы решить. Но в Lua - вряд ли.
     
  46. Alex_V

    Alex_V Active Member

    Регистрация:
    12 апр 2017
    Сообщения:
    337
    Симпатии:
    137
    Пол:
    Мужской
    Вот за придумывание языков, в которых работоспособность похожим образом зависит от количества пробелов, надо расстреливать из рогатки.
     
  47. Archchie

    Archchie Active Member

    Регистрация:
    24 окт 2017
    Сообщения:
    235
    Симпатии:
    74
    Пол:
    Мужской
    Скажите пожалуйста как сделать что бы в экшен листе появился статус (ON OFF)
    он включается выключается но статуса нет—неудобно
    PHP:
    function motion() 
      
    counttracks reaper.CountTracks(0)
      if 
    counttracks == nil then return end
      
    for 1counttracks do
        
    track reaper.GetTrack(0i-1)
        
    ftr reaper.GetParentTrack(track)
        
    ttr reaper.GetMediaTrackInfo_Value(track"I_FOLDERDEPTH")
        if 
    ftr ~= nil and (ttr == or ttr == -or ttr == -3then
          htr 
    reaper.GetMediaTrackInfo_Value(track"I_WNDH")
          if 
    htr >= 24 then
            reaper
    .SetMediaTrackInfo_Valuetrack"B_SHOWINMIXER"1)
            else
            
    reaper.SetMediaTrackInfo_Valuetrack"B_SHOWINMIXER"0)
          
    end
        end
      end
      reaper
    .TrackList_AdjustWindows(false)
      
    reaper.defer(motion)
    end 
    motion
    () 
     
  48. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    15.871
    Симпатии:
    8.368
    Пол:
    Мужской
    Адрес:
    Киев
    Для каких целей? Что не удобно?
    Если нужно видеть работает скрипт или нет, есть давно сделаный Михаилом функционал - "включающий-выключающий" кнопку на тулбаре.
    PHP:
    function motion()
      
    counttracks reaper.CountTracks(0)
      if 
    counttracks == nil then return end
      
    for 1counttracks do
        
    track reaper.GetTrack(0i-1)
        
    ftr reaper.GetParentTrack(track)
        
    ttr reaper.GetMediaTrackInfo_Value(track"I_FOLDERDEPTH")
        if 
    ftr ~= nil and (ttr == or ttr == -or ttr == -3then
          htr 
    reaper.GetMediaTrackInfo_Value(track"I_WNDH")
          if 
    htr >= 24 then
            reaper
    .SetMediaTrackInfo_Valuetrack"B_SHOWINMIXER"1)
            else
            
    reaper.SetMediaTrackInfo_Valuetrack"B_SHOWINMIXER"0)
          
    end
        end
      end
      reaper
    .TrackList_AdjustWindows(false)
      
    reaper.defer(motion)
    end

    -- Set ToolBar Button ON
    function SetButtonON()
      
    is_new_valuefilenameseccmdmoderesolutionval reaper.get_action_context()
      
    state reaper.GetToggleCommandStateExseccmd )
      
    reaper.SetToggleCommandStateseccmd) -- Set ON
      reaper
    .RefreshToolbar2seccmd )
    end
    --
    -- 
    Set ToolBar Button OFF
    function SetButtonOFF()
      
    is_new_valuefilenameseccmdmoderesolutionval reaper.get_action_context()
      
    state reaper.GetToggleCommandStateExseccmd )
      
    reaper.SetToggleCommandStateseccmd) -- Set OFF
      reaper
    .RefreshToolbar2seccmd )
    end
    ----------------------------------------------------------------------------------------------------

    SetButtonON() -- функция запуска срипта с "поджигом" кнопки тулбара

    motion
    () -- основная функция дефера

    reaper
    .atexit(SetButtonOFF) -- выход из скрипта с запуском функции выхода с тушением кнопки тулбара
    Если нужно "знать" включен скрипт или нет для работы какого-то другого скрипта, то тут тоже масса возможностей, например использовать SWS/S&M: Dummy toggle - это пустышки Экшины, у которых только статус и меняется
     
    Archchie нравится это.
  49. Archchie

    Archchie Active Member

    Регистрация:
    24 окт 2017
    Сообщения:
    235
    Симпатии:
    74
    Пол:
    Мужской
    Для чего там пустышка если он уже работает ON OFF, пустышка статус не показывает.

    Уже нашёл! Сделанный не Михаилом ,а X-Raym
    https://github.com/ReaTeam/ReaScripts-Templates/blob/master/Templates/X-Raym_Background script.lua
     
  50. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    15.871
    Симпатии:
    8.368
    Пол:
    Мужской
    Адрес:
    Киев
    Показывает! У скрипта статуса нет, а у этой пустышки есть.
    Если этот экшин вставить в код - то он и будет статус менять синхронно со скриптом.
    Я же написал - я от куда знаю, зачем вам статус?
    Мне это Михаил, в своё время, показал...
     

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