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

diggidon

Administrator
Команда форума
26 Май 2008
6.832
7.487
113
51
Днепр UA
Эпопея со скриптом Show VSTi under mouse cursor благополучно завершилась))) Пока, по крайней мере. Скрипт заработал и на SWS 2.7.1 beta (на них пока и остановлюсь).
То есть у меня на 2.6.3 beta скрипт работает, на 2.7.0 release - не работает, на 2.7.1 beta - снова работает. Вот такие пироги.
 
  • Like
Реакции: @Michael

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.064
113
62
Киев
Нужно об этой "особенности" ребятам из sws обязательно подробно написать - исправят.
Я писал, у меня такие-же чудеса с бэтками были с некоторыми функциями Цикл Экшин, связанные с снэп шотами - прониклись и исправили раз и на всегда, во всех последующих бэтках уже не ломали.
[DOUBLEPOST=1431144713,1431143484][/DOUBLEPOST]
После "//" комментарии. Пишу не только для вас, так что разжевал сразу насколько возможно доступно ;)
И за это вам ОГРОМНОЕ Спасибо!
@Michael, а можно ещё, ну для максимальной усвояемости :), сделать на основе описанного скрипта, скрипт реально работающий с несколькими треками и несколькими FX и их параметрами (конкретно описанными прям в скрипте, без необходимости задавать их Пользователем в ходе выполнения скрипта и с приложенным проектом простеньким и использованием стандартных Риперовских FX).....
Просто когда знаешь, что что-то на 100% работает, проще свои ошибки выявлять сверяясь.
 

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.064
113
62
Киев
Добрался до рабочего компа и в общем похоже, что всё стало ясно, лично мне пока ни каких примеров не нужно, всё работает!
Попробую свои Цикл Экшины перевести на Скрипты - споткнусь, задам вопросы.
@Michael, ещё раз спасибо - очень здорово! На много проще всё стало!
Очень КРУТО, что можно плагины перемещать в инсёрте, а скрипт всё равно работает.

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

nounaim

Active Member
29 Авг 2010
284
52
28
@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

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.064
113
62
Киев
Не могу пока разобраться как заставить работать эту функцию -
Main_OnCommandEx(int command, int flag, ReaProject proj) - Для запуска Экшинов SWS
[DOUBLEPOST=1431233696,1431233253][/DOUBLEPOST]
@Aleksandr Oleynik, может как то можно оптимизировать код, но скрипт работает:
Мне больше нравится возможность задавать имя плагина, а не его порядковый номер..., это позволяет без проблем дорабатывать проект добовляя плагины, меняя их местами.
Ещё бы была возможность указывать вместо порядкового номера наименование пареметра плагина - совсем бы было удобно.
PS: Хорошо, что в eel скриптах работают все стандартные функции выражений.....
 
Последнее редактирование:

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.064
113
62
Киев
Да вот я как-то пока не сильно врубаюсь в эту логику... :(
Нужны реально работающие скрипты для того, чтоб понять этот функционал считывания и сравнения.
:(
 

@Michael

Well-Known Member
14 Дек 2010
969
1.461
93
Орёл / Москва
Тут жизненно необходима способность анализировать что вообще происходит в скрипте. Если честно, того, что я в посте #57 написал, уже достаточно, чтобы вникнуть в логику петель и условий. По аналогии вполне можно составить всё, что необходимо, ссылку на описания и поиск по ключевым словам я уже дал, постоянно же я примеры не смогу кидать ;)
Вы попробуйте сами напишите, а мы поможем поправить если что тут))
 
Последнее редактирование:
  • Like
Реакции: Aleksandr Oleynik

nounaim

Active Member
29 Авг 2010
284
52
28
возможность указывать вместо порядкового номера наименование пареметра плагина
Возможно это поможет .
Код ставит в 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

nounaim

Active Member
29 Авг 2010
284
52
28
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?
или можно как то иначе получить только имя выделенного файла?
 
Последнее редактирование:

@Michael

Well-Known Member
14 Дек 2010
969
1.461
93
Орёл / Москва
первые четыре цифры
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

nounaim

Active Member
29 Авг 2010
284
52
28
Последнее редактирование:

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.064
113
62
Киев
Подскажите,
почему не работает назначение значения параметра указанного по имени в этом вот скрипте? -

Код:
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

Well-Known Member
16 Янв 2007
26.360
20.064
113
62
Киев
@Aleksandr Oleynik, с пресетом,как понимаю,уже не нужен пример.
Да вроди разобрался с этим.
По первому скрипту-TrackFX_GetParamName-здесь указываются после track, fx,номер параметра(счет с нуля).А у вас этого номера нет-его нужно получить,последовательно перебрав на совпадение имени.
Сбивает наименование - GetParamName - как бы функция должна именно имя параметра считывать, а не номер...
Да, я понимаю, что указание номера параметра легче обрабатывается.... Но блин есть же плагины, у которых этих параметров на три страницы.... Или где-то, как-то можно подсмотреть порядковый номер параметра?
 

@Michael

Well-Known Member
14 Дек 2010
969
1.461
93
Орёл / Москва
Nounaim,
Запомни имя итема в стринг, примени экшн, сними во второй стринг, верни как было, а второй стринг используй для gfx.
Можешь ещё четыре символа справа отрезать (точка и расширение), но это чуть помудрёнее))
 
Последнее редактирование:

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.064
113
62
Киев
Это тот самый буфер?
Так может как-то можно прямо считать все имена параметров и задать несколько прямо, по имени?
Буфер может должен быть не ноль?
 

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.064
113
62
Киев
Можно сделать отдельный скрипт,считывать и выводить в консоль номер-имя параметра,если нужно найти номер из множества параметров
Было бы круто. Например для Флотинг FX -а.

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

Ну или опять таки, может можно скриптик сделать, который бы считывал текущие значения всех выставленных параметров и показывал на против их имён порядковый номер и величину параметра в относительных еденицах?
Такой скрипт бы существенно упростил задачу программирования композиции.
 

@Michael

Well-Known Member
14 Дек 2010
969
1.461
93
Орёл / Москва
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

nounaim

Active Member
29 Авг 2010
284
52
28
Можешь ещё четыре символа справа отрезать
нет расширение файла не мешает, а вот переименовывать треки не хотелось бы чтобы видеть только имя файла, как то же можно разрезать строки до определенного символа.
EEL: str_getchar("str",offset)
делал как то что то похожее на python а вот по eel совсем мало информации.
Что означает - Returns the data at byte-offset offset of str?
 

@Michael

Well-Known Member
14 Дек 2010
969
1.461
93
Орёл / Москва
переименовывать треки не хотелось бы
Не трек, айтем. И я написал, что применить экшн временно, а потом вернуть всё обратно.

Returns the data at byte-offset offset of str?
Я так понимаю, выдаёт символ, оффсет - его порядковый номер в string.
 

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.064
113
62
Киев
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 сразу же запускает операцию перебора по всем имеющимся у плагина параметрам, и чем больше плагинов, а в них параметров, тем дольше будет выполняться скрипт?
А если обращаться к порядковому номеру, то это действие одномоментное?
 

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.064
113
62
Киев
У меня вот основное время при програмировании сэтапа для концерта (в котором может быть до 40 композиций), какраз и занимает считывание параметров состояния плагинов и уровней громкости, панорамы и посылов на всех треках.
Есть в Рипере SWS функция Снэпшот, достаточно продвинутая и в отношении уровней, панорамы она работает очень быстро, но вот с FX она очень однобокая - запоминает ВСЁ и потом и вызывает ВСЁ, что при больших проектах вызывает не совместимый с Живой игрой ступор при смене снэпшота, в котором есть запомненные FX-ы. По этой причине для FX я этим механизмом пользоваться не могу, использую сейчас цикл экшины и обращение к конкретным плагинам и их параметрам, но со скриптами всё на много удобнее будет, как я вижу уже....
Вот я и думаю - как бы при помощи скриптов сделать такую себе Продвинутую функцию FX снэпшот, которая бы запоминала только нужные параметры и потом их и вызывала (если в плагине несколько блоков, то приходится пользоваться запоминанием Пресета и его вызовом потом - что тоже действие не сравнимо более трудоёмкое, чем смена нескольких значений параметров)? Но пока для меня это не реальная задача :(

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

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.064
113
62
Киев
Почему просто не забить пресеты и вызывать их разом скриптом или экшном?
Пресет по скорости его вызова (по нагрузке на вычислительные мощности) = FX Chain SWS Snapshots, так как при смене пресета переназначаются ВСЕ параметры плагина, а не только те, что нужно изменить.
Но в общем-то почти во всех плагах приходится с Пресетами и работать, особенно это касается Комбайнов формирующих звук. И да, я их так сейчас и вызываю через экшины сделанные на базе цикл экшинов - через скрипты просто будет для меня проще.
[DOUBLEPOST=1431335188,1431333624][/DOUBLEPOST]
По некоторым плагинам больше 600 параметров выводит.Я и не знал раньше,что их так много
Во-первых, огромное спасибо за скрипт - и обучение для меня и Очень полезный функционал!
Во-вторых, именно по этой причине мне ТАК было не удобно назначать изменение параметров по его номеру, ещё и листая список....
@EUGEN27771, мне самому пока не осилить, но вдруг вы или @Michael найдёте время и "допилите" этот скрипт, чтоб на против каждого из параметров ещё выводилось его текущее значение в относительных еденицах, которые использовать потом можно в скрипте?
Это был бы для меня (а может и для кого-то ещё) просто Неоценимый скрипт!
PS: Я конечно буду пытаться это сделать и сам, но пока...., знаний и пониманий функций не хватает. :(
 
Последнее редактирование:

EUGEN27771

Well-Known Member
23 Апр 2010
2.293
1.995
113
Код:
//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;   
     );
Выводит текущее значение параметра в абс. и относ. величинах.
 

Вложения

Последнее редактирование:

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.064
113
62
Киев
Выводит текущее значение параметра в абс. и относ. значениях.
НЕТ СЛОВ!
[DOUBLEPOST=1431343774,1431343463][/DOUBLEPOST]@Michael, Реальный эксперимент с выявлением оптимального подхода к управлению настройками очень трудоёмкий, потому как на пяти-шести дорожках и десятке плагинов Точно разница будет нулевая, на этом объёме почти с той-же скоростью и FX Chain SWS Snapshots работает "моментально". По этой причине меня многие не понимают - зачем это я заморачиваюсь с этой всей оптимизацией. Но в реальном Концертном проекте у меня более 80 трэков (с учётом индивидуального мониторинга) и достаточно много обработок (с учётом всех тембральных прессетов на весь концерт).
 

@Michael

Well-Known Member
14 Дек 2010
969
1.461
93
Орёл / Москва
Aleksandr Oleynik, не, это я немного не попал (что странно, выдавало по этим же функциям совсем другое, может пропустил что-то), а вот у Евгения всё заработало. И частота и гейн, всё как положено, в своих единицах.
 

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.064
113
62
Киев
Aleksandr Oleynik, не, это я немного не попал (что странно, выдавало по этим же функциям совсем другое, может пропустил что-то), а вот у Евгения всё заработало. И частота и гейн, всё как положено, в своих единицах.
А, понял. Я думал вы это об оптимизации кода... ОК
Да, Женин скрипт просто сказка для меня!
Аж голова закружилась от того, что ЕЩЁ можно было-бы сделать при вот таких то возможностях и глубине общения скриптов с программой.
[DOUBLEPOST=1431351396,1431344233][/DOUBLEPOST]А у меня ещё вопрос. вот такой скрипт с изменением параметров, пресетов - выполняться будет всякий раз как жмёшь выполнить или в нём заложен механизм - выполнять только если параметр иной?
 

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