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

  • Автор темы Автор темы @Michael
  • Дата начала Дата начала
Число вроде за что-то отвечает, за аккорд может быть?
Вроде бы нет,пробовал и так и сяк менять,все работает одинаково.Надо просто цельный скрипт сделать и будет видно,сейчас времени маловато на это,но как можно провернуть,постепенно въезжаю.Тут и другие возможности еще открываются.Можно всякие оффлайн миди-арпеджиаторы,гармонайзеры,хордеры мутить.
[DOUBLEPOST=1450814830,1450814762][/DOUBLEPOST]
Если помните где именно, буду рад ссылке
В этой теме,пару страниц назад.Но там чисто тестовый вариант,вообще голый,использовать не рекомендую
[DOUBLEPOST=1450817980][/DOUBLEPOST]=====
Все,есть!Вся конструкция получилась,грубо говоря,из пары строк,с одним побитовым "И".
[DOUBLEPOST=1450818201][/DOUBLEPOST] 123.gif
PHP:
for i=1,12,1 do
  Note_Pitch = Note_Pitch+1
  Note_in_Pattern = 2^((Note_Pitch-Root)%12)
  In_Scale = Scale & Note_in_Pattern
  if In_Scale>0 then
     reaper.FNG_SetMidiNoteIntProperty(Note, "PITCH", Note_Pitch)
     break
  end
end
Смысл такой,что если нота(высота ноты) попадает в лад(число scale),она при побитовом умножении на число scale дает одно из чисел-1,2,4,16 и тд.А если не попадает,то дает ноль.
Согласитесь,круто.Спасибо всем за участие,я уже хотел бросать и делать через строки!
 
Последнее редактирование:
@EUGEN27771, @@Michael,

@@Michael, а не мог бы ты портировать этот скрипт в LUA?
Хочу всё-таки проверить ещё скорость основных мне нужных в скриптах операций, которые у меня все завязаны на имени трека
В общем не математические вычисления, и удар от LUA конечно под дых EEL, но как есть - так есть -
Проект в котором 1000 трэков с именем T1 и последний трэк с именем S1
Скрипту нужно перебрать все треки, запомнить соответствие Имени трека и его GUID и потом для Трэка с именем S1 сделать ему Мьют?
Ниже Скрипты в LUA и в EEL и результаты времени выполнения -

PHP:
time1 = time_precise();

function scanTracksNames() (
  trackcount = CountTracks(0);
  i = 0;
  loop(trackcount,
    track = GetTrack(0, i);
    GetSetMediaTrackInfo_String(track, "P_NAME", #trackname, 0);
    extension_api("BR_GetMediaTrackGUID", track, #trackguid);
    SetExtState("TrackGUID", #trackname, #trackguid, 1);
    i += 1;
  );
);
scanTracksNames();


GetExtState(#trackguid, "TrackGUID", "S1");
tr = extension_api("BR_GetMediaTrackByGUID", 0, #trackguid);

SetMediaTrackInfo_Value(tr,"B_MUTE", 1);

time2 = time_precise();
time_diff = time2-time1;
sprintf(#dest,"%f  %s", time_diff, #trackguid);
ShowConsoleMsg(#dest);
UpdateArrange();
Время выполнгения LUA = 0.018 c

PHP:
time1 = reaper.time_precise()

function scanTracksGUID()
  local counttracks = reaper.CountTracks(0)
  if counttracks == nil then return end
  local tracks = {}
  for i = 1, counttracks do
    local tr = reaper.GetTrack(0,i-1)
    if tr ~= nil then
      _, tr_name = reaper.GetSetMediaTrackInfo_String(tr, 'P_NAME', '', false)
      local guid = reaper.GetTrackGUID(tr)
      tracks[tr_name] = guid
    end
  end
  return tracks
end
tracks = scanTracksGUID()

guid = tracks["S1"]
track = reaper.BR_GetMediaTrackByGUID(0, guid)
reaper.SetMediaTrackInfo_Value(track,"B_MUTE", 1)

time2 = reaper.time_precise()
time_diff = time2-time1
reaper.ShowConsoleMsg(time_diff..": "..guid)
reaper.UpdateArrange()

Время выполнения EEL = 3.27 c

О такое!
Ну, а под дых почему -
В EEL-я я могу испольхзовать только функцию Set(Get)ExtState - для того чтоб запомнить и потом счмитать данные Имя трека - GUID и вот этот процес для 1000 треков и занимает 3 секунды
А в LUA я пишу эти данные в таблицу и из неё потом считываю - и скрипт это делает просто фантастически быстро!

Может я что-то не знаю и в EEL это можно сделать иначе и тоже за 18 мс, а не 3 с
 
В EEL-я я могу испольхзовать только функцию Set(Get)ExtState
Ну понятно,почему.Наверное,можно,но даже смотреть не хочется.Сам луп eel,скорее всего, прокрутит за 6-8мс.Но к eel уже не буду возвращаться.Окончательно добило отсутствие инфы.Только для JS.
 
Но к eel уже не буду возвращаться.Окончательно добило отсутствие инфы.Только для JS.
А я просто упёрся в несколько проблем, которые без таблиц решать приходится через такую Ж, что..... :(
 
Здесь транспонирование по Scale в активном миди-редакторе,либо по Scale в первом выделенном айтеме(если миди-редактор закрыт).Транспонируются ноты в выделенных миди-айтемах.И только те ноты,старт которых попадает в тайм-селекшн.
П.С. Временно удалил, сделаю граф. интерфейс, выложу в основную тему со скриптами
Я то для себя знаю,что где находится и как работает.Но вообще это может приводить к путанице.Нужно четко продумать,как удобнее сделать.
Можно-
1)По активному миди-редактору-самый наглядный(но редактор уже загромождает экран).
2)По первому выделенному тейку(не наглядно,можно перепутать).
3)Что-то другое придумать...
===
Еще-
Непонятно,в каких айтемах лучше транспонировать-только в выделенных,или во всех миди-айтемах по горизонтали.Кроме,например барабанов.
Какие ноты- старт которых в тайм-сел,или только если полностью нота входит в тайм-сел(старт и конец).
Если тайм-сел попадает на середину ноты-может ноты тогда разрезать?То есть как бы вырезать участок.
И еще много всего не ясно.
===
 

Вложения

  • 123.gif
    123.gif
    199 KB · Просмотры: 107
Последнее редактирование:
3)Что-то другое придумать...
Есть вариант. Реализовать Chord Track по типу Cubase. В принципе у Куба в этом плане НМВ продумано всё очень здорово.
Chord Track.jpg

Теперь о том как я представляю это в Рипере. В качестве Chord Track использовать отдельный трэк с именем Chord Track. В качестве содержимого использовать Empty Items. Информацию о грамонии прописывать в комменты Empty Items. Можно соорудить простенький скрипт по типу того же куба с помощью которого забивать гармонию в хорд трэк. Можно также попробовать использовать содержимое какого либо трэка или айтема в качестве источника гармонии для хорд трэка. Более детально можно посмотреть Cubase Element 8. Демо режима на 30 дней вполне хватит для написания скрипта создающего и редактирующего Chord Track для рипера. Из этого хорд трэка и брать инфу для scale и root.
[DOUBLEPOST=1450900493,1450899958][/DOUBLEPOST]@EUGEN27771, имеется ещё одна хотелка. Скрипт экшн для секции Mouse Modifiers, Item Double Click. Который вызывал бы различные действия в зависимости от типа айтема. Например мне при двойном клике по аудио айтему хотелось бы иметь установку Sekection по этому айтему. Двойной клик по миди айтему - вызов миди редактора. Двойной клик по емпти айтем - вызов редактора комментарий (Notes for Item). Двойной клик по емпти айтем находящемся на дорожке с именем Chord Track - вызов редактора описанного мной выше.
По сути для этой хотелки нужно два скрипта. Первый скрипт - это скрипт самой хотелки. А второй скрипт будет выбирать и редактировать действия по условию для первого. Наверное как-то так.
 
Последнее редактирование:
По сути для этой хотелки нужно два скрипта. Первый скрипт - это скрипт самой хотелки. А второй скрипт будет выбирать и редактировать действия по суловию для первого. Наверное как-то так.
Скрипт ведь умеет достаточно большое кол-во состояний Рипера ловить в онлайне - так что это один скрипт. А если его нужно настраивать - то с GUI.
 
Есть вариант. Реализовать Chord Track по типу Cubase
Я такое не потяну,для меня слишком сложно.Реализовать реально,но я точно не потяну.
Скрипт экшн для секции Mouse Modifiers, Item Double Click. Который вызывал различные действия взависимости от типа айтема
Я выкладывал для Миди и Аудио.Для Миди открывает редактор со строго фиксированным зумом в указанное число тактов,для аудио-можно повесить любой экшн или придумать что-то другое.Для остальных типов-надо посмотреть.можно ли узнать источник(source).Тогда легко,хоть на 10 действий
123.gif
Open Item(MIDI Audio).eel
 
Последнее редактирование:
@Aleksandr Oleynik, первоначально нужно задать действия по условию, а также иметь возможность поменять действие по условию. Как ты видишь реализацию этого одним скриптом?. Мой разум пока что видит реализацию через пару скриптов.
 
@EUGEN27771, очень хотелось бы чтоб скрипт определял наигранный аккорд и транспортировал его правильно. а по отдельности или все вместе не важно, важно чтоб было правильно.
 
Я такое не потяну,для меня слишком сложно.Реализовать реально,но я точно не потяну.
Женя, завязывай. Это проще простого. Нужен редактор Chord Tracka. Это просто выбор по таблице как представлено выше. Второе, для твоего Scale Root нужно добавить источник Chord Track который бы строковые данные по таблице переводил бы Root Scale. Я пока не знаю алгоритм по которому ты делаешь транспозицию. Я тебе бы написал алгоритм. Тебе нужно было бы только перенести в скрипт.
[DOUBLEPOST=1450901830,1450901686][/DOUBLEPOST]@EUGEN27771, поставь Cubase Element 8 Demo. В течении 5 минут сам всё поймёшь. Там всё очень просто.
 
@Aleksandr Oleynik, первоначально нужно задать действия по условию, а также иметь возможность поменять действие по условию. Как ты видишь реализацию этого одним скриптом?. Мой разум пока что видит реализацию через пару скриптов.
Скрипт умеет создавать расширения сам для себя.
Варианты разные можно придумать
Т.е. загружаешь скрипт, вызываешь в GUI опцию настройки, задаёшь что нужно, или отвечаешь на вопросы последовательно, - скрипт создаёт ещё один скрипт, который после перезагрузки имортируется в основной.
Даже я это уже умею делать, благодаря Михаилу и lua.
А можно видимо и иначе, отвечая на вопросы писать в память (таблицы) совсем разные данные, которые потом скрипт по разному станет использовать.
Таблицы в lua, это вообще без граничные возможности.
 
не знаю алгоритм по которому ты делаешь транспозицию
алгоритм самый простейший-транспонируется к ближайшей ноте в указанном ладу.Вверх на ступень,и вниз на ступень.Это тоже самое,что поставить снеп в миди-едиторе.
123.gif Только транспонируются все треки сразу и в одной тональности и ладу.
Он вообще не ищет аккорды.Карта здесь-это просто "разрешенные" ноты в ладу.
"Снепить" в аккорды ,в смыле в ближайшие ноты тональности( и вверх и вниз одновременно) можно и даже довольно просто,почти тоже самое,но сами аккорды не определятся по названиям.
Нужен еще алгоритм определения.Ну и графику я точно не сделаю.
поставь Cubase Element 8 Demo
Не могу сейчас,позже попробую.
++++++++++
А вообще да,если сделать снеп(без транспозиции).
И использовать карты как аккордовые,то это почти почти тоже самое.Но с графикой все равно трудно,вернее пока никак.
 
Последнее редактирование:
@Aleksandr Oleynik, ты наверное не понял меня. Нужен скрипт который будет вызывать дейтсвие по условию. Нужен скрипт который будет менять действие по условию. Первый будет использоваться очень при очень часто. Второй раз в пятилетку. Возможно даже один раз и нужен только для реализации френдли юзер интерфейс. Тебе и мне он точно не нужен будет. А вот VAXу скорее да.

Есть второй вариант - я не понял тебя. Поэтому распиши свой видение одного скрипта который будет вызываться с загрузкой GUI. А потом ещё будет вызываться в виде действия через действие мыши. Я не понимаю пока тебя.
 
@belovw, Вам нужны разные дейтвия дв.клика на разное содержимое айтема?Это легко,когда вы щелкаете по айтемы-скрипт проверяет содержимое и выполняет ,в зависимости от результата.указанное действие.По времени это миллисекунды,поэтому все происходит незаметно
 
Вова, если все возможные условия можно за ранее описать, то они описываются в скрипте, а какие конкретно условия пользователь выбрал для себя раз в пять лет - пользователь выбирает в GUI (которые, кстати, я тоже пока не умею писать :)) - нажав на кнопочку настройки. настроил один раз и больше кнопочку не нажимает.
 
Простейший вариант(и потому самый эффективный)-это два скрипта-один настройки.Другой основной
 
А какое действие/скрипт эта кнопочка будет вызывать?
Запись в таблицы новых данных.
Или ещё проще - выбор каких условий из списка условий забитых в скрипт выбирать.
[DOUBLEPOST=1450905774,1450905739][/DOUBLEPOST]
Простейший вариант(и потому самый эффективный)-это два скрипта-один настройки.Другой основной
Мы же учимся - зачем нам простые варианты? :)
 
  • Like
Реакции: EUGEN27771
Получается нужно два скрипта?
В LUA можно один. Да и нужно наверное один, если разобраться с написанием GUI.
Скорее всего и в EEL тоже так-же один.
Поскольку скрипт всё равно должен ждать событие (кстати нужно проверить все ли нужные события-условия есть в API), то ни кто не запрещает сделать событием крутилки-кнопочки в самом GUI скрипта.
Поставил чекбоксы в GUI на то, что именно делать при наступлении того или иного события - и всё, при каждой загрузке скрипта он будет этим условиям подчиняться.
 
А вообще да,если сделать снеп(без транспозиции).И использовать карты как аккордовые,то это почти тоже самое.
Да, только не всё так просто. Что-то уже я засомневался в том как лучше это всё проворачивать. Можно попробоать применить два варианта. Например, транспонировать часть айтема в пределах тональности. Траспонировать патерн согласно гармонии.
[DOUBLEPOST=1450907925,1450907779][/DOUBLEPOST]@Aleksandr Oleynik, я всё таки более солидарен @EUGEN27771,

вариант(и потому самый эффективный)-это два скрипта-один настройки.Другой основной
Незачем скрипту в процессах постоянно висеть - не тот случай.
[DOUBLEPOST=1450908347][/DOUBLEPOST]
Траспонировать патерн согласно гармонии.
@EUGEN27771, а ведь в данном случае можно практически самограйку реализовать. Представь, имеем некий проект темплейт с полным составом. Имеем в нем патерны куплетов, припевов. Остаётся только расставить всё по форме, прописать Chord Track и применить гармонизацию.
В большинстве своём у аранжировщиков много уже готов темплэйтов в виде готовых работ. Для каких то простеньких работ самое то.
 
Да, только не всё так просто
Это понятно,если есть куча треков,и в каждой части проходящие ноты(не влияющие на суть аккорда с точки зрения музыканта),программа их интрепретирует,как хрен знает что.
а ведь в данном случае можно практически самограйку реализовать. Представь, имеем некий проект темплейт с полным составом. Имеем в нем патерны куплетов, припевов. Остаётся только расставить всё по форме, прописать Chord Track и применить гармонизацию.
В большинстве своём у аранжировщиков много уже готов темплэйтов в виде готовых работ. Для каких то простеньких работ самое то.
Это очень-очень сложно,практичеки нереально.
Если паттерны все в известной тональности и привести их к одной,да возможно.
Если пытаться вычислить без исходной,по нотам-практически нереально.Даже очень крутые программы самограйки не могут этого сделать,а мои крестики-нолики никогда.
=======
Короче,если даже сейчас прописать все заранее аккордами-это практически оно,только,в очень-очень простом виде,без какой-либо визуальной связи.Одновременная транспозиция определенного участка всех партий в заданной тональности.
123.gif
 
Последнее редактирование:
Незачем скрипту в процессах постоянно висеть - не тот случай.
А он не может не висеть, если тебе нужно ловить состояние Рипера постоянно?
Это во-первых?
Во-вторых, скрипт висящий в онлайн крайне мало расходует.....
 
если тебе нужно ловить состояние Рипера постоянно
Разве он не может ловить состояние при вызове?
[DOUBLEPOST=1450910361,1450910333][/DOUBLEPOST]
Во-вторых, скрипт висящий в онлайн крайне мало расходует.....
это сколько? Как это скажется на стабильности?
 
@EUGEN27771, интересно, как получилось траспортировать по тайм селекшену?
Евгений, даже так, уже нравится как все это происходит. Дайте хотяб бетку протестить этот чудо скрипт)
 
Разве он не может ловить состояние при вызове?
И ты будешь при каждой смене типа айтема вызывать скрипт параллельно с действием?

это сколько? Как это скажется на стабильности?
Не больше чем секция sample в JS-е, но зависит конечно от сложности скрипта.
 
есть ли какой-то простой способ "скопировать" определенную (например, выделенную) огибающую вместе с точками на другой трек? или, может, скрипт попадался подобный
 

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