Сделал также еще триаду скриптов на тему сенды. Для примера возьмем всем известный Kontakt. В рипере для роутинга лучше всего использовать два трека - миди и аудио. С миди мы отправляем с 1 по 16 миди канал на Kontkat, а на аудио приходит стерео пара с 1/2 по 31/32 включительно. Задача скриптов уменьшить кол-во кликов для всего этого, а также избежать темплейтов, если они не требуются. Для работы скриптов нужен исходный один трек с мультиканальным инструментом. Итак:
1) Первый скрипт создает сразу и аудио и миди трек. Причем, я не сразу догадался, как лучше сделать, но в итоге решил создавать новые треки НАД треком с Kontakt. Почему над? Потому что когда мы будем последовательно создавать миди и аудио трек (сначала 1 и 1/2, потом 2 и 3\4, потом 3 и 5\6 и т.п.), удобнее видеть правильный порядок каналов от меньшего к большему сверху вниз. Если мы будем создавать треки под треком с Kontakt, то порядок по итогу получится обратный (можно конечно добавить алгоритм поиска треков в скрипте, но это будет криво в сложных случаях из-за отсутствия четкого идентификатора треков, поэтому скрипт создает треки рядом с треком Kontakt, отодвигая предыдущие).
В окошке скрипта нужно ввести сначала название трека, потом номер канала соответственно миди каналу. Аудио стерео-пара вычисляется сама. Если ввести 0 - будет создан ТОЛЬКО миди трек, с каналом "All", т.к. аудио выход уже невозможно определить, и, вероятно, аудио выходов может быть несколько на один такой миди трек.
2) Второй скрипт - упрощение первого, создает только миди треки. Все аналогично - вводим с 0 по 16 миди канал, но не будут создаваться аудио треки
3) Третий скрипт - также упрощение первого, создает только аудио треки. Канал все также вводится по принципу миди каналов для удобства.
Скрипты имеют настройки в шапке. Для себя сделал так, что миди треки не отображаются в микшере, а аудио треки не отображаются в аранжировке. В общем тут как хотите, все нужные параметры я вывел, в том числе цвет новых треков по умолчанию, а также постфикс в названии треков в соответствии с каналами (мне удобнее, когда он есть). Для всех скриптов увы снова нужен SWS (буквально по паре функций посылов приходится брать с его API). Вроде все, как всегда если найдете ошибки, пишите сюда! Обновления (если будут) отпишу сюда в постах в виде исходного кода.
P.S. Кстати, если у вас есть SWS autocolor, он должен работать, когда треки не раскрашиваются (как по умолчанию)
1) Первый скрипт создает сразу и аудио и миди трек. Причем, я не сразу догадался, как лучше сделать, но в итоге решил создавать новые треки НАД треком с Kontakt. Почему над? Потому что когда мы будем последовательно создавать миди и аудио трек (сначала 1 и 1/2, потом 2 и 3\4, потом 3 и 5\6 и т.п.), удобнее видеть правильный порядок каналов от меньшего к большему сверху вниз. Если мы будем создавать треки под треком с Kontakt, то порядок по итогу получится обратный (можно конечно добавить алгоритм поиска треков в скрипте, но это будет криво в сложных случаях из-за отсутствия четкого идентификатора треков, поэтому скрипт создает треки рядом с треком Kontakt, отодвигая предыдущие).
В окошке скрипта нужно ввести сначала название трека, потом номер канала соответственно миди каналу. Аудио стерео-пара вычисляется сама. Если ввести 0 - будет создан ТОЛЬКО миди трек, с каналом "All", т.к. аудио выход уже невозможно определить, и, вероятно, аудио выходов может быть несколько на один такой миди трек.
JavaScript:
--///////////|||\\\\\\\\\\\---Customize this---///////////|||\\\\\\\\\\--
---some parameters for tracks--------------------------------------------
show_audio_on_tcp = false
show_midi_on_mcp = false
number_of_channel_in_names = true
-------------------------------------------------------------------------
---color for midi track--------------------------------------------------
R_m = 0 ---Red
G_m = 0 ---Green
B_m = 0 ---Blue
-------------------------------------------------------------------------
---color for audio track-------------------------------------------------
R_a = 0 ---Red
G_a = 0 ---Green
B_a = 0 ---Blue
-------------------------------------------------------------------------
--\\\\\\\\\\\|||///////////---//////||\\\\\\---\\\\\\\\\\\|||//////////--
--///////////-----------------------------------------------\\\\\\\\\\\--
--===========---RUN SCRIPT--START START START--RUN SCRIPT---===========--
--\\\\\\\\\\\-----------------------------------------------///////////--
function bla() end
function nothing() reaper.defer(bla) end
if (show_audio_on_tcp ~= true and show_audio_on_tcp ~= false)
or (show_midi_on_mcp ~= true and show_midi_on_mcp ~= false)
or (number_of_channel_in_names ~= true and number_of_channel_in_names ~= false)
then
reaper.MB
(
'Incorrect value for "show_audio_on_tcp" ' ..
'or "show_midi_on_mcp" or "number_of_channel_in_names". Set the boolen - "true" or "false"',
'Error',0
)
nothing() return
end
local test_SWS = reaper.NF_GetMediaItemPeakRMS_Windowed --function added in 2.9.7 SWS
if not test_SWS then
reaper.MB('Please install or update SWS extension', 'Error', 0) nothing() return
end
if reaper.CountSelectedTracks(0) > 0 then
::START::
local retval, value = reaper.GetUserInputs
(
'Create new tracks from multich VSTi',
2, 'Set the tracks name:,Set channel (0-16):', ","
)
if retval then
reaper.Undo_BeginBlock()
reaper.PreventUIRefresh(1)
local t = {}
for s in string.gmatch(value,'[^,]+') do
table.insert(t,s)
end
if #t ~= 2 then
reaper.MB('Incorrect value or no value. Set the correct value for any line', 'Error', 0)
goto START
end
name = t[1]
channel = t[2]
if channel ~= string.match(channel,'%d+')
or (tonumber(channel) < 0 or tonumber(channel) > 16)
then
reaper.MB('Incorrect value. Set the correct midi channel (0-16)', 'Error', 0)
goto START
end
booln = true
name_tr = channel
if channel == '0' then
name_tr = 'All'
booln = false
end
function convert_bool(bool)
if bool == false then
bool = 0
else
bool = 1
end
return bool
end
--START-CyCLe----START-CyCLe----START-CyCLe----START-CyCLe--
for i = 0, reaper.CountSelectedTracks(0)-1 do
------------------------------------------------------------
--START--//////////////////////---Get instrument track and set send properties---\\\\\\\\\\\\\\\\\\\\\\\\\\\\\--
local get_instrument_track = reaper.GetSelectedTrack(0,i)
local instrument_track_num = reaper.GetMediaTrackInfo_Value(get_instrument_track,'IP_TRACKNUMBER')
if reaper.GetMediaTrackInfo_Value(get_instrument_track,'B_MAINSEND') == 1 then
reaper.SetMediaTrackInfo_Value(get_instrument_track,'B_MAINSEND', 0)
end
if booln == true then
if reaper.GetMediaTrackInfo_Value(get_instrument_track,'I_NCHAN') < tonumber(channel)*2 then
reaper.SetMediaTrackInfo_Value(get_instrument_track,'I_NCHAN', tonumber(channel)*2)
end
end
---END---\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\--------/////////////////////////////////////////////////////--
--START--/////////////////////---Insert MIDI track and set send properties---\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\--
reaper.InsertTrackAtIndex(instrument_track_num-1,false)
local get_midi_track = reaper.GetTrack(0,instrument_track_num-1)
if number_of_channel_in_names == true then
reaper.GetSetMediaTrackInfo_String(get_midi_track, 'P_NAME', name .. ' - ' .. name_tr .. ' ch', true)
else
reaper.GetSetMediaTrackInfo_String(get_midi_track, 'P_NAME', name, true)
end
if reaper.GetMediaTrackInfo_Value(get_midi_track, 'I_RECMON') == 0 then
reaper.SetMediaTrackInfo_Value(get_midi_track, 'I_RECMON', 1)
end
reaper.SetMediaTrackInfo_Value(get_midi_track, 'B_SHOWINMIXER', convert_bool(show_midi_on_mcp))
if R_m == 0 and G_m == 0 and B_m == 0 then
nothing()
else
reaper.SetTrackColor(get_midi_track, reaper.ColorToNative(R_m,G_m,B_m)|0x1000000)
end
reaper.CreateTrackSend(get_midi_track, get_instrument_track)
reaper.SetTrackSendInfo_Value(get_midi_track, 0, 0, 'I_SRCCHAN', -1)
if booln == true then
reaper.SetTrackSendInfo_Value(get_midi_track, 0, 0, 'I_MIDIFLAGS', tonumber(channel) << 5)
else
reaper.SetTrackSendInfo_Value(get_midi_track, 0, 0, 'I_MIDIFLAGS', 0)
end
---END---\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\--------///////////////////////////////////////////////////--
--START--/////////////////////---Insert Audio track and set send properties---\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\--
if booln == true then
reaper.InsertTrackAtIndex(instrument_track_num,false)
local get_audio_track = reaper.GetTrack(0,instrument_track_num)
if number_of_channel_in_names == true then
reaper.GetSetMediaTrackInfo_String(get_audio_track, 'P_NAME', name .. ' - '.. name_tr .. ' st', true)
else
reaper.GetSetMediaTrackInfo_String(get_audio_track, 'P_NAME', name, true)
end
reaper.SetMediaTrackInfo_Value(get_audio_track, 'B_SHOWINTCP', convert_bool(show_audio_on_tcp))
if R_a == 0 and G_a == 0 and B_a == 0 then
nothing()
else
reaper.SetTrackColor(get_audio_track, reaper.ColorToNative(R_a,G_a,B_a)|0x1000000)
end
reaper.CreateTrackSend(get_instrument_track, get_audio_track)
reaper.BR_GetSetTrackSendInfo(get_audio_track, -1, 0, 'I_MIDI_SRCCHAN', true, -1)
reaper.SetTrackSendInfo_Value(get_audio_track, -1, 0, 'I_SRCCHAN', 2*(tonumber(channel)-1))
end
---END---\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\--------///////////////////////////////////////////////////--
--END-CyCLe----END-CyCLe--
end
--------------------------
reaper.Undo_EndBlock('Create midi and audio track from multichannel VSTi (track)', -1)
reaper.PreventUIRefresh(-1)
else
nothing() return
end
else
reaper.MB('Please select a track', 'Error',0)
nothing()
end
2) Второй скрипт - упрощение первого, создает только миди треки. Все аналогично - вводим с 0 по 16 миди канал, но не будут создаваться аудио треки
JavaScript:
--///////////|||\\\\\\\\\\\---Customize this---///////////|||\\\\\\\\\\--
---some parameters for tracks--------------------------------------------
show_midi_on_mcp = false
number_of_channel_in_names = true
-------------------------------------------------------------------------
---color for midi track--------------------------------------------------
R_m = 0 ---Red
G_m = 0 ---Green
B_m = 0 ---Blue
-------------------------------------------------------------------------
--\\\\\\\\\\\|||///////////---//////||\\\\\\---\\\\\\\\\\\|||//////////--
--///////////-----------------------------------------------\\\\\\\\\\\--
--===========---RUN SCRIPT--START START START--RUN SCRIPT---===========--
--\\\\\\\\\\\-----------------------------------------------///////////--
function bla() end
function nothing() reaper.defer(bla) end
if (show_midi_on_mcp ~= true and show_midi_on_mcp ~= false)
or (number_of_channel_in_names ~= true and number_of_channel_in_names ~= false)
then
reaper.MB
(
'Incorrect value for "show_midi_on_mcp" or "number_of_channel_in_names". Set the boolen - "true" or "false"',
'Error',0
)
nothing() return
end
local test_SWS = reaper.NF_GetMediaItemPeakRMS_Windowed --function added in 2.9.7 SWS
if not test_SWS then
reaper.MB('Please install or update SWS extension', 'Error', 0) nothing() return
end
if reaper.CountSelectedTracks(0) > 0 then
::START::
local retval, value = reaper.GetUserInputs
(
'Create MIDI track from multich VSTi',
2, 'Set the MIDI track name:,Set channel (0-16):', ","
)
if retval then
reaper.Undo_BeginBlock()
reaper.PreventUIRefresh(1)
local t = {}
for s in string.gmatch(value,'[^,]+') do
table.insert(t,s)
end
if #t ~= 2 then
reaper.MB('Incorrect value or no value. Set the correct value for any line', 'Error', 0)
goto START
end
name = t[1]
channel = t[2]
if channel ~= string.match(channel,'%d+')
or (tonumber(channel) < 0 or tonumber(channel) > 16)
then
reaper.MB('Incorrect value. Set the correct midi channel (0-16)', 'Error', 0)
goto START
end
booln = true
name_tr = channel
if channel == '0' then
name_tr = 'All'
booln = false
end
function convert_bool(bool)
if bool == false then
bool = 0
else
bool = 1
end
return bool
end
--START-CyCLe----START-CyCLe----START-CyCLe----START-CyCLe--
for i = 0, reaper.CountSelectedTracks(0)-1 do
------------------------------------------------------------
--START--//////////////////////---Get instrument track and set send properties---\\\\\\\\\\\\\\\\\\\\\\\\\\\\\--
local get_instrument_track = reaper.GetSelectedTrack(0,i)
local instrument_track_num = reaper.GetMediaTrackInfo_Value(get_instrument_track,'IP_TRACKNUMBER')
---END---\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\--------/////////////////////////////////////////////////////--
--START--/////////////////////---Insert MIDI track and set send properties---\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\--
reaper.InsertTrackAtIndex(instrument_track_num-1,false)
local get_midi_track = reaper.GetTrack(0,instrument_track_num-1)
if number_of_channel_in_names == true then
reaper.GetSetMediaTrackInfo_String(get_midi_track, 'P_NAME', name .. ' - ' .. name_tr .. ' ch', true)
else
reaper.GetSetMediaTrackInfo_String(get_midi_track, 'P_NAME', name, true)
end
if reaper.GetMediaTrackInfo_Value(get_midi_track, 'I_RECMON') == 0 then
reaper.SetMediaTrackInfo_Value(get_midi_track, 'I_RECMON', 1)
end
reaper.SetMediaTrackInfo_Value(get_midi_track, 'B_SHOWINMIXER', convert_bool(show_midi_on_mcp))
if R_m == 0 and G_m == 0 and B_m == 0 then
nothing()
else
reaper.SetTrackColor(get_midi_track, reaper.ColorToNative(R_m,G_m,B_m)|0x1000000)
end
reaper.CreateTrackSend(get_midi_track, get_instrument_track)
reaper.SetTrackSendInfo_Value(get_midi_track, 0, 0, 'I_SRCCHAN', -1)
if booln == true then
reaper.SetTrackSendInfo_Value(get_midi_track, 0, 0, 'I_MIDIFLAGS', tonumber(channel) << 5)
else
reaper.SetTrackSendInfo_Value(get_midi_track, 0, 0, 'I_MIDIFLAGS', 0)
end
---END---\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\--------///////////////////////////////////////////////////--
--END-CyCLe----END-CyCLe--
end
--------------------------
reaper.Undo_EndBlock('Create midi track from multichannel VSTi (track)', -1)
reaper.PreventUIRefresh(-1)
else
nothing() return
end
else
reaper.MB('Please select a track', 'Error',0)
nothing()
end
3) Третий скрипт - также упрощение первого, создает только аудио треки. Канал все также вводится по принципу миди каналов для удобства.
JavaScript:
--/////////---\\\\\\\\\---/////////---\\\\\\\--
-----------------------------------------------
show_audio_on_tcp = false
number_of_channel_in_names = true
-----------------------------------------------
---color for audio track-----------------------
R_a = 0 ---Red
G_a = 0 ---Green
B_a = 0 ---Blue
-----------------------------------------------
--\\\\\\\\\---/////////---\\\\\\\\\---///////--
function bla() end
function nothing() reaper.defer(bla) end
if (show_audio_on_tcp ~= true and show_audio_on_tcp ~= false)
or (number_of_channel_in_names ~= true and number_of_channel_in_names ~= false)
then
reaper.MB
(
'Incorrect value for "show_audio_on_tcp" ' ..
'or "number_of_channel_in_names". Set the boolen - "true" or "false"',
'Error',0
)
nothing() return
end
local test_SWS = reaper.NF_GetMediaItemPeakRMS_Windowed --function added in 2.9.7 SWS
if not test_SWS then
reaper.MB('Please install or update SWS extension', 'Error', 0) nothing() return
end
if reaper.CountSelectedTracks(0) > 0 then
::START::
local retval, value = reaper.GetUserInputs
(
'Create audio track from multich VSTi', 2,
'Set the audio name:,Set channel as midi (1-16):', ","
)
if retval then
reaper.Undo_BeginBlock()
reaper.PreventUIRefresh(1)
local t = {}
for s in string.gmatch(value,'[^,]+') do
table.insert(t,s)
end
if #t ~= 2 then
reaper.MB('Incorrect value or no value. Set the correct value for any line', 'Error', 0)
goto START
end
name = t[1]
channel = t[2]
if channel ~= string.match(channel,'%d+')
or (tonumber(channel) < 1 or tonumber(channel) > 16)
then
reaper.MB('Incorrect value. Set the correct midi channel (1-16)', 'Error', 0)
goto START
end
function convert_bool(bool)
if bool == false then
bool = 0
else
bool = 1
end
return bool
end
for i = 0, reaper.CountSelectedTracks(0)-1 do
local get_instrument_track = reaper.GetSelectedTrack(0,i)
local instrument_track_num = reaper.GetMediaTrackInfo_Value(get_instrument_track,'IP_TRACKNUMBER')
if reaper.GetMediaTrackInfo_Value(get_instrument_track,'I_NCHAN') < tonumber(channel)*2 then
reaper.SetMediaTrackInfo_Value(get_instrument_track,'I_NCHAN', tonumber(channel)*2)
end
if reaper.GetMediaTrackInfo_Value(get_instrument_track,'B_MAINSEND') == 1 then
reaper.SetMediaTrackInfo_Value(get_instrument_track,'B_MAINSEND', 0)
end
reaper.InsertTrackAtIndex(instrument_track_num-1,false)
local get_audio_track = reaper.GetTrack(0,instrument_track_num-1)
if number_of_channel_in_names == true then
reaper.GetSetMediaTrackInfo_String(get_audio_track, 'P_NAME', name .. ' - '.. channel .. ' st', true)
else
reaper.GetSetMediaTrackInfo_String(get_audio_track, 'P_NAME', name, true)
end
reaper.SetMediaTrackInfo_Value(get_audio_track, 'B_SHOWINTCP', convert_bool(show_audio_on_tcp))
if R_a == 0 and G_a == 0 and B_a == 0 then
nothing()
else
reaper.SetTrackColor(get_audio_track, reaper.ColorToNative(R_a,G_a,B_a)|0x1000000)
end
reaper.CreateTrackSend(get_instrument_track, get_audio_track)
reaper.BR_GetSetTrackSendInfo(get_audio_track, -1, 0, 'I_MIDI_SRCCHAN', true, -1)
reaper.SetTrackSendInfo_Value(get_audio_track, -1, 0, 'I_SRCCHAN', 2*(tonumber(channel)-1))
end
reaper.Undo_EndBlock('Create only audio track from multichannel VSTi (track)', -1)
reaper.PreventUIRefresh(-1)
else
nothing() return
end
else
reaper.MB('Please select a track', 'Error',0)
nothing()
end
Скрипты имеют настройки в шапке. Для себя сделал так, что миди треки не отображаются в микшере, а аудио треки не отображаются в аранжировке. В общем тут как хотите, все нужные параметры я вывел, в том числе цвет новых треков по умолчанию, а также постфикс в названии треков в соответствии с каналами (мне удобнее, когда он есть). Для всех скриптов увы снова нужен SWS (буквально по паре функций посылов приходится брать с его API). Вроде все, как всегда если найдете ошибки, пишите сюда! Обновления (если будут) отпишу сюда в постах в виде исходного кода.
P.S. Кстати, если у вас есть SWS autocolor, он должен работать, когда треки не раскрашиваются (как по умолчанию)
Вложения
Последнее редактирование: