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

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.063
113
62
Киев
Появилось -
PHP:
reaper.Undo_BeginBlock() --call to start a new block
---------------------------------------------------------
toggle_state = reaper.GetToggleCommandState(reaper.NamedCommandLookup("_S&M_DUMMY_TGL1"),0) -- получаем 0 если отключенно , и 1 если включенно
local counttracks = reaper.CountTracks(0) -- даёт значение кол-ва треков
if counttracks == nil then return end -- если треков нет, то и ни чего не делать :)
for i=1, counttracks do -- создаём цикл опроса по каждому треку
  local track = reaper.GetTrack(0,i-1) -- получаем объект Медиа Трек для каждого порядкового номера трека
  countFX =  reaper.TrackFX_GetCount( track ) -- для каждого трека получаем кол-во FX-ов на нём
  if countFX == nil then return end -- если FX нет, то и ни чего не делать :)
  for i=1, countFX do -- создаём цикл опроса по каждому FX-у на треке
    instrument = reaper.TrackFX_GetInstrument( track ) -- если не инструмент текущий FX, то получим значение = -1
    if instrument ~= i-1 then -- делаем условие, что если индекс FX-а не равен индексу инструмента, то -
      if toggle_state == 0 then -- тут как и раньше, если state = 0 то делать вот это
        reaper.TrackFX_SetEnabled(track, i-1, 1 ) -- Unbypass FX

        ComandID = "_S&M_DUMMY_TGL1" --
        reaper.Main_OnCommand(reaper.NamedCommandLookup(ComandID),0) -- переключаем state Dummy Экшина
        --------------------------------------------------------------------------------------------------
      else -- в противном случае
        reaper.TrackFX_SetEnabled(track, i-1, 0) -- Bypass FX

        ComandID = "_S&M_DUMMY_TGL1" --
        reaper.Main_OnCommand(reaper.NamedCommandLookup(ComandID),0) -- переключаем state Dummy Экшина
        ---------------------------------------------------------------------
      end
    end
  end
end

----------------------------------------------------------------------------------------------------
reaper.Undo_EndBlock("Bypass all FX (except VSTi) for all tracks",1)
reaper.PreventUIRefresh(1)
Разбирайтесь, задавайте вопросы.
Как видите, тут экшинов минимум, всё с использованием API скриптов
И этот скрипт в общем игнорирует состояние VSTi - в каком они находятся, в таком и остаются!
 
  • Like
Реакции: muzicgrand и Maestro Sound

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.063
113
62
Киев
@Aleksandr Oleynik, красиво расписано, если бы все так комментировали...
Та нужно себя заставить так делать всегда? Ну я для ребят - чем больше будет "скриптописателей" тем лучше всем?
Они же (скрипты эти) в начале только страшными кажутся, а как первых десятка два сделал - можно уже и других учить :)
 

Maestro Sound

Active Member
1 Ноя 2007
721
86
28
@Aleksandr Oleynik, Что-то у меня скрипт молчит (не работает и ошибки не пишет. И можно на каждый end рядом, какую строку он закрывает или относится
 

EUGEN27771

Well-Known Member
23 Апр 2010
2.293
1.995
113
- можно уже и других учить
Помните, года 1.5 назад я Вам говорил - чтобы чему-то по-настоящему научиться - нужно начать кого-то учить(из Коэльо, вроде, а он у кого-то другого взял).
Одно дело понять самому, и совсем другое дело объяснить другому на понятном языке. Когда ты не можешь объяснить - по сути, ты не понимаешь до конца.
Ты только прикоснулся к пониманию, и скоро забудешь - так устроен мозг, по крайней мере в большинстве случаев. Надо говорить или писать, хотя бы для себя.
И когда будет все испробовано, и ты говоришь себе, да, теперь, наконец, я могу объяснить все - находится куча других тем, в которых ты нулевый.
Ты опять берешь весла в руки и изучаешь. Этот процесс бесконечен, в этом и кайф.
Самая главная проблема - так можно сдохнуть с голоду, ты же не кот, чтобы поймать какую-то хренову птицу/мышь и забыть.
 
  • Like
Реакции: Buyan, CerberPic и Trasher

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.063
113
62
Киев
Что-то у меня скрипт молчит (не работает и ошибки не пишет.
Значит работает :)

И можно на каждый end рядом, какую строку он закрывает или относится
@CerberPic картинку правильную сделал.
Я использую редактор Atom -
https://atom.io/
с модулем для LUA синтаксиса - https://atom.io/packages/language-lua
language-lua
В нём шоткатами очень удобно автоматом синтаксис править, коментировать строки и многое другое.
Пишете начало стандартной функции, например if - а он вам всю конструкцию сразу предлагает
нажимаете Shift+Control+I - а он вам красиво все строки табулирует и линии связей рисует -
2017-12-09_010326.png
 

EUGEN27771

Well-Known Member
23 Апр 2010
2.293
1.995
113
Дядьки говорят, что лучше все-таки пробелы ставить после "=+-" и т.п. Читается лучше. А после скобок пробелы наоборот, не ставить.
Но это индивидуально.
============
П.С. Я не посмотрел полностью, у Вас все правильно, прямо как должно быть.
 

Maestro Sound

Active Member
1 Ноя 2007
721
86
28
Можно Когда переименование делаешь, можно поставить галочку в Instrument
 

@Michael

Well-Known Member
14 Дек 2010
969
1.461
93
Орёл / Москва
Расфризить и удалить фризы физически.
Алгоритм примерно может быть такой:
- в chunk трека найти последний кусок <FREEZE ...>;
- найти замороженные позиции и длины айтемов, находящихся в этом куске (строка FREEZE);
- найти существующие айтемы на треке и с такими длинами и позициями;
- найти исходники этих айтемов, запомнить, например в таблицу;
- разморозить трек. Всё, что было в последнем куске <FREEZE ...>, уйдёт в трек. Замороженные айтемы удалятся;
- выгнать всё аудио в проекте в оффлайн;
- пройтись по запомненным исходникам рендеров заморорозки и удалить;
- вернуть онлайн всё аудио.

PHP:
  instrument = reaper.TrackFX_GetInstrument( track ) -- если не инструмент текущий FX, то получим значение = -1
      if instrument ~= i-1 then -- делаем условие, что если индекс FX-а не равен индексу инструмента, то -
Поскольку TrackFX_GetInstrument() возвращает индекс первого инструмента, а инструментов может быть несколько, то можно использовать что-то в духе
PHP:
  function IsInstrument(track, fx) return ({reaper.TrackFX_GetFXName( track, fx, '' )})[2]:match('[%u]+i%:')~= nil end

  tr = reaper.GetSelectedTrack(0,0)
  is_FX_instrument = IsInstrument(tr,0)
if countFX == nil then return end -- если FX нет, то и ни чего не делать :)
...и выйти из цикла, не проверив остальные треки

P.S. Кстати, последняя версия mpl_Bypass all FX except instruments on selected tracks запоминает состояния FX до байпаса
 
Последнее редактирование:

@Michael

Well-Known Member
14 Дек 2010
969
1.461
93
Орёл / Москва
@@Michael, @EUGEN27771, а как использовать ExState?
То же самое, что писать в reaper-extstate.ini разного рода инфу в связке "раздел-ключ-значение".
Для проекта это раздел в конце RPP в блоке <EXTSTATE...>. Для проекта при превышении определённого лимита знаков, информация автоматом декодируется в base64. Для глобального ExtState многостроковость ограничена ввиду структуры ini файла.
 
Последнее редактирование:

Maestro Sound

Active Member
1 Ноя 2007
721
86
28
Друзья возможно ли скриптом сделать пошаговость действий от 3 и до 10 допустим как циклэкшинах через step. первое нажатие - первое действие ...второе нажатие - второе действие (то есть скрипт должен помнить сколько раз его нажали вовремя сессии?)
 

Maestro Sound

Active Member
1 Ноя 2007
721
86
28
ну вот при помощи ExState
Я догадался потому сразу же и спросил для подтверждения Поменял себе все свои Цыклэкшины, на скрипты по Вашему примеру Через пустышку "_S&M_DUMMY_TGL1" а вот теперь нужно три четыре действия сменных на одной кнопочке
 

@Michael

Well-Known Member
14 Дек 2010
969
1.461
93
Орёл / Москва
PHP:
steps = 3

function Action(step)
  if step == 0 then
    reaper.MB('step'..step+1,'',0)
   elseif step == 1 then
    reaper.MB('step'..step+1,'',0)
   elseif step == 2 then
    reaper.MB('step'..step+1,'',0)  
  end
end

cur_key = reaper.GetExtState( 'test', 'step' )
if not tonumber(cur_key) then cur_key = 0 else cur_key =tonumber(cur_key) end
if cur_key > steps-1 then cur_key = 0 end
Action(cur_key)
reaper.SetExtState( 'test', 'step', cur_key+1, false )
 

Maestro Sound

Active Member
1 Ноя 2007
721
86
28
@@Michael, Спасибо А можно по примеру ? step 1. выделить Group 02 и за солировать его треки. step2 . Найти треки в Group 02 и скрыть в Hide TCP step3. Найти треки с Vsti выделить их и заморозить.
 

EUGEN27771

Well-Known Member
23 Апр 2010
2.293
1.995
113
Куча вопросов и ответов, я честно не успел даже посмотреть.
Чтобы перезаписать айтем я использовал режим "r+b". Или "rb"
Чисто по дружески советую использовать именно этот режим.
Вы можете увидеть другие варианты, которые типа работают и тп, но это х....я.
В какой-то из ситуаций они все равно дадут косяк. Без бинарных данных.
С бинарными - они дадут косяк при первом нуле. Короче, долго говорить, используйте bin режим и никогда не ошибетесь.
 

Archie's

Well-Known Member
24 Окт 2017
1.936
1.296
113
наверно вписать в код какие-то экшны?
Они у меня вписаны
PHP:
   steps = 4               
    function Action(step)
    if step == 0 then
    reaper.MB('step'..step+1,'',0)
---------------------------------------------------------------------       
            ComandID = 40155   -- Peaks: Increase peaks view gain 
            reaper.Main_OnCommand(ComandID,0)   
-----------------------------------------------------------------       
    elseif step == 1 then
    reaper.MB('step'..step+1,'',0)
-----------------------------------------------------------------     
            ComandID = 40155   -- Peaks: Increase peaks view gain 
            reaper.Main_OnCommand(ComandID,0)       
-----------------------------------------------------------------   
    elseif step == 2 then
    reaper.MB('step'..step+1,'',0) 
----------------------------------------------------------------- 
            ComandID = 40155   -- Peaks: Increase peaks view gain 
            reaper.Main_OnCommand(ComandID,0)           
-----------------------------------------------------------------
     elseif step == 3 then
     reaper.MB('step'..step+1,'',0)
-----------------------------------------------------------------         
            ComandID = 40156   -- Peaks: Decrease peaks view gain 
            reaper.Main_OnCommand(ComandID,0) 
            ComandID = 40156   -- Peaks: Decrease peaks view gain 
            reaper.Main_OnCommand(ComandID,0) 
            ComandID = 40156   -- Peaks: Decrease peaks view gain 
            reaper.Main_OnCommand(ComandID,0) 
                           
-----------------------------------------------------------------   
    end
   end
   
    cur_key = reaper.GetExtState( 'test', 'step' )
    if not tonumber(cur_key) then cur_key = 0 else cur_key =tonumber(cur_key) end
    if cur_key > steps-1 then cur_key = 0 end
    Action(cur_key)
    reaper.SetExtState( 'test', 'step', cur_key+1, false )
 

Archie's

Well-Known Member
24 Окт 2017
1.936
1.296
113
я так понимаю, что у вас только печатается этот текст, а ничего не выполняется?
Все выполняется ! Все работает просто когда нажимаешь на кнопку выскакивает окно step 1 нажимаешь ок скрипт срабатывает, нажимаешь второй раз на кнопку выскакивает окно step 2 нажимаешь ок скрипт срабатывает и т.д.
 

vitalker

Well-Known Member
8 Окт 2013
5.085
2.195
113
Гродно
@Archchie, где-то у вас прописана комнада, которая отвечает за выдачу этого окошка, иначе и быть не может.
 

@Michael

Well-Known Member
14 Дек 2010
969
1.461
93
Орёл / Москва
Этот тред очень быстро превратится в мусорку кода, если тут будут пытаться хаотично вставить левые строки без понимания КАК это работает. Изучайте API (ctrl+f на странице API Help прекрасно работает, в том числе по функции MB() , а некоторые и основы программирования (на уровне 9 класса средней школы) и задавайте вопросы вида "как работает", а не "что и куда вставить".
 

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