Сделал также еще триаду скриптов на тему сенды. Для примера возьмем всем известный 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()
  end2) Второй скрипт - упрощение первого, создает только миди треки. Все аналогично - вводим с 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()
  end3) Третий скрипт - также упрощение первого, создает только аудио треки. Канал все также вводится по принципу миди каналов для удобства.
		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, он должен работать, когда треки не раскрашиваются (как по умолчанию)
Вложения
			
				Последнее редактирование: 
				
		
	
										
										
											
	
										
									
								 
	 
	 
 
		
 
 
		 Сделай себе, если корректно сработает (не уверен что всем подойдет) - нужно на миди трек поставить дефолт, я его игнорирую на всякий случай.
 Сделай себе, если корректно сработает (не уверен что всем подойдет) - нужно на миди трек поставить дефолт, я его игнорирую на всякий случай.

 
 
		
 
 
		 
 
		
 
						
					