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

Archie's

Well-Known Member
24 Окт 2017
1.936
1.296
113
Народ подскажите пожалуйста что я делаю не правильно? первое действия срабатывает ,а второе нет
PHP:
reaper.PreventUIRefresh(1)
  reaper.Undo_BeginBlock() --call to start a new block
---------------------------------------------------------
    toggle_state = reaper.GetToggleCommandState(40296) -- получаем 0 если отключенно , и 1 если включенно
    if toggle_state ~= 0 then


-----------------------------------------------------------
        ComandID = 40296   -- Track: Select all tracks
        reaper.Main_OnCommand(ComandID,0)  
        ComandID = "_NF_BYPASS_FX_EXCEPT_VSTI_FOR_SEL_TRACKS" --SWS/NF: Bypass FX (except VSTi) for selected tracks
        reaper.Main_OnCommand(reaper.NamedCommandLookup(ComandID),0)
        ComandID = 40297   -- Track: Unselect all tracks
        reaper.Main_OnCommand(ComandID,0)
---------------------------------------------------------------------------------------------------------------
    else -- в противном случае

---------------------------------------------------------------------------------------------------
        ComandID = 40296   -- Track: Select all tracks--
        reaper.Main_OnCommand(ComandID,0)
        ComandID = "_S&M_FXBYPALL3" --SWS/S&M: Unbypass all FX for selected tracks
        reaper.Main_OnCommand(reaper.NamedCommandLookup(ComandID),0)
        ComandID = 40297   -- Track: Unselect all tracks
        reaper.Main_OnCommand(ComandID,0)
---------------------------------------------------------------------
    end
  

------------------------------------------------------------------------------------------------------
  reaper.Undo_EndBlock("Bypass all FX (except VSTi) for all tracks",1)
reaper.PreventUIRefresh(1)
 

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.063
113
62
Киев
@Archchie, для начала у Экшина 40296 нет State -
toggle_state при любых условиях будет = -1 и ни когда ни 0 ни 1
Если в Экшинах, в графе State на против Экшина нет on или off - то по такому экшину состояние получить нельзя.

Да и вообще - какой-то безсмысленный скрипт.
Даже если бу у Экшина 40296 был фидбэк по состоянию, что вы хотели сделать?
 
Последнее редактирование:

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.063
113
62
Киев
как его доделать что бы toggle заработал
Так напишите ЧТО вы хотите сделать????
Пока я вижу полную безсмыслицу, даже если бы у Экшина 40296 было состояние.
Опишити русским языком что хотите, тогда поясню как.
 

Archie's

Well-Known Member
24 Окт 2017
1.936
1.296
113
ак напишите ЧТО вы хотите сделать????
Пока я вижу полную безсмыслицу, даже если бы у Экшина 40296 было состояние.
Опишити русским языком что хотите, тогда поясню как.
Это скрипт забайпасить все FX в проекте разбайпасить все FX за исключением VST i, но это не важно ,мне нужен не скрипт ,а я просто хочу понять смысл ,не могу понять как работать с этим Toggle.Много где надо сделать Toggle путем совмещения двух трех скриптов ,а я не могу понять как
 
Последнее редактирование:

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.063
113
62
Киев
Это скрипт забайпасить все FX в проекте разбайпасить все FX за исключением VST i, но это не важно
Так в том то и дело, что ВАЖНО!
Нет универсального Toggle, вы написали ПОЛНЕЙШУЮ логическую билиберду и пытаетесь в чём-то разобраться - НЕ РАЗБЕРЁТЕСЬ!
Условия в начале нужно самому себе составить и пояснить, а потом садиться за скрипт.
Хотите понять как писать скрипты с условиями else - ставьте КОНКРЕТНУЮ задачу и её решайте.

Ещё раз спрошу - что должен делать скрипт?
Вот это вот пояснение -
Это скрипт забайпасить все FX в проекте разбайпасить все FX за исключением VST i
НИ О ЧЁМ!
Условия пишутся например так -
Если:
- Все FX в проекте находятся в состоянии Unbypass за исключением VSTi (их состояние не проверять)
То:
- сделать всем FX на всех треках проекта Bypass за исключением VSTi (их состояние не проверять)
В противном случаи (т.е. противоположном изложенному в условии Если):
- сделать всем FX на всех треках проекта Unbypass за исключением VSTi (их состояние не проверять)

Если нужно сделать именно ЭТО - могу сделать такой скрипт с пояснениями, но просто не будет!
Хотя, если нужно вообще ВСЕ FX на ВСЕХ треках, то наверное можно и по простому.
 

Archie's

Well-Known Member
24 Окт 2017
1.936
1.296
113
Если нужно сделать именно ЭТО - могу сделать такой скрипт с пояснениями, но просто не будет!
Хотя, если нужно вообще ВСЕ FX на ВСЕХ треках, то наверное можно и по простому.
Сделайте пожалуйста.
 
Последнее редактирование:

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.063
113
62
Киев
отключить остальное ,включить ВСЁ
ни чего опять не понял :(
Какие такие "остальные", что такое "ВСЁ"?????

Ещё раз спрошу с картинкой, что скрипт должен сделать на каждом из треков -
2017-12-08_144133.png
 

Archie's

Well-Known Member
24 Окт 2017
1.936
1.296
113
(клик off, клик on) если нажимаем off он отключает все остальное что включенно, кликаем on включает ВСЕ ВСЕ VST которые есть (не обращая внимания, что было раньше)
 

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.063
113
62
Киев
если нажимаем off он отключает все остальное
Ещё раз спрашиваю - что ОСТАЛЬНОЕ????
ну чтож так тяжело то всё ? :(

У вас сформировалось в голове какое-то очень не верное представление о логике работы функции toggle, которая управляет ни одним каким-то состоянием, а целой группой.
Если речь идёт, например о - Show/hide video windows - что тут делает toggle предельно ясно - один раз вызвали экшин - он опросил состояние окна видео, если окно видимо - закрыл его, если не видимо - открыл.
А что прикажете делать Функции в режиме toggle если она работает с множеством треков, на которых может быть самое разное состояние?
Если ни каких дополнительных условия не написать скрипту, то в режиме toggle он забайпасенные FX-ы на треке будет делать анбайпас, а анбайпасенные - байпасить.
Сомневаюсь, что вы именно такого хотите.
 

Archie's

Well-Known Member
24 Окт 2017
1.936
1.296
113
@Aleksandr Oleynik, Есть в проекте 10 FX Bypass,10 FX Unbypass нажимаем на кнопку делается 20 FX Bypass(то есть, все), нажимаем еще раз делается 20 Unbypass
 
  • Like
Реакции: Aleksandr Oleynik

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.063
113
62
Киев
Есть в проекте 10 FX Bypass,10 FX Unbypass нажимаем на кнопку делается 20 FX Bypass(то есть, все), нажимаем еще раз делается 20 Unbypass
Ура!
ОК!
Это в самом деле простое условие без нюансов, но есть нюанс с точки зрения самого скрипта - я не знаю как сделать для срипта state, может кто-то другой знает (как-то обсуждали).
Но можно использовать state так называемых Dummy экшинов.
Я сделаю с пояснениями!
 
Последнее редактирование:

Archie's

Well-Known Member
24 Окт 2017
1.936
1.296
113
@Aleksandr Oleynik, А вообще в скриптах можно делать типа как ---step---в cycle action ,набор команд (что то там) набор команд
 

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.063
113
62
Киев
Можно, напишу - поймёте.
Но лучше использовать совсем другой подход -
при запуске скрипта не его (или того-же привязанного Dummy) state опрашивать и тупо делать что-то противоположное тому, что скрипт делал в прошлый раз, а Рипер опрашивать на предмет ключевых состояний и что-то делать в зависимости от этих ответов.
Тут нужно не писать, а говорить - долго объяснять.
 

CerberPic

Member
17 Фев 2017
70
22
8
35
@EUGEN27771, @@Michael, @gazzz
Вот кусок скрипта, в котором затычка. Возможно, это из-за того, что я как-то неправильно произвожу чтение из файла и запись в него?
PHP:
res_path = string.gsub(reaper.GetResourcePath(), [=[\]=], [=[\\]=])
track = reaper.GetSelectedTrack(0, 0)

function unfrz()
    item = reaper.GetTrackMediaItem(track, 0)
    take = reaper.GetActiveTake(item)
    source = reaper.GetMediaItemTake_Source(take)
    proj_name = string.gsub(reaper.GetProjectName(0, ""), ".RPP", "")
    filename = string.gsub(reaper.GetMediaSourceFileName(source, ""), proj_name.."_freeze_", "")
  
    settings = io.open(res_path..[[\\Freeze_data.txt]])
    text = settings:read()
    settings:close()
    settings = io.open(res_path..[[\\Freeze_data.txt]], "w")
    finds = string.find(tostring(text), filename, 1, true)
    if finds then
        sss = string.sub(tostring(text), tonumber(finds), tonumber(finds) + #filename - 1)
        new_text = string.gsub(tostring(text), sss, "")
        settings:write(new_text)
    else
        settings:write(text)
    end
    settings:close()
  
    reaper.SelectAllMediaItems(0, 0)
    reaper.SetMediaItemSelected(item, 1)
    reaper.Main_OnCommand(reaper.NamedCommandLookup("_S&M_DELTAKEANDFILE2"), 0)
    reaper.Main_OnCommand(41644, 0) -- unfreeze
    reaper.UpdateArrange()
end
И не используйте string как переменную - это таблица для строковой библиотеки.
Я понимаю, я там просто в качестве примера так написал.
 

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.063
113
62
Киев
@Archchie,
PHP:
reaper.Undo_BeginBlock() --call to start a new block
---------------------------------------------------------
toggle_state = reaper.GetToggleCommandState(reaper.NamedCommandLookup("_S&M_DUMMY_TGL1"),0) -- получаем 0 если отключено , и 1 если включено

if toggle_state == 0 then
  -----------------------------------------------------------
  ComandID = 40296 -- Track: Select all tracks
  reaper.Main_OnCommand(ComandID,0)
  ComandID = "_NF_BYPASS_FX_EXCEPT_VSTI_FOR_SEL_TRACKS" --SWS/NF: Bypass FX (except VSTi) for selected tracks
  reaper.Main_OnCommand(reaper.NamedCommandLookup(ComandID),0)
  ComandID = 40297 -- Track: Unselect all tracks
  reaper.Main_OnCommand(ComandID,0)

  ComandID = "_S&M_DUMMY_TGL1" --
  reaper.Main_OnCommand(reaper.NamedCommandLookup(ComandID),0)
  --------------------------------------------------------------------------------------------------
else -- в противном случае
  --------------------------------------------------------------------------------------------------
  ComandID = 40296 -- Track: Select all tracks--40297
  reaper.Main_OnCommand(ComandID,0)
  ComandID = "_S&M_FXBYPALL3" --SWS/S&M: Unbypass all FX for selected tracks
  reaper.Main_OnCommand(reaper.NamedCommandLookup(ComandID),0)
  ComandID = 40297 -- Track: Unselect all tracks
  reaper.Main_OnCommand(ComandID,0)

  ComandID = "_S&M_DUMMY_TGL1" --
  reaper.Main_OnCommand(reaper.NamedCommandLookup(ComandID),0)
  ---------------------------------------------------------------------
end

----------------------------------------------------------------------------------------------------
reaper.Undo_EndBlock("Bypass all FX (except VSTi) for all tracks",1)
reaper.PreventUIRefresh(1)
Только тут VSTi ведь если в байпасе - тоже анбайпасится будут!

"_S&M_DUMMY_TGL1" - Экшин используется как экшин - пустышка у которого есть состояние
 
  • Like
Реакции: Archie's и Maestro Sound

EUGEN27771

Well-Known Member
23 Апр 2010
2.293
1.995
113
Вот кусок скрипта, в котором затычка. Возможно, это из-за того, что я как-то неправильно произвожу чтение из файла и запись в него?
А в чем конкретно проблема? Не могу проверять - что должен делать скрипт и где косяк?
 

@Michael

Well-Known Member
14 Дек 2010
969
1.461
93
Орёл / Москва
А в чем конкретно проблема? Не могу проверять - что должен делать скрипт и где косяк?
Видимо, анфризить трек и обновлять текстовый файл, где перечислены сурсы рендеров замороженных треков. Делается это конечно же проще, нежели в указанном скрипте.
 

CerberPic

Member
17 Фев 2017
70
22
8
35
А в чем конкретно проблема? Не могу проверять - что должен делать скрипт и где косяк?
Видимо, анфризить трек и обновлять текстовый файл, где перечислены сурсы рендеров замороженных треков. Делается это конечно же проще, нежели в указанном скрипте.
@@Michael прав. При заморозке трека скрипт записывает сурсы расположенных на нём айтемов и записывает их в файл. А при разморозке сверяется с файлом, проверяет, есть ли он ещё на диске и (в данной функции) размораживает, удаляет файл фриза и запись о нём в файле.
Конечно, всё делается проще, но я полез вперёд батьки в пекло с недостаточным объёмом знаний и опыта скриптописания. Но уж раз взялся, хочется добить.
 

Maestro Sound

Active Member
1 Ноя 2007
721
86
28
При заморозке трека скрипт записывает сурсы расположенных на нём айтемов и записывает их в файл. А при разморозке сверяется с файлом, проверяет, есть ли он ещё на диске и (в данной функции) размораживает, удаляет файл фриза и запись о нём в файле.
Конечно, всё делается проще, но я полез вперёд батьки в пекло с недостаточным объёмом знаний и опыта скриптописания. Но уж раз взялся, хочется добить.
Вот как раз именно про это недели две-три назад я просил сделать. Фриз и анфриз с удалением замороженых сурсов. Там "камнем" было то что без проверки при анфризе можно было стереть оригинальный сурс если трек не был заморожен.
 
Последнее редактирование:

@Michael

Well-Known Member
14 Дек 2010
969
1.461
93
Орёл / Москва
при разморозке сверяется с файлом, проверяет, есть ли он ещё на диске
При загрузке проекта рипер спросит где исходники, если те были удалены.
записывает сурсы расположенных на нём айтемов и записывает их в файл
Эта инфа и так есть в проекте.
 
Последнее редактирование:
  • Like
Реакции: CerberPic

Archie's

Well-Known Member
24 Окт 2017
1.936
1.296
113
@Aleksandr Oleynik, Спасибо!!!


"_S&M_DUMMY_TGL1" - Экшин используется как экшин - пустышка у которого есть состояние
С пустышкой все понятно

Только тут VSTi ведь если в байпасе - тоже анбайпасится будут!
Вот этого сразу не заметил, теперь нужен скрипт Unbypass all FX (except VSTi) for all tracks


Можно, напишу - поймёте.
Но лучше использовать совсем другой подход -
Просто иногда делаешь кастом ,а в нем содержится какой либо скрипт и если скрипт переместить или удалить (при уборке в папке например) то кастом перестает работать пока по новой не соберешь(как то недавно убрался в папке,рассортировал все скрипты по под папкам после этого половина кастомов перистали работать),а если этот же кастом собрать в скрипте то ничего не теряется,вот поэтому такой подход у меня .Ну и так потихоньку потихоньку что то новое изучаю, пока как то так потом дальше больше.
 

Maestro Sound

Active Member
1 Ноя 2007
721
86
28
@Archchie, Ровно тоже Если начнешь переносить потом "гусей не собрать"
[DOUBLEPOST=1512752557][/DOUBLEPOST]@@Michael, Вот это я понимаю "сменить имидж"
 

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.063
113
62
Киев
Ну так..... парни..... учитесь писать скрипты. Я сам не сильно умею, но помогу :)
[DOUBLEPOST=1512756165][/DOUBLEPOST]
Вот этого сразу не заметил, теперь нужен скрипт Unbypass all FX (except VSTi) for all tracks
Не, не нужно....
Нужно просто в скрипт добавить условие - делать всё (и байпас и анбайпас) со всеми FX, кроме инструментов.
Это будет следующий урок, кстати - от части переходящий от использования Экшинов, к использованию API.
Будет время сделаю, будет не ясно - поясню....
 
  • Like
Реакции: Maestro Sound

CerberPic

Member
17 Фев 2017
70
22
8
35
Вот как раз именно про это недели две-три назад я просил сделать. Фриз и анфриз с удалением замороженых сурсов. Там "камнем" было то что без проверки при анфризе можно было стереть оригинальный сурс если трек не был заморожен.
Меня, кажется, Ваша просьба и сподвигла этим заняться.

При загрузке проекта рипер спросит где исходники, если те были удалены.
А ведь точно. Не учёл этот момент.
Эта инфа и так есть в проекте.
Как её возможно получить? В API я по фризу нахожу только reaper.BR_GetMediaTrackFreezeCount( track ). Подозреваю, что как-то через chunk трека?
 

@Michael

Well-Known Member
14 Дек 2010
969
1.461
93
Орёл / Москва
Я не очень понимаю логику того, что ты хочешь сделать. Расфризить и удалить исходники или расфризить и удалить фризы физически, или ещё что-то, из треда непонятно. Айтемы во фризе можно выгрузить например так:
PHP:
  function eugen27771_GetTrackStateChunk(track)
    if not track then return end
    local fast_str, track_chunk
    fast_str = reaper.SNM_CreateFastString("")
    if reaper.SNM_GetSetObjectState(track, fast_str, false, false) then track_chunk = reaper.SNM_GetFastString(fast_str) end
    reaper.SNM_DeleteFastString(fast_str)
    return track_chunk
  end
  ---------------------------------------------------
  function GetFreezedItemsData(tr)
    if not tr then return end
    local chunk = eugen27771_GetTrackStateChunk(tr)
    local t= {}
    local freezed_items = {}
    local ch_open, ch_cnt,it_id = false, 0,0
    for line in chunk:gmatch('[^\n\r]+') do
      if line:match('<FREEZE') then ch_open = true end
      if ch_open and line:match('<ITEM') then it_id = it_id + 1 end
      if ch_cnt > 0 then
        if not t[it_id] then  t[it_id] = {} end
        t[it_id][#t[it_id]+1] = line
      end
      if ch_open and line:match('<') then ch_cnt = ch_cnt + 1 end
      if ch_open and line:match('>') then ch_cnt = ch_cnt - 1 end
      if ch_open and ch_cnt < 1 then break end
    end
    -- compile chunks
      for key in pairs(t) do
        local ch = table.concat(t[key], '\n')
        freezed_items[#freezed_items+1]={chunk =ch,
                                          pos = tonumber(ch:match('POSITION ([%d%.]+)')),
                                          len = tonumber(ch:match('LENGTH ([%d%.]+)'))}
      end
    return freezed_items
  end
  ---------------------------------------------------
  local tr = reaper.GetSelectedTrack(0,0)
  t = GetFreezedItemsData(tr)
^^ и то это только для первого фриза
 
Последнее редактирование:
  • Like
Реакции: CerberPic

CerberPic

Member
17 Фев 2017
70
22
8
35
Я не очень понимаю логику того, что ты хочешь сделать. Расфризить и удалить исходники или расфризить и удалить фризы физически, или ещё что-то, из треда непонятно. Айтемы во фризе можно выгрузить например так:
PHP:
  function eugen27771_GetTrackStateChunk(track)
    if not track then return end
    local fast_str, track_chunk
    fast_str = reaper.SNM_CreateFastString("")
    if reaper.SNM_GetSetObjectState(track, fast_str, false, false) then track_chunk = reaper.SNM_GetFastString(fast_str) end
    reaper.SNM_DeleteFastString(fast_str)
    return track_chunk
  end
  ---------------------------------------------------
  function GetFreezedItemsData(tr)
    if not tr then return end
    local chunk = eugen27771_GetTrackStateChunk(tr)
    local t= {}
    local freezed_items = {}
    local ch_open, ch_cnt,it_id = false, 0,0
    for line in chunk:gmatch('[^\n\r]+') do
      if line:match('<FREEZE') then ch_open = true end
      if ch_open and line:match('<ITEM') then it_id = it_id + 1 end
      if ch_cnt > 0 then
        if not t[it_id] then  t[it_id] = {} end
        t[it_id][#t[it_id]+1] = line
      end
      if ch_open and line:match('<') then ch_cnt = ch_cnt + 1 end
      if ch_open and line:match('>') then ch_cnt = ch_cnt - 1 end
      if ch_open and ch_cnt < 1 then break end
    end
    -- compile chunks
      for key in pairs(t) do
        local ch = table.concat(t[key], '\n')
        freezed_items[#freezed_items+1]={chunk =ch,
                                          pos = tonumber(ch:match('POSITION ([%d%.]+)')),
                                          len = tonumber(ch:match('LENGTH ([%d%.]+)'))}
      end
    return freezed_items
  end
  ---------------------------------------------------
  local tr = reaper.GetSelectedTrack(0,0)
  t = GetFreezedItemsData(tr)
Расфризить и удалить фризы физически. Спасибо за код, поизучаю.
И, кстати, @@Michael, не подскажете, как вызвать функцию os.remove() ?
Везде пишут, что
Если эта функция завершилась неудачей, она возвращает значение nil, плюс строку, описывающую ошибку, и код ошибки.
Но у меня в любом случае голый nil. Путь получен, имя файла получено. Не работает даже в связке
Код:
os.execute(path)
os.remove (filename)
С помощью неё я хотел производить удаление. Или же удалять лучше SWSовским экшном, как это у меня сейчас?
 

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