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

  • Автор темы Автор темы @Michael
  • Дата начала Дата начала
Последнее редактирование:
@Archchie,
reaper.Undo_BeginBlock()
--call to start a new block - это описание того что делает строка сверху, его писать в скрипте не нужно,
Строка сверху пишется в начале блока всех функций, а строка ниже пишется в конце - и тогда сможете всё, что скрипт сделает оменить одним ctrl+z
reaper.Undo_EndBlock( descchange, extraflags )
--call to end the block,with extra flags if any,and a description - это ведь тоже просто описание
 
  • Like
Реакции: Beckoff
Решаемо ли это?
Есть в меню mouse modifiers две раздельные функции, которые назначаются на клавишу мыши. В моём случае, это Clear time selection и Deselect all items and move edit cursor. (в разделе Track - Left Click) Задача - выполнить по одному клику обе эти функции. Как? Экшены для этого клика доступны, но конкретно из этих функций невозможно создать кастом - первый это переключатель модификатора мыши, а второго просто нет в списке
.

Отбой, решено.
 
Последнее редактирование:
reaper.Undo_BeginBlock()
--call to start a new block - это описание того что делает строка сверху, его писать в скрипте не нужно,
Строка сверху пишется в начале блока всех функций, а строка ниже пишется в конце - и тогда сможете всё, что скрипт сделает оменить одним ctrl+z
reaper.Undo_EndBlock( descchange, extraflags )
--call to end the block,with extra flags if any,and a description - это ведь тоже просто описание
Спасибо!!!А я вставлял все это просто в конец скрипта
Сделал все как вы написали,скрипт работает но выдает вот такую вот ошибку.555.lua:21: bad argument #1 to 'Undo_EndBlock' (string expected, got nil) Снимок.PNG
где может быть ещё ошибка?
View hidden content is available for registered users!
 
@Archchie, смотрите чужие скрипты, где используется эта функция и поймёте, что нужно ставить вместо орисания аргументов.
Ошибка та-же - оставили описание, а нужно было вписать аргументы.
 
смотрите чужие скрипты, где используется эта функция и поймёте, что нужно ставить вместо орисания аргументов.
Ошибка та-же - оставили описание, а нужно было вписать аргументы.
Разобрался!
 
  • Like
Реакции: Aleksandr Oleynik
( descchange, extraflags ) Н хехочу угадывать хочу понять, а можно объяснить пожалуйста descchange что сюда? и что сюда extraflags?
 
Просьба , если не сложно и возможно , сделать скрипт или экшен. Хотелось , чтобы скрипт работал на подобии Nudge Volume , но делал этот Nudge с параметром плагина под указателем мыши . Скрипт нужен для более точной подгонки параметров , ибо некоторые производители , в своём аналогоизме , склонны и аналоговый геморрой в цифру вносить . У плагинов могут быть "0,01" и "0,1" значения . Пожалуй лучше , разные скрипты для разных величин . Мне посоветовали для этого использовать NeatMouse , но неудобно , что его надо включать , удерживать одну кнопку постоянно . А так , было бы здорово , навёл мышь , и жмакай кнопу , слушая результат .
 
Учусь писать скрипты, пока весьма несложные, попутно читаю эту ветку форума. Наткнулся на пост прошлогодней давности
2. Как должен выглядеть кастом экшн (или скрипт, может, есть уже такой?), чтобы во время записи\воспроизведения при нажатии, например, на М маркер создавался не на позиции плей курсора, а на четыре-пять секунд раньше?
и сделал собственный скрипт, чисто для собственного же развития. Оставлю его здесь, вдруг кому-нибудь пригодится.

Что делает скрипт:
- Если включено воспроизведение или запись, маркеры ставятся тремя секундами ранее позиции плейкурсора. При этом эти маркеры создаются жёлтого цвета и с именем "!" (как напоминание о чём-то важном).
- Если воспроизведение остановлено, маркеры ставятся дефолтные, ровно по позиции эдит курсора (аналогично экшну Insert marker at current position).
- Также аналогично упомянутому экшну, если в позиции курсора уже стоит маркер, то новый создаваться не будет.
- Если в проекте имеются маркеры с индексами, к примеру, 1, 2, 4, 5 - созданный маркер будет с индексом 3, а не 6.

Назначил его на клавишу М, буду пользоваться.
 

Вложения

  • Like
Реакции: Buyan
Учусь писать скрипты, пока весьма несложные, попутно читаю эту ветку форума. Наткнулся на пост прошлогодней давности
и сделал собственный скрипт, чисто для собственного же развития. Оставлю его здесь, вдруг кому-нибудь пригодится.
Что делает скрипт:
- Если включено воспроизведение или запись, маркеры ставятся тремя секундами ранее позиции плейкурсора. При этом эти маркеры создаются жёлтого цвета и с именем "!" (как напоминание о чём-то важном).
- Если воспроизведение остановлено, маркеры ставятся дефолтные, ровно по позиции эдит курсора (аналогично экшну Insert marker at current position).
- Также аналогично упомянутому экшну, если в позиции курсора уже стоит маркер, то новый создаваться не будет.
- Если в проекте имеются маркеры с индексами, к примеру, 1, 2, 4, 5 - созданный маркер будет с индексом 3, а не 6.
Назначил его на клавишу М, буду пользоваться.

Замечена ошибка:
1. Если в проекте нет маркеров, то выполнение скрипта выдаёт ошибку.
5LnWaUO.png
 
Решил объединить два скрипта в один.Скажите что нужно прописать между ними что бы получилось Toggle ?типа цикл экшена.
 
Последнее редактирование:
Решил объединить два скрипта в один.Скажите что нужно прописать между ними что бы получилось Toggle ?

Это через Cycle Action Editor делается, который в меню Extemsions появляется после установки SWS.
!Step ставится командой insert step
 
Вау!!!!!!!!!!!! посмотрел скрипт....... а с чего начинали учиться
?
Да вначале как и все, наверное, с анализа чужих скриптов. Потом посмотрел видеоуроки X-Raym'a (с английскими субтитрами на удивление всё понял), почитал некоторые материалы по Lua. Как-то так, постепенно.

Замечена ошибка:
1. Если в проекте нет маркеров, то выполнение скрипта выдаёт ошибку.
5LnWaUO.png
Да, уже тоже заметил, поправил.
 
@EUGEN27771, Ваш скрипт Freeze selected tracks(only instruments).lua пришелся очень кстати.
Но обнаружилось некоторое неприятное обстоятельство, Freeze срабатывал через раз. Врезультате анализа алгоритма выяснил, что VSTi не всегда успевает подгрузить сэмплы до начала фриза, после выхода из офлайн-режима.
Ввиду того, что c lua я еще не знаком, да из скриптами для риппера в целом, пришлось помучатся, покурить документацию и поломать голову.
Ну в общем проблему исправил и внес еще пару мелких корректировок (получил так-сказать, свой первый опыт скрипто-писательства(скорее скрипто-осквернительства:) для рипер).
В офaлайн вводятся только те FX которые, стоят после VSTi. Так-как часто перед инструментом могут находится разные FX работающие с MIDI и прочие. Сам VSTi не офлайнится, что и устраняет возникшую проблему.
Добавил еще одно условие - если VSTi необнаружен на треке, фриз не происходит.

PHP:
--[[
  * ReaScript Name:Freeze selected tracks(only instruments)
  * Lua script for Cockos REAPER
  * Author: EUGEN27771
  * Author URI: http://forum.cockos.com/member.php?u=50462
  * Licence: GPL v3
  * Version: 1.2 (Rebuilding by Byuan 07.12.2017)
  ]]

---------------------------------------------
-- Freeze -----------------------------------
---------------------------------------------
function Freeze(track)
  reaper.SetOnlyTrackSelected(track)  -- Select current track only
  if reaper.TrackFX_GetInstrument(track)==-1 then  -- If VSTi not exist, freezing canceled
  reaper.ShowMessageBox( "The instrument is not found on selected track.", [[gen_Freeze selected tracks(only instruments)]], 0 )
  return
  end   

  -- Offline alls FX excepted instruments --------------
  reaper.Main_OnCommand(reaper.NamedCommandLookup("_S&M_SELFX1"), 0)  -- select first fx
  for fx=1, reaper.TrackFX_GetCount(track) do
  if fx>reaper.TrackFX_GetInstrument(track)+1 then
  reaper.Main_OnCommand(reaper.NamedCommandLookup("_S&M_FXOFF_SETOFFSEL"), 0) -- Offline only the following FX after VSTi
  end
  reaper.Main_OnCommand(reaper.NamedCommandLookup("_S&M_SELFXNEXT"), 0)  -- to next fx
  end

  -- Freeze, online all -------------------
  reaper.Main_OnCommand(40877, 0)  -- Freeze
  reaper.Main_OnCommand(40536, 0)  -- online all fxs
end

---------------------------------------------
-- Start ------------------------------------
---------------------------------------------
local track_cnt = reaper.CountSelectedTracks(0)
local track_tb = {}
-- Get sel tracks ------
for i=1, track_cnt do  
  track_tb[i] = reaper.GetSelectedTrack(0, i-1)
end
-- Freeze tracks -------
reaper.Undo_BeginBlock()
for i=1, track_cnt do
  Freeze(track_tb[i])
end
-- Restore sel state ---
for i=1, track_cnt do
  reaper.SetTrackSelected(track_tb[i], true)
end
reaper.Undo_EndBlock("Freeze selected tracks(only instruments)", -1)
 
Последнее редактирование:
  • Like
Реакции: eno777
Немного подкорректировал скрипт @Aleksandr Oleynik: свёл всё в один цикл, добавил undo name и включение группировки треков (Enable track grouping), если она выключена.
PHP:
local undo = "Set tracks symmetrically and add to unused group"
track_g = 0
stm_n = 1
counttracks = reaper.CountTracks(0)
count_selected_tracks = reaper.CountSelectedTracks(0)
if count_selected_tracks == 2 then
    reaper.Undo_BeginBlock()
    if reaper.GetToggleCommandState(40771) == 0 then
        reaper.Main_OnCommand(40771, 0) -- Enable track grouping
    end
    for i = 1, counttracks do
        local function error()
            reaper.MB("One or both of selected tracks is already in group" , "Error", 0)
        end
       
        local track = reaper.GetTrack(0, i - 1)
        local track_sel = reaper.IsTrackSelected(track)
        stm = reaper.GetSetTrackGroupMembership(track, "VOLUME_MASTER", 0, 0)
        if stm >= stm_n then
        stm_n = stm*2
        end

        if track_sel == true and stm ~= 0 then
            track_g = 2
            error()
            break
        end
       
        if track_sel == true and track_g == 0 then
            reaper.SetMediaTrackInfo_Value(track, "D_PAN", -1)
            reaper.GetSetTrackGroupMembership(track, "PAN_MASTER", stm_n, stm_n )
            reaper.GetSetTrackGroupMembership(track, "PAN_SLAVE", stm_n, stm_n )
            reaper.GetSetTrackGroupMembership(track, "VOLUME_MASTER", stm_n, stm_n )
            reaper.GetSetTrackGroupMembership(track, "VOLUME_SLAVE", stm_n, stm_n )
            reaper.GetSetTrackGroupMembership(track, "MUTE_MASTER", stm_n, stm_n )
            reaper.GetSetTrackGroupMembership(track, "MUTE_SLAVE", stm_n, stm_n )
            reaper.GetSetTrackGroupMembership(track, "SOLO_MASTER", stm_n, stm_n )
            reaper.GetSetTrackGroupMembership(track, "SOLO_SLAVE", stm_n, stm_n )
            reaper.GetSetTrackGroupMembership(track, "PAN_REVERSE", stm_n, stm_n )
            track_g = 1
        elseif track_sel == true and track_g == 1 then
            reaper.SetMediaTrackInfo_Value(track, "D_PAN", 1)
            reaper.GetSetTrackGroupMembership(track, "PAN_MASTER", stm_n, stm_n )
            reaper.GetSetTrackGroupMembership(track, "PAN_SLAVE", stm_n, stm_n )
            reaper.GetSetTrackGroupMembership(track, "VOLUME_MASTER", stm_n, stm_n )
            reaper.GetSetTrackGroupMembership(track, "VOLUME_SLAVE", stm_n, stm_n )
            reaper.GetSetTrackGroupMembership(track, "MUTE_MASTER", stm_n, stm_n )
            reaper.GetSetTrackGroupMembership(track, "MUTE_SLAVE", stm_n, stm_n )
            reaper.GetSetTrackGroupMembership(track, "SOLO_MASTER", stm_n, stm_n )
            reaper.GetSetTrackGroupMembership(track, "SOLO_SLAVE", stm_n, stm_n )
        end
    end
    reaper.Undo_EndBlock(undo, -1)
end
 
Если хочешь посмотреть на РЕАЛЬНУЮ БОМБУ, скачай Женин FX Reack -
http://rmmedia.ru/threads/110165/page-19#post-2165444
Вот ЭТО РАБОТА!
Было-бы очень интересно ознакомится с данным продуктом. Но ссылка таргетируется пост "http://rmmedia.ru/threads/110165/page-19#post-2165444" который не имеет по ходу никакого отношения к..

Возникает впечатления, что многие сообщения Евгения, возможно и других пользователей в этой ветке, либо мне не видны, либо были удалены. По контексту видно, что они должны были быть, так-как есть много ответов на несуществующие сообщения.
Прошу простить меня за мой интерес и подозрительность, но я просто немного в растерянности. Хотелось-бы немного ориентироваться в происходящем здесь.
 
Последнее редактирование:
@Buyan,
Вот и я тоже перечитываю ветку и понимаю, что некоторые посты были удалены. С чем это связано, понять не могу.
 
@Aleksandr Oleynik, Премного благодарен за ссылку!
Низкий поклон Евгению, он действительно гений и настоящий энтузиаст. Такую работу проделал. Я без преувеличения восхищен.
FX Reack - это именно то, что я себе представлял и видел в своих снах, решение многих проблем и... в общем пока одни эмоции. Рипер имеет уникальные возможности в плане роутинга и вообще, но как всегда, возникает вопрос удобства и оперативности управления сложными решениями в прожектах. Одним словом такие скрипты раскрывают всю мощность рипера.
Приятно, когда на форуме есть фидбэк, радует, что проблемы и вопросы можно решить. Еще раз Вам @Aleksandr Oleynik, спасибо!
 
Последнее редактирование:
  • Like
Реакции: Aleksandr Oleynik
Можно ли как-нибудь узнать при добавлении FX, эффект это или же инструмент, неросредственно до его добавления?

Пишу свой вариант скрипта для добавления FX и хочу исключить случайную вставку VSTi на мастер. Для этого прописать условие: если выделен Мастер, то проверить, является ли выбранный FX эффектом или инструментом, и если это инструмент - не добавлять его. Возможно такое?
 
Можно ли как-нибудь узнать при добавлении FX, эффект это или же инструмент, неросредственно до его добавления?
сравнить с индексом reaper.TrackFX_GetInstrument( track ) или по i в имени (VSTi, AUi, DXi)
 
  • Like
Реакции: Buyan и CerberPic
Мне кажется, есть смысл создать отдельную ветку для скриптописателей типа "Вопросы по созданию скриптов", чтобы вопрошающие могли в отдельной ветке получать от гуру ответы на вопросы типа "Как достать такую-то функцию", "Что добавить в скрипт, чтобы....." и т.д.
 
  • Like
Реакции: Microtonic
  • Like
Реакции: Buyan
я думаю, что идея в разделении: кто-то пишет сам, кто-то просит чтобы ему написали.
Поддерживаю. Можно разделить на две ветки. В одной просьбы и инструктажи по написанию скриптов и экшнов, в другой - напишите мне скрипт пожалуйста.
Хотя с другой стороны обсуждаемое в двух таких отдельных ветках неизбежно будет пересекается и вопросы будут перемещаться с одной в другую. В данном случае тоже возможна путаница.
 
Скажите пожалуйста что нужно дописать в скрипт, что бы когда отсутствует тайм селекшен скрипт не срабатывал?
@Archchie, попробуйте вот это.
PHP:
local undo = "Delete all items and envelope points in time selection"

reaper.PreventUIRefresh(-1)
reaper.Undo_BeginBlock()
local start_time, end_time = reaper.GetSet_LoopTimeRange(0, 0, 0, 0, 0)
if start_time ~= end_time then
    reaper.SelectAllMediaItems(0, 0)
    reaper.Main_OnCommand(40061, 0) -- Split items at time selection
    local item_count = reaper.CountMediaItems(0)
    if item_count ~= 0 then
        -- reaper.ShowConsoleMsg("Items: "..tostring(item_count).."\n")
        for i = 0, item_count - 1 do
            local item = reaper.GetMediaItem(0, i)
            local item_pos = reaper.GetMediaItemInfo_Value(item, "D_POSITION")
            local item_len = reaper.GetMediaItemInfo_Value(item, "D_LENGTH")
            local item_end = item_pos + item_len
            if (item_pos == start_time) or (item_end == end_time) or (item_pos > start_time and item_end < end_time) then
                reaper.SetMediaItemSelected(item, 1)
                reaper.SetMediaItemInfo_Value(item, "C_LOCK", 0)
            end
        end
        reaper.Main_OnCommand(40006, 0) -- Remove items
    end
    local track_count = reaper.CountTracks(0)
    for t = 0, track_count - 1 do
        local track = reaper.GetTrack(0, t)
        local env_count = reaper.CountTrackEnvelopes(track)
        for e = 0, env_count - 1 do
            local env = reaper.GetTrackEnvelope(track, e)
            reaper.DeleteEnvelopePointRange(env, start_time, end_time)
            local autoitem_count = reaper.CountAutomationItems(env)
            for ai = 0, autoitem_count - 1 do
                reaper.GetSetAutomationItemInfo(env, ai, "D_UISEL", 1, 1)
            end
            reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_SAVE_CURSOR_POS_SLOT_1"), 0) -- Save edit cursor position, slot 01
            reaper.Main_OnCommand(40630, 0) -- Go to start of time selection
            reaper.Main_OnCommand(42087, 0) -- Split automation items
            reaper.Main_OnCommand(40631, 0) -- Go to end of time selection
            reaper.Main_OnCommand(42087, 0) -- Split automation items
            reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_RESTORE_CURSOR_POS_SLOT_1"), 0) -- Restore edit cursor position, slot 01
            autoitem_count = reaper.CountAutomationItems(env)
            for ai = 0, autoitem_count - 1 do
                reaper.GetSetAutomationItemInfo(env, ai, "D_UISEL", 0, 1)
                local autoitem_pos = reaper.GetSetAutomationItemInfo(env, ai, "D_POSITION", 0, 0)
                local autoitem_len = reaper.GetSetAutomationItemInfo(env, ai, "D_LENGTH", 0, 0)
                local autoitem_end = autoitem_pos + autoitem_len
                if (autoitem_pos == start_time) or (autoitem_end == end_time) or (autoitem_pos > start_time and autoitem_end < end_time) then
                    reaper.GetSetAutomationItemInfo(env, ai, "D_UISEL", 1, 1)
                end
            end
        end
    end
    reaper.Main_OnCommand(42086, 0) -- Delete automation items
end
reaper.Undo_EndBlock(undo, -1)
reaper.PreventUIRefresh(1)

Подскажите из чего организовать удаление всего содержимого в выделенной области. Речь идет конкретно об огибающих автоматизации. Получается собрать кастом который удаляет все аудио и миди айтемы по выделению, однако точки и энвелопы остаются пока их отдельно не выбрать. Забавляет то, что в стандартных экшенах есть вариант удалить все по выделению, в том числе и автоматизацию со всех треков, однако со смещением крайнего контента, а такой простой и востребованной вещи без сдвига нет. Пробовал с нововведеными айтемами автоматизации, тоже не работает. Нужно просто удалять абсолютно все данные по выделенной области, без сдвигов
Попробуйте тоже скрипт. Айтемы автоматизации тоже удаляет.

Хотя с другой стороны обсуждаемое в двух таких отдельных ветках неизбежно будет пересекается и вопросы будут перемещаться с одной в другую. В данном случае тоже возможна путаница.

я думаю, что идея в разделении: кто-то пишет сам, кто-то просит чтобы ему написали.
Так и для тех, кто пишет, есть темы. А здесь те, кто пишет, помогают тем, кто либо вообще не пишет, либо только начинает писать. Как-то так. :)

Хотя с другой стороны обсуждаемое в двух таких отдельных ветках неизбежно будет пересекается и вопросы будут перемещаться с одной в другую. В данном случае тоже возможна путаница.
Именно.
 
Последнее редактирование:

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