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

  • Автор темы Автор темы drzhnn
  • Дата начала Дата начала
Сравнение параметров пресетов и отображение несоответсвующих значений(ell)
Код:
function Get_Preset_Parmtrs(preset) //Get PresetParameters Values
( TrackFX_SetPreset(track, i_fx, preset);
  i_param = 0;
  loop( par_count,               
        Parmtr_Val[i] = TrackFX_GetParamNormalized(track, i_fx, i_param);       
        i_param += 1;
        i +=1;       
       );     
);


//Start//
track = GetSelectedTrack(0, 0);//Get First Sel track_id
track ? (fx_count = TrackFX_GetCount(track););//Get fx_count
j  = 0;
loop(fx_count,
      FX_Open = TrackFX_GetOpen(track, j);
      FX_Open ?         //IF Cur FX Open in the FX chain or a floating window
        (i_fx = j;      //Get index fx and #User_pres_name
         TrackFX_GetPreset(track, i_fx, #User_pres_name);
         );                                   
      j += 1;
     );



FX_Open ?
(
   GetUserInputs("Get Presets", 2, "preset A name, preset B name", #inputdata);
   match("%s,%s", #inputdata, #presetA, #presetB);
   par_count = TrackFX_GetNumParams(track, fx);
   i  = 0;
   Get_Preset_Parmtrs(#presetA);//Function Get #presetA Parameters Values
   Get_Preset_Parmtrs(#presetB);//Function Get #presetB Parameters Values

ShowConsoleMsg("");//Clean console
i_param = 0;
loop(par_count,
        Parmtr_Val[i_param] != Parmtr_Val[i_param + par_count ] ?  //IF Values Not Equal
        (
          TrackFX_GetParamName(track,i_fx,i_param, #par_name);//Parmtr Name
          strcat(#par_name,"  ||  ");//#par_name = "#par_name  || "
          sprintf(#Parmtr_Num, "%d",i_param);//#Parmtr_Num To String
          strcat(#Parmtr_Num,"  =  ");//#Parmtr_Num = "#Parmtr_Num = "
          sprintf(#A_Parmtr_Val, "%f",Parmtr_Val[i_param]);//A_Parmtr To String
          sprintf(#B_Parmtr_Val, "%f",Parmtr_Val[i_param + par_count]);//B_Parmtr To String
          ShowConsoleMsg(#Parmtr_Num);
          ShowConsoleMsg(#par_name);
          ShowConsoleMsg(#A_Parmtr_Val);
          ShowConsoleMsg("  ||  ");
          ShowConsoleMsg(#B_Parmtr_Val);
          ShowConsoleMsg("\n");
         );
     i_param +=1;
     ); 
TrackFX_SetPreset(track, i_fx, #User_pres_name);//Restore User preset
);
завтра еще подправлю,сейчас проверил,там есть косяки.
п.с. исправил


Правильный вариант: пост #144
 
Последнее редактирование модератором:
  • Like
Реакции: Aleksandr Oleynik
EUGEN27771,
у меня не работает (5pre29), можете приложить гифку?
В некоторых кусках вашего кода логика непонятна совсем )) И ещё, лучше вставлять код как php, так удобнее его читать.
 
Сравниваются пресеты открытого(!) в данный момент эффекта с первого(или единственного) выделенного трека.Если трек не выделен,эффект не открыт-не выдает ничего вообще,если пресетов не найдено,или они равны- пустая консоль.
 

Вложения

  • 1.gif
    1.gif
    904,1 KB · Просмотры: 135
Не, всё как ты написал делаю - чистая страница.
А приатач проект и скрипт
Может где-то ошибка
 
Последнее редактирование:
Привет всем!
Реально написать скрипт для рипера, который бы делал следующую вещь, как в ФЛ:

17.gif


Кликаю на итем и затем могу его вставлять, где угодно, а зажав правую кнопку, удаляю его.
 
@@Michael, параметры для от каждого пресета запоминаются в слоты памяти Parmtr_Val[индекс]-для первого пресета и Parmtr_Val[индекс+ par_count]-для второго.Например,если параметров 20,то Parmtr_Val[0...19] -1-й и Parmtr_Val[20...39] -2-й.
Иначе не получается,здесь(в Ell) Parmtr_Val []- не массив,как я понял,а типа слот.
То есть,что Parmtr_Val[],что X[],что Y[] будут ссылаться на одно значение,как их не называй,если индекс одинаковый.
Ну,это я так понял,экспериментальным путем,как на самом деле-не знаю

[DOUBLEPOST=1431599122,1431598088][/DOUBLEPOST]
А приатач проект и скрипт
Может где-то ошибка
Проект-просто один reacomp на любом треке.
Скрипт в архиве.
Пресеты-лучше назвать как можно проще-1,2 или A,B ,чтобы не путаться,здесь и итерация учитывается.
Но вообще работает с любыми.
Вот пример еще
 

Вложения

Последнее редактирование:
@@Michael, 5.31, sws 2.7.1
П.С.нашел в чем проблема-почему-то код неправильно вставляется в форум.
Везде,где было
PHP:
Parmtr_Val[i]
-пропадают скобки и индекс,форум принимает это,как изменение шрифта.Естественно ничего не работает,если же,как PHP код вставлять,то все нормально.Но предыдущий код уже не могу отредактировать.
Так что в архиве рабочий скрипт,а тот что в посте#135-вообще неправильный-его бы как-то удалить,что не путался.
Еще и сюда добавил правильный архив
 

Вложения

Последнее редактирование:
  • Like
Реакции: Aleksandr Oleynik
Значит прекращаем писать в теле форума! :( Только что разве PHP

ак что в архиве рабочий скрипт,а тот что в посте#135-вообще неправильный-его бы как-то удалить,что не путался
Там есть кнопка Пожаловаться - сразу прочтёт Модератор и сделает
 
sapun,
по первому действию можно сделать custom action 1 select item under mouse cursor, 2 copy item и првяжи к Mouse Modifiers / Media item / Left click.
Удалять пока нельзя, как и вообще что-либо делать при перетаскивании курсора (= долбить экшн при каждом перемещении мыши с какой-либо зажатой кнопкой). Но насколько я знаю, эта область сейчас активно исследуется в виде расширений (уже есть continious action), а также возможно в виде ближайших или не очень ближайших бета релизов.
 
  • Like
Реакции: sapun
@Aleksandr Oleynik, скрипт переключения параметра одного плагина в зависимости от параметра другого плагина.
PHP:
#track_name1 = "Key_001";//Set track name(ignoring case)
#track_name2 = "Key_002";//Set track name(ignoring case)
#fx_name1 = "ReaEQ (Cockos)";//set FX Name(ignoring case),Don't use "VST:" in name!!!
#fx_name2 = "ReaEQ (Cockos)1";//set FX Name(ignoring case),Don't use "VST:" in name!!!
#parmtr_name1 = "Freq-Low Shelf";//set Parmtr Name
#parmtr_name2 = "Freq-High Shelf";//set Parmtr Name
FX1_Par_Value_1 = 1;//If FX1_Par_Value_1 set FX2_Par_Value_1...Can be changed
FX1_Par_Value_2 = 0;//If FX1_Par_Value_2 set FX2_Par_Value_2...Can be changed
FX2_Par_Value_1 = 0;//  ...Can be changed
FX2_Par_Value_2 = 1;//  ...Can be changed
Add = 0;//Set 0 or 1(If the FX is not in the chain,it will be inserted)

function Get_Prmtr_Value(track_name,fx_name,param_name) ///Get_Prmtr_Value
(
trackcount = CountTracks(0);
i = 0;
loop(trackcount,
      track_id = GetTrack(0,i);
      GetSetMediaTrackInfo_String(track_id, "P_NAME",#cur_track_name, 0);
    
      stricmp(#cur_track_name,track_name) == 0 ?
        (FX_index = TrackFX_GetByName(track_id, fx_name, Add);
         Par_Count = TrackFX_GetNumParams(track_id,FX_index);
          N_param = 0;
          loop(Par_Count,
              TrackFX_GetParamName(track_id, FX_index,N_param, #fx_curr_par_name);        
              stricmp(#fx_curr_par_name,param_name) == 0 ?
              Get_Val = TrackFX_GetParamNormalized(track_id, FX_index, N_param);      
              N_param += 1;
              );                
         );              
      i += 1;
      );
Get_Val; 
);

function Set_Prmtr_Value(track_name,fx_name,param_name,Set_Val) ///Set_Prmtr_Value
(
trackcount = CountTracks(0);
i = 0;
loop(trackcount,
      track_id = GetTrack(0,i);
      GetSetMediaTrackInfo_String(track_id, "P_NAME",#cur_track_name, 0);
    
      stricmp(#cur_track_name,track_name) == 0 ?
        (FX_index = TrackFX_GetByName(track_id, fx_name, Add);
         Par_Count = TrackFX_GetNumParams(track_id,FX_index);
          N_param = 0;
          loop(Par_Count,
               TrackFX_GetParamName(track_id, FX_index,N_param, #fx_curr_par_name);        
               stricmp(#fx_curr_par_name,param_name) == 0 ?
               Set_Val = TrackFX_SetParamNormalized(track_id, FX_index, N_param ,Set_Val);       
               N_param += 1;
               );                
         );              
      i += 1;
      );
);

//Can Be Set Manualy,f.ex. "key","eq","Freq-Low Shelf" etc and copy-paste for another parameters //
Get_Val = Get_Prmtr_Value(#track_name1,#fx_name1,#parmtr_name1);

Get_Val == FX1_Par_Value_1 ? 
  ( Set_Val = FX2_Par_Value_1;
    Set_Prmtr_Value(#track_name2,#fx_name2,#parmtr_name2,Set_Val););

Get_Val == FX1_Par_Value_2 ?
  ( Set_Val = FX2_Par_Value_2;
    Set_Prmtr_Value(#track_name2,#fx_name2,#parmtr_name2,Set_Val););
Трек,эффект и параметр указываются по имени.В начале скрипта задаются имена и значения.
Но если нужно связать несколько пар параметров(не одну,а десять,например) не нужно на каждую пару ставить отдельный скрипт.Можно удалить первые строки вообще,а последние строки копировать,добавлять и задавать другие готовые значения.
И еще,мне кажется,все это в плане быстродействия будет очень плохо,по сравнению с простой сменой пресета.Именно из-за поиска имен,значений,сравнений.Одно дело,когда есть прямая команда со всеми параметрами,другое дело все эти параметры просчитать.
 
И еще,мне кажется,все это в плане быстродействия будет очень плохо,по сравнению с простой сменой пресета.Именно из-за поиска имен,значений,сравнений.Одно дело,когда есть прямая команда со всеми параметрами,другое дело все эти параметры просчитать.
Вот проверить это очень сложно :(
В общем-то мне этот механизм нужен для управления не парами параметров, а одним - многими.
Ситуация такая, что при переключении проекта в состояние следующей композиции мне нужно менять состав активных плагинов (находящихся в режиме анбайпас) и тех, которые становятся в байпас.
Если проект полностью Устоявшийся по составу и типу плагинов, то можно к параметрам и состоянию плагинов обращаться через номера - треков, FX и параметров FX.
Но если проект находится в развитии, и возможна и смена кол-ва треков и плагинов на них - то доработка этого управления (толи через цикл экшины, толи через скрипты) превращается в катаргу - так как простое изменение номера трека рушин нафиг все скрипты.
С параметрами плагинов чуть по проще - новый плагин на месте старого просто перестанет работать (и только он) - но всё равно ---- если обращаться по имени и к трекам и к FX и к параметрам, то как минимум Байпас-Анбайпас нового плагина будет работать в не зависимости от типа плагина.

Но я до конца так и не решил как поступать пока. Вот теперь весь набор инструментов есть - я их разложил на столе, изучил - и буду думать какие из них использовать, а какие просто в багаж знаний упрятать.

По любому - ОГРОМНОЕ СПАСИБО!

Ваши с Михаилом Скрипты - это колоссальный багаж знаний и понимания!
Теперь я не абстрктно раздумываю над оптимальным решением, а с учётом реальных возможностей, которые могу воплотить в жизнь.
 
Последнее редактирование:
...
Показывает VSTi для трека под курсором. Или FX Browser, если инструментов в цепи нет.
(EEL, нужна бета SWS 2.6.3)
PHP:
// mpl_show_vsti_on_track_under_mouse_cursor
function main() local(tr, vsti_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 > -1 ? ( TrackFX_Show(tr, vsti_id, 3);
Main_OnCommand(NamedCommandLookup("_S&M_WNMAIN"), 0); // set focus back to main window
); // end if vsti exists
vsti_id == -1 ? ( Main_OnCommandEx(40271, 0, 0); // show fx browser
); // end if vsti not exists
); // end if track under mouse
); // end main
main();

@Michael, у меня не срабатывает, выдаёт вот такое сообщение (см. скриншот):
 

Вложения

  • Screen Shot 2015-05-15 at 1.58.45 PM.png
    Screen Shot 2015-05-15 at 1.58.45 PM.png
    124,5 KB · Просмотры: 118
У меня только на 2.7.1 заработал
[DOUBLEPOST=1431761916,1431724221][/DOUBLEPOST]Друзья может кто-то подскажет -

Как в Скриптах сделать так, чтобы серия Скриптов работала как "тригер". Т.е. Сработал один скрипт единажды и любая попытка его запустить второй раз не срабатает до тех пор, пока не сработает другой скрипт из серии.
В Цикл Экшинах я это делаю при помощи Exclusive toggle Экшинов - Которые сделаны так, что только один из серии A## может быть On - т.е. если On становится Exclusive toggle A01, то все прочие Exclusive toggle A## станут Off

IF%20NOT.png


А как тоже самое сделать в EEL?
Понимаю, что скрипт можно упаковать в Цикл Экшин и всё на этом. Но хочется всё-таки научится делать всё в рамках скрипта.
 
@Aleksandr Oleynik, с помощью GetToggleCommandState.
Вот мой пример скрипта для квантайза из основного окна ,тут,когда окно квантайза будет закрыто пользователем,закроется и окно миди-редактора и скрипт завершится
PHP:
function Quantize()
(

   First_Sel_Item_idx = GetSelectedMediaItem(0,0);//Get first sel item idx
   SelectAllMediaItems(0,0);//Unselect All Items
   SetMediaItemSelected(First_Sel_Item_idx,1);//Select Only first item by idx
  
   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"
   
);



function Quant_State()
(
  GetToggleCommandStateEx(32060,40009) > 0 ?
  defer(" Quant_State();") : MIDIEditor_OnCommand(active_MIDI_editor, 2);//Close ME window IF Q-Window closed 
 
  i+=1;//Only for Check
 
);

Quantize();
Quant_State();
Тут еще используется defer(),чтоб постоянно отслеживать состояние окна квантайза(on/off в экшенах),пока работает скрипт.
 

Вложения

  • 2.gif
    2.gif
    311,4 KB · Просмотры: 148
  • Like
Реакции: Aleksandr Oleynik
@@Michael,@EUGEN27771,
подскажите пожалуйста как преобразовать стринг такого например вида 0.894196 во float?
через match("%f", #stringname, newfloat) выводит только первые пять символов 0.894:(
 
Последнее редактирование:
I tried to automate rate by plugin but I hear crackles,probably because I can't change rate to small values

nounaim, spk77 ответил уже. А по поводу того, чтобы на ходу менять rate, так понятное дело щелчки будут, у тебя же сэмплы перепрыгивают друг на друга)) Может ты всё же питч хочешь автоматизировать (транспонированием)?
 
@Aleksandr Oleynik, с помощью GetToggleCommandState.
А получилось таки!!!!! Спасибо за подсказку!
PHP:
  i = 0;
trackcount = CountTracks(0);
loop (trackcount,
   track = GetTrack(0, i);
   GetSetMediaTrackInfo_String(track, "P_NAME", #trackname, 0);
      match("Key002",#trackname)&&!GetToggleCommandState(NamedCommandLookup("_S&M_EXCL_TGL1")) ? // Если Трэк совпал с именем Key002 и при этом функция "Exclusive toggle A01" НЕ! ON, то -
     (
     fx1 = TrackFX_GetByName(track, "Lounge Lizard EP-4 (Applied Acoustics Systems)", 0);
     TrackFX_SetPreset(track, fx1, "P004");
     Main_OnCommand(NamedCommandLookup("_S&M_EXCL_TGL1"),0); //В конце всех действий включает "Exclusive toggle A01" в положение ON, что не позволяет выполнить данный скрипт дважды. Нужно другим скриптом её опять привести в состояние OFF
     );
      
   i += 1;
);
 
Последнее редактирование:
@@Michael, то что предложил spk не совсем помогло, я не понял как передавать значение в rate
сэмплы перепрыгивают друг на друга
думал гадал, из за этого оно) или потому что rate округляется - теперь понятно)
а если пробовать вместе с замедлением сдвигать например сэмпл вправо оно поможет?
или в сэмплерах где оно есть какой то более сложный алгоритм?
 
Последнее редактирование:
nounaim, в сэмплерах всё статично. Задали огибающую -> применили её -> используем получившийся сэмпл.

Про ответ spk я имел ввиду то, что внутри редактора всё правильно считается. А чтобы вытащить десятые и далее, аргумент %0.20f = 20 символов после запятой.
 
всё статично. Задали огибающую....
в fl studio сэмплере - играет аудио сэмпл -> вертим pitch бенд -> меняется тон и скорость сэмпла без щелчков , можно записывать и менять это во время плей, все плавно.
kontakt тоже вроде так умеет
 
Ну, всё верно. Напиши код так, чтобы он сначала запоминал порядковый номер семпла (я про микроуровень), а потом применял рейт и с этого сэмпла начинал играть уже с новым рейтом, тогда и щелчков не будет. В FL это работает в буфере (то, что в плейлисте ты видишь, это неадекватное отображение реальных манипуляций с сэмплов, реальное будет лишь когда ты нажмёшь плей заново), поэтому ты щелчков не слышишь.
 
@@Michael, а можно поподробней
не получеается значением #val установить playrate, здесь часть кода:
PHP:
TrackFX_GetFormattedParamValue(track_id,0,0,#Form_Par_Val)
match("%f", #Form_Par_Val, floatedval);
#val = sprintf(#, "%0.6f",floatedval);

SetMediaItemTakeInfo_Value(take, "D_PLAYRATE",#val );
[DOUBLEPOST=1431783580,1431783297][/DOUBLEPOST]
порядковый номер семпла (микроуровень)
а такое в API есть вообще?
 
Не получается, потому что double нужен, а у тебя #string.
Может есть в JS, там должно быть что-то такое, мне кажется.
 
  • Like
Реакции: nounaim
так а эти сдвиги возможно как то через скрипт сделать, не до конца как то понял,
если например во время изменеия rate как то сдвигать сэмпл с помощью SetMediaItemTakeInfo_Value(take, "D_STARTOFFS",offsetval) и связать это с rate
оно могло бы работать? или это безсмысленная затея
[DOUBLEPOST=1431784664,1431784322][/DOUBLEPOST]
порядковый номер семпла
это сэмплы которые 24bit/32bit) то есть это получается уже в js делать надо?
[DOUBLEPOST=1431785736][/DOUBLEPOST]вообще я хотел автоматизировать rate с помощью огибающей, то есть рисовать их автоматизировать также как в других daw,без сторонних инструментов, но непонятно пока возможно ли этоo_O
 

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