Помогите создать экшн / кастом экшн / скрипт (3 онлайн)

axis

Well-Known Member
18 Апр 2005
4.723
3.256
113
45
Kaniv, UA
@lyrex, настроечку на картинке включить

2. Экшн который производит по центру внутри выделения split айтема, и создаётт кроссфэйд между получившимися частями длинной в это выделение. Выделяется правый айтем, из тех двух что получились.
Item: Split items at edit cursor (select right)
Item: Split item under mouse cursor (select right)
на выбор
 

Вложения

  • Like
Реакции: lyrex

lyrex

Member
7 Ноя 2007
35
4
8
@lyrex, настроечку на картинке включить
lyrex сказал(а): ↑
2. Экшн который производит по центру внутри выделения split айтема, и создаётт кроссфэйд между получившимися частями длинной в это выделение. Выделяется правый айтем, из тех двух что получились.
Item: Split items at edit cursor (select right)
Item: Split item under mouse cursor (select right)
на выбор
спасибо)) но это не то что нужно. тут не так просто..
 

PianoIst

Well-Known Member
19 Май 2010
4.106
4.158
113
29
Kirchberg, kreis Zwickau
soundcloud.com
Пытаюсь раздвинуть немного 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. Заглянул в референс, там встроенная команда только на локальное сообщение в рипер, а вот с девайсом, получается, он контактирует только посредством заложенных фукнкций?
 

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.064
113
62
Киев
Что я делаю не так?
А какое условие ставишь в качестве Execution в скрипте Лемура?
[DOUBLEPOST=1485727890][/DOUBLEPOST]
а вот с девайсом, получается, он контактирует только посредством заложенных фукнкций?
Нет, посредством отслеживания канала OSC - для этого нужно к тексту (например) прикрепить объект скрипт и в его Execution выбрать On OSC и адрес правильно написать в строке и в конфигурационном файле Рипера этот адрес должен быть.
Да, блин, не просто :(
 

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.064
113
62
Киев
Чтоб принять в Лемур текст с именем трека нужно в файле ****.ReaperOsc - записать строку (например) так -
TRACK_NAME s/Text@/content
Затем в Лемуре создать объект Text (наприем Text 3) и к нему прикрепит скрипт, в котором в качестве Execution будет "On OSC" и в строке будет записано - /Text62/content (где 62 - это номер трека имя которого хочешь в Лемуре увидеть)
В тексте скрипта для этого должно быть -
setattribute(Text3, 'content', OSC_ARGS);

И ещё один нюанс - для того: чтобы имя поменялось, нужно чтоб ты его физически по новой в Рипере вколотил (изменил).
 

PianoIst

Well-Known Member
19 Май 2010
4.106
4.158
113
29
Kirchberg, kreis Zwickau
soundcloud.com
А какое условие ставишь в качестве Execution в скрипте Лемура?
on OSC, он его принимает, и наначение значения OSC на текст работает.
То-есть, когда я кликаю по трекам текстовое поле меняется на точное имя трека.
Но когда я пытаюсь поставить имя конкретного трека в кач-ве условия - все разваливается...
[DOUBLEPOST=1485728753][/DOUBLEPOST]
где 62 - это номер трека имя которого хочешь в Лемуре увидеть
а вот с этим засада. Я для того имена и решил использовать, чтоб отвязаться от номера трека. По номеру трека все б просто было)) Кроме того, что до этого трека уже в проект ничего не поставишь. А я себе такой роскоши в угоду доп контролю с дисплея позволить не могу....
[DOUBLEPOST=1485728923][/DOUBLEPOST]исходная задача - по вктивному треку (независимо от его номера) изменять имена и исполняемые команды нескольких кнопок на девайсе. Короче, переключалку артикуляций запилить. Темплейтовую, не проектовую.
 

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.064
113
62
Киев
а вот с этим засада. Я для того имена и решил использовать, чтоб отвязаться от номера трека.
С Лемуром этого не получится - тут нужно что-то мудрить в Рипере со скриптами, а в Лемур передавать что-то привязанное к конкретному треку?
В общем, если подробно опишешь задачу: попробую помочь в реализации!
[DOUBLEPOST=1485729006][/DOUBLEPOST]
Кроме того, что до этого трека уже в проект ничего не поставишь. А я себе такой роскоши в угоду доп контролю с дисплея позволить не могу....
Но его можно поставить первым и скрыть,
УВЫ но Лемур может "слушать" только конкретный трек, может конкретный марке ещё, может имя палгина который ты последний трогал: может имя параметра плагина - с Решгионом я так и не научился.

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

PianoIst

Well-Known Member
19 Май 2010
4.106
4.158
113
29
Kirchberg, kreis Zwickau
soundcloud.com
PS: Я так жду, что скрипты в Рипере смогут посылать и принимать OSC сообщения - тогда много интересного можно будет делять.
это да, просто лафа бы началась)))

А как тогда я получаю имя тронутого трека? Я поставил device track follows last touched, и потом в лемуре принимаю osc /track/name/
И текст меняется как надо
[DOUBLEPOST=1485729972][/DOUBLEPOST]
Для этого нужно зарезервировать ПЕРВЫЙ трек в проекте, номер которого ни когда не поменяется, на это дело и написать под Рипер скрипт, который будет переименовывать его имя в зависимости от того, какой трек ты выделил.
а вот это оченя дельная мысль))) Я тут просто попутно смотрю где какие решения в принципе по данному вопросу уже валяются))
 

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.064
113
62
Киев
А как тогда я получаю имя тронутого трека? Я поставил device track follows last touched, и потом в лемуре принимаю osc /track/name/
И текст меняется как надо
ДА! Я это пропустил - можно попробовать!
Но тогда там, где ты в Execution выбираешь "On OSC" и в строке нужно попробовать писать - /track/content
и в файле ****.ReaperOsc - записать строку так -
TRACK_NAME s/track/content
по идее должно работать для выделенного трека - проверь
 
  • Like
Реакции: PianoIst

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.064
113
62
Киев
@PianoIst, Проверил - работает!
PS: А вообще - ты молодец!
Я до Лемуровских скриптов долго шёл и разбирался.
 
Последнее редактирование:
  • Like
Реакции: PianoIst

PianoIst

Well-Known Member
19 Май 2010
4.106
4.158
113
29
Kirchberg, kreis Zwickau
soundcloud.com
Я до Лемуровских скриптов долго шёл и разбирался.
ну синтаксис там простой. Даже легче, чем в kontakt. И на них посмотрел, потому что лень lua и питон учить :D

Проверил - работает!
Спасибо! Я вчера уже спать рухнул, сегодня обязательно продоолжу)
 

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.064
113
62
Киев
ну синтаксис там простой. Даже легче, чем в kontakt. И на них посмотрел, потому что лень lua и питон учить :D
Если бы он где-то был нормально описан.
А то простое действие, перевод цифры в строку пришлось через задницу решать и придумывать.
[DOUBLEPOST=1485761666][/DOUBLEPOST]
Спасибо! Я вчера уже спать рухнул, сегодня обязательно продоолжу)
Сама идея, кстати, зачётная! Но я бы наверное делал всё в lua в самом Рипере...... - на много больше свободы в написании условий.
 
  • Like
Реакции: PianoIst

PianoIst

Well-Known Member
19 Май 2010
4.106
4.158
113
29
Kirchberg, kreis Zwickau
soundcloud.com
Но я бы наверное делал всё в lua в самом Рипере
без этого все равно не обойтись. Как минимум, чтоб он автоматом продлял ноты до следующего переключения (точнее, убирал метку note end). Но я пока не совсем разобрался с API, а референс по синтаксу вообще не читал, только пару скриптов глянул.
Вообще тут вот уже сделали чегой-то очень интересное. Сдам сегодня сведение, приобрету)
 

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.064
113
62
Киев
Всё таки GUI,я бы забросил на внешний планшет, а вот функционал бы сделал на lua в Reaper-е.
 

lil-burn

Well-Known Member
15 Авг 2012
903
638
93
Екатеринбург
как сделать, чтоб после нормалайза рипер понижал громкость треков на тот же уровень что повысил нормалайз
Код:
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)

Это уже с нормалайзом
 

DoTheBeat

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

lil-burn

Well-Known Member
15 Авг 2012
903
638
93
Екатеринбург
возможно вместо нормалайза вставить эту комманду: 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

lil-burn

Well-Known Member
15 Авг 2012
903
638
93
Екатеринбург
@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

DoTheBeat

Active Member
17 Окт 2009
248
71
28
@lil-burn спасибо большое!! то что раньше занимало минут 10 теперь в 2 клика делается!
 

ff-records

Active Member
11 Янв 2016
158
70
28
50
Коллеги есть скрипт SWS/BR Normalize loudnes of selected items/track... Но у него не работает (возможно только у меня) нормализация tracks. Items нормализуются отлично. Возможно я что то не так делаю и понимаю, но нужен вариант нормализовать все items трека на определённую величину LUFS как единый файл. Надеюсь понятно описал))))
 

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.064
113
62
Киев
Но у него не работает (возможно только у меня) нормализация tracks.
Работает, но смешно - меняет тупо значение громкости на треке :)
В общем-то, это правильно и максимально просто.
Другое дело, если вам вообще-то нужна нормализация ни на треке, а в части его, в Регионе, в котором куча нашпигованных айтемов.
Ну и конечно не хотелось бы нормализацией тупо просто менять значение громкости на треке.
PS: Я понимаю что вам нужно, постараюсь написать такой скрипт
 
  • Like
Реакции: ff-records

Dimson

Active Member
5 Окт 2004
660
135
43
53
Днепродым
@lil-burn, все равно, скрипт работает корректно не во всех ситуациях, если выделить несколько айтемов, то скрипт поочередно будет делать нормалайз и компенсацию громкости, в итоге фейдер громкости трека уйдет в никуда)) Можно сделать так, что-бы при выделении группы айтемов, скрипт определял наивысшее значение нормалайза этой группы, и на это значение компенсировал громкость канала?
 

lil-burn

Well-Known Member
15 Авг 2012
903
638
93
Екатеринбург
@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

PianoIst

Well-Known Member
19 Май 2010
4.106
4.158
113
29
Kirchberg, kreis Zwickau
soundcloud.com
не знаю, задавался ли вопрос, поиск по теме результатов не дал...
где и как можно поменять переменные 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")
 

tosh

Active Member
5 Окт 2005
525
147
43
Кременчуг UA
Парни, привет!
Помогите, пожалуйста, создать скрипт.
Нужно, чтобы в MIDI Editors скопированные ноты при копировании сохраняли свое местоположение, эдакий Relative Copy/Paste.
01 Copy.png 02 Paste.png
Заранее благодарю.
 
Последнее редактирование:

Al Brazy

Well-Known Member
14 Авг 2009
774
1.090
93
51
Россия
Может тут было , просто не знаю , что в поиск задать . Сам попробовал кастом экшен сбацать , но чёт пока коротка кольчужка ) В общем нужно один длинный итем , порубать по подобию ряда мелких итемов . Вот на гифке почти в ручную делаю , а хотелось бы по-риперовски )))
 

Вложения

Сейчас онлайн (Пользователей: 0, Гостей: 3)