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

borisuperful

Well-Known Member
31 Янв 2013
1.339
482
83
@Aleksandr Oleynik, я без библиотек имел в виду :) Как на будущее
На самом деле мне не понятен больше процесс присваивания мыши к кнопкам. Чтобы потом от этого отталкиваться при запуске функций
 

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
18.546
10.582
113
57
Киев
forum.videoediting.ru
я без библиотек имел в виду :) Как на будущее
Так после создания GUI из библиотеки - смотрите код и повторяя его ручками учитесь.
Тоже самое можно делать по любым чужим скриптам, выбираф в начале по проще.
Обучалок не найдёте, только вот это -
https://forum.cockos.com/showthread.php?t=176662&highlight
 
  • Like
Реакции: Archchie и PianoIst

Archchie

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

borisuperful

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

Archchie

Well-Known Member
24 Окт 2017
822
450
63
@borisuperful, Методом тыка учись тогда, возьми нарисуй квадратик, потом покрась этот квадратик, потом заставь под мышью цвет менять и т.д.
на первой страницы в принципе, что ссылку дал Александр, все это описано понятно, а вот дальше непонятно - если мета таблицы не знаешь, вот поучись пока рисовать, рисовать научишься, потом будешь думать как это заставить все работать. Рисовать в принципе не сложно, сложно заставить это все работать, но все равно сначала надо научится рисовать.:)
____________
Ха-ха смешно: Сам не умею с графикой работать, зато сижу учу тебя. :)
 
Последнее редактирование:

Archchie

Well-Known Member
24 Окт 2017
822
450
63
На самом деле мне не понятен больше процесс присваивания мыши к кнопкам. Чтобы потом от этого отталкиваться при запуске функций
Поразбирай вот этот кусок пост #3 тут Женя все подробно расписал - все понятно
 
  • Like
Реакции: borisuperful

borisuperful

Well-Known Member
31 Янв 2013
1.339
482
83
@EUGEN27771, очень интересно про gfx, а нет ли случайно того самого продолжения? Хотелось бы узнать про то, как сделать строчку, в которой мы вводим числовые или буквенные данные
 

Archchie

Well-Known Member
24 Окт 2017
822
450
63
@borisuperful, Строчка делается примерно, как то, так - но на вряд ли ты тут с ходу что то поймешь, это надо сидеть и разбираться с кодом(учить сам язык, читать документацию).
Надо с простого к сложному, а эта строчка уже не просто.
upload_2019-1-27_4-40-31.png
PHP:
    local function gfxSaveScrin_buf( buf,w,h);
        gfx.dest = buf;
        gfx.setimgdim(buf, -1, -1);
        gfx.setimgdim(buf, w, h);
        gfx.a = 1;
    end;
    ---

    local function gfxRestScrin_buf(buf,x,y,w,h);
        gfx.dest = -1;
        gfx.a = 1;
        gfx.blit(buf,1,0, x,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,x = 0,"",0;
            for _, code in utf8.codes(s)do;
                c = c + 1;if not j or j<0 then;j = c+i;x=1;end;
                if c >= i and c <= j then;local symb = utf8.char(code);str = str..symb;end;
                if x == 1 then j = nil end;
            end;
            return str;
        end
        ------------------

        x = (x + 2); w = (w - 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 + 1, utf8.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 + 1, utf8.len(Nabirat_Text));
            end;
            pressed = true;
        end;
        -----------------------------------
 
        gfxSaveScrin_buf(1023,gfx.w,gfx.h);
 
        ---/ поле ввода /-/ input field /---               
        gfx.set(0.32, 0.31, 0.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 = x + gfx.measurestr(Sub(Nabirat_Text,1,CaretPos));
        if (car_x-x) >= (w) then;
             Text_x = (w+x)+x - car_x;
             car_x=(w + x);
        end;
        -------------------------------
 
        -------/ Text /-----------------
        gfx.setfont(1,"Verdana", h/1.15);
        gfx.x = Text_x; gfx.y = y;
        gfx.set(0.11, 0.11, 0.11);
        gfx.drawstr(Nabirat_Text);
        --------------------------
   
        -------/ BlinkingCursor /---------------------
        if not tonumber(flicker) then flicker = 0 end;
        if  pressed == true then flicker = 0 end;
        if flicker < 15 then; -- мерцание
            gfx.set(0,0,0);
            gfx.rect(car_x, y+5, 1, h-10);
        end;
        flicker = flicker < 30 and flicker + 1 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,110, 0.3,0.3,0.3,1)           
         GetSetInputText(15, 15,300,25)
         gfx.x = 345; gfx.y = 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()
Но было бы не плохо увидеть полноценный урок по работе с графикой:)
 
Последнее редактирование:
  • Like
Реакции: borisuperful

borisuperful

Well-Known Member
31 Янв 2013
1.339
482
83
@Archchie, да, вижу, непросто :) Правда буквы в моем случае не в планах, хватит цифр. А так вся таблица ASCII причем может быть для двух раскладок. Для кириллической получается гемор с присвоением каждой буквы, что и вижу, а для латиницы хватает интервала между крайними значениями :)
Буду копать...
 
Последнее редактирование:

EUGEN27771

Well-Known Member
23 Апр 2010
2.289
1.969
113
Нет возможности, к сожалению. Вкратце - нужно ловить кадры и состояния между кадрами сравнивать. То есть, для того, чтобы узнать что происходит с мышью, клавишами, нужно проверить, изменилось ли состояние и определить, что именно изменилось. Единственное, что могу сказать, где-то в теме здесь проскочила мысль про иерархии в интерфейсе и тп - не тратьте время, это проверено. Сейчас со стороны смотрю.
Более того, чем проще, тем лучше. И это уже общая тенденция, одна страница.
 

Alex Fduch

New Member
12 Июл 2013
2
3
3
40
Москва
Подскажите пожалуйста, есть ли возможность решить следующую задачу:
Есть трек. На треке несколько айтемов. под треком открыт Envelope line (к примеру громкость). Курсор находится на Envelop line. Как мне получить item, который находится над курсором, пока мышь остается на envelop line?
 

Archchie

Well-Known Member
24 Окт 2017
822
450
63
Как мне получить item, который находится над курсором, пока мышь остается на envelop line?
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 i = 1, reaper.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);
 

Archchie

Well-Known Member
24 Окт 2017
822
450
63
upload_2019-2-12_0-16-1.png

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

zenykmusic

Member
16 Авг 2018
122
2
18
39
2.png Почему у всех файлов эта ошибка,и как это исправить.Установил питон думал что это в нем дело,но нет. Спасибо
 

Archchie

Well-Known Member
24 Окт 2017
822
450
63
Возможно ли как то скриптом перезапустить рипер?
 

Archchie

Well-Known Member
24 Окт 2017
822
450
63
Привет. Подскажите кто-нибудь. Как получить на выделенном канале данные отмеченные на картинке?
Есть канал. Нужно получить из Receives номера стерео каналов. Копал в сторону reaper.BR_GetSetTrackSendInfo и I_DSTCHAN, но чето получить внятное не удалось.
Посмотреть вложение 159305
@J T, Значения возвращаются индексами "Стерео от 0 до 1024","моно от 1024 до 2048" и т.д.
Если надо получить значения в удобочитаемой форме, т.е. как на скриншоте, то на держи.
Функция возвращает только Mono и Stereo, с Multichannel не заморачивался, дальше если нужно, думаю и сам разберешься
PHP:
local f = function(Track,idx_receive);
    local S = reaper.GetTrackSendInfo_Value(Track,-1,idx_receive,"I_SRCCHAN");
    if S < 1024 and S >= 0 then;
        return math.ceil(S+1) ..'/'..math.ceil(S+2);
    elseif S >= 1024 and S < 2048 then;
        return math.ceil(S-1023);
    end;
    return -1;
end;


Test =  f(Track,0);
 
  • Like
Реакции: J T и vitalker

Сейчас онлайн (Пользователей: 0, Гостей: 1)