ReaScripts (скрипты для Reaper) - Учимся создавать!!! (1 онлайн

BAYANBAYAN

Active Member
4 Мар 2010
515
246
43
@Archchie, Спасибо!!! В такой конструкции работает все правильно:
local num_items = reaper.CountSelectedMediaItems(0)

for i = 0, num_items - 1 do

local item = reaper.GetSelectedMediaItem(0, i)
local take = reaper.GetActiveTake(item)

while true do;
i=(i or 0)+1;
local retval, shape, beztension = reaper.MIDI_GetCCShape(take,i-1);
if retval then;
reaper.MIDI_SetCCShape(take,i-1,5,beztension,true);
else;
break;
end;
end;
reaper.MIDI_Sort(take);
end;

reaper.Undo_BeginBlock()
reaper.UpdateArrange()
Единственное, почему-то после скрипта в миди редакторе в меню правой кнопки мыши по выделенной CC "CC curve shape" не показывает вообще никакой выбранной опции, хотя по факту все меняется. Ну, может это баг Рипера. У меня сейчас девелоперская версия установлена 6.03 + dev0204.
 

BAYANBAYAN

Active Member
4 Мар 2010
515
246
43
Archie_Item; Set in selected items CC shape to Square.lua
Archie_Item; Set in selected items CC shape to Linear.lua
Archie_Item; Set in selected items CC shape to Slow start-end.lua
Archie_Item; Set in selected items CC shape to Fast start.lua
Archie_Item; Set in selected items CC shape to Fast end.lua
Archie_Item; Set in selected items CC shape to Bezier.lua
Эти попробовал. Они меняют только в первом выделенном айтеме. Мой вариант скрипта - во всех.
 

Archie's

Well-Known Member
24 Окт 2017
1.936
1.296
113
Спасибо!!! В такой конструкции работает все правильно:
Неправда.
176066
Единственное, почему-то после скрипта в миди редакторе в меню правой кнопки мыши по выделенной CC "CC curve shape" не показывает вообще никакой выбранной опции
У меня все показывает, это наверно из за того что ты undo вставил, в этом скрипте оно не нужно, потому что точка отмены все равно не создается. Пошевели любую точку и все обновится и начнет показывать, хотя у меня и так все само обновляется, вот гиф.
11135.gif
Эти попробовал. Они меняют только в первом выделенном айтеме. Мой вариант скрипта - во всех.
Да - допустил небольшую ошибку. Исправил! Теперь меняют во всех выделенных.
Мой вариант скрипта - во всех.
Не может быть.
 
Последнее редактирование:
  • Like
Реакции: BAYANBAYAN

Archie's

Well-Known Member
24 Окт 2017
1.936
1.296
113
Спасибо за замечания! Только начинаю осваивать скрипты :). Так что это очень ценно.
По поводу Undo, это должно выглядеть так:
Нужно всегда открывать и закрывать блок отмены
JavaScript:
reaper.Undo_BeginBlock()
-- какой то код
reaper.Undo_EndBlock("название точки отмены",-1)
 
  • Like
Реакции: BAYANBAYAN

denlozikevich

New Member
22 Авг 2019
3
0
1
39
Добрый День! Есть консоль SSL AWS900+, она работает с рипер по протоколу эмуляции Mackie control mcu. Какие то экшена можно назначить на кнопки консоли - это не проблема, но нет возможности рисовать кривые автоматизации фэйдерами или энкодерами. было бы здорово написать скрипт, который позволял при помощи фэйдеров консоли рисовать кривые автоматизации на выбранном треки и управлять уровнями посылов. Ниже видео

 

ProIT

New Member
12 Ноя 2014
3
0
1
верблюдо
Ранее написал сюда
Возможно не прав, дублирую здесь. Прошу не банить и удалить лишние посты. Самостоятельно не нашел как удалять.

Приветствую.

Впервые взялся написать для себя полезное в рипер, две недели как вник в lua ,) На форумах как то трудно с поиском результативных ответов на свои вопросы. Поэтому прошу помочь, как мне правильно сделать запуск Play / Stop.

В проекте много маркеров. В стандартном Region/Marker Manager не нашел способа изменить размер шрифта, чтоб увидеть надписи на расстоянии 3-5м от монитора. Написал скрипт на базе gui из ../REAPER/Scripts/Cockos/Default_6.0_theme_adjuster.lua
В итоге перемещаюсь курсором по списку маркеров, но никак не удается включить на проигрывание / reaper.Main_OnCommand( 1007, 0 ) -- play /
Команда срабатывает, индикаторы сигналов на канале активируются, кнопка |> (play) включается и светится зеленым, но курсор остается на месте без движения и звука нет.

Скрипт собирает из проекта маркеры, передает список в ScrollBox для отображения, и всё с нажатиями пользователя обрабатывается функцией в defer().
Замечено, при работающем моем скрипте, если нажимать мышкой в кнопку |> (play) или пробел на клавиатуре, то рипер всё так же стоит колом без звука и движения. После выключения скрипта, рипер работает как и должен, все движется и играет.

PS.
Попробовал минимальную конструкцию скрипта, в нем только отработка нажатий клавиатуры, и мое изумление -- все работает. Всё еще рою где наБАГадил.

PSS.
Не удаётся обнаружить баги в своем коде. Вероятно, нет понимания как работает рипер. ((

Подскажите, где что упустил.
 

Вложения

Archie's

Well-Known Member
24 Окт 2017
1.936
1.296
113
Я не понимаю что вы хотите.
У меня код вообще не работает, сразу же выскакивает ошибка
gbase.lua:225: attempt to perform arithmetic on a nil value (global 'prevEly')
При устранении этой ошибки открывается окно в котором нарисована какая то белиберда (названия маркеров), которая не на что не реагирует
111.gif
Так что я не знаю, а весь код перебирать, это не вариант.
Курсор прилипает наверно потому что постоянно в цикле запускается функция reaper.SetEditCurPos(..) и ставит его в эту позицию.


Осваивать lua нужно с чего то по проще. А дергать функции из другого кода не понимая как это работает не к чему хорошему не приведет.
 

Mr_Tsonts

Well-Known Member
18 Апр 2019
1.656
1.341
113
56
Киев
А подскажите пожалуйста. Вопрос касающийся азов. Envelope points. Нужно найти значения первой и последней выделенной точки. То есть, например, min и max. Например, если я на правильном пути, код
Код:
points = reaper.CountEnvelopePoints(env)
for i = 0, points-1 do
  _, time, _, _, _, sel = reaper.GetEnvelopePoint(env,i)
находит все выделенные точки. Вот как теперь извлечь значения первой и последней точки?
Нужно будет потом найти значение длины, то есть len = max - min, если я на правильном пути...
 

Mr_Tsonts

Well-Known Member
18 Апр 2019
1.656
1.341
113
56
Киев
@Aleksandr Oleynik, ну, я учусь на чужих, и вроде, работающих скриптах, вот у me2beats именно таким образом находятся выделенные точки:
Код:
local r = reaper; local function nothing() end; local function bla() r.defer(nothing) end

env = r.GetSelectedEnvelope()
if not env then bla() return end
points = r.CountEnvelopePoints(env)
if not points == 0 then bla() return end

r.Undo_BeginBlock()

for i = 0, points-1 do
  _, time, _, _, _, sel = r.GetEnvelopePoint(env,i)
  if sel then r.SetEditCurPos2(0, time, 0, 0) break end
end

r.Undo_EndBlock('Move cursor to sel point', -1)
В частности, здесь эдит курсор движется к первой выделенной точке.
А здесь - к последней:
Код:
local r = reaper; local function nothing() end; local function bla() r.defer(nothing) end

local env = r.GetSelectedEnvelope()
if not env then bla() return end
local points = r.CountEnvelopePoints(env)

local max = 0

for i = 0, points-1 do
  local _, time, _, _, _, sel = r.GetEnvelopePoint(env,i)
  if sel then max = math.max(time,max) end
end

if max == 0 or r.GetCursorPosition()==max then bla() return end

r.Undo_BeginBlock()
r.SetEditCurPos2(0, max, 0, 0)
r.Undo_EndBlock('Move cursor to last sel point', 2)
Я к тому, что он так работает, но не к тому, чтобы спорить. Буду благодарен любой информации.
 
Последнее редактирование:

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.064
113
62
Киев
@Mr_Tsonts, за выделенность отвечает параметр - sel
Учиться нужно разбирая скрипт до буквы и понимая в нём ВСЕ функции. Иначе - каша!
Принцип ЭТОГО скрипта такой -
env = r.GetSelectedEnvelope() - определяет какая кривая выделенна
if not env then bla() return end - если ни какая - то скрипт дальше не работает
points = r.CountEnvelopePoints(env) - определяет кол-во ВСЕХ точек в выбранной кривой
Цикл -
for i = 0, points-1 do
_, time, _, _, _, sel = r.GetEnvelopePoint(env,i)
if sel then r.SetEditCurPos2(0, time, 0, 0) break end
end
перебирает последовательно ВСЕ точки кривой и считывает их time (время на таймлайне) и sel (выделено или нет)
_, time, _, _, _, sel = r.GetEnvelopePoint(env,i) - вот это выражение
А дальше, в каждом цикле для каждой точки вот это выражение -
if sel then ) - делает следующее -
Если точка выделена, то сразу ставим курсор на её время на таймлайне -r.SetEditCurPos2(0, time, 0, 0
и останавливаем скрипт -break end
 
  • Like
Реакции: Al Brazy

Mr_Tsonts

Well-Known Member
18 Апр 2019
1.656
1.341
113
56
Киев
@Aleksandr Oleynik, вот спасибо за такое подробное объяснение! Просто я пытаюсь поставить айтем автоматизации на выделенные точки. Тут вместо курсора можно использовать reaper.InsertAutomationItem( env, pool_id, position, length ), но нужно найти длину. Возможно, вообще для такой цели есть более подходящая фунция, чем CountEnvelopePoints?
 

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.064
113
62
Киев
Можете скриншот выложить. Я не очень понимаю что такое выделенные точки.
Мочему эту зону Тайм Селективном не обозначить?
 

Mr_Tsonts

Well-Known Member
18 Апр 2019
1.656
1.341
113
56
Киев
Можете скриншот выложить. Я не очень понимаю что такое выделенные точки.
Мочему эту зону Тайм Селективном не обозначить?
Да это вообще кастомом легко делается. Чисто в познавательных целях, чтобы как раз не трогать ни тайм селекшн, ни эдит курсор
Insert AutoItem.gif
 

Mr_Tsonts

Well-Known Member
18 Апр 2019
1.656
1.341
113
56
Киев
@Aleksandr Oleynik, правильно, двумя этими скриптами, первую и последнюю, устанавливаю туда начало и конец тайм селекшн и потом всталяю айтем автоматизации, который по умолчанию ставится по выделенному временному участку.
4fkMl_aK1rs.jpg

Но как это сделать кодом, чтобы не дёргать ни эдит курсор и не менять выделение. Понятно, всё сохраняется и восстанавливается)))) И мне не горит этот скрипт. Просто хочу понять, как это сделать.
 
Последнее редактирование:

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.064
113
62
Киев
@Aleksandr Oleynik, а вот по второму коду, что значит local max = 0, и как понять
if max == 0 or r.GetCursorPosition()==max then bla() return end
Мне не нравится как пишет код me2beats. в них не удобно разбираться новичкам!
Но смысл этого выражения в том, что если параметр max остаётся равен нулю или если курсор УЖЕ находится в позиции max - то завершить скрипт и ни чего не делать.
Мах -у в скрипте назначается время выделенной точки кривой автоматизации
 

Mr_Tsonts

Well-Known Member
18 Апр 2019
1.656
1.341
113
56
Киев
Мне не нравится как пишет код me2beats. в них не удобно разбираться новичкам!
Но смысл этого выражения в том, что если параметр max остаётся равен нулю или если курсор УЖЕ находится в позиции max - то завершить скрипт и ни чего не делать.
Мах -у в скрипте назначается время выделенной точки кривой автоматизации
Основной смысл вот здесь получается, то есть, команда установить курсор на последнюю точку -
if sel then max = math.max(time,max) end
end ?
Вернее, не команда установить курсор, а обозначение максимального значения?
 
Последнее редактирование:

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.064
113
62
Киев
@Mr_Tsonts, я писал уже, что мне не нравятся путанные скрипты me2beats.
Время первой и последней выделенной точки можно узнать на много проще и логичнее.
Первая же точка с параметом sel и будет первой выделенной - вот и имеем время первой точки и его запишем в параметр timeStart и сделаем остановку цикла For функцией break сразу же после первой выделенной.
А потом просто повторим тот же цикл For, только не будем делать break, а будем перезаписывать время в параметр timeEnd до последней выделенной, а значит в параметре timeEnd в конце цикла For останется время именно последней точки выделенной.
Вот и всё, у вас есть время начала и конца вашего айтема - создавайте.
 
Последнее редактирование:
  • Like
Реакции: Al Brazy и Mr_Tsonts

Mr_Tsonts

Well-Known Member
18 Апр 2019
1.656
1.341
113
56
Киев
@Aleksandr Oleynik, солидарен с вами в том, что у me2beats скрипты достаточно путанные и огромное спасибо за их расшифровку и подсказки. Сейчас попытаюсь сделать всё по вашей инструкции. Ещё раз спасибо.
 
  • Like
Реакции: Aleksandr Oleynik

Mr_Tsonts

Well-Known Member
18 Апр 2019
1.656
1.341
113
56
Киев
@Aleksandr Oleynik, сделать сам скрипт то получилось, но отказаться от заимствования кусков чужих кодов пока что нет. Ну, постепенно буду осваиваться. Ещё раз спасибо вам за помощь. Пока что имеем вот так:
Код:
 local function nothing() end; local function bla() reaper.defer(nothing) end

env = reaper.GetSelectedEnvelope()
if not env then bla() return end
points = reaper.CountEnvelopePoints(env)
if not points == 0 then bla() return end

reaper.Undo_BeginBlock()

for i = 0, points-1 do
  _, time, _, _, _, sel = reaper.GetEnvelopePoint(env,i)
  if sel then  break end
end

local max = 0

for i = 0, points-1 do
  local _, time, _, _, _, sel = reaper.GetEnvelopePoint(env,i)
  if sel then max = math.max(time,max) end
end

if sel then

reaper.InsertAutomationItem( env, -1, time, max-time )

end
 
reaper.Undo_EndBlock('Insert autoitem for selected points', -1)
 

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.064
113
62
Киев
Попробуйте вместо - if sel then max = math.max(time,max) end
Написать - if sel then max = time end

Должно работать так же.

И ещё -
Undo нужно только для действий, а действие у вас в скрипте ТОЛЬКО ОДНО -
if sel then
reaper.InsertAutomationItem( env, -1, time, max-time )
end
Значит первую точку Undo можно ставить прям перед ним
 
  • Like
Реакции: Mr_Tsonts

Mr_Tsonts

Well-Known Member
18 Апр 2019
1.656
1.341
113
56
Киев
Ребята, вопрос по GUI. Например, есть кнопка - local btn1 = Button:new(5, 10,30,30, R,G,B,1, "01","Arial",20 ),
на её нажатие назначена функция -
btn1.onClick = function()reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_SAVE_SOLO_MUTE_ALL_ITEMS_SLOT_1"),0)
reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_FOCUS_ARRANGE_WND"),0)end.
Хочу добавить на неё же, только с зажатой, например, Ctrl ещё одну функцию. Как это сделать? Спасибо.
 

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.064
113
62
Киев
@Mr_Tsonts, ой....., это сложно и нужно смотреть код скрипта.
В скрипте где то описан onClick, а нужно добавить описание CtrlonClick
 

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