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

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

  1. incubator

    incubator Active Member

    Регистрация:
    24 янв 2007
    Сообщения:
    410
    Симпатии:
    174
    Адрес:
    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.744
    Симпатии:
    9.878
    Пол:
    Мужской
    Адрес:
    Киев
    @incubator, ID узнать автоматом нельзя.
    А с dofile - то решение, что написал бы открыв комп - это оно!
     
  3. @Michael

    @Michael Well-Known Member

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

    Aleksandr Oleynik Well-Known Member

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

    @Michael Well-Known Member

    Регистрация:
    14 дек 2010
    Сообщения:
    885
    Симпатии:
    1.342
    Пол:
    Мужской
    Адрес:
    Орёл / Москва
    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.744
    Симпатии:
    9.878
    Пол:
    Мужской
    Адрес:
    Киев
    @@Michael, Это имя по ID, а нужно наоборот.
     
  7. @Michael

    @Michael Well-Known Member

    Регистрация:
    14 дек 2010
    Сообщения:
    885
    Симпатии:
    1.342
    Пол:
    Мужской
    Адрес:
    Орёл / Москва
    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.383
    Симпатии:
    2.176
    Пол:
    Мужской
    Род занятий:
    Alpha Mix Records
    Ребята, подскажите. Как выделить самый первый айтем трека без снятия выделения на таймлане и переходов? Вроде обсмотрел все, не могу найти похожего экшена...
    --------------
    Вопрос снят. нашел )
     
  9. Archchie

    Archchie Well-Known Member

    Регистрация:
    24 окт 2017
    Сообщения:
    541
    Симпатии:
    303
    Пол:
    Мужской
    Подскажите кто знает как работать с gfx.blit(), то есть не как работать, а как осуществить вот такое и возможно ли это?
    Нашел от Михаила описание
    @Michael сказал(а): Blit примерно так работает:
    PHP:
    if update_gfx then -- cначала определяем триггерпо которому в какой-либо из буферов будет писаться графика
        gfx
    .dest -- номер буфера 1..32 (кажется)
        
    gfx.setimgdim(1, -1, -1) -- этим я сбрасываю графику внутри этого буфераиначе она будет писаться поверх тогочто уже есть
        gfx
    .setimgdim(1wh) -- определяем размеры записываемой графики
        gfx
    .1
        gfx
    .rect(0,0w,h) -- рисуем что требуется
    end


    gfx
    .dest = -1  -- -это основной слой
    gfx
    .-- альфа для буферов
    gfx
    .blit(110, -- этим вытаскиваем первый буфер и сразу его переворачиваем/обрезаем/сжимаем при необходимости
              0
    ,0,w,h,
              
    0,0,w,h,0,0)
    Вроде все понятно, но по этому описанию я могу сохранить графику только от 0, то есть "x, y" у нас всегда ноль gif 1 и картинка сохраняется всегда от левого верхнего угла.
    Вопрос: А как сохранить кусок с права gif_2 или например кусок в центре gif_3. Как задать координаты иксу и игреку?
     

    Вложения:

    • gif_1.png
      gif_1.png
      Размер файла:
      2,7 КБ
      Просмотров:
      14
    • gif_1.png
      gif_1.png
      Размер файла:
      2,7 КБ
      Просмотров:
      14
    • gif_2.png
      gif_2.png
      Размер файла:
      5,7 КБ
      Просмотров:
      14
    • gif_3.png
      gif_3.png
      Размер файла:
      3,8 КБ
      Просмотров:
      14
    Последнее редактирование: 27 янв 2019
  10. @Michael

    @Michael Well-Known Member

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

    EUGEN27771 Well-Known Member

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

    incubator Active Member

    Регистрация:
    24 янв 2007
    Сообщения:
    410
    Симпатии:
    174
    Адрес:
    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 Well-Known Member

    Регистрация:
    24 окт 2017
    Сообщения:
    541
    Симпатии:
    303
    Пол:
    Мужской
    Код:
      
    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
    Сообщения:
    410
    Симпатии:
    174
    Адрес:
    Spb
    @Archchie, Спасибо Артем все просто было оказываеться, а всякую математику сложноую стал разводить и циклы - безрезультатно)) У тебя явный талант к програмированию.Думаю если ты начнешь изучать с++ то будешь творить невероятные вещи!)
     
    Archchie нравится это.
  15. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

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

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

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

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

    PianoIst Well-Known Member

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

    Aleksandr Oleynik Well-Known Member

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

    PianoIst Well-Known Member

    Регистрация:
    19 май 2010
    Сообщения:
    2.995
    Симпатии:
    2.461
    Пол:
    Мужской
    Род занятий:
    Аранжировка, солист-пинанист
    Адрес:
    Новосибирск
    @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.744
    Симпатии:
    9.878
    Пол:
    Мужской
    Адрес:
    Киев
    ОК. Я бы и сам справился с таким скриптом, но совершенно не знаю как подступиться к действиям, которые нужно из Рипера делать скриптом вне Рипера.
    есть какие-то приметивные API-шки стандартных команд в операционке с файлами, но их похоже будет не достаточно, или прийдётся ставить какую-то доп программу внешнюю, которая будет следить за проектом Рипера и делать с ним уже всё прочее, что связанно с облаком, версиями и прочим - ну и формировать какой-то текстовый файл, который будет читать скрипт в Рипере.
     
    PianoIst нравится это.
  20. borisuperful

    borisuperful Well-Known Member

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

    Aleksandr Oleynik Well-Known Member

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

    borisuperful Well-Known Member

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

    Aleksandr Oleynik Well-Known Member

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

    Archchie Well-Known Member

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

    borisuperful Well-Known Member

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

    Archchie Well-Known Member

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

    Archchie Well-Known Member

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

    borisuperful Well-Known Member

    Регистрация:
    31 янв 2013
    Сообщения:
    1.257
    Симпатии:
    444
    @EUGEN27771, очень интересно про gfx, а нет ли случайно того самого продолжения? Хотелось бы узнать про то, как сделать строчку, в которой мы вводим числовые или буквенные данные
     
  29. Archchie

    Archchie Well-Known Member

    Регистрация:
    24 окт 2017
    Сообщения:
    541
    Симпатии:
    303
    Пол:
    Мужской
    @borisuperful, Строчка делается примерно, как то, так - но на вряд ли ты тут с ходу что то поймешь, это надо сидеть и разбираться с кодом(учить сам язык, читать документацию).
    Надо с простого к сложному, а эта строчка уже не просто.
    upload_2019-1-27_4-40-31.png
    PHP:
        local function gfxSaveScrin_bufbuf,w,h);
            
    gfx.dest buf;
            
    gfx.setimgdim(buf, -1, -1);
            
    gfx.setimgdim(bufwh);
            
    gfx.1;
        
    end;
        ---

        
    local function gfxRestScrin_buf(buf,x,y,w,h);
            
    gfx.dest = -1;
            
    gfx.1;
            
    gfx.blit(buf,1,0x,y,w,h,x,y,w,h,0,0);
        
    end;
        --======================================================


        
    local CaretPos,Nabirat_Text,Text_x,car_x,flicker;
        
    local function GetSetInputText(x,y,w,h,Press_OK);
        
    gfx.setfont(1,"Verdana"h/1.15);
            -------------------------
            
    local function Sub(s,i,j);
                
    local c,str,0,"",0;
                for 
    _code in utf8.codes(s)do;
                    
    1;if not j or j<0 then;c+i;x=1;end;
                    if 
    >= and <= j then;local symb utf8.char(code);str str..symb;end;
                    if 
    == 1 then j nil end;
                
    end;
                return 
    str;
            
    end
            
    ------------------

            
    = (2); = (5);
                 
            
    local Rus_char = {  [184]='ё',[224]='а',[225]='б',[226]='в',[227]='г',[228]='д',[229]='е',[230]='ж',
            [
    231]='з',[232]='и',[233]='й',[234]='к',[235]='л',[236]='м',[237]='н',[238]='о',[239]='п',[240]='р',
            [
    241]='с',[242]='т',[243]='у',[244]='ф',[245]='х',[246]='ц',[247]='ч',[248]='ш',[249]='щ',[250]='ъ',
            [
    251]='ы',[252]='ь',[253]='э',[254]='ю',[255]='я',[168]='Ё',[192]='А',[193]='Б',[194]='В',[195]='Г',
            [
    196]='Д',[197]='Е',[198]='Ж',[199]='З',[200]='И',[201]='Й',[202]='К',[203]='Л',[204]='М',[205]='Н',
            [
    206]='О',[207]='П',[208]='Р',[209]='С',[210]='Т',[211]='У',[212]='Ф',[213]='Х',[214]='Ц',[215]='Ч',
            [
    216]='Ш',[217]='Щ',[218]='Ъ',[219]='Ы',[220]='Ь',[221]='Э',[222]='Ю',[223]='Я'}
     
            if 
    not Nabirat_Text then Nabirat_Text =("")end;
            if 
    not CaretPos then CaretPos =(utf8.len(""))end;
            
    local Enter,pressed,char false,false,gfx.getchar();
            if 
    Press_OK == 1 then Enter true end;
     
            if 
    char 0 then;
                if 
    char == 13 then; -- "Enter"
                    
    Enter true;
                elseif 
    char == 1818584692 then; -- left <
                    
    CaretPos math.min(math.max(CaretPos-1,0), utf8.len(Nabirat_Text));
                elseif 
    char == 1919379572 then; -- right >
                    
    CaretPos math.min(math.max(CaretPos+1,0),utf8.len(Nabirat_Text));
                elseif 
    char == 8 then; -- "Backspace ←"
                    
    if CaretPos 0 then;
                        
    Nabirat_Text Sub(Nabirat_Text,1,CaretPos-1)..Sub(Nabirat_Text,CaretPos+1,-1);
                        
    CaretPos math.min(math.max((CaretPos-1),0), utf8.len(Nabirat_Text));
                    
    end;
                elseif 
    char == 6579564 then; -- Delete
                    Nabirat_Text 
    Sub(Nabirat_Text,1,CaretPos)..Sub(Nabirat_Text,CaretPos+2,-1);
                elseif 
    char 31 and char 127 then; -- Input_Text   
                    Nabirat_Text 
    Sub(Nabirat_Text,1,CaretPos)..string.char(char)..Sub(Nabirat_Text,CaretPos+1,utf8.len(Nabirat_Text));
                    
    CaretPos math.min(CaretPos 1utf8.len(Nabirat_Text));
                elseif 
    char 127 and char 256 then; -- Input_Text_Cyrillic
                    Nabirat_Text 
    Sub(Nabirat_Text,1,CaretPos)..Rus_char[char]..Sub(Nabirat_Text,CaretPos+1,utf8.len(Nabirat_Text));
                    
    CaretPos math.min(CaretPos 1utf8.len(Nabirat_Text));
                
    end;
                
    pressed true;
            
    end;
            -----------------------------------
     
            
    gfxSaveScrin_buf(1023,gfx.w,gfx.h);
     
            ---/ 
    поле ввода /-/ input field /---               
            
    gfx.set(0.320.310.3);
            
    gfx.rect(x-2,y,w+5,h);-- прямоуг
            gfx
    .set(0.7,0.7,0.7);
            
    gfx.rect(x,y+2,w+1,h-4);-- прямоуг
            
    ---------------------------------
     
            ------/ 
    MovingText /-------------
            
    Text_x x;
            
    car_x gfx.measurestr(Sub(Nabirat_Text,1,CaretPos));
            if (
    car_x-x) >= (wthen;
                 
    Text_x = (w+x)+car_x;
                 
    car_x=(x);
            
    end;
            -------------------------------
     
            -------/ 
    Text /-----------------
            
    gfx.setfont(1,"Verdana"h/1.15);
            
    gfx.Text_xgfx.y;
            
    gfx.set(0.110.110.11);
            
    gfx.drawstr(Nabirat_Text);
            --------------------------
       
            -------/ 
    BlinkingCursor /---------------------
            if 
    not tonumber(flickerthen flicker 0 end;
            if  
    pressed == true then flicker 0 end;
            if 
    flicker 15 then; -- мерцание
                gfx
    .set(0,0,0);
                
    gfx.rect(car_xy+51h-10);
            
    end;
            
    flicker flicker 30 and flicker or 0;
            --------------------------------------------
     
            
    gfxRestScrin_buf(1023,x-2,y,w+5,h);
     
            ------/ 
    Рамка /-/ Frame /-------                 
            
    gfx.set(0.7,0.7,0.7);
            
    gfx.rect(x-2,y,w+5,h,0); -- прямоуг рамка
            
    -----------------------------------------
     
            
    gfx.set(0,0,0);
            if 
    Enter == true then return Nabirat_Text end;
            ----------------------------------------------
        
    end
        
    --================================================


        function 
    mainloop()
             
    gfx.gradrect(0,0,400,1100.3,0.3,0.3,1)           
             
    GetSetInputText(1515,300,25)
             
    gfx.345gfx.85;
             
    gfx.set(0.7,0.7,0.7,0.4);
             
    gfx.setfont(1,"Tahoma",17,105);
             
    gfx.drawstr("Archie.");
             
    reaper.defer(mainloop)
        
    end

        gfx
    .init("Archie_User_Input",400,110,0,80,150)
        
    mainloop()
    Но было бы не плохо увидеть полноценный урок по работе с графикой:)
     
    Последнее редактирование: 26 янв 2019
    borisuperful нравится это.
  30. borisuperful

    borisuperful Well-Known Member

    Регистрация:
    31 янв 2013
    Сообщения:
    1.257
    Симпатии:
    444
    @Archchie, да, вижу, непросто :) Правда буквы в моем случае не в планах, хватит цифр. А так вся таблица ASCII причем может быть для двух раскладок. Для кириллической получается гемор с присвоением каждой буквы, что и вижу, а для латиницы хватает интервала между крайними значениями :)
    Буду копать...
     
    Последнее редактирование: 26 янв 2019
  31. EUGEN27771

    EUGEN27771 Well-Known Member

    Регистрация:
    23 апр 2010
    Сообщения:
    2.282
    Симпатии:
    1.957
    Пол:
    Мужской
    Нет возможности, к сожалению. Вкратце - нужно ловить кадры и состояния между кадрами сравнивать. То есть, для того, чтобы узнать что происходит с мышью, клавишами, нужно проверить, изменилось ли состояние и определить, что именно изменилось. Единственное, что могу сказать, где-то в теме здесь проскочила мысль про иерархии в интерфейсе и тп - не тратьте время, это проверено. Сейчас со стороны смотрю.
    Более того, чем проще, тем лучше. И это уже общая тенденция, одна страница.
     
  32. Alex Fduch

    Alex Fduch New Member

    Регистрация:
    11 июл 2013
    Сообщения:
    2
    Симпатии:
    3
    Адрес:
    Москва
    Подскажите пожалуйста, есть ли возможность решить следующую задачу:
    Есть трек. На треке несколько айтемов. под треком открыт Envelope line (к примеру громкость). Курсор находится на Envelop line. Как мне получить item, который находится над курсором, пока мышь остается на envelop line?
     
  33. Archchie

    Archchie Well-Known Member

    Регистрация:
    24 окт 2017
    Сообщения:
    541
    Симпатии:
    303
    Пол:
    Мужской
    PHP:
    local function GetItemUnderMouseCursorOfEnvelope(Envelope);
        
    local Alloc reaper.BR_EnvAlloc(Envelope,false);
        
    local tr reaper.BR_EnvGetParentTrack(Alloc);
        
    reaper.BR_EnvFree(Alloc,false);
        
    local PosCur reaper.BR_PositionAtMouseCursor(true);
        for 
    1reaper.CountTrackMediaItems(tr) do;
           
    local it reaper.GetTrackMediaItem(tr,i-1);
           
    local PosIt reaper.GetMediaItemInfo_Value(it,"D_POSITION");
           
    local LenIt reaper.GetMediaItemInfo_Value(it,"D_LENGTH");
           if 
    PosIt PosCur and PosIt LenIt PosCur then;
           return 
    it;
           
    end;
        
    end;
        return -
    1;
    end;


    -- 
    Пример:

    local Envelope reaper.GetSelectedEnvelope(0);
    local Item GetItemUnderMouseCursorOfEnvelope(Envelope);
    reaper.SelectAllMediaItems(0,0);
    reaper.SetMediaItemSelected(Item,1);
     
  34. Archchie

    Archchie Well-Known Member

    Регистрация:
    24 окт 2017
    Сообщения:
    541
    Симпатии:
    303
    Пол:
    Мужской
    upload_2019-2-12_0-16-1.png

    Поставил галку, нажал кнопку (а нажал не то что нужно) - теперь выбор запомнился и окно больше не выскакивает.
    Вопрос: Подскажите пожалуйста кто знает, где хранится информация о сохранении, что нужно сделать, удалить, что бы сохранение аннулировалось и это окно по новой стало появляться ???
    Переименовать скрипт - Не подходит.
    СПАСИБО!
    __________________________
    P.S. Разобрался - "reaper-kb.ini"
    ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
     
    Последнее редактирование: 11 фев 2019
  35. zenykmusic

    zenykmusic Member

    Регистрация:
    16 авг 2018
    Сообщения:
    102
    Симпатии:
    2
    Пол:
    Мужской
    2.png Почему у всех файлов эта ошибка,и как это исправить.Установил питон думал что это в нем дело,но нет. Спасибо
     
  36. Archchie

    Archchie Well-Known Member

    Регистрация:
    24 окт 2017
    Сообщения:
    541
    Симпатии:
    303
    Пол:
    Мужской
    Возможно ли как то скриптом перезапустить рипер?
     
  37. PianoIst

    PianoIst Well-Known Member

    Регистрация:
    19 май 2010
    Сообщения:
    2.995
    Симпатии:
    2.461
    Пол:
    Мужской
    Род занятий:
    Аранжировка, солист-пинанист
    Адрес:
    Новосибирск
    @Archchie, я бы копал в сторону запуска команд терминала (командной строки) средствами ЯП. Через Python можно сделать точно. на счет lua – хз
     
    Archchie нравится это.
  38. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

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

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