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

@Michael

Well-Known Member
14 Дек 2010
969
1.461
93
Орёл / Москва
Вот представь, что ты - рипер. Идёшь ты по сэмплу эдит курсором/плей курсором. Вдруг тебе говорят, что этот сэмпл должен проигрываться в (два) раза медленнее. Ты быстренько считываешь позицию (пусть это будет 425-й сэмпл), по которой проходишь в данный момент. Обсчитываешь сэмпл, замедляешь его и двигаешь на (425*2) сэмплов влево через SetMediaItemPosition. Только что-то мне кажется, щелчки вряд ли при этом исчезнут))
 
  • Like
Реакции: Beckoff

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.064
113
62
Киев
А можно ли, и как, делать временные паузы в скрипте?
Запускать соответствующий Action - решение понятное, может есть другое, более гибкое решение.
 

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.064
113
62
Киев
Я с этой функцией совсем не разобрался :(
Видел как ты применил её в своём скрипте, но того, что о ней прочёл оказалось для моих мозгов инженера механика не достаточно.
Может пояснишь на конкретном примере и саму суть функции и то, как с её помощью сделать задержку между действиями, например на 2,5 секунды?

Кстати, я пока не проверял, но может скрипт сам проверяет выполнение задаваемых им действий и не начинает вызывать следующую функцию, пока предидущая не отработала?
Это было бы ОЧЕНЬ круто, но думаю этого нет.
Я так понимаю, что такое можно было бы самому организовать в скрипте -
Ну скажем - запускаем функцию вызова конкретного Пресета в конкретном Плагине, а плагин - например Контакт с кучей библиотек, которые подгружаются пару - тройку секунд только.
Вот и нужно нам, чтобы пока Пресет не загрузился Скрипт дальше ничего не делал.

Но это ведь следующей функцией опять должен стоять луп отслеживающий состояние конкретного параметра и пока он не появится не делать дальше ни чего.
Что-то мне подсказывает, что подобный сценарий будет нагружать Рипер в 100 раз больше, чем простая подобранная экперементальным путём пауза. Нет?
 
Последнее редактирование:

EUGEN27771

Well-Known Member
23 Апр 2010
2.293
1.995
113
@Aleksandr Oleynik, понял,о чем.
defer() не сделает на секунды,там нужна работа по условию-например,какое-то состояние изменяется,или еще что либо.
 
  • Like
Реакции: Aleksandr Oleynik

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.064
113
62
Киев
Риперу очень часто становится "плохо" если Экшин или Скрипт отправляет ему серию трудоёмких задач без пауз. Иногда это даже может привести к зависанию Рипера, но почти всегда приводит к артефактам в звуковом тракте, что для меня совершенно не допустимо.

Было бы хорошо конечно найти какой-то более красивый способ ЖДАТЬ выполнения уже отосланной команды, чем просто подобранная пауза..... В общем то такой сценарий не является чем-то сверх естественным, мне казалось он в общем должен быть встроен в функционал штатно. Но видимо это очень не просто - получить подтверждение выполнения любой из функций. Кто знает?
 

nounaim

Active Member
29 Авг 2010
284
52
28
@Aleksandr Oleynik,
скрипт делает задержку и увеличивает rate в 2 раза для 1го выбранного айтема
ifset здесь после выполнения равно 1, думаю так можно проверить выполнение любой команды
PHP:
tm=time_precise();//запись времени в переменную tm (в каких еденицах не понял - system-local timestamp)
function mainloop()//начало функции
(
defer("mainloop();");  //постоянный луп функции mainloop()

tm2=time_precise();  //время в переменной tm2, постоянно меняющаяся переменная, тк работает defer
   tm+3< tm2 ? (  //проверка боьльше ли значение таймера в tm2 чем записанной вначале в статичную tm+3 секунды
       ifset==0 ? (   // проверка равно ли ifset нулю(для связи с проверкой выполнения команды), можно назвать как угодно вместо ifset; любая не заданная переменная будет равна нулю, если не ошибаюсь
       item = GetSelectedMediaItem(0, 0);
       take = GetActiveTake(item);
       ifset=SetMediaItemTakeInfo_Value(take, "D_PLAYRATE",0.5); // установка playrate в 0.5, после выполнения ifset равно 1
       UpdateArrange(); //обновляем арранж
       );
    );
);
mainloop();  //запуск функции
 
Последнее редактирование:
  • Like
Реакции: Aleksandr Oleynik

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.064
113
62
Киев
В скрипте есть ошибки - где-то лишние ); -
PHP:
););
defer("mainloop();"); //постоянный луп функции mainloop()
);
И я честно говоря не пойму как мне это использовать для того чтобы вставить паузу между выполнением функций или отслеживанием контроля их выполнения.
:(
[DOUBLEPOST=1431934376,1431849964][/DOUBLEPOST]Ещё один Общий вопрос, может кто раскопал -
Можно ли при помощи скрипта производить изменения в листинге других скриптов?
Например создать скрипт с запросами Пользователю, при заполнении полей которых, происходила бы корректировка в других скриптах (изменения в тексте).

PS: Вроди как есть функции -
PHP:
EEL: fgets(fp,#str)

//Reads a line from file fp into #str. Returns length of #str read.
и -

PHP:
EEL: fprintf(fp,"format"[,...])

//Formats a string and writes it to file fp. For more information on format specifiers, see sprintf(). Returns bytes written to file.
Но как их Реально использовать - фиг его знает.... :(

Было бы круто разобраться с этим, я бы тогда на основе EEL Скрипта сделал Пользовательский (ПРОСТОЙ) интерфейс создания своего собственного Концертного Сэтапа. Не пришлось бы писать длинных инструкций куда и что прописывать, что и где линковать и прочее..... - Просто контекстные вопросы последовательные и в результате ответов - Отстроенный под Пользователя Проект.
КРУТО было-бы. Может кто возьмётся помочь? Михаил, Женя?
Я как только въеду - дальше сам всю рутину сделаю.
 
Последнее редактирование:

Tito

Active Member
17 Янв 2005
236
60
28
56
Питер
Посетить сайт
Вот еще скрипт,изменяет входной миди-канал трека и все миди-сообщения на 10-й канал,из главного окна.
В скрипте есть строчка MIDIEditor_OnCommand(active_MIDI_editor, 40029); // ME action: "Set Chann 10"
А если я хочу вызвать питоновский скрипт (из экшнов миди редактора),например:
MIDIEditor_OnCommand(active_MIDI_editor, _e2c73c812b23e34082db41ed5b8f9d72); -напрямую не работает.Как поступить?
 

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.064
113
62
Киев
А если я хочу вызвать питоновский скрипт (из экшнов миди редактора),например:
MIDIEditor_OnCommand(active_MIDI_editor, _e2c73c812b23e34082db41ed5b8f9d72); -напрямую не работает.Как поступить?
Женя уже мне отвечал по подобным командам -
MIDIEditor_OnCommand(NamedCommandLookup(" _e2c73c812b23e34082db41ed5b8f9d72"), 0);

Ну или в контексте названного скрипта видимо так -

MIDIEditor_OnCommand(active_MIDI_editor, NamedCommandLookup(" _e2c73c812b23e34082db41ed5b8f9d72"));
 
  • Like
Реакции: Tito

EUGEN27771

Well-Known Member
23 Апр 2010
2.293
1.995
113
да,это как бы расшифровка,чтобы скрипт работал независимо от пользовательских имен
 
  • Like
Реакции: Tito

Tito

Active Member
17 Янв 2005
236
60
28
56
Питер
Посетить сайт
Что-то не хочет выполнять скрипт из экшнов миди эдитора.Ставлю команду,всё ок.Скрипт ни в какую.
Для простоты подставил ID скрипта midi velocity tools.
PHP:
function do_actions_from_main_and_midi_sections()
(
 
   command_name1 = NamedCommandLookup("_SWS_SELTRKWITEM");//Get non-native action command_name
 
   Main_OnCommand(command_name1, 0); // MAIN section action "Sel track with selected Item"
   Main_OnCommand(40153, 0); // MAIN section action "open selected item in MIDI editor"
 
   active_MIDI_editor = MIDIEditor_GetActive(); //get MIDI editor ID
 
 
   MIDIEditor_OnCommand(active_MIDI_editor, 40006); // ME action: "Sel all Events"
   MIDIEditor_OnCommand(active_MIDI_editor, NamedCommandLookup("_0ac6d5686f577a49afa0c2b940a687c9")); // ME action: "Run midi velocity tools"
 
   MIDIEditor_OnCommand(active_MIDI_editor, 2); // ME action: "Close MEditor"
 
  
 
);
 
do_actions_from_main_and_midi_sections();
 

abrokadabra2

Member
2 Дек 2014
85
16
8
temirtau
люди добры привет ответе на 1 вопрос почему при копирования скрипта еел кода в рипер он пишет ошибку error питон стоит скрипты читает а с ода копи не загружает ?
 

nounaim

Active Member
29 Авг 2010
284
52
28
@Aleksandr Oleynik, паузу сделать можно, а вот как сделать проверку выполнения всей функции самому интересно, вы бы скрипт прислали, может получиться чего с ним сделать
 

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.064
113
62
Киев
я создаю копирую пишу eel c точкой как положено он выдает error при сохранени файла
Вы 5-ый рипер используете? EEL работает только в 5-ом
[DOUBLEPOST=1432069009,1432068889][/DOUBLEPOST]
@Aleksandr Oleynik, file fp - это что за зверь?
Так по вашей ссылке изучаю, ищу - там этот функционал описан.
[DOUBLEPOST=1432069089][/DOUBLEPOST]
@Aleksandr Oleynik, паузу сделать можно, а вот как сделать проверку выполнения всей функции самому интересно, вы бы скрипт прислали, может получиться чего с ним сделать
ОК, доделаю - пришлю. Времени вот только мало свободного. :(
 

@Michael

Well-Known Member
14 Дек 2010
969
1.461
93
Орёл / Москва
Я так и не нашёл там что это.
Вот ещё сегодня сварганил дублирование итемов как в кубе было, или в FL, не помню уже)) Вообщем, c учётом расположения айтемов в сетке:
EEL
PHP:
function smart_duplicate_items_inputvrs()
(
   Undo_BeginBlock();
 
   #inputdata = "1";
   GetUserInputs("Copy items N times", 1, "N = ", #inputdata);
   match("%d", #inputdata, Nval);
   
   count_sel_items = CountSelectedMediaItems(0);
    
   first_item = GetSelectedMediaItem(0, 0);
   first_item_start = GetMediaItemInfo_Value(first_item, "D_POSITION");
   
   i = 0;
   item_end_max0 = 0;
   loop(count_sel_items,
     item = GetSelectedMediaItem(0, i);
     item_pos = GetMediaItemInfo_Value(item, "D_POSITION");
     item_len = GetMediaItemInfo_Value(item, "D_LENGTH");
     item_end = item_pos + item_len;
     item_end_max = max(item_end, item_end_max0);
     item_end_max0 = item_end_max;
     i += 1;
   );
 
   last_item_end = item_end_max0;
     
   com_len = last_item_end - first_item_start;
   com_len_qn = TimeMap2_timeToQN(0, com_len)/4;
   com_len_round_qn = ceil (com_len_qn);  
   
   ApplyNudge(0, 0, 5, 16, com_len_round_qn, 0, Nval);
   Undo_EndBlock("smart_duplicate_items_inputvrs", 0);
);

PreventUIRefresh(1);
smart_duplicate_items_inputvrs();
PreventUIRefresh(-1);

UpdateArrange();
 
Последнее редактирование:

nounaim

Active Member
29 Авг 2010
284
52
28
@@Michael, а если автоматизировать rate с включенным preserve pitch то щелчков нету, и если при этом автоматизировать pitch shift не получиться ли тот самый питч бэнд эффект как в сэмплере во фруктах например?
 

@Michael

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

Есть другой путь.
Итак, твои действия:
1. Дробишь руками/кастомэкшном/скриптом айтем на как можно большее количество кусков.
2. Для всех выставляешь preserve pitch, timebase (position, beats, length).
3. Рулишь огибающую темпа. Не забывай на точке, с которой идёт спад, указать gradually transition tempo to next marker.
На всякий случай написал в FeatureRequest.
 
Последнее редактирование:
  • Like
Реакции: Slick

nounaim

Active Member
29 Авг 2010
284
52
28
@@Michael,я не совсем понял о чем реквест, мне бы хотелось рулить этот эффект по разному для разных айтемов независимо от огибающей темпа; и гдеможно указать gradually transition tempo to next marker? нашёл что то в экшенах но там много их .
 

@Michael

Well-Known Member
14 Дек 2010
969
1.461
93
Орёл / Москва
@nounaim, это галка в темпомаркере. Суть в том, что сейчас если темп изменяется плавно, то айтем стретчится к общему времени, получившемуся в результате стретча. А должен стретчится грубо говоря под каждую мнимую точку на огибающей темпа.
Я, честно говоря, не вижу даже креативных причин автоматизировать playrate каждого айтема. Проекта ещё возможно. Но автоматизировать рейт каждого айтема...
 
Последнее редактирование:

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.064
113
62
Киев
Я так и не нашёл там что это.
Так я тоже не нашёл, просто по контексту самих функций предполагаю, что
fgets(fp,#str)//Reads a line from file fp into #str. Returns length of #str read.
и
fprintf(fp,"format"[,...])//Formats a string and writes it to file fp. For more information on format specifiers, see sprintf(). Returns bytes written to file.
может быть то, что нужно для чтения строк в файле и записи их.
 

nounaim

Active Member
29 Авг 2010
284
52
28
playrate каждого айтема
,
не имел ввиду автоматизайцию всех айтемов, но я бывало во фруктах например для разных нот если они аудио рисовал разные огибающие, которые не меняют общий темп, в рипере это пока сделать проблематично без дополнительных инструментов.
поддержал реквест.
 
Последнее редактирование:

Slick

IDDQD
13 Май 2008
2.088
1.040
113
38
Москва, Переделкино
www.vk.com
Суть в том, что сейчас если темп изменяется плавно, то айтем стретчится к общему времени, получившемуся в результате стретча.
в том же лоджике так работает. то есть если айтем привязан ко времени, то как не автоматизируй темпотрек - айтем под него ускоряется/замедляется. не хватает этой фичи...
 

nounaim

Active Member
29 Авг 2010
284
52
28
подскажите кто нибудь как вызвать окно Reascript task control window в 5м рипере,
 
Последнее редактирование:

EUGEN27771

Well-Known Member
23 Апр 2010
2.293
1.995
113
@nounaim, это окно вылазит,когда скрипт уже работает в фоне,а его пытаются вызвать повторно.Окно и в 5-ке есть.
 

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