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

EUGEN27771

Well-Known Member
23 Апр 2010
2.293
1.995
113
@@Michael, честно говоря,не знаю,я недавно совсем скрипты изучать начал.

выполняться будет всякий раз как жмёшь выполнить
да.
Aleksandr Oleynik,вот по треку,Sends and Receives пример.Все очень коряво,но работает.Не могу понять,как проще строки складывать(как в lua).Приходится ShowCons.... по сто раз писать.
Код:
//Show Track Info(incl. Sends and Receives)
ShowConsoleMsg("" );

trackId = GetSelectedTrack(0, 0);//Get First Selected track id
GetSetMediaTrackInfo_String(trackId, "P_NAME", #track_name, 0);
ShowConsoleMsg("Track_Name = ");ShowConsoleMsg(#track_name);
ShowConsoleMsg("\n" );
ShowConsoleMsg("  --------------------\n" );
#Pmtr_Name[0] = "D_VOL";
#Pmtr_Name[1] = "D_PAN";
#Pmtr_Name[2] = "D_WIDTH";
#Pmtr_Name[3] = "D_PANLAW";//You can add another Pmtr_Name
Track_Par_Count = 4;//SET parameter count
i_parmtr = 0;
  
loop(Track_Par_Count,
      #Cur_par_name = #Pmtr_Name[i_parmtr];
      Norm_Par_Val = GetMediaTrackInfo_Value(trackId, #Cur_par_name);
      ShowConsoleMsg(strcat(#Cur_par_name," = "));
      ShowConsoleMsg(sprintf(#Norm_Par_Val, "%f",Norm_Par_Val));
      ShowConsoleMsg("\n" );
      i_parmtr += 1;
      );
     
///////////////////////////// 
  ShowConsoleMsg("  --------------------\n" );
 
  Send_Count = GetTrackNumSends(trackId, 0);//0=sends,
  i_send = 0;
 
  loop(Send_Count,
       GetTrackSendName(trackId, i_send, #SendName); 
       GetTrackSendUIVolPan(trackId, i_send, S_volume,S_pan);
       ShowConsoleMsg(sprintf(#i_send, "%d",i_send));
       ShowConsoleMsg(" Send Name  =  ");  ShowConsoleMsg( #SendName);ShowConsoleMsg("\n" );
       ShowConsoleMsg("   Send Vol  =  "); ShowConsoleMsg(sprintf(#S_volume, "%f",S_volume));
       ShowConsoleMsg("   Send Pan  =  "); ShowConsoleMsg(sprintf(#S_pan, "%f",S_pan));
       ShowConsoleMsg("\n" );
      
  
       i_send +=1;
       );
      
///////////////////////////// 
  ShowConsoleMsg("  --------------------\n" );
 
  Recv_Count = GetTrackNumSends(trackId, -1);//is <0 for receives
  i_recv = 0;
 
  loop(Recv_Count,
       GetTrackReceiveName(trackId, i_recv, #RecvName); 
       GetTrackReceiveUIVolPan(trackId, i_recv, R_volume,R_pan);
       ShowConsoleMsg(sprintf(#i_recv, "%d",i_recv));
       ShowConsoleMsg(" Receive Name  =  ");  ShowConsoleMsg( #RecvName);ShowConsoleMsg("\n" );
       ShowConsoleMsg("   Receive Vol  =  "); ShowConsoleMsg(sprintf(#R_volume, "%f",R_volume));
       ShowConsoleMsg("   Receive Pan  =  "); ShowConsoleMsg(sprintf(#R_pan, "%f",R_pan));
       ShowConsoleMsg("\n" );
      
  
       i_recv +=1;
       );
 
  • Like
Реакции: Aleksandr Oleynik

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.064
113
62
Киев
EUGEN27771, а как послать в плагин обратно #string ?
Неужели перебором значений по TrackFX_FormatParamValue?
Меня этот вопрос также интересует, но немного в другом ракурсе - как запомнить значения считанные с плагина, а потом иметь их возможность в любой момент применить?
 

@Michael

Well-Known Member
14 Дек 2010
969
1.461
93
Орёл / Москва
Запомнить то можно (Get/SetProjExtState начиная с 5pre1), сложно обратно конвертировать из formatted value (то, чем оперирует плагин) в значения внутри рипера. Т.е.
TrackFX_GetFormattedParamValue есть, а
TrackFX_SetFormattedParamValue отсутствует. Посмотрим что напишут по этому поводу.
 
Последнее редактирование:
  • Like
Реакции: Aleksandr Oleynik

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.064
113
62
Киев
Так а зачем formatted value запоминать? Рипер ведь принимает значения normalized value, а скрипты их прекрасно считывают.
Для Track Info параметров я вообще не нашёл способа считать formatted value, хотя SWS в snapshot своих пишет как раз все значения в formatted value :(
 

@Michael

Well-Known Member
14 Дек 2010
969
1.461
93
Орёл / Москва
Можно и не запоминать. И оперировать внутренними праметрами. Но,
мы можем, например, взять значение Gain ReaEQ и преобразовать его в то, что мы видим в плагине. Получится красивое значение, скажем, 1.25дБ. Потом добавить к нему (добавляем всё линейно) 1 дБ. Ок, теперь у нас 2.25дБ. Как сказать reaEQ, что гейн должен быть 2.25дБ?
И в треках и в EQ:
D_VOL : double * : trim volume of track (0 (-inf)..1 (+0dB) .. 2 (+6dB) etc ..)
 
Последнее редактирование:

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.064
113
62
Киев
Та-же проблема будет и с частотой и с добротностью и с многими другими абсолютными величинами, я это понимаю.
Но тут без функций конвертации Form to Norm ни как не обойтись и пересчёт должен идти 100% в формате шкалы плагина, а то прибавка 100 Hz (с пересчётом normalized value) к текущему значению частоты в плагине со шкалой 20 Hz - 20- kHz будет отличаться от того-же в другом плаге со шкалой 10-20.
 

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.064
113
62
Киев
Про себя молчу ваще :)
[DOUBLEPOST=1431375917,1431375249][/DOUBLEPOST]Завтра попробую свой последний концертный сэтап (там 24 композиции) переделать на скрипты (благодаря вам с Женей для этого у меня уже есть всё) - просто интересно будет ли выгода в скорости переключения композиций....
 

@Michael

Well-Known Member
14 Дек 2010
969
1.461
93
Орёл / Москва
Вот и ответ подоспел (-1дБ для Gain-Band 3 на ReaEQ1 на треке KEY01_P1):
PHP:
function set_parameter()
(
Undo_BeginBlock();
dB_val = -1; // subtract 1 dB
i = 0;
trackcount = CountTracks(0);
loop(trackcount,
  track = GetTrack(0, i);
  GetSetMediaTrackInfo_String(track, "P_NAME", #cur_track, 0);
  match("KEY01_P1", #cur_track) ? (
    fx_index = TrackFX_GetByName(track, "ReaEQ1", 0);
    j = 0;
    param_count = TrackFX_GetNumParams(track, fx_index);
    loop(param_count,
      TrackFX_GetParamName(track, fx_index, j, #par_name);
      match("Gain-Band 3", #par_name) ? (
        trim = pow(10, dB_val / 20.0);
        val = trim * TrackFX_GetParam(track, fx_index, j, minval, maxval);
        val > maxval ? val = maxval
        :
        val < minval ? val = minval;
        TrackFX_SetParam(track, fx_index, j, val);
      );
      j += 1;
    );
  );
  i += 1;
);

TrackList_AdjustWindows(0);
Undo_EndBlock("set parameter", 0);
);
set_parameter();
UpdateArrange();
Но это опять же математическое решение.
 
  • Like
Реакции: Aleksandr Oleynik

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.064
113
62
Киев
То, что я и писал - для каждого абсалютного параметра нужна будет формула...
[DOUBLEPOST=1431386542,1431386383][/DOUBLEPOST]20 человек отметились, что хотят научиться писать скрипты, а тусовка из пяти, из которых как минимум я толком ничего в этот процесс и не привношу :(
 

@Michael

Well-Known Member
14 Дек 2010
969
1.461
93
Орёл / Москва
Дело в том, что плагин может быть написан как угодно. Захочется левой пятке разработчика сделать значения 0...6 экспонентой, а 6...216 линейно, или рандомом вообще... Как писака в Реакторе скажу, что это вполне возможно)) А в Рипере это по прежнему будет 0...1, ну или какой-то функцией описано. Но всё подряд функцией не опишешь.
 

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.064
113
62
Киев
Основные параметры, как то громкость, частота, добротность, длительность - наверняка стандартны у всех плагинов. А всякие прочие..... - в них всё равно вряд ли кто-то станет вникать в шкалу при задаче прироста величины.

По большому счёту для меня более интересным есть по сути Copy-Paste выбранных параметров, чтоб не использовать функцию Пресета, который запоминает ВСЁ и потом перезаписывает ВСЁ, не анализируя ни как - что поменялось, а что нет.
Хотя я так и не знаю как выяснить - а имеет ли это какой-то практический смысл, даст ли такой механизм обращения к конкретным параметрам, а не вызов Пресета, какой-то прирост в скорости выполнения команд.
 

@Michael

Well-Known Member
14 Дек 2010
969
1.461
93
Орёл / Москва
Ну если что, то
PHP:
SetProjExtState(0, "blablakey", "blablaval", "переменная"); 
// забивает string переменную в память
PHP:
GetProjExtState(0, "blablakey", "blablaval", #val);
ShowConsoleMsg(#val); 
// выводит переменную (в т.ч. после новой загрузки проекта)
 

fruitcore

Active Member
14 Дек 2013
276
70
28
NN
А вот у меня тут парочка вопросов.:) Горячо обсуждаемые тут последние скрипты для параметров плагинов - это всё EEL?
И еще, как-то тут формулировал такую задачу: для выделенных треков убрать в названии первые несколько символов (превратить например "01-Kick" и "02-Snare" в просто "Kick" и "Snare"). Это реализуемо скриптами? Задачка вроде не сильно сложная на первый взгляд.:rolleyes:
 

EUGEN27771

Well-Known Member
23 Апр 2010
2.293
1.995
113

@Michael

Well-Known Member
14 Дек 2010
969
1.461
93
Орёл / Москва
для выделенных треков убрать в названии первые несколько символов
Убрать с начала и конца на выделенных треках:

EEL
PHP:
function deletecharsfromname()
(
Undo_BeginBlock();
#inputdata = "0,0";
GetUserInputs("delete", 2, "symbols from start, symbols from end", #inputdata);
match("%d,%d", #inputdata, start, end);

trackcount = CountSelectedTracks(0);
i = 0;
loop(trackcount,
(track = GetSelectedTrack(0, i)) ?
  (

  GetSetMediaTrackInfo_String(track, "P_NAME", #trackname, 0);  // get trackname
  len = strlen(#trackname); // get length
  offs = len - end; // calculate offset
  str_delsub(#trackname, offs, end); // delete from end
  strcpy_from(#tracknamenew,#trackname,start); // delete from start
  GetSetMediaTrackInfo_String(track, "P_NAME", #tracknamenew, 1); // apply changes

  );
  i += 1;
  );

TrackList_AdjustWindows(0);
Undo_EndBlock("deletecharsfromname", 0);
);

deletecharsfromname();
UpdateArrange();
[DOUBLEPOST=1431441216,1431428115][/DOUBLEPOST]Может кто в курсе, как изменить имя переменной?
Скажем, есть стринг #value. Нужно добавить в его имя индексы: #value1, #value2 и т.д.
 
Последнее редактирование:

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.064
113
62
Киев
А ничего с JS API в 5-ке нового не сделали? Не появилось ни какой возможности из JS плагина Прямо запускать скрипты или Экшины? Ой как это упростило бы мне жизнь.....
 

EUGEN27771

Well-Known Member
23 Апр 2010
2.293
1.995
113
@@Michael, если правильно понял-массив #value[n].
Например,можно присвоить каждому элементу массива опр. значение и вызывать по индексу [n].
 

@Michael

Well-Known Member
14 Дек 2010
969
1.461
93
Орёл / Москва
EUGEN27771, большое спасибо, разобрался. Это я пытаюсь написать скрипт, сравнивающий 2 пресета и выдающий номера и значения параметров, которыми эти пресеты отличаются. Ну и чтобы впоследствии можно было их запоминать-применять. Этакий избирательный пресет.
 
  • Like
Реакции: Aleksandr Oleynik

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.064
113
62
Киев
EUGEN27771, большое спасибо, разобрался. Это я пытаюсь написать скрипт, сравнивающий 2 пресета и выдающий номера и значения параметров, которыми эти пресеты отличаются. Ну и чтобы впоследствии можно было их запоминать-применять. Этакий избирательный пресет.
Будет круто!
Я первый протестирую на большом проекте экономию скорости.....
 

@Michael

Well-Known Member
14 Дек 2010
969
1.461
93
Орёл / Москва
Прогресс пока тухловат ;(
Что-то не работает, пока не могу найти что. Скорее всего в последнем лупе сравнения, т.к. с первых двух значения прекрасно пишутся в консоль. Может кто подскажет?
PHP:
function compare_presets()
(
Undo_BeginBlock();
GetUserInputs("Get Presets", 2, "preset A name, preset B name", #inputdata);
match("%s,%s", #inputdata, #presetA, #presetB);
(track = GetSelectedTrack(0, 0)) ? (
fxcount = TrackFX_GetCount(track);
i = 0;
loop(fxcount,
  fx = TrackFX_GetOpen(track, i) ? (
    curpresetidx = TrackFX_GetPresetIndex(track, fx, allpres); // for restoring at the end of comparison

    TrackFX_SetPreset(track, fx, #presetA); // set preset A
         parcount = TrackFX_GetNumParams(track, fx);
         j = 0;
         loop(parcount,
           param = TrackFX_GetParam(track, fx, j, minvalOut, maxvalOut);
           sprintf(#val_A_[j], "%{param}f"); // store all values from preset A
           j += 1;
         );
          
         TrackFX_SetPreset(track, fx, #presetB); // set preset B
         parcount = TrackFX_GetNumParams(track, fx);
         j = 0;
         loop(parcount,
           param = TrackFX_GetParam(track, fx, j, minvalOut, maxvalOut); 
           sprintf(#val_B_[j], "%{param}f"); // store all values from preset B
           j += 1;
         );

         j = 0;
         loop (parcount,
            strcmp(#val_A_[j],#val_B_[j]) != 0 ? ( // compare presets. if not match show console
            ShowConsoleMsg(#val_B_[j]);
            ShowConsoleMsg("\n");
            );
            j += 1;
         );


    TrackFX_SetPresetByIndex(track, fx, curpresetidx); // set current preset back
     );
  i += 1;
  );
);

TrackList_AdjustWindows(0);
Undo_EndBlock("compare_presets", 0);
);
compare_presets();
UpdateArrange();
 
Последнее редактирование:

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.064
113
62
Киев
А ничего с JS API в 5-ке нового не сделали? Не появилось ни какой возможности из JS плагина Прямо запускать скрипты или Экшины? Ой как это упростило бы мне жизнь.....
Коллеги, ОЧЕНЬ нужно!!!!!
Может у кого-то возникнет не стандартная мысль?
Как ещё, кроме midi, можно связать JSFX и Скрипты(Экшины)?

PS: Кажется нашёл как. Не прямо, но решение без увеличения занятых midi каналов и сообщений нашёл, осталось его реализовать......
JSFX не умеет похоже ни как запускать скрипты, но запущенный скрипт может считывать состояние конкретного JSFX и в зависимости от этого делать совсем разные действия.
 
Последнее редактирование:

Tito

Active Member
17 Янв 2005
236
60
28
56
Питер
Посетить сайт
Скрипт включает arm rec для трека,активного в миди-эдиторе.Переделал из аналогичного для режима "соло",поскольку в скриптах дремуч :).
Заменил одну команду-RPR_Main_OnCommand(8, 0) #toggle rec arm selected track.Получается "8" - это arm rec,"7" - solo,а как вызвать или где подсмотреть перечень этих команд?Это возможно?
 

Вложения

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.064
113
62
Киев
Так в экшн-листе этих команд никогда и не было.В том и радость ))).
Как же не было? -

Просто у toggle rec arm selected track - Command ID не 8, как вы написали, а 9

А вот в unselect all tracks - Command ID вы правильно указали
 
Последнее редактирование:
  • Like
Реакции: Tito

Tito

Active Member
17 Янв 2005
236
60
28
56
Питер
Посетить сайт
Виноват,был не прав ))).Просто для меня вся соль,чтобы arm rec включалось из трек-листа миди-редактора,а в его экшн-листе таких команд нет.
Но,получается,что через скрипт всё работает.Отредактировал,поменял ID и добавил перед этим unarm rec all tracks,чтобы не "двоило".

ПС.Практическая ценность,чтобы selected track (arm rec) в основном окне следовало за selected track в окне миди эдитора.То есть можно играть с клавивтуры именно звуком выбранного в миди эдиторе трека,а не "чем-то из основного окна" ))).
 

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