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

  • Автор темы Автор темы @Michael
  • Дата начала Дата начала
=====
Чтобы было понятнее--по сути,за запись в буфер отвечают только JS плагины,вся нагрузка на них,все данные тоже хранятся только у них в памяти.
Скрипт при запуске всего-навсего вытягивает из них данные и расставляет по треку в соответствии с сохраненными указаниями.

Если сделать несколько скрытых треков с указанными каналами и разными названиями,например по номеру канала,все будет работать так же.Конечно,в скрипте придется перебрать все такие треки,и из каждого повыкладывать данные.Но это не сложно.
Можно вообще тупо несколько скриптов сделать на разные каналы и запускать поочередно.
 
Хотя это конечно поправить можно, знаю как.
В конце скрипта !_MakeKeyPresetForMarker.eel допиши вот эти строки -
PHP:
GetToggleCommandState(NamedCommandLookup("_S&M_EXCL_TGL1")) == 0 ? (
  Main_OnCommand(NamedCommandLookup("_S&M_EXCL_TGL1"), 0);
);

А в конце !_MakeKeyPresetForSelectTrack.eel эти -
PHP:
GetToggleCommandState(NamedCommandLookup("_S&M_EXCL_TGL2")) == 0 ? (
  Main_OnCommand(NamedCommandLookup("_S&M_EXCL_TGL2"), 0);
);

Ну и рядом с каждой из кнопок-скриптов поставь соответствующую кнопку Action- Exclusive toggle A**
[DOUBLEPOST=1450136190,1450135988][/DOUBLEPOST]
=====
Чтобы было понятнее--по сути,за запись в буфер отвечают только JS плагины,вся нагрузка на них,все данные тоже хранятся только у них в памяти.
Скрипт при запуске всего-навсего вытягивает из них данные и расставляет по треку в соответствии с сохраненными указаниями.

Если сделать несколько скрытых треков с указанными каналами и разными названиями,например по номеру канала,все будет работать так же.Конечно,в скрипте придется перебрать все такие треки,и из каждого повыкладывать данные.Но это не сложно.
Можно вообще тупо несколько скриптов сделать на разные каналы и запускать поочередно.
Я хорошо понимаю, что сделав подобный механизм ты уже можешь ЧТО УГОДНО :)
Тут нужно просто подумать что именно будет удобнее всего.

И, кстати, я тоже боялся постоянно запущенных скриптов, loop, deffer и всех прочих вещщей, которые постоянно опрашивают в фоне Рипер.
На практике же оказалось, что самый наворочанный deffer с кучей функционала вообще ни как не сказывается на производительности Рипера, меньше чем JS в разы точно!
 
  • Like
Реакции: lil-burn
да ну,что угодно,я можно сказать в детском садике по уровню.
На практике же оказалось, что самый наворочанный deffer с кучей функционала вообще ни как не сказывается на производительности Рипера, меньше чем JS в разы точно!
Ну там просто и не нужна работа в фоне.
С миди вообще все хорошо.
В аудио есть дефер(но только на период выкладывания буфера), приходится открывать на мгновение интерфейс JS,иначе не получается...
И аудио само по себе выкладывается долго,если куски длинные,20 минут выкладываются несколько секунд.Если на каждый канал делать,и много по времени,будет достаточно долго.
Для записи группы обычная запись самый лучший вариант.
 
Для записи группы обычная запись самый лучший вариант.
Та да :)
RR хорош именно для индивидуального творчества над композицией и аранжировкой.
Согласен!
[DOUBLEPOST=1450137813,1450137722][/DOUBLEPOST]
да ну,что угодно,я можно сказать в детском садике по уровню.
Мои родители тогда даже ещё не встретились :)
 
@Aleksandr Oleynik, еще важный момент-все пишется в память.На каждый JS нужно при заполненном буфере нужно 256м.Если на все каналы разложить по несколько JS и каналов много-то памяти просто не хватит.
 
  • Like
Реакции: Aleksandr Oleynik
@Aleksandr Oleynik, вот о какой теме говорил
Custom Action с функцией State возможно?
не соображу никак, почему не работает SetToggleCommandState
1) создал тестовый пустой eel скрипт
2) загрузил в главную секцию, скопировал ID
3) создал скрипт ниже (eel)

Код:
SetToggleCommandState(0, NamedCommandLookup("_RS1470b3192ed3543231040998a6b810d95b5ad145"), 1);
RefreshToolbar2(0, NamedCommandLookup("_RS1470b3192ed3543231040998a6b810d95b5ad145"))
где в кавычках - ID скрипта.
ничего не дает, но и ошибки не пишет

но если в lua
Код:
reaper.SetToggleCommandState(0, NamedCommandLookup("_RS1470b3192ed3543231040998a6b810d95b5ad145"), 1)
reaper.RefreshToolbar2(0, NamedCommandLookup("_RS1470b3192ed3543231040998a6b810d95b5ad145"))
то выдает ошибку ...n\AppData\Roaming\REAPER\Scripts\Test\toggle test 01.lua:1: attempt to call a nil value (global 'NamedCommandLookup')
??
 
@lil-burn, я с этим тоже потихоньку разбираюсь!
Во-первых, я писал уже - нужно разобраться что такое и от куда берёться cmdID - то, что это не CommandID я уже понимаю.
Во-вторых, из Экшина Скрипта запустить Экшин Скрипт нельзя - Михаил том на оф форуме завёл - но ответа нет :(.
Я сегодня со всем этим поразбираюсь, пока для меня проблема, что cmdID в каждом Рипере для одного и того-же скрипта разный, а я вчера поймал ситуацию, при котором он был разный и в одном и том-же Рипере при двух разных его стартах..... Это как минимум означает, что считывать его нужно каждый раз за ново перед использованием - и я пока не знаю как получить cmdID от любого из Экшин Скрипта при старте не этого Экшин Скрипта.
Пишу путанно, потому как вчера закончил с этим разбираться ночью и без понятных мне результатов.
[DOUBLEPOST=1450161607,1450160964][/DOUBLEPOST]@@Michael, а как в lua можно использовать данные с другого скрипта?
В EEL это возможно только при старте скрипта и только записав наименование импортируемых в код сторонних скриптов в первых строках кода при помощи функции @Import.
Можно ли в Lua в динамике считывать данные с других файлов и использовать их в коде?
Ну и если это возможно, просьба пример работающий написать, чтоб дальше двигаться самому.
 
Это что значит?
Это значит, что у меня нет нужного образования и знания терминов :)
Имел в виду то, что во всех моих скриптах (ну почти) была бы очень полезна возможность считывать код стороннего скрипта меняющийся в момент считывания.
В EEL это возможно, но один раз при старте Main скрипта и именно при СТАРТЕ и ни как иначе. По сути формируется при старте ОДИН код скрипта и дальнейшие изменения вступят в силу только после перезагрузки Main скрипта.
На сколько я понял, в LUA можно в произвольном месте выполнения кода main скрипта считать данные с chaild скрипта и воспользоваться ими.
Ну и например - работает deffer и считывает данные с chaild скрипта, а они по ходу работы main скрипта изменились и main скрипт эти изменения подхватит без перезагрузки скрипта.

Много чего можно было бы сделать интересного, если это работает.
Ну вот можно было бы сделать обязательную "очерёдность" срабатывания скриптов A и B - если скрипт A сработал, то он больше не сработает, пока не сработает скрипт B.
Наверное, исходя из того, что я уже прочитал, у A и B делается один внешний Модуль, данные в котором перезаписываются всякий раз когда запускается один из main скриптов A или B?
В EEL я сейчас это делаю через считывание параметров JS плагина - как костыль.
 
Последнее редактирование:
Ну и опять же не проблема запоминать/читать переменные из ExtState.
Нужно попробовать - у меня не получилось почему-то :(
PS: Уже получилось :)
Не понял в начале, что писать-читать оно может только стринги.
В общем это самый простой и правильный вариант в данном случаи наверное!
 
Последнее редактирование:
Если что, есть такое:
Код:
number = tonumber(string)
string = tostring(number)
Согласись, проще, чем всякие sprintf(#string, "%d", 100500), не говоря уже о том, что в некоторых случаях всё само конвертируется куда надо.
 
  • Like
Реакции: Aleksandr Oleynik
Если что, есть такое:
Код:
number = tonumber(string)
string = tostring(number)
Согласись, проще, чем всякие sprintf(#string, "%d", 100500), не говоря уже о том, что в некоторых случаях всё само конвертируется куда надо.
Ещё как соглашусь, убив три часа на поиски в EEL того, как строку с числом превратить в число - не нашёл :(
 
Дико извиняясь,за то,что возможно отвлеку мэтров от творчества и созидания стольких и всяких полезностей и вкусностей для рипера, со стороны это выглядит,как магия колдовство,спасибо!
Часто приходится раставлять так называемые “ватермарки” с прмежутком 6 сек. ,
можно ли это завести на 1 кнёпочку ? (или ,возможно, скрит уже есть и он таки проскользнул мимо меня))))))
 

Вложения

  • Ватермарк.gif
    Ватермарк.gif
    3,1 MB · Просмотры: 138
@@Michael, я домучал (Спасибо Тебе и Сыну) -
http://rmmedia.ru/threads/117419/#post-1951717
[DOUBLEPOST=1450220623,1450219523][/DOUBLEPOST]
Часто приходится раставлять так называемые “ватермарки” с прмежутком 6 сек. ,
можно ли это завести на 1 кнёпочку ? (или ,возможно, скрит уже есть и он таки проскользнул мимо меня))))))
Михаил ВОТ ТУТ делал такой для эксперементов, с выводом времени создания 1000 копий.
Я сделал вам упрощённый вариант - укажете дистанцию и кол-во и повесите на кнопку -

PHP:
d = 6;    // дистанция между айтемами в сек
k = 12;   // кол-во копий
item = GetSelectedMediaItem(0,0);
ApplyNudge(0, 0, 5, 20, d, false, k);
 

Вложения

  • Like
Реакции: nazarol-jk35 и lil-burn
@nazarol-jk35, дублирует выделенный айтем через каждые 6 секунд вплоть до конца проекта. если надо не 6 секунд, просто везде в скрипте поменяйте на нужное число
Код:
if reaper.CountSelectedMediaItems(0) > 0 then
  reaper.Main_OnCommand(40043, 0)
  end_pos = reaper.GetCursorPosition()
  sel_item = reaper.GetSelectedMediaItem(0, 0);
  sel_item_start = reaper.GetMediaItemInfo_Value(sel_item, "D_POSITION");
  sel_item_len = reaper.GetMediaItemInfo_Value(sel_item, "D_LENGTH")
  dup_item_end = sel_item_start + sel_item_len
  ghost_len = reaper.SetMediaItemLength(sel_item, 6, 0)
  while end_pos - 6 > dup_item_end do
    reaper.Main_OnCommand(41295, 0)
    dup_item_end = dup_item_end + 6
  end
  reaper.Main_OnCommand(40421, 0)
  reaper.Main_OnCommand(40612, 0)
  reaper.UpdateArrange()
end

[DOUBLEPOST=1450222597,1450222470][/DOUBLEPOST]@Aleksandr Oleynik, ApplyNudge - прикольно)
через ApplyNudge будет естественно лучше

хотя надо сообразить, как вычислить переменную k, чтобы автоматом дублировал до конца проекта, надо ж "скрипт в одну кнопку")

======
неужели залипания пашут? даже сон прошел :-)

[DOUBLEPOST=1450225707][/DOUBLEPOST]@nazarol-jk35, вот более окончательный и правильный вариант скрипта (по сравнению с моим предыдущим), с учетом ApplyNudge
Код:
if reaper.CountSelectedMediaItems(0) > 0 then
  reaper.Main_OnCommand(40043, 0)
  end_pos = reaper.GetCursorPosition()
  sel_item = reaper.GetSelectedMediaItem(0, 0)
  sel_item_start = reaper.GetMediaItemInfo_Value(sel_item, "D_POSITION")
  d = 6
  k = math.floor ((end_pos - sel_item_start)/d) - 1
  reaper.ApplyNudge(0, 0, 5, 1, d, false, k)
end
сохраните в lua
скриптом во вложении пренебречь
 

Вложения

Последнее редактирование:
Мужики, спасибо, здоровья и с наступающим!:)

зы,,, по первому короткому скрипту Александра -пишу кол-во айтемов 20- ставится 8, пишу -30, или 100 и больше -исполняется 13 айтемов,
а по последнему lil-burn-
Error: /Users/oleg1/Library/Application Support/REAPER/Scripts/ WatterMark.eel:1: syntax error: 'f <!> reaper.CountSelectedMediaItems(0) > 0 the'

зы2.... Во блин, щас увидел -- сохранить в Lua , а у меня сохраняется тоько в eel, а с lua я дел ещё не имел,,,,,:(

ps 3 ... Класс , поставил кнопку по первому скрипту,просто пару-тройку раз кликаю , спасибо!
 
Последнее редактирование:
  • Like
Реакции: lil-burn
Проверил - defer в этом случаи как-то иначе работает, скрипт разово запускается.
ОТЛИЧНО!
И ещё бы не вредно было-бы разобраться в том, что такое cmdID, в случаи с get_action_context.
Может можно как-то этот ID использовать для запуска ЭкшинСкрипта?
Хотя при работающем варианте от Jeffos наверное и нечего больше искать - просто запишем в закрома ЭТО решение! Спасибо, что раскопал!
 
Последнее редактирование:
Да он просто разово вызывает в другом потоке,насколько я понял.С любой же функцией работает так же.
 
  • Like
Реакции: Aleksandr Oleynik
Я бы всё же хотел обсудить вот этот кастом экшин -
Copy/Paste Items in Folder
Фича обсуждалась ВОТ ТУТ

Мне кажется его делать нужно иначе.
Всё-таки нужно создавать на Трек Фолдере пустышку айтем сгрупированную с айтемами чайлдов фолдера.
Делать это по шоткату или по двойному клику на трек фолдер
А дальше резать, клеить, копи-пастить и перемещать штатными средствами рипера этот айтем.
Только я вот не могу найти как сделать пустышку МИДИ Айтем
 
Последнее редактирование:
О блин! Слона то я и не заметил :)
Сейчас сделаю!
PS: Сделал.
Create%20folder%20items1.png


И чтоб при выделении созданного Фолдер Айтема он копировался и вставлялся вместе со всеми, которые в фолдере, нужно кой чего поменять в Майс Модифаере, вот так -
Create%20folder%20items2.png
 

Вложения

Последнее редактирование:
  • Like
Реакции: Tito и Beckoff
@Aleksandr Oleynik,если скрипт,а не экшн, то лучше CreateNewMIDIItemInProj
Я вот пока замутил аудио-буфер с циклической перезаписью.
Пишет последние 6.5 или 13 мин (стерео или моно) независимо от проигрывания.Чего-то уже сам не пойму зачем,как-то по инерции.Стало свободное время уходить не на музыку,а на скрипты.
 
  • Like
Реакции: Beckoff

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