Помогите создать экшн / кастом экшн / скрипт (1 онлайн

Archie's

Well-Known Member
24 Окт 2017
1.936
1.296
113
@dhfotybt,
Например в Контакт загружен бас и сохранен там в FX Chain. Поэтому мне нужно прописать точное название типа: Rename track to Modern Bass. Как это можно сделать?
Загрузи свой Контакт, выдели его и нажми F2, появится окно для переименования Fx, переименуй его и сохрани по новой как FX Chain.
Или в конец кастома добавь скрипт Archie_Fx; Rename last FX in selected tracks name n.lua
 

Archie's

Well-Known Member
24 Окт 2017
1.936
1.296
113
Делаю Cycle Ation. Insert Track, потом Rec-Arm, потом Record Mode MIDI Overdub, потом Kontakt с загруженным нужным инструментом сохраненный как FX Chain.
В этом случае действительно будет лучше и правильнее сохранить трек темплейт, а не FX Chain и не городить кастом/цикл-экшены.
 

Elijah K

Well-Known Member
25 Дек 2017
1.577
1.101
113
43
Тамбов
Настраиваю Рипер для работы с видео. Очень удобно нарезать comps в нем, как и с аудио. Но когда дорожки нарезаны, требуется снова сделать explode, чтобы на дороги повесить эффекты отдельно. И соответственно нужно, как то перед тем как делать explode, удалить неактивные тейки, чтобы explode был с пустотой.
Как то вижу несколько вариантов, но все нужно допиливать.
Например, есть экшн - clear active takes. Работает как нужно, но удалить нужно не АКТИВНЫЕ, а наоборот НЕАКТИВНЫЕ тейки. То есть нужно либо придумать как инвертировать активность тейков, либо как сделать clear inactive takes. Ведь такого экшена нет.
Еще вариант изначально задавать всем айтемам определенный цвет. После того, как все тейки выбраны, раскрасить их другим цветом. А при наличии скрипта типа "clear takes by custom color" удалить не нужные тейки.
То есть смысл в том, как очистить Comps от неактивных тейков. А это два варианта какие приходят в голову, чтобы это реализовать, но которых нет ни в экшенах ни в скриптах на сегодняшний день. Либо я не нашел, конечно
 

Elijah K

Well-Known Member
25 Дек 2017
1.577
1.101
113
43
Тамбов
Неа. Тогда скропятся все айтемы в один нарезанный на эту же дорожку. А нужно чтобы тейки из первого айтема в итоге ушли на свою дорожку, а второго, например, на свою. Тогда они будут воспроизводиться по очереди, но каждый на своей дорожке. Это как бы в аудио бессмысленно айтемы в нарезках отдельно обрабатывать обычно, а здесь видео и смена ракурса, например, должна быть с другой обработкой.
 

Elijah K

Well-Known Member
25 Дек 2017
1.577
1.101
113
43
Тамбов
По моему лучше обработки вешать на айтемы, копировать обработки с одного айтема на другой перетаскиванием.
А потом, если цветокор не подошел, придется открывать все обработки в каждом тейке и перекручивать. В том и смысл, чтобы иметь возможность на дорожку кинуть fx для тейков из 3-го, например, айтема.
 

Antonio

Well-Known Member
9 Ноя 2003
4.384
1.589
113
48
Алматы
если цветокор не подошел, придется открывать все обработки в каждом тейке и перекручивать.
Не уверен, но кажется можно найти более эффективный способ. Типа выделить айтемы, удалить с них все эффекты, потом скопировать нужный эффект, вставить во все выделенные айтемы.

А нужно чтобы тейки из первого айтема в итоге ушли на свою дорожку, а второго, например, на свою.
Для этого есть экшен Xenakios/SWS: Spread selected items over tracks... К сожалению он работает только если трэки созданы заранее и скорее всего он не умеет перемещать айтемы из одного тэйка на одну дорожку.
 

Mr_Tsonts

Well-Known Member
18 Апр 2019
1.656
1.341
113
56
Киев
Неа. Тогда скропятся все айтемы в один нарезанный на эту же дорожку. А нужно чтобы тейки из первого айтема в итоге ушли на свою дорожку, а второго, например, на свою. Тогда они будут воспроизводиться по очереди, но каждый на своей дорожке. Это как бы в аудио бессмысленно айтемы в нарезках отдельно обрабатывать обычно, а здесь видео и смена ракурса, например, должна быть с другой обработкой.
Не совсем понял, но себе сделал экшн Explode activ takes, который выводит активные тейки в отдельные айтемы, может так надо?
 

Вложения

Elijah K

Well-Known Member
25 Дек 2017
1.577
1.101
113
43
Тамбов
Ага... Надо, чтобы неактивные тейки остались, но там типа было пусто?
Ну да. Оставить активные, а вместо неактивных пусто. Типа Clear inactive takes. Есть экшн Clear active takes и он бы сработал, но тогда нужен хотя бы экшн инвертации неактивных в активные, для последующего очищения.
 
Последнее редактирование:

Mr_Tsonts

Well-Known Member
18 Апр 2019
1.656
1.341
113
56
Киев
Ну да. Оставить активные, а вместо неактивных пусто. Типа Clear inactive takes. Есть экшн Clear active takes и он бы сработал, но тогда нужен хотя бы экшн инвертации неактивных в активные, для последующего очищения.
А по сколько там тейков в айтемах? По 2, по 3? Можно же создать из всех комбинаций компы, потом методом некст комп сделать неактивные активными, очистить и вернуться к нужной таким же способом. Есть же ещё некст тейк экшн и обратно.
Просто, если во всех айтемах равное количество тейков то не вижу вообще проблем. Все айтемы выделить и некст тейк - клер актив тейк.
 
Последнее редактирование:

Elijah K

Well-Known Member
25 Дек 2017
1.577
1.101
113
43
Тамбов
187615

Вот, что требуется в итоге. Пока что раскрасил активные тейки, сделал explode и в ручную удалил не цветные.
 

Elijah K

Well-Known Member
25 Дек 2017
1.577
1.101
113
43
Тамбов
А по сколько там тейков в айтемах? По 2, по 3? Можно же создать из всех комбинаций компы, потом методом некст комп сделать неактивные активными, очистить и вернуться к нужной таким же способом. Есть же ещё некст тейк экшн и обратно.
Просто, если во всех айтемах равное количество тейков то не вижу вообще проблем. Все айтемы выделить и некст тейк - клер актив тейк.
Либо я не понял, либо не работает ((
 

Archie's

Well-Known Member
24 Окт 2017
1.936
1.296
113
@Elijah K,

PHP:
    --=========================================
    local function MODULE(file);
       local E,A=pcall(dofile,file);if not(E)then;reaper.ShowConsoleMsg("\n\nError - "..debug.getinfo(1,'S').source:match('.*[/\\](.+)')..'\nMISSING FILE / ОТСУТСТВУЕТ ФАЙЛ!\n'..file:gsub('\\','/'))return;end;
       if not A.VersArcFun("3.0.1",file,'')then;A=nil;return;end;return A;
    end; local Arc = MODULE((reaper.GetResourcePath()..'/Scripts/Archie-ReaScripts/Functions/Arc_Function_lua.lua'):gsub('\\','/'));
    if not Arc then return end;
    local ArcFileIni = reaper.GetResourcePath():gsub('\\','/')..'/reaper-Archie.ini';
    --=========================================
    
    
    
    -------------------------------------------------------
    local function copyTake(item,idxTake,destItem,newItem);
        --POOL=true;
        local retval,str = reaper.GetItemStateChunk(item,'',false);
        if idxTake == 0 then;
            ----
            local TK,X;
            local STR = '';
            for val in string.gmatch(str,".-\n") do;
                ----
                if POOL ~= true then;
                    val = val:gsub('^%s-POOLEDEVTS%s+%{.+%}','POOLEDEVTS '..reaper.genGuid(''));
                end;
                val = val:gsub('^%s-GUID%s+%{.+%}','GUID '..reaper.genGuid(''));
                ----
                if val:match('^TAKE%s-\n')or
                   val:match('^TAKE%s+SEL%s-\n')then;
                    X = true;
                end;
                ---
                if val:match('^TAKE%s+SEL%s-\n')then;TK = 'TAKE\n'break end;
                ---
                if X ~= true then; STR = (STR or '')..val; end;
            end;
            ----
            if STR ~= '' and STR ~= str then STR = STR..'\n>\n'; end;
            -----
            local D;
            local STR2 = '';
            for val in string.gmatch(STR,".-\n") do;
                if D==true then;STR2 = STR2..val;end;
                if val:match('^IGUID')then;
                    D=true;
                end;
            end;
            -----
            local retval,str2 = reaper.GetItemStateChunk(destItem,'',false);
            local STR3;
            if newItem == true then;
                local D;
                local STR = '';
                for val in string.gmatch(str2,".-\n") do;
                    if val:match('^IGUID')then;
                        D=true;
                    end;
                    STR3 = (STR3 or '')..val;
                    if D==true then;break;end;
                end;
                STR3 = STR3..STR2;
            else;
                TK = TK or 'TAKE SEL\n';
                STR2 = TK..STR2;
                STR3 = str2:gsub('>%s-\n-%s-$',STR2..'\n%0');
            end;
            reaper.SetItemStateChunk(destItem,STR3,false);
            ----
        elseif idxTake > 0 then;
            ----
            local STR = '';
            local x = 0;
            for val in string.gmatch(str,".-\n") do;
                if val:match('^TAKE%s-\n')or 
                   val:match('^TAKE%s+SEL%s-\n')then;
                   x = x+1;
                end;
                ---
                if x == idxTake then;
                    STR = (STR or '')..val;
                end;
                if x > idxTake then break end;
            end;
            ---
            local STR2 = '';
            local x = 0;
            for val in string.gmatch(STR,".-\n") do;
                if val:match('^<')then x=x+1 end;
                if val:match('^>')then x=x-1 end;
                if x < 0 then val = '' x=0 end;
                ----
                if POOL ~= true then;
                    val = val:gsub('^%s-POOLEDEVTS%s+%{.+%}','POOLEDEVTS '..reaper.genGuid(''));
                end;
                val = val:gsub('^%s-GUID%s+%{.+%}','GUID '..reaper.genGuid(''));
                ----
                STR2 = STR2..val;
            end;
            ----
            if STR2 and STR2 ~= '' then;
                local retval,str = reaper.GetItemStateChunk(destItem,'',false);
                local STR3 = '';
                if newItem == true then;
                    ----
                    for val in string.gmatch(str,".-\n") do;
                        if val:match('^IGUID')then;
                            break;
                        end;
                        STR3 = STR3..val;
                    end;
                    STR2 = STR2:gsub('^%s-TAKE%s-[SEL]*%s-\n','');
                    STR3 = STR3..'\n'..STR2..'\n>';
                else;
                    STR3 = str:gsub('>%s-\n-%s-$',STR2..'\n%0');
                end;
                reaper.SetItemStateChunk(destItem,STR3,false);
            end;
        end;
    end;
    -------------------------------------------------------
    
    
    
    local CountSelTrack = reaper.CountSelectedTracks(0);
    if CountSelTrack == 0 then no_undo()return end;
    
    
    for t_idx = 1,CountSelTrack do;
        
        local trackSel = reaper.GetSelectedTrack(0,t_idx-1);
        local CountTrItem = reaper.CountTrackMediaItems(trackSel);
        if CountTrItem > 0 then;
            ----
            if not UNDO then;
                reaper.Undo_BeginBlock();
                reaper.PreventUIRefresh(1);
                UNDO = true;
            end;
            ----
            local numb = reaper.GetMediaTrackInfo_Value(trackSel,'IP_TRACKNUMBER');
            local maxtake;
            for i = 1,CountTrItem do;
                local item = reaper.GetTrackMediaItem(trackSel,i-1);
                local counttake = reaper.CountTakes(item);
                maxtake = math.max(counttake,(maxtake or 0));
            end;
            
            for i = 1,maxtake do;
                reaper.InsertTrackAtIndex(i-1+numb,false);
            end;
            
            for i = 1,CountTrItem do;
                local item = reaper.GetTrackMediaItem(trackSel,i-1);
                local take = reaper.GetActiveTake(item);
                local nmbTake = reaper.GetMediaItemTakeInfo_Value(take,'IP_TAKENUMBER');
                local track = reaper.GetTrack(0,numb+nmbTake);
                
                local pos = reaper.GetMediaItemInfo_Value(item,'D_POSITION');
                local len = reaper.GetMediaItemInfo_Value(item,'D_LENGTH');
                local itemNew = reaper.CreateNewMIDIItemInProj(track,pos,pos+len,false);
                copyTake(item,nmbTake,itemNew,true);
            end;
        end;
    end;
    
    if UNDO then;
        reaper.Undo_EndBlock("Copy Take &&&",-1);
        reaper.PreventUIRefresh(-1);
    else;
        no_undo();
    end;
    
    reaper.UpdateArrange();
 

Elijah K

Well-Known Member
25 Дек 2017
1.577
1.101
113
43
Тамбов
@Elijah K,

PHP:
    --=========================================
    local function MODULE(file);
       local E,A=pcall(dofile,file);if not(E)then;reaper.ShowConsoleMsg("\n\nError - "..debug.getinfo(1,'S').source:match('.*[/\\](.+)')..'\nMISSING FILE / ОТСУТСТВУЕТ ФАЙЛ!\n'..file:gsub('\\','/'))return;end;
       if not A.VersArcFun("3.0.1",file,'')then;A=nil;return;end;return A;
    end; local Arc = MODULE((reaper.GetResourcePath()..'/Scripts/Archie-ReaScripts/Functions/Arc_Function_lua.lua'):gsub('\\','/'));
    if not Arc then return end;
    local ArcFileIni = reaper.GetResourcePath():gsub('\\','/')..'/reaper-Archie.ini';
    --=========================================
   
   
   
    -------------------------------------------------------
    local function copyTake(item,idxTake,destItem,newItem);
        --POOL=true;
        local retval,str = reaper.GetItemStateChunk(item,'',false);
        if idxTake == 0 then;
            ----
            local TK,X;
            local STR = '';
            for val in string.gmatch(str,".-\n") do;
                ----
                if POOL ~= true then;
                    val = val:gsub('^%s-POOLEDEVTS%s+%{.+%}','POOLEDEVTS '..reaper.genGuid(''));
                end;
                val = val:gsub('^%s-GUID%s+%{.+%}','GUID '..reaper.genGuid(''));
                ----
                if val:match('^TAKE%s-\n')or
                   val:match('^TAKE%s+SEL%s-\n')then;
                    X = true;
                end;
                ---
                if val:match('^TAKE%s+SEL%s-\n')then;TK = 'TAKE\n'break end;
                ---
                if X ~= true then; STR = (STR or '')..val; end;
            end;
            ----
            if STR ~= '' and STR ~= str then STR = STR..'\n>\n'; end;
            -----
            local D;
            local STR2 = '';
            for val in string.gmatch(STR,".-\n") do;
                if D==true then;STR2 = STR2..val;end;
                if val:match('^IGUID')then;
                    D=true;
                end;
            end;
            -----
            local retval,str2 = reaper.GetItemStateChunk(destItem,'',false);
            local STR3;
            if newItem == true then;
                local D;
                local STR = '';
                for val in string.gmatch(str2,".-\n") do;
                    if val:match('^IGUID')then;
                        D=true;
                    end;
                    STR3 = (STR3 or '')..val;
                    if D==true then;break;end;
                end;
                STR3 = STR3..STR2;
            else;
                TK = TK or 'TAKE SEL\n';
                STR2 = TK..STR2;
                STR3 = str2:gsub('>%s-\n-%s-$',STR2..'\n%0');
            end;
            reaper.SetItemStateChunk(destItem,STR3,false);
            ----
        elseif idxTake > 0 then;
            ----
            local STR = '';
            local x = 0;
            for val in string.gmatch(str,".-\n") do;
                if val:match('^TAKE%s-\n')or
                   val:match('^TAKE%s+SEL%s-\n')then;
                   x = x+1;
                end;
                ---
                if x == idxTake then;
                    STR = (STR or '')..val;
                end;
                if x > idxTake then break end;
            end;
            ---
            local STR2 = '';
            local x = 0;
            for val in string.gmatch(STR,".-\n") do;
                if val:match('^<')then x=x+1 end;
                if val:match('^>')then x=x-1 end;
                if x < 0 then val = '' x=0 end;
                ----
                if POOL ~= true then;
                    val = val:gsub('^%s-POOLEDEVTS%s+%{.+%}','POOLEDEVTS '..reaper.genGuid(''));
                end;
                val = val:gsub('^%s-GUID%s+%{.+%}','GUID '..reaper.genGuid(''));
                ----
                STR2 = STR2..val;
            end;
            ----
            if STR2 and STR2 ~= '' then;
                local retval,str = reaper.GetItemStateChunk(destItem,'',false);
                local STR3 = '';
                if newItem == true then;
                    ----
                    for val in string.gmatch(str,".-\n") do;
                        if val:match('^IGUID')then;
                            break;
                        end;
                        STR3 = STR3..val;
                    end;
                    STR2 = STR2:gsub('^%s-TAKE%s-[SEL]*%s-\n','');
                    STR3 = STR3..'\n'..STR2..'\n>';
                else;
                    STR3 = str:gsub('>%s-\n-%s-$',STR2..'\n%0');
                end;
                reaper.SetItemStateChunk(destItem,STR3,false);
            end;
        end;
    end;
    -------------------------------------------------------
   
   
   
    local CountSelTrack = reaper.CountSelectedTracks(0);
    if CountSelTrack == 0 then no_undo()return end;
   
   
    for t_idx = 1,CountSelTrack do;
       
        local trackSel = reaper.GetSelectedTrack(0,t_idx-1);
        local CountTrItem = reaper.CountTrackMediaItems(trackSel);
        if CountTrItem > 0 then;
            ----
            if not UNDO then;
                reaper.Undo_BeginBlock();
                reaper.PreventUIRefresh(1);
                UNDO = true;
            end;
            ----
            local numb = reaper.GetMediaTrackInfo_Value(trackSel,'IP_TRACKNUMBER');
            local maxtake;
            for i = 1,CountTrItem do;
                local item = reaper.GetTrackMediaItem(trackSel,i-1);
                local counttake = reaper.CountTakes(item);
                maxtake = math.max(counttake,(maxtake or 0));
            end;
           
            for i = 1,maxtake do;
                reaper.InsertTrackAtIndex(i-1+numb,false);
            end;
           
            for i = 1,CountTrItem do;
                local item = reaper.GetTrackMediaItem(trackSel,i-1);
                local take = reaper.GetActiveTake(item);
                local nmbTake = reaper.GetMediaItemTakeInfo_Value(take,'IP_TAKENUMBER');
                local track = reaper.GetTrack(0,numb+nmbTake);
               
                local pos = reaper.GetMediaItemInfo_Value(item,'D_POSITION');
                local len = reaper.GetMediaItemInfo_Value(item,'D_LENGTH');
                local itemNew = reaper.CreateNewMIDIItemInProj(track,pos,pos+len,false);
                copyTake(item,nmbTake,itemNew,true);
            end;
        end;
    end;
   
    if UNDO then;
        reaper.Undo_EndBlock("Copy Take &&&",-1);
        reaper.PreventUIRefresh(-1);
    else;
        no_undo();
    end;
   
    reaper.UpdateArrange();
Работает превосходно! Большое спасибо и респект!
 

mklynx

New Member
16 Авг 2013
8
1
3
Санкт-Петербург
Добрый день!
Хотел поинтересоваться возможен ли подобный фоновый скрипт:
Идея в том, чтобы запись (если она включена) всегда останавливалась, когда курсор воспроизведения проходит конец тайм селекшна, при этом воспроизведение в лупе продолжается и можно сразу послушать записанное.

Попытался сделать подобное с помощью action маркеров, но такое решение ужасно неудобное
Спасибо!
stop rec.gif
 

mklynx

New Member
16 Авг 2013
8
1
3
Санкт-Петербург
@mklynx, А чем экшн маркеры не удобные?
их нужно каждый раз создавать, переименовывать и правильно располагать, нельзя поставить их просто в конце селекшна - в общем это миллион кликов

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

пока что удобнее всего использовать миди овердаб вместо обычной записи, но возникают трудности и лишние действия, если записывается аудио
 

Snjuk

Active Member
11 Июн 2014
265
126
43
43
Житомир UA
@mklynx,
1 Создаеш кастом
например
_XENAKIOS_SELTRAX_RECUNARMED
Script: DeleteMarker1.lua - скрипт в архиве

2 создаеш цикл экшн
ADD STATEMENT - CONSOLE !ID КАСТОМА 1 - делаеш кнопку или хоткей
 

Вложения

J T

Member
17 Май 2011
143
23
18
37
RF
Подскажите знаниями или скриптом. Хочу сделать себе на toolbar кнопку-переключатель, хочу 2 скрипта: один выключает некоторые плагины (по имени) во всем проекте, второй - соответственно их включает обратно. Список плагинов неоднозначный и возможно будет постоянно меняться, поэтому, чтобы не переписывать скрипт от нужды к нужде, быть может есть какой способ реализовать задуманное. А именно. Например хочу выключить всю динамическую обработку в проекте, и было бы замечательно, чтобы массивом, или каким-то другим способом, была одна строка в скрипте для изменения списка, по которому скрипт бы выключал/включал плагины.
Чтоб в одну строку можно было бы замутить отредактировать список типа FX_name = {ReaComp, MDynamics, .....} Чтобы при совпадении плагин байпасился и наоборот. Или как-то иначе. Думаю понято выразился.
 

Archie's

Well-Known Member
24 Окт 2017
1.936
1.296
113
@J T, Посмотри скрипт Script: Archie_Gui; Toggle Bypass necessary Fx in selected tracks(user input).lua
Если не нужно окно - в общем вот гиф.
1112.gif
 
  • Like
Реакции: J T

Archie's

Well-Known Member
24 Окт 2017
1.936
1.296
113
Если нужно что бы работало для всех треков, то в начало функции ToggleBypass() добавь вот эти строки
PHP:
        Arc.Save_Selected_Track_Slot(1);
        Arc.Action(40296);
187955


И в конец этой же функции
PHP:
Arc.Restore_Selected_Track_Slot(1,true,false);
187957
 
  • Like
Реакции: J T

Archie's

Well-Known Member
24 Окт 2017
1.936
1.296
113
@Archie's, а на Monitor Fx как-то можно также bypass на определённый плагин?
187986


PHP:
    local Fx = {'pro-q 2','Pro-Q 3','eq'};

    ----------------------------------------------------------
    ----------------------------------------------------------

    local function SC(x)return string.gsub(x,'%p','%%%0')end;
    
    local master = reaper.GetMasterTrack();
    
    if type(Fx)~='table'then Fx = {}end;
    
    local GetEnabled,UNDO;

    for i = 1,math.huge do;

        local ret,nameFx = reaper.TrackFX_GetFXName(master,0x1000000+(i-1),'');
        if ret then;
            
            nameFx = nameFx:upper();
            
            for i2 = 1,#Fx do;
               
                if nameFx:match(SC(Fx[i2]:upper())) then;
                     
                    if not GetEnabled then;
                        reaper.Undo_BeginBlock()UNDO=true;
                        GetEnabled = reaper.TrackFX_GetEnabled(master,0x1000000+(i-1));
                        if GetEnabled then SetEnabled = false else SetEnabled = true end;
                    end;
                    reaper.TrackFX_SetEnabled(master,0x1000000+(i-1),SetEnabled)
                end;
            end;
        else;
            break;
        end;
    end;
    
    if UNDO then;
        reaper.Undo_EndBlock('bypass', -1);
    end;
 
  • Like
Реакции: Mr_Tsonts

Mr_Tsonts

Well-Known Member
18 Апр 2019
1.656
1.341
113
56
Киев
@Archie's, вставил туда функцию SetToggleButtonOnOff. Не знаю, правильно ли вставил, но работает))))))))
Код:
    local Fx = {'Pro-Q 3'};

    ----------------------------------------------------------
    local function SetToggleButtonOnOff(numb);
          local _,_,sec,cmd,_,_,_ = reaper.get_action_context();
          reaper.SetToggleCommandState(sec,cmd,numb or 0);
          reaper.RefreshToolbar2(sec,cmd);
      end;
    ----------------------------------------------------------

    local function SC(x)return string.gsub(x,'%p','%%%0')end;
   
    local master = reaper.GetMasterTrack();
   
    if type(Fx)~='table'then Fx = {}end;
   
    local GetEnabled,UNDO;

    for i = 1,math.huge do;

        local ret,nameFx = reaper.TrackFX_GetFXName(master,0x1000000+(i-1),'');
        if ret then;
           
            nameFx = nameFx:upper();
           
            for i2 = 1,#Fx do;
             
                if nameFx:match(SC(Fx[i2]:upper())) then;
                   
                    if not GetEnabled then;
                        reaper.Undo_BeginBlock()UNDO=true;
                        GetEnabled = reaper.TrackFX_GetEnabled(master,0x1000000+(i-1));
                     
                     
                        if GetEnabled then SetEnabled = false
                        SetToggleButtonOnOff(0);
                        else SetEnabled = true
                        SetToggleButtonOnOff(1);
                        end;
                    end;
                    reaper.TrackFX_SetEnabled(master,0x1000000+(i-1),SetEnabled)
                   
                end;
            end;
        else;
            break;
        end;
    end;
-----------------------------------------------------------

-----------------------------------------------------------  
    if UNDO then;
   
        reaper.Undo_EndBlock('bypass', -1);
    end;
 
  • Like
Реакции: Archie's

Archie's

Well-Known Member
24 Окт 2017
1.936
1.296
113
@Mr_Tsonts, Да, правильно. Только если вручную потом отключишь, кнопка продолжит гореть.

PHP:
    --NEW INSTANCES--NEW INSTANCES--NEW INSTANCES--NEW INSTANCES--
   
   
    local Fx = {'Pro-Q 3'};

    ----------------------------------------------------------
    local function SetToggleButtonOnOff(numb);
          local _,_,sec,cmd,_,_,_ = reaper.get_action_context();
          reaper.SetToggleCommandState(sec,cmd,numb or 0);
          reaper.RefreshToolbar2(sec,cmd);
      end;
    ----------------------------------------------------------

    local function SC(x)return string.gsub(x,'%p','%%%0')end;
  
    local master = reaper.GetMasterTrack();
  
    if type(Fx)~='table'then Fx = {}end;
  
    local GetEnabled,UNDO;

    for i = 1,math.huge do;

        local ret,nameFx = reaper.TrackFX_GetFXName(master,0x1000000+(i-1),'');
        if ret then;
          
            nameFx = nameFx:upper();
          
            for i2 = 1,#Fx do;
            
                if nameFx:match(SC(Fx[i2]:upper())) then;
                  
                    if not GetEnabled and not UNDO then;
                        reaper.Undo_BeginBlock()UNDO=true;
                        GetEnabled = reaper.TrackFX_GetEnabled(master,0x1000000+(i-1));
                    
                    
                        if GetEnabled then SetEnabled = false
                            SetToggleButtonOnOff(0);
                        else SetEnabled = true
                            SetToggleButtonOnOff(1);
                        end;
                        GetEnabled = true;
                    end;
                    reaper.TrackFX_SetEnabled(master,0x1000000+(i-1),SetEnabled)
                  
                end;
            end;
        else;
            break;
        end;
    end;
-----------------------------------------------------------

----------------------------------------------------------- 
    if UNDO then;
  
        reaper.Undo_EndBlock('bypass', -1);
    end;
-----------------------------------------------------------

----------------------------------------------------------- 
   
   
   
    local ActiveOn,ActiveOff;
    local ActiveDoubleScr,stopDoubleScr;
    local _,extnameProj,sec,cmd,_,_,_ = reaper.get_action_context();
    local StateChangeCount2;
   
    local x;
    local function tmr(ckl);
        x=(x or 0)+1;
        if x>=ckl then x=0 return true end;return false;
    end;
   
    local function loop();
       
        if tmr(30) then;
            ----- stop Double Script -------
            if not ActiveDoubleScr then;
                stopDoubleScr = (tonumber(reaper.GetExtState(extnameProj,"stopDoubleScr"))or 0)+1;
                reaper.SetExtState(extnameProj,"stopDoubleScr",stopDoubleScr,false);
                ActiveDoubleScr = true;
            end;
           
            local stopDoubleScr2 = tonumber(reaper.GetExtState(extnameProj,"stopDoubleScr"));
            if stopDoubleScr2 > stopDoubleScr then return end;
            --------------------------------
       
            --local StateChangeCount = reaper.GetProjectStateChangeCount(0);
            --if StateChangeCount ~= StateChangeCount2 then;
                --StateChangeCount2 = StateChangeCount;
               
                for i = 1,math.huge do;
                    local ret,nameFx = reaper.TrackFX_GetFXName(master,0x1000000+(i-1),'');
                    if ret then;
                        nameFx = nameFx:upper();
                        for i2 = 1,#Fx do;
                            if nameFx:match(SC(Fx[i2]:upper())) then;
                               GetEnabled = reaper.TrackFX_GetEnabled(master,0x1000000+(i-1));
                               if GetEnabled then break end;
                            end;
                        end;
                    else;
                        break;
                    end;
                    if GetEnabled then break end;
                end;
                -----
                if GetEnabled then;
                    if not ActiveOff then;
                        reaper.SetToggleCommandState(sec,cmd,1);
                        reaper.RefreshToolbar2(sec,cmd);
                        ActiveOn = nil;
                        ActiveOff = true;
                    end;
                else;
                    if not ActiveOn then;
                        reaper.SetToggleCommandState(sec,cmd,0);
                        reaper.RefreshToolbar2(sec,cmd);
                        ActiveOff = nil;
                        ActiveOn = true;
                    end;
                end;
            --end;--StateChangeCount
        end;
        reaper.defer(loop);
    end;
   
    reaper.defer(loop);
 

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