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

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.064
113
62
Киев
#tempstr может и не надо писать в скобках, попробуйте.
Да, не нужно!
Этот скрипт работает как нужно - Очень Круто! Это реальная Элегантность в написании кода - спасибо!
[DOUBLEPOST=1434289779,1434288277][/DOUBLEPOST]Вот сделал то-же, но для изменения величины параметра плагина на треке -
PHP:
function setparamvol()
(
match("%s, %d, %d, %f", #tempstr, #trackname, effect_id, param_id, param_vol);
GetExtState(#trackguid, "TrackGUID", #trackname);
track = extension_api("BR_GetMediaTrackByGUID", 0, #trackguid);
i = effect_id - 1;
c = param_id - 1;
TrackFX_SetParam(track, i, c, param_vol);
);

#tempstr = "KEY01_P1, 2, 5, 0.2"; // trackname, порядковый номер эффекта, порядковый номер параметра, величина параметра
setparamvol();

#tempstr = "KEY01_P4, 2, 5, 0.05"; // trackname, порядковый номер эффекта, порядковый номер параметра, величина параметра
setparamvol();
Вроде работает, но я не уверен, что верно для значения величины параметра (который может быть и 0.005) задал - %f
Но то, что не %d - это я понял - так как тогда только целые значения скрипт принимает.
 
Последнее редактирование:

@Michael

Well-Known Member
14 Дек 2010
969
1.461
93
Орёл / Москва
  • %% = %
  • %s = string from parameter
  • %d = parameter as integer
  • %i = parameter as integer
  • %u = parameter as unsigned integer
  • %x = parameter as hex (lowercase) integer
  • %X = parameter as hex (uppercase) integer
  • %c = parameter as character
  • %f = parameter as floating point
  • %e = parameter as floating point (scientific notation, lowercase)
  • %E = parameter as floating point (scientific notation, uppercase)
  • %g = parameter as floating point (shortest representation, lowercase)
  • %G = parameter as floating point (shortest representation, uppercase)
  • %.10s = string, but only print up to 10 characters
  • %-10s = string, left justified to 10 characters
  • %10s = string, right justified to 10 characters
  • %+f = floating point, always show sign
  • %.4f = floating point, minimum of 4 digits after decimal point
  • %10d = integer, minimum of 10 digits (space padded)
  • %010f = integer, minimum of 10 digits (zero padded)
 
  • Like
Реакции: Aleksandr Oleynik

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.064
113
62
Киев
Я это нашёл, но это не сильно мне помогло для 100% понимания :)
Не, ну раз у меня значение с точкой (запятой) и без фиксированного числа разрядов после запятой, то я и выбрал %f - верно?
 
Последнее редактирование:

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.064
113
62
Киев
Сделал скрипт, который работает и с параметрами и с пресетами, просмотрите, нет ли ошибок или чего лишнего -
PHP:
function setparamvol()
(
match("%s, %d, %d, %f", #tempstr1, #trackname, effect_id, param_id, param_vol);
match("%s, %d, %s", #tempstr2, #trackname, effect_id2, #preset);
GetExtState(#trackguid, "TrackGUID", #trackname);
track = extension_api("BR_GetMediaTrackByGUID", 0, #trackguid);
i = effect_id - 1;
a = effect_id2 - 1;
c = param_id - 1;
TrackFX_SetParam(track, i, c, param_vol);
TrackFX_SetPreset(track, a, #preset);
);

#tempstr1 = "KEY01_P1, 2, 5, 0.2"; // trackname, порядковый номер эффекта, порядковый номер параметра, величина параметра
setparamvol();

#tempstr1 = "KEY01_P4, 2, 5, 0.05"; // trackname, порядковый номер эффекта, порядковый номер параметра, величина параметра
setparamvol();

#tempstr2 = "KEY01_P1, 3, P004"; // trackname, порядковый номер эффекта, presetname
setparamvol();
PS: Нашёл ошибку - не корректно работает если param_id один на оба варианта функций
 
Последнее редактирование:

@Michael

Well-Known Member
14 Дек 2010
969
1.461
93
Орёл / Москва
Так вы проверьте. Я следую простому принципу - если всё работает, то лучше ничего больше не трогать))
GetExtState же только в вашем проекте работает, в одиночку он бессмыслен.
Но в целом вроде всё верно.
 
  • Like
Реакции: Aleksandr Oleynik

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.064
113
62
Киев
После того как для функции Пресета я ввёл -
a = effect_id2 - 1;
всё заработало как нужно без сбоев.


Я себе сделал кнопку сохранения проекта, в которой интегрирован Скрипт Ваш по сохранению GUID имён треков - если что-то в Проекте добовляется, я так понимаю идентификаторы дописываются?

А как стереть (обновить) данные?
Оператором - DeleteExtState?
 

@Michael

Well-Known Member
14 Дек 2010
969
1.461
93
Орёл / Москва
Опять же, попробуйте. Это намного быстрее, чем постоянно спрашивать))
Полагаю, при перезаписи SetExtState затирает ячейку, DeleteExtState её удаляет.
 

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.064
113
62
Киев
Опять же, попробуйте. Это намного быстрее, чем постоянно спрашивать))
Михаил, вы меня безусловно извините, что нависаю - но у вас уже есть определённый статус на Форуме - по этому и спрашиваю. :)
Попробовать то я Пробую, но это совсем не означает, что результат очевиден...
Попробовал - вроде всё как подсказывает логика, но фиг его знает.....
[DOUBLEPOST=1434353510,1434309850][/DOUBLEPOST]Пытаюсь сообразить - есть ли возможность скриптом задать изменение внешнего параметра (любого, например параметра плагина) не скачкообразно, а плавно с возможностью менять время, в течении которого значение переходит из начального в конечное. Закон изменения может быть пока линейным.
Может кто знает?
 
Последнее редактирование:

@Michael

Well-Known Member
14 Дек 2010
969
1.461
93
Орёл / Москва
.lua
PHP:
track = reaper.GetTrack(0,0)
a = reaper.GetMediaTrackInfo_Value(track, "D_VOL") -- get volume
b_set = 1 -- final value
time_to_change = 2 -- time

b = b_set - a 
function timer()
time2 = reaper.time_precise()
time_delta = time2 - time1
x = time_delta / time_to_change
b0 = b*x
time_con = true
if time_con == true then
  if time2 - time1 < time_to_change then
   time_con = true
   reaper.defer(timer)
   set = a + b0
   reaper.SetMediaTrackInfo_Value(track, "D_VOL", set)
   else
   time_con = false
  end
end
end
time1 = reaper.time_precise()
timer()
 

Вложения

  • 655,7 KB Просмотры: 281
  • Like
Реакции: Aleksandr Oleynik

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.064
113
62
Киев
Михаил - Круто!
Но влазить ещё и в lua у меня мозги рухнут точно :(
А тоже в EEL?
И на сколько я понял -
b_set = 1 -- final value = 0dB
А если -inf dB?
Или -100 dB
 

@Michael

Well-Known Member
14 Дек 2010
969
1.461
93
Орёл / Москва
Это только принцип)) Есть тонна нюансов. С самими значениями ещё можно что-то придумать. Гораздо большую проблему представляет собой использование таймера, он выбрасывает разные значения, поэтому придётся подумать над тем, как его использовать для точных конечных значений. На гифке это видно.

Хотя мне кажется, есть немного другой способ решения, но его надо тестировать. (условие + приращение переменной + расчёт среднего времени выполнения Рипером строчки скрипта - без понятия насколько криво это работать будет)
 

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.064
113
62
Киев
В JS- е все события связанные со временем привязывают обычно к Сэмплу - который в своё время (товтология) связан с сэмплрэйтом.
Но там это вроди работает как часы (опять :) ).
Не знаю - может и в EEL есть привязка к сэмплу?
 

@Michael

Well-Known Member
14 Дек 2010
969
1.461
93
Орёл / Москва
Мысль хорошая! Не знаю насчёт аудио, но можно попробовать использовать какую-либо функцию из GetPlayPosition.
 

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.064
113
62
Киев
Это только принцип)) Есть тонна нюансов. С самими значениями ещё можно что-то придумать. Гораздо большую проблему представляет собой использование таймера, он выбрасывает разные значения, поэтому придётся подумать над тем, как его использовать для точных конечных значений. На гифке это видно.
Думаю, что для точных конечных значений всё равно в конце выполнения заданного параметра нужно делать его корректировку-сравнение с этим самым параметром. Не точность конечная в пределах второго знака, так что это не страшно в общем-то, но лучше корректировку делать в конце выполнения кода.
В JS (я проверил) тоже есть не точность выхода на заданный параметр и её тоже нужно в конце устранять.
Хотя мне кажется, есть немного другой способ решения, но его надо тестировать. (условие + приращение переменной + расчёт среднего времени выполнения Рипером строчки скрипта - без понятия насколько криво это работать будет)
Не...... нельзя использовать величины, которыми нельзя управлять и которые могут меняться не предсказуемо (от мощности процессора, например).
Работая со звуком (миди) в DAW у нас есть достаточно точный прибор - кварц аудио карты - его и использовать нужно, если это возможно.
Хотя, для большинства задач точность значения времени исполнения не столь важна (нужно в принципе иметь возможность время исполнения просто менять от милисекунд до секунд), более важным есть точность выполнения заданного параметра (ну вот как в вашем примере - достижение фейдером значения 0 dB). Как в конце выходить точно на заданный параметр, как вариант я описал выше - в конце исполнения кода делать сравнение параметра с заданным и (скачкообразно?) его менять.

PS: вообще-то странно, что такая важная функция как время отсутствует как точный параметр в скриптах. :( Может пообщаться с зубрами на оф. Форуме?
 
Последнее редактирование:

@Michael

Well-Known Member
14 Дек 2010
969
1.461
93
Орёл / Москва
Код:
такая важная функция как время отсутствует как точный параметр в скриптах
time precise выбрасывает время, я и говорю о том, что оно нестабильно.
Я тоже задался вашим вопросом и вот что мне ответил Xenakios:

The defer-calls are made with a timer in Reaper that runs in the GUI thread, so you are not guaranteed a stable time interval between the calls. You need to figure out some solution that doesn't depend on the timing of the defer-call being consistent.
Так что про время можно забыть, у нас в данном случае два точных ориентира - позиция и аудиоисполнение. Можно ещё попробовать приращать переменную сверхмалыми значениями, пока она не достигнет указанного значения"
 

EUGEN27771

Well-Known Member
23 Апр 2010
2.293
1.995
113
Можно ли средствами скрипта сымитировать нажатие клавиши на клавиатуре?Например,ctrl+alt или других подобных?
 

@Michael

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

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.064
113
62
Киев
Парни, чувствую себя дебилом, но не могу написать формулу равной громкости, помогите.
Есть слайдер управляющий громкостью на канале 1-2 (например от минус 100 dB до 0 dB, нужна формула вычисляющая положение второго слайдера управляющего громкостью на канале 3-4 таким образом, чтобы сумма двух каналов (микс) была всегда 0 dB.
В общем кросфейд такой себе.
Это для JS-а естественно.
 
Последнее редактирование:

nounaim

Active Member
29 Авг 2010
285
52
28
а как то можно переименовывать файлы с помощью eel? у меня не получилось с помощью fwrite:(
сделал простенький скрипт перемещающий треки после рендера в низ треков, немного напрягает меня это stem в именах

PHP:
//render area of selected tracks
main_oncommand(41716,0);
//cut tracks
main_oncommand(40337,0);
//last track
trcount=CountTracks(0);
lasttr=GetTrack(0, trcount-1);
SetMediaTrackInfo_Value(lasttr, "I_SELECTED",1);
//paste
main_oncommand(40058,0);
 
Последнее редактирование:

@Michael

Well-Known Member
14 Дек 2010
969
1.461
93
Орёл / Москва
Из децибелов первого взять экспоненту, вычесть единицу, взять модуль и вернуть логарифмом децибелы (если надо конечно децибелы возвращать).
 
Последнее редактирование:
  • Like
Реакции: Aleksandr Oleynik

Aleksandr Oleynik

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

GetExtState(#trackguid, "TrackGUID", "S1");
tr = extension_api("BR_GetMediaTrackByGUID", 0, #trackguid);

А теперь мне нужно наверное считать значения этого конкретного параметра ?
TrackFX_GetParam(tr, 0, 5, minvalOut, maxvalOut);
А дальше ступор.
у 5-го параметра значения могут быть от 0 до 1
И мне нужно чтобы скрипт запустил определённый Экшин, если этот параметр = например 0
Как написать следующую строку?
match(0,valOut)?
(
ну и дальше функцию писать нужную для запуска того, что нужно запускать.
);

Так не работает. :(
 

EUGEN27771

Well-Known Member
23 Апр 2010
2.293
1.995
113
TrackFX_GetParam()-как я понимаю,считывает не текущее значение,а возможные макс. и мин. значения определенного параметра.
Нужно TrackFX_GetParamNormalized(),например.
 

tosh

Active Member
5 Окт 2005
525
147
43
Кременчуг UA
Парни привет. Подскажите, пожалуйста, к скрипту Жени пытаюсь добавить еще две команды (свой custom action и стандартную команду), стандартная команда срабатывает, а custom нет... Что я делаю не так?

Код:
function Open_Item_and_Zoom_to_Content()
(
   Main_OnCommand(40153, 0); // MAIN section action 40153: "open selected item in MIDI editor"
   active_MIDI_editor = MIDIEditor_GetActive(); // Now the MIDI editor is opened -> get MIDI editor ID

   MIDIEditor_OnCommand(active_MIDI_editor, 40466); // ME action: "zoom to content"

   MIDIEditor_OnCommand(active_MIDI_editor, _cf13e58d303dc541bd14eed46abbf6fd); // ME action: "my custom action"

   MIDIEditor_OnCommand(active_MIDI_editor, 40003); // ME action: "select all notes"
);

Open_Item_and_Zoom_to_Content();
 

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.064
113
62
Киев
Вообще-то, если это EEL, то для стандартных Action пишут -
PHP:
MIDIEditor_OnCommand(40466,0);
А для Custom -
PHP:
MIDIEditor_OnCommand(NamedCommandLookup("_cf13e58d303dc541bd14eed46abbf6fd"), 0);
[DOUBLEPOST=1434913746,1434912777][/DOUBLEPOST]
ValOut == 0 ? (
если равен
) : (
если не равен
);
Михаил, я это тоже пробовал - не заработало
TrackFX_GetParam()-как я понимаю,считывает не текущее значение,а возможные макс. и мин. значения определенного параметра.
Нужно TrackFX_GetParamNormalized(),например.
А это в самом деле работает! Спасибо!
Вот так -
TrackFX_GetParamNormalized(tr, 0, 5) == 0?
(
если равен
);


Парни, а в каких целях тогда может быть использовано - TrackFX_GetParam()?
 
  • Like
Реакции: tosh

EUGEN27771

Well-Known Member
23 Апр 2010
2.293
1.995
113
Парни, а в каких целях тогда может быть использовано - TrackFX_GetParam()?
Видимо,узнать допустимые значения,и если,например,устанавливаемое значения выходит за пределы границ допустимого-поставить рамки.
 

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