ReaScripts (скрипты для Reaper) - обсуждение (1 онлайн

mitinglas

дМитрий Зайцев
Чего-то опять в одном из проектов отвалился RetroRecord... В пустом проекте работает, а в конктетном - нет. И фокус менял, щелкаешь по арранж полю - нет эффекта :( Нажатие клавиши записи все прекрасно пишет, а вот RetroRecord - нет. Что бы могло быть?
 

Вложения

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.063
113
62
Киев
Женя, заканчивай до уровня рабочей версии и выкладывай в отдельную тему и тут и на оф. форуме.
Скрип отличный, на конец то можно будет воспользоваться родным функционалом Рипера трек мультичейна с человеческим лицом и визуально понятной логикой.

Скриптов, в том числе и очень сложных и очень эффектных написано под Рипер уже много, но ТАКОГО ещё не было.
И ещё одно - у этой идеи и скрипта реализовавшей её скелет, огромный потенциал - есть куда скрипту развиваться, добовляя функционал.
 

vitalker

Well-Known Member
8 Окт 2013
5.085
2.195
113
Гродно
@EUGEN27771, чувак - это просто охренеть как круто. Один вопрос - пре и пос обработка - это обработка до параллельных цепей и уже обработанная, соответственно?
 

SKlogic

Well-Known Member
14 Май 2006
3.126
1.208
113
46
Moscow
sergeykuptsov.com
@EUGEN27771, если компенсация не работает это конечно бесполезная штука к сожалению (((
а вот синты конечно наоборот на мой взгляд самая ненужная тема-ибо можно настроить один миди треки и послать его на сколько хош синтов
 

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.063
113
62
Киев
@EUGEN27771, если компенсация не работает это конечно бесполезная штука к сожалению (((
Во-первых, добавляйте - для вас, так как масса людей пользуются плагинами без задержки и эта конструкция интересна для создания заготовок паралельной обработки, которые вызываются одним кликом.
Во-вторых, если на оф форуме скрипт будет популярен, Джастин даст нам некоторые инструменты, которые позволят всё корректно и с задержкой делать, я уверен.
А нужно то всего - пару функций в API добавить и всё.
а вот синты конечно наоборот на мой взгляд самая ненужная тема-ибо можно настроить один миди треки и послать его на сколько хош синтов
Опять же, вы просто не понимаете на сколько она удобная и нужная.
[DOUBLEPOST=1503768183][/DOUBLEPOST]
Единственный выход - заведомо брать без задержек.
Пока Джастин не даст нам в API пару-тройку новых функций
 

SKlogic

Well-Known Member
14 Май 2006
3.126
1.208
113
46
Moscow
sergeykuptsov.com
@EUGEN27771, в смысле нигде? аблетоне, в с1. Все идеально. И даже если в рипере роутингом мутить- все работает. Аблетоновский рэк имхо идеален вообще
А синты через треки удобнее, ибо часто в разных частях песни нужна не пачка а один. И тут придется запариваться с автоматизацией
 

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.063
113
62
Киев
@EUGEN27771, в смысле нигде? аблетоне, в с1. Все идеально. И даже если в рипере роутингом мутить- все работает.
В Рипере тоже всё в ЭТОМ смысле работает. Женя не об этих проблемах написал.

Аблетоновский рэк имхо идеален вообще
Совсем НЕ идеален. Могу очень много привести того, что в нём сделать нельзя.

А синты через треки удобнее, ибо часто в разных частях песни нужна не пачка а один. И тут придется запариваться с автоматизацией
А с по трековой конструкцией как вы треки из пачки отрубаете?
 

SKlogic

Well-Known Member
14 Май 2006
3.126
1.208
113
46
Moscow
sergeykuptsov.com
@Aleksandr Oleynik, ну пример чего нельзя-хочется услышать-особенно который в реальной работе нужнее чем использовать плагины без задержки)

А в потрековой конструкции просто миди прописывается не на родительский трек а на трек чайлда в нужных местах. все очень просто и эффективно. хочешь пачку-пиши на общий. хочешь отдельно-на отдельный
как и в лоджике
 
  • Like
Реакции: RJ Baker

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.063
113
62
Киев
@Aleksandr Oleynik, ну пример чего нельзя-хочется услышать
Например поменяйте кривую (её характер) кросфейда при переключении эффектов в Реке.
Или сделайте в разных местах композиции разный порядок включения эффектов в реке с нужной длительностью и величиной кросфейда.
Или увеличте кол-во привязнных к модуляциям параметров эффектов более, чем дал вам разработчик (больше 8-и).
Я очень давно разбирался с тонкостями Эффект Рэка Аблетона, может что-то и добавили.

А в потрековой конструкции просто миди прописывается не на родительский трек а на трек чайлда нужных местах. все очень просто и эффективно
как и в лоджике
Это на ваш взгляд это просто, а на мой - проще иметь всю миди дорожку на одном треке и не заморачиваться с её порезкой и по трековой переноской.
 
Последнее редактирование:

SKlogic

Well-Known Member
14 Май 2006
3.126
1.208
113
46
Moscow
sergeykuptsov.com
@EUGEN27771, ну я не замечал проблем с компенсацией.. правда особо не пользовался в связи с неудобством, но делал чейны с uad- а там задержка мама не горюй-и все компенсировалось...
 

SKlogic

Well-Known Member
14 Май 2006
3.126
1.208
113
46
Moscow
sergeykuptsov.com
@Michael
что я делаю не так на гифке? не хочет квантайз работать

@Michael @EUGEN27771

Ребят! а можно ли написать скрипт который просто копировал бы функционал родного окна квантайза но работал бы в главном окне а не в пиано ролле?
ИМХО было бы лучше иметь 2 отдельных скрипта для ауди и миди-а то в квантайз туле много приходится мышкой тикать-больно скорость теряется
на скринах то что надо. Готов оплатить работу!
 

Вложения

Последнее редактирование:
  • Like
Реакции: arkaine

lil-burn

Well-Known Member
15 Авг 2012
903
638
93
Екатеринбург
@EUGEN27771, верно ли что недостаточно знать номер char - надо еще знать какая была раскладка клавиатуры?
то есть если я в русской раскладке нажму ь то это будет char 252
но в турецкой раскладке 252 = ü
 

Alex Longard

Well-Known Member
10 Май 2015
1.941
1.232
113
36
München->Deutschland, Київ->Україна
Гуру Rea-скриптинга, Help!
Есть ли в апи функция с помощью которой можно подменять значения у параметров vst плагинов, например которые отображаются в params / show track envelope?
 

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.063
113
62
Киев
@Alex_028, при чём тут ParamName? Это только взять имя конкретного параметра.
Тебе нужно в любом случаи сказать скрипту какой параметр ты хочешь изменить. Либо по имени, либо по порядковому номеру.
Ну и в каком именно плагине это нужно сделать скрипт тоже должен знать и на каком треке.
По этому код скрипта по изменению какого-то параметра должен содержать как минимум номер трека (по номеру взять Медиа Трек), номер FX-а, номер параметра и его значение новое -
reaper.TrackFX_SetParam(track, fx, param, val);
 

Alex Longard

Well-Known Member
10 Май 2015
1.941
1.232
113
36
München->Deutschland, Київ->Україна
@Aleksandr Oleynik,
mt = reaper.GetTrack(0, 0)
a = reaper.TrackFX_GetNumParams(mt, 0)
retval, fn = reaper.TrackFX_GetParamName(mt, 0, 104, "")

Таким кодом я получаю значение параметра, fn получает цифры, хотя этот параметр отвечает за меню и должны передаваться строки как элементы меню.
Мне как раз нужно установить не параметр в определенное значение а подменить в нужном месте на строку.
например чтобы вместо 0.100 возвращаемого fn скрипт выводил в ui "sine".

Некоторые vst разработчики используют дебильные фреймворки для своих плагинов и неадекватно передаются в хост параметры со своими значениями. Если в окне FX рипера жмакнуть на кнопку ui то как раз будет видно как плагин передает свои параметры.

Функция TrackFX_SetParam устанавливает параметр в определенное значение без изменения его текстовой информации, там числовое значение все равно будет.
 

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.063
113
62
Киев
Не до конца понял что нужно, но похоже проблема формата передачи данных - тебе нужно из цифр сделать строку или наоборот из строки цифру - есть стандартные LUA фонкция tostring и tonumber
[DOUBLEPOST=1507737480][/DOUBLEPOST]
Функция TrackFX_SetParam устанавливает параметр в определенное значение без изменения его текстовой информации, там числовое значение все равно будет.
Так ....... всё-же давай о конкретных вещах говорить!
У тебя есть параметр который имеет значения в виде разных строк?
Тогда эти строки такими функциями передаются их номером.
А если в параметре нет строк которые ты хочешь чтоб там отобразились - то они там НИ КАК не отобразятся!
 

Alex Longard

Well-Known Member
10 Май 2015
1.941
1.232
113
36
München->Deutschland, Київ->Україна
@Aleksandr Oleynik, давайте я вам покажу через team viewer что я имею в виду, на уровне рипера подменить числа строкой можно, плагин передает значения параметров в своем формате а рипер преобразовывает, но мне непонятно как можно подменить то что плагин передает чтобы рипер показал мне информацию в удобном мне виде.
 

@Michael

Well-Known Member
14 Дек 2010
969
1.461
93
Орёл / Москва
@Aleksandr Oleynik, давайте я вам покажу через team viewer что я имею в виду, на уровне рипера подменить числа строкой можно, плагин передает значения параметров в своем формате а рипер преобразовывает, но мне непонятно как можно подменить то что плагин передает чтобы рипер показал мне информацию в удобном мне виде.
REAPER общается с плагинами только числовыми значениями [0...1]. То, что плагин выбрасывает в интерфейс, зависит только от производителя плагина. Указать параметр строкой можно только методом перебора:
PHP:
local scr_nm = 'MPL Set last touched parameter'
  for key in pairs(reaper) do _G[key]=reaper[key]  end
  -------------------------------------------------------
  function GetFormattedParamInternal(tr, fx, param, val)
    local param_n
    if val then TrackFX_SetParamNormalized( tr, fx, param, val ) end
    local _, buf = TrackFX_GetFormattedParamValue( tr , fx, param, '' )
    local param_str = buf:match('%-[%d%.]+') or buf:match('[%d%.]+')
    if param_str then param_n = tonumber(param_str) end
    return param_n
  end
  -------------------------------------------------------
  function BF(find , pow, tr, fx, param)
    if not tonumber(find) then return end
    local find =  tonumber(find)
    local BF_s, BF_e,closer_out_val = 0, 1
    local TS = os.clock()
    for step_pow = -1, pow, -1 do
      local last_param_n
      for val = BF_s, BF_e, 10^step_pow do
        if os.clock() - TS > 5 then MB('Brutforce timeout.\nOperation cancelled.', scr_nm, 0) return end
        local param_n = GetFormattedParamInternal(tr , fx, param, val)
        if not last_param_n and find <= param_n  then return val end
        if last_param_n and find > last_param_n and find <= param_n then
          BF_s = val - 10^step_pow
          BF_e = val
          closer_out_val = val
          break
        end
        last_param_n = param_n
      end
      if not closer_out_val then return 1 end
    end
    return closer_out_val
  end
  -------------------------------------------------------
  function GetStringTable(tr, fx, param, steps)
    local t = {}
    local last_str
    for val = 0, 1, 1/steps do
      TrackFX_SetParamNormalized( tr, fx, param, val )
      local str = ({TrackFX_GetFormattedParamValue( tr , fx, param, '' )})[2]
      if not last_str or last_str ~= str then t[#t+1] = {str = str, val=val} end
      last_str = str
    end
    return t
  end
  -------------------------------------------------------
  function main() local ReaperVal
    local retval, tracknum, fx, param = GetLastTouchedFX()
    if not retval then return end
    local tr = CSurf_TrackFromID( tracknum, false )
    local param_rpr_val = TrackFX_GetParamNormalized( tr, fx, param )
    local cur_param = GetFormattedParamInternal(tr , fx, param)
    local retval, find = reaper.GetUserInputs( scr_nm, 1, 'value', ({TrackFX_GetFormattedParamValue( tr , fx, param, '' )})[2] )
    if not retval then return end
    if cur_param then
      ReaperVal = BF(find, -14, tr, fx, param)
     else
      local t_val = GetStringTable(tr, fx, param, 127 )
      for i = 1, #t_val do
        if t_val[i].str:lower():find(find:lower()) then
          ReaperVal = t_val[i].val break end
      end
    end
    if not ReaperVal then ReaperVal = param_rpr_val end
    TrackFX_SetParamNormalized( tr, fx, param, ReaperVal )

  end
  ---------------------------------------------------------

  main()
 
  • Like
Реакции: lil-burn и Alex Longard

Alex Longard

Well-Known Member
10 Май 2015
1.941
1.232
113
36
München->Deutschland, Київ->Україна
@@Michael, спасибо, то что было нужно.
Я с устройством vst sdk хорошо знаком, но некоторые разработчики в последнее время стали использовать фреймворки типа Juce в которых параметры передают значения хосту в виде десятичных чисел от 0 до 100 или до 100.000, чаще всего это в модулярах.
 

elektrozz

Active Member
12 Авг 2009
532
210
43
Всем привед.
Народ, с чего начать для обучения написании скриптов? знаю что в основном нужно знать язык lua и reascript api, но для меня это все темный лес. Интерес есть, но ухватиться за нить никак не получается, в программирование полный 0
Собственно вопрос, с чего начать? Расскажите о своих начинаниях, откуда брали знания, источники если есть на документацию... lua документацию вроде нашел, но слышал что это совсем не то... Заранее благодарю.
 

lil-burn

Well-Known Member
15 Авг 2012
903
638
93
Екатеринбург
@elektrozz,
моих школьных знаний (учили паскаль) хватило, чтобы чтобы более-менее въехать в основные вещи.
Нужна практика, нужно составные задачи разбивать на мелкие, нужно терпение. Все:)
Вся инфа в интернете, рассказано практически обо всем.

Все, что нужно знать о луа для написания скриптов в рипере, это:
- переменные и их значения
- условия
- циклы
- функции
- таблицы
- строки

Функции
Функции - это ваши работники. Любая функция что-то делает. Либо информируют о чем-либо.
В любом скрипте должна быть хотя бы одна функция, иначе скрипт не имеет смысла.

Условия, циклы
В большинстве скриптов используются условия и циклы

Условия это то, что нужно делать скрипту в определенных оговоренных ситуациях.
пример условия - если выделен 1 или несколько айтемов, то смещаем выделенные айтемы на секунду вправо, иначе (если не выделено ни одного айтема - прерываем работу скрипта).

Циклы нужны, если
1) нужно что-то сделать несколько раз (напр, добавить 10 новых треков)
2) нужно что-то сделать для нескольких объектов (например удалить все выделенные айтемы или переименовать первые 10 треков).

Переменные и таблицы нужны для хранения значений и последующей работы с ними.
По-простому, переменные и таблицы - это коробки, в которых лежат предметы.
Переменная - это коробка, которая вмещает только один предмет (его называют значением переменной).

В коробки-переменные мы можем что-то класть (присваивать переменной значение), работать с предметом в коробке, выбрасывать коробку вместе с предметом, если они больше не нужны (удалять значение переменной) и тд.

Таблица - это коробка, которая вмещает бесконечно много предметов (их называют элементами таблицы)

В коробки-таблицы мы можем что-то класть (добавлять элемент в таблицу), работать с определенными предметами в коробке, выбрасывать предметы из коробки (удалять этементы) или всю коробку и тд.

Работа со строками нужна, когда имеем дело с текстом (найти в тексте слово, вывести на экран определенный текст и тд). Тут часто будут нужны функции sub(), gsub(), match(), gmatch() и регулярные выражения.

По сути это все основные темы, с которыми имеют дело при написании lua-скриптов на рипере

PS: по тимвьюверу провожу консультации по написанию скриптов в рипере (небесплатные). Хорошо, если будут конкретные вопросы например, как работать с таблицами типа ключ-значение и тд.
 

elektrozz

Active Member
12 Авг 2009
532
210
43
@lil-burn, огромное спасибо, получается изучив базовые вещи lua, и можно идти в api рипера. ясно :)
 
Последнее редактирование:

Alex Longard

Well-Known Member
10 Май 2015
1.941
1.232
113
36
München->Deutschland, Київ->Україна
@elektrozz,
Программирование на языке Lua
Роберту Иерузалимски
После книги, или даже после первых трех глав - апи
reascript.
Ну и само собой разумеется знакомится с чужими наработками чтобы вникнуть в используемые алгоритмы и чтобы неплодить велосипеды.

PS: встречал статью, название запомнилось: Lua за 60 минут
гугл в помощь!
 
  • Like
Реакции: elektrozz

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