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

  • Автор темы Автор темы drzhnn
  • Дата начала Дата начала
Вот представь, что ты - рипер. Идёшь ты по сэмплу эдит курсором/плей курсором. Вдруг тебе говорят, что этот сэмпл должен проигрываться в (два) раза медленнее. Ты быстренько считываешь позицию (пусть это будет 425-й сэмпл), по которой проходишь в данный момент. Обсчитываешь сэмпл, замедляешь его и двигаешь на (425*2) сэмплов влево через SetMediaItemPosition. Только что-то мне кажется, щелчки вряд ли при этом исчезнут))
 
  • Like
Реакции: Beckoff
А можно ли, и как, делать временные паузы в скрипте?
Запускать соответствующий Action - решение понятное, может есть другое, более гибкое решение.
 
Я с этой функцией совсем не разобрался :(
Видел как ты применил её в своём скрипте, но того, что о ней прочёл оказалось для моих мозгов инженера механика не достаточно.
Может пояснишь на конкретном примере и саму суть функции и то, как с её помощью сделать задержку между действиями, например на 2,5 секунды?

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

Но это ведь следующей функцией опять должен стоять луп отслеживающий состояние конкретного параметра и пока он не появится не делать дальше ни чего.
Что-то мне подсказывает, что подобный сценарий будет нагружать Рипер в 100 раз больше, чем простая подобранная экперементальным путём пауза. Нет?
 
Последнее редактирование:
@Aleksandr Oleynik, понял,о чем.
defer() не сделает на секунды,там нужна работа по условию-например,какое-то состояние изменяется,или еще что либо.
 
  • Like
Реакции: Aleksandr Oleynik
Риперу очень часто становится "плохо" если Экшин или Скрипт отправляет ему серию трудоёмких задач без пауз. Иногда это даже может привести к зависанию Рипера, но почти всегда приводит к артефактам в звуковом тракте, что для меня совершенно не допустимо.

Было бы хорошо конечно найти какой-то более красивый способ ЖДАТЬ выполнения уже отосланной команды, чем просто подобранная пауза..... В общем то такой сценарий не является чем-то сверх естественным, мне казалось он в общем должен быть встроен в функционал штатно. Но видимо это очень не просто - получить подтверждение выполнения любой из функций. Кто знает?
 
@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
В скрипте есть ошибки - где-то лишние ); -
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 Скрипта сделал Пользовательский (ПРОСТОЙ) интерфейс создания своего собственного Концертного Сэтапа. Не пришлось бы писать длинных инструкций куда и что прописывать, что и где линковать и прочее..... - Просто контекстные вопросы последовательные и в результате ответов - Отстроенный под Пользователя Проект.
КРУТО было-бы. Может кто возьмётся помочь? Михаил, Женя?
Я как только въеду - дальше сам всю рутину сделаю.
 
Последнее редактирование:
Вот еще скрипт,изменяет входной миди-канал трека и все миди-сообщения на 10-й канал,из главного окна.
В скрипте есть строчка MIDIEditor_OnCommand(active_MIDI_editor, 40029); // ME action: "Set Chann 10"
А если я хочу вызвать питоновский скрипт (из экшнов миди редактора),например:
MIDIEditor_OnCommand(active_MIDI_editor, _e2c73c812b23e34082db41ed5b8f9d72); -напрямую не работает.Как поступить?
 
А если я хочу вызвать питоновский скрипт (из экшнов миди редактора),например:
MIDIEditor_OnCommand(active_MIDI_editor, _e2c73c812b23e34082db41ed5b8f9d72); -напрямую не работает.Как поступить?
Женя уже мне отвечал по подобным командам -
MIDIEditor_OnCommand(NamedCommandLookup(" _e2c73c812b23e34082db41ed5b8f9d72"), 0);

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

MIDIEditor_OnCommand(active_MIDI_editor, NamedCommandLookup(" _e2c73c812b23e34082db41ed5b8f9d72"));
 
  • Like
Реакции: Tito
да,это как бы расшифровка,чтобы скрипт работал независимо от пользовательских имен
 
  • Like
Реакции: Tito
Что-то не хочет выполнять скрипт из экшнов миди эдитора.Ставлю команду,всё ок.Скрипт ни в какую.
Для простоты подставил 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();
 
люди добры привет ответе на 1 вопрос почему при копирования скрипта еел кода в рипер он пишет ошибку error питон стоит скрипты читает а с ода копи не загружает ?
 
@Aleksandr Oleynik, паузу сделать можно, а вот как сделать проверку выполнения всей функции самому интересно, вы бы скрипт прислали, может получиться чего с ним сделать
 
я создаю копирую пишу eel c точкой как положено он выдает error при сохранени файла
Вы 5-ый рипер используете? EEL работает только в 5-ом
[DOUBLEPOST=1432069009,1432068889][/DOUBLEPOST]
@Aleksandr Oleynik, file fp - это что за зверь?
Так по вашей ссылке изучаю, ищу - там этот функционал описан.
[DOUBLEPOST=1432069089][/DOUBLEPOST]
@Aleksandr Oleynik, паузу сделать можно, а вот как сделать проверку выполнения всей функции самому интересно, вы бы скрипт прислали, может получиться чего с ним сделать
ОК, доделаю - пришлю. Времени вот только мало свободного. :(
 
Я так и не нашёл там что это.
Вот ещё сегодня сварганил дублирование итемов как в кубе было, или в 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();
doc12997633_392340808
 
Последнее редактирование:
@@Michael, а если автоматизировать rate с включенным preserve pitch то щелчков нету, и если при этом автоматизировать pitch shift не получиться ли тот самый питч бэнд эффект как в сэмплере во фруктах например?
 
@nounaim , сам подумай: то ты, уменьшая рейт в два раза, просто читаешь каждый сэмпл (микроуровень) по два раза (не совсем так конечно), а то ты читаешь по два раза -> транспонируешь его в исходный питч->возвращаешь его в другой питч. Учитывая всякие допуски алгоритмов стретча, мне кажется, будет непонятно что в итоге.

Есть другой путь.
Итак, твои действия:
1. Дробишь руками/кастомэкшном/скриптом айтем на как можно большее количество кусков.
2. Для всех выставляешь preserve pitch, timebase (position, beats, length).
3. Рулишь огибающую темпа. Не забывай на точке, с которой идёт спад, указать gradually transition tempo to next marker.
На всякий случай написал в FeatureRequest.
 
Последнее редактирование:
  • Like
Реакции: Slick
@@Michael,я не совсем понял о чем реквест, мне бы хотелось рулить этот эффект по разному для разных айтемов независимо от огибающей темпа; и гдеможно указать gradually transition tempo to next marker? нашёл что то в экшенах но там много их .
 
@nounaim, это галка в темпомаркере. Суть в том, что сейчас если темп изменяется плавно, то айтем стретчится к общему времени, получившемуся в результате стретча. А должен стретчится грубо говоря под каждую мнимую точку на огибающей темпа.
Я, честно говоря, не вижу даже креативных причин автоматизировать playrate каждого айтема. Проекта ещё возможно. Но автоматизировать рейт каждого айтема...
 
Последнее редактирование:
Я так и не нашёл там что это.
Так я тоже не нашёл, просто по контексту самих функций предполагаю, что
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.
может быть то, что нужно для чтения строк в файле и записи их.
 
playrate каждого айтема
,
не имел ввиду автоматизайцию всех айтемов, но я бывало во фруктах например для разных нот если они аудио рисовал разные огибающие, которые не меняют общий темп, в рипере это пока сделать проблематично без дополнительных инструментов.
поддержал реквест.
 
Последнее редактирование:
Суть в том, что сейчас если темп изменяется плавно, то айтем стретчится к общему времени, получившемуся в результате стретча.
в том же лоджике так работает. то есть если айтем привязан ко времени, то как не автоматизируй темпотрек - айтем под него ускоряется/замедляется. не хватает этой фичи...
 
подскажите кто нибудь как вызвать окно Reascript task control window в 5м рипере,
 
Последнее редактирование:
@nounaim, это окно вылазит,когда скрипт уже работает в фоне,а его пытаются вызвать повторно.Окно и в 5-ке есть.
 

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