ReaScripts (скрипты для Reaper) - обсуждение

Тема в разделе "Reaper", создана пользователем drzhnn, 21 апр 2014.

  1. walks

    walks Active Member

    Регистрация:
    6 май 2017
    Сообщения:
    113
    Симпатии:
    64
    Пол:
    Мужской
    Не подскажите, почему перестали работать скрипты показывающие огибающие параметров которые трогал последними?
    Не так давно сделал кнопку с экшеном - "FX: Show/hide track envelope for last touched FX parameter", работала нормално, как-то про неё забыл, и не пользовался этой функцией, да и рипер не часто включал.
    Сейчас вот понадобилось, и не работает. Кнопку жму, через окно экшенов запускаю - ничего, не реагирует. Попробовал похожий скрипт - "Script: mpl_Show envelopes for last touched FX.lua" - тоже не работает.
    Если посмотреть последние "тронутые" параметры через окно огибающих на треке, то видно, что рипер определяет правильно последние "тронутые" параметры.
     
  2. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    16.914
    Симпатии:
    9.168
    Пол:
    Мужской
    Адрес:
    Киев
    @walks, всё прекрасно работает (РИПЕР - последняя версия) -

    LastParEnv.gif
     
    walks нравится это.
  3. vitalker

    vitalker Well-Known Member

    Регистрация:
    8 окт 2013
    Сообщения:
    3.061
    Симпатии:
    1.183
    Адрес:
    Гродно
    @walks, а чем родной экшн не угодил? FX: Show/hide track envelope for last touched FX parameter
     
  4. walks

    walks Active Member

    Регистрация:
    6 май 2017
    Сообщения:
    113
    Симпатии:
    64
    Пол:
    Мужской
    Угодил, он перестал работать.
    Рипер последний.
     
  5. Arkhipower

    Arkhipower Active Member

    Регистрация:
    28 июл 2005
    Сообщения:
    883
    Симпатии:
    231
    Пол:
    Мужской
    Род занятий:
    HSE
    Адрес:
    Wild Far East & Worldwide
    Подскажите пожалуйста
    Как сделать, чтобы все FXы на треках отключались в bypass, но не затрагивались инструменты VSTi и AUi, без выделения треков, просто одним нажанием?
     
  6. walks

    walks Active Member

    Регистрация:
    6 май 2017
    Сообщения:
    113
    Симпатии:
    64
    Пол:
    Мужской
    Вот, для наглядности.
     
  7. @Michael

    @Michael Well-Known Member

    Регистрация:
    14 дек 2010
    Сообщения:
    840
    Симпатии:
    1.266
    Пол:
    Мужской
    Адрес:
    Орёл / Москва
    Скрипт работает, его, правда нужно переименовать:
    Show existing envelopes for last touched FX
    Т.е. он показывает все существующие огибающие для всех параметров последнего тронутого FX.

    FX: Show/hide track envelope for last touched FX parameter
    помимо того, что показывает, создаёт огибающие, если их раньше не было
     
    walks нравится это.
  8. walks

    walks Active Member

    Регистрация:
    6 май 2017
    Сообщения:
    113
    Симпатии:
    64
    Пол:
    Мужской
    Разницу понял, спасибо. Но вопрос в том, почему перестал работать Show/hide track envelope for last touched FX parameter. До этого работал нормально.
     
  9. dobrysan

    dobrysan New Member

    Регистрация:
    10 сен 2018
    Сообщения:
    11
    Симпатии:
    14
    Пол:
    Мужской
    Всем добрый вечер, у меня второй заход на рипер. и я решил разобраться со скриптами, - скачал реапак, кинул в узерплагин, открыл в браузере, через вкладки сделал инстал, установилось всё!! и всё появилось в экшенах, я выбираю скрипт, назначаю кнопку - и скрипт не работает, НОО. всё работает в чужих конфигах??? Скажите, где я что пропустил? и правильнл ли я понял, что скачивая reapack, уже не надо копировать и вставлять куда -то текст-символы конкретного скрипта?
     
  10. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    16.914
    Симпатии:
    9.168
    Пол:
    Мужской
    Адрес:
    Киев
  11. dobrysan

    dobrysan New Member

    Регистрация:
    10 сен 2018
    Сообщения:
    11
    Симпатии:
    14
    Пол:
    Мужской
    прочитал, - ещё до вашеё ссылки, прочитал многое в теме и в соседних, и видео посмотрел - не одно , и делал всё, вроде бы , по инструкции, - и описал алгоритм своих действий - ожидая вразумительный ответ от коллег - музыкантов, мне от рипера много не надо -типа чтоб при потрясывании он переливался пурпурно- зелёным, хотя бы плей начинался с момента остановки пробела- без ентера, SWS-ы работают, а скрипы - нет, а в скачаных конфигах - да, но конфиги мне не подходят - в одном из них, например, все сделано зачем то под сонар, и убиты классные штуки рипера
     
  12. @Michael

    @Michael Well-Known Member

    Регистрация:
    14 дек 2010
    Сообщения:
    840
    Симпатии:
    1.266
    Пол:
    Мужской
    Адрес:
    Орёл / Москва
    Что конкретно не работает?
     
  13. dobrysan

    dobrysan New Member

    Регистрация:
    10 сен 2018
    Сообщения:
    11
    Симпатии:
    14
    Пол:
    Мужской
    @@Michael, здравствуйте, не работают Script:amagaima Toggle behavior of Play- Stop buttons.lua, Script: Exclusive solo for Selected Track.lua - другие не проверял - начал с этих - и споткнулся, но ,как уже выше дважды писал, в чужих конфигах всё это работает, и я не пойму - где что- то не так пошло или я что- то не доделал?...
    p.s. ну, к слову, добавляю через экшен - лоад другие скрипты - работают..
     
    Последнее редактирование: 10 сен 2018
  14. Kokarev Maxim

    Kokarev Maxim ex cool

    Регистрация:
    13 май 2007
    Сообщения:
    3.975
    Симпатии:
    2.402
    Пол:
    Мужской
    Род занятий:
    freelance, mixing
    Адрес:
    Барнаул
    Этот скрипт состоит из двух частей, они работают вместе.
    Первый - amagaima Toggle behavior of Play- Stop buttons.lua назначается только на кнопку, чтобы переключать способ воспроизведения.
    А на Space нужно назначить основной скрипт: amagalma_Transport Play-Stop (with memory - no undo).lua
    Так будет всё работать.

    Простой, там сложно что-то напутать. Главное не на S треков нажимать, а просто выделять их :)

    Он, в первую очередь, сделан для пользователей, привыкших к Сонару. Фишки Рипера все есть в дефолтном конфиге, без стороннего вмешательства.
     
  15. dobrysan

    dobrysan New Member

    Регистрация:
    10 сен 2018
    Сообщения:
    11
    Симпатии:
    14
    Пол:
    Мужской
    @Kokarev Maxim, спасибо за ответ, всё как надо заработало ! Ну а насчёт конфига - тут конечно, каждый под себя собирает, дефолтный рипер - это полуфабрикат, и по цвету и по кнопкам
     
  16. Kokarev Maxim

    Kokarev Maxim ex cool

    Регистрация:
    13 май 2007
    Сообщения:
    3.975
    Симпатии:
    2.402
    Пол:
    Мужской
    Род занятий:
    freelance, mixing
    Адрес:
    Барнаул
    Крутейший скрипт, спасибо! А есть ли возможность сделать то же самое, но для создания Automation Items? Я попробовал сам адаптировать этот скрипт, но не нашёл полных аналогов команд для автоматизации, на этом мои програмистские способности иссякли :)
     
  17. borisuperful

    borisuperful Well-Known Member

    Регистрация:
    31 янв 2013
    Сообщения:
    1.044
    Симпатии:
    330
    Да, это чисто фишка Studio One спасибо им за идею :)
     
  18. Kokarev Maxim

    Kokarev Maxim ex cool

    Регистрация:
    13 май 2007
    Сообщения:
    3.975
    Симпатии:
    2.402
    Пол:
    Мужской
    Род занятий:
    freelance, mixing
    Адрес:
    Барнаул
    Ребята, помогите допилить скрипт. Нужно всего две вещи: ОБНОВЛЁННАЯ ЗАДАЧА ПОСТОМ НИЖЕ!
    1. Реакция кнопок на toggle статус функции (например: включена функция = подсвечена кнопка)
    2. (не так обязательно) Возможность внешний вид кнопок сделать в виде изображений.


    За основу я использовал тимплейт @EUGEN27771. Мой код на данный момент:


    Код:
    --[[
       * Simple GUI template for scripts
       * Author: EUGEN27771
       * Author URI: http://forum.cockos.com/member.php?u=50462
       * Licence: GPL v3
       * Version: 1.0
      ]]
    
    --------------------------------------------------------------------------------
    ---   Simple Element Class   ---------------------------------------------------
    --------------------------------------------------------------------------------
    local Element = {}
    function Element:new(x,y,w,h, r,g,b,a, lbl,fnt,fnt_sz, norm_val,norm_val2)
        local elm = {}
        elm.def_xywh = {x,y,w,h,fnt_sz} -- its default coord,used for Zoom etc
        elm.x, elm.y, elm.w, elm.h = x, y, w, h
        elm.r, elm.g, elm.b, elm.a = r, g, b, a
        elm.lbl, elm.fnt, elm.fnt_sz  = lbl, fnt, fnt_sz
        elm.norm_val = norm_val
        elm.norm_val2 = norm_val2
        ------
        setmetatable(elm, self)
        self.__index = self
        return elm
    end
    --------------------------------------------------------------
    --- Function for Child Classes(args = Child,Parent Class) ----
    --------------------------------------------------------------
    function extended(Child, Parent)
      setmetatable(Child,{__index = Parent})
    end
    --------------------------------------------------------------
    ---   Element Class Methods(Main Methods)   ------------------
    --------------------------------------------------------------
    function Element:update_xywh()
      if not Z_w or not Z_h then return end -- return if zoom not defined
      self.x, self.w = math.ceil(self.def_xywh[1]* Z_w) , math.ceil(self.def_xywh[3]* Z_w) -- upd x,w
      self.y, self.h = math.ceil(self.def_xywh[2]* Z_h) , math.ceil(self.def_xywh[4]* Z_h) -- upd y,h
      if self.fnt_sz then --fix it!--
         self.fnt_sz = math.max(9,self.def_xywh[5]* (Z_w+Z_h)/2)
         self.fnt_sz = math.min(22,self.fnt_sz)
      end
    end
    ------------------------
    function Element:pointIN(p_x, p_y)
      return p_x >= self.x and p_x <= self.x + self.w and p_y >= self.y and p_y <= self.y + self.h
    end
    --------
    function Element:mouseIN()
      return gfx.mouse_cap&1==0 and self:pointIN(gfx.mouse_x,gfx.mouse_y)
    end
    ------------------------
    function Element:mouseDown()
      return gfx.mouse_cap&1==1 and self:pointIN(mouse_ox,mouse_oy)
    end
    --------
    function Element:mouseClick()
      return gfx.mouse_cap&1==0 and last_mouse_cap&1==1 and
      self:pointIN(gfx.mouse_x,gfx.mouse_y) and self:pointIN(mouse_ox,mouse_oy) 
    end
    ------------------------
    function Element:mouseR_Down()
      return gfx.mouse_cap&2==2 and self:pointIN(mouse_ox,mouse_oy)
    end
    --------
    function Element:mouseM_Down()
      return gfx.mouse_cap&64==64 and self:pointIN(mouse_ox,mouse_oy)
    end
    ------------------------
    function Element:draw_frame()
      local x,y,w,h  = self.x,self.y,self.w,self.h
      gfx.rect(x, y, w, h, false)            -- frame1
      gfx.roundrect(x, y, w-1, h-1, 3, true) -- frame2 
    end
    ----------------------------------------------------------------------------------------------------
    ---   Create Element Child Classes(Button,Slider,Knob)   -------------------------------------------
    ----------------------------------------------------------------------------------------------------
    local Button = {}
    
    extended(Button,     Element)
    
    
    --------------------------------------------------------------------------------
    --------------------------------------------------------------------------------
    ---   Button Class Methods   ---------------------------------------------------
    --------------------------------------------------------------------------------
    function Button:draw_body()
        gfx.rect(self.x,self.y,self.w,self.h, true) -- draw btn body
    end
    --------
    function Button:draw_lbl()
        local x,y,w,h  = self.x,self.y,self.w,self.h
        local lbl_w, lbl_h = gfx.measurestr(self.lbl)
        gfx.x = x+(w-lbl_w)/2; gfx.y = y+(h-lbl_h)/2
        gfx.drawstr(self.lbl)
    end
    ------------------------
    function Button:draw()
        self:update_xywh() -- Update xywh(if wind changed)
        local r,g,b,a  = self.r,self.g,self.b,self.a
        local fnt,fnt_sz = self.fnt, self.fnt_sz
        -- Get mouse state ---------
              -- in element --------
              if self:mouseIN() then a=a+0.1 end
              -- in elm L_down -----
              if self:mouseDown() then a=a+0.2 end
              -- in elm L_up(released and was previously pressed) --
              if self:mouseClick() and self.onClick then self.onClick() end
        -- Draw btn body, frame ----
        gfx.set(r,g,b,a)    -- set body color
        self:draw_body()    -- body
        self:draw_frame()   -- frame
        -- Draw label --------------
        gfx.set(0.8, 0.8, 0.8, 1)   -- set label color
        gfx.setfont(1, fnt, fnt_sz) -- set label fnt
        self:draw_lbl()             -- draw lbl
    end
    
    
    
    ----------------------------------------------------------------------------------------------------
    ---   START   --------------------------------------------------------------------------------------
    ----------------------------------------------------------------------------------------------------
    ---   Buttons and Functions   ------------------------------------------------------------------
    ----------------------------------------------------------------------------------------------------
    local btn1 = Button:new(20,20,50,30, 0.3,0.3,0.3,1, "1","Arial",15, 0 )
    btn1.onClick =
    function ()
    reaper.Main_OnCommand(40781, 0)  ---Track: Select all tracks
    end
    
    local btn2 = Button:new(73,20,50,30, 0.3,0.3,0.3,1, "1/2","Arial",15, 0 )
    btn2.onClick =
    function ()
    reaper.Main_OnCommand(40780, 0)  ---Track: Select all tracks
    end
    
    
    local btn3 = Button:new(126,20,50,30, 0.3,0.3,0.3,1, "1/4","Arial",15, 0 )
    btn3.onClick =
    function ()
    reaper.Main_OnCommand(40779, 0)  ---Track: Select all tracks
    end
    
    local btn4 = Button:new(179,20,50,30, 0.3,0.3,0.3,1, "1/8","Arial",15, 0 )
    btn4.onClick =
    function ()
    reaper.Main_OnCommand(40778, 0)  ---Track: Select all tracks
    end
    
    local btn5 = Button:new(232,20,50,30, 0.3,0.3,0.3,1, "1/16","Arial",15, 0 )
    btn5.onClick =
    function ()
    reaper.Main_OnCommand(40776, 0)  ---Track: Select all tracks
    end
    
    local btn6 = Button:new(285,20,50,30, 0.3,0.3,0.3,1, "1/32","Arial",15, 0 )
    btn6.onClick =
    function ()
    reaper.Main_OnCommand(40775, 0)  ---Track: Select all tracks
    end
    
    local btn7 = Button:new(338,20,50,30, 0.3,0.3,0.3,1, "1/64","Arial",15, 0 )
    btn7.onClick =
    function ()
    reaper.Main_OnCommand(40774, 0)  ---Track: Select all tracks
    end
    
    local btn8 = Button:new(391,20,50,30, 0.3,0.3,0.3,1, "1/128","Arial",15, 0 )
    btn8.onClick =
    function ()
    reaper.Main_OnCommand(41047, 0)  ---Track: Select all tracks
    end
    
    local btn9 = Button:new(444,20,50,30, 0.3,0.3,0.3,1, "-3-","Arial",15, 0 )
    btn9.onClick =
    function ()
    reaper.Main_OnCommand(reaper.NamedCommandLookup('_SWS_AWTOGGLETRIPLET'), 0)
    end
    
    local Button_TB = {btn1,btn2,btn3,btn4,btn5,btn6,btn7,btn8,btn9}
    -----
    
    -----
    
    
    ----------------------------------------------------------------------------------------------------
    ---   Main DRAW function   -------------------------------------------------------------------------
    ----------------------------------------------------------------------------------------------------
    function DRAW()
        for key,btn     in pairs(Button_TB)   do btn:draw()    end
    end
    
    --------------------------------------------------------------------------------
    --   INIT   --------------------------------------------------------------------
    --------------------------------------------------------------------------------
    function Init()
        -- Some gfx Wnd Default Values --
        local R,G,B = 51,51,51               -- 0..255 form
        local Wnd_bgd = R + G*256 + B*65536  -- red+green*256+blue*65536
        local Wnd_Title = "Set Grid Toolbar"
        local Wnd_Dock,Wnd_X,Wnd_Y = 0,100,320
        Wnd_W,Wnd_H = 512,70 -- global values(used for define zoom level)
        -- Init window ------
        gfx.clear = Wnd_bgd 
        gfx.init( Wnd_Title, Wnd_W,Wnd_H, Wnd_Dock, Wnd_X,Wnd_Y )
        -- Init mouse last --
        last_mouse_cap = 0
        last_x, last_y = 0, 0
        mouse_ox, mouse_oy = -1, -1
    end
    ----------------------------------------
    --   Mainloop   ------------------------
    ----------------------------------------
    function mainloop()
        -- zoom level --
        Z_w, Z_h = gfx.w/Wnd_W, gfx.h/Wnd_H
        if Z_w<0.6 then Z_w = 0.6 elseif Z_w>2 then Z_w = 2 end
        if Z_h<0.6 then Z_h = 0.6 elseif Z_h>2 then Z_h = 2 end
        -- mouse and modkeys --
        if gfx.mouse_cap&1==1   and last_mouse_cap&1==0  or   -- L mouse
           gfx.mouse_cap&2==2   and last_mouse_cap&2==0  or   -- R mouse
           gfx.mouse_cap&64==64 and last_mouse_cap&64==0 then -- M mouse
           mouse_ox, mouse_oy = gfx.mouse_x, gfx.mouse_y
        end
        Ctrl  = gfx.mouse_cap&4==4
        Shift = gfx.mouse_cap&8==8
        Alt   = gfx.mouse_cap&16==16 -- Shift state
        -------------------------
        -- DRAW,MAIN functions --
          DRAW() -- Main()
        -------------------------
        -------------------------
        last_mouse_cap = gfx.mouse_cap
        last_x, last_y = gfx.mouse_x, gfx.mouse_y
        gfx.mouse_wheel = 0 -- reset gfx.mouse_wheel
        char = gfx.getchar()
        if char==32 then reaper.Main_OnCommand(40044, 0) end -- play
        if char==26 then reaper.Main_OnCommand(40029, 0)  end ---undo
        if char == 27 then gfx.quit() end   -- escape
        if char~=-1 then reaper.defer(mainloop) end          -- defer
        -----------
        gfx.update()
        -----------
    end
    --------------------------------------------------------------------------------
    --------------------------------------------------------------------------------
    --------------------------------------------------------------------------------
    ------
    Init()
    mainloop()
    

    Готов донатить.

    Задача - повторить скриптом то, что сейчас происходит в доке над окном скрипта:
     

    Вложения:

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

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    16.914
    Симпатии:
    9.168
    Пол:
    Мужской
    Адрес:
    Киев
    @Kokarev Maxim, боюсь Женю нужно простить. Или переписывать скрипт с нуля....
     
  20. Kokarev Maxim

    Kokarev Maxim ex cool

    Регистрация:
    13 май 2007
    Сообщения:
    3.975
    Симпатии:
    2.402
    Пол:
    Мужской
    Род занятий:
    freelance, mixing
    Адрес:
    Барнаул
    Обновление по скрипту тулбара.
    Нашёл простое и изящное решение - отображение статуса в окошке. Просто текст. Для этого я создал код, он работает как нужно - это смесь из кода @@Michael, и Lokasenna. Но, не могу его прикрутить к основному - если код вставлять тупо на каждую кнопку, то показания начинают наслаиваться друг на друга, или отображение начинается только после того, как нажму цифру 1... это всё не то.
    На скриншоте и в аттаче оба кода, которые готовы на данный момент:
    Set Grid Toolbar.lua - основной код/шаблон.
    Test.lua - код, который подхватывает статус Grid Division и выводит его при запуске.
    Задача - сделать так, чтобы в зелёном окошке основного кода отображался актуальный статус Grid Division - и при запуске скрипта, и при переключении кнопок. Я за эти два дня проделал много работы, но дальше методом тыка не продвинусь, всё ещё нуждаюсь в помощи того, кто разбирается.

    Untitled.jpg
     

    Вложения:

    • Scripts.zip
      Размер файла:
      3,4 КБ
      Просмотров:
      1
  21. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    16.914
    Симпатии:
    9.168
    Пол:
    Мужской
    Адрес:
    Киев
    @Kokarev Maxim, я могу написать этот скрипт, но с нуля. Может завтра выйдет.
    У Жени своеобразный подход к формированию таблиц и данных и с ним нужно сидеть и разбираться.... :(
     
    Kokarev Maxim нравится это.
  22. Kokarev Maxim

    Kokarev Maxim ex cool

    Регистрация:
    13 май 2007
    Сообщения:
    3.975
    Симпатии:
    2.402
    Пол:
    Мужской
    Род занятий:
    freelance, mixing
    Адрес:
    Барнаул
    Спасибо за обратную связь! Но, удивительное рядом, кажется, я сам разобрался. Уже почти сдался и в самый последний момент пришла идея, которая сработала :) Если всё получится, чуть позже расскажу историю и покажу готовый скрипт.
     
    Aleksandr Oleynik нравится это.
  23. EUGEN27771

    EUGEN27771 Well-Known Member

    Регистрация:
    23 апр 2010
    Сообщения:
    2.321
    Симпатии:
    1.963
    Пол:
    Мужской
    Подход как раз нормальный - доказано простотой, хотя глупо написано... но это была первая проба lua - сейчас глупо выглядит.
     
  24. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    16.914
    Симпатии:
    9.168
    Пол:
    Мужской
    Адрес:
    Киев
    Когда разобрался - возможно, но вот чтоб в код вставить то, что Максим попросил - я не смог.
     
  25. EUGEN27771

    EUGEN27771 Well-Known Member

    Регистрация:
    23 апр 2010
    Сообщения:
    2.321
    Симпатии:
    1.963
    Пол:
    Мужской
    Вы и другие варианты не сможете по-простому добавить. Берите любые - придется либо переписать....
    Поэтому, буквально через пару дней я понял - зачем открытые свойства - именно для реализации методов.
    Мой кот говорит - не заморачивай людей, но метатаблицы - это просто.
     
  26. EUGEN27771

    EUGEN27771 Well-Known Member

    Регистрация:
    23 апр 2010
    Сообщения:
    2.321
    Симпатии:
    1.963
    Пол:
    Мужской
    Любая п...бень в Луа - объект изначально. Когда мы вешаем свойства для таблицы - ничего не происходит особенного.
    Метатаблица означает только одно - поиск в ней будет выполняться в случае отсутствия ключей, вместо родной таблицы.
    --- добавлено 21 сен 2018 ---
    Интересно, поддерживает ли Луа многопоточность...
     
  27. Kokarev Maxim

    Kokarev Maxim ex cool

    Регистрация:
    13 май 2007
    Сообщения:
    3.975
    Симпатии:
    2.402
    Пол:
    Мужской
    Род занятий:
    freelance, mixing
    Адрес:
    Барнаул
    В общем, хэппи энд :)
    Успех пришёл, когда с горя я сел смотреть видео "Практическое применение скриптов в Reaper М.Пилявский ⁄ А.Разумов" и на меня снизошло прозрение :) Я, дуралей, пихал один и тот же код на каждую кнопку, а оказалось, что достаточно было один раз его в начале скрипта "инициализировать", а потом только функцию() вставлять в нужные места. Как всё просто оказалось. Ну, а по графической части, я просто брал части кода Евгения и адаптировал, просто подменяя слова. Была local Frame, добавилась local Text для моего кода, была
    for key,frame in pairs(Frame_TB) do frame:draw() end
    а добавилась моя строчка
    for key,text in pairs(Text_TB) do text:draw() end

    Я не уверен, на сколько это всё правильно, но оно работает как нужно, а это самое главное :) Вообще, удивительно, что этот франкенштейн из трёх разных кодов заработал :) Всё же шаблон Евгения хорош и имеет потенциал - там всё упорядочено и закомментировано, это хорошая основа. Коды Михаила и Lokasenna я смог найти через гугл, когда искал по конкретным командам. Ну и видео сильно помогло, всё же для новичка подобный материал с разбором на практике, очень полезен.

    Зачем мне нужен скрипт, который тупо повторяет то, что умеет обычный тулбар? Скрипт легко закрывается по Esc, когда не в фокусе. Тулбар - нет. Скрипт не занимает тулбары (кому-то их не хватает), и работает заметно быстрее, чем обычный интерфейс Рипера, что было неожиданностью. На гифке видно, как кнопки тулбара загораются с запозданием после нажатия.
    Планирую этот скрипт использовать шаблоном для других тулбаров.

    Код:
    --[[
      * Simple GUI template for scripts
      * Author: EUGEN27771
      * Author URI: http://forum.cockos.com/member.php?u=50462
      * Licence: GPL v3
      * Version: 1.0
      ]]
    
    --[[
      * Set Grid Toolbar.lua
      * Author: Kokarev Maxim
      * Author URI: http://rmmedia.ru/members/10967/
      * Licence: GPL v3
      * Version: 1.0
      ]]
    
    --------------------------- Get Grid State ---------------------------
    -----------------------Reference: mpl_Get project grid.lua-------------
    function GetProjectGrid()
      local grid_time,beats,measures,cml,grid_div
      grid_time = reaper.BR_GetNextGridDivision(0)
      beats, measures, cml = reaper.TimeMap2_timeToBeats(0, grid_time)
      if measures == 0 then
      grid_div = math.ceil(cml/beats)
      if grid_div % 3 == 0 then grid_string = "1/"..math.floor(grid_div/3*2).."T"
      else
      grid_string = "1/"..math.floor(grid_div)
      end
      else
      grid_string = measures
      end
      return grid_string
    end
    
    grid_str = GetProjectGrid()
    
    
    
    
    --------------------------------------------------------------------------------
    ---  Simple Element Class  ---------------------------------------------------
    --------------------------------------------------------------------------------
    local Element = {}
    function Element:new(x,y,w,h, r,g,b,a, lbl,fnt,fnt_sz, norm_val,norm_val2)
      local elm = {}
      elm.def_xywh = {x,y,w,h,fnt_sz} -- its default coord,used for Zoom etc
      elm.x, elm.y, elm.w, elm.h = x, y, w, h
      elm.r, elm.g, elm.b, elm.a = r, g, b, a
      elm.lbl, elm.fnt, elm.fnt_sz  = lbl, fnt, fnt_sz
      elm.norm_val = norm_val
      elm.norm_val2 = norm_val2
      ------
      setmetatable(elm, self)
      self.__index = self
      return elm
    end
    --------------------------------------------------------------
    --- Function for Child Classes(args = Child,Parent Class) ----
    --------------------------------------------------------------
    function extended(Child, Parent)
      setmetatable(Child,{__index = Parent})
    end
    --------------------------------------------------------------
    ---  Element Class Methods(Main Methods)  ------------------
    --------------------------------------------------------------
    function Element:update_xywh()
      if not Z_w or not Z_h then return end -- return if zoom not defined
      self.x, self.w = math.ceil(self.def_xywh[1]* Z_w) , math.ceil(self.def_xywh[3]* Z_w) -- upd x,w
      self.y, self.h = math.ceil(self.def_xywh[2]* Z_h) , math.ceil(self.def_xywh[4]* Z_h) -- upd y,h
      if self.fnt_sz then --fix it!--
      self.fnt_sz = math.max(9,self.def_xywh[5]* (Z_w+Z_h)/2)
      self.fnt_sz = math.min(22,self.fnt_sz)
      end   
    end
    ------------------------
    function Element:pointIN(p_x, p_y)
      return p_x >= self.x and p_x <= self.x + self.w and p_y >= self.y and p_y <= self.y + self.h
    end
    --------
    function Element:mouseIN()
      return gfx.mouse_cap&1==0 and self:pointIN(gfx.mouse_x,gfx.mouse_y)
    end
    ------------------------
    function Element:mouseDown()
      return gfx.mouse_cap&1==1 and self:pointIN(mouse_ox,mouse_oy)
    end
    --------
    function Element:mouseClick()
      return gfx.mouse_cap&1==0 and last_mouse_cap&1==1 and
      self:pointIN(gfx.mouse_x,gfx.mouse_y) and self:pointIN(mouse_ox,mouse_oy)   
    end
    ------------------------
    function Element:mouseR_Down()
      return gfx.mouse_cap&2==2 and self:pointIN(mouse_ox,mouse_oy)
    end
    --------
    function Element:mouseM_Down()
      return gfx.mouse_cap&64==64 and self:pointIN(mouse_ox,mouse_oy)
    end
    ------------------------
    function Element:draw_frame()
      local x,y,w,h  = self.x,self.y,self.w,self.h
      gfx.rect(x, y, w, h, false)  -- frame1
      gfx.rect(x, y, w, h, false) -- frame2  
     
    end
    
    function Element:draw_text()
      local x,y,w,h  = self.x,self.y,self.w,self.h
    
     
    end
    ----------------------------------------------------------------------------------------------------
    ---  Create Element Child Classes(Button)  -------------------------------------------
    ----------------------------------------------------------------------------------------------------
    local Button = {}
    local Frame = {}
    local Text = {}
    extended(Button,  Element)
    extended(Frame,  Element)
    extended(Text,  Element)
    
    --------------------------------------------------------------------------------  
    --------------------------------------------------------------------------------
    ---  Button Class Methods  ---------------------------------------------------
    --------------------------------------------------------------------------------
    function Button:draw_body()
      gfx.rect(self.x,self.y,self.w,self.h, true) -- draw btn body
    end
    --------
    function Button:draw_lbl()
      local x,y,w,h  = self.x,self.y,self.w,self.h
      local lbl_w, lbl_h = gfx.measurestr(self.lbl)
      if self:mouseDown() then gfx.set(0.3, 0.3, 0.3, 1) end --  text tint when pressing the button
      gfx.x = x+(w-lbl_w)/2; gfx.y = y+(h-lbl_h)/2
      gfx.drawstr(self.lbl)
    end
    ------------------------
    function Button:draw()
      self:update_xywh() -- Update xywh(if wind changed)
      local r,g,b,a  = self.r,self.g,self.b,self.a
      local fnt,fnt_sz = self.fnt, self.fnt_sz
      -- Get mouse state ---------
      -- in element --------
      if self:mouseIN() then a=a+0.5 end -- button tint when hover
      -- in elm L_down -----
      if self:mouseDown() then a=a+4.8 end -- button tint when pressing
      -- in elm L_up(released and was previously pressed) --
      if self:mouseClick() and self.onClick then self.onClick() end
      -- Draw btn body, frame ----
      gfx.set(r,g,b,a)  -- set body color
      self:draw_body()  -- body
      self:draw_frame()  -- frame
      self:draw_text()  -- text
      -- Draw label --------------
      gfx.set(0.8, 0.8, 0.8, 1)  -- set label color (button text color)
      gfx.setfont(1, fnt, fnt_sz) -- set label fnt
      self:draw_lbl()  -- draw lbl
    end
    
    --------------------------------------------------------------------------------
    --------------------------------------------------------------------------------
    ---  Frame Class Methods  -----------------------------------------------------
    --------------------------------------------------------------------------------
    function Frame:draw()
      self:update_xywh() -- Update xywh(if wind changed)
      local r,g,b,a  = self.r,self.g,self.b,self.a
    --  if self:mouseIN() then a=a+0.9 end --frame tint when pressed
      gfx.set(r,g,b,a)  -- set frame color
      self:draw_frame()  -- draw frame
    end
    
    
    ---------------------- Main Window and Text Output ---------------------
    function Text:draw()
    gfx.setfont(1, "HaxrCorp S12", 12)
    gfx.set(0.8,0.7,0.3,1)
    local str_w, str_h = gfx.measurestr(grid_string)
    local x,y,w,h  = self.x,self.y,self.w,self.h
    self.x, self.w = math.ceil(self.def_xywh[1]* Z_w) , math.ceil(self.def_xywh[3]* Z_w) -- upd x,w
    self.y, self.h = math.ceil(self.def_xywh[2]* Z_h) , math.ceil(self.def_xywh[4]* Z_h) -- upd y,h
      if self.fnt_sz then --fix it!--
      self.fnt_sz = math.max(9,self.def_xywh[5]* (Z_w+Z_h)/2)
      self.fnt_sz = math.min(22,self.fnt_sz)
      end   
    gfx.x = x+(w - str_w) / 2
    gfx.y = y+(h - str_h) / 2
    gfx.drawstr(grid_string)
    
    end
    
    
    ----------------------------------------------------------------------------------------------------
    ---  START  --------------------------------------------------------------------------------------
    ----------------------------------------------------------------------------------------------------
    ---  Buttons and Functions  ------------------------------------------------------------------
    ----------------------------------------------------------------------------------------------------
    local btn1 = Button:new(73,20,50,30, 0.3,0.3,0.3,1, "1","HaxrCorp S12",15, 0 )
    btn1.onClick =
    function ()
    reaper.Main_OnCommand(40781, 0)  ---Grid: Set to 1
    GetProjectGrid()
    
    end
    
    local btn2 = Button:new(126,20,50,30, 0.3,0.3,0.3,1, "1/2","HaxrCorp S12",15, 0 )
    btn2.onClick =
    function ()
    reaper.Main_OnCommand(40780, 0)  ---Grid: Set to 1/2
    GetProjectGrid()
    
    end
    
    
    local btn3 = Button:new(179,20,50,30, 0.3,0.3,0.3,1, "1/4","HaxrCorp S12",15, 0 )
    btn3.onClick =
    function ()
    reaper.Main_OnCommand(40779, 0)  ---Grid: Set to 1/4
    GetProjectGrid()
    
    end
    
    local btn4 = Button:new(232,20,50,30, 0.3,0.3,0.3,1, "1/8","HaxrCorp S12",15, 0 )
    btn4.onClick =
    function ()
    reaper.Main_OnCommand(40778, 0)  ---Grid: Set to 1/8
    GetProjectGrid()
    
    end
    
    local btn5 = Button:new(285,20,50,30, 0.3,0.3,0.3,1, "1/16","HaxrCorp S12",15, 0 )
    btn5.onClick =
    function ()
    reaper.Main_OnCommand(40776, 0)  ---Grid: Set to 1/16
    GetProjectGrid()
    
    end
    
    local btn6 = Button:new(338,20,50,30, 0.3,0.3,0.3,1, "1/32","HaxrCorp S12",15, 0 )
    btn6.onClick =
    function ()
    reaper.Main_OnCommand(40775, 0)  ---Grid: Set to 1/32
    GetProjectGrid()
    
    end
    
    local btn7 = Button:new(391,20,50,30, 0.3,0.3,0.3,1, "1/64","HaxrCorp S12",15, 0 )
    btn7.onClick =
    function ()
    reaper.Main_OnCommand(40774, 0)  ---Grid: Set to 1/64
    GetProjectGrid()
    
    end
    
    local btn8 = Button:new(444,20,50,30, 0.3,0.3,0.3,1, "1/128","HaxrCorp S12",15, 0 )
    btn8.onClick =
    function ()
    reaper.Main_OnCommand(41047, 0)  ---Grid: Set to 1/128
    GetProjectGrid()
    
    end
    
    local btn9 = Button:new(498,20,50,30, 0.3,0.3,0.3,1, "-3-","HaxrCorp S12",15, 0 )
    btn9.onClick =
    function ()
    reaper.Main_OnCommand(reaper.NamedCommandLookup('_SWS_AWTOGGLETRIPLET'), 0) --- Toggle triplets
    GetProjectGrid()
    
    end
    
    local Button_TB = {btn1,btn2,btn3,btn4,btn5,btn6,btn7,btn8,btn9}
    -----
    local W_Frame = Frame:new(20,20,50,30,  0,0.5,0,0.4 )
    local Frame_TB = {W_Frame}
    -----
    local W_Text = Text:new(20,20,50,30,  0,0.5,0,0.4 )
    local Text_TB = {W_Text}
    
    ----------------------------------------------------------------------------------------------------
    ---  Main DRAW function  -------------------------------------------------------------------------
    ----------------------------------------------------------------------------------------------------
    function DRAW()
      for key,btn  in pairs(Button_TB)  do btn:draw()  end
      for key,frame  in pairs(Frame_TB)  do frame:draw()  end
      for key,text  in pairs(Text_TB)  do text:draw()  end
    end
    
    --------------------------------------------------------------------------------
    --  INIT  --------------------------------------------------------------------
    --------------------------------------------------------------------------------
    function Init()
      -- Some gfx Wnd Default Values --
      local R,G,B = 51,51,51  -- 0..255 form (background color)
      local Wnd_bgd = R + G*256 + B*65536  -- red+green*256+blue*65536  
      local Wnd_Title = "Set Grid Toolbar" -- Main title
      local Wnd_Dock,Wnd_X,Wnd_Y = 0,350,200
      Wnd_W,Wnd_H = 567,70 -- global values(used for define zoom level)
      -- Init window ------
      gfx.clear = Wnd_bgd   
      gfx.init( Wnd_Title, Wnd_W,Wnd_H, Wnd_Dock, Wnd_X,Wnd_Y )
      -- Init mouse last --
      last_mouse_cap = 0
      last_x, last_y = 0, 0
      mouse_ox, mouse_oy = -1, -1
    end
    ----------------------------------------
    
    
    
    
    
    
    --  Mainloop  ------------------------
    ----------------------------------------
    function mainloop()
      -- zoom level --
      Z_w, Z_h = gfx.w/Wnd_W, gfx.h/Wnd_H
      if Z_w<0.6 then Z_w = 0.6 elseif Z_w>2 then Z_w = 2 end
      if Z_h<0.6 then Z_h = 0.6 elseif Z_h>2 then Z_h = 2 end
      -- mouse and modkeys --
      if gfx.mouse_cap&1==1  and last_mouse_cap&1==0  or  -- L mouse
      gfx.mouse_cap&2==2  and last_mouse_cap&2==0  or  -- R mouse
      gfx.mouse_cap&64==64 and last_mouse_cap&64==0 then -- M mouse
      mouse_ox, mouse_oy = gfx.mouse_x, gfx.mouse_y
      end
      Ctrl  = gfx.mouse_cap&4==4
      Shift = gfx.mouse_cap&8==8
      Alt  = gfx.mouse_cap&16==16 -- Shift state
      -------------------------
      -- DRAW,MAIN functions --
      DRAW() -- Main()
      -------------------------
      -------------------------
      last_mouse_cap = gfx.mouse_cap
      last_x, last_y = gfx.mouse_x, gfx.mouse_y
      gfx.mouse_wheel = 0 -- reset gfx.mouse_wheel
      char = gfx.getchar()
      if char==32 then reaper.Main_OnCommand(40044, 0) end -- play
      if char==26 then reaper.Main_OnCommand(40029, 0)  end -- undo
      if char == 27 then gfx.quit() end  -- escape
      if char~=-1 then reaper.defer(mainloop) end  -- defer
      -----------  
      gfx.update()
      -----------
     
    
    end
    --------------------------------------------------------------------------------
    --------------------------------------------------------------------------------
    --------------------------------------------------------------------------------
    ------
    Init()
    mainloop()
    
    


    Финальная версия выглядит и работает так:
    set_grid_lua_final.gif
     
    mindcube нравится это.
  28. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    16.914
    Симпатии:
    9.168
    Пол:
    Мужской
    Адрес:
    Киев
    @Kokarev Maxim, но он не повторяет то, что на тулюаре. В нём совершенно лишнее окно, в котором выводится выбранный размер, а не подсвечивается нажатый.
     
  29. Kokarev Maxim

    Kokarev Maxim ex cool

    Регистрация:
    13 май 2007
    Сообщения:
    3.975
    Симпатии:
    2.402
    Пол:
    Мужской
    Род занятий:
    freelance, mixing
    Адрес:
    Барнаул
    По основной задаче я не получил помощи, пришлось её упростить (в посте #870 я описывал второй вариант решения) и сделать самому. Выбора у меня не было :) По функционалу, минимализму и информативности, этого достаточно. И это максимум, на что я способен, я не программист.
     
  30. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    16.914
    Симпатии:
    9.168
    Пол:
    Мужской
    Адрес:
    Киев
    @Kokarev Maxim, ни кто за ранее не знает, на что он способен :)
    Вам масштабируемость GUI реально нужна?
     
  31. Kokarev Maxim

    Kokarev Maxim ex cool

    Регистрация:
    13 май 2007
    Сообщения:
    3.975
    Симпатии:
    2.402
    Пол:
    Мужской
    Род занятий:
    freelance, mixing
    Адрес:
    Барнаул
    Нет, совсем не нужна. Она была в шаблоне Евгения, я просто сохранил исходные данные.
     
  32. Snjuk

    Snjuk Member

    Регистрация:
    10 июн 2014
    Сообщения:
    48
    Симпатии:
    16
    Пол:
    Мужской
    Адрес:
    Житомир UA
    Здравствуйте Возникла такая проблема
    некоторые скрипты были в нижнем доке ,после добавления тулбаров (уже >10) скрипты стали открываться справа
    редактирование gfx.dock(0x901) не помогает
    как закинуть скрипты вниз
     
  33. Alexmolecul

    Alexmolecul Active Member

    Регистрация:
    19 апр 2010
    Сообщения:
    280
    Симпатии:
    86
    Пол:
    Мужской
    Род занятий:
    vk.com/alexmoleculprod moleculband.ru
    Адрес:
    Moscow
    @EUGEN27771, Script: gen_Vox-Deess Enveloper.lua не срабатывает Снимок экрана 2018-09-27 в 12.27.07.png . Рипер последней версии, мак ос, в чем может быть проблема?
     

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