Быстрое создание сенд-треков для мультиканального инструмента

borisuperful

Well-Known Member
31 Янв 2013
2.017
1.158
113
Сделал также еще триаду скриптов на тему сенды. Для примера возьмем всем известный Kontakt. В рипере для роутинга лучше всего использовать два трека - миди и аудио. С миди мы отправляем с 1 по 16 миди канал на Kontkat, а на аудио приходит стерео пара с 1/2 по 31/32 включительно. Задача скриптов уменьшить кол-во кликов для всего этого, а также избежать темплейтов, если они не требуются. Для работы скриптов нужен исходный один трек с мультиканальным инструментом. Итак:

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, он должен работать, когда треки не раскрашиваются (как по умолчанию)
 

Вложения

Последнее редактирование:
@borisuperful, удобно! Даже очень!))
Для полного счастья, после создания трека, не хватает надстройки постановки (миди трека) на Automatic recodr-arm. Приходится после каждого нового создания трека это активировать.
У меня в Preferecnces настроено на на Automatic recodr-arm, но не работает это с твоим скриптом Yanick_Create midi and audio track from multichannel VSTi (selected track).
 
Последнее редактирование:
@borisuperful, удобно! Даже очень!))
Для полного счастья, после создания трека, не хватает надстройки постановки (миди трека) на Automatic recodr-arm.
У меня в Preferecnces настроено на на Automatic recodr-arm, но не работает это с твоим скриптом Yanick_Create midi and audio track from multichannel VSTi (selected track).
Не использую, поэтому не делал :) Сделай себе, если корректно сработает (не уверен что всем подойдет) - нужно на миди трек поставить дефолт, я его игнорирую на всякий случай.
Функция
JavaScript:
reaper.InsertTrackAtIndex(instrument_track_num-1,false)
нужно поменять false на true
Скрин: 1604129007772.png
 
  • Like
Реакции: YuriOl
@borisuperful, Отлично!
А есть возможность сразу и выделить этот вновь создавшийся трек? Вообще было бы супер!)
 
Последнее редактирование:
@borisuperful, Отлично!
А есть возможность сразу и выделить этот вновь создавшийся трек? Вообще было бы супер!)
Тогда поменяй весь код на этот
JavaScript:
  --///////////|||\\\\\\\\\\\---Customize this---///////////|||\\\\\\\\\\--
 
  ---some parameters for tracks--------------------------------------------
    show_audio_on_tcp = false
    show_midi_on_mcp = false
    number_of_channel_in_names = true
    defaults_midi_track = true
    defaults_audio_track = false
    select_the_midi_track = 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)
  or (defaults_midi_track ~= true and defaults_midi_track ~= false)
  or (defaults_audio_track ~= true and defaults_audio_track ~= false)
  or (select_the_midi_track ~= true and select_the_midi_track ~= false)
  then
    reaper.MB
    (
    'Incorrect value for "show_audio_on_tcp" ' ..
    'or "show_midi_on_mcp" or "number_of_channel_in_names" ' ..
    'or "defaults_midi_track" or "defaults_audio_track" ' ..
    'or "select_the_midi_track". ' ..
    '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
    
      if select_the_midi_track == true then
        t_tracks={}
      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, defaults_midi_track)
            local get_midi_track = reaper.GetTrack(0,instrument_track_num-1)
            if select_the_midi_track == true then
              t_tracks[i+1] = get_midi_track
            end
            
            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, defaults_audio_track)
              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
    --------------------------
      if select_the_midi_track == true then
        reaper.Main_OnCommand(40297,0)
        for i=1, #t_tracks do
          reaper.SetTrackSelected(t_tracks[i], true)
        end
      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
 
Последнее редактирование:
  • Like
Реакции: chiibiis и YuriOl
@borisuperful, а буддет скрипт, с помощью которого можно было бы спрятать/показать аудио треки, соответствующие выделенному миди треку?:Dle22:
 
Здесь лучший вариант это сделать еще скрипт, для роутинга одного трека с фидбеком роутинга. То есть один трек отправляет миди и принимает на себя аудио, НО для него по всей видимости не будут работать миди обработки, что уже неприятный компромисс.
 
  • Like
Реакции: YuriOl
Здесь лучший вариант это сделать еще скрипт, для роутинга одного трека с фидбеком роутинга. То есть один трек отправляет миди и принимает на себя аудио, НО для него по всей видимости не будут работать миди обработки, что уже неприятный компромисс.
Будут с PDC проблемы.
Я продолжительное время работал в таком режиме. В проекте надо тогда ещё Allow feedback.. активировать. НО там засада в другом! СтОит повесить на какой-нить трек плагин с задержкой и синхронизация летит к черту. А так да, очень удобно!) Почему Джастин на это забил? Ведь можно как-то это окультурить, чтобы не было 1500 треков!?
 
Последнее редактирование:
Будут с PDC проблемы.
Я продолжительное время работал в таком режиме. В проекте надо тогда ещё Allow feedback.. активировать. НО там засада в другом! СтОит повесить на какой-нить трек плагин с задержкой и синхронизация летит к черту. А так да, очень удобно!) Почему Джастин на это забил? Ведь можно как-то это окультурить, чтобы не было 1500 треков!?
Мне то сам линк аудио и миди трека не нравится как идея. Одна из причин почему ушел с S1. То, что треки отдельны друг от друга, дает много приятных возможностей, например объединение нескольких каналов в один трек. Ну и удобно миди обработки использовать.
Если бы в оркестровой партитуре каждый прием игры записывался бы в отдельный нотоносец (то бишь как бы "трек"), то от ее размеров можно будет с ума сойти :) Да, конечно патчи бывают с кейсвитчами, но далеко не все, и ОЗУ едят они сильно. И не всегда в одном патче все хорошо звучит. Ну и к тому же одновременное воспроизведение нескольких патчей, например для перкуссии - это уже не под силу кейсвитчам
 
Последнее редактирование:
  • Like
Реакции: YuriOl
Мне то сам линк аудио и миди трека не нравится как идея

Я уже давно аудио с миди не линкую. Это в принципе не удобно в любой ДАВ во во многих случаях (например, при необходимости сбаунсить отдельный (айтем (клип) для более гибкой работы с аудио фрагментом, баунсится аудиодорожка, ну и работа с эффектами, и многое другое. Плюс загромождение проекта. Работаю с отдельными инструментальными дорожками, и какой-либо большей загрузки оперативной памяти или нагрузки процессора в связи с этим, не замечал.
 
  • Like
Реакции: borisuperful
и какой-либо большей загрузки оперативной памяти или нагрузки процессора в связи с этим, не замечал.
Так она и не может быть из-за этого, просто добавить в два раза больше треков в рипере не влияет существенно на ресурсы, на ASIO так точно не влияет.
Но речь о другом, что можно за счет этого сокращать сам размер аранжировки по вертикали и даже упростить вид. Вот играет у меня один сэмпл из патча Kontakt, предположим из разряда перкуссии, и играет он один раз за трек - вот зачем мне делать для него индивидуальный трек как в S1? :) А потом разглядывать эти кусочки и пытаться их хоть как-то систематизировать.
 
  • Like
Реакции: YuriOl и Landre
Обновил скрипты, теперь есть автоматический детект самого меньшего не используемого миди канала.
Например: есть треки с задействованными миди каналами 2,4,5,6,8. Скрипт сначала обнаружит 3 канал, потом 7 канал, только потом уже 9. По умолчанию параметр автоопределения каналов отключен, включается через true, параметр "insert_the_smallest_unused_midi_channel"
Считаю пока экспериментальным, но вроде работает, если найдете ошибки, пишите!

JavaScript:
  --///////////|||\\\\\\\\\\\---Customize this---///////////|||\\\\\\\\\\--

  ---some parameters for tracks--------------------------------------------
    show_audio_on_tcp = false
    show_midi_on_mcp = false
    number_of_channel_in_names = true
    defaults_midi_track = false
    defaults_audio_track = false
    select_the_midi_track = false
    insert_the_smallest_unused_midi_channel = false
  -------------------------------------------------------------------------

  ---color for midi track--------------------------------------------------
  ---enter 0 for R_a and G_a and B_a to disable coloring---
    R_m = 0   ---Red
    G_m = 0   ---Green
    B_m = 0   ---Blue
  -------------------------------------------------------------------------

  ---color for audio track-------------------------------------------------
  ---enter 0 for R_a and G_a and B_a to disable coloring---
    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)
  or (defaults_midi_track ~= true and defaults_midi_track ~= false)
  or (defaults_audio_track ~= true and defaults_audio_track ~= false)
  or (select_the_midi_track ~= true and select_the_midi_track ~= false)
  or (insert_the_smallest_unused_midi_channel ~= true and insert_the_smallest_unused_midi_channel ~= false)
  then
    reaper.MB
    (
    'Incorrect value for "show_audio_on_tcp" ' ..
    'or "show_midi_on_mcp" or "number_of_channel_in_names" ' ..
    'or "defaults_midi_track" or "defaults_audio_track" ' ..
    'or "select_the_midi_track". ' ..
    '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

    save_snd = ''
    if insert_the_smallest_unused_midi_channel == true then
      if reaper.CountSelectedTracks(0) == 1 then
        local get_tr = reaper.GetSelectedTrack(0,0)
        if reaper.GetTrackNumSends(get_tr, -1) > 0 then
          t_snds = {}
          save_snd = 0
          bn = true
          for j=0, reaper.GetTrackNumSends(get_tr, -1) - 1 do
            local gt_s = reaper.BR_GetSetTrackSendInfo(get_tr, -1, j, 'I_MIDI_DSTCHAN', false, 0)
            if gt_s == 0 or gt_s >= 16 then
              bn = false
              save_snd = ''
              break
            else
              t_snds[j+1] = gt_s
            end
          end
          if bn == true then
            table.sort(t_snds)
            for k=1, #t_snds do
              if save_snd == t_snds[k] then
                nothing()
              elseif save_snd == t_snds[k] - 1 then
                save_snd = t_snds[k]
              else
                break
              end
            end
            save_snd = math.floor(save_snd) + 1
          end
        else
          save_snd = 1
        end
      end
    end                                            

    ::START::
    local retval, value = reaper.GetUserInputs
    (
    'Create new tracks from multich VSTi',
    2, 'Set the MIDI and AUDIO name:,Set new channel (0-16):', "," .. save_snd
    )

    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, defaults_midi_track)
            local get_midi_track = reaper.GetTrack(0,instrument_track_num-1)
            if select_the_midi_track == true then
              save_mid_tr = get_midi_track
            end
       
            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, defaults_audio_track)
              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
    --------------------------
      if select_the_midi_track == true then
        reaper.Main_OnCommand(40297,0)
        reaper.SetTrackSelected(save_mid_tr, true)
      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

JavaScript:
  --///////////|||\\\\\\\\\\\---Customize this---///////////|||\\\\\\\\\\--
  
  ---some parameters for tracks--------------------------------------------
    show_midi_on_mcp = false
    number_of_channel_in_names = true
    defaults_midi_track = false
    select_the_midi_track = false
    insert_the_smallest_unused_midi_channel = false
  -------------------------------------------------------------------------
  
  ---color for midi track--------------------------------------------------
  ---enter 0 for R_a and G_a and B_a to disable coloring--
    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)
  or (defaults_midi_track ~= true and defaults_midi_track ~= false) 
  or (select_the_midi_track ~= true and select_the_midi_track ~= false) 
  or (insert_the_smallest_unused_midi_channel ~= true and insert_the_smallest_unused_midi_channel ~= false) 
  then
    reaper.MB
    (
    'Incorrect value for "show_midi_on_mcp" or "number_of_channel_in_names" ' ..
    'or "defaults_midi_track" or "select_the_midi_track". 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
    
    save_snd = ''
    if insert_the_smallest_unused_midi_channel == true then
      if reaper.CountSelectedTracks(0) == 1 then
        local get_tr = reaper.GetSelectedTrack(0,0)
        if reaper.GetTrackNumSends(get_tr, -1) > 0 then
          t_snds = {}
          save_snd = 0
          bn = true
          for j=0, reaper.GetTrackNumSends(get_tr, -1) - 1 do
            local gt_s = reaper.BR_GetSetTrackSendInfo(get_tr, -1, j, 'I_MIDI_DSTCHAN', false, 0)
            if gt_s == 0 or gt_s >= 16 then
              bn = false
              save_snd = ''
              break
            else
              t_snds[j+1] = gt_s
            end
          end
          if bn == true then
            table.sort(t_snds)
            for k=1, #t_snds do
              if save_snd == t_snds[k] then
                nothing()
              elseif save_snd == t_snds[k] - 1 then 
                save_snd = t_snds[k]
              else
                break
              end
            end
            save_snd = math.floor(save_snd) + 1
          end
        else
          save_snd = 1
        end
      end
    end      
    
    ::START::
    local retval, value = reaper.GetUserInputs
    (
    'Create MIDI track from multich VSTi', 
    2, 'Set the MIDI name:,Set new channel (0-16):', ',' .. save_snd
    )
    
    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,defaults_midi_track)
            local get_midi_track = reaper.GetTrack(0,instrument_track_num-1)
            if select_the_midi_track == true then
              save_mid_tr = get_midi_track
            end
            
            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
    --------------------------
    if select_the_midi_track == true then
      reaper.Main_OnCommand(40297,0)
      reaper.SetTrackSelected(save_mid_tr, true)
    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

JavaScript:
  --/////////////---\\\\\\\\\---/////////---\\\\\\\\\\\\--

  --------------------------------------------------------
  show_audio_on_tcp = false
  number_of_channel_in_names = true
  defaults_audio_track = false
  insert_the_smallest_unused_midi_channel = false
  --------------------------------------------------------

  ---color for audio track--------------------------------
  ---enter 0 for R_a and G_a and B_a to disable coloring--
  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)
  or (defaults_audio_track ~= true and defaults_audio_track ~= false)
  or (insert_the_smallest_unused_midi_channel ~= true and insert_the_smallest_unused_midi_channel ~= false)
  then
    reaper.MB
    (
    'Incorrect value for "show_audio_on_tcp" ' ..
    'or "number_of_channel_in_names" ' ..
    'or "defaults_audio_track". 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

    save_snd = ''
    if insert_the_smallest_unused_midi_channel == true then
      if reaper.CountSelectedTracks(0) == 1 then
        local get_tr = reaper.GetSelectedTrack(0,0)
        if reaper.GetTrackNumSends(get_tr, 0) > 0 then
          t_snds = {}
          save_snd = 0
          bn = true
          for j=0, reaper.GetTrackNumSends(get_tr, 0) - 1 do
            local gt_s = reaper.GetTrackSendInfo_Value(get_tr, 0, j, 'I_SRCCHAN')
            if gt_s > 28 then
              bn = false
              save_snd = ''
              break
            else
              t_snds[j+1] = math.floor((gt_s/2)+1)
            end
          end
          if bn == true then
            table.sort(t_snds)
            for k=1, #t_snds do
              if save_snd == t_snds[k] then
                nothing()
              elseif save_snd == t_snds[k] - 1 then
                save_snd = t_snds[k]
              else
                break
              end
            end
            save_snd = save_snd + 1
          end
        else
          save_snd = 1
        end
      end
    end

    ::START::
    local retval, value = reaper.GetUserInputs
    (
    'Create audio track from multich VSTi', 2,
    'Set the AUDIO name:,Set new channel as midi (1-16):', "," .. save_snd
    )

    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,defaults_audio_track)
        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
 
Последнее редактирование:
Возможно я их сделаю как отдельный блог, во избежания ответственности за то, что я скрипты переделываю или удаляю :) Если такое делать в реапак (а я пока постоянно что-то переделываю), то можно что-то поломать у людей, я этого не хочу. В общем время покажет, когда надо будет сделать :) Я имя на гитхабе уже занял, если у меня накопится много неизменных скриптов, то, может быть, выложу в репозиторий
 
Последнее редактирование:
  • Like
Реакции: YuriOl
@borisuperful, отличное решение! Спасибо! А если такой вариант загрузки мультиканального инструмента попробовать запилить: к примеру, через стандартное меню загрузки "Insert virtual instrument on new track" загружаем мультиканальный инструмент (пусть будет NI Battery), при этом пусть создаются не только все доступные аудио дороги, но и все MIDI дороги к ним! Роутинг соответствующий. И пусть бы всё это богатство было после загрузки в скрытом виде. А потом через трек-менеджер по мере необходимости явить на свет божий только те, которые будут использованы в работе. Ведь не всегда заранее знаешь, сколько каналов понадобится. А так все в наличии под рукой.) Лишнее потом легко убрать там же. :Dle39:
 
@borisuperful, отличное решение! Спасибо! А если такой вариант загрузки мультиканального инструмента попробовать запилить: к примеру, через стандартное меню загрузки "Insert virtual instrument on new track" загружаем мультиканальный инструмент (пусть будет NI Battery), при этом пусть создаются не только все доступные аудио дороги, но и все MIDI дороги к ним! Роутинг соответствующий. И пусть бы всё это богатство было после загрузки в скрытом виде. А потом через трек-менеджер по мере необходимости явить на свет божий только те, которые будут использованы в работе. Ведь не всегда заранее знаешь, сколько каналов понадобится. А так все в наличии под рукой.) Лишнее потом легко убрать там же. :Dle39:
Это почти то же самое что трек-темплейт :) Но ладно, причины вроде есть, почему можно скрипт сделать
P.S. Также обратите внимание, что обновляю скрипты здесь, в том числе по сабжу. Там уже несколько фиксов есть
 
  • Like
Реакции: YuriOl и Igor Leontyev
@borisuperful, а в ReaPack repositories будет?
Нет, не будет :) Я клал на то, как там реализована индексация, на помощь мне cfillion не ответил. Тупо криво и непонятно. Первый раз вообще Rubby не завелся...Мне нервы дороже, больше не суюсь туда :)
 
@borisuperful, напишу здесь!) Классный твой скрипт - Yaunick_Float instruments from insert or send at selected track or toggle folder collapse. У меня была твоя старая версия, так если его случайно применить на самом треке с хостом (Kontakt например), то открывались пустые окна fx chain всех сендов вместе с самим Kontakt-ом, а теперь после обновления всё классно работает! Спасибо! :)
 
@borisuperful, напишу здесь!) Классный твой скрипт - Yaunick_Float instruments from insert or send at selected track or toggle folder collapse. У меня была твоя старая версия, так если его случайно применить на самом треке с хостом (Kontakt например), то открывались пустые окна fx chain всех сендов вместе с самим Kontakt-ом, а теперь после обновления всё классно работает! Спасибо! :)
Да, я там вроде бы это поправил :)
 
  • Like
Реакции: YuriOl
@borisuperful,а можно добавить опцию в твой скрипт Insert item at mouse cursor within a measure (like in Studio One), чтобы и по выделенному времени (Time selection) было как в Studio One ? Если вне границ выделенного, то 1 или 2 такта, а если в выделенной области, то по границам выделенного? Sel.gif
 
@borisuperful,а можно добавить опцию в твой скрипт Insert item at mouse cursor within a measure (like in Studio One), чтобы и по выделенному времени (Time selection) было как в Studio One ? Если вне границ выделенного, то 1 или 2 такта, а если в выделенной области, то по границам выделенного? Посмотреть вложение 205621
Да, сделаю. Сначала я эту опцию убрал, потому что рисовал луп поинтс вместе с тайм селекшном, но щас для зацикливания фрагментов мне не нужен тайм селекшн, и мешаться не будет
 
  • Like
Реакции: YuriOl

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