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

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

  1. Alex_V

    Alex_V Active Member

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

    Пока я вижу, что если кто хочет хоть какой-то гуй в скрипте, он его рисует сам, как может. Либо какую-то готовую библиотеку на Lua (разной степени убогости) использует. Это означает только одно - никаких стандартных элементов нет. И поэтому, в частности, приходится разбираться, как с подгружаемыми png-шками работать.
     
  2. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

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

    Alex_V Active Member

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


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

    Aleksandr Oleynik Well-Known Member

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

    Alex_V Active Member

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

    Aleksandr Oleynik Well-Known Member

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

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

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

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    14.311
    Симпатии:
    7.202
    Пол:
    Мужской
    Адрес:
    Киев
    Пример скрипта - 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 в 15:35
  8. elektrozz

    elektrozz Active Member

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

    Alex_V Active Member

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

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

    Aleksandr Oleynik Well-Known Member

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

    EUGEN27771 Well-Known Member

    Регистрация:
    23 апр 2010
    Сообщения:
    2.194
    Симпатии:
    1.836
    Пол:
    Мужской
    @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. Все это нужно разгрести, собрать в кучу основное, допилить, привести в порядок.
     
  12. Alex_V

    Alex_V Active Member

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

    EUGEN27771 Well-Known Member

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

    Alex_V Active Member

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

    EUGEN27771 Well-Known Member

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

    Alex_V Active Member

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

    Aleksandr Oleynik Well-Known Member

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

    EUGEN27771 Well-Known Member

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

    Alex_V Active Member

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

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

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

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