ReaScripts (скрипты для Reaper) - Учимся создавать!!!

Александр, вы незнаете какими способами я решаю задачи, я точно уверенно могу сказать что без скриптов можно решить любую задачу и сдать трек под ключ.
Тогда и пишите о том, что лично вы решаете ВСЕ СВОИ задачи без скриптов, а не -
@belovw, мне кажется в самом рипере уже есть все что угодно, даже если нет, кастомными можно зарешать.
Тут ни чего о том, что есть что угодно нужное именно вам.
[automerge]1616957591[/automerge]
Может можно всё
Нельзя.
 
Такой вопрос. Есть замечательный скрипт от juliansader - js_Razor edit - Enclose selected media items and automation items in minimal razor areas

Код:
reaper.Undo_BeginBlock2(0)
tS = {}
for t = 0, reaper.CountTracks(0)-1 do
    track = reaper.GetTrack(0, t)
    for e = 0, reaper.CountTrackEnvelopes(track)-1 do
        env = reaper.GetTrackEnvelope(track, e)
        guidOK, guid = reaper.GetSetEnvelopeInfo_String(env, "GUID", "", false)
        for ai = 0, reaper.CountAutomationItems(env)-1 do
            if reaper.GetSetAutomationItemInfo(env, ai, "D_UISEL", 0, false) ~= 0 then
                left = reaper.GetSetAutomationItemInfo(env, ai, "D_POSITION", 0, false)
                right = left + reaper.GetSetAutomationItemInfo(env, ai, "D_LENGTH", 0, false)
                tS[track] = (tS[track] or "") .. string.format([[%.16f %.16f "%s" ]], left, right, guid)
            end
        end
    end
end
for i = 0, reaper.CountSelectedMediaItems(0)-1 do
    item = reaper.GetSelectedMediaItem(0, i)
    left = reaper.GetMediaItemInfo_Value(item, "D_POSITION")
    right = left + reaper.GetMediaItemInfo_Value(item, "D_LENGTH")
    track = reaper.GetMediaItemTrack(item)
    tS[track] = (tS[track] or "") .. string.format([[%.16f %.16f "" ]], left, right)
end
for track, str in pairs(tS) do
    reaper.GetSetMediaTrackInfo_String(track, "P_RAZOREDITS", str, true)
end
reaper.UpdateArrange()
reaper.Undo_EndBlock2(0, "Enclose items in minimal razor areas", -1)

Этим скриптом можно включить в область razor area только выделенные айтемы и айтемы автоматизации. То есть, только те из них, которые уже были выделены. Отличный скрипт. Чуть подумав и взяв нужную часть кода сделал себе скрипт, где можно включить в razor area айтемы, находящиеся под курсором мыши. Без айтемов автоматизации, ибо с ними пока что боль. Если связка с автоматизацией включена, всё, что под айтемами, подключится.
Тоже нормально работает, вроде. Вот он.

Код:
reaper.Undo_BeginBlock2(0)
         window, segment, details = reaper.BR_GetMouseCursorContext()
         if details == "item" then
            item =  reaper.BR_GetMouseCursorContext_Item()
            sel_item =  reaper.IsMediaItemSelected( item )
         if sel_item == false then
            reaper.SetMediaItemSelected( item, true )
         else
              reaper.SetMediaItemSelected( item, false )
         end
         end
         tS = {}
        for i = 0, reaper.CountSelectedMediaItems(0)-1 do
            item = reaper.GetSelectedMediaItem(0, i)
            left = reaper.GetMediaItemInfo_Value(item, "D_POSITION")
            right = left + reaper.GetMediaItemInfo_Value(item, "D_LENGTH")
            track = reaper.GetMediaItemTrack(item)
            tS[track] = (tS[track] or "") .. string.format([[%.16f %.16f "" ]], left, right)
        end
        for track, str in pairs(tS) do
            reaper.GetSetMediaTrackInfo_String(track, "P_RAZOREDITS", str, true)
          end
reaper.UpdateArrange()
reaper.Undo_EndBlock2(0, "Enclose media items under mouse", -1)
И он почти может работать как toggle, то есть, при повторном применении скрипта, под курсором мыши, включённый в razor area айтем он может исключить, если только, этот айтем не остался единственным, включённым в razor area на данном треке. В этом единственная загвоздка. Может, кто может помочь, как доработать, чтобы в любом случае. при повторном воздействии любой айтем исключался из razor area. Мультик прилагаю.

Enclose media items under mouse.gif
 
Последнее редактирование:
Всё, нашёл))) Просто в самом начале добавил экшн, очищающий все razor area))) Работает как часы.

Код:
reaper.Undo_BeginBlock2(0)
         reaper.Main_OnCommand(42406,0)
         window, segment, details = reaper.BR_GetMouseCursorContext()
         if details == "item" then
            item =  reaper.BR_GetMouseCursorContext_Item()
            sel_item =  reaper.IsMediaItemSelected( item )
         if sel_item == false then
            reaper.SetMediaItemSelected( item, true )
         else
              reaper.SetMediaItemSelected( item, false )
         end
         end
         tS = {}
        for i = 0, reaper.CountSelectedMediaItems(0)-1 do
            item = reaper.GetSelectedMediaItem(0, i)
            left = reaper.GetMediaItemInfo_Value(item, "D_POSITION")
            right = left + reaper.GetMediaItemInfo_Value(item, "D_LENGTH")
            track = reaper.GetMediaItemTrack(item)
            tS[track] = (tS[track] or "") .. string.format([[%.16f %.16f "" ]], left, right)
        end
        for track, str in pairs(tS) do
            reaper.GetSetMediaTrackInfo_String(track, "P_RAZOREDITS", str, true)
            end
reaper.UpdateArrange()
reaper.Undo_EndBlock2(0, "Enclose media items under mouse", -1)

Enclose media items under mouse_2.gif
 
  • Like
Реакции: sve и PianoIst
Не могу изменить пост. Правильнее будет назвать скрипт "Toggle enclose media items under mouse in minimal razor area".
 



Сделано для возможности использования двух ноутов с реперами в качестве Бэкап Плэйбэка.
Мастер стоит у Звукорежисера, Слей стоит на сцене. Кроме того, что при пропадании звука с Мастера на пульте автоматом переключается звук со Слэйта, Любые изменения в ходе концерта на Слейте или на Мастере (всякое бывает), можно синхронизировать и они видны и там и там сразу.

@Rst7, на оф. форуме спрашивали про такую функциональность https://forum.cockos.com/showthread.php?t=263495 Понятно, что не бесплатно, но если можно, то дайте ему знать. :)
 
на оф. форуме спрашивали про такую функциональность

Я, честно говоря, не очень помню, чем закончилась та эпопея. До какого-то условно рабочего состояния мы скрипты довели, но насколько была эта условность - я вот хоть убейте запамятовал. Это @Aleksandr Oleynik точнее скажет.
 
  • Like
Реакции: vitalker
@Rst7, Там нужна была сама оболочка, чтобы проект сохранялся в мастере и т.п. И мезанизм коммутации.
Механизм коммутации как вариант есть с вашим интерфейсом, как вариант — Jack.
Я тоже клепал оболочку, научился коммутировать через Jack и даже сохранение проекта, но до конца тоже не доделал.
 
  • Like
Реакции: vitalker
Доброго времени суток! Я правильно понимаю, что для создания действия, которого нет в списке действий нужно писать скрипт?

Возникла необходимость перейти к маркеру 31, а в списке действий их всего 30. Также нужно управлять громкостью трек 100, а их в списке только 99
 
Здравствуйте, очень захотел скрипт-Stutter для midi-нот
так вот, у меня возник вопрос, можно ли пройтись по всем строкам пианоролла (типа 1c-1d-1e) так как на данный момент несколько нот объединять только на одной строке (простите, не знаю как это правильно назвать)
так же хочу узнать зачем нужны функции "defer()" и no_undo() (копировал с чьего-то скрипта и оставил на всякий)
Спасибо
Код:
_,_,_,_,_,_,val=reaper.get_action_context()
  if val>0 then
  local take=reaper.MIDIEditor_GetTake(reaper.MIDIEditor_GetActive())
  local _,CountEvts=reaper.MIDI_CountEvts(take)
  if CountEvts==0 then no_undo() return end;
  local NewList={}
  if CountEvts>0 then
    note_data={}
    for i=0, CountEvts+1 do
      note_data[i]={}
      _,note_data[i].sel,note_data[i].muted,note_data[i].start,note_data[i].ending,note_data[i].chan,note_data[i].pitch,note_data[i].vel= reaper.MIDI_GetNote(take,i)
    end
    for i=0, #note_data do
      if note_data[i].sel==true then
        NewList[i*2]={} --list for duplicate notes
        NewList[i*2+1]={}
        reaper.MIDI_DeleteNote(take,i)
        
        --first dup note
        NewList[i*2].sel=note_data[i].sel
        NewList[i*2].muted=note_data[i].muted
        NewList[i*2].start=note_data[i].start
        NewList[i*2].ending=note_data[i].start+(note_data[i].ending-note_data[i].start)/2
        NewList[i*2].chan=note_data[i].chan
        NewList[i*2].pitch=note_data[i].pitch
        NewList[i*2].vel=note_data[i].vel
        
        --second dup note
        NewList[i*2+1].sel=note_data[i].sel
        NewList[i*2+1].muted=note_data[i].muted
        NewList[i*2+1].start=(note_data[i].ending-note_data[i].start)/2+note_data[i].start
        NewList[i*2+1].ending=note_data[i].ending
        NewList[i*2+1].chan=note_data[i].chan
        NewList[i*2+1].pitch=note_data[i].pitch
        NewList[i*2+1].vel=note_data[i].vel
      end
    end
    for x=0, #NewList do
      if NewList[x]~=nil then
        reaper.MIDI_InsertNote(take,NewList[x].sel,NewList[x].muted,NewList[x].start,NewList[x].ending,NewList[x].chan,NewList[x].pitch,NewList[x].vel)
      end
    end
  end
else
  local take=reaper.MIDIEditor_GetTake(reaper.MIDIEditor_GetActive())
  local _,CountEvts=reaper.MIDI_CountEvts(take)
  if CountEvts==0 then no_undo() return end;
  local NewList={}
  if CountEvts>0 then
    note_data={}
    for i=0, CountEvts+1 do
      note_data[i]={}
      _,note_data[i].sel,note_data[i].muted,note_data[i].start,note_data[i].ending,note_data[i].chan,note_data[i].pitch,note_data[i].vel= reaper.MIDI_GetNote(take,i)
    end
    for i=0,#note_data-1 do
      if note_data[i].sel==true and note_data[i+1].sel==true and note_data[i].pitch==note_data[i+1].pitch and note_data[i].ending==note_data[i+1].start and i%2==0 then
        NewList[i/2]={}
        NewList[i/2].sel=note_data[i].sel
        NewList[i/2].muted=note_data[i].muted
        NewList[i/2].start=note_data[i].start
        NewList[i/2].ending=note_data[i+1].ending
        NewList[i/2].chan=note_data[i].chan
        NewList[i/2].pitch=note_data[i].pitch
        NewList[i/2].vel=note_data[i].vel
        reaper.MIDI_DeleteNote(take,0)
        reaper.MIDI_DeleteNote(take,0)
        
      end
    end
    for x=0,#NewList do
      if NewList[x]~=nil then
        reaper.MIDI_InsertNote(take,NewList[x].sel,NewList[x].muted,NewList[x].start,NewList[x].ending,NewList[x].chan,NewList[x].pitch,NewList[x].vel)
      end
    end
  end
end
 
так же хочу узнать зачем нужны функции "defer()" и no_undo() (копировал с чьего-то скрипта и оставил на всякий)
Это ребята придумали такую функцию, чтоб не создавать undo point: если скрипт по какой то причине не выполнится (например, не будет нот в айтеме, как задано в вашем скрипте), то сработает функция с defer и не будет записи в журнал undo.
 
Это ребята придумали такую функцию, чтоб не создавать undo point: если скрипт по какой то причине не выполнится (например, не будет нот в айтеме, как задано в вашем скрипте), то сработает функция с defer и не будет записи в журнал undo.
Спасибо
 
Здравствуйте, создал кастом экшн, что бы давать автоматическое имя выбранным трекам, но не совсем устраивает его работа, хотел поинтересоваться, может быть есть какой-то скрипт, что бы реализовать эту задумку как то проще?
 

Вложения

  • Name.mp4
    1,3 MB
@shuco, под каждое имя получился свой экшн, проблема в том, что если на канале уже что-то есть, то все плагины будут удаляться после нэйминга..
Использовал ещё под один кастом экшн интересный скрипт «Lokasenna_Select tracks by name.lua», он создаёт в экшн листе пресет под любое название и соответственно можно выделить конкретный трек/группу, искал вот что-то типа такого же по нэймингу, но пока безрезультатно
 

Вложения

  • action naming.jpg
    action naming.jpg
    327,9 KB · Просмотры: 79
Второй скрипт kick.lua (Archie_Track; Insert prefix name of selected track.lua) выглядит вот так:




local NAME_PREFIX = 'kick'; -- Имя Вставляемого префикса


local USER_INPUTS = false;
-- = false -- Не показывать окно для вводи имени
-- = true -- Показать окно для вводи имени


local No_REGIST = true; -- Чувствительность к Регистру true/false


--======================================================================================
--////////////// SCRIPT \\\\\\\\\\\\\\ SCRIPT ////////////// SCRIPT \\\\\\\\\\\\\\\\
--======================================================================================



---------------------------------------------------------
local function no_undo();reaper.defer(function()end);end;
---------------------------------------------------------


local CountSelTrack = reaper.CountSelectedTracks(0);
if CountSelTrack == 0 then no_undo() return end;


if USER_INPUTS then;
local title = 'Insert prefix name of selected track';
local retval,retvals_csv = reaper.GetUserInputs(title,1,'Inter name Prefix:,extrawidth=150',NAME_PREFIX or'');
if not retval then no_undo() return end;
NAME_PREFIX = retvals_csv;
end;



local UNDO;
local name2;
for i = CountSelTrack-1,0,-1 do;
local SelTrack = reaper.GetSelectedTrack(0,i);
local _,name = reaper.GetSetMediaTrackInfo_String(SelTrack,"P_NAME","",0);

if No_REGIST then;
name2 = (name:upper()):match('^'..(NAME_PREFIX:upper()));
else;
name2 = name:match('^'..NAME_PREFIX);
end;

if not name2 then;
if not UNDO then;
reaper.Undo_BeginBlock();
reaper.PreventUIRefresh(1);
UNDO = true;
end;
reaper.GetSetMediaTrackInfo_String(SelTrack,"P_NAME",NAME_PREFIX..name,1);
end;
end;


if UNDO then;
reaper.PreventUIRefresh(-1);
reaper.Undo_EndBlock('Insert prefix name '..NAME_PREFIX,-1);
else;
no_undo();
end;
 
Последнее редактирование:
  • Like
Реакции: knst
@shuco, сделал на этой основе кастом для регионов, скрипт не получается, опять много действий, но работает хорошо
 

Вложения

  • fast region.jpg
    fast region.jpg
    174,4 KB · Просмотры: 86
  • fast region.mp4
    5,1 MB
Здравствуйте, кто-нибудь знает как можно выделить огибающую скриптом, и так же, в идеале, как скриптом нажать кнопку всплывающего меню. Спасибо.
 
как можно выделить огибающую скриптом
Track: Select volume envelope. Так же есть и для других огибающих.
Для fx - кодить, используя функции api. Вроде это реально.

скриптом нажать кнопку всплывающего меню
Это плохой путь. Неоправданные трудозатраты - это ж эмулировать действия пользователя, и это скорее всего где нибудь на уровне операционной системы придётся делать. Не думаю, что кто-то займётся этим.
Если есть конкретный пункт меню, значит наверняка должен быть экшн или функции в api, чем можно выполнить этот пункт.
 
Track: Select volume envelope. Так же есть и для других огибающих.
Для fx - кодить, используя функции api. Вроде это реально.


Это плохой путь. Неоправданные трудозатраты - это ж эмулировать действия пользователя, и это скорее всего где нибудь на уровне операционной системы придётся делать. Не думаю, что кто-то займётся этим.
Если есть конкретный пункт меню, значит наверняка должен быть экшн или функции в api, чем можно выполнить этот пункт.
Да я бы хотел исправить хоть как то исправить то единственное, что меня бесит в рипере - работу с огибающими.
Я не могу просто удалить огибающую шорткатом, у меня есть только выбор очистить или удалить и это постоянный выбор меня раздражает. Еще было бы иногда неплохо выделять несколько огибающих. да и с точками тоже иногда дичь бывает. Похоже, скрипт, удаляющий автоматизацию без заморочек, я не напишу.
 
Да я бы хотел исправить хоть как то исправить то единственное, что меня бесит в рипере - работу с огибающими.
Я не могу просто удалить огибающую шорткатом, у меня есть только выбор очистить или удалить и это постоянный выбор меня раздражает. Еще было бы иногда неплохо выделять несколько огибающих. да и с точками тоже иногда дичь бывает. Похоже, скрипт, удаляющий автоматизацию без заморочек, я не напишу.

Так речь про огибающие на айтемах что ли? Да, в этом есть пробел.
Есть только скрипт, который удаляет все огибающие с айтема, но не более. Поскольку в api нет для этого функций, там всё происходит на уровне изменений в самом файле проекта (chunks). Костыли, но хоть что то.
Если что, он здесь: https://forums.cockos.com/showthread.php?t=179032

А вообще, можно просто использовать огибающую на треках, а не на айтемах. Там и экшнов больше, и с помощью razor edit можно выбрать и редактировать несколько огибающих.
 
  • Like
Реакции: Lachinio
Так речь про огибающие на айтемах что ли? Да, в этом есть пробел.
Есть только скрипт, который удаляет все огибающие с айтема, но не более. Поскольку в api нет для этого функций, там всё происходит на уровне изменений в самом файле проекта (chunks). Костыли, но хоть что то.
Если что, он здесь: https://forums.cockos.com/showthread.php?t=179032

А вообще, можно просто использовать огибающую на треках, а не на айтемах. Там и экшнов больше, и с помощью razor edit можно выбрать и редактировать несколько огибающих.
Про чанки я знаю только то, что они есть. Похоже это мое упущение, но у меня все-таки получилось шорткатом, всегда удалять огибающие. Нет не про itemы, а любые огибающие, прям раздражает что нельзя выбрать несколько огибающих, несколько точек нормально, тоже. Мне даже кажется что тут не столько косяк рипера, сколько я уже не в себе и пытаюсь на каждую клавишу что-то назначить, но блин, я хочу просто выбрать несколько энвелупов, нажать delete и все.
 
А что делать, если при синхронизации ReaPack выдает такие ошибки, как поправить?
 

Вложения

  • Screenshot 2023-06-03 185546.jpg
    Screenshot 2023-06-03 185546.jpg
    87,8 KB · Просмотры: 108
Эти скрипты уже принадлежат другому пакету. Вот думай, что да как... Проданы (подарены, и т.п.) что-ли?)) Теоретически такая подлянка в Рипере может случиться в любой момент.
 
Ребят, а существует скрипт поиск по command id?
Есть два, один от Amagalma - он ищет, но не ищет по command id другого скрипта
И есть cfillion - но этот у меня и вовсе не запускается.
 

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