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

@incubator,
Перебирайте чужие скрипты(выдергивайте какую нибудь функцию и разбирайтесь как она сделана-устроена),
Изучайте функции API и понимание потихоньку начнет приходить .
Задавайте вопросы! Слава богу есть хоть здесь Знающие, Отзывчивые люди-которые отвечают на них (подсказывают что да как)
Главное не бросить на первой неудачной попытке,а такой момент у вас еще настанет(и не раз) !!!
 
Последнее редактирование:
@Archchie, Да так именно и делую копаю самые интересные скрипты разбираю по кусокам модифицирую перпарирую, дело очень интересное.Потому что описание API очень скудное и все способом проб и ошибок приходиться делать. И главное у меня много идей прикладных которые хочу осуществить, так что пока не собираюсь бросать) Спасибо вам и Александру за ответы)
 
  • Like
Реакции: Archie's
Не могу найти функции в API, Скрыть или удалить Envvelope Track .
Подскажите пожалуйста !
Есть ли они вообще ?
 
Удалить нет и быть не может, а скрыть конечно есть - ищи в Set Envelope - и там чего то с атрибутами
 
@Archchie, Не эта случайно? reaper.SetEnvelopeStateChunk Sets the RPPXML state of an envelope, returns true if successful. Undo flag is a performance/caching hint.
 
@incubator, спасибо за скрипт! Очень удобно работать с ним :) Но мне пришлось доработать его немного. У команды _XENAKIOS_TSADEL есть одна проблема - пока висит выделение области в аранж вью, он иногда не позволяет удалять айтемы. А вот если выделение снять, то всё работает как надо. Иногда это мешает и дизориентирует (почему жму del а айтем не удаляется?), приходится делать лишний клик, чтобы снять выделение области.
Я попробовал разные варианты и здесь отлично сработала команда cut (41384). Да, я понимаю, что буфер будет засираться, но я не представляю ситуации, когда мне после команды Del нужно будет нажимать Ctrl+V :) По крайней мере, пока дающий сбои Delete доставляет проблем больше, чем возможные глюки в буфере.
Возможно, найдётся более элегантное решение, но пока так оставил. Всё в доработанном коде от Александра выглядит вот так:


Код:
isSet = reaper.GetSet_LoopTimeRange( 0, 0, 0, 0, 0 ) --  Берём переменную "Time selection"
focus = reaper.GetCursorContext() --  Берём переменную значения где сейчас фокус?

if isSet == 0 then
  reaper.Main_OnCommand(40697, 0)
else
  if focus == 1 then
    reaper.Main_OnCommand(reaper.NamedCommandLookup('41384'), 0)
  elseif focus == 2 then

    reaper.Main_OnCommand(40089, 0)

  end
end
 
  • Like
Реакции: incubator
@Kokarev Maxim,
Спасибо за отзыв) Я то делал под свою кофигурацию а у меня Time selection не может существовать отдельно от выделеного айтема.Под Аблетон конфиг и поэтому я даже не мог предположить такое неудобство) Ну если так удобно пусть будет так. Есть идея перемещаться вдаль проекта и копировать или вырезать пустоту потому что другого способа и каких то подходящих команд я не нашел.Могу предположить что стирание больших объемов данных может проходить медленнее.
Ну вот и ты Максим начал дорабатывать и оптимизировать скрипты.Это первый шаг к программированию.Главное не увлекайся ЭТО ЗАТЯГИВАЕТ, я начал с "Delete" а теперь читаю уже записываю *.ini рипера через скрипты.А завтра что?От меня музыки ждут я тут IF ELSEы местами пререставляю Рипер зло!!!
 
  • Like
Реакции: Kokarev Maxim
Я опять с вопросом который не смог решить сам! Пытался воссоздать код spk77 который в eel только в Lua что бы курсор перемещался на начало нот или аккордов Вот что вышло с горем пополам.
Код:
function Msg(param)
reaper.ShowConsoleMsg(tostring(param).."\n")
end

function move_to_next_note()
  local take = reaper.MIDIEditor_GetTake(reaper.MIDIEditor_GetActive())  ---Берем активный миди редактор
  if take == nil then
    return
  end
  local retval, notecntOut, ccevtcntOut, textsyxevtcntOut = reaper.MIDI_CountEvts(take)--- считаем ноты
  local curpos = reaper.GetCursorPosition()  ---- Берем позицию курсора
  for i = 1, notecntOut do --- Запускаем цикл
    local retval, selectedOut, mutedOut, startppqposOut, endppqposOut, chanOut, pitchOut, velOut = reaper.MIDI_GetNote(take,i-1) ---Следующая нота
    local note_position = reaper.MIDI_GetProjTimeFromPPQPos(take, startppqposOut) --- конвертим в значение
    if note_position > curpos then
      reaper.SetEditCurPos(note_position, 1, 1)   ----Ставим курсор на следующую ноту
      break
    end
  end
end

reaper.defer(move_to_next_note) -- заглушка
Но вот как заставить код считать с конца? То есть если курсор стоит в конце миди партии и нужно двигаться набоборот к началу?
 
Александр, подскажите пожалуйста. Никак у меня не получается воспроизвести посредством lua-скрипта экшн (Track: Toggle track volume envelope visible).
Хочу попытаться показать\скрыть все стандартные энвелопы для трека: volume, pan, width, volume (Pre-FX), pan (Pre-FX), width (Pre-FX), trim volume, mute.
Попробовал вот так, для выбранного трека:
Код:
if reaper.CountSelectedTracks() > 0 then
for i = 0, reaper.CountSelectedTracks(0)-1 do
   local tr = reaper.GetSelectedTrack(0,i)
   if tr then
     local env_count = reaper.CountTrackEnvelopes(tr)
     for z = 0, env_count-1 do  
       local tr_env = reaper.GetTrackEnvelope(tr,z)
       if tr_env then
        local br_env = reaper.BR_EnvAlloc(tr_env, false)
        local active, visible, armed, inLane, laneHeight, defaultShape, minValue, maxValue, centerValue, type, faderScaling = reaper.BR_EnvGetProperties(br_env, true, true, true, true, 0, 0, 0, 0, 0, 0, true)
        if visible == false then
         reaper.BR_EnvSetProperties(br_env, active, true, armed, inLane, laneHeight, defaultShape, faderScaling)
        end
        reaper.BR_EnvFree( br_env, true )           
       end
     end
   end
end
end
но когда трек только добавлен (новый), ничего не показывается. Я так подозреваю, что в данном случае
CountTrackEnvelopes = 0. Тогда как заставить их показаться принудительно?
 
но когда трек только добавлен (новый), ничего не показывается. Я так подозреваю, что в данном случае
CountTrackEnvelopes = 0. Тогда как заставить их показаться принудительно?
Брать Кривую по имени и показывать её.
Вот только если на кривой нет ни одной точки - и она вами принудительно не активирована - вы её и не покажите не как, так как она будет NIL
 
Последнее редактирование:
Вот только если на кривой нет ни одной точки - и она вами принудительно не активирована - вы её и не покажите не как, так как она будет NIL
Понятно, то есть если не активирована скриптом не показать. Тогда получается экшн (Track: Toggle track volume envelope visible) на уровне кода программы работает, так?
 
@Chrigel, честно говоря я не сильно копался. Как-то наверняка и скриптом можно это сделать. Будет время - покопаюсь.
Но можно и по простому - использовать эти вот Экшины - по сути это програмный код.
 
Последнее редактирование:
Упоминалось в этой теме про стандартные элементы Gui, контейнеры и прочее.
Плюс к этому, в какой-то момент стало неудобно делать некоторые вещи на "одном слое".
Короче, пришлось проанализировать ситуацию. Завис на месяц, даже больше.
Почти все варианты, которые я просмотрел основаны на событийной модели.
События, Обработчики Событий. Иерархия.
Я просмотрел довольно много, разные реализации, разные языки.
Какие выводы? НЕ УПРОЩАЕТ, А УСЛОЖНЯЕТ СИТУАЦИЮ - для нашего случая - это главное.
Почему усложняет? Детальнее - порядок и параметры отрисовки, порядок обработки событий - все требует иерархии.
Короче, вот окончательный общий вывод.
Универсальный подход невозможен - как ни крути. Одноразовый подход непродуктивен - бесполезная работа.
С ОДНОЙ СТОРОНЫ - Попытки сделать Элемент максимально настраиваемым приводят к тому, что появляется множество дополнительных свойств и методов.
1)Усложняется код и теряется удобство использования.
2)При этом - большая часть свойств и методов использоваться НЕ БУДЕТ. То есть - практически это мертвый груз, плюс ущерб простоте!
3)НА ПРАКТИКЕ всплывает главный недостаток - проще написать новый Элемент с набором свойств и методов под конкретную задачу.
С ДРУГОЙ СТОРОНЫ - Писать с нуля под конкретную задачу - непродуктивно.
1)В большинстве случаев используются стандартные Элементы, плюс/минус некоторые модификации.
2)Многие ф-и, решения, механизмы работы и прочее продуманы, проверены на практике и вполне универсальны.
В качестве примеров, в которых иерархия не реализована, но есть попытки, я смотрел несколько библиотек для Рипера конкретно.
Кто ими воспользовался? Я не вижу...
Я вижу Swipe, где автор сделал все достаточно просто. И этот же автор попытался сделать иерархию, и забросил в итоге, а он профи.
=========
Забыл один момент. AU, VST фреймворки туда же. И этот Лемур посмотрел в последнюю очередь. Там нет нормальной Иерархии - парент для координат - без толку.
=========
"Обработчики" у меня были в первейших версиях, в Lua все проще - за пять сек сделать
таблицу с обработчиками по порядку, коллекцию.
Я забыл, что все тесты на EEL, так нужно, но это не меняет ситуацию.
Ладно, за этот период я получил так много инфы, что мозг не успевает
 
Последнее редактирование:
  • Like
Реакции: Aleksandr Oleynik
И тем ни менее - например я был бы очень доволен, если бы появились стандартные модули (внешние) -
Фейдер, кнопка, кноб, чекбокс - хотя бы с атрибутам подобных элементов в Лемуре.
 
@Aleksandr Oleynik, я именно это и хочу реализовать, это же моя старая навязчивая идея, к которой время от времени возвращаюсь;) Конечно, гораздо проще, даже чем в Лемур, но именно в виде конструктора-редактора, по принципу - добавил-расставил-настроил элементы и сохранил в виде готового GUI, который можно будет настраивать дальше по визуальной части и можно будет с легкостью привязать к функциональной части.
Я даже делал рабочие варианты и на EEL, и на Lua, правда на уровне ниже детского сада, но сама задумка давно проверена и все прекрасно работает-настраивается-сохраняется-пересохраняется
Нет абсолютно никаких причин, мешающих довести все это хотя бы до минимально вменяемого варианта.
Если бы только Lua и только скрипты - что-то приемлемое сделал бы давно, там проще.
Но тогда теряются не только EEL скрипты, которые иногда просто необходимы, а еще и JS-плагины.
А у меня есть очень забавная штука по JS, правда в зачаточном состоянии, вроде бы я Вам показывал частично, точно не помню.
К JSFX подключается модуль, который парсит данные родных JS-слайдеров и дублирует их кастомными с идентичными параметрами - idx, defval, minval, maxval, label. Короче, технически - JS просто читает сам себя как текст;), читает свои же слайдеры, а на основе этих данных создает и запускает код для GUI.
Сам JS при этом продолжает функционировать в обычном режиме.
В качестве пространств имен("объектов") используются сами названия слайдеров slider1 - slider64 - прямо туда и складируются все необходимые свойства, например, получается что-то типа slider1.x, slider1.y, slider1.w, slider1.h и тп. Это еще и пару вещей упрощает.
Обходим невозможность динамического создания переменных в JS, имена слайдеров всегда известны, доступны и свободны(никто ж до такого изврата не додумался:)).
Полученные кастомные слайдеры в перспективе можно редактировать, менять на другие элементы, например, на кнобы, кнопки, меню, использовать png-картинки и т.п. Созданный GUI никак не влияет на исходный функционал JS-плагина, не влияет на производительность. При этом кастомные элементы поддерживают все функции и параметры родных слайдеров и автоматизацию(я смотрю, многие авторы jsfx почему-то на автоматизацию забивают).
Проверен сам механизм. Конечно, можно сделать все эти манипуляции и со стороны скрипта вычитав эффект, можно даже Lua использовать, надо прикинуть.
Все очень просто, но идея, мне кажется, интересная.
 
@EUGEN27771, так в любом же случаи модули будешь делать...., так начни с них - многие с удовольствием и просто модули будут использовать
 
Вы думаете, я забросил идею, когда последнее сообщение написал и начал делать? Не ... я начал делать все наоборот.
В первую очередь нужно было убрать разницу между EEL и Lua. Основной момент - это динамические переменные.
На самом деле, никаких динамических переменных не существует, конечно. По-любому операции с памятью malloc(), realloc(), free()
В EEL нам просто резервируют кусок памяти, который можно использовать как один большой массив. Это неудобно, но быстро.
Получается, что у нас нет даже элементарных возможностей. Но на деле все решается - можно рассматривать выделенную память иначе!
И уже к ней применять malloc(), realloc(), free() и тп. Короче, нужен был менеджер памяти.
1) я получил массивы. Настоящие массивы, память выделяется автоматически, не нужно думать о перекрытиях и тп.
2) динамические массивы, благодаря realloc().
3) ассоциативные массивы - немного информации по хешированию и в итоге, аналог таблиц.
Самое важное - в статических и динамических массивах не теряется ни капли скорости доступа, это чистейший джекпот!
 
В общем в LUA мы тебя больше не увидим?
Тебе осталось научить EEL и LUA загружать модули друг друга - и тогда полный сатисфэкшин - то что нужно быстро - модуль в EEL, а то что функционально - в LUA.
 
В общем в LUA мы тебя больше не увидим?
Почему же, каждому свое.
================
Тест - кручу массив, пишу значения в таблицу. Потом читаю из таблицы и сравниваю с массивом.
Вот что происходит в памяти
Memory1.gif
 
Последнее редактирование:
Это хеширование и прямая адрессация. Метод цепочек тоже не проблема.
Я чувствую, что это очень круто. Шутка
 
  • Like
Реакции: Aleksandr Oleynik
Ребята, есть ли возможность (при поможи какой-то функции) как-то остановить или выйти из defer()?
 
@Aleksandr Oleynik, можете пожалуйста пример кода показать? я не понимаю по какой команде он завершается....

Методом тыка пока дошел до такого, но пока рано не все гладко:
У меня есть графический интерфейс - СКРИПТ, который reaper.defer(СКРИПТ) крутит по кругу и по нажатию на ESC запускается gfx.quit() и reaper.atexit(СКРИПТ)... Окно закрывается. но скрипт продолжает выполнятся...
 
Подскажите есть ли возможность заставить defer() работать медленнее ?
Например: Отработал defer один цикл ,подождал 1 или 2 сек. пошёл на второй круг и т.д.
Ну и не только дефер
Есть ли в API что то типа экшена Action: Wait 1 second before next action так как экшен в скрипте не работает
 
Последнее редактирование:

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