Помогите создать экшн / кастом экшн / скрипт

  • Автор темы Автор темы @Michael
  • Дата начала Дата начала
У дефера свои особенности,Джастин говорит,что 30-50 раз в секунду,его слова,не мои.
По поводу скорости скриптов,на кокосовом форуме есть такие образцы,они говорят,что невозможно отследить РЕАЛЬНУЮ скорость выполнения.Потому что,в зависимости от языка,можно по-разному решить задачу.В простых опреациях однозначно eel в выигрыше,самый медленный Питон.Однако,когда даже Питон начинает работать с собственными библиотеками,скорость почти выравнивается.
Короче,я не могу описать тему полностью,лучше найти в оригинале на кокосе,там подробно показано и рассказано.И вообще,может быть сейчас lua работает намного быстрее,чем тогда,поддержка ведь расширяется,подтягивается и скорость соответственно.
Короче,итог того обсуждения был в том,что больше на скорость влияют прогаммные решения,чем сам язык.
++
Если нужно какую-то повторяющююся хрень-на eel лучше,если что-то заумное-нужно подумать.
Почему (лично меня,никому этого не советую!) отпугнул Луа-я просто ленивый,разбираться с еще одним языком и путаться--для меня слишком роскошно,хотя информации по языку,в отличии от eel-просто валом.И на русском есть.
 
Последнее редактирование:
что больше на скорость влияют прогаммные решения,чем сам язык.
Это понятно, также как и ошибки звукоинженера на звук влияют больше, чем любого качества плагины и железки.
 
  • Like
Реакции: EUGEN27771
@Aleksandr Oleynik, сделайте Дефер например,на закрытие окна,впишите туда что-то типа x+=1; увидите и кол-во циклов,и измерение времени,есть в функциях, можно в начале и в конце поставить
[DOUBLEPOST=1449228742,1449228565][/DOUBLEPOST]@Aleksandr Oleynik, вообще,это довольно забавно выглядит,когда,вроде бы "неправильное" решение работает быстрее якобы "правильного",буквально недавно с этим сталкивался
 
да, я по деферу всё делал, правда без сравнения с lua. Я в начале его циклы (вернее их кол-во в еденицу времени) хотел использовать для создания нужных дилэев на выполнение определённых функций.
Но оказалось, что эта величина - плавает (возможно в пределах 30-50 циклов в секунду)
 
Последнее редактирование:
@Aleksandr Oleynik, вообще,это довольно забавно выглядит,когда,вроде бы "неправильное" решение работает быстрее якобы "правильного",буквально недавно с этим сталкивался
Мне для Лайв Сэтапа нужна максимальная скорость выполнения и минимальная нагрузка на Рипер.
Пока что, перенося действия с JS плагинов на скрипт я вижу уменьшение нагрузки на RT CPU в Рипере. За счёт чего конкретно - не знаю, я много чего перенёс - тот-же временной кросфейд из JS в EEL перенёс.
Стали лучше работать все процессы связанные с необходимостью выставления дилэя на срабатывание - смог меньшие дилэи поставить.
Правда сам бы я не разобрался без вашей с Михаилом помощи и Сыта Старшего.
Сейчас вот нужно придумать как лучше сделать Масив в Масиве, или иначе решить ситуацию, при которой скрипт должен автоматом понимать, в зависимости от кол-ва трэков и их состава (имён) с каким масивом памяти работать, а какой не использовать.
[DOUBLEPOST=1449229185,1449229122][/DOUBLEPOST]
Это лично Джастин! объявился и так сказал,правда давно это было,может сейчас иначе.
Да так и было, я просто не помню тех замеров, но где-то в таких пределах. Беда- что кол-во сильно плавало.
кстати, это в любом случаи влияет на любые процессы, в которых время имеет значение.
Потому как функции таймаут в EEL нет - её приходится делать через дефер, а он тогос.....
 
Дублируем айтем 10000 раз.
Код:
time1 = time_precise();
item = GetSelectedMediaItem(0,0);
ApplyNudge(0, 0, 5, 20, 2, false, 10000);
time2 = time_precise();
time_diff = time2-time1;
sprintf(#dest,"%f",time_diff);
ShowConsoleMsg(#dest);
UpdateArrange();
3.597772 секунды

Код:
time1 = reaper.time_precise()
item = reaper.GetSelectedMediaItem(0,0)
reaper.ApplyNudge(0, 0, 5, 20, 2, false, 10000)
time2 = reaper.time_precise()
time_diff = time2-time1
reaper.ShowConsoleMsg(time_diff)
reaper.UpdateArrange()
3.5631619697087

Core i5 / 8GB RAM / SSD / Win8
 
  • Like
Реакции: lil-burn
Пока что, перенося действия с JS плагинов на скрипт я вижу уменьшение нагрузки на RT CPU в Рипере. За щёт чего конкретно - не знаю,
Ну это очевидно-плагины работают абсолютно все время,а скрипты иначе
[DOUBLEPOST=1449229822,1449229487][/DOUBLEPOST]
Дублируем айтем 10000 раз.
@@Michael, ну собственно,к тому и пришли.
Задачи разные поставить,и можно поймать разницу в десятки раз в любую сторону,потому и говорилось,что РЕАЛЬНУЮ скорость измерить очень сложно.
Там вроде бралось вычисление какой-то переменной за точки отсчета,возможно другие операции будут совсем резко отличаться.
 
Дублируем айтем 10000 раз.
Код:
time1 = time_precise();
item = GetSelectedMediaItem(0,0);
ApplyNudge(0, 0, 5, 20, 2, false, 10000);
time2 = time_precise();
time_diff = time2-time1;
sprintf(#dest,"%f",time_diff);
ShowConsoleMsg(#dest);
UpdateArrange();
3.597772 секунды

Код:
time1 = reaper.time_precise()
item = reaper.GetSelectedMediaItem(0,0)
reaper.ApplyNudge(0, 0, 5, 20, 2, false, 10000)
time2 = reaper.time_precise()
time_diff = time2-time1
reaper.ShowConsoleMsg(time_diff)
reaper.UpdateArrange()
3.5631619697087

Core i5 / 8GB RAM / SSD / Win8
У меня EEL - 2.146388
LUA - 2.140447
[DOUBLEPOST=1449238241,1449232629][/DOUBLEPOST]Михаил, Женя, есть вот такой код формирующий матрицу с именами треков (ну и кое что ещё) -

PHP:
function init() (

  working_groups = 0;
  working_groups[0] = "KEY01_P%i";
  working_groups[1] = "KEY02_P%i";
  working_groups[2] = "GTR01_P%i";
  working_groups[3] = "GTR02_P%i";
  working_groups_count = 4;

  working_tracks = working_groups_count + 1;
  working_tracks[0] = "KEY01_P1";
  working_tracks[1] = "KEY01_P2";
  working_tracks[2] = "KEY01_P3";
  working_tracks[3] = "KEY01_P4";
  working_tracks[4] = "KEY01_P5";
  working_tracks[5] = "KEY01_P6";
  working_tracks[6] = "KEY01_P7";
  working_tracks[7] = "KEY01_P8";
  working_tracks[8] = "KEY01_P9";
  working_tracks[9] = "KEY01_P10";
  working_tracks[10] = "KEY01_P11";
  working_tracks[11] = "KEY02_P1";
  working_tracks[12] = "KEY02_P2";
  working_tracks[13] = "KEY02_P3";
  working_tracks[14] = "KEY02_P4";
  working_tracks[15] = "KEY02_P5";
  working_tracks[16] = "KEY02_P6";
  working_tracks[17] = "KEY02_P7";
  working_tracks[18] = "KEY02_P8";
  working_tracks[19] = "KEY02_P9";
  working_tracks[20] = "KEY02_P10";
  working_tracks[21] = "KEY02_P11";
  working_tracks[22] = "GTR01_P1";
  working_tracks[23] = "GTR01_P2";
  working_tracks[24] = "GTR01_P3";
  working_tracks[25] = "GTR01_P4";
  working_tracks[26] = "GTR01_P5";
  working_tracks[27] = "GTR01_P6";
  working_tracks[28] = "GTR01_P7";
  working_tracks[29] = "GTR01_P8";
  working_tracks[30] = "GTR01_P9";
  working_tracks[31] = "GTR01_P10";
  working_tracks[32] = "GTR01_P11";
  // working_tracks[33] = "GTR02_P1";
  // working_tracks[34] = "GTR02_P2";
  // working_tracks[35] = "GTR02_P3";
  // working_tracks[36] = "GTR02_P4";
  // working_tracks[37] = "GTR02_P5";
  // working_tracks[38] = "GTR02_P6";
  // working_tracks[39] = "GTR02_P7";
  // working_tracks[40] = "GTR02_P8";
  // working_tracks[41] = "GTR02_P9";
  // working_tracks[42] = "GTR02_P10";
  // working_tracks[43] = "GTR02_P11";
  // working_tracks_count = 44;
  working_tracks_count = 33;

  PM = getMediaTrackByName("PRE_MAST"); // Имя PreMaster трека
  K1 = getMediaTrackByName("KEY01_Control");
  K2 = getMediaTrackByName("KEY02_Control");
  G1 = getMediaTrackByName("GTR01_Control");
  G2 = getMediaTrackByName("GTR02_Control");
  K1in = getMediaTrackByName("KEY01_IN");
  K2in = getMediaTrackByName("KEY02_IN");
  G1in = getMediaTrackByName("GTR01_IN");
  G2in = getMediaTrackByName("GTR02_IN");

  durations = working_tracks + working_tracks_count + 1; // Начало нового массива для времени кросфейда (может быть для каждого трека своё)
  tensions = durations + working_tracks_count + 1;       // Начало нового массива для коэф кривой (может быть для каждого трека свой)

); ///////////////////////////////////////////////////////////////////////////////////////////////
Состав груп треков и количество треков в группе от проекта к проекту могут меняться.
Как сделать так, чтобы Скрипт стартанув считал с Рипера данные и изменил этот массив?
Есть какой-то не замысловатый и простой способ?
Менять ведь нужно и нумерацию и count всех треков и count групп и имена.
Может это как-то в общем компактнее можно записать, а не прописывать в каждую ячейку конкретное имя?
 
Последнее редактирование:
Ну, в Lua я бы сделал так:

Код:
  working_tracks={}
  function add_tracks(str,count) for i = 1, count do table.insert (working_tracks, str..'_'..i) end end
  add_tracks('KEY01',11)
  add_tracks('KEY02',11)
  add_tracks('GTR01',11)
  add_tracks('GTR02',11)

Результат
Код:
reaper.ShowConsoleMsg(table.concat(working_tracks, '\n'))
KEY01_1
KEY01_2
KEY01_3
KEY01_4
KEY01_5
KEY01_6
KEY01_7
KEY01_8
KEY01_9
KEY01_10
KEY01_11
KEY02_1
KEY02_2
KEY02_3
KEY02_4
KEY02_5
KEY02_6
KEY02_7
KEY02_8
KEY02_9
KEY02_10
KEY02_11
GTR01_1
GTR01_2
GTR01_3
GTR01_4
GTR01_5
GTR01_6
GTR01_7
GTR01_8
GTR01_9
GTR01_10
GTR01_11
GTR02_1
GTR02_2
GTR02_3
GTR02_4
GTR02_5
GTR02_6
GTR02_7
GTR02_8
GTR02_9
GTR02_10
GTR02_11
 

[U]Start on bar[/U] же, не?
[ATTACH=full]107880[/ATTACH]

[QUOTE="elektrozz, post: 1947090, member: 44704"][USER=59144]
Вчера заметил что не хватает pass through key to main window экшена в секции Media Explorer.
[/QUOTE]
Да, не помешал бы. Но ведь никто не отменял такого хака: [URL]http://rmmedia.ru/threads/49259/#post-1946174[/URL]

Но! Друзья! Обнаружил такую не очень приятную вещь: такой красивый ell скрипт (см ссылку выше), загруженный в секцию Media Explorer, работает некорректно, если в скрипте содержатся экшены из разных секций.
Так например, если elektrozz попытается решить проблему (запустить одновременно сэмпл и проект) с помощью скрипта
[I]Main_OnCommand(1008, 0);
Main_OnCommand(40044, 0)[/I]
где 1008 - Preview: Play (секция Media Explorer)
а 40044 - Transport: Play/Stop (секция Main),
то это не получится.
Не получится, даже если он создаст 2 скрипта:
[I]Main_OnCommand(1008, 0)[/I]
и
[I][I]Main_OnCommand(40044, 0)[/I][/I]
соединит их в кастом и запустит. Оба скрипта в кастоме не сработают (по крайней мере у меня срабатывать не хотят).
Интересно, это как-то можно обойти?
[/user]
 

Вложения

  • upload_2015-12-4_19-33-44.png
    upload_2015-12-4_19-33-44.png
    5,3 KB · Просмотры: 179
  • upload_2015-12-4_19-34-2.png
    upload_2015-12-4_19-34-2.png
    3,8 KB · Просмотры: 473
Ну, в Lua я бы сделал так:

Код:
  working_tracks={}
  function add_tracks(str,count) for i = 1, count do table.insert (working_tracks, str..'_'..i) end end
  add_tracks('KEY01',11)
  add_tracks('KEY02',11)
  add_tracks('GTR01',11)
  add_tracks('GTR02',11)

Результат
Код:
reaper.ShowConsoleMsg(table.concat(working_tracks, '\n'))
Вот тот случай, когда синтаксис lua в лоб в eel перевести я не смогу :(
 
@lil-burn, про Start on Bar вкурсе. я про сихронизацию play, правильно угадали)
Присоедениюсь, как обойти. В Midi есть синхронизация, а в Media нет(
 
Други, помогите, плиз.
Очень нужен скрипт, фокусирующий take volume envelope на выделенном айтеме. То есть чтобы не тыкать в сабжевый энвелоп мышкой.

И ещё вопрос.
Можно ли с помощью скриптов как-то достучаться до эффектов, находящихся в секции Monitoring FX? Интересует в первую очередь возможность переключения пресетов, а также способ посылать эффекту Midi CC мессаги (последнее в принципе у меня работает, только через жуткий костыль vmk->console->midi-loopback, хотелось бы как-то попроще и более по уму, если есть такая возможность).

Спасибо!
 
diggidon,
энвелоп - можно(upd нельзя), но проще соорудить циклэкшн вида скрыть всё кроме volume envelope - показать всё
мониторинг - можно, но проще подождать, пока кокосы сами это нативно сделают
посылать эффекту Midi CC мессаги - можно посылать мессаги на виртуальную клаву, т.е. и на трек при включенном на нём мониторинге с виртуальной клавы - StuffMIDIMessage()
 
Последнее редактирование:
  • Like
Реакции: diggidon
проще соорудить циклэкшн вида скрыть всё кроме volume envelope - показать всё
@@Michael, не совсем понятно, как это сделать - в экшн-листе нет hide all but volume envelope (я имею ввиду volume envelope именно для айтема (тейка), а не трека).
Есть экшны Show/Hide/Toggle take volume envelope, но это всё равно не решает проблему - если спрятать, а затем показать энвелоп, он всё равно остаётся неактивным, фокус останется на айтеме, а не на энвелопе. И чтобы сфокусироваться на энвелопе (для дальнейших манипуляций с точками), приходится тыкать по энвелопу мышкой.
Поэтому очень хотелось бы небольшой скриптик, который делал бы фокус на volume envelope выделенного тейка, без тыканья по энвелопу мышкой... Очень нужно для дальнейшего построения разных вкусных кастомов, без такого скрипта ничего не получится.
P.S. Вот, кстати, человек тоже об этом спрашивает:
http://forum.cockos.com/showthread.php?t=168599

UPD
Что-то мне подсказывает, что можно отсюда выдрать несколько строк :D,
Код:
-- Adjust volume envelope point at mouse cursor via mousewheel
-- Lua script by SPK77 31-Aug-2015
-- 2-Sep-2015: added support for all track envelopes

-------------------
-- User settings --
-------------------
-- Adjustment behavior
local adj_sel_env = false   -- true:  envelope has to be selected


-- Volume envelope step size
-- (User configurable "dB_steps": see "set_envelope_point" -function)

-- Pan envelope step size
local pan_env_step = 0.01 -- 200 steps (-1 to 1)

-- Width envelope step size
local width_env_step = 0.01 -- 200 steps (-1 to 1)

-- Mute envelope step size
local mute_env_step = 1 -- 2 steps (0 to 1)

----------------------------------------------------------------------



local dB_step = 0.2

local max = math.max
local abs = math.abs
local exp = math.exp
local log = math.log

local dbg = true

function msg(m)
  if dbg then
    reaper.ShowConsoleMsg(tostring(m) .. "\n")
  end
end

-- Justin's functions ----------------------------------------
function VAL2DB(x)
  if x < 0.0000000298023223876953125 then
    x = -150
  else
    x = max(-150, log(x)* 8.6858896380650365530225783783321)
  end
  return x
end

function DB2VAL(x)
  return exp(x*0.11512925464970228420089957273422)
end
--------------------------------------------------------------

-- Set new value for an envelope point
function set_envelope_point(env_prop_table, m_wheel_delta)
  local e = env_prop_table
  local env = e.pointer
  --msg(env)
  if env == nil then
    return
  end
  local min_val = e.min_val
  local max_val = e.max_val

  local br_env = reaper.BR_EnvAlloc(env, true)
  local pos = reaper.BR_PositionAtMouseCursor(false)
  local p_index = reaper.BR_EnvFind(br_env, pos, 10)
  local get_point_ret, position, value, shape, selected, bezier = reaper.BR_EnvGetPoint(br_env, p_index)
  reaper.BR_EnvFree(br_env, false)

  -- Volume envelopes
  if e.name == "Volume" or e.name == "Volume (Pre-FX)" then
    local dB_val = VAL2DB(abs(value))

    -- Change the "dB_step" here
    if     dB_val < -90 then dB_step = 5     -- < -90 dB
    elseif dB_val < -60 then dB_step = 3     -- from -90 to -60 dB
    elseif dB_val < -45 then dB_step = 2     -- from -60 to -45 dB
    elseif dB_val < -30 then dB_step = 1.5   -- from -45 to -30 dB
    elseif dB_val < -18 then dB_step = 1     -- from -30 to -18 dB
    elseif dB_val < 24  then dB_step = 0.2   -- from -18 to 24 dB
    end
 
    if m_wheel_delta < -1 then
      dB_step = -dB_step
    end
     value = DB2VAL(dB_val + dB_step)
 
  --end

  -- Pan envelopes
  elseif e.name == "Pan" or e.name == "Pan (Pre-FX)" then
    if m_wheel_delta < -1 then
      pan_env_step = -pan_env_step
    end
    value = value + pan_env_step
  --end

  -- Width envelopes
  elseif e.name == "Width" or e.name == "Width (Pre-FX)" then
    if m_wheel_delta < -1 then
      width_env_step = -width_env_step
    end
    value = value + width_env_step
  --end

  -- Mute envelope
  elseif e.name == "Mute" then
    if m_wheel_delta < -1 then
      mute_env_step = -mute_env_step
    end
    value = value + mute_env_step
  end

  if value < e.min_val then
    value = e.min_val
  end


  if value > e.max_val then
    value = e.max_val
  end

  if e.is_fader_scaling then
    value = reaper.ScaleToEnvelopeMode(1, value)
  end

  reaper.SetEnvelopePoint(env, p_index, nil, value, nil, nil, nil, true)
  reaper.UpdateArrange()
  reaper.Undo_OnStateChangeEx("Adjust volume envelope point", -1, -1)
end


-- Returns "envelope properties" table
function get_env_properties(env)
   envelope = {}
  if env ~= nil then
    --local env_name = ({reaper.GetEnvelopeName(env, "")})[2]
    local br_env = reaper.BR_EnvAlloc(env, true)
    local active, visible, armed, in_lane, lane_height, default_shape,
          min_val, max_val, center_val, env_type, is_fader_scaling
          = reaper.BR_EnvGetProperties(br_env, false, false, false, false, 0, 0, 0, 0, 0, 0, false)     
    reaper.BR_EnvFree(br_env, false)
 
    local env_name = ({reaper.GetEnvelopeName(env, "")})[2]
    if env_name == "Volume" or env_name == "Volume (Pre-FX)" then
      max_val = reaper.SNM_GetIntConfigVar("volenvrange", -1)
      if max_val ~= -1 then
        if max_val == 1 then
          max_val = 1.0
        elseif max_val == 0 then
          max_val = 2.0
        elseif max_val == 4 then
          max_val = 4.0
        else
          max_val = 16.0
        end
      end
    end
 
    --[[
    if is_fader_scaling then
      max_val    = reaper.ScaleToEnvelopeMode(1, max_val)
      center_val = reaper.ScaleToEnvelopeMode(1, center_val)
      min_val    = reaper.ScaleToEnvelopeMode(1, min_val)
    end
    --]]
 
    -- Store values to "envelope" table
    envelope.pointer = env
    envelope.active = active
    envelope.visible = visible
    envelope.armed = armed
    envelope.in_lane = in_lane
    envelope.lane_height = lane_height
    envelope.default_shape = default_shape
    envelope.min_val = min_val
    envelope.max_val = max_val
    envelope.center_val = center_val
    envelope.is_fader_scaling = is_fader_scaling
    envelope.type = env_type
    envelope.name = env_name
    envelope.is_tempo = env_type == 9
  end
  return envelope

end


----------
-- Main --
----------
function main()
  local m_wheel_delta = ({reaper.get_action_context()})[7]
  if m_wheel_delta == -1 then
    return
  end
  local windowOut, segment, details = reaper.BR_GetMouseCursorContext()
  local env
  if adj_sel_env then
    env = reaper.GetSelectedEnvelope(0)
  else
    env, is_take_env = reaper.BR_GetMouseCursorContext_Envelope()
  end
  if env == nil then -- or is_take_env then
    return
  end
  --local env_name = ({reaper.GetEnvelopeName(env, "")})[2]
  --if env_name == "Volume" or env_name == "Volume (Pre-FX)" then
    env_properties = get_env_properties(env)
    set_envelope_point(env_properties, m_wheel_delta)
  --end
end

reaper.defer(main)
но как это правильно сделать - мозгов и знаний не хватает, увы.
 
Последнее редактирование:
Не могу сообразить, помогите.
Есть вычисляемая скриптом строка -
#trackname
она может иметь следующие значения -
"KEY01_P1";
"KEY02_P1";
"GTR01_P1";
"BAS01_P1";
и т.д.

А нужно вывести через sprintf -
"KEY01_P%i";
"KEY02_P%i";
"GTR01_P%i";
"BAS01_P%i";
и т.д.
Есть функция, которая затирает один последний символ в строке?
Ну или ограничивает длинну строки кол-вом знаков (у меня всегда 7 нужно)?

Я думал, что должно было бы сработать вот такое выражение -
sprintf(#newstr, "\"%6s\", #trackname);
Которое просто будет съедать в строке P1. Не срабатывает :(

PS: Разобрался, нужно было писать не %6s, а %.6s
 
Последнее редактирование:
А в этом скрипте видно, что энвелоп фокусируется, соответственно такое принципиально возможно?
@@Michael, не подскажете, как правильно "выдрать" оттуда фокус огибающей?
 
Здравствуйте. Подскажите пожалуйста, можно ли сделать так что бы toolbar с кнопками автоматически закрывался после нажатия на оных, типа как auto close в Contextual toolbars? (после добавления Vsti из сохранённых Track template, к примеру)
 
@Beckoff, можно кастом экшеном тоже. insert track template и open close toolbar. создать для каждого template трека
прошу прощения, ошибочка. import tracks from track template. экшены sws resources
 
Последнее редактирование:
  • Like
Реакции: Beckoff
можно кастом экшеном тоже. insert track template и open close toolbar. создать для каждого template трека
Тоже думал об этом. Но со временем накопилось немалое количество Vst/Vsti и для каждого заново делать кастом экшен - это слишком..
Может с cycle action ом как нибудь решить? Только не соображу никак.
 

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