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

  • Автор темы Автор темы drzhnn
  • Дата начала Дата начала

drzhnn

Versia Nova
10 Апр 2014
24
36
13
Санкт-Петербург
drzhnn.com
MOD.
Важно!
http://rmmedia.ru/threads/119732/
---------------------------------------------


Есть ли на форуме ещё кто-нибудь, кто пишет или хочет научиться писать свои скрипты для Рипера?

В поиске ничего дельного не нашёл. Закреплённой темы по скриптам тоже нет — что странно.

На всякий случай: ReaScripts — это пользовательские скрипты на языках Python и EEL. В отличии от Custom и Cycle Actions, с помощью таких скриптов можно управлять процессами, для которых в Рипере не предусмотрено специальных команд: запускать любые внешние приложения с любыми параметрами, взаимодействовать с операционной системой, производить сложные манипуляции с автоматизацией, айтемами, нотами и их параметрами... В общем, интересные вещи можно этими скриптами делать, если есть желание и фантазия.

Предлагаю в этой теме задавать вопросы, имеющие отношение к ReaScript, Python и EEL, а так же делиться идеями и наработками в данной области.
 
Только пару дней назад начал учить Python. Я конченый гуманитарий, поэтому можно сказать, что начинаю с нуля. Насколько понимаю, всё опирается на базовое знание программирования и ничего специфического в самом ReaScript нет. У Рипера есть свой API (меню > Help > ReaScript documentation), с помощью которого происходит всё общение. В остальном там чистый Python, поэтому дефицита с обучающими материалами нет. Сейчас смотрю вводный курс по Python для сотрудников Гугла от самого Гугла, читаю официальную документацию и рекомендации. В принципе, за пару дней уже разобрался как писать простенькие скрипты. Думаю уйдёт некоторое время на то, чтобы освоиться.
 
Ок. Вот мой первый скрипт:

PHP:
# Python 3.4.0

from reaper_python import *
import os

path, filename = os.path.split(RPR_EnumProjects(-1, '', 256)[2])

backupfolder = path + '\\Backup'
src = path + '\\*.rpp-bak'
dst = path + '\\Backup'
backupcmd = 'move' + ' ' + src + ' ' + dst

if not os.path.exists(backupfolder):
  os.makedirs(backupfolder)

os.system(backupcmd)

Скрипт определяет папку текущего проекта, создаёт в ней подпапку Backup и перемещает в неё все .rpp-bak файлы из корня.
Скорее всего не будет работать в Mac OS. Если кто-то проверит — отпишитесь.
 
Тема лично мне интересная, но как написал Володя - документации почти ноль.
Как-то пытался написать скрипт для настраиваемого (хотябы по времени) фэйда между двумя каналами звука - кончилось всё банальным по строчным приростом громкости на одном канали и симметричным падением на другом....., такой себе дискретничек.... - практически не реальный в настройке.
В первую очередь конечно интересуют вещи, которых нет в экшинах и командах консоли.
 
Если честно, то для Гуманитария вопрос звучит угоржающе :)

А можно при помощи Скриптов вывести по OSC на внешнее устройство текст?
 
Я только начал учиться программировать и пока очень поверхностно разбираюсь в вопросе, поэтому спрашиваю совершенно серьезно: какая документация ещё нужна, скажем, вам или Володе, кроме Reascript API и учебника по Питону?

Про вывод текста по OSC - понятия не имею. Но в моём нубском представлении эта возможность как-то связана с родной функцией Рипера RPR_OscLocalMessageToHost() и какой-нибудь специализированной внешней библиотекой, типа SimpleOSC, в которой есть функция osc.sendMsg().
 
надыбал на оффоруме EEL скриптец для "искривления" Velocity и MIDI CC

midi%20velocity%20tool6.gif
 

Вложения

скажите пожалуйста нубу в этом деле:
1) Названия параметров рипера, которыми оперирует скрипт (допустим, позиция event'а в пиано ролле, его велосити, темп проекта, выбранный шаг привязки к сетке и прочее) - их откуда брать? В API рипера по скриптам всё есть?
2) Скрипты на питоне и на EEL. По питону примерно ясно, по нему руководств и книг в сети много. А EEL, по этому языку есть какие нибудь руководства и прочее?
И что-то видел упоминание, что в JSFX тот же EEL используется, это так?
 
fruitcore, всё зависит от того какие параметры и какими способами ты пытаешься получить/изменить.

Можно использовать только официальный API Рипера, но сложные функции придётся писать самому. Если установлены SWS Extensions, то можно дополнительно использовать возможности их API.

При импорте модулей в скрипт строчками типа from reaper_python import * или from sws_python import * мы просто импортируем в скрипт функции, которые содержатся во внешних файлах reaper_python.py и sws_python.py в папке Рипера (c:\Program Files\REAPER (x64)\Plugins\). Можно открыть эти файлы в редакторе и посмотреть как работают те или иные функции и на их основе попробовать написать новые. Так же скрипты могут обращаться к REAPER Extension API.

Например, функция для вывода сообщения в консоль Рипера доступна в официальном API и выглядит так:

RPR_ShowConsoleMsg(String msg)

Мы можем упростить эту функцию и написать свою, например:

2014-05-30_18-26-22.png

Или мы можем использовать её в составе более сложной функции, которую напишем сами.

Но если мы посмотрим в reaper_python.py как устроена сама функция RPR_ShowConsoleMsg, то увидим следующее:

2014-05-30_18-25-15.png

Тут уже используется функционал внутренней библиотеки питона - ctypes, (она импортирована в начале reaper_python.py строчкой from ctypes import *), которая предназначена для обращения к внешним программам и библиотекам, написанным на C.
 
  • Like
Реакции: fruitcore
В данный момент изучаю lua. Открыл по этому поводу тред: http://forum.cockos.com/showthread.php?t=158473
Скриптописание на деле штука достаточно увлекательная, но требует увлечённости и терпения)) Не сказал бы, что это гиперсложно, просто пока нет документации и мануалов, связанных непосредственно с рипером. То есть максимально ужатой информации для начинающих, релеватной к риперу (вызов функции, логика их работы, синтаксис, лупы, создание интерфейса и прочие базовые вещи).
[DOUBLEPOST=1429453136,1428593525][/DOUBLEPOST]Тоже поделюсь небольшими наработками)
Показывает VSTi для трека под курсором. Или FX Browser, если инструментов в цепи нет.
(EEL, нужна бета SWS 2.6.3)
PHP:
// mpl_show_vsti_on_track_under_mouse_cursor
function main() local(tr, vsti_id)
(
extension_api("BR_GetMouseCursorContext", #window, #segment, #details, 50);
tr = extension_api("BR_GetMouseCursorContext_Track");
tr ? ( // Get the index of the first track FX insert that is a virtual instrument, or -1 if none
vsti_id = TrackFX_GetInstrument(tr);
vsti_id > -1 ? ( TrackFX_Show(tr, vsti_id, 3);
Main_OnCommand(NamedCommandLookup("_S&M_WNMAIN"), 0); // set focus back to main window
); // end if vsti exists
vsti_id == -1 ? ( Main_OnCommandEx(40271, 0, 0); // show fx browser
); // end if vsti not exists
); // end if track under mouse 
); // end main
main();
 
Последнее редактирование:
простенький EEL (мой первый :), с помощью которого можно задать время начала и конца айтема в ручную.
PHP:
function dialog()
(
  #dialog_ret_vals = "0,0,0,0"; //default values for Input1 and Input2
  GetUserInputs("Resize Clip", 4, "Start Min:,Start Sec:,End Min:,End Sec:,", #dialog_ret_vals);
);

//--------INIT


dialog() ? (
    // convert #dialog_ret_vals (comma separated values) to int and store to "input1_val" and "input2_val"
    match("%d,%d,%d,%d", #dialog_ret_vals, min1, sec1,min2,sec2);

  );

item = GetSelectedMediaItem(0, 0);
take = GetActiveTake(item);

time1=min1*60+sec1;
time2=min2*60+sec2-time1;

SetMediaItemTakeInfo_Value(take, "D_STARTOFFS", time1);
SetMediaItemInfo_Value(GetSelectedMediaItem(0,0), "D_LENGTH", time2);
 
Чего-то я себя идиотом почувствовал...Как эти скрипты писать,совершенно не пойму с чего начать?
 
  • Like
Реакции: кактус
@Slick,спасибо,буду тоже смотреть.
[DOUBLEPOST=1430165803,1430064820][/DOUBLEPOST]Подскажите,как получить это значение,и что это вообще означает
Снимок.PNG

Я здесь застрял.
[DOUBLEPOST=1430215330][/DOUBLEPOST]Section_Id оказались такие-main=0,main(alt)=100,midi editor=32060,midi evlist=32061.
Очень простой скрипт-открывает миди-редактор и в нем сразу же меню quantize из главного окна.
eel.
Код:
function do_actions_from_main_and_midi_sections()
(
   Main_OnCommand(40153, 0); // MAIN section action 40153: "open selected item in MIDI editor"
   active_MIDI_editor = MIDIEditor_GetActive(); //get MIDI editor ID

   MIDIEditor_OnCommand(active_MIDI_editor, 40003); // ME action: "Sel all Notes"
   state = GetToggleCommandStateEx(32060,40009); //Quantize State
   state == 0 ? MIDIEditor_OnCommand(active_MIDI_editor, 40009); // ME action: "Quantize"



);

do_actions_from_main_and_midi_sections();
Подобным образом можно выполнять некоторые действия в миди-редакторе(как бы не открывая его,если в конце добавить close MIDI editor) из главного окна,чего мне,например,всегда не хватало.
Вот еще скрипт,изменяет входной миди-канал трека и все миди-сообщения на 10-й канал,из главного окна.
 

Вложения

Последнее редактирование:
  • Like
Реакции: Archie's, lil-burn и Slick
Коллеги, а есть где-то описание того, что можно делать с помошью этого языка?
Ну скажем, можно управлять параметрами плагинов, вызывать пресеты, отправлять локальные и глобальные OSC и MIDI команды?
Я так понимаю, что с его помощью, как минимум можно совмещать выполнение Action из разных Секций? Не?
 
Последнее редактирование:
  • Like
Реакции: Gavruseff
Я наверное не знаю как и куда смотреть :(
Ткните носом.
Скрипт поддерживает прямой доступ к параметрам плагинов сторонних?
Может кто-то, кто больше разобрался, сделать простенький скрипт с изменением параметра любого в любом плагине?
 
Скрипт поддерживает прямой доступ к параметрам плагинов сторонних?
да, работает и с vst
нашлось на форуме кокоса:
Код:
tr = RPR_GetSelectedTrack(0,0)
RPR_TrackFX_SetParam(tr, 0, 2, 1)
применяется к выделенному треку, числа после tr - номер плагина в инсерте, номер параметра, значение параметра.
 
Последнее редактирование:
я уже вижу массу возможностей,недоступных из экшенов и цикл-экшенов и реализуемых быстрее,проще и надежнее.
Так раздел для этого и создавали - давайте на ощупь, но вместе.

Честно говоря - без документации - полные потёмки и метод научного тыка.
 
Последнее редактирование:
@Nagor, http://sws.mj-s.com/download/pre-release/
на счет проблем не знаю,стоит себе,работает
Проблемы могут быть. Связанны они могут быть с теми функциями взаимодействия надстройки с Рипером, которые в бэтке не допиляны.
У меня стоит два Рипера - один с релизом SWS, а второй с бэткой.
[DOUBLEPOST=1430468066,1430467965][/DOUBLEPOST]
Дело в том,что тем,кто знаком с программированием документация,видимо,и не нужна(типа,и так все ясно).Везде отсылки на С/С++.А нам приходится наугад разбираться.
Ну не знаю....
Разве в Си можно найти спец функции описывающие взаимодействие с Рипером?
Стандартные выражения - понятно, но у меня проблемы в первую очередь с корретным обращением к нужному месту в Рипере.
Получается как та Лиса и виноград - понимаю, что с EEL теперь имеем доступ буквально ко всему, а сделать почти ничего не можем.
Я вчера три часа методом втыка пытался при помощи EEL обратиться к параметру плагина стоящему первым на выделенном треке - ни фига.
 

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