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

  • Автор темы Автор темы @Michael
  • Дата начала Дата начала
@dhfotybt,
Например в Контакт загружен бас и сохранен там в FX Chain. Поэтому мне нужно прописать точное название типа: Rename track to Modern Bass. Как это можно сделать?
Загрузи свой Контакт, выдели его и нажми F2, появится окно для переименования Fx, переименуй его и сохрани по новой как FX Chain.
Или в конец кастома добавь скрипт Archie_Fx; Rename last FX in selected tracks name n.lua
 
Делаю Cycle Ation. Insert Track, потом Rec-Arm, потом Record Mode MIDI Overdub, потом Kontakt с загруженным нужным инструментом сохраненный как FX Chain.
В этом случае действительно будет лучше и правильнее сохранить трек темплейт, а не FX Chain и не городить кастом/цикл-экшены.
 
Настраиваю Рипер для работы с видео. Очень удобно нарезать comps в нем, как и с аудио. Но когда дорожки нарезаны, требуется снова сделать explode, чтобы на дороги повесить эффекты отдельно. И соответственно нужно, как то перед тем как делать explode, удалить неактивные тейки, чтобы explode был с пустотой.
Как то вижу несколько вариантов, но все нужно допиливать.
Например, есть экшн - clear active takes. Работает как нужно, но удалить нужно не АКТИВНЫЕ, а наоборот НЕАКТИВНЫЕ тейки. То есть нужно либо придумать как инвертировать активность тейков, либо как сделать clear inactive takes. Ведь такого экшена нет.
Еще вариант изначально задавать всем айтемам определенный цвет. После того, как все тейки выбраны, раскрасить их другим цветом. А при наличии скрипта типа "clear takes by custom color" удалить не нужные тейки.
То есть смысл в том, как очистить Comps от неактивных тейков. А это два варианта какие приходят в голову, чтобы это реализовать, но которых нет ни в экшенах ни в скриптах на сегодняшний день. Либо я не нашел, конечно
 
Неа. Тогда скропятся все айтемы в один нарезанный на эту же дорожку. А нужно чтобы тейки из первого айтема в итоге ушли на свою дорожку, а второго, например, на свою. Тогда они будут воспроизводиться по очереди, но каждый на своей дорожке. Это как бы в аудио бессмысленно айтемы в нарезках отдельно обрабатывать обычно, а здесь видео и смена ракурса, например, должна быть с другой обработкой.
 
По моему лучше обработки вешать на айтемы, копировать обработки с одного айтема на другой перетаскиванием.
А потом, если цветокор не подошел, придется открывать все обработки в каждом тейке и перекручивать. В том и смысл, чтобы иметь возможность на дорожку кинуть fx для тейков из 3-го, например, айтема.
 
если цветокор не подошел, придется открывать все обработки в каждом тейке и перекручивать.
Не уверен, но кажется можно найти более эффективный способ. Типа выделить айтемы, удалить с них все эффекты, потом скопировать нужный эффект, вставить во все выделенные айтемы.

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

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

Вложения

  • Explode activ takes.gif
    Explode activ takes.gif
    57 KB · Просмотры: 241
Ага... Надо, чтобы неактивные тейки остались, но там типа было пусто?
Ну да. Оставить активные, а вместо неактивных пусто. Типа Clear inactive takes. Есть экшн Clear active takes и он бы сработал, но тогда нужен хотя бы экшн инвертации неактивных в активные, для последующего очищения.
 
Последнее редактирование:
Ну да. Оставить активные, а вместо неактивных пусто. Типа Clear inactive takes. Есть экшн Clear active takes и он бы сработал, но тогда нужен хотя бы экшн инвертации неактивных в активные, для последующего очищения.
А по сколько там тейков в айтемах? По 2, по 3? Можно же создать из всех комбинаций компы, потом методом некст комп сделать неактивные активными, очистить и вернуться к нужной таким же способом. Есть же ещё некст тейк экшн и обратно.
Просто, если во всех айтемах равное количество тейков то не вижу вообще проблем. Все айтемы выделить и некст тейк - клер актив тейк.
 
Последнее редактирование:
187615

Вот, что требуется в итоге. Пока что раскрасил активные тейки, сделал explode и в ручную удалил не цветные.
 
А по сколько там тейков в айтемах? По 2, по 3? Можно же создать из всех комбинаций компы, потом методом некст комп сделать неактивные активными, очистить и вернуться к нужной таким же способом. Есть же ещё некст тейк экшн и обратно.
Просто, если во всех айтемах равное количество тейков то не вижу вообще проблем. Все айтемы выделить и некст тейк - клер актив тейк.
Либо я не понял, либо не работает ((
 
@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,

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();
Работает превосходно! Большое спасибо и респект!
 
Добрый день!
Хотел поинтересоваться возможен ли подобный фоновый скрипт:
Идея в том, чтобы запись (если она включена) всегда останавливалась, когда курсор воспроизведения проходит конец тайм селекшна, при этом воспроизведение в лупе продолжается и можно сразу послушать записанное.

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

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

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

пока что удобнее всего использовать миди овердаб вместо обычной записи, но возникают трудности и лишние действия, если записывается аудио
 
@mklynx,
1 Создаеш кастом
например
_XENAKIOS_SELTRAX_RECUNARMED
Script: DeleteMarker1.lua - скрипт в архиве

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

Вложения

Подскажите знаниями или скриптом. Хочу сделать себе на toolbar кнопку-переключатель, хочу 2 скрипта: один выключает некоторые плагины (по имени) во всем проекте, второй - соответственно их включает обратно. Список плагинов неоднозначный и возможно будет постоянно меняться, поэтому, чтобы не переписывать скрипт от нужды к нужде, быть может есть какой способ реализовать задуманное. А именно. Например хочу выключить всю динамическую обработку в проекте, и было бы замечательно, чтобы массивом, или каким-то другим способом, была одна строка в скрипте для изменения списка, по которому скрипт бы выключал/включал плагины.
Чтоб в одну строку можно было бы замутить отредактировать список типа FX_name = {ReaComp, MDynamics, .....} Чтобы при совпадении плагин байпасился и наоборот. Или как-то иначе. Думаю понято выразился.
 
@J T, Посмотри скрипт Script: Archie_Gui; Toggle Bypass necessary Fx in selected tracks(user input).lua
Если не нужно окно - в общем вот гиф.
1112.gif
 
  • Like
Реакции: J T
Если нужно что бы работало для всех треков, то в начало функции 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, а на 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
@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
@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);
 

Сейчас просматривают