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

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

  1. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

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

    Alex_V Active Member

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


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

    Aleksandr Oleynik Well-Known Member

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

    Alex_V Active Member

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

    Aleksandr Oleynik Well-Known Member

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

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

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

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    16.899
    Симпатии:
    9.159
    Пол:
    Мужской
    Адрес:
    Киев
    Пример скрипта - 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
    Сообщения:
    310
    Симпатии:
    108
    Пол:
    Мужской
    Род занятий:
    Sound Prod
    кто нибудь писал скрипты на питоне? какие ограничения у питона перед луа?
     
  8. Alex_V

    Alex_V Active Member

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

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

    Aleksandr Oleynik Well-Known Member

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

    EUGEN27771 Well-Known Member

    Регистрация:
    23 апр 2010
    Сообщения:
    2.321
    Симпатии:
    1.963
    Пол:
    Мужской
    @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
    Симпатии:
    138
    Пол:
    Мужской
    Ну, в том или ином виде я это уже где-то в одной библиотеке видел. Но всё, что видел, не имеет под собой реализации parent-child, а без этого нормальный гуй не строится.
     
  12. EUGEN27771

    EUGEN27771 Well-Known Member

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

    Alex_V Active Member

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

    EUGEN27771 Well-Known Member

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

    Alex_V Active Member

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

    Aleksandr Oleynik Well-Known Member

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

    EUGEN27771 Well-Known Member

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

    Alex_V Active Member

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

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

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

    Aleksandr Oleynik Well-Known Member

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

    Aleksandr Oleynik Well-Known Member

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

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    16.899
    Симпатии:
    9.159
    Пол:
    Мужской
    Адрес:
    Киев
    @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 нравится это.
  23. @Michael

    @Michael Well-Known Member

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

    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 нравится это.
  24. @Michael

    @Michael Well-Known Member

    Регистрация:
    14 дек 2010
    Сообщения:
    840
    Симпатии:
    1.264
    Пол:
    Мужской
    Адрес:
    Орёл / Москва
    В случае с 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 нравится это.
  25. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

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

    Archchie Active Member

    Регистрация:
    24 окт 2017
    Сообщения:
    351
    Симпатии:
    174
    Пол:
    Мужской
  27. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

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

    Aleksandr Oleynik Well-Known Member

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

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    16.899
    Симпатии:
    9.159
    Пол:
    Мужской
    Адрес:
    Киев
    Правильно, но одной строки не хватает (и используйте при публикации кода - 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)
     
  30. Archchie

    Archchie Active Member

    Регистрация:
    24 окт 2017
    Сообщения:
    351
    Симпатии:
    174
    Пол:
    Мужской
    Объясните мне пожалуйста магию, первый код не работает и ошибки не какой не выдаёт,а второй код работает ,причем они абсолютно идентичны
    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)
     
  31. Alex_V

    Alex_V Active Member

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

    Archchie Active Member

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

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    16.899
    Симпатии:
    9.159
    Пол:
    Мужской
    Адрес:
    Киев
    Я на это регулярно тоже накалываюсь - по двойному щелчку мыши копирую атрибут, а он какраз с пробелом в конце копируется - вот и....
    --- добавлено 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
  34. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

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

    @Michael Well-Known Member

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

    Aleksandr Oleynik Well-Known Member

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

    Alex_V Active Member

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

    Alex_V Active Member

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

    Archchie Active Member

    Регистрация:
    24 окт 2017
    Сообщения:
    351
    Симпатии:
    174
    Пол:
    Мужской
    Скажите пожалуйста как сделать что бы в экшен листе появился статус (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
    () 
     
  40. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    16.899
    Симпатии:
    9.159
    Пол:
    Мужской
    Адрес:
    Киев
    Для каких целей? Что не удобно?
    Если нужно видеть работает скрипт или нет, есть давно сделаный Михаилом функционал - "включающий-выключающий" кнопку на тулбаре.
    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 нравится это.
  41. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

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

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    16.899
    Симпатии:
    9.159
    Пол:
    Мужской
    Адрес:
    Киев
    @Archchie, вы не понимаете того, что я спрашиваю?
    --- добавлено 22 янв 2018 ---
    Это целью быть не может, это ни чего не даёт!
    И второе ваше утверждение ошибочно (по поводу Dummy) -
    И менять будет и показывать будет!
    Вот в точности то, что вы хотите -
    Только так и не написали ДЛЯ ЧЕГО.
     
  43. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    16.899
    Симпатии:
    9.159
    Пол:
    Мужской
    Адрес:
    Киев
    Крайне не удобный и не правильный подход.
    Скриптов с дефером, которые могут работать в фоне и можно просто не уследить (забыть) что их включил - не так много и их все можно разместить на видимом тулбаре.
    Если ВДУГ всё-же 16 тулбаров не хватает, то сделайте для себя скрипт-тулбар и .... ну и делайте с ним что угодно.
    Скрипты нужны для удобства и ускорения в работе, а поиски в Экшин листе скрипта и его статуса - это кошмар и бред!


    Будьласка (кстати, какой-то смысл вложил в дефер) -
    Dummy01.gif

    PHP:
    function SHOWINMIXER(show)
      
    reaper.Main_OnCommand(reaper.NamedCommandLookup("_S&M_DUMMY_TGL1"), 0)
      
    reaper.Main_OnCommand(40605,0)
      
    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"show)
          
    end
        end
      end
      reaper
    .TrackList_AdjustWindows(false)
    end

    function mainloop ()
      
    reaper.defer(mainloop)
    end

    -- Set ToolBar Button ON
    function SetButtonON()
      -- 
    msg("YES")
      
    SHOWINMIXER(0)
      
    is_new_valuefilenameseccmdmoderesolutionval reaper.get_action_context()
      
    state reaper.GetToggleCommandStateExseccmd )
      
    reaper.SetToggleCommandStateseccmd) -- Set ON
      reaper
    .RefreshToolbar2seccmd )
    end

    -- Set ToolBar Button OFF
    function SetButtonOFF()
      -- 
    msg("NO")
      
    SHOWINMIXER(1)
      
    is_new_valuefilenameseccmdmoderesolutionval reaper.get_action_context()
      
    state reaper.GetToggleCommandStateExseccmd )
      
    reaper.SetToggleCommandStateseccmd) -- Set OFF
      reaper
    .RefreshToolbar2seccmd )
    end
    ----------------------------------------------------------------------------------------------------

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

    mainloop 
    ()

    reaper.atexit(SetButtonOFF) -- выход из скрипта с запуском функции выхода с тушением кнопки тулбара

    reaper.Main_OnCommand(40605,0) - делает типпа рефреша Экшин листу - так как статус то меняется, но без рефреша не отображается.
    Но я повоторюсь - если у вас много скриптов с дефером, за открытием которых нужно следить и знать - то нужно это организовывать совершенно иначе!
     
    Последнее редактирование: 22 янв 2018
  44. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    16.899
    Симпатии:
    9.159
    Пол:
    Мужской
    Адрес:
    Киев
    Вот это вполне может быть - так я для этого и спрашиваю всё время - нужны ли пояснения или всё ясно!

    Сейчас напишу пару нудных предложений, но вы наберитесь терпения и прочтите их!!!!!!!!
    В любой работе 95% успеха это правильно поставленная задача!
    И не важно вы сами её реализовыать собрались или ТЕМ БОЛЕЕ хотите попросить кого-то.
    Самым не верным всегда будет, если вы со скудными знаниями предмета начнёте Задачу ставить используя эти самые знания, а не общие понятия и представления... ну вот как вы с deffer функцией начали пытаться что-то строить.
     
    Archchie нравится это.
  45. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    16.899
    Симпатии:
    9.159
    Пол:
    Мужской
    Адрес:
    Киев
    Так для этого и сделанны эти Дами, чтоб показывать статус ТОГО, что не имеет статуса.
    Если у привязанного к скрипту Дами статус меняется - значит меняется и статус Скрипта, даже если там статуса не будет.
    Вы же хотели ВИДЕТЬ в Экшин лист, что скрипт поменял статус - вот по привязанному дами будете видеть, хоть это (как я вам сразу написал) - бред.
    Так что ваше вот это вот -
    поклёп на меня, я ни где не утверждал что ИМЕННО у Скрипта будет менятся статус с использованием Дами!
    Вы хотели ВИДЕТЬ, что у скрипта поменялся статус - вот глядя на статус Дами вы это и будете ВИДЕТЬ!

    В общем я устал.... Как только у вас созреет осознанный план какого-то скрипта - пишите в начале техническое задание для себя, а не кашу из набора функций, которые вы пока не понимаете.
    --- добавлено 22 янв 2018 ---
    Так вам уже указали - что не правильно учитесь... И не только я.
     
  46. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    16.899
    Симпатии:
    9.159
    Пол:
    Мужской
    Адрес:
    Киев
    Смотря какой работы вы от него ожидали.
    Уберите лишние строки, которые только показывали работу дами, и всё работает -
    при нажатии на кнопку скрипта он скрывает из Микшера треки чайлды свёрнутые до минимальной величины в окне аранжа,
    а при отжатии кнопки их в Микшер возвращает (показывает).
     
  47. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    16.899
    Симпатии:
    9.159
    Пол:
    Мужской
    Адрес:
    Киев
    Может и нет такой
     
  48. @Michael

    @Michael Well-Known Member

    Регистрация:
    14 дек 2010
    Сообщения:
    840
    Симпатии:
    1.264
    Пол:
    Мужской
    Адрес:
    Орёл / Москва
    GetSetTrackStateChunk() Вторая переменная BUSCOMP.
    По понятным причинам работает только с папками и с включенным Mixer: Clickable icon for folder tracks to show/hide children


    хочу того сам не знаю чего
     
    Последнее редактирование: 24 янв 2018
  49. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    16.899
    Симпатии:
    9.159
    Пол:
    Мужской
    Адрес:
    Киев
    Работу с чанками даже не советовал - не для новичков это....
     
  50. gazzz

    gazzz Gazzuar (Goa-trance)

    Регистрация:
    17 янв 2008
    Сообщения:
    243
    Симпатии:
    84
    Адрес:
    Lyubertsy
    UPD: нашел ошибку: при L>0 значание формулы могло быть <0 и проскакивали эксессы там


    помогите советом по JS плагину, по-моему данный код на выходе должен хардклиповать до 0 дБ, но такого не происходит, и при росте slider1 > 2
    на выходе получаю что-то зашкаливающее

    при slider1 <2 формула сама по себе находится в пределах -1 +1 sign(L) * (1 - pow(abs(1-L*sign(L)),trsh*slider3*(1-slider4)))

    может я не правильно понимаю функции min/max ?


    Код:
    @sample
    slider1 ? (
    L = slider1 * spl0;
    R = slider1 * spl1;
    
    spl0 = L > 0
      ? min(1,sign(L) * (1 - pow(abs(1-L*sign(L)),trsh*slider3*(1-slider4))) * slider5)
      : max(-1,sign(L) * (1 - pow(abs(1-L*sign(L)),trsh*(1-slider4)))* slider5);
    spl1 = R > 0
      ? min(1,sign(R) * (1 - pow(abs(1-R*sign(R)),trsh*(1+slider4)))* slider5)
      : max(-1,sign(R) * (1 - pow(abs(1-R*sign(R)),trsh*slider3*(1+slider4)))* slider5);
     
    );
    
     
    Последнее редактирование: 25 янв 2018
    Aleksandr Oleynik нравится это.

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