ReaScripts (скрипты для Reaper) - делимся

Странно, первая версия заработала сразу, на второй пишет
Warning: @Import could not open 'inc/AudioFunctions.eel'
Warning: @Import could not open 'inc/MiniGui.eel'
Warning: @Import could not open 'inc/Presets.eel'
gen_Envelope-based Compressor v2.eel:26: 'Thresh.DW_New' undefined: 'Thresh.DW_New(1, "Slider", "V", 40,30,20,250, r,g,b,a, "Th'

SWS последней версии. upd : из папки inc все скрипты тоже нужно добавить ?

Всё работает ! Автору респект.

А куда эти скрипты из папки Inc добавить конкретно? Туда же куда и основной скрипт Envelope-based Compressor?
Или текста этих скриптов скопировать в текст основного скрипта Envelope-based Compressor?
 
@Iskander M, их не из папки, а вместе с папкой Inc и папкой над этой папкой следует положить в папку Скриптов Рипера. При этом «проинсталить» нужно только основной скрипт.
Это модули без которых основной скрипт работать не будет.
 
Написал такой колхозный скрипт (только начал программировать), но пока это лучшее, что есть для подгона сетки под стретч маркеры, которые в свою очередь можно выставить по транзиентам. Собственно в сравнении с SWS/BR: Create project markers from stretch markers in selected items в связке с SWS/BR: Convert project markers to tempo markers... как-то правильней работает, несмотря на отсутствие настроек, т.к. работает по принципу move closest grid. Собственно если стретч-маркеры стоят по сильны долям, и если есть периодически между ними разрывы (допустим маркеры стоят на расстоянии 2/3/4 доли друг от друга, но не сильно дальше), и если исходный темп проекта не сильно отличается (не вдвое), подгон будет правильным с большой вероятностью. Если же такую ситуацию решить SWS методом, то там, где маркеров не будет, не будет и сетки, что отличает алгоритм работы, и по мне не в лучшую сторону. Здесь же на примере песни средний темп определен, как 118 и сетка равномерно подогналась. Целесообразно также сетку ставить на четверти.
Код:
script_title = "Tempo detection"

function main()
  selitem = reaper.GetSelectedMediaItem(0,0)
  take = reaper.GetActiveTake(selitem)
  count =  reaper.CountSelectedMediaItems()
  num = reaper.GetTakeNumStretchMarkers(take)
  result = num*count

  cursor_position = reaper.GetCursorPosition()
  startTime, endTime = reaper.BR_GetArrangeView(0)
  reaper.CSurf_OnZoom( 100,0 )
  reaper.Main_OnCommand(41173, 0)
  reaper.Main_OnCommand(40433, 0)
  for i = 1, result do
   reaper.Main_OnCommand (41860, 0)
   commandID = reaper.NamedCommandLookup("_BR_MOVE_GRID_TO_EDIT_CUR")
   reaper.Main_OnCommand(commandID, 0)
  end
  reaper.SetEditCurPos(  cursor_position, 0, 0)
  reaper.BR_SetArrangeView(0, startTime, endTime )
end

reaper.Undo_BeginBlock()
reaper.PreventUIRefresh(1)
main()
reaper.UpdateArrange()
reaper.PreventUIRefresh(-1)
reaper.Undo_EndBlock(script_title,-1)

Пытался его немного автоматизировать по скорости, если несколько выделенных айтемов, и вроде получилось, если сделать count takes вместо count items, но почему-то неправильно тогда работает. Вообще надо писать хороший скрипт на эту тему, возможно даже без использования стретч маркеров, а с учетом ручного транзинета детекшиона
Гиф
2018-06-14_16-04-05.gif
 
Последнее редактирование:
@borisuperful, по транзиентам - там еще фильтр поставить на детектор - будет хорошо. Я не делал, если есть желание - просто возьмите фильтр из каких-то других скриптов, из моих же, например, будет намного эффективнее, это точно, проверено.
Сам по себе принцип детектирования у меня предельно простой - быстрая огибающая, медленная огибающая, и разница между ними.
Я пробовал с разными огибающими, rms, разное время атаки, релиза, что угодно. Все это херня, самый большой профит дает СБРОС ПОСЛЕ СРАБАТЫВАНИЯ!
Тут нужно понять, как все работает - всего один раз понять. Дальше - все очень просто.
 
@EUGEN27771, да, спасибо, кстати с несколькими айтемами я таким образом решил. Это по поводу скрипта вашего для проставления маркеров (когда-то задавал вопрос)
Код:
function MAIN()
local(j, item, srate, Threshold_dB, Sensitivity_dB, Retrig_sec)
(
  Undo_BeginBlock();
  Main_OnCommand(41844, 0);  // remove old str-marks(All)
  PreventUIRefresh(1);
  j = 0;
  loop(CountSelectedMediaItems(0),
    item = GetSelectedMediaItem(0, j);
    j += 1;
    item ? (
      //-- Detection settings --
      srate = 44100;
      Threshold_dB   = Thresh.val;
      Sensitivity_dB = Sens.val;
      Retrig_sec     = Retrig.val/1000;
      //------------------------
      start = time_precise();
      DetectTransients(item, srate, Threshold_dB, Sensitivity_dB, Retrig_sec);
      //ShowConsoleMsg(sprintf(#, "%f \n", time_precise()-start); );
    );
  );
  PreventUIRefresh(-1);
  Undo_EndBlock("Add stretch markers at transients",-1);
);
Если блок графики добавить до remove old str-marks(All), то получается феншуйно, плавненько, но визуально не очень удобно видеть новые маркеры после старых :)
 
Последнее редактирование:
@borisuperful, наверное, помудрю потом, сделаю детектор с фильтром и доп. настройками.
Кстати, я знаю что даже такой простой вариант будет работать, он будет прекрасно работать и в реал-тайм, для чего изначально и предназначен.
Никаких проблем - я старался;)
--------------------------------------
Хочу спросить - интересен ли Вам EEL?
Есть много интересных вещей, заинтересованность решает.
---------------------
Ко мне обращайтесь на "ты".
(Я же не старик, напротив, совсем молодой;))
 
@EUGEN27771, мне интересно все, что касается скриптинга рипера, но мне еще нужно основ программирования нахвататься :) Еще конечно документация по API не такая подробная, как хотелось.
 
Это же тема про скрипты. Хочу пару слов про EEL. Конечно, по сравнению с Lua корявенько - с точки зрения программинга.
loop, while - это просто пародия
 
@EUGEN27771, заметил, что скрипт твой для расставления стретч-маркеров медленнее работает на аудио, у которых частота дискретизации больше 44.1 ггц. Возможно ли это оптимизировать?
UPD собственно, там где srate = 44100, вписал 48000, и теперь как прежде работает, но наоборот на 44.1 медленней. Соответственно далее вписал так srate = GetMediaSourceSampleRate(item); :)
Теперь на разных сэмплрейтах одинаково быстро работает
 
Последнее редактирование:
  • Like
Реакции: Aleksandr Oleynik
@EUGEN27771, еще, если придраться, заметил также увеличение скорости работы после Glue или рендера внутри проекта. Айтем разумеется один. Думал, что это связано с кэшированием в проджект директории, но при попытке поставить в настройках кэширование медиа айтема в директорию при импорте в проект ничего не изменилось. Есть какие мысли по этому поводу? :)
UPD Нашел собаку, это связано с mp3 :)
 
Последнее редактирование:
  • Like
Реакции: Aleksandr Oleynik
Привет ребята! Подскажите пожалуйста, а то я все перерыл в Рипере не могу найти функцию выделения области по выделенному айтому, как это реализовано в Кубейсе на кнопке P.
Часто надо выделить область точно по выделенному айтому приходится подгонять вручную.
Так же не нашел где включается привязка к началу и концу айтома при выделении области.
 
@Mixandry, за один и тот же вопрос в разных темах на этом Форуме можно отправится в бан - вам нужно не только мануал Рипера, но и правили форума почитать.
 
Кому может пригодится.
Благо в последней бете Джастин добавил возможность назначать для колеса мыши сочетания с клавишей win, что раньше работало только для шорткатов, появился смысл создания "колесных" скриптов
1) Скрипт для релугирования по колесу pitch айтема - первый регулирует semitones, второй fine.

semitones
Код:
script_title = "pitch mouswheel"
local _,_,_,_,_,_,val = reaper.get_action_context()


local count = reaper.CountSelectedMediaItems()

function Pitch()
if val > 0 then
   reaper.PreventUIRefresh(1)
    for i = 0, count-1 do
    count = reaper.CountSelectedMediaItems()
    selitem = reaper.GetSelectedMediaItem(0,i)
    take =  reaper.GetActiveTake(selitem)
    pitch = reaper.GetMediaItemTakeInfo_Value(take, 'D_PITCH' )
    reaper.SetMediaItemTakeInfo_Value(take, 'D_PITCH', pitch+1)
    reaper.UpdateItemInProject(selitem)
    end
   reaper.PreventUIRefresh(-1)
   end
if val < 0 then
   reaper.PreventUIRefresh(1)
    for i = 0, count-1 do
    count = reaper.CountSelectedMediaItems()
    selitem = reaper.GetSelectedMediaItem(0,i)
    take =  reaper.GetActiveTake(selitem)
    pitch = reaper.GetMediaItemTakeInfo_Value(take, 'D_PITCH' )
    reaper.SetMediaItemTakeInfo_Value(take, 'D_PITCH', pitch-1)
    reaper.UpdateItemInProject(selitem)
    end
   reaper.PreventUIRefresh(-1)
  end
end

reaper.defer(Pitch)


fine
Код:
script_title = "pitch mouswheel"
local _,_,_,_,_,_,val = reaper.get_action_context()


local count = reaper.CountSelectedMediaItems()

function Pitch()
if val > 0 then
   reaper.PreventUIRefresh(1)
    for i = 0, count-1 do
    count = reaper.CountSelectedMediaItems()
    selitem = reaper.GetSelectedMediaItem(0,i)
    take =  reaper.GetActiveTake(selitem)
    pitch = reaper.GetMediaItemTakeInfo_Value(take, 'D_PITCH' )
    reaper.SetMediaItemTakeInfo_Value(take, 'D_PITCH', pitch+0.01)
    reaper.UpdateItemInProject(selitem)
    end
   reaper.PreventUIRefresh(-1)
   end
if val < 0 then
   reaper.PreventUIRefresh(1)
    for i = 0, count-1 do
    count = reaper.CountSelectedMediaItems()
    selitem = reaper.GetSelectedMediaItem(0,i)
    take =  reaper.GetActiveTake(selitem)
    pitch = reaper.GetMediaItemTakeInfo_Value(take, 'D_PITCH' )
    reaper.SetMediaItemTakeInfo_Value(take, 'D_PITCH', pitch-0.01)
    reaper.UpdateItemInProject(selitem)
    end
   reaper.PreventUIRefresh(-1)
  end
end

reaper.defer(Pitch)


2) Скрипт для панорамирования айтема по колесу
Код:
script_title = "pan mouswheel"
local _,_,_,_,_,_,val = reaper.get_action_context()


local count = reaper.CountSelectedMediaItems()

function Pan()
if val < 0 then
   reaper.PreventUIRefresh(1)
    for i = 0, count-1 do
    count = reaper.CountSelectedMediaItems()
    selitem = reaper.GetSelectedMediaItem(0,i)
    take =  reaper.GetActiveTake(selitem)
    pan = reaper.GetMediaItemTakeInfo_Value(take, 'D_PAN' )
    reaper.SetMediaItemTakeInfo_Value(take, 'D_PAN', pan+0.1)
    reaper.UpdateItemInProject(selitem)
    end
   reaper.PreventUIRefresh(-1)
   end
if val > 0 then
   reaper.PreventUIRefresh(1)
    for i = 0, count-1 do
    count = reaper.CountSelectedMediaItems()
    selitem = reaper.GetSelectedMediaItem(0,i)
    take =  reaper.GetActiveTake(selitem)
    pan = reaper.GetMediaItemTakeInfo_Value(take, 'D_PAN' )
    reaper.SetMediaItemTakeInfo_Value(take, 'D_PAN', pan-0.1)
    reaper.UpdateItemInProject(selitem)
    end
   reaper.PreventUIRefresh(-1)
  end
end

reaper.defer(Pan)
 
Последнее редактирование:
  • Like
Реакции: rmozh и elektrozz
@borisuperful, вот и все;)
Заведи на github страницу. Клонируй частный репо. Это просто.
Даже такой дятел, как я завел, десктоп-версию.
Ссылка верная, если нет - удалю - https://desktop.github.com
Синхрон, это удобно...по крайней мере.
(Еще есть мнение "Десктоп - это лажа, только православная командная строка!"
ХЗ... Можно согласиться, но пользоваться неудобно, как не разукрашивай. Даже клацая в терминале - неудобно. 98% людей без напильников выберут десктоп)
 
Последнее редактирование:
Хочу спросить, кто-то подробнее распишите -
+ ReaScript: add drag and drop receive support with gfx.getdropfile()/gfx_getdropfile()

+ ReaScript: allow deferred script execution to continue during modal windows triggered by MIDI
+ ReaScript: StuffMIDIMessage() for control defers to process similar to a hardware MIDI event

Про перетаскивание давно слышал - буду тестить. По ходу - и в JS заводится!
Два последних пункта пока не могу проверить
 
еще, если придраться, заметил также увеличение скорости работы после Glue или рендера внутри проекта.
Это я давно нашел. Акцессор, конечно, работает быстрее с родным семплрейт.
Если посмотреть на алгоритм компрессора - там все это учтено, и я описал в деталях, что делаю. Поэтому там относительно мутный алгоритм.
С учетом плейрейт, и прочего, но не просто так. То есть, сперва, все выравнивается под реальный рейт, компрессируется именно в таком, именно в сыром виде, а затем восстанавливается исходная ситуация. Это хороший ход - во-первых - скорость, во-вторых - точность работы. Работа именно с исходным файлом.
 
+ ReaScript: add drag and drop receive support with gfx.getdropfile()/gfx_getdropfile()
Это Михаил просил для своего скрипта RS5k manager, вот там она и реализована.
Теперь ещё можно использовать контекстные меню(с версии 5.92): ReaScript: add ShowPopupMenu() API
 
Благо в последней бете Джастин добавил возможность добавлять для колеса мыши сочетания с клавишей win
А как избавиться от выскакивающего меню пуск в нижнем левом углу монитора при использовании кнопки Win?
 
@Barto, как написал, так и написал "не использовать один shift". Только при шифте кнопка уводит в пуск, во всяком случае у меня на 8.1. Если что нибудь будет другое, даже вместе с shift, то не уйдет в пуск
 
@Barto, как написал, так и написал "не использовать один shift". Только при шифте кнопка уводит в пуск, во всяком случае у меня на 8.1. Если что нибудь будет другое, даже вместе с shift, то не уйдет в пуск
У меня на Win 10 наоборот. С шифтом не выскакивает меню пуск.
 
@borisuperful , то есть просто Win+колесо использовать никак не выйдет?
У меня windows 7, в пуск уплясывает только если нажать одну Win, или +колесо мыши покрутить, при любых других комбинациях в пуск не уходит.
У нас тут прям басня "Лебедь, рак и щука" получается. Кнопка одна, а винда у всех разная, и тянут они пуск в разные стороны.
 
@elektrozz, даже не знаю, в чем дело. На октаву можно, просто поменять там pitch+12 и pitch-12
@Barto, разумеется с одним win работать не будет и это логично - win и сделана для вызова пуска, причем именно в случае зависонов, минуя как бы саму программу.
 
Последнее редактирование:
me2beats_Show-hide children of selected tracks.lua !!!!!!!!!! Друзья скриптоиды. А можно ли данный скрипт про абгрейдить, чтобы он работал не только с фолд-треком скрывая его подтреки, а и с обычным треком. Тобишь указать скрипту если данный трек является фолдер треком то Работает как работает (скрывать-показывать его подтреки). А если это подтрек или просто трек то просто скрывать его одного.
 
  • Like
Реакции: YuriOl
me2beats_Show-hide children of selected tracks.lua !!!!!!!!!! Друзья скриптоиды. А можно ли данный скрипт про абгрейдить, чтобы он работал не только с фолд-треком скрывая его подтреки, а и с обычным треком.
Можно всё, что угодно. Но разбираться с чужим скриптом - очень не хочется.
 

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