Помогите создать экшн / кастом экшн / скрипт

  • Автор темы Автор темы @Michael
  • Дата начала Дата начала
есть стандартный экшен File: Save new version of project (automatically increment project name)
помогите плз сделать скрипт, который будет "по-умному" сохранять новые версии проектов! )

вышеуказанный экшен добавляет к имени файла _1, _2 и тд.
это не удобно, многие браузеры файлов криво ранжируют 1,2 если они не называются 01, 02..
также я при старте проекта сразу его нумирую в конце 01.

можно ли сделать скрипт , который определял имя файла (у меня это vax mix 01 или vax master 01 или vax semi mix 01 и др) и сохранял новую версию проекта с цифровой на одну больше (vax mix 02, vax master 01, vax semi mix 02 и др)?

спасибо!
 
  • Like
Реакции: arkaine
@vax, Вроде получилось сделать - но не знаю подойдет тебе такой вариант или нет.
Имя подменяется все как ты хочешь - но при сохранении открытый проект не просто подменяет имя (как это делает стандартный экшен), а заново открывает проект т.е. все плагины заново сканируются-запускаются.
А что бы подменить имя у открытого проекта не перезапуская его я не нашел способа как это сделать.
JavaScript:
    --Save new version of project (automatically increase project name)
    
    
    -------------------------------------------------------
    local function no_undo()reaper.defer(function()end)end;
    -------------------------------------------------------
    
    
    reaper.Main_OnCommand(41895,0);--Save new version of project
    
    
    local projfn = ({reaper.EnumProjects(-1)})[2]:gsub('\\','/');
    if not projfn or projfn == "" then no_undo()return end;
    
    
    ---------------------------------------------------------
    local saveopts = reaper.SNM_GetIntConfigVar('saveopts',0);
    if saveopts&1 > 0 then;
        SetSaveopts = saveopts &~ (saveopts&1);
        reaper.SNM_SetIntConfigVar('saveopts',SetSaveopts);
    end;
    reaper.Main_SaveProject(0,false);
    if saveopts&1 > 0 then;
        reaper.SNM_SetIntConfigVar('saveopts',saveopts);
    end;
    ---------------------------------------------------------
    
    
    ---------------------------------------------------------
    local prePath,preName = projfn:match('(.+)[/\\](.+)');
    
    local Name,Ext = preName:match('^(.-)(%.[^.]*)$');
    
    local Name2 = Name:gsub('_%d*%s-$','');
    
    local Name3 = Name2:match('(.+)(%s+%d+%s-)$')or Name2;
    ---------------------------------------------------------
    
    
    
    ---------------------------------------------------------
    local T = {};
    for i = 1,math.huge do;
        local EnumFile = reaper.EnumerateFiles(prePath,i-1);
        if not EnumFile then break end; 
        local Name_2 = EnumFile:match('^(.-)(%.[^.]*)$')or EnumFile;
        local Ext_2  = EnumFile:match('^.-(%.[^.]+)$') or '';
        
        local Ext_3 = (Ext_2):upper();
        local EnumFile2 = Name_2..Ext_3;
        T[#T+1] = EnumFile2;
    end;
    ---------------------------------------------------------
    
    
    
    ---------------------------------------------------------
    local X;
    ::res::;
    X = (tonumber(X) or 0)+1;
    for i = 1,#T do;
        
        if tonumber(X) < 10 then X = 0 .. tonumber(X) end;
        
        if T[i]:match('^(.-)%.RPP%s-$') == Name3..' '..X then;
            goto res;
        end;
        
        if tonumber(X) > 100000 then reaper.MB('!!! ???','Error',0) return end;--!!!!!!
    end;
    ---------------------------------------------------------
    
    
    
    ---------------------------------------------------------
    local newName = Name3..' '..X..'.RPP';
    
    os.rename(projfn,prePath..'/'..newName);
    
    reaper.Main_openProject(prePath..'/'..newName);
    ---------------------------------------------------------
    no_undo();
 
А стандартными функциями lua - типа io. ?
Файл проекта и открытый проект, это как будто два разных файла. Если переименовать файл проекта или вообще его удалить, то с открытым проектом ничего не произойдет, а при сохранении проект создаст новый файл со старым именем.
Я в этом скрипте так и делаю, переименовываю с помощью стандартных функций lua, так как у api рипера ничего подобного не нашел, но что бы изменения прилетели в открытый проект в виде нового проекта, нужно запустить этот файл проекта как новый проект.
 
@Archchie, скрипт не пробовал, почитал, что ты пишешь и огорчился )
у меня проекты несколько минут открываются из-за кол-ва дорог и Acustica Audio.
неужели нет способа сделать save as с нужным тебе именем?
 
  • Like
Реакции: Archie's
неужели нет способа сделать save as с нужным тебе именем?
Сохранить то с нужным именем можно, но тебе ведь надо что бы он (проект с новым именем) еще и открылся, что бы ты в нем начал работать и вот именно это скриптом и не получается сделать, для открытия нового проекта только запускать его.
 
Сохранить то с нужным именем можно, но тебе ведь надо что бы он (проект с новым именем) еще и открылся, что бы ты в нем начал работать и вот именно это скриптом и не получается сделать, для открытия нового проекта только запускать его.

возможно я не верно поставил задачу?
проект УЖЕ открыт. у него имя оканчивающееся на 01 (или на 06 или на 09).
нужен экшен который бы сохранял текущий проект под оригинальным именем и затем переименовывал текущий с числом на 1 больше.
 
  • Like
Реакции: Archie's
@vax, Нет, нету возможности сохранить данный проект с указанным путем без диалогового окна, весь оф. форум перерыр - эту функцию просят с 2015 года целая куча людей включая меня, я тоже уже писал за эту функцию пол года назад. Раз за пять лет не добавили - значит уже и не стоит ждать. Зато пока это искал, нашел ответ на предыдущий твой вопрос,
когда загружаю project template через file -> project templates, при нажатии на ctrl+s Рипер спрашивает куда сохранять новый проект.
если пользуюсь скриптом Xenakios/SWS: [Deprecated] Load project template , то при нажатии ctrl+s Рипер пишет сразу поверх template файла, что дико не удобно.
добавили возможность открывать проект как шаблон
PHP:
    local Path = [[C:\Users\....\путь\до\проекта]]    --<<< Сюда вписываешь путь проекта
 
    local Name = [[ИМЯ ПРОЕКТА.RPP]]                --<<< Сюда вписываешь имя проекта
 
    -------------------------------------------
    local file = io.open(Path..'/'..Name,'r');
    if file then;
        file:close();
        reaper.Main_SaveProject(0,false);
        reaper.Main_openProject('template:'..Path..'/'..Name);
    end;
    --------------------------------------------
возможно я не верно поставил задачу?
верно - ты же в пример экшен привел
нужен экшен который бы сохранял текущий проект под оригинальным именем
Это я понял и предыдущий скрипт это и делает как и экшен
и затем переименовывал текущий с числом на 1 больше.
И вот тут все спотыкается, его невозможно открытый переименовать "скриптом", его надо запустить по новой с новым именем (что предыдущий скрипт и делает), что бы он понял что это новый проект.
 
Последнее редактирование:
@Archchie,
добавили возможность открывать проект как шаблон - ОТЛИЧНО!
а можно реализовать это так, чтобы не указывать путь к проекту и его имя?
а то у каждого свой конфиг + на макинтоше свои пути..

то есть, реализовать через Resources, Project Templates?
или в идеале, чтобы относительный путь был к Project Templates (хотя как эта тема на маке сработает - хез)
 
@vax, через "Resources, Project Templates" точно не получится, а относительный путь можно сделать, т.е нужно будет в скрипте только имя проекта ввести и скрипт будет искать в папке рипера/ProjectTemplates или можно сделать что бы вот такое окно выскакивало, что бы в нем выбирать какой проект открыть в виде шаблона. Я просто до конца не понимаю задачу как лучше.
1577198008027.png
 
Последнее редактирование:
@vax, через "Resources, Project Templates" точно не получится, а относительный путь можно сделать, т.е нужно будет в скрипте только имя проекта ввести и скрипт будет искать в папке рипера/ProjectTemplates или можно сделать что бы вот такое окно выскакивало, что бы в нем выбирать какой проект открыть в виде шаблона. Я просто до конца не понимаю задачу как лучше.
Посмотреть вложение 173347

для идеальной эргономики не должно быть окон вообще лишних ))
имя проекта из Reaper/ProjectTemplates - это приемлемо!
В 5-м Рипере будет работать, я ещё не обновился? ))

local Path = [[C:\Users\....\путь\до\проекта]] --<<< Сюда вписываешь путь проекта
так путь должен быть Reaper\ProjectTemplates или нет?
 
  • Like
Реакции: Archie's
@vax, Как путь должен выглядеть я в скрипте описал, но можно вообще его не вводить. Только имя проекта.
PHP:
    local Name = 'ИМЯ ПРОЕКТА' --<<< Сюда вписываешь имя проекта
                   
   
    local Path = ''  --<<< Сюда вписываешь путь проекта (НЕ ОБЯЗАТЕЛЬНО)
                 -- Путь проекта должен выглядеть примерно так:
                 -- Path = 'C:/Users/User/reaper/project' 
                 -- В windows надо развернуть все слэши или прописать путь в квадратных двойных скобках
                 -- Path = [[C:\Users\User\reaper\project]]
                 -- Или путь может быть относительным
                 -- Path = 'ProjectTemplates' Продолжить путь по папке рипера
                 -- Или оставьте путь пустым тогда поиск будет происходить по папки ProjectTemplates
                 -- Path = ''
    
    
    
    -------------------------------------------------------
    local function no_undo()reaper.defer(function()end)end;
    -------------------------------------------------------
    
    
    local file;
    for i = 1,3 do;
        file = io.open(Path..'/'..Name,'r');
        if not file then;
            file = io.open(Path..'/'..Name..'.rpp','r');
            if file then Name = Name..'.rpp'end;
        end;
        if file then break end;
        if i == 1 then Path = reaper.GetResourcePath()..'/'..Path end;
        if i == 2 then Path = reaper.GetResourcePath()..'/'..'ProjectTemplates' end;
    end;
    
    if not file then reaper.MB('Шаблон не найден!\n\nTemplate is not found!','Woops!',0) no_undo() return end;
    
    file:close();
    
    --reaper.Main_SaveProject(0,false);
    
    reaper.Main_openProject('template:'..Path..'/'..Name);
    no_undo();
В 5-м Рипере будет работать, я ещё не обновился? ))
Будет))
 
  • Like
Реакции: YuriOl
Скажите пожал. как сделать баунс конкретного участка айтема так чтоб было без этих не нужных кусков как в мультике.Спс
demo.gif
 

Вложения

  • demo.gif
    demo.gif
    805,7 KB · Просмотры: 231
Скажите пожал. как сделать баунс конкретного участка айтема так чтоб было без этих не нужных кусков как в мультике.Спс
Глю или рендер?
Экшн Item: Glue items или Track: Render selected area of tracks to stereo stem tracks (and mute originals)
 
Может ли кто-нибудь подсказать (если уже есть) или создать достаточно простой скрипт (экшном вряд ли дело ограничится) с рандомизацией (высоты) MIDI-нот (желательно как из KeyEditor'а, так и в выделенных медиа (миди) айтемах в Arrange View [т.е. это уже будет 2 скрипта])?

В ReaPack'е есть небезызвестные скрипты "MIDI Ex Machina" (от RobU) и "MIDI Randomization Tool" (от Lokasenna), но, к сожалению, они действуют лишь будучи открытыми как окна, а мне нужно, чтобы скрипт действовал как просто экшн.

Скажем, чтобы рандомизация нот происходила в 1--2 октавах, ну и файлик данного скрипта можно было править по мере необходимости / создать несколько версий данного скрипта.
 
Помогите, пожалуйста.
Попробовал воспользоваться скриптами Save/Restore MIDI Editor View (slot #) от Me2Beats.
Но скрипты "Save MIDI Editor View", "Save MIDI Editor View, Slot 1", "Save MIDI Editor View, Slot 2" оповещают об ошибке:
me2beats_Save MIDI editor view.lua:31: attempt to call a nil value (field 'GetTrackChunk')
me2beats_Save MIDI editor view, slot 1.lua:31: attempt to call a nil value (field 'GetTrackChunk')
me2beats_Save MIDI editor view, slot 2.lua:31: attempt to call a nil value (field 'GetTrackChunk')
 
@arkaine,
PHP:
-- @description Save MIDI editor view, slot 1
-- @version 1.1
-- @author me2beats
-- @changelog
--  + init

local r = reaper; local function nothing() end; local function bla() r.defer(nothing) end

function GetTrackChunk(track)
  if not track then return end
  local fast_str, track_chunk
  fast_str = r.SNM_CreateFastString("")
  if r.SNM_GetSetObjectState(track, fast_str, false, false) then
    track_chunk = r.SNM_GetFastString(fast_str)
  end
  r.SNM_DeleteFastString(fast_str)  
  return track_chunk
end

function esc(str) str = str:gsub('%-', '%%-') return str end

local take = r.MIDIEditor_GetTake(r.MIDIEditor_GetActive())
if not take then bla() return end

local guid = r.BR_GetMediaItemTakeGUID(take)

local item = r.GetMediaItemTake_Item(take)

local tr = r.GetMediaItem_Track(item)

local chunk = GetTrackChunk(tr)

local view = chunk:match(esc(guid)..'.-CFGEDITVIEW(.-)\n')

if not view then bla() return end

local ext_sec, ext_key = 'me2beats_save-restore', 'MIDI view1'

r.DeleteExtState(ext_sec, ext_key, 0)
r.SetExtState(ext_sec, ext_key, view, 0)

r.Undo_BeginBlock() r.PreventUIRefresh(1)

r.PreventUIRefresh(-1) r.Undo_EndBlock('Save MIDI editor view', 2)
PHP:
-- @description Restore MIDI editor view, slot 1
-- @version 1.1
-- @author me2beats
-- @changelog
--  + init

local r = reaper; local function nothing() end; local function bla() r.defer(nothing) end

function GetTrackChunk(track)
  if not track then return end
  local fast_str, track_chunk
  fast_str = r.SNM_CreateFastString("")
  if r.SNM_GetSetObjectState(track, fast_str, false, false) then
    track_chunk = r.SNM_GetFastString(fast_str)
  end
  r.SNM_DeleteFastString(fast_str)  
  return track_chunk
end

function SetTrackChunk(track, track_chunk)
  if not (track and track_chunk) then return end
  local fast_str, ret 
  fast_str = r.SNM_CreateFastString("")
  if r.SNM_SetFastString(fast_str, track_chunk) then
    ret = r.SNM_GetSetObjectState(track, fast_str, true, false)
  end
  r.SNM_DeleteFastString(fast_str)
  return ret
end

function esc(str) str = str:gsub('%-', '%%-') return str end

local take = r.MIDIEditor_GetTake(r.MIDIEditor_GetActive())
if not take then bla() return end

local ext_sec, ext_key = 'me2beats_save-restore', 'MIDI view1'
local view = r.GetExtState(ext_sec, ext_key)
if not view or view == '' then bla() return end

local guid = r.BR_GetMediaItemTakeGUID(take)
local item = r.GetMediaItemTake_Item(take)

local tr = r.GetMediaItem_Track(item)

r.Undo_BeginBlock() r.PreventUIRefresh(1)

local sync
if r.GetToggleCommandStateEx(32060, 40640) == 1 then
  r.MIDIEditor_LastFocused_OnCommand(40640,0)--Timebase: Toggle sync to arrange view
  sync = 1
end

r.SelectAllMediaItems(0, 0); r.SetMediaItemSelected(item, 1)

local chunk = GetTrackChunk(tr)
local a, old_view, b = chunk:match('(.*'..esc(guid)..'.-CFGEDITVIEW)(.-)(\n.*)')
local new_chunk = a..view..b

r.MIDIEditor_LastFocused_OnCommand(2, 0) -- close editor

local tr_items = r.CountTrackMediaItems(tr)
for i = tr_items-1,0,-1 do
  local tr_item = r.GetTrackMediaItem(tr, i)
  r.DeleteTrackMediaItem(tr, tr_item)
  if item == tr_item then break end
end

SetTrackChunk(tr, new_chunk)

r.Main_OnCommand(40109,0)--Item: Open items in primary external editor

if sync then r.MIDIEditor_LastFocused_OnCommand(40640,0) end --Timebase: Toggle sync to arrange view

r.PreventUIRefresh(-1) r.Undo_EndBlock('Restore MIDI editor view', 2)
 
  • Like
Реакции: Andernik и arkaine
@Archchie, предновогодние чудеса.) Спасибо огромное.

А то у меня в МИДИ эдиторе было множество кастом экшнов, связанных с перемещением Edit Cursor'а, а мне хотелось, чтобы после выполнения всех экшнов курсор оставался в исходном положении, для чего я прибег к использованию экшнов Save/Restore Edit Cursor Position; и бывало, что открытый вид (view) МИДИ эдитора (если он был за пределами начальной позиции Edit Cursor'а, которая Save'илась экшном Save Edit Cursor Position) сбрасывался на тот, к которому курсор перемещался под воздействием экшна Restore Edit Cursor Position.
 
В Рипере есть 2 экшна "Select Item Under Mouse Cursor", второй из которых "leaving other items selected".

Помогите, пожалуйста, очень нужен скрипт Select Item Under Mouse Cursor, который бы:
1. При расположении курсора мышки над Item'ом выделял данный айтем (и убирал выделение с остальных айтемов, если они были выделены) -- т.е. при расположении курсора мышки над Item'ом действовал бы как просто "Select Item Under Mouse Cursor".
2. При расположении курсора мышки на свободном пространстве трека сохранял выделение выделенных айтемов -- т.е. при расположении курсора мышки на свободном пространстве трека действовал бы как "Select Item Under Mouse Cursor (leaving other items selected)".

Предполагаю, я не единственный человек, которого интересует возможность совершения действий над айтемами Under Mouse Cursor, только вот дефолтные экшны дают куцый результат, поскольку, учитывая принцип их работы, часто приходится снимать выделение с отдельных айтемов.
 

Хотел создать экшн с этого видео,но команду: SWS/S&M: FX chain fromselected track
не находит у меня.Чем её заменить?
 
Приветствую, камрады. Очень часто приходится заходить в меню в recent projects, нет ли возможности вывести это меню в тулбар?
Экшена не нашел.

Action - Recent projects menu.jpg
 

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