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

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

  1. incubator

    incubator Active Member

    Регистрация:
    24 янв 2007
    Сообщения:
    392
    Симпатии:
    161
    Адрес:
    Spb
    вот так reaper.Main_OnCommand(reaper.NamedCommandLookup('_RSada20633a8d9576327cdedd9526f6dc9e195fd28'), 0) или так например с путем


    local info = debug.getinfo(1,'S');
    script_path = info.source:match[[^@?(.*[\/])[^\/]-$]]
    dofile(script_path .. "/Nantho_PeakVsRMS/spk77_Get max peak val and pos from take_function.lua")
     
    Archchie и Aleksandr Oleynik нравится это.
  2. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    17.289
    Симпатии:
    9.550
    Пол:
    Мужской
    Адрес:
    Киев
    @incubator, ID узнать автоматом нельзя.
    А с dofile - то решение, что написал бы открыв комп - это оно!
     
  3. @Michael

    @Michael Well-Known Member

    Регистрация:
    14 дек 2010
    Сообщения:
    867
    Симпатии:
    1.315
    Пол:
    Мужской
    Адрес:
    Орёл / Москва
    get_action_context()
     
  4. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    17.289
    Симпатии:
    9.550
    Пол:
    Мужской
    Адрес:
    Киев
    @@Michael, это если скрипт запущен.
    А как по имени скрипта узнать его ID?
     
  5. @Michael

    @Michael Well-Known Member

    Регистрация:
    14 дек 2010
    Сообщения:
    867
    Симпатии:
    1.315
    Пол:
    Мужской
    Адрес:
    Орёл / Москва
    PHP:
    function GetScriptNameByID(ID)
      
    local fpcont reaper.GetResourcePath()..'/reaper-kb.ini'
      
    local f io.open(fp'a+')
      if 
    not f then return else cont f:read('a'f:close() end
      
    return cont:match(ID:match('[%a%d]+')..'%s"(.-)".-\n')
    end

    scriptname 
    GetScriptNameByID('_RS5a9b832ada3f7ee194cb55a9e2e504626cd6a546')
     
    Archchie нравится это.
  6. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    17.289
    Симпатии:
    9.550
    Пол:
    Мужской
    Адрес:
    Киев
    @@Michael, Это имя по ID, а нужно наоборот.
     
  7. @Michael

    @Michael Well-Known Member

    Регистрация:
    14 дек 2010
    Сообщения:
    867
    Симпатии:
    1.315
    Пол:
    Мужской
    Адрес:
    Орёл / Москва
    PHP:
    function GetIDByScriptName(scriptname)
      
    local fpcont reaper.GetResourcePath()..'/reaper-kb.ini'
      
    local f io.open(fp'a+')
      if 
    not f then return else cont f:read('a'f:close() end
      scriptname 
    scriptname:gsub('Script:%s' ,''):gsub("[%(%)%.%%%+%-%*%?%[%]%^%$]", function(c) return "%" .. c end)
      for 
    line in cont:gmatch('[^\r\n]+') do if line:match(scriptnamethen return line:match('RS[%a%d]+'end end
    end

    ID 
    GetIDByScriptName('Script: Argitoth_Select items with color of selected items.eel')
     
    Aleksandr Oleynik и Archchie нравится это.
  8. Намасте_намасте

    Намасте_намасте Well-Known Member

    Регистрация:
    21 ноя 2016
    Сообщения:
    2.193
    Симпатии:
    2.019
    Пол:
    Мужской
    Род занятий:
    Alpha Mix Records
    Ребята, подскажите. Как выделить самый первый айтем трека без снятия выделения на таймлане и переходов? Вроде обсмотрел все, не могу найти похожего экшена...
    --------------
    Вопрос снят. нашел )
     
  9. Archchie

    Archchie Active Member

    Регистрация:
    24 окт 2017
    Сообщения:
    428
    Симпатии:
    239
    Пол:
    Мужской
    Подскажите кто знает как работать с gfx.blit(), то есть не как работать, а как осуществить вот такое и возможно ли это?
    Нашел от Михаила описание
    Вроде все понятно, но по этому описанию я могу сохранить графику только от 0, то есть "x, y" у нас всегда ноль gif 1 и картинка сохраняется всегда от левого верхнего угла.
    Вопрос: А как сохранить кусок с права gif_2 или например кусок в центре gif_3. Как задать координаты иксу и игреку?
     

    Вложения:

    • gif_1.png
      gif_1.png
      Размер файла:
      2,7 КБ
      Просмотров:
      12
    • gif_1.png
      gif_1.png
      Размер файла:
      2,7 КБ
      Просмотров:
      12
    • gif_2.png
      gif_2.png
      Размер файла:
      5,7 КБ
      Просмотров:
      12
    • gif_3.png
      gif_3.png
      Размер файла:
      3,8 КБ
      Просмотров:
      12
  10. @Michael

    @Michael Well-Known Member

    Регистрация:
    14 дек 2010
    Сообщения:
    867
    Симпатии:
    1.315
    Пол:
    Мужской
    Адрес:
    Орёл / Москва
    Первая пара XY координат у gfx.blit (координаты исходника относительно окна ReaScript GUI)
     
    Archchie нравится это.
  11. EUGEN27771

    EUGEN27771 Well-Known Member

    Регистрация:
    23 апр 2010
    Сообщения:
    2.321
    Симпатии:
    1.972
    Пол:
    Мужской
    Есть нечто интересное, может быть... Я хочу оставить пару вещей.
    Об этом говорили на кокосовском форуме, мне трудно там ответить обстоятельно, так сказать.
    Там вопрос про массивы был. Есть у нас менеджеры памяти, даже несколько вариантов.
    А когда у нас в руках память - у нас есть и все остальное. По сути дела - дин. распределение памяти решает все вопросы.
    И все это очень красиво сходится. Почему же это никто не выложил?
    Потому что пц. Графика идет отдельно, и все может развалиться, отдельный поток...
     
    PianoIst нравится это.
  12. incubator

    incubator Active Member

    Регистрация:
    24 янв 2007
    Сообщения:
    392
    Симпатии:
    161
    Адрес:
    Spb
    Друзья помогите пожалуйста запутался в трех соснах. Хотел сделать горизонтальный drag zoom для мидиредактора. Сообразил как взять начальную точку когда сделан щелчок и потом вычслить разницу при горизонтальном оттяге мыши, но как правильно встроить сам зум не соображу и что бы когда мышка остановилась то остановить зум. И если опять начала движение не отпуская конопки то возбновить зум.
    Код:
    function msg(m)
      reaper.ShowConsoleMsg(tostring(m) .. "\n")
    end
    
    on=0
    move=0
    
    function main()
    
    state =  reaper.JS_Mouse_GetState(1) 
    if state > 0 then
    
    if on==0 then x = reaper.GetMousePosition() end
    x1 = reaper.GetMousePosition()
    on=1
    diff = (x1-x)*0.01
    
    msg(diff)
    
    --reaper.Main_OnCommand(1012, 0)
    
    else
    on=0
    end
    
    reaper.defer(main)
    end
    
    
    main()
    
    
     
  13. Archchie

    Archchie Active Member

    Регистрация:
    24 окт 2017
    Сообщения:
    428
    Симпатии:
    239
    Пол:
    Мужской
    Код:
      
    function msg(m)
      reaper.ShowConsoleMsg(tostring(m) .. "\n")
    end
    
    on=0
    move=0
    
    
    function main()
    if not bla then bla = 0 end 
    if not diff then diff = 0 end
    state =  reaper.JS_Mouse_GetState(1) 
    if state > 0 then
    
    if on==0 then x = reaper.GetMousePosition() end
    x1 = reaper.GetMousePosition()
    on=1
    diff = (x1-x)*0.01
    
    msg(diff)
    if diff ~= bla then
       
        midieditor = reaper.MIDIEditor_GetActive()
        if diff < bla then
            --reaper.Main_OnCommand(1011, 0)
            reaper.MIDIEditor_OnCommand( midieditor,1011)
        else
            --reaper.Main_OnCommand(1012, 0)
            reaper.MIDIEditor_OnCommand( midieditor,1012)
        end   
    bla = diff
    end
    
    else
    on=0
    diff=0
    bla=0
    end
    
    reaper.defer(main)
    end
    
    
    main()
    
    
     
    Последнее редактирование: 4 дек 2018
    incubator нравится это.
  14. incubator

    incubator Active Member

    Регистрация:
    24 янв 2007
    Сообщения:
    392
    Симпатии:
    161
    Адрес:
    Spb
    @Archchie, Спасибо Артем все просто было оказываеться, а всякую математику сложноую стал разводить и циклы - безрезультатно)) У тебя явный талант к програмированию.Думаю если ты начнешь изучать с++ то будешь творить невероятные вещи!)
     
    Archchie нравится это.
  15. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    17.289
    Симпатии:
    9.550
    Пол:
    Мужской
    Адрес:
    Киев
    Есть такая идея - создать инструмет, который бы позволял работать над одним проектом группе людей.
    Применений может быть много, но меня интересует работа над созданием композиции группой музыкантов удалённо.
    Когда кто-то выкладывает основную тему и все остальные дописывают, доаранжировывают её самостоятельно и удалённо.

    Понятно, что проект и айтемы нужно заливать куда то в облако. Также нужно, открыв проект и запустив скрипт видеть, что по отношению к текущемму проекту в облаке произошли изменения и кто эти изменения из группы внёс.

    Я не совладаю с такой задачей, а был бы очень не плохой инструмент.

    Материал, для экономии места в облаке, можно было бы коныертить в mp3 при отправке--синхронизации.
     
    Последнее редактирование: 14 янв 2019 в 15:14
  16. PianoIst

    PianoIst Well-Known Member

    Регистрация:
    19 май 2010
    Сообщения:
    2.898
    Симпатии:
    2.374
    Пол:
    Мужской
    Род занятий:
    Аранжировка, солист-пинанист
    Адрес:
    Новосибирск
    @Aleksandr Oleynik, мне кажется в базе решения должна быть некая система контроля версий, типа git.
    Это не столько задача для ReaScript, сколько более глобальная задача контроля версий для проектов с объемными данными. На самом деле, я уже полгода иногда думаю, как бы она могла выглядеть, но ничего конкретного пока не приходит в голову...
     
    Archchie нравится это.
  17. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    17.289
    Симпатии:
    9.550
    Пол:
    Мужской
    Адрес:
    Киев
    @PianoIst, я это вижу на много проще.
    При начале работы с локальным проектом, скрипт сравнивает его версию по времени и по автору с тем, что в облаке.
    Паралельно пишется база небольшая синхронизаций, где есть всего лишь время и автор.
    Скрипт и проект свежий тянет из облака и базу показывает - кто и когда проект обновлял.
    А обновляется он перед закрытием локального проекта.
    Ещё можно сделать так, что по сути у каждого музыканта будет свой проект, как саб проект общего. Тогда можно сделать так, что по сути править проекты будет каждый свои, но сможет слышать итоговый просчитанный проект коллеги в общем миксе.
    Тогда можно будет СВОЙ проект, с многими айтемами и обработками и прочим, хранить только локально, а в облако заливать только отрендерённый саб проект, как одну дорожку.
     
    Последнее редактирование: 14 янв 2019 в 19:31
    PianoIst нравится это.
  18. PianoIst

    PianoIst Well-Known Member

    Регистрация:
    19 май 2010
    Сообщения:
    2.898
    Симпатии:
    2.374
    Пол:
    Мужской
    Род занятий:
    Аранжировка, солист-пинанист
    Адрес:
    Новосибирск
    @Aleksandr Oleynik, Тогда, в принципе, можно думать про что-то вроде diff-view для мастер-проекта, который будет хранить ревизии саб-проектов (причем, учитывая, что саб-проектов вряд ли будет больше 10, можно их хранить не в mp3 а сразу в wavpack).
    Давай мы эту мысль обмозгуем числа после 8-го фервраля? нарисуем и заведем на гитхабе досточку?
    Кстати, https://ru.stackoverflow.com/questions/519283/Как-использовать-git-для-контроля-версий-в-unity3d
     
    Aleksandr Oleynik нравится это.
  19. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    17.289
    Симпатии:
    9.550
    Пол:
    Мужской
    Адрес:
    Киев
    ОК. Я бы и сам справился с таким скриптом, но совершенно не знаю как подступиться к действиям, которые нужно из Рипера делать скриптом вне Рипера.
    есть какие-то приметивные API-шки стандартных команд в операционке с файлами, но их похоже будет не достаточно, или прийдётся ставить какую-то доп программу внешнюю, которая будет следить за проектом Рипера и делать с ним уже всё прочее, что связанно с облаком, версиями и прочим - ну и формировать какой-то текстовый файл, который будет читать скрипт в Рипере.
     
    PianoIst нравится это.
  20. borisuperful

    borisuperful Well-Known Member

    Регистрация:
    31 янв 2013
    Сообщения:
    1.165
    Симпатии:
    405
    Доброго времени суток всем! Подскажите, где можно набраться азов в gfx рипера? Может какое-то более подробное описание функций есть. Или может не на рипере. Интересует только создание кнопок, галок и строка для ввода.
     
  21. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    17.289
    Симпатии:
    9.550
    Пол:
    Мужской
    Адрес:
    Киев
    @borisuperful, так есть же на оффоруме конструктор
     
  22. borisuperful

    borisuperful Well-Known Member

    Регистрация:
    31 янв 2013
    Сообщения:
    1.165
    Симпатии:
    405
    @Aleksandr Oleynik, я без библиотек имел в виду :) Как на будущее
    На самом деле мне не понятен больше процесс присваивания мыши к кнопкам. Чтобы потом от этого отталкиваться при запуске функций
     
  23. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    17.289
    Симпатии:
    9.550
    Пол:
    Мужской
    Адрес:
    Киев
    Так после создания GUI из библиотеки - смотрите код и повторяя его ручками учитесь.
    Тоже самое можно делать по любым чужим скриптам, выбираф в начале по проще.
    Обучалок не найдёте, только вот это -
    https://forum.cockos.com/showthread.php?t=176662&highlight
     
    Archchie и PianoIst нравится это.
  24. Archchie

    Archchie Active Member

    Регистрация:
    24 окт 2017
    Сообщения:
    428
    Симпатии:
    239
    Пол:
    Мужской
    Анализировать чужие скрипты!
    Но как мне кажется, то можешь даже не браться за графику пока не натаскался с языком там все сложно (90 процентов графики рисуется с помощью одной функции gfx.rect или gfx.line и заставляешь это все шевелится при помощи условий и математики ) , практикуйся на простых скриптах, когда самостоятельно напишешь штук десять скриптов, вникнешь в сам язык (самостоятельно это: с нуля и до конца, а не дергая куски с других скриптов), то тогда и можешь уже думать о графике, а пока ты с простыми скриптами не можешь разобраться, то в графике ты просто-напросто сразу утонешь(запутаешься).
    Нельзя учится от сложного к легкому, то есть ты сначала хочешь пойти в 11 класс, а потом в 10 и только потом в первый :), но так не бывает :(.
    __________________________________________________________________________________________________________
    А что бы вникнуть в язык, то вот тебе простой совет, заканчивай дергать куски(функции) из других скриптов и собирать таким способом скрипт, ничего из этого хорошего не выйдет, ведь ты не знаешь какие ошибки в этой функции есть, это знает только разработчик, вот ты взял функцию с одного скрипта, взял вторую,третью, четвертую, в каждой есть какие то ошибки - которые не являлись ошибками в родных скриптах, ты это сложил у себя в скрипте и получил супер баг - который ты никогда не исправишь.
    Так вот: Совет такой - поставь себе цель сделать какой либо скрипт(простой естественно) и начни его делать, непосредственно ты застрянешь вскоре на чем нибудь,застрял - начинай сам искать ответ, читать документацию "lua" или "eel"(что тебе по душе),не нашел спроси здесь - самое главное вникнуть в сам смысл "как это работает". И так штук 10 и вникнешь в процесс, ну а потом и функции можешь дергать, дернул посмотрел что не так - поправил под свой скрипт и ни каких ошибок, про которые ты некогда не узнаешь.
    Ну и только потом уже можно задумываться о какой либо графике. Как то так ;).
    _____________________________________________________________
    В этой теме что дал ссылку @Aleksandr Oleynik, ты подавно не разберешься, там даже @@Michael сначала не разобрался, потом не знаю.
    Мета таблицы: - это совсем не просто.
     
    Последнее редактирование: 15 янв 2019 в 19:07
    PianoIst нравится это.
  25. borisuperful

    borisuperful Well-Known Member

    Регистрация:
    31 янв 2013
    Сообщения:
    1.165
    Симпатии:
    405
    Я через простые прошел уже :) То есть написанных с нуля у меня больше 10 скриптов. Но они именно что простые :) Состоящие типа из простых циклов, API функций, либо условий.
    Если ты про рендер скрипты, где я дернул код для bypass эффектов и копированием автоматизаций - то я очень долго смотрел этот код, кроме того довольно сильно корректировал и нашел например баг, который был изначально в оригинале кода и поправил его :) Или же в случае с bypass я создал два варианта функции, одна для восстановления эффектов для предыдущего трека, а другая для текущего (в случае cancel render) :) Поэтому я с этим очень внимателен.
     
    Последнее редактирование: 15 янв 2019 в 19:22
    Archchie нравится это.
  26. Archchie

    Archchie Active Member

    Регистрация:
    24 окт 2017
    Сообщения:
    428
    Симпатии:
    239
    Пол:
    Мужской
    @borisuperful, Методом тыка учись тогда, возьми нарисуй квадратик, потом покрась этот квадратик, потом заставь под мышью цвет менять и т.д.
    на первой страницы в принципе, что ссылку дал Александр, все это описано понятно, а вот дальше непонятно - если мета таблицы не знаешь, вот поучись пока рисовать, рисовать научишься, потом будешь думать как это заставить все работать. Рисовать в принципе не сложно, сложно заставить это все работать, но все равно сначала надо научится рисовать.:)
    ____________
    Ха-ха смешно: Сам не умею с графикой работать, зато сижу учу тебя. :)
     
    Последнее редактирование: 15 янв 2019 в 19:39
    Aleksandr Oleynik и borisuperful нравится это.
  27. Archchie

    Archchie Active Member

    Регистрация:
    24 окт 2017
    Сообщения:
    428
    Симпатии:
    239
    Пол:
    Мужской
    Поразбирай вот этот кусок пост #3 тут Женя все подробно расписал - все понятно
     
    borisuperful нравится это.

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