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

  • Автор темы Автор темы drzhnn
  • Дата начала Дата начала
@@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
EUGEN27771, а как послать в плагин обратно #string ?
Неужели перебором значений по TrackFX_FormatParamValue?
Меня этот вопрос также интересует, но немного в другом ракурсе - как запомнить значения считанные с плагина, а потом иметь их возможность в любой момент применить?
 
Запомнить то можно (Get/SetProjExtState начиная с 5pre1), сложно обратно конвертировать из formatted value (то, чем оперирует плагин) в значения внутри рипера. Т.е.
TrackFX_GetFormattedParamValue есть, а
TrackFX_SetFormattedParamValue отсутствует. Посмотрим что напишут по этому поводу.
 
Последнее редактирование:
  • Like
Реакции: Aleksandr Oleynik
Так а зачем formatted value запоминать? Рипер ведь принимает значения normalized value, а скрипты их прекрасно считывают.
Для Track Info параметров я вообще не нашёл способа считать formatted value, хотя SWS в snapshot своих пишет как раз все значения в formatted value :(
 
Можно и не запоминать. И оперировать внутренними праметрами. Но,
мы можем, например, взять значение 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 ..)
 
Последнее редактирование:
Та-же проблема будет и с частотой и с добротностью и с многими другими абсолютными величинами, я это понимаю.
Но тут без функций конвертации Form to Norm ни как не обойтись и пересчёт должен идти 100% в формате шкалы плагина, а то прибавка 100 Hz (с пересчётом normalized value) к текущему значению частоты в плагине со шкалой 20 Hz - 20- kHz будет отличаться от того-же в другом плаге со шкалой 10-20.
 
Про себя молчу ваще :)
[DOUBLEPOST=1431375917,1431375249][/DOUBLEPOST]Завтра попробую свой последний концертный сэтап (там 24 композиции) переделать на скрипты (благодаря вам с Женей для этого у меня уже есть всё) - просто интересно будет ли выгода в скорости переключения композиций....
 
Вот и ответ подоспел (-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
То, что я и писал - для каждого абсалютного параметра нужна будет формула...
[DOUBLEPOST=1431386542,1431386383][/DOUBLEPOST]20 человек отметились, что хотят научиться писать скрипты, а тусовка из пяти, из которых как минимум я толком ничего в этот процесс и не привношу :(
 
Дело в том, что плагин может быть написан как угодно. Захочется левой пятке разработчика сделать значения 0...6 экспонентой, а 6...216 линейно, или рандомом вообще... Как писака в Реакторе скажу, что это вполне возможно)) А в Рипере это по прежнему будет 0...1, ну или какой-то функцией описано. Но всё подряд функцией не опишешь.
 
Основные параметры, как то громкость, частота, добротность, длительность - наверняка стандартны у всех плагинов. А всякие прочие..... - в них всё равно вряд ли кто-то станет вникать в шкалу при задаче прироста величины.

По большому счёту для меня более интересным есть по сути Copy-Paste выбранных параметров, чтоб не использовать функцию Пресета, который запоминает ВСЁ и потом перезаписывает ВСЁ, не анализируя ни как - что поменялось, а что нет.
Хотя я так и не знаю как выяснить - а имеет ли это какой-то практический смысл, даст ли такой механизм обращения к конкретным параметрам, а не вызов Пресета, какой-то прирост в скорости выполнения команд.
 
Ну если что, то
PHP:
SetProjExtState(0, "blablakey", "blablaval", "переменная"); 
// забивает string переменную в память

PHP:
GetProjExtState(0, "blablakey", "blablaval", #val);
ShowConsoleMsg(#val); 
// выводит переменную (в т.ч. после новой загрузки проекта)
 
  • Like
Реакции: Aleksandr Oleynik
А вот у меня тут парочка вопросов.:) Горячо обсуждаемые тут последние скрипты для параметров плагинов - это всё EEL?
И еще, как-то тут формулировал такую задачу: для выделенных треков убрать в названии первые несколько символов (превратить например "01-Kick" и "02-Snare" в просто "Kick" и "Snare"). Это реализуемо скриптами? Задачка вроде не сильно сложная на первый взгляд.:rolleyes:
 
для выделенных треков убрать в названии первые несколько символов
Убрать с начала и конца на выделенных треках:

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 и т.д.
 
Последнее редактирование:
А ничего с JS API в 5-ке нового не сделали? Не появилось ни какой возможности из JS плагина Прямо запускать скрипты или Экшины? Ой как это упростило бы мне жизнь.....
 
@@Michael, если правильно понял-массив #value[n].
Например,можно присвоить каждому элементу массива опр. значение и вызывать по индексу [n].
 
EUGEN27771, большое спасибо, разобрался. Это я пытаюсь написать скрипт, сравнивающий 2 пресета и выдающий номера и значения параметров, которыми эти пресеты отличаются. Ну и чтобы впоследствии можно было их запоминать-применять. Этакий избирательный пресет.
 
  • Like
Реакции: Aleksandr Oleynik
EUGEN27771, большое спасибо, разобрался. Это я пытаюсь написать скрипт, сравнивающий 2 пресета и выдающий номера и значения параметров, которыми эти пресеты отличаются. Ну и чтобы впоследствии можно было их запоминать-применять. Этакий избирательный пресет.
Будет круто!
Я первый протестирую на большом проекте экономию скорости.....
 
Прогресс пока тухловат ;(
Что-то не работает, пока не могу найти что. Скорее всего в последнем лупе сравнения, т.к. с первых двух значения прекрасно пишутся в консоль. Может кто подскажет?
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();
 
Последнее редактирование:
А ничего с JS API в 5-ке нового не сделали? Не появилось ни какой возможности из JS плагина Прямо запускать скрипты или Экшины? Ой как это упростило бы мне жизнь.....
Коллеги, ОЧЕНЬ нужно!!!!!
Может у кого-то возникнет не стандартная мысль?
Как ещё, кроме midi, можно связать JSFX и Скрипты(Экшины)?

PS: Кажется нашёл как. Не прямо, но решение без увеличения занятых midi каналов и сообщений нашёл, осталось его реализовать......
JSFX не умеет похоже ни как запускать скрипты, но запущенный скрипт может считывать состояние конкретного JSFX и в зависимости от этого делать совсем разные действия.
 
Последнее редактирование:
Скрипт включает arm rec для трека,активного в миди-эдиторе.Переделал из аналогичного для режима "соло",поскольку в скриптах дремуч :).
Заменил одну команду-RPR_Main_OnCommand(8, 0) #toggle rec arm selected track.Получается "8" - это arm rec,"7" - solo,а как вызвать или где подсмотреть перечень этих команд?Это возможно?
 

Вложения

Так в экшн-листе этих команд никогда и не было.В том и радость ))).
Как же не было? -
Screenshot%202015-05-13%2020.03.07.png

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

А вот в unselect all tracks - Command ID вы правильно указали
 
Последнее редактирование:
  • Like
Реакции: Tito
Виноват,был не прав ))).Просто для меня вся соль,чтобы arm rec включалось из трек-листа миди-редактора,а в его экшн-листе таких команд нет.
Но,получается,что через скрипт всё работает.Отредактировал,поменял ID и добавил перед этим unarm rec all tracks,чтобы не "двоило".

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

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