При клике по кнопке с аккордом нужно зажимать Shift.У меня скрипт "Script: pandabot_ChordGun.lua" не генерирует аккорды.
В чём может быть проблема?
правильно ли я понял, что нужно просто все ноты собрать со всех нот на одну ноту? Думаю, что проще всего открыть второй айтем, выделить все ноты, нажать Ctrl+F2 или View->Event properties и вписать/выбрать из списка нужную Note, например C2 и применить.Возможно ли по шаблону первого клипа сделать ту же линию во втором
Не знаю, какие ещё контроллеры нужно задействовать, но для того, чтобы перенести грув и велосити со второго на первый, а это проще, чем наоборот, можно воспользоваться Groove tool. То есть, снять квантайз с сохранением велосити со второго и применить на первый.Подскажите, есть ли такой скрипт.
Допустим, есть у нас два миди-клипа (или как клипы в Рипере называются? что-то забыл..).
В одном определенная одноголосая мелодическая линия, а в другом ритмически повторяющая первый, но с произвольной тональностью.
Возможно ли по шаблону первого клипа сделать ту же линию во втором, но - оставляя велосити, небольшие отклонения от сетки, а также все контроллеры от второго?
Достаточно сложная задача, так как каждый FX загружается разное время.Подскажите, как сделать задержку в скрипте? Что нужно: В инсерт трека скрипт добавляет FX, и далее нужно подождать когда он прогрузится до конца, как только прогружается, следующее действие. Нужно как-то попросить скрипт подождать.)
Я может чего то не понимаю что вам нужно, но при добавлении какого нибудь плагина скрипт и так останавливается.Подскажите, как сделать задержку в скрипте? Что нужно: В инсерт трека скрипт добавляет FX, и далее нужно подождать когда он прогрузится до конца, как только прогружается, следующее действие. Нужно как-то попросить скрипт подождать.)
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);
Эти действия в скриптах не работают, они только для кастомов гадятся.А чем не нравится предложенный @Snjuk, вариант?
Поделитесь пожалуйста.вообще - у меня есть код для пауз в выполнении последовательных действий
Чет я вас не понимаю.По идее VST3 должен имя трека автоматически подхватить внутрь плагина, но если, reaper.TrackFX_AddByName, затем reaper.TrackFX_SetOffline, если Анализатор убрать из оффлайна, то имя трека перед тем как уйти в оффлайн подхватить не успевает.
Только в пятницу вечером, если напомните.Поделитесь пожалуйста.
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::
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::
Возможно - Миллион долларов с вас).@Archchie, недавно заглянул в реапак и наткнулся на твой скрипт Select next tracks (skip minimized folders) и о боги как же это удобно, уже несколько лет пытаюсь найти элегантное решение проблемы лишних выделяющихся треков и это решение очень удобное! Спасибо за работу!
По дефолту в рипере еще есть второй экшен для навигации по трекам, но он сохраняет предыдущие выделенные треки (go to next/prev track (leaving other tracks selected)). Я постоянно попадаю в ситуации, когда нужно выделить определенные folder треки и сбаунсить стемы, но выделить их стрелками невозможно, т.к. выделяются еще и дочерние треки, приходится тыкать мышкой
Хотел поинтересоваться возможно ли добавить подобную версию скрипта с возможность сохранять выделение, но при этом пропускать child треки свернутых папок?
Спасибо!
Это такая себе обманка паузы на 10 циклов defer -ра (около 36 циклов в секунду).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);
Отлаживает выполнение функции до завершения скрипта.@Archchie, Крутяк! reaper.defer чтоб поумнеть, что эта функция делает?
Нет, defer сравнивать с секундами, это не коректно совсем, т.к. время будет зависеть от машины в первую очередь, от нагруженности проекта, (если запуск дефера не холостой, т.е. если выполняется тяжелый скрипт )и самого сценария - от времени его выполнения, т.к. если открываются какие нибудь плагины, то это может быть не 36 циклов в секунду, а 1 цикл в несколько секунд.Это такая себе обманка паузы на 10 циклов defer -ра (около 36 циклов в секунду).
В этом случае и двух деферов за глаза хватит, это я 10 так на верника что бы. Здесь смысл не в загрузке плагина, как это думал @J T, а в том что плагин не успевал прочитать имя трека, т.к. рипер переименовывает быстрее.Это такая себе обманка паузы на 10 циклов defer -ра
Но в вашем случаи вполне может стабильно работать.
Простым языком:@Archchie, Крутяк! reaper.defer чтоб поумнеть, что эта функция делает?
Вот небольшой пример для понимания.reaper.defer чтоб поумнеть, что эта функция делает?
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 циклов в секунду,
Конечно можно. Смотря что за задумка и кто пишет.но видимо можно придумать ситуацию при которой будет медленее.
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)
local CountTrack = reaper.CountTracks(0)
for i = 1,CountTrack do
track = reaper.GetTrack(0,i-1)
reaper.SetMediaTrackInfo_Value(track,'I_SELECTED',1)
end
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