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

  • Автор темы Автор темы drzhnn
  • Дата начала Дата начала
Эпопея со скриптом Show VSTi under mouse cursor благополучно завершилась))) Пока, по крайней мере. Скрипт заработал и на SWS 2.7.1 beta (на них пока и остановлюсь).
То есть у меня на 2.6.3 beta скрипт работает, на 2.7.0 release - не работает, на 2.7.1 beta - снова работает. Вот такие пироги.
 
  • Like
Реакции: @Michael
Нужно об этой "особенности" ребятам из sws обязательно подробно написать - исправят.
Я писал, у меня такие-же чудеса с бэтками были с некоторыми функциями Цикл Экшин, связанные с снэп шотами - прониклись и исправили раз и на всегда, во всех последующих бэтках уже не ломали.
[DOUBLEPOST=1431144713,1431143484][/DOUBLEPOST]
После "//" комментарии. Пишу не только для вас, так что разжевал сразу насколько возможно доступно ;)
И за это вам ОГРОМНОЕ Спасибо!
@Michael, а можно ещё, ну для максимальной усвояемости :), сделать на основе описанного скрипта, скрипт реально работающий с несколькими треками и несколькими FX и их параметрами (конкретно описанными прям в скрипте, без необходимости задавать их Пользователем в ходе выполнения скрипта и с приложенным проектом простеньким и использованием стандартных Риперовских FX).....
Просто когда знаешь, что что-то на 100% работает, проще свои ошибки выявлять сверяясь.
 
Добрался до рабочего компа и в общем похоже, что всё стало ясно, лично мне пока ни каких примеров не нужно, всё работает!
Попробую свои Цикл Экшины перевести на Скрипты - споткнусь, задам вопросы.
@Michael, ещё раз спасибо - очень здорово! На много проще всё стало!
Очень КРУТО, что можно плагины перемещать в инсёрте, а скрипт всё равно работает.

PS: А вот ещё вопрос, а можно параметр, который в плаге нужно менять, задавать не порядковым номером, а его реальным именем в самом плагине?
Кстати, при помощи функции -
Main_OnCommand(int command, int flag) - можно вызывать в скрипте любые Экшины
А при помощи -
Main_OnCommandEx(int command, int flag, ReaProject proj) - и Экшины SWS
 
Последнее редактирование:
@Aleksandr Oleynik, может как то можно оптимизировать код, но скрипт работает:

Код:
function SelectTrack(trackName)
(
  i = 0;
  loop(CountTracks(0),
  track = GetTrack(0, i);
    GetSetMediaTrackInfo_String(track, "P_NAME", #current_track_name, 0);
    match(trackName, #current_track_name) ? SetTrackSelected(track,1);
    i += 1;
  );
);

SelectTrack("Keys");// выбираем трек "Keys"
seltr = GetSelectedTrack(0,0);
TrackFX_SetParam(seltr, 0, 2, 100); // устанавливаем в 100 SquareMix(2) в Reasynth(0)
Main_Oncommand(40297,0);  // убираем выделение с трека

SelectTrack("Pad");// выбираем трек "Pad"
seltr = GetSelectedTrack(0,0);
TrackFX_SetParam(seltr, 1, 2, 0);//устанавливаем в 0 MidDrive(2) у 3x3 Eq(1)
TrackFX_SetParam(seltr, 1, 3, 0);//устанавливаем в 0 MidGain(3)  у 3x3 Eq(1)
Main_Oncommand(40297,0);//убираем выделение с трека
 

Вложения

Последнее редактирование:
  • Like
Реакции: Aleksandr Oleynik
Не могу пока разобраться как заставить работать эту функцию -
Main_OnCommandEx(int command, int flag, ReaProject proj) - Для запуска Экшинов SWS
[DOUBLEPOST=1431233696,1431233253][/DOUBLEPOST]
@Aleksandr Oleynik, может как то можно оптимизировать код, но скрипт работает:
Мне больше нравится возможность задавать имя плагина, а не его порядковый номер..., это позволяет без проблем дорабатывать проект добовляя плагины, меняя их местами.
Ещё бы была возможность указывать вместо порядкового номера наименование пареметра плагина - совсем бы было удобно.
PS: Хорошо, что в eel скриптах работают все стандартные функции выражений.....
 
Последнее редактирование:
Да вот я как-то пока не сильно врубаюсь в эту логику... :(
Нужны реально работающие скрипты для того, чтоб понять этот функционал считывания и сравнения.
:(
 
Тут жизненно необходима способность анализировать что вообще происходит в скрипте. Если честно, того, что я в посте #57 написал, уже достаточно, чтобы вникнуть в логику петель и условий. По аналогии вполне можно составить всё, что необходимо, ссылку на описания и поиск по ключевым словам я уже дал, постоянно же я примеры не смогу кидать ;)
Вы попробуйте сами напишите, а мы поможем поправить если что тут))
 
Последнее редактирование:
  • Like
Реакции: Aleksandr Oleynik
возможность указывать вместо порядкового номера наименование пареметра плагина
Возможно это поможет .
Код ставит в 0 параметр по имени у первого плагина на выделенном треке и выдает лист с названиями параметров:
PHP:
function set_parameter()
(
GetUserInputs("input?", 1, "parametr name:", #inputparname);
i=0;
SelTr = GetSelectedTrack(0,0);
numParams = TrackFX_GetNumParams(SelTr, 0);
loop(numParams,
  TrackFX_GetParamName(SelTr,0,i, #buf);

  ShowConsoleMsg(sprintf(#, "%s",#buf));
  ShowConsoleMsg("\n");

  match(#buf,#inputparname) ? (
  TrackFX_SetParam(seltr, 0, i, 0);
  );
  i+=1;
);
ShowConsoleMsg("\n");
);
set_parameter();
UpdateArrange();
как заставить принимать имена параметров в любом регистре пока не ясно
 
Последнее редактирование:
  • Like
Реакции: EUGEN27771
EEL: stricmp("str","str2")
думаю сам бы никогда не нашёл)
@@Michael,
а можно как то убрать последние знаки и отобразить только первые четыре цифры у значения float, например тут:
PHP:
floatvalue = 16.960000;
showconsolemsg(sprintf(#,"%f",floatvalue));
нужно чтобы в консоль выводилось только "16.96",
[DOUBLEPOST=1431267777,1431267459][/DOUBLEPOST]И вот тут в стринге оставить только имя файла с расширением:
PHP:
item = GetSelectedMediaItem(0,0);
take = GetActiveTake(item);
src = GetMediaItemTake_Source(take);
filename = GetMediaSourceFileName(src, #filenamebuf);
ShowConsoleMsg(#filenamebuf);
Выводиться стринг вида D:\folder\folder\filename.mp3; как то можно оставить только filename.mp3?
или можно как то иначе получить только имя выделенного файла?
 
Последнее редактирование:
первые четыре цифры

PHP:
floatvalue = 16.960000;
sprintf(#str,"%f",floatvalue);
str_delsub(#str,4,4);
ShowConsoleMsg(#str);

Насчёт оставить только имя файла. Хм, это уже нужно к спецам обращаться, я не знаю.
Можно попробовать продолбить вышедший адрес по каждому символу с конца
EEL: str_getchar("str",offset)
Returns the data at byte-offset offset of str
и запоминать это дело в
EEL: str_insert(#str,"srcstr",pos)
Inserts srcstr into #str at offset pos. Returns #str

при этом проверять, не появился ли слэш. И если появился, то прекратить перебор символов, проверить длину получившегося #string, и заново его перебрать задом наперёд, исходя из этой длины.

А почему нельзя просто 41858: Set item name from active take filename?
 
Последнее редактирование:
  • Like
Реакции: EUGEN27771
Последнее редактирование:
Подскажите,
почему не работает назначение значения параметра указанного по имени в этом вот скрипте? -

Код:
i = 0;
trackcount = CountTracks(0);
loop (trackcount,
   track = GetTrack(0, i);
   GetSetMediaTrackInfo_String(track, "P_NAME", #trackname, 0);
     match("GTR02",#trackname) ? (
     fx = TrackFX_GetByName(track, "ReaComp (Cockos)", 0);
     fx_par = TrackFX_GetParamName(track, fx, "Ratio", 0);
     TrackFX_SetParam(track, fx, fx_par, 0.1);
     );
   i += 1;
);

При этом назначение конкретного пресета вообще вот так работает, с прямым указанием имени -

Код:
i = 0;
trackcount = CountTracks(0);
loop (trackcount,
   track = GetTrack(0, i);
   GetSetMediaTrackInfo_String(track, "P_NAME", #trackname, 0);
     match("GTR02",#trackname) ? (
     fx = TrackFX_GetByName(track, "ReaComp (Cockos)", 0);
     TrackFX_SetPreset(track, fx, "stock - HardRock kick");
     );
   i += 1;
);
 
Последнее редактирование:
@Aleksandr Oleynik, с пресетом,как понимаю,уже не нужен пример.
Да вроди разобрался с этим.
По первому скрипту-TrackFX_GetParamName-здесь указываются после track, fx,номер параметра(счет с нуля).А у вас этого номера нет-его нужно получить,последовательно перебрав на совпадение имени.
Сбивает наименование - GetParamName - как бы функция должна именно имя параметра считывать, а не номер...
Да, я понимаю, что указание номера параметра легче обрабатывается.... Но блин есть же плагины, у которых этих параметров на три страницы.... Или где-то, как-то можно подсмотреть порядковый номер параметра?
 
Nounaim,
Запомни имя итема в стринг, примени экшн, сними во второй стринг, верни как было, а второй стринг используй для gfx.
Можешь ещё четыре символа справа отрезать (точка и расширение), но это чуть помудрёнее))
 
Последнее редактирование:
Это тот самый буфер?
Так может как-то можно прямо считать все имена параметров и задать несколько прямо, по имени?
Буфер может должен быть не ноль?
 
Можно сделать отдельный скрипт,считывать и выводить в консоль номер-имя параметра,если нужно найти номер из множества параметров
Было бы круто. Например для Флотинг FX -а.

Ещё вот есть одна проблемка -
все значения параметров задаются в относительных величинах и нужно, что называется - целиться (подбирать) это значение.
А может есть возможность (не нагружая вычислениями Рипер) задавать параметры в их абсолютных значениях? Если это Realease и в плагине он от 0 до 5000 ms, то вот так и задавать крайнее значение в 5000, а не 1.

Ну или опять таки, может можно скриптик сделать, который бы считывал текущие значения всех выставленных параметров и показывал на против их имён порядковый номер и величину параметра в относительных еденицах?
Такой скрипт бы существенно упростил задачу программирования композиции.
 
Aleksandr Oleynik,
Что мешает разделить "абсолютный параметр" на 5000, чтобы привести диапазон к [0...1]?
[DOUBLEPOST=1431324195,1431323893][/DOUBLEPOST]
Сбивает наименование - GetParamName - как бы функция должна именно имя параметра считывать, а не номер...
Не считывать, а получить. Исходя из порядкового индекса.

почему не работает назначение значения параметра указанного по имени в этом вот скрипте?

PHP:
i = 0;
trackcount = CountTracks(0);
loop (trackcount,
   track = GetTrack(0, i);
   GetSetMediaTrackInfo_String(track, "P_NAME", #trackname, 0);
     match("GTR02",#trackname) ? (
       fx = TrackFX_GetByName(track, "ReaComp (Cockos)", 0);
         /* перебираем параметры */
         j = 0;
         parcount = TrackFX_GetNumParams(track, fx);
         loop(parcount,
           TrackFX_GetParamName(track, fx, j, #parname); // запоминаем имя параметра под номером j в переменную #parname
           match("Ratio",#parname) ? ( // совпадает али нет
             TrackFX_SetParam(track, fx, j, 0);
             ); // закончили проверку на совпадения
         j += 1;
         ); // закончили перебор параметров
     );  // закончили проверку на совпадение имени трека
   i += 1;
); //закончили перебор треков
 
Последнее редактирование:
  • Like
Реакции: Aleksandr Oleynik
Можешь ещё четыре символа справа отрезать
нет расширение файла не мешает, а вот переименовывать треки не хотелось бы чтобы видеть только имя файла, как то же можно разрезать строки до определенного символа.
EEL: str_getchar("str",offset)
делал как то что то похожее на python а вот по eel совсем мало информации.
Что означает - Returns the data at byte-offset offset of str?
 
переименовывать треки не хотелось бы
Не трек, айтем. И я написал, что применить экшн временно, а потом вернуть всё обратно.

Returns the data at byte-offset offset of str?
Я так понимаю, выдаёт символ, оффсет - его порядковый номер в string.
 
Aleksandr Oleynik,
Что мешает разделить "абсолютный параметр" на 5000, чтобы привести диапазон к [0...1]?
Так так и делаю. Но как и на что делить, чтоб определить точно например парамет положения фейдера на треке в минус 2,34 dB? С фейдером ещё ко всему - относительный параметр при плюсовых значениях dB больше еденицы.
[DOUBLEPOST=1431328837,1431327932][/DOUBLEPOST]
Не считывать, а получить. Исходя из порядкового индекса.
PHP:
i = 0;
trackcount = CountTracks(0);
loop (trackcount,
   track = GetTrack(0, i);
   GetSetMediaTrackInfo_String(track, "P_NAME", #trackname, 0);
     match("GTR02",#trackname) ? (
       fx = TrackFX_GetByName(track, "ReaComp (Cockos)", 0);
         /* перебираем параметры */
         j = 0;
         parcount = TrackFX_GetNumParams(track, fx);
         loop(parcount,
           TrackFX_GetParamName(track, fx, j, #parname); // запоминаем имя параметра под номером j в переменную #parname
           match("Ratio",#parname) ? ( // совпадает али нет
             TrackFX_SetParam(track, fx, j, 0);
             ); // закончили проверку на совпадения
         j += 1;
         ); // закончили перебор параметров
     );  // закончили проверку на совпадение имени трека
   i += 1;
); //закончили перебор треков

Спасибо Огромное! В голове становится с каждым таким примером всё яснее и яснее :)
Михаил, а скажите, с точки зрения оптимизации кода и скорости выполнения задаваемых команд -
На сколько дольше будет выполнятся задание параметра по его имени, а не порядковому номеру?
Я так понимаю, что функция loop сразу же запускает операцию перебора по всем имеющимся у плагина параметрам, и чем больше плагинов, а в них параметров, тем дольше будет выполняться скрипт?
А если обращаться к порядковому номеру, то это действие одномоментное?
 
У меня вот основное время при програмировании сэтапа для концерта (в котором может быть до 40 композиций), какраз и занимает считывание параметров состояния плагинов и уровней громкости, панорамы и посылов на всех треках.
Есть в Рипере SWS функция Снэпшот, достаточно продвинутая и в отношении уровней, панорамы она работает очень быстро, но вот с FX она очень однобокая - запоминает ВСЁ и потом и вызывает ВСЁ, что при больших проектах вызывает не совместимый с Живой игрой ступор при смене снэпшота, в котором есть запомненные FX-ы. По этой причине для FX я этим механизмом пользоваться не могу, использую сейчас цикл экшины и обращение к конкретным плагинам и их параметрам, но со скриптами всё на много удобнее будет, как я вижу уже....
Вот я и думаю - как бы при помощи скриптов сделать такую себе Продвинутую функцию FX снэпшот, которая бы запоминала только нужные параметры и потом их и вызывала (если в плагине несколько блоков, то приходится пользоваться запоминанием Пресета и его вызовом потом - что тоже действие не сравнимо более трудоёмкое, чем смена нескольких значений параметров)? Но пока для меня это не реальная задача :(

Пока что, хотябы сделать скрипт, который бы просто считывал и выводил в консоль все имена параметров конкретного плагина (который в данный момент флоот, например), ставил на против порядковый номер, а также ставил на против каждго параметра его относительное значение. -
Это бы сильно облегчило задачу програмирования скрипта смены композиции.
 
Последнее редактирование:
Почему просто не забить пресеты и вызывать их разом скриптом или экшном?
Пресет по скорости его вызова (по нагрузке на вычислительные мощности) = FX Chain SWS Snapshots, так как при смене пресета переназначаются ВСЕ параметры плагина, а не только те, что нужно изменить.
Но в общем-то почти во всех плагах приходится с Пресетами и работать, особенно это касается Комбайнов формирующих звук. И да, я их так сейчас и вызываю через экшины сделанные на базе цикл экшинов - через скрипты просто будет для меня проще.
[DOUBLEPOST=1431335188,1431333624][/DOUBLEPOST]
По некоторым плагинам больше 600 параметров выводит.Я и не знал раньше,что их так много
Во-первых, огромное спасибо за скрипт - и обучение для меня и Очень полезный функционал!
Во-вторых, именно по этой причине мне ТАК было не удобно назначать изменение параметров по его номеру, ещё и листая список....
@EUGEN27771, мне самому пока не осилить, но вдруг вы или @Michael найдёте время и "допилите" этот скрипт, чтоб на против каждого из параметров ещё выводилось его текущее значение в относительных еденицах, которые использовать потом можно в скрипте?
Это был бы для меня (а может и для кого-то ещё) просто Неоценимый скрипт!
PS: Я конечно буду пытаться это сделать и сам, но пока...., знаний и пониманий функций не хватает. :(
 
Последнее редактирование:
Код:
//Show All parameter of FX  by num and name
ShowConsoleMsg("");
trackcount = CountTracks(0);
i_track = 0;
Open = 0;
loop(trackcount,
      track_id = GetTrack(0,i_track);
      FX_Count = TrackFX_GetCount(track_id);
  
     FX_Count ?
     ( i_fx = 0;
       loop( FX_Count,
            Open = TrackFX_GetOpen(track_id,i_fx);
        
            Open  ?
               ( Par_Count = TrackFX_GetNumParams(track_id,i_fx);
                i_par = 0;
                Loop( Par_Count,
                      TrackFX_GetParamName(track_id,i_fx,i_par, #par_name);//Parmtr Name                 
                      Norm_Par_Val = TrackFX_GetParamNormalized(track_id,i_fx,i_par);//Norm Value
                      TrackFX_GetFormattedParamValue(track_id,i_fx,i_par,#Form_Par_Val);//Form Value

                      sprintf(#Parmtr_Num, "%d",i_par);//Num To String
                      sprintf(#Norm_Par_Val, "%f",Norm_Par_Val);//Name To String
                                        
                      strcat(#Parmtr_Num,"  =  ");//#Parmtr_Num = "#Parmtr_Num - "
                      strcat(#par_name,"  ||  CurrentVal:  ");
                      strcat(#Form_Par_Val,"  =  ");
                                                   
                      ShowConsoleMsg(#Parmtr_Num);
                      ShowConsoleMsg(#par_name);
                      ShowConsoleMsg(#Form_Par_Val);
                      ShowConsoleMsg(#Norm_Par_Val);
                      ShowConsoleMsg("\n" );                 
                 
                     i_par += 1;
                     );
                 );
                 
             i_fx += 1;
            );
      );
  
     i_track += 1;   
     );
Выводит текущее значение параметра в абс. и относ. величинах.
 

Вложения

  • Снимок.PNG
    Снимок.PNG
    20,6 KB · Просмотры: 216
Последнее редактирование:
Выводит текущее значение параметра в абс. и относ. значениях.
НЕТ СЛОВ!
[DOUBLEPOST=1431343774,1431343463][/DOUBLEPOST]@Michael, Реальный эксперимент с выявлением оптимального подхода к управлению настройками очень трудоёмкий, потому как на пяти-шести дорожках и десятке плагинов Точно разница будет нулевая, на этом объёме почти с той-же скоростью и FX Chain SWS Snapshots работает "моментально". По этой причине меня многие не понимают - зачем это я заморачиваюсь с этой всей оптимизацией. Но в реальном Концертном проекте у меня более 80 трэков (с учётом индивидуального мониторинга) и достаточно много обработок (с учётом всех тембральных прессетов на весь концерт).
 
Aleksandr Oleynik, не, это я немного не попал (что странно, выдавало по этим же функциям совсем другое, может пропустил что-то), а вот у Евгения всё заработало. И частота и гейн, всё как положено, в своих единицах.
 
Aleksandr Oleynik, не, это я немного не попал (что странно, выдавало по этим же функциям совсем другое, может пропустил что-то), а вот у Евгения всё заработало. И частота и гейн, всё как положено, в своих единицах.
А, понял. Я думал вы это об оптимизации кода... ОК
Да, Женин скрипт просто сказка для меня!
Аж голова закружилась от того, что ЕЩЁ можно было-бы сделать при вот таких то возможностях и глубине общения скриптов с программой.
[DOUBLEPOST=1431351396,1431344233][/DOUBLEPOST]А у меня ещё вопрос. вот такой скрипт с изменением параметров, пресетов - выполняться будет всякий раз как жмёшь выполнить или в нём заложен механизм - выполнять только если параметр иной?
 

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