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

  • Автор темы Автор темы drzhnn
  • Дата начала Дата начала
А какое у него назначение?
основное — нарезка сэмплов для VSTi. А вообще там просто получается хорошая основа для того, чтобы собирать как конструктор нарезатор под любые задачи. В принципе, за вечер можно собрать нечто похожее на MK Slicer
 
mpl align takes не работает.
на новойсистеме. ставил только этот скрипт через reapack.
рипер v6.43, win 10 x63, sws 2.12.1
пробовал предыдущую версию скрипта.

211759
 
у меня кое-что наклёвывается))


P.S. уже только после просмотра заметил баг с лишней половинкой в такте. Я думал, если длительность пересекает тактовую черту — lilypond её автоматически кромсает, ан нет: надо скриптом резать)
 
Рендер стемов

  • рендерит все регионы, согласно region render matrix
  • все эффекты, кроме инструментов переводит в offline. Из-за лимитации API, если больше двух инструментов на треке — останется только первый
  • сбрасывает громкость и панораму к нолям
  • исключает из матрицы все треки, которые замутированы, или не содержат итемов. Учитывает при этом все посылы на трек (допустим, если на миди-треке, который подключён к инструмент-треку есть итемы)
  • после рендера возвращает всё назад
Для работы нужен reapy_boost

Python:
from typing import Any, Dict, List, Optional
import reapy_boost as rpr
from pprint import pprint


def not_empty(track: rpr.Track, region: rpr.Region) -> bool:
    if track.is_muted:
        return False
    for item in track.items:
        if region.start > item.position > region.end:
            return True
        if region.end > (item.position + item.length) > region.start:
            return True
    for send in track.receives:
        if not_empty(send.source_track, region):
            return True
    return False


def get_fx_states(track: rpr.Track) -> List[bool]:
    state = []
    for fx in track.fxs:
        state.append(fx.is_online)
        if fx != track.instrument:
            fx.is_online = False
    return state


def set_fx_states(track: rpr.Track, states: List[bool]) -> None:
    for fx, state in zip(track.fxs, states):
        if fx != track.instrument:
            fx.is_online = state


def get_track_state(track: rpr.Track) -> Dict[str, Any]:
    state = {}
    state['vol'] = track.get_info_value('D_VOL')
    state['pan'] = track.get_info_value('D_PAN')
    state['width'] = track.get_info_value('D_WIDTH')
    state['panmode'] = track.get_info_value('I_PANMODE')
    state['panlaw'] = track.get_info_value('D_PANLAW')
    state['FX'] = get_fx_states(track)
    track.set_info_value('D_VOL', 1)
    track.set_info_value('I_PANMODE', 3)
    track.set_info_value('D_PANLAW', -1)
    track.set_info_value('D_PAN', 0)
    track.set_info_value('D_WIDTH', 1)
    return state


def set_track_state(track: rpr.Track, state: Dict[str, Any]) -> None:
    track.set_info_value('D_VOL', state['vol'])
    track.set_info_value('I_PANMODE', state['panmode'])
    track.set_info_value('D_PAN', state['pan'])
    track.set_info_value('D_PANLAW', state['panlaw'])
    track.set_info_value('D_WIDTH', state['width'])
    set_fx_states(track, state['FX'])


def region_state(
    region: rpr.Region,
    stem_states: Optional[Dict[str, Any]] = None
) -> Dict[str, Any]:
    stems = region.rendered_tracks
    rendered_stems: List[rpr.Track] = []
    for stem in stems:
        if not_empty(stem, region):
            rendered_stems.append(stem)
        else:
            region.remove_rendered_track(stem)
    if stem_states is None:
        stem_states = {}
        for stem in rendered_stems:
            stem_states[stem.GUID] = get_track_state(stem)
        stem_states['rendered_tracks'] = stems
        return stem_states
    region.add_rendered_tracks(stem_states['rendered_tracks'])
    del stem_states['rendered_tracks']
    for stem_guid in stem_states:
        stem = rpr.Track.from_GUID(stem_guid)
        set_track_state(stem, stem_states[stem_guid])
    return {}


# =================

with rpr.inside_reaper():
    pr = rpr.Project()
    with rpr.undo_block('render stems'):
        region_states = {}
        for region in pr.regions:
            state = region_state(region)
            region_states[region.index] = state
        # render project
        rpr.perform_action(41824)
        for region in pr.regions:
            region_state(region, region_states[region.index])
 
Последнее редактирование:
  • Like
Реакции: Antonio и walks
@PianoIst
Классно! Спаисбо, очень нужный скрипт.
Вот, жалуется на проблему синтаксиса. Кстати, вопрос - можно ли в Archie - Render Stems Template "вписать" твой скрипт с регион рендер матрикс. И ещё вопрос - как инсталировать reapy boost. Там есть мануал, но я не очень понял. Надо ли скачать директорию, если да, то куда её положить, прежде чем вводить команду в терминале. И что такое pip - нужно ли это, чтоб установить.
 

Вложения

  • Screen Shot 2022-06-18 at 15.57.53.png
    Screen Shot 2022-06-18 at 15.57.53.png
    595,6 KB · Просмотры: 111
В Visual Mixer от @Michael при перемещении по слотам возникает такая надпись 123.jpg и микшер закрывается. Как это победить?
Я так понимаю, что происходит сбрасывание выделения треков, а это обязательное условие. Не пойму, баг это или что?
 
В Visual Mixer от @Michael при перемещении по слотам возникает такая надпись Посмотреть вложение 217933 и микшер закрывается. Как это победить?
Я так понимаю, что происходит сбрасывание выделения треков, а это обязательное условие. Не пойму, баг это или что?
Баг, гляну после выходных. Лучше писать в телеге или на форум. Рандомно спрашивать в темах - не лучшая затея.
 
  • Like
Реакции: Elijah K
Всем доброго дня! Прошу прощения если не сюда вопросик... Вроде поискал по форуму ответа на нашел... Есть ли такой скрипт. допустим наиграл гармонию, или вставил midi файл гармонический.. а скрипт продетектировал и создал бы регионы с обозначением аккордов данной прогрессии? Так что бы для удобства написания аранжировки.. Заранее спасибо за ответы.
 
Всем доброго дня! Прошу прощения если не сюда вопросик... Вроде поискал по форуму ответа на нашел... Есть ли такой скрипт. допустим наиграл гармонию, или вставил midi файл гармонический.. а скрипт продетектировал и создал бы регионы с обозначением аккордов данной прогрессии? Так что бы для удобства написания аранжировки.. Заранее спасибо за ответы.
Нет такого
 
Ребята, напомните, пожалуйста - кажется, где-то был скрипт (или custom action), который в выбранных айтемах берет активные тэйки и переносит их на новый трек. Возможно, склеивает. Заранее спасибо.
 
Ну, сам и отвечу. :)
Такой Custom Action обнаружился, но у меня не пошел. Во-первых, нету у меня некоторых экшенов, хотя SWS свежий, во-вторых, не всё я там понял. Поэтому слепил свой. Корявенький, конечно, первенец, но работает и меня, в принципе, устраивает. Немного напрягает, что надо не забыть выделить не только айтемы, но и трек. Ну и Duplicate tracks как-то не кошерно, не на чистую дорожку, а со всеми потрохами... В общем, выделили айтемы с тейками и трек, запустили - получили на другой дорожке айтем, склеенный из активных тейков и нормализованый к -23 дБ LUFS. Это, конечно, по вкусу. ;)

Код:
Track: Duplicate tracks
Xenakios/SWS: Select previous tracks  
SWS: Unselect all items on selected track(s)
Take: Crop to active take in items
Item: Glue items
SWS/BR: Normalize loudness of selected items to -23 LUFS      
Item: Unselect (clear selection of) all items
218390
 
Последнее редактирование:
  • Like
Реакции: sve, lamamama и Nagor
Здравствуйте друзья. Опишу свою хотелку\вопрос: Допустим, в плейбеке имеем ...цать регионов\песен с типичной формой (intro, verse, chorus и т.д. отмеченные соответствующими именами маркеров). Возможно ли создать скрипт, который будет считывать имя маркера текущего региона/песни? При этом должны игнорироваться одноименные маркеры других регионов\песен. Как это должно работать: закрепляем за клавишей "1" маркер с именем 1verse, за клавишей "2" маркер с именем 2verse и т.д. (например: поется третий припев, но вместо outro вокалист сигналит "1 verse", а затем "coda", оператор жмет клавишу "1" и после вступления первого куплета оператор жмет клавишу "7"= coda).
 
Всем привет. Нашел скрипт для вертикального скрола треков, который прокручивает треки на один трек, и почему то у меня работает скрол только вниз, когда назначаю колесо мыши.
js_ReaScriptAPI установил.
Нашёл скрипт здесь - https://forums.cockos.com/showthread.php?t=269633

Вот сам скрипт:
Код:
function scroll_to_track(track)
  -- for original code (by spk77) see, https://forum.cockos.com/showpost.php?p=2226523&postcount=870
  local tcp_y = reaper.GetMediaTrackInfo_Value(track, "I_TCPY")
  local arrange = reaper.JS_Window_FindChildByID(reaper.GetMainHwnd(), 0x3E8)
  local ok, ar_vsb_position, ar_vsb_page, ar_vsb_min, ar_vsb_max, ar_vsb_trackPos = reaper.JS_Window_GetScrollInfo(arrange, "v")
  if ok then reaper.JS_Window_SetScrollPos(arrange, "v", tcp_y + ar_vsb_position) end
end

function ScrollToPreviousTrack()
  for i = reaper.CountTracks(0)-1,0,-1 do
    local tr = reaper.GetTrack(0,i)
    local tr_y = reaper.GetMediaTrackInfo_Value(tr, 'I_TCPY')
    if tr_y < 0 and reaper.IsTrackVisible(tr, false) then
      scroll_to_track(tr)
      break
    end
  end
end

function ScrollToNextTrack()
  for i = 0, reaper.CountTracks(0)-1 do
    local tr = reaper.GetTrack(0,i)
    local tr_y = reaper.GetMediaTrackInfo_Value(tr, 'I_TCPY')
    if tr_y > 0 and reaper.IsTrackVisible(tr, false) then
      scroll_to_track(tr)
      break
    end
  end
end

if not reaper.APIExists('JS_Window_SetScrollPos') then
  reaper.MB('js_ReaScriptAPI extension is required for this script.', 'Missing API', 0)
else -- call a scroll function,
   ScrollToNextTrack()
   --ScrollToPreviousTrack()
end
reaper.defer(function () end)

Подскажите пожалуйста -
1) Как заставить реагировать на прокрутку колеса мыши вверх?
2) Возможно ли модернизировать скрипт как то так ,чтоб он также реагировал на отображаемые треки автоматизации при прокрутке колеса?
Это было бы очень удобно.
А то сейчас он пролистывает сквозь треки автоматизации к следующему треку.
 
Последнее редактирование:
  • Like
Реакции: Elijah K, Antonio и Landre
Вместо стандартной, достаточно ограниченной поддержки видео Reaper, пишу ему более-менее полноценный видеоредактор на основе ffmpeg.
Вот, наконец добился от него рендера!

По сравнению с обычным видеорежимом, мой автоматически добавляет кроссфейды. На этом пока преимущества заканчиваются.
Но вообще основная задача для него ‒ возможность быстро применять LUT на отрезки.

P.S. Как доберусь до более-менее приличной стадии ‒ настрою кросс-компиляцию, и будет доступен в dll/so/dlyb. Никакой сложной установки ffmpeg не надо. Достаточно, чтобы он запускался из командной строки.
 
Последнее редактирование:
  • Like
Реакции: incubator
получилось кросс-компилировать. Можно скачать и потыкать.
Заодно там же есть экшн, который нормализует все тейки
 
  • Like
Реакции: Trasher
По сравнению с обычным видеорежимом, мой автоматически добавляет кроссфейды.
Обычно кроссфейды не нужны, а в стандартном их легко получить с пресетом
245143


Имхо, не лучшее вложение ценного ресурса - времени. Чтобы превзойти "стандартную ограниченную поддержку видео в рипере" его уйдёт страшно представить сколько. Если нужны луты, то лучше осваивать резольв
 
  • Like
Реакции: PianoIst и truemanofan
@Antonio, resolve освоен, только телодвижений с ним много для простой нарезки музыкальных видео: туда видео сконвертируй, мультитреки залей; потом обратно мультитреки экспортируй, сведи; потом всё равно доставать ffmpeg, чтобы поменять аудио на микс. А ещё, чего доброго ‒ intro/outro приклеить ‒ опять resolve что ли открывать? Это как раз задача для ffmpeg. Мне уже очень давно хочется иметь какую-то обёртку над ffmpeg чуть более полноценную, чем avidemux, и чуть менее похожую на видеоредактор, чем OpenShot.

Я просто заметил, что мне гораздо легче в Resolve сделать цветокоррекцию на png, экспортировать LUT и не вылезать из рипера ;)

На самом деле я уже 80% основных задач сделал: интерфейс прикрутить, да фильтров добавить ‒ будет няшка. По удобству и возможностям будет как минимум на уровне OpenShot и т.п., чего и хочется добиться.
 
Товарищи скриптописатели/программисты/теоретики, сорри за оффтоп.Вопрос???? Есть ли у кого мысли как осуществить(любым, но желательно самым простым/наивным способом) , назовём условно, "псевдокомпиляцию/разбор/прогноз_возможных_вариаций_текста_в_теле, хотя бы в псевдокод" функции printf, а также конструкций loop/while. (яп C|EEL2). Залип капитально прям(eel2 реализацию смотрел ничерта не понял).
 
@Trasher, не понятен вопрос... Настолько непонятен, что даже наводящий вопрос задать сложно…
Как пример:
Java:
// код
loop(x=0;nch=3,printf("in_pin:input %d\n, x+=1));
//
// результат кода цикла и принта
in_pin:input 0
in_pin:input 1
in_pin:input 2
Те при обходе в исходном тексте кода файла плагина и нахождения строки цикла и принта кода, парсер мог понять и декодировать в текст кода ниже(декодировать/преобразовать в три строки точек входа(in_pin:input X).
-----------
Скорее всего придётся пока отложить в стол, тк для "разбора синтаксиса в лоб" принтф и конструкции циклов нужно учесть очень много вводных(.
-----------
Непосредственно для чего:
Есть скрипт для простенького разбора исходного текста одного файла плагина/библиотеки импорта для jsfx с дальнейшей простенькой упаковкой в препроцессорный код, но если препроцессор уже есть в исх. тексте файла(например код взятый из плагина-лупера super8) , его трогать нельзя. Есть два варианта событий сценария:
1.пропустить препроцессорный текст кода(сделано, но получается визуально мудистика).
2.декодировать препроцессор в нэйтив "eel2_code", а потом опять заэнкодить в препроцессор, но по-другом алгоритму. (не сделано залип, склоняюсь, что предусмотреть все варианты разбора текста функции printf нереально [наивным способом] ).
 
Последнее редактирование:
  • Like
Реакции: PianoIst

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