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

  • Автор темы Автор темы @Michael
  • Дата начала Дата начала
@lyrex, настроечку на картинке включить

2. Экшн который производит по центру внутри выделения split айтема, и создаётт кроссфэйд между получившимися частями длинной в это выделение. Выделяется правый айтем, из тех двух что получились.

Item: Split items at edit cursor (select right)
Item: Split item under mouse cursor (select right)
на выбор
 

Вложения

  • CF split.png
    CF split.png
    123,8 KB · Просмотры: 232
  • Like
Реакции: lyrex
@lyrex, настроечку на картинке включить
lyrex сказал(а): ↑
2. Экшн который производит по центру внутри выделения split айтема, и создаётт кроссфэйд между получившимися частями длинной в это выделение. Выделяется правый айтем, из тех двух что получились.
Item: Split items at edit cursor (select right)
Item: Split item under mouse cursor (select right)
на выбор

спасибо)) но это не то что нужно. тут не так просто..
 
Пытаюсь раздвинуть немного worlflow за рамки компа. Получилось сделать так, чтоб при выделении трека lemur принимал его название на text-объект
Код:
setattribute(Label,'content', OSC_ARGS[1]);
Но вот засада, почему-то когда я вбиваю имя трека в кач-ве условия к действию, ничего не работает, видимо, лемур принимает какое-то сообщение отличное по содержанию от имени трека:
Код:
if(OSC_ARGS[0]=='SS Domra')
{
setattribute(Label,'content', OSC_ARGS[1]);
setattribute(art1,'label_off', 'trem');
setattribute(art1,'label_on', 'trem');
setattribute(art2,'label_off', 'stacc');
setattribute(art2,'label_on', 'stacc');
}
else
{
setattribute(Label,'content', '');
setattribute(art1,'label_off', '');
setattribute(art1,'label_on', '');
setattribute(art2,'label_off', '');
setattribute(art2,'label_on', '');
}
то-есть в таком случае, какой бы трек я не выделил, текст остается пустым. Что я делаю не так?

Возникла мысль посылать уникальный OSC для каждого трека, чтоб в зависимости от сообщения переименовывать\менять функционал элементоа UI, но не могу из рипеа послать OSC. Заглянул в референс, там встроенная команда только на локальное сообщение в рипер, а вот с девайсом, получается, он контактирует только посредством заложенных фукнкций?
 
Что я делаю не так?
А какое условие ставишь в качестве Execution в скрипте Лемура?
[DOUBLEPOST=1485727890][/DOUBLEPOST]
а вот с девайсом, получается, он контактирует только посредством заложенных фукнкций?
Нет, посредством отслеживания канала OSC - для этого нужно к тексту (например) прикрепить объект скрипт и в его Execution выбрать On OSC и адрес правильно написать в строке и в конфигурационном файле Рипера этот адрес должен быть.
Да, блин, не просто :(
 
Чтоб принять в Лемур текст с именем трека нужно в файле ****.ReaperOsc - записать строку (например) так -
TRACK_NAME s/Text@/content
Затем в Лемуре создать объект Text (наприем Text 3) и к нему прикрепит скрипт, в котором в качестве Execution будет "On OSC" и в строке будет записано - /Text62/content (где 62 - это номер трека имя которого хочешь в Лемуре увидеть)
В тексте скрипта для этого должно быть -
setattribute(Text3, 'content', OSC_ARGS);

И ещё один нюанс - для того: чтобы имя поменялось, нужно чтоб ты его физически по новой в Рипере вколотил (изменил).
 
А какое условие ставишь в качестве Execution в скрипте Лемура?
on OSC, он его принимает, и наначение значения OSC на текст работает.
То-есть, когда я кликаю по трекам текстовое поле меняется на точное имя трека.
Но когда я пытаюсь поставить имя конкретного трека в кач-ве условия - все разваливается...
[DOUBLEPOST=1485728753][/DOUBLEPOST]
где 62 - это номер трека имя которого хочешь в Лемуре увидеть
а вот с этим засада. Я для того имена и решил использовать, чтоб отвязаться от номера трека. По номеру трека все б просто было)) Кроме того, что до этого трека уже в проект ничего не поставишь. А я себе такой роскоши в угоду доп контролю с дисплея позволить не могу....
[DOUBLEPOST=1485728923][/DOUBLEPOST]исходная задача - по вктивному треку (независимо от его номера) изменять имена и исполняемые команды нескольких кнопок на девайсе. Короче, переключалку артикуляций запилить. Темплейтовую, не проектовую.
 
а вот с этим засада. Я для того имена и решил использовать, чтоб отвязаться от номера трека.
С Лемуром этого не получится - тут нужно что-то мудрить в Рипере со скриптами, а в Лемур передавать что-то привязанное к конкретному треку?
В общем, если подробно опишешь задачу: попробую помочь в реализации!
[DOUBLEPOST=1485729006][/DOUBLEPOST]
Кроме того, что до этого трека уже в проект ничего не поставишь. А я себе такой роскоши в угоду доп контролю с дисплея позволить не могу....
Но его можно поставить первым и скрыть,
УВЫ но Лемур может "слушать" только конкретный трек, может конкретный марке ещё, может имя палгина который ты последний трогал: может имя параметра плагина - с Решгионом я так и не научился.

PS: Я так жду, что скрипты в Рипере смогут посылать и принимать OSC сообщения - тогда много интересного можно будет делять.
[DOUBLEPOST=1485729472][/DOUBLEPOST]
исходная задача - по вктивному треку (независимо от его номера) изменять имена и исполняемые команды нескольких кнопок на девайсе.
Для этого нужно зарезервировать ПЕРВЫЙ трек в проекте, номер которого ни когда не поменяется, на это дело и написать под Рипер скрипт, который будет переименовывать его имя в зависимости от того, какой трек ты выделил.
Ну и дальше понятно.
Можно подумать что-то ещё
Если бы в Default.ReaperOsc была строка -
LAST_TOUCHED_TRACK_NAME
тогда можно было бы
Кстати, есть -
LAST_TOUCHED_FX_TRACK_NAME - выдаст имя трека на котором ты открыл последний FX
 
Последнее редактирование:
  • Like
Реакции: PianoIst
PS: Я так жду, что скрипты в Рипере смогут посылать и принимать OSC сообщения - тогда много интересного можно будет делять.
это да, просто лафа бы началась)))

А как тогда я получаю имя тронутого трека? Я поставил device track follows last touched, и потом в лемуре принимаю osc /track/name/
И текст меняется как надо
[DOUBLEPOST=1485729972][/DOUBLEPOST]
Для этого нужно зарезервировать ПЕРВЫЙ трек в проекте, номер которого ни когда не поменяется, на это дело и написать под Рипер скрипт, который будет переименовывать его имя в зависимости от того, какой трек ты выделил.
а вот это оченя дельная мысль))) Я тут просто попутно смотрю где какие решения в принципе по данному вопросу уже валяются))
 
А как тогда я получаю имя тронутого трека? Я поставил device track follows last touched, и потом в лемуре принимаю osc /track/name/
И текст меняется как надо
ДА! Я это пропустил - можно попробовать!
Но тогда там, где ты в Execution выбираешь "On OSC" и в строке нужно попробовать писать - /track/content
и в файле ****.ReaperOsc - записать строку так -
TRACK_NAME s/track/content
по идее должно работать для выделенного трека - проверь
 
  • Like
Реакции: PianoIst
@PianoIst, Проверил - работает!
PS: А вообще - ты молодец!
Я до Лемуровских скриптов долго шёл и разбирался.
 
Последнее редактирование:
  • Like
Реакции: PianoIst
Я до Лемуровских скриптов долго шёл и разбирался.
ну синтаксис там простой. Даже легче, чем в kontakt. И на них посмотрел, потому что лень lua и питон учить :D

Проверил - работает!
Спасибо! Я вчера уже спать рухнул, сегодня обязательно продоолжу)
 
ну синтаксис там простой. Даже легче, чем в kontakt. И на них посмотрел, потому что лень lua и питон учить :D
Если бы он где-то был нормально описан.
А то простое действие, перевод цифры в строку пришлось через задницу решать и придумывать.
[DOUBLEPOST=1485761666][/DOUBLEPOST]
Спасибо! Я вчера уже спать рухнул, сегодня обязательно продоолжу)
Сама идея, кстати, зачётная! Но я бы наверное делал всё в lua в самом Рипере...... - на много больше свободы в написании условий.
 
  • Like
Реакции: PianoIst
Но я бы наверное делал всё в lua в самом Рипере
без этого все равно не обойтись. Как минимум, чтоб он автоматом продлял ноты до следующего переключения (точнее, убирал метку note end). Но я пока не совсем разобрался с API, а референс по синтаксу вообще не читал, только пару скриптов глянул.
Вообще тут вот уже сделали чегой-то очень интересное. Сдам сегодня сведение, приобрету)
 
Всё таки GUI,я бы забросил на внешний планшет, а вот функционал бы сделал на lua в Reaper-е.
 
как сделать, чтоб после нормалайза рипер понижал громкость треков на тот же уровень что повысил нормалайз
Код:
local r = reaper; local function nothing() end; local function bla() r.defer(nothing) end

local items = r.CountSelectedMediaItems()
if items == 0 then bla() return end

function DB(vol) return 20*math.log(vol, 10) end

function VOL(db) return 10^(0.05*db) end


r.Undo_BeginBlock() r.PreventUIRefresh(1)

r.Main_OnCommand(40108,0) -- Item properties: Normalize items

for i = 0, items-1 do
  local item = r.GetSelectedMediaItem(0,i)
  local take = r.GetActiveTake(item)
  vol = r.GetMediaItemTakeInfo_Value(take, 'D_VOL')
  vol_db = DB(vol)
  tr = r.GetMediaItem_Track(item)
  tr_vol = r.GetMediaTrackInfo_Value(tr, 'D_VOL')
  tr_vol_db = DB(tr_vol)
  if tr_vol_db ~= -vol_db then
    r.SetMediaTrackInfo_Value(tr, 'D_VOL',VOL(-vol_db))
  end
end

r.PreventUIRefresh(-1) r.Undo_EndBlock('normalize items + compensation', -1)

Это уже с нормалайзом
 
@lil-burn спасибо большое! а возможно вместо нормалайза вставить эту комманду: Xenakios/SWS: Normalize selected takes to dB value?
 
Последнее редактирование:
возможно вместо нормалайза вставить эту комманду: Xenakios/SWS: Normalize selected takes to dB value?

Код:
local r = reaper; local function nothing() end; local function bla() r.defer(nothing) end

local items = r.CountSelectedMediaItems()
if items == 0 then bla() return end

function DB(vol) return 20*math.log(vol, 10) end

function VOL(db) return 10^(0.05*db) end


r.Undo_BeginBlock() r.PreventUIRefresh(1)

r.Main_OnCommand(r.NamedCommandLookup('_XENAKIOS_NORMALZTAKESDB'),0) -- Normalize items (Xen)

for i = 0, items-1 do
  local item = r.GetSelectedMediaItem(0,i)
  local take = r.GetActiveTake(item)
  vol = r.GetMediaItemTakeInfo_Value(take, 'D_VOL')
  vol_db = DB(vol)
  tr = r.GetMediaItem_Track(item)
  tr_vol = r.GetMediaTrackInfo_Value(tr, 'D_VOL')
  tr_vol_db = DB(tr_vol)
  if tr_vol_db ~= -vol_db then
    r.SetMediaTrackInfo_Value(tr, 'D_VOL',VOL(-vol_db))
  end
end

r.PreventUIRefresh(-1) r.Undo_EndBlock('normalize items + compensation', -1)
 
  • Like
Реакции: DoTheBeat
@Dimson,

Код:
local r = reaper; local function nothing() end; local function bla() r.defer(nothing) end

local items = r.CountSelectedMediaItems()
if items == 0 then bla() return end

function DB(vol) return 20*math.log(vol, 10) end

function VOL(db) return 10^(0.05*db) end


r.Undo_BeginBlock() r.PreventUIRefresh(1)

r.Main_OnCommand(40108,0) -- Item properties: Normalize items

for i = 0, items-1 do
  local item = r.GetSelectedMediaItem(0,i)
  local take = r.GetActiveTake(item)
  vol = r.GetMediaItemTakeInfo_Value(take, 'D_VOL')
  vol_db = DB(vol)
  tr = r.GetMediaItem_Track(item)
  tr_vol = r.GetMediaTrackInfo_Value(tr, 'D_VOL')
  tr_vol_db = DB(tr_vol)
  r.SetMediaTrackInfo_Value(tr, 'D_VOL',VOL(tr_vol_db-vol_db))
end

r.PreventUIRefresh(-1) r.Undo_EndBlock('normalize items + compensation', -1)

также если в реапаке есть мой репозиторий, можно скачать оттуда:
Normalize items (active takes) with track volume compensation

@DoTheBeat,
Код:
local r = reaper; local function nothing() end; local function bla() r.defer(nothing) end

local items = r.CountSelectedMediaItems()
if items == 0 then bla() return end

function DB(vol) return 20*math.log(vol, 10) end

function VOL(db) return 10^(0.05*db) end


r.Undo_BeginBlock() r.PreventUIRefresh(1)

r.Main_OnCommand(r.NamedCommandLookup('_XENAKIOS_NORMALZTAKESDB'),0) -- Normalize items (Xen)

for i = 0, items-1 do
  local item = r.GetSelectedMediaItem(0,i)
  local take = r.GetActiveTake(item)
  vol = r.GetMediaItemTakeInfo_Value(take, 'D_VOL')
  vol_db = DB(vol)
  tr = r.GetMediaItem_Track(item)
  tr_vol = r.GetMediaTrackInfo_Value(tr, 'D_VOL')
  tr_vol_db = DB(tr_vol)
  r.SetMediaTrackInfo_Value(tr, 'D_VOL',VOL(tr_vol_db-vol_db))
end

r.PreventUIRefresh(-1) r.Undo_EndBlock('normalize items + compensation', -1)
 
  • Like
Реакции: DoTheBeat и Dimson
Коллеги есть скрипт SWS/BR Normalize loudnes of selected items/track... Но у него не работает (возможно только у меня) нормализация tracks. Items нормализуются отлично. Возможно я что то не так делаю и понимаю, но нужен вариант нормализовать все items трека на определённую величину LUFS как единый файл. Надеюсь понятно описал))))
 
Но у него не работает (возможно только у меня) нормализация tracks.
Работает, но смешно - меняет тупо значение громкости на треке :)
В общем-то, это правильно и максимально просто.
Другое дело, если вам вообще-то нужна нормализация ни на треке, а в части его, в Регионе, в котором куча нашпигованных айтемов.
Ну и конечно не хотелось бы нормализацией тупо просто менять значение громкости на треке.
PS: Я понимаю что вам нужно, постараюсь написать такой скрипт
 
  • Like
Реакции: ff-records
@lil-burn, все равно, скрипт работает корректно не во всех ситуациях, если выделить несколько айтемов, то скрипт поочередно будет делать нормалайз и компенсацию громкости, в итоге фейдер громкости трека уйдет в никуда)) Можно сделать так, что-бы при выделении группы айтемов, скрипт определял наивысшее значение нормалайза этой группы, и на это значение компенсировал громкость канала?
 
@Dimson,
Код:
local r = reaper; local function nothing() end; local function bla() r.defer(nothing) end

local items = r.CountSelectedMediaItems()
if items == 0 then bla() return end

function DB(vol) return 20*math.log(vol, 10) end

function VOL(db) return 10^(0.05*db) end


r.Undo_BeginBlock() r.PreventUIRefresh(1)

r.Main_OnCommand(40108,0) -- Item properties: Normalize items

t = {}

for i = 0,items-1 do
  local item = r.GetSelectedMediaItem(0,i)
  local take = r.GetActiveTake(item)
  if not take then goto cnt end
  local tr = r.GetMediaItem_Track(item)
  vol = r.GetMediaItemTakeInfo_Value(take, 'D_VOL')
  vol_db = DB(vol)
  tr_str = tostring(tr)
  if not t[tr_str] then t[tr_str] = {} end
  if t[tr_str][3] then
    if vol_db > t[tr_str][3] then t[tr_str] = {tr,item,vol_db} end
  else t[tr_str] = {tr,item,vol_db} end
  ::cnt::
end

for _,v in pairs(t) do
  local tr = v[1]
  local item = v[2]
  vol_db = v[3]
  tr_vol = r.GetMediaTrackInfo_Value(tr, 'D_VOL')
  tr_vol_db = DB(tr_vol)
  r.SetMediaTrackInfo_Value(tr, 'D_VOL',VOL(tr_vol_db-vol_db))
end

r.PreventUIRefresh(-1) r.Undo_EndBlock('normalize items + compensation', -1)
comp.gif

@DoTheBeat,
делает то же, что и на гиф выше, только с экшеном Xenakios, вместо стандартного normalize
Код:
local r = reaper; local function nothing() end; local function bla() r.defer(nothing) end

local items = r.CountSelectedMediaItems()
if items == 0 then bla() return end

function DB(vol) return 20*math.log(vol, 10) end

function VOL(db) return 10^(0.05*db) end


r.Undo_BeginBlock() r.PreventUIRefresh(1)

r.Main_OnCommand(r.NamedCommandLookup('_XENAKIOS_NORMALZTAKESDB'),0) -- Normalize items (Xen)

t = {}

for i = 0,items-1 do
  local item = r.GetSelectedMediaItem(0,i)
  local take = r.GetActiveTake(item)
  if not take then goto cnt end
  local tr = r.GetMediaItem_Track(item)
  vol = r.GetMediaItemTakeInfo_Value(take, 'D_VOL')
  vol_db = DB(vol)
  tr_str = tostring(tr)
  if not t[tr_str] then t[tr_str] = {} end
  if t[tr_str][3] then
    if vol_db > t[tr_str][3] then t[tr_str] = {tr,item,vol_db} end
  else t[tr_str] = {tr,item,vol_db} end
  ::cnt::
end

for _,v in pairs(t) do
  local tr = v[1]
  local item = v[2]
  vol_db = v[3]
  tr_vol = r.GetMediaTrackInfo_Value(tr, 'D_VOL')
  tr_vol_db = DB(tr_vol)
  r.SetMediaTrackInfo_Value(tr, 'D_VOL',VOL(tr_vol_db-vol_db))
end

r.PreventUIRefresh(-1) r.Undo_EndBlock('normalize items + compensation', -1)
 
  • Like
Реакции: Dimson и DoTheBeat
не знаю, задавался ли вопрос, поиск по теме результатов не дал...
где и как можно поменять переменные gfx?
конкретно gfx_x,gfx_y,gfx_r и т.д.
Сейчас методом тыка осваиваю eel, и не могу даже вывести в окно строку hello world, кмк, по причине того, что окно черное и текст тоже черный. Может и не прав)
Код:
desc:Test
slider1:5<0,10,1>slider description

@init
gfx_g=100 \\тут ругается

@gfx 40 40
    x = "hello world";
   gfx_printf(str, "asd")
[DOUBLEPOST=1486044264][/DOUBLEPOST]Идиот, ; кто будет ставить?
[DOUBLEPOST=1486044466][/DOUBLEPOST]Так, а цвет не меняется....
Код:
desc:Test
slider1:5<0,10,1>slider description


@gfx
  gfx_clear = -1;
  gfx_x = -1;
  gfx_y = 0;
  gfx_r = 1;
  gfx_g = 10;
  gfx_b = 100;
  gfx_h = 640;
  gfx_w = 480;
  gfx_blit(-1,1,0);    x = "hello world";
   gfx_printf(str, "asd")
 
Парни, привет!
Помогите, пожалуйста, создать скрипт.
Нужно, чтобы в MIDI Editors скопированные ноты при копировании сохраняли свое местоположение, эдакий Relative Copy/Paste.
01 Copy.png 02 Paste.png
Заранее благодарю.
 
Последнее редактирование:
Может тут было , просто не знаю , что в поиск задать . Сам попробовал кастом экшен сбацать , но чёт пока коротка кольчужка ) В общем нужно один длинный итем , порубать по подобию ряда мелких итемов . Вот на гифке почти в ручную делаю , а хотелось бы по-риперовски )))
 

Вложения

  • I NEED SCRIPT.gif
    I NEED SCRIPT.gif
    696 KB · Просмотры: 256

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