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

Archie's

Well-Known Member
24 Окт 2017
1.936
1.296
113
Последнее редактирование:

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.063
113
62
Киев
@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

Kokarev Maxim

ex cool
13 Май 2007
5.275
4.372
113
44
Барнаул
recording-studio.ru
Решаемо ли это?
Есть в меню mouse modifiers две раздельные функции, которые назначаются на клавишу мыши. В моём случае, это Clear time selection и Deselect all items and move edit cursor. (в разделе Track - Left Click) Задача - выполнить по одному клику обе эти функции. Как? Экшены для этого клика доступны, но конкретно из этих функций невозможно создать кастом - первый это переключатель модификатора мыши, а второго просто нет в списке
.

Отбой, решено.
 
Последнее редактирование:

Archie's

Well-Known Member
24 Окт 2017
1.936
1.296
113
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
где может быть ещё ошибка?
Скрытое содержимое для зарегистрированных пользователей!
 

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.063
113
62
Киев
@Archchie, смотрите чужие скрипты, где используется эта функция и поймёте, что нужно ставить вместо орисания аргументов.
Ошибка та-же - оставили описание, а нужно было вписать аргументы.
 

Archie's

Well-Known Member
24 Окт 2017
1.936
1.296
113
смотрите чужие скрипты, где используется эта функция и поймёте, что нужно ставить вместо орисания аргументов.
Ошибка та-же - оставили описание, а нужно было вписать аргументы.
Разобрался!
 
  • Like
Реакции: Aleksandr Oleynik

Maestro Sound

Active Member
1 Ноя 2007
721
86
28
( descchange, extraflags ) Н хехочу угадывать хочу понять, а можно объяснить пожалуйста descchange что сюда? и что сюда extraflags?
 

Maestro Sound

Active Member
1 Ноя 2007
721
86
28
Скрытое содержимое для зарегистрированных пользователей!
Вот опять непонятно я говорил ( descchange, extraflags ) а не о (script_title, 1) "descchange" что сюда? "extraflags" и что сюда? script_title, 1 название скрипта ввожу но вот меняя цифру возврата нет
 

Al Brazy

Well-Known Member
14 Авг 2009
774
1.090
93
51
Россия
Просьба , если не сложно и возможно , сделать скрипт или экшен. Хотелось , чтобы скрипт работал на подобии Nudge Volume , но делал этот Nudge с параметром плагина под указателем мыши . Скрипт нужен для более точной подгонки параметров , ибо некоторые производители , в своём аналогоизме , склонны и аналоговый геморрой в цифру вносить . У плагинов могут быть "0,01" и "0,1" значения . Пожалуй лучше , разные скрипты для разных величин . Мне посоветовали для этого использовать NeatMouse , но неудобно , что его надо включать , удерживать одну кнопку постоянно . А так , было бы здорово , навёл мышь , и жмакай кнопу , слушая результат .
 

CerberPic

Member
17 Фев 2017
70
22
8
35
Учусь писать скрипты, пока весьма несложные, попутно читаю эту ветку форума. Наткнулся на пост прошлогодней давности
2. Как должен выглядеть кастом экшн (или скрипт, может, есть уже такой?), чтобы во время записи\воспроизведения при нажатии, например, на М маркер создавался не на позиции плей курсора, а на четыре-пять секунд раньше?
и сделал собственный скрипт, чисто для собственного же развития. Оставлю его здесь, вдруг кому-нибудь пригодится.

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

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

Вложения

  • Like
Реакции: Buyan

Microtonic

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

Archie's

Well-Known Member
24 Окт 2017
1.936
1.296
113
Решил объединить два скрипта в один.Скажите что нужно прописать между ними что бы получилось Toggle ?типа цикл экшена.
 
Последнее редактирование:

Kokarev Maxim

ex cool
13 Май 2007
5.275
4.372
113
44
Барнаул
recording-studio.ru
Решил объединить два скрипта в один.Скажите что нужно прописать между ними что бы получилось Toggle ?
Это через Cycle Action Editor делается, который в меню Extemsions появляется после установки SWS.
!Step ставится командой insert step
 

CerberPic

Member
17 Фев 2017
70
22
8
35
Вау!!!!!!!!!!!! посмотрел скрипт....... а с чего начинали учиться
?
Да вначале как и все, наверное, с анализа чужих скриптов. Потом посмотрел видеоуроки X-Raym'a (с английскими субтитрами на удивление всё понял), почитал некоторые материалы по Lua. Как-то так, постепенно.

Замечена ошибка:
1. Если в проекте нет маркеров, то выполнение скрипта выдаёт ошибку.
Да, уже тоже заметил, поправил.
 

Buyan

Member
19 Апр 2016
137
24
18
40
Белая Церковь
@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

CerberPic

Member
17 Фев 2017
70
22
8
35
Немного подкорректировал скрипт @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
 

Buyan

Member
19 Апр 2016
137
24
18
40
Белая Церковь
Если хочешь посмотреть на РЕАЛЬНУЮ БОМБУ, скачай Женин FX Reack -
http://rmmedia.ru/threads/110165/page-19#post-2165444
Вот ЭТО РАБОТА!
Было-бы очень интересно ознакомится с данным продуктом. Но ссылка таргетируется пост "http://rmmedia.ru/threads/110165/page-19#post-2165444" который не имеет по ходу никакого отношения к..

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

CerberPic

Member
17 Фев 2017
70
22
8
35
@Buyan,
Вот и я тоже перечитываю ветку и понимаю, что некоторые посты были удалены. С чем это связано, понять не могу.
 

Buyan

Member
19 Апр 2016
137
24
18
40
Белая Церковь
@Aleksandr Oleynik, Премного благодарен за ссылку!
Низкий поклон Евгению, он действительно гений и настоящий энтузиаст. Такую работу проделал. Я без преувеличения восхищен.
FX Reack - это именно то, что я себе представлял и видел в своих снах, решение многих проблем и... в общем пока одни эмоции. Рипер имеет уникальные возможности в плане роутинга и вообще, но как всегда, возникает вопрос удобства и оперативности управления сложными решениями в прожектах. Одним словом такие скрипты раскрывают всю мощность рипера.
Приятно, когда на форуме есть фидбэк, радует, что проблемы и вопросы можно решить. Еще раз Вам @Aleksandr Oleynik, спасибо!
 
Последнее редактирование:
  • Like
Реакции: Aleksandr Oleynik

CerberPic

Member
17 Фев 2017
70
22
8
35
Можно ли как-нибудь узнать при добавлении FX, эффект это или же инструмент, неросредственно до его добавления?

Пишу свой вариант скрипта для добавления FX и хочу исключить случайную вставку VSTi на мастер. Для этого прописать условие: если выделен Мастер, то проверить, является ли выбранный FX эффектом или инструментом, и если это инструмент - не добавлять его. Возможно такое?
 

@Michael

Well-Known Member
14 Дек 2010
969
1.461
93
Орёл / Москва
Можно ли как-нибудь узнать при добавлении FX, эффект это или же инструмент, неросредственно до его добавления?
сравнить с индексом reaper.TrackFX_GetInstrument( track ) или по i в имени (VSTi, AUi, DXi)
 
  • Like
Реакции: Buyan и CerberPic

Supa75

Active Member
21 Мар 2017
672
164
43
48
Днепр, Украина
Мне кажется, есть смысл создать отдельную ветку для скриптописателей типа "Вопросы по созданию скриптов", чтобы вопрошающие могли в отдельной ветке получать от гуру ответы на вопросы типа "Как достать такую-то функцию", "Что добавить в скрипт, чтобы....." и т.д.
 
  • Like
Реакции: Microtonic

Microtonic

Любознательный
21 Сен 2008
489
112
43
Москва
  • Like
Реакции: Buyan

Buyan

Member
19 Апр 2016
137
24
18
40
Белая Церковь
я думаю, что идея в разделении: кто-то пишет сам, кто-то просит чтобы ему написали.
Поддерживаю. Можно разделить на две ветки. В одной просьбы и инструктажи по написанию скриптов и экшнов, в другой - напишите мне скрипт пожалуйста.
Хотя с другой стороны обсуждаемое в двух таких отдельных ветках неизбежно будет пересекается и вопросы будут перемещаться с одной в другую. В данном случае тоже возможна путаница.
 

CerberPic

Member
17 Фев 2017
70
22
8
35
Скажите пожалуйста что нужно дописать в скрипт, что бы когда отсутствует тайм селекшен скрипт не срабатывал?
@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)

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

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

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

Сейчас онлайн (Пользователей: 0, Гостей: 1)