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

  • Автор темы Автор темы drzhnn
  • Дата начала Дата начала
@EUGEN27771, в 5-ке в этом окне есть чекбокс который сохраняет настройки, нажав на него окно больше не вылазит
 
@nounaim, понял,Вы сохранили настройки,и теперь не знаете как вытащить окно?Может скрипт под другим именем сохранить,там ведь сохраняются настройки для конкретного скрипта.
 
  • Like
Реакции: nounaim
@nounaim, твой реквест по поводу playrate для айтемов?))

http://forum.cockos.com/project.php?issueid=5583
Добавил реквест для OSC контроля за Reaper.
В данный момент контроль ограничивается раскладками Control Surface. Предлагаемая мной фича подразумевает полный контроль над всем, что происходит в проекте, таким образом открывая в частности широкий спектр возможностей для лайва. Кому интересна эта тема, голосуем))
 
Парни, помогите в таком вопросе.
Я тут написал один кастом-экшн, так вот для полного счастья в нём не хватает одной команды. Нужно, чтобы экшн Set note ends to start of next note (40405) из секции MIDI Editor исполнялся в секции Main по отношению к выделенному миди-айтему.
Насколько сложно запилить такой скрипт?
 
Вообще вроде как должно работать. Но у меня на этот экшн и на несколько других (абсолютно не связанных между собой, как из скрипта, так и из окна экшнов) происходит рендер дороги, название изменяется на " - stem".
Идёт от версии к версии. Может кто подтвердить такое поведение?

PHP:
//EEL

items = CountMediaItems(0);
i = 0;
loop(items,
  GetSelectedMediaItem(0, i);
  Main_OnCommand(40405, 1);
  i += 1;
  );

Совет: ставь X-Raym_Prevent UI Refresh в начале кастома и X-Raym_Prevent UI Refresh Restore в конце, избежишь мерцаний промежуточных экшнов.
 
Последнее редактирование:
  • Like
Реакции: diggidon
у меня на этот экшн и на несколько других (абсолютно не связанных между собой, как из скрипта, так и из окна экшнов) происходит рендер дороги, название изменяется на " - stem".
Идёт от версии к версии. Может кто подтвердить такое поведение?
Подтверждаю, рендерит в stem...

ставь X-Raym_Prevent UI Refresh в начале кастома и X-Raym_Prevent UI Refresh Restore в конце
Не совсем понял, как это сделать.
 
  • Like
Реакции: RJ Baker и diggidon
@@Michael, спасибо!

не помню, как тут насчёт ссылок в плане модерации, так что если надо - уберу
Нормально тут всё со ссылками)))
[DOUBLEPOST=1433618887,1433617999][/DOUBLEPOST]
происходит рендер дороги, название изменяется на " - stem".
Ну понятно, точно такой же Command ID (40405) имеет экшн из Main секции Render tracks to stereo post-fader tracks (and mute original)... Печаль.

40405.jpg
 
точно такой же Command ID (40405) имеет экшн из Main секции
Да, точно, это я тупанул.
Держи:

PHP:
Main_OnCommand(40153, 0); // врубить мидиэдитор
MIDIEditor_LastFocused_OnCommand(40003, 0); // выделить там всё
MIDIEditor_LastFocused_OnCommand(40405, 0); // порезать это дело
MIDIEditor_LastFocused_OnCommand(2, 0); // закрыть от греха подальше
 
  • Like
Реакции: diggidon
После длительных попыток должен констатировать ФАКТ (на сегодня для себя это считаю Фактом, пока сам или кто-то другой не найдёт иного решения), что для Лайва нужно использовать ТОЛЬКО прямую адресацию к любым параметрам (трэкам и их параметрам, FX и их параметрам) без каких либо считываний имён трэков или имён FX или имён параметров FX.
Все мои попытки сделать управление проектом привязанное к Именам и не зависящим от изменений в проектах - провалилось, так как все скрипты с встроенным поиском Имён через перебор (loop) пагубно сказываются на производительности и при малых буферах (задержках) вызывают во время плэйбэка или игры артефакты.
При этом Скрипты основанные на прямом обращении по номеру - работают в фоне и ни каких заметных нагрузок в работу проекта не вносят.
Увы :(
[DOUBLEPOST=1433681255,1433678057][/DOUBLEPOST]Ну и собственно вопрос, который уже звучал - как сделать "Скрипт над Скриптами" - который бы мне правил во всех моих скриптах номера треков, если они изменились в ходе работы над проектом?
Просто этот процесс я мог бы сделать запускаемым пр открытии проекта и для меня небыло-бы важным, что он грузит ресурсы и не совместим с Риал Таймом.

Например: У меня есть скрипт (KEY01_P1_On.eel) используемый при игре -

PHP:
     GetToggleCommandState(NamedCommandLookup("_S&M_EXCL_TGL1"))?
     (
     tr = GetTrack(0, 2); // выбираем 3-ий трэк
     TrackFX_SetEnabled(tr, 1, 1); // FX02 - Unbypass
     TrackFX_SetEnabled(tr, 2, 0); // FX03 - Bypass
     TrackFX_SetEnabled(tr, 3, 0);
     TrackFX_SetEnabled(tr, 4, 0);
     TrackFX_SetEnabled(tr, 5, 0);
     TrackFX_SetEnabled(tr, 6, 0);
  
     );

И изначально 3-ий трэк у меня имел уникальное имя KEY01_P1 - который в скрипте вот тут описан -
tr = GetTrack(0, 2); // выбираем 3-ий трэк
В силу разных причин (модернизации проекта, например) он может стать 11-ым по порядку.
Мне нужно создать скрипт, который бы считал информацию с текущего проекта и изменил в рабочем скрипте KEY01_P1_On.eel в строке - tr = GetTrack(0, 2); двойку на десятку, ну и сделал это во всех скриптах, которые я бы указал в этом "Скрипте над Скриптами".
Прошу прощение за путаность объяснений, ну суть думаю ясна - хотелось бы все эти длительные считывания информации и сопоставления номеров и имён перенести на этам До Живого выступления и отдать этот процесс на откуп Роботу, а не человеку.

PS: Не хочу просить сына писать отдельную програмулину для этого :(

PSS: Есть конечно решение или в Cycle Action или скорее всего похожее можно сделать и в скрипте наверное (через выделение трека с конкретным именем перед обращение к FX на нём стоящим) -
CONSOLE s KEY01_P1
_S&M_FXBYPALL3

Но!!!! Решение не надёжное, так как может вполне случиться так, что несколько музыкантов нажмут смену пресета одновременно и ......, ну тут как повезёт, но может быть и беда.

Поэтому хочу dect эти сопостовления имён и номеров трека делать ДО Использования Проекта в Живье (при открытии его, например).
 
Последнее редактирование:
Подскажите пожалуйста парни а можно как то через cкрипты находить окна и кликать в чекбокс, где то вроде видел такое на форуме кокоса найти не могу никак
или можно запомнить как то состояние чекбоксов при сохранении темплэйта трека, сделать их включенными по умолчанию
 
Последнее редактирование:
Это врядли....
[DOUBLEPOST=1433790972,1433712796][/DOUBLEPOST]
Но!!!! Решение не надёжное, так как может вполне случиться так, что несколько музыкантов нажмут смену пресета одновременно и ......, ну тут как повезёт, но может быть и беда.
Сделал тестовый проект с тремя инструментами и синхронной сменой (запуском Цикл Экшинов) - всё работает как часы и я не пойму почему :( --- видимо в Рипере всё-же сделан буфер на выполнение любых действий и последовательное их выполнение... В общем час гонял - работает и всё тут.
 
А есть ли гайды, туторы по Python в рипере на русском?
Интересуют для начала элементарные вещи, как правильно установить Python в рипер,
какую версию, 2 или 3, какую длл Python-а в настройках рипера указать?
Вообщем интересует вот этот скрипт http://stash.reaper.fm/v/14213/BPM Converter v.1.05.py,
не получается его установить...
 
Смотрите видео Andy Vax-а, там есть как установить правильно питон. На русском ни черта нет, на сколько мне известно.
 
  • Like
Реакции: MikaNiko
Смотрите видео Andy Vax-а, там есть как установить правильно питон. На русском ни черта нет, на сколько мне известно.
Премного благодарен;)
P.S. Кстати, смотрел это видео пару месяцев назад, но не отложилось в памяти, что там есть об этом, видимо тогда мне этот скрипт был не нужен:)
 
@MikaNiko, python устарел к настоящему моменту. Этот скрипт X-Raym недавно перевёл в lua (работает в 5pre без установки дополнительных библиотек):

http://extremraym.com/en/my-reaper-scripts/ (Item Properties/Viente_X-Raym_BPM Converter.lua)
PHP:
-- ------------------------------------------
-- BPM Converter v.1.05
-- Author : VIENTE
-- http://forum.cockos.com/member.php?u=42674
-- Forum: Viente's BPM Converter
-- http://forum.cockos.com/showthread.php?t=110780

-- Mod 1.06 by X-Raym
-- 2015-05-13
-- http://extremraym.com
-- # Now in Lua
-- + Works on multiple selected items (BPM detection based on first selected item)
-- # user input "cancel" corrected

-- ------------------------------------------

------ functionine variables and functions ----------------------------------------------------------------------------------------------------------------------------------------
numItems = reaper.CountSelectedMediaItems(0)
selItem = reaper.GetSelectedMediaItem(0, 0)

function msg(m)          -- functionine function: console output alias for debugging
  reaper.ShowConsoleMsg(tostring(m) .. '\n')
end
--msg("")

function getMusicalLenght(selItem)
  -- Get selected item's start and end
  itemStart = reaper.GetMediaItemInfo_Value(selItem, "D_POSITION")
  itemEnd = itemStart + reaper.GetMediaItemInfo_Value(selItem, "D_LENGTH")

  -- Check if there are any tempo changes during item's length (NextChangeTime will output -1 if there are no more tempo markers after the requested position)
  if reaper.TimeMap2_GetNextChangeTime(0, itemStart) > itemEnd or reaper.TimeMap2_GetNextChangeTime(0, itemStart) == -1 then

    -- There are no tempo markers over selected item so we continue
    timeSig, timesig_denomOut, startBPM = reaper.TimeMap_GetTimeSigAtTime(0, itemStart)

    -- This is needed because then we don't have to worry about linear/square difference of tempo points
    timeSig, timesig_denomOut, endBPM = reaper.TimeMap_GetTimeSigAtTime(0, itemEnd) -- we don't use TimeMap_GetDividedBpmAtTime because note in the API says: get the effective BPM at the time (seconds) position (i.e. 2x in /8 signatures)

    -- This is the formula
    musicalLenght = ((startBPM + endBPM) * timesig_denomOut * (itemEnd - itemStart)) / (480 * timeSig)

  else
    -- if there are existing tempo markers during item's length, you have to get them and calculate everything separately
    reaper.Main_OnCommand(65535, 0)

  end
end

function getTempo()

  timeSel = reaper.GetMediaItemInfo_Value(selItem, "D_LENGTH")
  rawTempo = 4*60/timeSel
  tempo = math.floor(rawTempo+0.5, 2)

  if musicalLenght < 1 or musicalLenght == 1 then

    bpm = tempo

  elseif musicalLenght > 1 and musicalLenght < 3 then

    bpm = tempo * 2

  elseif musicalLenght > 3 and musicalLenght < 5 then

    bpm = tempo * 4

  elseif musicalLenght > 5 and musicalLenght < 7 then

    bpm = tempo * 6

  elseif musicalLenght > 7 and musicalLenght < 9 then

    bpm = tempo * 8

  elseif musicalLenght > 9 and musicalLenght < 11 then

    bpm = tempo * 10

  elseif musicalLenght > 11 and musicalLenght < 13 then

    bpm = tempo * 12

  elseif musicalLenght > 13 and musicalLenght < 15 then

    bpm = tempo * 14

  elseif musicalLenght > 15 and musicalLenght < 17 then

    bpm = tempo * 16

  else

    bpm = 1
  end

end  --reaper.ShowConsoleMsg(str(bpm) + "\n")

function setTempo()

  master_tempo = math.floor(reaper.Master_GetTempo())

  functionaults = tostring(bpm)..","..tostring(master_tempo)
  retval, retvals_csv = reaper.GetUserInputs("BPM Converter", 2, "Original Tempo (BPM),Target Tempo (BPM)", functionaults)

  if retval == true then

    -- PARSE THE STRING
    answer1, answer2 = retvals_csv:match("([^,]+),([^,]+)")
    answer1 = tonumber(answer1)
    answer2 = tonumber(answer2)

    if answer1 > 20 and answer1 < 299 and answer2 > 20 and answer2 < 299 then

      if answer2 > answer1 then

        bpm_rate = (answer2 / answer1) -1
        for i = 0, numItems - 1 do
          item = reaper.GetSelectedMediaItem(0, i)
          take = reaper.GetActiveTake(item)
          currentrate = reaper.GetMediaItemTakeInfo_Value(take, "D_PLAYRATE")
          reaper.SetMediaItemTakeInfo_Value(take, "D_PLAYRATE", currentrate + bpm_rate)
        end
  
      elseif answer2 < answer1 then

        bpm_rate = (answer2 / answer1)
        bpm_calc = (1 - bpm_rate)
        for i = 0, numItems - 1 do
          item = reaper.GetSelectedMediaItem(0, i)
          take = reaper.GetActiveTake(item)
          currentrate = reaper.GetMediaItemTakeInfo_Value(take, "D_PLAYRATE")
          reaper.SetMediaItemTakeInfo_Value(take, "D_PLAYRATE", currentrate - bpm_calc)
        end
  
      end
  
      reaper.Main_OnCommand(40612,0) -- Fix item length

    else
      reaper.ShowMessageBox("Incorrect tempo!", "Error", 0) -- 0=OK,2=OKCANCEL,2=ABORTRETRYIGNORE,3=YESNOCANCEL,4=YESNO,5=RETRYCANCEL : ret 1=OK,2=CANCEL,3=ABORT,4=RETRY,5=IGNORE,6=YES,7=NO 
    end
  end
end
------ Calling actions & functions ----------------------------------------------------------------------------------------------------------------------------------------------

reaper.Undo_BeginBlock()

if numItems >= 1 then

  getMusicalLenght(selItem)
  getTempo()
  setTempo()
  reaper.UpdateArrange()

else
  reaper.ShowMessageBox("Please select one item...", "Error", 0) -- 0=OK,2=OKCANCEL,2=ABORTRETRYIGNORE,3=YESNOCANCEL,4=YESNO,5=RETRYCANCEL : ret 1=OK,2=CANCEL,3=ABORT,4=RETRY,5=IGNORE,6=YES,7=NO

end

reaper.Undo_EndBlock("Convert BPM of selected item",-1)
 
  • Like
Реакции: MikaNiko
@MikaNiko, python устарел к настоящему моменту. Этот скрипт X-Raym недавно перевёл в lua (работает в 5pre без установки дополнительных библиотек):
http://extremraym.com/en/my-reaper-scripts/ (Item Properties/Viente_X-Raym_BPM Converter.lua)
cпасибо, там как раз и видео по установке и использованию скриптов есть, то что нужно новичкам Рипера
 
Портировал ещё один свой кастом-экшн в eel скрипт. Действительно увлекательное занятие, плюс последний опыт показал, что скрипт как-то понадёжнее кастома, особенно если кастом - простыня в пол-километра длинной))
Glue Takes (in place)
Код:
// Glue takes (in place) eel script by Diggidon

Undo_BeginBlock();

PreventUIRefresh(1);

Main_OnCommand(NamedCommandLookup("_SWS_SAVETIME1"), 0);
Main_OnCommand(40290, 0);
Main_OnCommand(40224, 0);
Main_OnCommand(41588, 0);
Main_OnCommand(NamedCommandLookup("_SWS_AWTRIMFILL"), 0);
Main_OnCommand(NamedCommandLookup("_SWS_SELTRKWITEM"), 0);
Main_OnCommand(NamedCommandLookup("_SWS_MAKEFOLDER"), 0);
Main_OnCommand(40438, 0);
Main_OnCommand(NamedCommandLookup("_SWS_SELCHILDREN"), 0);
Main_OnCommand(40005, 0);
Main_OnCommand(NamedCommandLookup("_SWS_SELTRKWITEM"), 0);
Main_OnCommand(40418, 0);
Main_OnCommand(40718, 0);
Main_OnCommand(40699, 0);
Main_OnCommand(40419, 0);
Main_OnCommand(41384, 0);
Main_OnCommand(NamedCommandLookup("_XENAKIOS_SELPREVTRACK"), 0);
Main_OnCommand(NamedCommandLookup("_SWS_AWPASTE"), 0);
Main_OnCommand(NamedCommandLookup("_XENAKIOS_SELNEXTTRACK"), 0);
Main_OnCommand(40005, 0);
Main_OnCommand(40635, 0);
Main_OnCommand(NamedCommandLookup("_SWS_RESTTIME1"), 0);

PreventUIRefresh(-1);

Undo_EndBlock("Glue Takes (in place)", 0);


Оригинальный кастом-экшн (с объяснениями, что оно такое) здесь:
http://rmmedia.ru/threads/107757/#post-1684859
http://rmmedia.ru/threads/107757/#post-1708928
 
  • Like
Реакции: fruitcore, axis и Tito
Мне кажется, скрипт всё-таки призван делать нечто более продуманное, нежели prevent united fresh + кастом экшн. Должна чувствоваться гибкость и элегантность мысли (во ляпнул).

Ъ-Порт в eel выглядел бы менее громоздким))
 
Мне кажется, скрипт всё-таки призван делать нечто более продуманное, нежели prevent united fresh + кастом экшн. Должна чувствоваться гибкость и элегантность мысли (во ляпнул).
А я и не спорю, и на роль продвинутого программера с элегантными мыслями ни разу не претендую (по крайней мере пока). Вот когда вырасту - тогда и посмотрим))
З.Ы. На самом деле я бы с удовольствием изучил подробный мануал "eel (lua) + Reaper для чайников", но - нет такого мануала. Пока же подсмотрел в чужие скрипты, выхватил пару-тройку фишек - и ладно.
З.З.Ы. Вот мануал по WALTER'у от White Tie я в своё время изучил от корки до корки, и очень надеюсь, что что-либо подобное появится и по eel (lua) + Reaper.
 
@diggidon, Тут не в этом дело.
Просто подобный скрипт по сути в скрипте то и не совсем нужно описывать, можно, например, его в Цикл Экшине сделать - не пробовал?
А с мануалами по EEL - беда, есть только то, на что дал ссылку @@Michael -
http://extremraym.com/cloud/reascript/x-raym_reascripthelp.html#e
И даже это уже Круто.
Но очень много операторов и функций там даже не описанны - видимо считается, что они и так понятны.
 
Просто подобный скрипт по сути в скрипте то и не совсем нужно описывать
А почему? Почему подобное не нужно описывать в скрипте? Другой вопрос, что если бы я владел eel, я бы наверняка сделал это более элегантно и менее громоздко.

можно, например, его в Цикл Экшине сделать - не пробовал?
Пробовал, всё равно чепуха получается, когда экшн огромный. Я поэтому и решил увековечить свою нетленку в скрипте, потому что оно так надёжнее работает.

А с мануалами по EEL - беда
Я вообще пока что понимаю только Main_OnCommand и Main_OnCommand(NamedCommandLookup), ну и PreventUI с Undo блоком. На всё остальное - как баран на новые ворота. Но учитывая, что я в первую очередь всё-таки музыкант и звукорежиссёр, то не особо парюсь.
 
  • Like
Реакции: Aleksandr Oleynik
Вообще, у меня зреет давно мысль написать простенький тутор по eel и lua. Или видео. Но лучше текст, его можно править и дополнять с помощью разных крутых чуваков, часть из которых периодически светится на rmm. Просто не было особых запросов к этому как-то. Да и знаний не так уж и много, чтоб было чем поделиться. Кому надо, те знают где искать. JS по сути EEL, часть инфы есть. О Lua здесь.

Скрипт выше можно уместить в действия:
1) сохранить выбранное время,
2) для выбранного итема взять первые тейки,
3) выделить их
4) сделать рендер в тайм селкшн
5) добавить после последнего тейка
6) далее по кругу с остальными тейками
7) удалить первоначальное количество строк тейков
8) восстановить время
 
  • Like
Реакции: Beckoff
Основная трудность в освоении скриптов, да и JS понятно, не програмистами (ну или теми, кто ни одной строки кода ни на одном языке ни когда не написали) в том, что большая часть опубликованного в инете материала (да и сдешние подсказки от тех кто вник) рассчитаны на тех, кто всё-таки хоть что-то в этом плане понимают.
Вот я два часа пытался найти способ сделать инверсию значению сопоставления, а сын пришел и не читая ни чего о JS или EEL сказал - попробуй перед выражением поставить восклицательный знак - блин, и заработало. Где это прочтёшь? Только если хоть какой-то язык програмирования знаешь.
[DOUBLEPOST=1434056183,1434055707][/DOUBLEPOST]@@Michael, вот из консоли, сделанной SWS можно прямо обратится к треку по его имени -
Console s "имя трека". А в EEL только через сопостовление всех имеющихся в проекте треков с заданным именем. Может в EEL всё-же есть менее громоздкий способ обратится к треку по имени? Потому как этот способ перебора всех треков использовать на малых задержках не выходит - при работе скрипта появляется треск в Аудио. При том, что через Цикл Экшин и команды Консоли - всё отлично.
 
Я вообще ни разу не программист, и полгода назад любой скрипт представлял собой набор бессмысленных символов.

обратится к треку по имени
Насколько мне известно, только перебор + GetSetMediaTrackInfo_String.
Я не очень представляю логику действия программы при исполнении "прямого обращения". Вот с id понятно, есть набор индексов, к ним можно обращаться быстро. А к каждому индексу привязана куча всего. Если ещё и для каждого параметра внутри индекса держать отдельную ячейку памяти для "быстрого обращения", рипер явно не был бы столь шустрым.
С TrackFX и TrackEnvelope сделано исключительно для удобства, мне кажется (ну и вряд ли найдутся два параметра или огибающих с одинаковыми именами для одного трека), хотя где-то глубоко в коде рипера они так и работают перебором+сравнением, полагаю. Ну и консоль, возможно, собирает все эти значения заранее и далее к ним обращается " напрямую".

Вот же всё написано для всяких операций сравнения.
 
Последнее редактирование:

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