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

  • Автор темы Автор темы @Michael
  • Дата начала Дата начала
@Archchie, поможешь создать скрипт? Никак не могу с алгоритмом условий разобраться. В общем основная задача - выделенные треки сделать в минимальном масштабе (допустим value = 20). Но это должно быть в режиме Toggle. То есть сохранение предыдущего масштаба, если все треки в проекте стали маленькими. Если часть не выделенных треков остались с нормальным масштабом, то вернуть выделенным трекам этот масштаб (например по самому большому, если масштабы у не выделенных треков оказались разными, не учитывать масштабы треков у которых lock height). Если я выделил треки с разным масштабом, то соответственно всех их либо уменьшить, либо вернуть прежний масштаб по такому же алгоритму...Скорее всего для этого случая понадобится что-то вроде Dummy toggle от SWS. Если же у выделенных треков один и тот же масштаб, то работать должно чисто на условии.
В общем я сам не знаю точно, как правильно, но суть примерно ты понял :)
 
В общем основная задача - выделенные треки сделать в минимальном масштабе (допустим value = 20)
для этого есть экшн Xenakios/SWS: Toggle selected tracks height A/B
сам масштаб А и B настраивается в окне, вызываемом экшеном Xenakios/SWS: Command parameters

PS. Это наверное не совсем то, что Вы хотите, но раз Вы все равно "неопределились на 100%" - возьмите на вооружение
 
Последнее редактирование:
@Supa75, я знаю про это, могу и скрипт написать, чтобы он именно от одного размера к другому делал. Фиксировано. Не учитывая размеры других треков. Это не то :) Хотя там есть еще Store и Recall, но опять же если собирать цикл экшн, ограничение с условиями и все - сбивается порядок.
 
@Archchie, есть выделенные треки, которые мы должны менять, а есть все остальные. Так вот, скрипт должен для восстановления масштаба выделенных треков (когда треки уже маленькие), взять масштаб с не выделенных треков. У которых он нормальный :) И все. И чтобы правильно работал в том случае, если у выделенных треков разный масштаб, либо один и тот же масштаб.
З.Ы. А, и вот еще последние, чтобы если все треки стали маленькими (выделенные и не выделенные), то все же сделать какой-то увеличенный масштаб, допустим 80 value
 
@Archchie, что непонятного то? По-моему по-другому нельзя было понять :)
При первом нажатии - это зависит от того, какой масштаб. Предположим у нас масштаб по умолчанию (не равен этим 20 value, то есть больше) - тогда он уменьшает. Если у выделенных треков разный масштаб относительно друг друга (то есть у части треков 20 value, у части треков больше 20 value) - можно тоже уменьшить - в любом случае у них станет одинаковый масштаб, и для второго нажатия результат такой же.
При втором нажатии после того, когда масштаб уменьшился - сделать масштаб обычным, прежним (я не знаю как это еще объяснить и не вижу ничего непонятно). И тут все зависит от того, что у нас с другими треками, которые не выделены (у которых мы масштаб не меняли). Если у них есть бОльший масштаб, то взять этот масштаб, при втором нажатии сделать его выделенным трекам. Если же у невыделенных треков масштаб оказался точно таким же (допустим я сначала одну половину треков уменьшил, потом другую половину - все треки теперь с 20 value), то увеличить масштаб в соответствии с конкретным value, который я уже выше указал, в районе 80 единиц. Иначе ему не с чего восстанавливать :)
Тебе как программисту виднее продумать алгоритм, может ты что-то лучшее придумаешь, я не против этого :)
[DOUBLEPOST=1546025546][/DOUBLEPOST]
Правильно - это как?
Он не должен умЕньшенные треки увеличить, а увеличенные уменьшить (когда у выделенных треков разный масштаб относительно друг друга). Ну то есть два цикла будет вместо одного
 
Последнее редактирование:
Ух!!!! ну и закрутил! Есть выделенные треки разного масштаба и не выделенные разного масштаба (включаем экшн 1 ) ---- Что должно произойти в итоге ???
Потом работаем то да се, выделяются новые треки снимаем, опять выделяем нужные треки (не обязательно те что были раньше, можем просто забыть какие/ и что????? (включаем экшн 2) ---- Что должно произойти в этом случае? И не забываем это два действия в одном Toggle
 
Последнее редактирование:
@Maestro Sound, при всех прочих условиях (вроде разных масштабов не выделенных треков), при восстановлении масштаба можно все тот же value 80 сделать чтобы не париться :) Либо больший масштаб у не выделенных треков взять, либо их среднее арифм. рассчитать...Главное цель в том, чтобы при восстановлении масштаба не получить принципиально другой размер относительно текущего масштаба треков.

Потом работаем то да се, выделяются новые треки снимаем, опять выделяем нужные треки (не обязательно те что были раньше, можем просто забыть какие/ и что????? (включаем экшн 2)
Это один экшн. В скрипте можно сделать условия, если же ты будешь собирать в cycle редакторе, то там просто будет порядок выполнения, который может сбиться - это не о том совсем.
[DOUBLEPOST=1546030365][/DOUBLEPOST]Нет. я конечно понимаю что алгоритм запутанный - гораздо сложнее, чем если бы это был экшн, работающий безусловно для всех треков (такой уже штатный есть). Но и переключение A/B размера - это тоже не то :)
Методы восстановления масштаба можно всякие придумать. Опять же буду рад рассмотреть другие варианты :) Кроме A/B
Еще кстати мне этот экшн вообще не нужен...У меня не раз его просят сделать, и я решил найти для него наиболее подходящий алгоритм
Сам же предпочитаю масштаб регулировать по колесу мыши
 
Последнее редактирование:
@Archchie, поможешь создать скрипт? Никак не могу с алгоритмом условий разобраться. В общем основная задача - выделенные треки сделать в минимальном масштабе (допустим value = 20). Но это должно быть в режиме Toggle. То есть сохранение предыдущего масштаба, если все треки в проекте стали маленькими. Если часть не выделенных треков остались с нормальным масштабом, то вернуть выделенным трекам этот масштаб (например по самому большому, если масштабы у не выделенных треков оказались разными, не учитывать масштабы треков у которых lock height). Если я выделил треки с разным масштабом, то соответственно всех их либо уменьшить, либо вернуть прежний масштаб по такому же алгоритму...Скорее всего для этого случая понадобится что-то вроде Dummy toggle от SWS. Если же у выделенных треков один и тот же масштаб, то работать должно чисто на условии.
В общем я сам не знаю точно, как правильно, но суть примерно ты понял


Раз двадцать перечитал твое сообщение и не чего не понял, все что я из него понял,то что выделенные треки надо сделать в минимальном размере и сохранить размер предыдущих треков, но каких так и не понял, а при втором нажатии вообще ничего не понял, понял только то, что скрипт должен запомнить одно, а восстановить совершенно другое


@Archchie, есть выделенные треки, которые мы должны менять, а есть все остальные. Так вот, скрипт должен для восстановления масштаба выделенных треков (когда треки уже маленькие), взять масштаб с не выделенных треков. У которых он нормальный И все. И чтобы правильно работал в том случае, если у выделенных треков разный масштаб, либо один и тот же масштаб.
З.Ы. А, и вот еще последние, чтобы если все треки стали маленькими (выделенные и не выделенные), то все же сделать какой-то увеличенный масштаб, допустим 80 value


Все равно я ничего не понял.
borisuperful написал(а):
(когда треки уже маленькие)
В каком смысле "уже маленькие"
borisuperful написал(а):
взять масштаб с не выделенных треков.
Взять масштаб при первом запуске, когда уменьшаем выделенные или при восстановлении???
borisuperful написал(а):
У которых он нормальный
Что такое нормальный ???
borisuperful написал(а):
И чтобы правильно работал в том случае, если у выделенных треков разный масштаб, либо один и тот же масштаб.
Правильно - это как?
--------------------------
Правильно я понял или нет, что скрипт не чего не должен сохранять, а должен при первом нажатии уменьшить все выделенные треки, а при втором нажатии, брать самый большой из невыделенных и делать выделенные такого размера ?
--------------------------
Опиши подробнее по шагам и с конкретикой, а не "нормальный, средний, маленький, наверно, может быть".
При первом нажатии что должен сделать скрипт ? Что должен сохранить и т.д.
При втором нажатии так же что должен сделать, что восстановить


@Archchie,что непонятного то? По-моему по-другому нельзя было понять :)
При первом нажатии - это зависит от того, какой масштаб. Предположим у нас масштаб по умолчанию (не равен этим 20 value, то есть больше) - тогда он уменьшает. Если у выделенных треков разный масштаб относительно друг друга (то есть у части треков 20 value, у части треков больше 20 value) - можно тоже уменьшить - в любом случае у них станет одинаковый масштаб, и для второго нажатия результат такой же.
При втором нажатии после того, когда масштаб уменьшился - сделать масштаб обычным, прежним (я не знаю как это еще объяснить и не вижу ничего непонятно). И тут все зависит от того, что у нас с другими треками, которые не выделены (у которых мы масштаб не меняли). Если у них есть бОльший масштаб, то взять этот масштаб, при втором нажатии сделать его выделенным трекам. Если же у невыделенных треков масштаб оказался точно таким же (допустим я сначала одну половину треков уменьшил, потом другую половину - все треки теперь с 20 value), то увеличить масштаб в соответствии с конкретным value, который я уже выше указал, в районе 80 единиц. Иначе ему не с чего восстанавливать :)
@Maestro Sound, при всех прочих условиях (вроде разных масштабов не выделенных треков), при восстановлении масштаба можно все тот же value 80 сделать чтобы не париться Либо больший масштаб у не выделенных треков взять, либо их среднее арифм. рассчитать...Главное цель в том, чтобы при восстановлении масштаба не получить принципиально другой размер относительно текущего масштаба треков.


Archchie написал(а):
Теперь вроде все понятно.:)
@borisuperful, Toggle height selected tracks in 24 pixel/revert to average values.lua
Смотри - то ?
Работает так:
Если среди выделенных треков есть хоть один большего размера чем 24 пикселя, то выделенные треки уменьшатся в значения 24 пикселя.
Если все выделенные треки 24 пикселя, то увеличатся к "среднему значению*"​
* Как увеличиваются:
Если все невыделенные треки одного размера и больше 24 пикселей, то выделенные треки станут такого же размера как и невыделенные.
Если все невыделенные треки одного размера и 24 пикселя, то выделенные треки станут 81 пиксель.
Если все невыделенные треки разного размера "все разного", то выделенные треки станут 81 пиксель.
Если невыделенные треки разного размера, но дублируются,​
например:
Пять невыделенных треков 30 пикселей, Пять невыделенных треков 40 пикселей,Пять невыделенных треков 50 пикселей, то тут выделенные треки возьмут размер самого большого трека, 50 пикселей.
А если десять невыделенных треков например 25 пикселей, Пять невыделенных треков 40 пикселей,Пять невыделенных треков 50 пикселей, то тут уже выделенные треки возьмут размер наибольшего количества треков, то есть 25 пикселей.​
Невыделенные треки которые 24 пикселя и/или "lock height" в счет не идут, на них скрипт внимания не обращает.
 
Последнее редактирование:
  • Like
Реакции: borisuperful
@Archchie, хотя вот что - если уж не учитывать масштаб треков с lock height, то тогда и сами эти треки тоже не изменять :)
 
  • Like
Реакции: RJ Baker
если уж не учитывать масштаб треков с lock height, то тогда и сами эти треки тоже не изменять
Поправил.
В скрипте настройка, отключить / включить игнорирование "Lock track height"
 
Кто нибудь подскажет, возможно ли и как перед запуском скрипта проверить, установлен ли SWS, чтобы ошибку выдать?
UPD: Решил так
Код:
function OpenURL(url)
  local OS = reaper.GetOS()
  if OS == "OSX32" or OS == "OSX64" then
    os.execute('open "" "' .. url .. '"')
  else
    os.execute('start "" "' .. url .. '"')
  end
end
     
     
local test = reaper.BR_SetArrangeView
if not test then 
window = reaper.MB('Please install SWS extension', 'Error', 0) end
if window  then
OpenURL("http://www.sws-extension.org/") return
end
Либо любая пустая SWS функция
 
Последнее редактирование:
Доброго времени суток,начал изучать программу Reaper, пересмотрел много материала,но пока кое-какие вещи непонятны,осваиваюсь.
Хотел попросить помощи в создании кастом экшена,если он нужен,или показать встроенный,чтобы одной горячей клавишей переключать горизонтальный зум и вертикальный скролл
Заранее спасибо
 
Хочу почистить папку со скриптами. По началу столько всего накачал с Риапака :) Но есть проблема. Можно ли как то узнать (с помощью какого-то скрипта или каким другим вариантом) какие скрипты используются в кастом и цикл-экшинах, чтобы их не прибить заодно. Вопрос: есть ли какой либо способ определить скрипты, которые используются в кастом и цикл-экшенах?
 
@Supa75, ещё вчера думал над этим и хотел задать такой же вопрос, практически слово в слово... Так что присоеденяюсь!
 
@Supa75, Делаеш папку снуля - старую в архив, Хорошо чистит
ниче не понял. В смысле, вытереть все скрипты из соотв. папки и запускать по одному все кастомы и потом смотреть на что ругается при запуске? Тот еще способ...
 
Хочу почистить папку со скриптами. По началу столько всего накачал с Риапака Но есть проблема. Можно ли как то узнать (с помощью какого-то скрипта или каким другим вариантом) какие скрипты используются в кастом и цикл-экшинах, чтобы их не прибить заодно. Вопрос: есть ли какой либо способ определить скрипты, которые используются в кастом и цикл-экшенах?
PHP:
-- Learn what script are used in custom actions and cycle action




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


    function GetScriptNameByID(id);
        local Path = reaper.GetResourcePath()..'/reaper-kb.ini';
        local file = io.open(Path,'r');
        if not file then no_undo() return end;
        local text = file:read('a');file:close();
        return text:match(id:match('[^_](%S+)')..'%s"Custom:%s(.-)"'); 
    end;


    function GetScriptNameByCastom();
        local kb_ini = reaper.GetResourcePath()..'/reaper-kb.ini';
        local file = io.open(kb_ini,'r');
        if not file then no_undo() return end;
        local line_T,TableCast,TabCastom,Nil = {},{},{};
        for var in file:lines() do;
            table.insert(line_T,var);
        end;
        ----
        for i = 1, #line_T do;
            if line_T[i]:match('ACT')then;
                for NameScript in string.gmatch(line_T[i],"%S+") do;
                    local double = nil;
                    if string.sub(NameScript,0,1) == "_" then;
                        local NameByID = GetScriptNameByID(NameScript);
                        if NameByID then;
                            for i2 = 1, #TableCast do;
                                if NameByID == TableCast[i2]then;
                                   double = 1 break;
                                end;
                            end;
                            if not double then;
                                table.insert(TableCast,NameByID);
                                if #TabCastom+1 < 10 then Nil = "00" elseif #TabCastom+1 >= 10 and #TabCastom+1 < 100 then Nil = "0" else Nil = ""end;
                                table.insert(TabCastom,Nil..#TabCastom+1 .." - "..NameByID);
                            end;
                        end;
                    end;
                end;
            end;
        end;
        return TabCastom;
    end;


    local function GetScriptNameByCycle();
        local kb_ini = reaper.GetResourcePath()..'/S&M_Cyclactions.ini';
        local file = io.open(kb_ini,'r');
        if not file then no_undo() return end;
        local text = file:read('a');
        file:close();
        local TableCicle,TableCycle,Nil = {},{};
        ----------------------------------
        for S in string.gmatch (text, "[^|]+") do;
            if string.sub(S,0,1) == "_" then
                local NameByID = GetScriptNameByID(S);
                if NameByID then;
                    local double = nil;
                    for i2 = 1, #TableCicle do;
                        if NameByID == TableCicle[i2]then;
                           double = 1 break;
                        end;
                    end;
                    if not double then;
                        table.insert(TableCicle,NameByID);
                        if #TableCycle+1 < 10 then Nil = "00" elseif #TableCycle+1 >= 10 and #TableCycle+1 < 100 then Nil = "0" else Nil = ""end;
                        table.insert(TableCycle,Nil..#TableCycle+1 .." - "..NameByID);
                    end;
                end;
            end;
        end;
        return TableCycle;
    end;


    local Castom = GetScriptNameByCastom();
    local Cycle = GetScriptNameByCycle();
    local header = "[Archie_UsedScriptsInActions:]\n\n"..
                   "Скрипты использующиеся в пользовательских действиях и в цикл действиях:\n"..
                   "Scripts used in custom actions and cycle actions:\n\n\n";   
    table.insert(Castom,1,header.."CASTOM ACTION: ".. #Castom.."-Scripts\n");
    table.insert(Cycle,1,"\n\n\nCYCLE ACTION: "..#Cycle.."-Scripts\n");
    local CastList = table.concat(Castom,"\n"); 
    local CyclList = table.concat(Cycle,"\n");
    ----------------------
    local path = reaper.GetResourcePath()..'/Archie_UsedScriptsInActions.ini';
    local ini = io.open(path,'w');
    ini:write(CastList..CyclList);
    ini:close();

    local OS,cmd = reaper.GetOS();
    if OS == "OSX32" or OS == "OSX64" then;
        cmd = os.execute('open "" '..path);
    else;
        cmd = os.execute('start "" '..path);
    end;
    if not cmd then;
        reaper.ClearConsole(); 
        reaper.ShowConsoleMsg(CastList..CyclList);
    end;
   
    no_undo();
 
Последнее редактирование:
  • Like
Реакции: Supa75
Ребята, а есть скрипты типа - запомнить (копировать) цвет айтема и восстановить (вставить) цвет в айтем? И такое же, но с именем айтема.
 
@YuriOl,
Archie_Take; Copy color item active take.lua
Archie_Take; Paste color to selected item active take.lua
Archie_Take; Paste color to selected item all take.lua
Archie_Take; Reset color default in all take in selected items.lua

Archie_Take; Copy Name item active take.lua
Archie_Take; Paste Name to selected items active take.lua
Archie_Take; Delete name in selected items in active take.lua
________________________
Требуется: Arc_Function_lua v.2.1.7
¯↓↓↓¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
 
Последнее редактирование:
  • Like
Реакции: YuriOl и Maestro Sound
@shuco, никакой кастом не нужен, есть один экшн. Впрочем, если интересует конкретная сетка, можно сделать с save/restore grid - а так просто перед экшном подгоняете нужную частоту сетки
SWS/FNG: Quantize item positions and MIDI note positions to grid
 
  • Like
Реакции: shuco
Quantize item positions and MIDI note positions to grid Как-то он странно работает, чють двинет нотки, но не по сетке, а рандомно. Почему так? Скрипт кривой или я сломал Рипер?
me2beats_Quantize MIDI note positions to project grid.lua Чётко квантует, но только по сетке в проекте. Можно его изменить чтоб независимо от сетки квантовал по 1/16 со свингом который в Grid Setings указан?
 

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