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

Тема в разделе "Reaper", создана пользователем drzhnn, 21 апр 2014.

  1. drzhnn

    drzhnn Versia Nova

    Регистрация:
    10 апр 2014
    Сообщения:
    24
    Симпатии:
    36
    Адрес:
    Санкт-Петербург
    MOD.
    Важно!
    http://rmmedia.ru/threads/119732/
    ---------------------------------------------


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

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

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

    Предлагаю в этой теме задавать вопросы, имеющие отношение к ReaScript, Python и EEL, а так же делиться идеями и наработками в данной области.
     
    кактус, Furqat и fakeitback нравится это.
  2. belovw

    belovw Well-Known Member

    Регистрация:
    22 апр 2009
    Сообщения:
    5.211
    Симпатии:
    3.424
    Род занятий:
    Звукорежиссура
    Адрес:
    RK Almaty
    Инфа по теме на офсайте скудна. Есть что покурить?
     
  3. drzhnn

    drzhnn Versia Nova

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

    drzhnn Versia Nova

    Регистрация:
    10 апр 2014
    Сообщения:
    24
    Симпатии:
    36
    Адрес:
    Санкт-Петербург
    Ок. Вот мой первый скрипт:

    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. Если кто-то проверит — отпишитесь.
     
  5. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    16.914
    Симпатии:
    9.168
    Пол:
    Мужской
    Адрес:
    Киев
    Тема лично мне интересная, но как написал Володя - документации почти ноль.
    Как-то пытался написать скрипт для настраиваемого (хотябы по времени) фэйда между двумя каналами звука - кончилось всё банальным по строчным приростом громкости на одном канали и симметричным падением на другом....., такой себе дискретничек.... - практически не реальный в настройке.
    В первую очередь конечно интересуют вещи, которых нет в экшинах и командах консоли.
     
  6. drzhnn

    drzhnn Versia Nova

    Регистрация:
    10 апр 2014
    Сообщения:
    24
    Симпатии:
    36
    Адрес:
    Санкт-Петербург
    А что ещё из документации нужно, кроме API?
     
  7. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    16.914
    Симпатии:
    9.168
    Пол:
    Мужской
    Адрес:
    Киев
    Если честно, то для Гуманитария вопрос звучит угоржающе :)

    А можно при помощи Скриптов вывести по OSC на внешнее устройство текст?
     
  8. drzhnn

    drzhnn Versia Nova

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

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

    axis Well-Known Member

    Регистрация:
    18 апр 2005
    Сообщения:
    4.662
    Симпатии:
    3.151
    Пол:
    Мужской
    Род занятий:
    freelance
    Адрес:
    Kaniv, UA
    надыбал на оффоруме EEL скриптец для "искривления" Velocity и MIDI CC

    [​IMG]
     

    Вложения:

    Buyan, Nady, kartalex и 3 другим нравится это.
  10. fruitcore

    fruitcore Active Member

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

    drzhnn Versia Nova

    Регистрация:
    10 апр 2014
    Сообщения:
    24
    Симпатии:
    36
    Адрес:
    Санкт-Петербург
    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.
     
    fruitcore нравится это.
  12. Slick

    Slick IDDQD

    Регистрация:
    13 май 2008
    Сообщения:
    1.945
    Симпатии:
    859
    Род занятий:
    Аранжировщик, Саунд Дизайнер
    Адрес:
    Москва, Апрелевка
    кто нибудь программирует на LUA или EEL на Рипере? с инфой очень скудно в инете (
     
    nounaim нравится это.
  13. belovw

    belovw Well-Known Member

    Регистрация:
    22 апр 2009
    Сообщения:
    5.211
    Симпатии:
    3.424
    Род занятий:
    Звукорежиссура
    Адрес:
    RK Almaty
    Вчера буквально набрёл на сайт http://lua.ru/
    Еще не разбирался.
     
    Slick нравится это.
  14. @Michael

    @Michael Well-Known Member

    Регистрация:
    14 дек 2010
    Сообщения:
    840
    Симпатии:
    1.266
    Пол:
    Мужской
    Адрес:
    Орёл / Москва
    В данный момент изучаю lua. Открыл по этому поводу тред: http://forum.cockos.com/showthread.php?t=158473
    Скриптописание на деле штука достаточно увлекательная, но требует увлечённости и терпения)) Не сказал бы, что это гиперсложно, просто пока нет документации и мануалов, связанных непосредственно с рипером. То есть максимально ужатой информации для начинающих, релеватной к риперу (вызов функции, логика их работы, синтаксис, лупы, создание интерфейса и прочие базовые вещи).
    --- добавлено 19 апр 2015, дата сообщения: 9 апр 2015 ---
    Тоже поделюсь небольшими наработками)
    Показывает VSTi для трека под курсором. Или FX Browser, если инструментов в цепи нет.
    (EEL, нужна бета SWS 2.6.3)
    PHP:
    // mpl_show_vsti_on_track_under_mouse_cursor
    function main() local(trvsti_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 > -? ( TrackFX_Show(trvsti_id3);
    Main_OnCommand(NamedCommandLookup("_S&M_WNMAIN"), 0); // set focus back to main window
    ); // end if vsti exists
    vsti_id == -? ( Main_OnCommandEx(4027100); // show fx browser
    ); // end if vsti not exists
    ); // end if track under mouse 
    ); // end main
    main();
     
    Последнее редактирование: 19 апр 2015
    axis, belovw, Nagor и ещё 1-му нравится это.
  15. nounaim

    nounaim Active Member

    Регистрация:
    29 авг 2010
    Сообщения:
    215
    Симпатии:
    47
    Скрипт проверяет состояние трека папки(открыта-закрыта), сворачивает/разворачивает папку, может пригодиться кому:
     

    Вложения:

    lil-burn, EUGEN27771 и Nagor нравится это.
  16. Slick

    Slick IDDQD

    Регистрация:
    13 май 2008
    Сообщения:
    1.945
    Симпатии:
    859
    Род занятий:
    Аранжировщик, Саунд Дизайнер
    Адрес:
    Москва, Апрелевка
    простенький 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(00);
    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);

     
    Beckoff, Furqat, nounaim и ещё 1-му нравится это.
  17. nounaim

    nounaim Active Member

    Регистрация:
    29 авг 2010
    Сообщения:
    215
    Симпатии:
    47
    Как вы вставляете код в форум?
     
  18. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    16.914
    Симпатии:
    9.168
    Пол:
    Мужской
    Адрес:
    Киев
    [​IMG]
     
    nounaim нравится это.
  19. EUGEN27771

    EUGEN27771 Well-Known Member

    Регистрация:
    23 апр 2010
    Сообщения:
    2.321
    Симпатии:
    1.963
    Пол:
    Мужской
    Чего-то я себя идиотом почувствовал...Как эти скрипты писать,совершенно не пойму с чего начать?
     
    кактус нравится это.
  20. Slick

    Slick IDDQD

    Регистрация:
    13 май 2008
    Сообщения:
    1.945
    Симпатии:
    859
    Род занятий:
    Аранжировщик, Саунд Дизайнер
    Адрес:
    Москва, Апрелевка
    @EUGEN27771, я начал с того, что анализировал чужие. на офф форуме в разделе JS. правда далеко пока не ушел )))
     
    Archchie, Aleksandr Oleynik и EUGEN27771 нравится это.
  21. EUGEN27771

    EUGEN27771 Well-Known Member

    Регистрация:
    23 апр 2010
    Сообщения:
    2.321
    Симпатии:
    1.963
    Пол:
    Мужской
    @Slick,спасибо,буду тоже смотреть.
    --- добавлено 27 апр 2015, дата сообщения: 26 апр 2015 ---
    Подскажите,как получить это значение,и что это вообще означает
    Снимок.PNG
    Я здесь застрял.
    --- добавлено 28 апр 2015 ---
    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-й канал,из главного окна.
     

    Вложения:

    Последнее редактирование: 28 апр 2015
    Archchie, lil-burn и Slick нравится это.
  22. belovw

    belovw Well-Known Member

    Регистрация:
    22 апр 2009
    Сообщения:
    5.211
    Симпатии:
    3.424
    Род занятий:
    Звукорежиссура
    Адрес:
    RK Almaty
  23. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    16.914
    Симпатии:
    9.168
    Пол:
    Мужской
    Адрес:
    Киев
    Коллеги, а есть где-то описание того, что можно делать с помошью этого языка?
    Ну скажем, можно управлять параметрами плагинов, вызывать пресеты, отправлять локальные и глобальные OSC и MIDI команды?
    Я так понимаю, что с его помощью, как минимум можно совмещать выполнение Action из разных Секций? Не?
     
    Последнее редактирование: 29 апр 2015
    Gavruseff нравится это.
  24. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    16.914
    Симпатии:
    9.168
    Пол:
    Мужской
    Адрес:
    Киев
    Я наверное не знаю как и куда смотреть :(
    Ткните носом.
    Скрипт поддерживает прямой доступ к параметрам плагинов сторонних?
    Может кто-то, кто больше разобрался, сделать простенький скрипт с изменением параметра любого в любом плагине?
     
  25. nounaim

    nounaim Active Member

    Регистрация:
    29 авг 2010
    Сообщения:
    215
    Симпатии:
    47
    да, работает и с vst
    нашлось на форуме кокоса:
    Код:
    tr = RPR_GetSelectedTrack(0,0)
    RPR_TrackFX_SetParam(tr, 0, 2, 1)
    
    применяется к выделенному треку, числа после tr - номер плагина в инсерте, номер параметра, значение параметра.
     
    Последнее редактирование: 30 апр 2015
    Aleksandr Oleynik и fruitcore нравится это.
  26. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    16.914
    Симпатии:
    9.168
    Пол:
    Мужской
    Адрес:
    Киев
    Так раздел для этого и создавали - давайте на ощупь, но вместе.

    Честно говоря - без документации - полные потёмки и метод научного тыка.
     
    Последнее редактирование: 30 апр 2015
  27. Nagor

    Nagor Active Member

    Регистрация:
    4 окт 2010
    Сообщения:
    493
    Симпатии:
    65
    Подскажите, где взять эту бетку? С её установкой не начнутся ли глюки, проблемы с настройками прежней версии?
     
    nounaim и Furqat нравится это.
  28. Nagor

    Nagor Active Member

    Регистрация:
    4 окт 2010
    Сообщения:
    493
    Симпатии:
    65
  29. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    16.914
    Симпатии:
    9.168
    Пол:
    Мужской
    Адрес:
    Киев
    Проблемы могут быть. Связанны они могут быть с теми функциями взаимодействия надстройки с Рипером, которые в бэтке не допиляны.
    У меня стоит два Рипера - один с релизом SWS, а второй с бэткой.
    --- добавлено 1 май 2015, дата сообщения: 1 май 2015 ---
    Ну не знаю....
    Разве в Си можно найти спец функции описывающие взаимодействие с Рипером?
    Стандартные выражения - понятно, но у меня проблемы в первую очередь с корретным обращением к нужному месту в Рипере.
    Получается как та Лиса и виноград - понимаю, что с EEL теперь имеем доступ буквально ко всему, а сделать почти ничего не можем.
    Я вчера три часа методом втыка пытался при помощи EEL обратиться к параметру плагина стоящему первым на выделенном треке - ни фига.
     
  30. Nagor

    Nagor Active Member

    Регистрация:
    4 окт 2010
    Сообщения:
    493
    Симпатии:
    65
    Разумно сделать так же.
     
  31. @Michael

    @Michael Well-Known Member

    Регистрация:
    14 дек 2010
    Сообщения:
    840
    Симпатии:
    1.266
    Пол:
    Мужской
    Адрес:
    Орёл / Москва
    На данный момент этот ресурс самый информативный, мне кажется.

    Aleksandr Oleynik, как раз в бетах исправляют баги предыдущих релизов. Редко бывает, что появляются откровенно сырое что-либо. По крайней мере касаемо sws.
    А что вы хотите от параметра на выделенном треке? Могу помочь))
     
    Последнее редактирование: 1 май 2015
    EUGEN27771, Aleksandr Oleynik, fruitcore и 2 другим нравится это.
  32. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    16.914
    Симпатии:
    9.168
    Пол:
    Мужской
    Адрес:
    Киев
    Спасибо!
    Это уже Очень Хорошо!

    У меня есть конкретный случай, когда это не так. Но некоторые мои задачи - мало кем востребованны - я писал SWS и они быстро правили.

    Для начала хотелось бы увидеть несколько рабочих скриптов, чтобы разобраться -
    1. Например - изменение 2-го по счёту параметра плагина, стоящего вторым в инсёрте на выделенном треке
    2. Тоже самое - на 2-ом по счёту треке
    3. Тоже самое - на треке с именем Key001
    4. Тоже самое, но обращение к плагину с конкретным именем на треке с конкретным именем.
     
    Последнее редактирование: 1 май 2015
  33. EUGEN27771

    EUGEN27771 Well-Known Member

    Регистрация:
    23 апр 2010
    Сообщения:
    2.321
    Симпатии:
    1.963
    Пол:
    Мужской
    @Aleksandr Oleynik, Вы когда-то спрашивали о динамическом изменении параметров через экшны.Сегодня порылся-это таки возможно.Вот пример-
    Код:
    function run()
      is_new,name,sec,cmd,rel,res,val = reaper.get_action_context();
      if is_new then
        reaper.OscLocalMessageToHost("/track/1/volume",(val/127));--volume(track1)
        reaper.OscLocalMessageToHost("/track/1/send/1/pan",(val/127));--change send-pan(track1,send1)
    
    
    end
      reaper.defer(run);
      end
       reaper.defer(run)
    Назначив на скрипт крутилку или фейдер(или через MIDItoReaCP),так можно менять любой доступный параметр или сразу несколько параметров.
     

    Вложения:

    • 1.gif
      1.gif
      Размер файла:
      852,7 КБ
      Просмотров:
      80
    lil-burn, nounaim, fruitcore и ещё 1-му нравится это.
  34. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    16.914
    Симпатии:
    9.168
    Пол:
    Мужской
    Адрес:
    Киев
    Афигеть!
    Спасибо - вернусь с отпуска буду копать!
    Я так понимаю, что так-же можно изменение каких либо параметров в Рипере отправлять и во вне по OSC или MIDI?
     
    Последнее редактирование: 1 май 2015
  35. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    16.914
    Симпатии:
    9.168
    Пол:
    Мужской
    Адрес:
    Киев
    Должна быть какая-то команда (по логике) -
    OscMessageToDevice
     
  36. naash_g

    naash_g Mixing...

    Регистрация:
    5 авг 2008
    Сообщения:
    2.116
    Симпатии:
    448
    Адрес:
    Che...
    Ребята, помогите! Никак не могу подружить рипер и питон! Не хотят скрипты работать. Чего только не делал и как только не ставил всё это добро. Подскажите всё же рабочее решение.
     
  37. naash_g

    naash_g Mixing...

    Регистрация:
    5 авг 2008
    Сообщения:
    2.116
    Симпатии:
    448
    Адрес:
    Che...
    нет картинки
     
  38. nounaim

    nounaim Active Member

    Регистрация:
    29 авг 2010
    Сообщения:
    215
    Симпатии:
    47
    вот:
     

    Вложения:

    • settingss.jpg
      settingss.jpg
      Размер файла:
      103,9 КБ
      Просмотров:
      34
    Последнее редактирование: 3 май 2015
    naash_g нравится это.
  39. LiSICin

    LiSICin Member

    Регистрация:
    18 июл 2014
    Сообщения:
    62
    Симпатии:
    14
    Адрес:
    Saratov
    Тоже долго мучался, но всё-таки запустил я его. Делал так:
    1. Для Windows 7 x64 нужно качать инсталлер для 64 битной винды, от сюда: https://www.python.org/ftp/python/3.4.3/python-3.4.3.amd64.msi
    2. Установить Phyton по этой инструкции: http://программисту.рф/python/ustanovka-python-na-windows-7/
    3. Прописать следующие пути в настройках:
    2015-05-03_172734.jpg

    Вот BMP конвертер к примеру работает:
    2.jpg
     
    Последнее редактирование: 3 май 2015
    naash_g нравится это.
  40. @Michael

    @Michael Well-Known Member

    Регистрация:
    14 дек 2010
    Сообщения:
    840
    Симпатии:
    1.266
    Пол:
    Мужской
    Адрес:
    Орёл / Москва
    Aleksandr Oleynik,
    изменение = ставим параметр в центр (0,5).
    Нумерация индексов с нуля.

    PHP:
    track GetSelectedTrack(00);
    TrackFX_SetParam(track110.5);
    (по порядку)

    PHP:
    track GetTrack(01);
    TrackFX_SetParam(track110.5);
    (выделенному)

    PHP:
    track GetSelectedTrack(01);
    TrackFX_SetParam(track110.5);
    Cycle Action Editor: Save selected tracks slot 1
    Cycle Action Editor: Console S Key001
    PHP:
    track GetSelectedTrack(00);
    TrackFX_SetParam(track110.5);
    Cycle Action Editor: Restore selected tracks slot 1


    Cycle Action Editor: Save selected tracks slot 1
    Cycle Action Editor: Console S Key001
    PHP:
    track GetSelectedTrack(00);
    fx TrackFX_GetByName(track"fxname");
    TrackFX_SetParam(trackfx10.5);
    Cycle Action Editor: Restore selected tracks slot 1

    Если я правильно понял, Reaper и так отправляет OSC. У меня он связан с TouchOsc и прекрасно пересылает туда (на планшет) всё, что нужно: транспорт, фейдеры, выделенные треки, имена инсертов, посылов и т.д. Пошерстите файл OSC/Default.ReaperOSC
     
    Последнее редактирование: 3 май 2015
    Aleksandr Oleynik нравится это.
  41. naash_g

    naash_g Mixing...

    Регистрация:
    5 авг 2008
    Сообщения:
    2.116
    Симпатии:
    448
    Адрес:
    Che...
    спасибо! заработало! Но есть одно но - теперь почему то драг энд дроп аудио файлов в рипер не хочет работать! как это вылечить??
     
  42. LiSICin

    LiSICin Member

    Регистрация:
    18 июл 2014
    Сообщения:
    62
    Симпатии:
    14
    Адрес:
    Saratov
    @naash_g, Не знаю, у меня всё закидывается нормально, но на днях проскальзывала такая проблема. Её решение я отложил на след. день т.к. было поздно, утром всё заработало, такая вот мистика)
     
    naash_g нравится это.
  43. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    16.914
    Симпатии:
    9.168
    Пол:
    Мужской
    Адрес:
    Киев
    @Michael, спасибо большое!
    Получается, что скрипты теперь поддерживают все выражения Cycle Action Editor? А Консоли только через Cycle Action Editor? Или вы предлагаете делать такой составной Кастом Экшин из Цикл Экшинов и Скриптов?

    @EUGEN27771, @Michael, по поводу OSC я всё-же имел в виду прежде всего отправку Любых OSC команд при помощи именно скриптов. Ну чтоб итогом выполнения какого либо скрипта была отправка OSC сообщения во вне, как контроль выполнения, например.
    Ну и во вторую очередь отправку текстовых сообщений любых форматов, а не только имён треков или плагинов. Например отправка сообщения о том, что был выполнен скрипт в результате которого рипер изменил тембр гитары (комплексное изменение параметров нескольких плагинов) - опять таки, для обратной связи.
     
    Последнее редактирование: 4 май 2015
  44. naash_g

    naash_g Mixing...

    Регистрация:
    5 авг 2008
    Сообщения:
    2.116
    Симпатии:
    448
    Адрес:
    Che...
    у меня рипер всегда был запущен от админа, всегда всё работало пока не установил питона. А получается что риперу пофиг от админа он или нет??
     
  45. nounaim

    nounaim Active Member

    Регистрация:
    29 авг 2010
    Сообщения:
    215
    Симпатии:
    47
    @EUGEN27771, у меня почему то не работает пример с динамическим изменением параметров через экшены, скрипт выдает ошибки:(
     
  46. @Michael

    @Michael Well-Known Member

    Регистрация:
    14 дек 2010
    Сообщения:
    840
    Симпатии:
    1.266
    Пол:
    Мужской
    Адрес:
    Орёл / Москва
    Aleksandr Oleynik, нет, нет, я просто не искал, как это сделать в скрипте. Зачем, если уже всё придумали до нас)) Но вообще я полагаю, что касаемо проверки наименования треков стоит копать GetSetMediaTrackInfo_String(MediaTrack tr, "parmname", #stringNeedBig, bool setnewvalue), что-то в духе

    PHP:
    0;
    trackcount CountTracks(0);
    loop (trackcount,
       
    track GetTrack(0i);
       
    GetSetMediaTrackInfo_String(track"P_NAME"#trackname, 0);
         
    match("key001",#trackname) ? (
         
    fx TrackFX_GetByName(track"SuperWave P8 (Christopher Gill)"0);
         
    TrackFX_SetParam(trackfx10.5);
         );
       
    += 1;
    );
    key001 - трек
    SuperWave P8 (Christopher Gill) - имя плагина
    второй параметр этого плагина = 0,5

    Но вообще cycle action, как и кастом и sws и всё, что находится в экшнах, можно вызвать скриптом через Main_OnCommand и NamedCommandLookup.

    Что касается OSC. Так и не смог я из консоли или из скрипта послать месседж (голый string на указанный адрес) на внешнее устройство. Видимо, эти вещи были сделаны исключительно для того, чтобы имитировать сообщения с внешних устройств.
     
    Последнее редактирование: 4 май 2015
    Aleksandr Oleynik нравится это.
  47. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    16.914
    Симпатии:
    9.168
    Пол:
    Мужской
    Адрес:
    Киев
    @Michael, у меня есть созданный на Cycle Action сэтап и он меня почти на 100% устраивает по функционалу (последнюю проблему с обращением к треку с конкретным именем тоже нашёл как решать).
    Но!!!!!!!! Я хочу сделать это удобным для всех, а править несколько ini файлов на много сложнее, чем текстовый скрипт.
     
  48. @Michael

    @Michael Well-Known Member

    Регистрация:
    14 дек 2010
    Сообщения:
    840
    Симпатии:
    1.266
    Пол:
    Мужской
    Адрес:
    Орёл / Москва
    Ну я вообще-то написал скрипт выше, который обращается к треку с конкретным именем))
    Саму форму запроса имени трека и эффекта от пользователя можно дописать (GetUserInputs).
    Просто в консоли это немного более детализировано. То есть там же мы можем указать, какими символами имя трека заканчивается, или начинается или содержит. А в EEL есть только функция match, сравнивающая первый параметр со вторым + можно дописать аргумент количества совпадений по символам.

    Ну а в ini вроде написано
    Меня такие надписи обычно пугают и останавливают править конфиги))
     
    Последнее редактирование: 4 май 2015
    Aleksandr Oleynik нравится это.
  49. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    16.914
    Симпатии:
    9.168
    Пол:
    Мужской
    Адрес:
    Киев
    Был бы вам очень признателен, если бы вы сделали какой-то полностью законченный рабочий скрипт, как пример. А лучше парочку.
    Я пока не совсем могу врубиться в это, а имея работающие примеры - мне на много проще двигаться дхальше.
    Да! Но в общем-то match как раз более правильно и надёжно, так как не позволит допустить ошибки и крутануть параметр не на том треке и не в том плагине.
    Я общался на форуме кокоса с SWS о том, что было бы хорошо не только через консоль дать доступ к трекам и FX по их имени, а не по номеру - они написали, что имя не есть уникальным и его использовать плохо - от части они правы, но во многих задачах номер трека и FX тоже ни как не применимы - ну перенёс ты трэк в другое место, а плагины на нём поменял местами - и всё!, капец твоему Action-у.
    Им бы ввести ID трека и ID FX-а (уникальные), которые бы присваивались один раз и на всегда в проекте - вот тогда всё было бы как нужно.

    Это да, но я с этим всем разобрался хорошо и знаю что и как править, чтоб проблем не было.
     
  50. @Michael

    @Michael Well-Known Member

    Регистрация:
    14 дек 2010
    Сообщения:
    840
    Симпатии:
    1.266
    Пол:
    Мужской
    Адрес:
    Орёл / Москва
    Немного потерялся с конвертированием разных видов данных, но ребята с форума cockos подсказали правильный синтаксис.
    После "//" комментарии. Пишу не только для вас, так что разжевал сразу насколько возможно доступно ;)
    Продублирую ещё раз эту ссылку. Ctrl+F или F3 по ней творит чудеса))

    Итак,
    PHP:
    function set_parameter() // забиваем свою функцию
    // начинаем забивание
    Undo_BeginBlock(); // для того, чтобы можно было отменить действие
    GetUserInputs("input?"4"track name:, fx name:, parameter number:, value:"#inputdata); // ок, тут поинтереснее. Всё, что в кавычках, запоминается в один string параметр #inputdata через запятую, 4 - количество
    match("%s,%s,%d,%f"#inputdata, #track_name, #fx_name, par_num0, value); // раскрываем всё, что было в #inputdata, и привязываем это дело к переменным, которые можно использовать в коде. Переменные соответственно #string, #string, integer, float point
    par_num par_num0 1// отсчёт порядковых номеров эффектов в цепи начинается с нуля, так что мы вбиваем, например, единицу в поле ввода, а эта строка указывает, что нам нужно будет сделать всё на плагине с порядковым индексом 0
    0// стартовый индекс трека для лупа, то есть мы начинаем долбление лупа с первого трека, индексы здесь аналогично начинаются с нуля
    trackcount CountTracks(0); // перебор треков, (ноль здесь и в подобных функциях говорит риперу, что выполнять функцию нужно в активном проекте)
    loop(trackcount// петля для каждого из треков, перечисленных предыдущей функцией, т.е. всех треков в проекте в данном случае (могло быть, скажем, CountSelectedTracks - соответственно был бы перебор выделенных треков)
      
    track GetTrack(0i); // берём трек с индексом i, в первый раз он равен нулю (i = 0) перед началом лупа), то есть первый трек в проекте (напомню, исчисление индексов треков с нуля начинается)
      
    GetSetMediaTrackInfo_String(track"P_NAME"#cur_track, 0); // запоминаем имя трека в переменную #cur_track из его индекса (ранее указанная нами переменная track)
      
    match(#track_name, #cur_track) ? ( // соответствует ли имя трека забитому нами в поле ввода?
        
    fx TrackFX_GetByName(track#fx_name, 0); // ок, соответствует, значит достаём индекс нужного эффекта из переменной, которую мы забили в поле ввода
        
    TrackFX_SetParam(trackfxpar_numvalue);//ну и применяем параметр в итоге, имея в арсенале все требуемые для этой функции переменные
        
    ); // это мы закончили вопрос "соответствует ли имя трека забитому нами?". Если бы не соответствовало, до этой строки всё бы игнорировалось
      
    += 1// в первый раз добавляем к нулю единицу. Теперь у нас i=1. Далее код перескакивает на строку, начинающуюся с loop.  Прогоняем луп заново уже для второго трека, добавляем ещё единицу, снова прогоняем и т.д.
    ); // луп пробегает через все треки, завершаем  его этой строкой
    TrackList_AdjustWindows(0); // обновляет всё, что связано с TCP, на всякий случай
    Undo_EndBlock("set parameter"0); // говорит риперу, что вот он, конец куска кода, начавшегося с Undo_BeginBlock, который если что можно отменить
    ); // завершаем забивание функции

    set_parameter(); // выполняем функцию, благо она у нас одна и без аргументов
    UpdateArrange();// на всякий случай обновляет аранж
    Как раз недавно в свежей бетке sws (а вчера и в релизе) появились такие вещи:
    • Added functions to convert track/item/take from and to GUID:
      - BR_GetMediaItemByGUID
      - BR_GetMediaItemGUID
      - BR_GetMediaItemTakeGUID (function to get take from GUID already exists, see SNM_GetMediaItemTakeByGUID)
      - BR_GetMediaTrackByGUID
      - BR_GetMediaTrackGUID
    И существующий TrackFX_GetFXGUID
    Возможно, то, что вам нужно как раз)) Напомню, GUID = Globally Unique Identifier

    По поводу OSC - может напишут чего
     
    Последнее редактирование: 8 май 2015
    PianoIst и Aleksandr Oleynik нравится это.

Поделиться этой страницей