ReaScripts (скрипты для Reaper) - обсуждение

  • Автор темы Автор темы drzhnn
  • Дата начала Дата начала
У меня скрипт "Script: pandabot_ChordGun.lua" не генерирует аккорды.
В чём может быть проблема?
 
На всякий случай, может кто-то столкнётся с этим как я.

Screenshot_1.png


* Если вы сделали неправильный выбор в этом всплывающем окне и нажали «запомнить мой ответ», вы можете удалить сценарий из списка действий и снова импортировать его, чтобы всплывающее окно снова появилось, НО есть лучший способ!
Редактировать Reaper-Kb.ini, в котором хранятся эти настройки.
Сделайте копию Reaper-Kb.ini на случай, если вы случайно ошиблись. Затем откройте исходный файл.
Найдите строку SCR, которая содержит тот же ActionCommandID, что и сценарий в списке действий.
Строку в блокноте например Notepad++, искать без нижнего прочерка вначале скопированной ActionCommandID типа _RSb370f6c4cd5313cb240c43395093e685a8b1c2c2
Замените первое число после SCR на 4. Сохраните его и перезапустите Reaper.

Теперь можно снова выбирать. :)
 
Подскажите, есть ли такой скрипт.
Допустим, есть у нас два миди-клипа (или как клипы в Рипере называются? что-то забыл..).
В одном определенная одноголосая мелодическая линия, а в другом ритмически повторяющая первый, но с произвольной тональностью.
Возможно ли по шаблону первого клипа сделать ту же линию во втором, но - оставляя велосити, небольшие отклонения от сетки, а также все контроллеры от второго?
 
Возможно ли по шаблону первого клипа сделать ту же линию во втором
правильно ли я понял, что нужно просто все ноты собрать со всех нот на одну ноту? Думаю, что проще всего открыть второй айтем, выделить все ноты, нажать Ctrl+F2 или View->Event properties и вписать/выбрать из списка нужную Note, например C2 и применить.
 
Подскажите, есть ли такой скрипт.
Допустим, есть у нас два миди-клипа (или как клипы в Рипере называются? что-то забыл..).
В одном определенная одноголосая мелодическая линия, а в другом ритмически повторяющая первый, но с произвольной тональностью.
Возможно ли по шаблону первого клипа сделать ту же линию во втором, но - оставляя велосити, небольшие отклонения от сетки, а также все контроллеры от второго?
Не знаю, какие ещё контроллеры нужно задействовать, но для того, чтобы перенести грув и велосити со второго на первый, а это проще, чем наоборот, можно воспользоваться Groove tool. То есть, снять квантайз с сохранением велосити со второго и применить на первый.
 
Подскажите, как сделать задержку в скрипте? Что нужно: В инсерт трека скрипт добавляет FX, и далее нужно подождать когда он прогрузится до конца, как только прогружается, следующее действие. Нужно как-то попросить скрипт подождать.)
 
Подскажите, как сделать задержку в скрипте? Что нужно: В инсерт трека скрипт добавляет FX, и далее нужно подождать когда он прогрузится до конца, как только прогружается, следующее действие. Нужно как-то попросить скрипт подождать.)
Достаточно сложная задача, так как каждый FX загружается разное время.
А чем не нравится предложенный @Snjuk, вариант?
 
Подскажите, как сделать задержку в скрипте? Что нужно: В инсерт трека скрипт добавляет FX, и далее нужно подождать когда он прогрузится до конца, как только прогружается, следующее действие. Нужно как-то попросить скрипт подождать.)
Я может чего то не понимаю что вам нужно, но при добавлении какого нибудь плагина скрипт и так останавливается.
Следующая функция после добавления плагина (AddFx) срабатывает только тогда, когда плагин уже загружен полностью.
Вот простой тест этого:
Сначала мы добавляем Fx, а за тем вызываем консоль и консоль появляется только после полной загрузки плагина.

JavaScript:
    local NameFX = 'VPS Avenger (Vengeance) (34 out)';
  
    local Track = reaper.GetTrack(0,0);
  
    reaper.TrackFX_AddByName(Track,NameFX,false,-1);
  
    reaper.ShowConsoleMsg('msg');
  
    local CountFx = reaper.TrackFX_GetCount(Track);
 
@Archchie, так разбить скрипт на кастомы и будет работать.

А вообще - у меня есть код для пауз в выполнении последовательных действий
 
  • Like
Реакции: Archie's
@Archchie, делаю костыль для себя. Суть в чём, мне нужно вставить VST3 версию MMultiAnalyzer в канал, и убрать анализатор в оффлайн. По идее VST3 должен имя трека автоматически подхватить внутрь плагина, но если, reaper.TrackFX_AddByName, затем reaper.TrackFX_SetOffline, если Анализатор убрать из оффлайна, то имя трека перед тем как уйти в оффлайн подхватить не успевает.
нужна пауза между reaper.TrackFX_AddByName и reaper.TrackFX_SetOffline. На ум пришла идея только с reaper.TrackFX_SetOffline, но не проканало.
 
По идее VST3 должен имя трека автоматически подхватить внутрь плагина, но если, reaper.TrackFX_AddByName, затем reaper.TrackFX_SetOffline, если Анализатор убрать из оффлайна, то имя трека перед тем как уйти в оффлайн подхватить не успевает.
Чет я вас не понимаю.
Ведь если MMultiAnalyzer увести в оффлайн, неважно как, хоть в ручную , то имя трека этого анализатора автоматом пропадет из всех остальных плагинов. Так что не понимаю чем вам задержка поможет или я просто не понимаю что вы делаете.
Без картинок тут не разобраться)
 
@Archchie, недавно заглянул в реапак и наткнулся на твой скрипт Select next tracks (skip minimized folders) и о боги как же это удобно, уже несколько лет пытаюсь найти элегантное решение проблемы лишних выделяющихся треков и это решение очень удобное! Спасибо за работу!
По дефолту в рипере еще есть второй экшен для навигации по трекам, но он сохраняет предыдущие выделенные треки (go to next/prev track (leaving other tracks selected)). Я постоянно попадаю в ситуации, когда нужно выделить определенные folder треки и сбаунсить стемы, но выделить их стрелками невозможно, т.к. выделяются еще и дочерние треки, приходится тыкать мышкой :(
Хотел поинтересоваться возможно ли добавить подобную версию скрипта с возможность сохранять выделение, но при этом пропускать child треки свернутых папок?
Спасибо!
 
@Archchie, Объясню. Всё это из-за того, что в рипере нет до сих пор толкового post-fader как в Cubase например. Приходится городить костыли. Как правило заморачиваюсь, и делаю костыли "одного клика".
Есть у меня скрипт, он создаёт последним в списке треков, трек VU meters, и если трек какой либо выбран кроме VU meters, то скрипт на треке VU meters делает инсерт VU измерителя и сам всё коммутирует, и переименовывает инсерт в имя трека для нагляднасти. Другой трек если выбрать в VU meters создаётся ещё один инсерт со своей коммутацией и именем и т.д. Далее если нужно вызвать VU измеритель выделяем трек, и вызываем скрипт, откроется нужный VU измеритель с трека VU meters, не нужно блуждать по проекту. Удобно? Для меня весьма. Так вот заменив в этом скрипте (143 строка) на reaper.TrackFX_AddByName(VU_Track, "VST3:MMultiAnalyzer (MeldaProduction)", 0, 1), в MMultiAnalyzer пропадают имена. Хотел использовать хитрость перед инсертом 1) Переименовать "VU meters" в имя выбранного канала 2) Выполнить инсерт MMultiAnalyzer VST3, чтобы он подхватил имя трека 3) Убрать MMultiAnalyzer в оффлайн 4) Переименовать обратно канал назначения в "VU meters". 5) Вывести MMultiAnalyzer из офлайна ожидая что в нём будет валидное имя трека.
Если эти 5 пунктов делать вручную, то всё работает как надо, в скрипте нет.

JavaScript:
function SetFXName(track, fx, new_name)
    if not new_name then return end
    local edited_line,edited_line_id, segm
    -- get ref guid
      if not track or not tonumber(fx) then return end
      local FX_GUID = reaper.TrackFX_GetFXGUID( track, fx )
      if not FX_GUID then return else FX_GUID = FX_GUID:gsub('-',''):sub(2,-2) end
      local plug_type = reaper.TrackFX_GetIOSize( track, fx )
    -- get chunk t
      local _, chunk = reaper.GetTrackStateChunk( track, '', false )
      local t = {} for line in chunk:gmatch("[^\r\n]+") do t[#t+1] = line end
    -- find edit line
      local search
      for i = #t, 1, -1 do
        local t_check = t[i]:gsub('-','')
        if t_check:find(FX_GUID) then search = true  end
        if t[i]:find('<') and search and not t[i]:find('JS_SER') then
          edited_line = t[i]:sub(2)
          edited_line_id = i
          break
        end
      end
    -- parse line
      if not edited_line then return end
      local t1 = {}
      for word in edited_line:gmatch('[%S]+') do t1[#t1+1] = word end
      local t2 = {}
      for i = 1, #t1 do
        segm = t1[i]
        if not q then t2[#t2+1] = segm else t2[#t2] = t2[#t2]..' '..segm end
        if segm:find('"') and not segm:find('""') then if not q then q = true else q = nil end end
      end
 
      if plug_type == 2 then t2[3] = '"'..new_name..'"' end -- if JS
      if plug_type == 3 then t2[5] = '"'..new_name..'"' end -- if VST
 
      local out_line = table.concat(t2,' ')
      t[edited_line_id] = '<'..out_line
      local out_chunk = table.concat(t,'\n')
      --msg(out_chunk)
      reaper.SetTrackStateChunk( track, out_chunk, false )
      reaper.UpdateArrange()
  end
 
function toBits(num)
--http://stackoverflow.com/questions/9079853/lua-print-integer-as-a-binary
-- returns a table of bits, least significant first.
local t={} -- will contain the bits
while num>0 do
rest=math.fmod(num,2)
t[#t+1]=math.floor(rest)
num=(num-rest)/2
end
return t
end
 reaper.PreventUIRefresh(1)
VUid = 0
VU_TrackNum = 0
Count_of_Selected_Tracks = reaper.CountSelectedTracks(0)
Selected_Track = reaper.GetSelectedTrack(0,0)
-->>если Трек не выбран то всё
if Selected_Track == nil then goto done end
--если Трек не выбран то всё<<


Selected_Track_ID = math.ceil(reaper.GetMediaTrackInfo_Value(Selected_Track, "IP_TRACKNUMBER"))
retval, Selected_Track_Name = reaper.GetTrackName(Selected_Track,"")
Sel_TrackNumSends = reaper.GetTrackNumSends(Selected_Track, 0)
VU_Flag = 0
Sendid = 0
DSTCHAN = reaper.GetTrackSendInfo_Value(Selected_Track, 0, Sendid, "I_DSTCHAN")
DST_ID = (DSTCHAN/2)
retval, Receive_Track_Name = reaper.GetTrackSendName(Selected_Track, 0, "")

-->>создаём трек "VU meters", если он не создан
for i=0, reaper.CountTracks(0)-1 do
  local track = reaper.GetTrack(0, i)
  local retval, track_name = reaper.GetTrackName(track,"")
  if track_name == "VU meters" then
  VUid = i+1 break else VUid = -1
  end
  end
  if  VUid == -1 and Count_of_Selected_Tracks ~= 0 then VUid = (reaper.CountTracks(0)+1)
reaper.InsertTrackAtIndex(VUid, true)
Temp_Track = reaper.GetTrack(0,VUid-1)
reaper.GetSetMediaTrackInfo_String(Temp_Track,"P_NAME","VU meters",1)
reaper.SetMediaTrackInfo_Value(Temp_Track, 'B_MAINSEND',0)
reaper.SetMediaTrackInfo_Value(Temp_Track, 'I_NCHAN',64)
end
--создаём трек "VU meters", если он не создан<<

-->>узнаём номер трека "VU meters"
for i=0,reaper.CountTracks(0)-1 do
  local track = reaper.GetTrack(0, i)
  retval, VU_name = reaper.GetTrackName(track,"")
  if VU_name == "VU meters" then
  VU_TrackNum = i+1
  end
  end
--узнаём номер трека "VU meters"<<

-->>Двигаем трек "VU meters" в конец
reaper.Main_OnCommand(reaper.NamedCommandLookup("_SWS_SAVESEL"), 0)
reaper.SetTrackSelected(reaper.GetTrack(0,VU_TrackNum-1), 1)
--Двигаем трек "VU meters" в конец<<

--если выбраный трек "VU meters", то ничего
if Selected_Track_ID == VU_TrackNum then
 reaper.ClearConsole()
 goto done
end
--если выбраный трек "VU meters", то ничего

-->>узнаём скоммутирован ли выбранный трек на "VU meters"
for i=0, Sel_TrackNumSends-1 do
retval, Receive_Track_Name = reaper.GetTrackSendName(Selected_Track, i, "")
if Receive_Track_Name == "VU meters" then VU_Flag = 1 else VU_Flag = 0 end
end
--узнаём скоммутирован ли выбранный трек на "VU meters"<<

VU_Track = reaper.GetTrack(0,VU_TrackNum-1)
VU_Track_Receives = (reaper.GetTrackNumSends(VU_Track, -1))
DSTCHAN = reaper.GetTrackSendInfo_Value(Selected_Track, 0, Sendid, "I_DSTCHAN")
Selected_Track_NumPlusName = Selected_Track_ID.." "..Selected_Track_Name

if VU_Flag == 1 then

for i=0, VU_Track_Receives-1 do
retval, FX_name = reaper.TrackFX_GetFXName(VU_Track, i, "")
if Selected_Track_NumPlusName == FX_name then
reaper.TrackFX_Show(VU_Track, i, 3)
end
end
end

----------------------------------------------------------------
VU_Track_Receives = (reaper.GetTrackNumSends(VU_Track, -1))
if VU_Flag == 0 then
reaper.CreateTrackSend(Selected_Track, VU_Track)
----------------------------------------------------------------
reaper.SetTrackSendInfo_Value(VU_Track, -1, VU_Track_Receives, "I_DSTCHAN", VU_Track_Receives*2)
----------------------------------------------------------------
reaper.TrackFX_AddByName(VU_Track, "mvMeter2 (TBProAudio)", 0, 1)
----------------------------------------------------------------
reaper.TrackFX_SetPinMappings(VU_Track, VU_Track_Receives, 0, 0, 1<<(VU_Track_Receives)*2 , 0<<0)
reaper.TrackFX_SetPinMappings(VU_Track, VU_Track_Receives, 0, 1, 1<<(VU_Track_Receives)*2+1, 0<<0)
----------------------------------------------------------------
SetFXName(reaper.GetTrack(0,VU_TrackNum-1), VU_Track_Receives, Selected_Track_ID.." "..Selected_Track_Name)
reaper.TrackFX_Show(VU_Track, VU_Track_Receives, 3)
end
----------------------------------------------------------------
reaper.PreventUIRefresh(-1)
::done::
 
@J T, Попробуй так.
JavaScript:
    function SetFXName(track, fx, new_name)
        if not new_name then return end
        local edited_line,edited_line_id, segm
        -- get ref guid
          if not track or not tonumber(fx) then return end
          local FX_GUID = reaper.TrackFX_GetFXGUID( track, fx )
          if not FX_GUID then return else FX_GUID = FX_GUID:gsub('-',''):sub(2,-2) end
          local plug_type = reaper.TrackFX_GetIOSize( track, fx )
        -- get chunk t
          local _, chunk = reaper.GetTrackStateChunk( track, '', false )
          local t = {} for line in chunk:gmatch("[^\r\n]+") do t[#t+1] = line end
        -- find edit line
          local search
          for i = #t, 1, -1 do
            local t_check = t[i]:gsub('-','')
            if t_check:find(FX_GUID) then search = true  end
            if t[i]:find('<') and search and not t[i]:find('JS_SER') then
              edited_line = t[i]:sub(2)
              edited_line_id = i
              break
            end
          end
        -- parse line
          if not edited_line then return end
          local t1 = {}
          for word in edited_line:gmatch('[%S]+') do t1[#t1+1] = word end
          local t2 = {}
          for i = 1, #t1 do
            segm = t1[i]
            if not q then t2[#t2+1] = segm else t2[#t2] = t2[#t2]..' '..segm end
            if segm:find('"') and not segm:find('""') then if not q then q = true else q = nil end end
          end
 
          if plug_type == 2 then t2[3] = '"'..new_name..'"' end -- if JS
          if plug_type == 3 then t2[5] = '"'..new_name..'"' end -- if VST
 
          local out_line = table.concat(t2,' ')
          t[edited_line_id] = '<'..out_line
          local out_chunk = table.concat(t,'\n')
          --msg(out_chunk)
          reaper.SetTrackStateChunk( track, out_chunk, false )
          reaper.UpdateArrange()
      end
 
    function toBits(num)
    --http://stackoverflow.com/questions/9079853/lua-print-integer-as-a-binary
    -- returns a table of bits, least significant first.
    local t={} -- will contain the bits
    while num>0 do
    rest=math.fmod(num,2)
    t[#t+1]=math.floor(rest)
    num=(num-rest)/2
    end
    return t
    end
     reaper.PreventUIRefresh(1)
    VUid = 0
    VU_TrackNum = 0
    Count_of_Selected_Tracks = reaper.CountSelectedTracks(0)
    Selected_Track = reaper.GetSelectedTrack(0,0)
    -->>если Трек не выбран то всё
    if Selected_Track == nil then goto done end
    --если Трек не выбран то всё<<
 
 
    Selected_Track_ID = math.ceil(reaper.GetMediaTrackInfo_Value(Selected_Track, "IP_TRACKNUMBER"))
    retval, Selected_Track_Name = reaper.GetTrackName(Selected_Track,"")
    Sel_TrackNumSends = reaper.GetTrackNumSends(Selected_Track, 0)
    VU_Flag = 0
    Sendid = 0
    DSTCHAN = reaper.GetTrackSendInfo_Value(Selected_Track, 0, Sendid, "I_DSTCHAN")
    DST_ID = (DSTCHAN/2)
    retval, Receive_Track_Name = reaper.GetTrackSendName(Selected_Track, 0, "")
 
    -->>создаём трек "VU meters", если он не создан
    for i=0, reaper.CountTracks(0)-1 do
      local track = reaper.GetTrack(0, i)
      local retval, track_name = reaper.GetTrackName(track,"")
      if track_name == "VU meters" then
      VUid = i+1 break else VUid = -1
      end
      end
      if  VUid == -1 and Count_of_Selected_Tracks ~= 0 then VUid = (reaper.CountTracks(0)+1)
    reaper.InsertTrackAtIndex(VUid, true)
    Temp_Track = reaper.GetTrack(0,VUid-1)
    reaper.GetSetMediaTrackInfo_String(Temp_Track,"P_NAME","VU meters",1)
    reaper.SetMediaTrackInfo_Value(Temp_Track, 'B_MAINSEND',0)
    reaper.SetMediaTrackInfo_Value(Temp_Track, 'I_NCHAN',64)
    end
    --создаём трек "VU meters", если он не создан<<
 
    -->>узнаём номер трека "VU meters"
    for i=0,reaper.CountTracks(0)-1 do
      local track = reaper.GetTrack(0, i)
      retval, VU_name = reaper.GetTrackName(track,"")
      if VU_name == "VU meters" then
      VU_TrackNum = i+1
      end
      end
    --узнаём номер трека "VU meters"<<
 
    -->>Двигаем трек "VU meters" в конец
    reaper.Main_OnCommand(reaper.NamedCommandLookup("_SWS_SAVESEL"), 0)
    reaper.SetTrackSelected(reaper.GetTrack(0,VU_TrackNum-1), 1)
    --Двигаем трек "VU meters" в конец<<
 
    --если выбраный трек "VU meters", то ничего
    if Selected_Track_ID == VU_TrackNum then
     reaper.ClearConsole()
     goto done
    end
    --если выбраный трек "VU meters", то ничего
 
    -->>узнаём скоммутирован ли выбранный трек на "VU meters"
    for i=0, Sel_TrackNumSends-1 do
    retval, Receive_Track_Name = reaper.GetTrackSendName(Selected_Track, i, "")
    if Receive_Track_Name == "VU meters" then VU_Flag = 1 else VU_Flag = 0 end
    end
    --узнаём скоммутирован ли выбранный трек на "VU meters"<<
 
    VU_Track = reaper.GetTrack(0,VU_TrackNum-1)
    VU_Track_Receives = (reaper.GetTrackNumSends(VU_Track, -1))
    DSTCHAN = reaper.GetTrackSendInfo_Value(Selected_Track, 0, Sendid, "I_DSTCHAN")
    Selected_Track_NumPlusName = Selected_Track_ID.." "..Selected_Track_Name
 
    if VU_Flag == 1 then
 
    for i=0, VU_Track_Receives-1 do
    retval, FX_name = reaper.TrackFX_GetFXName(VU_Track, i, "")
    if Selected_Track_NumPlusName == FX_name then
    reaper.TrackFX_Show(VU_Track, i, 3)
    end
    end
    end
 
    ----------------------------------------------------------------
    VU_Track_Receives = (reaper.GetTrackNumSends(VU_Track, -1))
    if VU_Flag == 0 then
    reaper.CreateTrackSend(Selected_Track, VU_Track)
    ----------------------------------------------------------------
    reaper.SetTrackSendInfo_Value(VU_Track, -1, VU_Track_Receives, "I_DSTCHAN", VU_Track_Receives*2)
    ----------------------------------------------------------------
    --reaper.TrackFX_AddByName(VU_Track, "mvMeter2 (TBProAudio)", 0, 1)
 
    local retval_,strNBig_ = reaper.GetSetMediaTrackInfo_String(VU_Track,'P_NAME','',0);
    reaper.GetSetMediaTrackInfo_String(VU_Track,'P_NAME',Selected_Track_Name,1);
    local fx_= reaper.TrackFX_AddByName(VU_Track,"VST3:MMultiAnalyzer (MeldaProduction)",0,1);
 
    local x = 0;
    local function X();
        x = x + 1;
        if x >= 10 then;
            reaper.GetSetMediaTrackInfo_String(VU_Track,'P_NAME',strNBig_,1);
            return;
        end;
        reaper.defer(X);
    end;reaper.defer(X);
 
 
    ----------------------------------------------------------------
    reaper.TrackFX_SetPinMappings(VU_Track, VU_Track_Receives, 0, 0, 1<<(VU_Track_Receives)*2 , 0<<0)
    reaper.TrackFX_SetPinMappings(VU_Track, VU_Track_Receives, 0, 1, 1<<(VU_Track_Receives)*2+1, 0<<0)
    ----------------------------------------------------------------
    SetFXName(reaper.GetTrack(0,VU_TrackNum-1), VU_Track_Receives, Selected_Track_ID.." "..Selected_Track_Name)
    reaper.TrackFX_Show(VU_Track, VU_Track_Receives, 3)
    end
    ----------------------------------------------------------------
    reaper.PreventUIRefresh(-1)
    ::done::
 
Последнее редактирование:
  • Like
Реакции: J T
@Archchie, недавно заглянул в реапак и наткнулся на твой скрипт Select next tracks (skip minimized folders) и о боги как же это удобно, уже несколько лет пытаюсь найти элегантное решение проблемы лишних выделяющихся треков и это решение очень удобное! Спасибо за работу!
По дефолту в рипере еще есть второй экшен для навигации по трекам, но он сохраняет предыдущие выделенные треки (go to next/prev track (leaving other tracks selected)). Я постоянно попадаю в ситуации, когда нужно выделить определенные folder треки и сбаунсить стемы, но выделить их стрелками невозможно, т.к. выделяются еще и дочерние треки, приходится тыкать мышкой :(
Хотел поинтересоваться возможно ли добавить подобную версию скрипта с возможность сохранять выделение, но при этом пропускать child треки свернутых папок?
Спасибо!
Возможно - Миллион долларов с вас).

Archie_Track; Select next tracks(skip minimized folders)(leaving other selected)(`).lua
Archie_Track; Select previous tracks(skip minimized folders)(leaving other selected)(`).lua
Archie_Track; Select next tracks(skip folders)(leaving other selected)(`).lua

Archie_Track; Select previous tracks(skip folders)(leaving other selected)(`).lua
 
  • Like
Реакции: AbramoV
local x = 0; local function X(); x = x + 1; if x >= 10 then; reaper.GetSetMediaTrackInfo_String(VU_Track,'P_NAME',strNBig_,1); return; end; reaper.defer(X); end;reaper.defer(X);
Это такая себе обманка паузы на 10 циклов defer -ра (около 36 циклов в секунду).
Но дело в том, что defer не имеет стабильного времени и зависит от нагруженности проекта.
Но в вашем случаи вполне может стабильно работать.
 
  • Like
Реакции: J T
Это такая себе обманка паузы на 10 циклов defer -ра (около 36 циклов в секунду).
Нет, defer сравнивать с секундами, это не коректно совсем, т.к. время будет зависеть от машины в первую очередь, от нагруженности проекта, (если запуск дефера не холостой, т.е. если выполняется тяжелый скрипт )и самого сценария - от времени его выполнения, т.к. если открываются какие нибудь плагины, то это может быть не 36 циклов в секунду, а 1 цикл в несколько секунд.

Это такая себе обманка паузы на 10 циклов defer -ра
Но в вашем случаи вполне может стабильно работать.
В этом случае и двух деферов за глаза хватит, это я 10 так на верника что бы. Здесь смысл не в загрузке плагина, как это думал @J T, а в том что плагин не успевал прочитать имя трека, т.к. рипер переименовывает быстрее.
Т.е.
1. переименовываем трек в 111
-. плагин начинает читать трек и сохранять в себе имя
2. переименовываем трек в 222
3. плагин прочитал и сохранил имя 222, т.к. он не успел прочитать 111.
Так что здесь нужно просто дать плагину успеть прочитать имя трека. Но в нагруженном проекте 2 дефера может и не хватить, потому наверняка и 10-ть.

Это не общедоступный скрипт - а @J T делает для себя. Так что если что то пойдет не так, он всегда может увеличить эту 10 на большее число. Ну а если по хорошему, то нужно скрипт переписывать полностью. Менять структуру его. Нужно сначала добавлять плагин и только потом посылами и переименованиями заниматься. Наверно.
@Archchie, Крутяк! reaper.defer чтоб поумнеть, что эта функция делает?
Простым языком:
В данном случае:
Сначала выполняется весь скрипт, пропуская переименования трека.
Там где стоит defer, он просто запоминает переменные и не выполняется.
После того, как скрипт завершился полностью, запускается defer. В данном случае 10 раз - это очень быстро (меньше секунды), т.к. он запускается в холостую (это тоже самое, что и функция в скриптах no_undo), а это значит что скорость его не будет зависеть от нагруженности проекта. И только после десяти запусков запустится функция переименования.
 
Последнее редактирование:
reaper.defer чтоб поумнеть, что эта функция делает?
Вот небольшой пример для понимания.
Обрати внимания на код, на первый взгляд кажется что должно снятся выделение со всех треков, т.к. мы сначала выделяем все треки, а только потом снимаем выделения со всех треков.
Но нет, все треки в этом коде наоборот выделятся, потому что - из за того что выделение обернуто в defer, оно сработает только после того как снимется выделение, хоть и написано раньше.
defer всегда выполняется после завершения скрипта. Если defer-ов несколько, то они выполняются по очередности, по завершению скрипта.

PHP:
    local t={};
    for i=1,reaper.CountTracks(0) do;
        t[i]= reaper.GetTrack(0,i-1);
    end;
    
    
    reaper.defer(function();
        for i=1,#t do;
            reaper.SetMediaTrackInfo_Value(t[i],'I_SELECTED',1);
        end;
    end);
    
    
    for i=1,#t do;
        reaper.SetMediaTrackInfo_Value(t[i],'I_SELECTED',0);
    end;
 
Последнее редактирование:
Нет, defer сравнивать с секундами, это не коректно совсем, т.к. время будет зависеть от машины в первую очередь, от нагруженности проекта, (если запуск дефера не холостой, т.е. если выполняется тяжелый скрипт )и самого сценария - от времени его выполнения, т.к. если открываются какие нибудь плагины, то это может быть не 36 циклов в секунду,
Для спросившего - это именно обманка паузы выполнения следующего действия. И я ведь написал всё точно тоже самое, что вы после слова НЕТ.
Кстати, я в очень разных нагрузках измерял время цикла дефера - оно никогда не было медленнее чем 26 раз в секунду, но видимо можно придумать ситуацию при которой будет медленее.
 
  • Like
Реакции: Archie's
но видимо можно придумать ситуацию при которой будет медленее.
Конечно можно. Смотря что за задумка и кто пишет.
Вот небольшой пример того. Конечно это очень грубый пример и в реальной ситуации такого не будет, но все же он показывает то, что от функций и от того как построен код, зависит его (дефера) скорость.
PHP:
   local name = 'VST:ReaEQ (Cockos)'
   local name = "VST3:MMultiAnalyzer (MeldaProduction)"
  
  
   local x=0
   tm = os.time()
   reaper.ShowConsoleMsg('')
   function vvv();
      
       x=x+1
       local track = reaper.GetTrack(0,0)
       reaper.PreventUIRefresh(1)
      
       for i = 1,10 do
           local fx_= reaper.TrackFX_AddByName(track,name,0,-1);
           reaper.TrackFX_SetOffline(track,fx_,1)
           reaper.TrackFX_Delete(track,0)
       end;
       reaper.PreventUIRefresh(-1)
      
      
       reaper.ShowConsoleMsg(x..' - '..10-(x-1)..'\n')
       if x >= 10 then
          reaper.ShowConsoleMsg('\n'..os.time()-tm..' - sec')
          return
       end
       reaper.defer(vvv)
   end
   reaper.defer(vvv)
Да и вообще такие функции как defer или goto в "неумелых" руках могут сыграть злую шутку.

Например вот два элементарных примера, про то что некоторые забивают на простые проверки. И если весь код написан по сценарию первого примера, то соответственно этот код будет намного медленнее, чем код написанный по сценарию второго примера, т.к. функция set занимает очень много ресурсов т.к. она читает и переписывает, а запись отнимает очень много ресурсов, а get только читает.
Пример 1
PHP:
   local CountTrack = reaper.CountTracks(0)
   for i = 1,CountTrack do
       track = reaper.GetTrack(0,i-1)
       reaper.SetMediaTrackInfo_Value(track,'I_SELECTED',1)
   end
Пример 2
PHP:
   local CountTrack = reaper.CountTracks(0)
   for i = 1,CountTrack do
       track = reaper.GetTrack(0,i-1)
       sel = reaper.GetMediaTrackInfo_Value(track,'I_SELECTED')
       if sel == 0 then
           reaper.SetMediaTrackInfo_Value(track,'I_SELECTED',1)
       end
   end
Ну и соответственно если написать большой скрипт по сценарию первого примера и если он будет работать в цикле (дефер), то он (цикл дефера) будет на много медленнее, чем если бы скрипт был написан с проверками.
 
  • Like
Реакции: Aleksandr Oleynik
Ребята, я наверное пропустил что-то. А ReaScriptRU Работает?
Посмотрел, а там у меня два скрипта всего в папке:
Archie_Split selected items under mouse cursor (select left) и Oleynik_Realtime performance optimization
 
День добр ), подскажите пожалуйста.
Как сделать что то типа fade start stop play?

есть последовательность фанер( по трекам) надо перемещаться по маркерам иногда возвращаясь к одной (она будет зациклена)
это для концерта, а одна из них(зацикленная)- для ведущих
Сейчас используем аимп.
188753

Если возможно, что то поиском не нашел (
Спасибо.
 
Последнее редактирование:

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