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

  • Автор темы Автор темы @Michael
  • Дата начала Дата начала
@lil-burn, просто возьмите,например,первый(eel) и найдите поиском в документации по API каждую функцию и аналогичную в lua.И наоборот,некоторые нюансы,конечно,нужно учесть.
Но Вы же попробуйте хотя бы.
 
@crutifixus,
upload_2015-12-20_17-57-36.png

назначил, к примеру, на двойной щелчок мыши по свободной области на панели трека (с таким же успехом можно и на шоткат)
collapse+.gif
 
  • Like
Реакции: alexvg
@crutifixus, Посмотреть вложение 108588
назначил, к примеру, на двойной щелчок мыши по свободной области на панели трека (с таким же успехом можно и на шоткат)
Посмотреть вложение 108589
спасибо , сейчас буду пробовать

Подскажи пож-та в модифаере какую опцию выбирать ? track ?
 
Вот думаю почему производитель сам не "допиливает " такие вещи ................
Они есть из коробки ... но не так как Вам нравиться, это уже вопрос предпочтений. Мне не нравиться когда треки полностью скрыты, например.
нет ( я пол часа целюсь в эту кнопку ((
"Track: Cycle folder collapse state" в любое место кнопку, хоть на хоткей, хоть на маус модифайр ...

@lil-burn, опередил) И вариантов еще куча на выбор.
 
Они есть из коробки ... но не так как Вам нравиться, это уже вопрос предпочтений. Мне не нравиться когда треки полностью скрыты, например.

"Track: Cycle folder collapse state" в любое место кнопку, хоть на хоткей, хоть на маус модифайр ...

@lil-burn, опередил) И вариантов еще куча на выбор.
А куда на маус указывать ? Хочу обычно по двойному клику по треку . Какое окно выбирать нужно ?
 
@EUGEN27771,

этот код
Код:
function action(id) reaper.Main_OnCommand(id, 0) end
_,_,_,_,_,_,val = reaper.get_action_context()
if val > 0 then action(1007) else action(1016) end

попробовал заменить на
Код:
val = get_action_context();
val > 0 ? Main_OnCommand(1007, 0) : Main_OnCommand(1016, 0);
в результате работает только пол кода

еще больше не понятно с переводом
Код:
GetResourcePath(#retval);
sprintf(#fullpath, "%s\\Scripts\\!_Shotcut_key-1_test.eel", #retval);
f = fopen(#fullpath, "w");
fwrite(f, "Main_OnCommand(40939, 0);", 0);
fclose(f);
в lua: не нашел, например, аналогов sprintf, fopen, fwrite
 
@crutifixus, если выбрать Track, то срабатывать будет при даблклике по свободному месту в окне аранжа (свободному от айтемов). можно поставить и на Track, и на TCP.
 
  • Like
Реакции: crutifixus
  • Like
Реакции: lil-burn
Есть мысль доработать скрипт.
1.gif
Скрипт транспонирует выделенный диапазон в окне аранжировки(то есть все ноты входящие в выделение) на одну ступень в выбранном ладу.Это годный скрипт(на мой взгляд).По сути,это позволяет управлять всеми миди-партиями как одним целым куском во времени.Приблизительно,дает возможность менять аккорды во всех партиях с привязкой к указанной тональности.Допустим,не нравится аккорд,можно понизить или повысить на ступень сразу все партии на разных треках одним действием с учетом тональности не заходя в миди-редактор и без кучи доп. действий.
====
Но,там все происходит через приодическое открытие окна миди-редактора,потому мелькания и т.п.
И вообще некрасиво.Можно и нужно сделать напрямую.Короче,нужно просчитать,как завязана scale на транспозицию простейшим способом.Scale выглядит примерно так ступень и положение-102034050607
Номер ноты(1,2,3 и тд) получается остатком от деления на 12.
Дальше можно все сделать сравнениями и т.п.
Но интуиция подсказывает,что это сделано не зря и там побитовые операции упростят все в разы.
Какие есть идеи?
 
  • Like
Реакции: Al Brazy и elektrozz
@@Michael,спасибо большое,я помню,но там не то в итоге.
Нужно в определенной тональности и ладу транспонировать все ноты из всех выделенных айтемов в выделенном временном диапазоне.
Короче,если у нас есть Am-G-F-Em например,и это по всей горизонтали,то выделяем,допустим, F,по тайм-селекшн.И,если транспонируем на ступень вверх-получаем G,а если на ступень вниз то Em,со всеми нотами во всех айтемах по гризонтали.И так можно с каждым участком поступить.
==
Если понятнее объяснять,это аналогично,тому,что заходим в миди-редактор,делаем все айтемы и тейки в проекте видимыми и редактируемыми,ставим лад и тональность,выделяем участок и транспонируем с учетом тональности.А если еще проще -вот играет группа,и вся группа вдруг внезапно захотела сменить аккорд на ступень ниже или выше задуманного изначально,но с учетом тональности.
====
@@Michael, еще проверил,Ваш скрипт выставляет одинаковую тональность для всех тейков.Это понятно.
==
Внутренности не работают.
Надо дальше сложно проработать.
===
Еще-почему не пользоваться FNG ,чтоб не удалять-вставлять ноты.Вроде бы там все четко работает,в основном это проверено
 
Последнее редактирование:
  • Like
Реакции: elektrozz и Beckoff
@EUGEN27771, +++ хорошая идея, удобно делать в аранже чем по 100 раз в миди, мысли уходят пока зайдешь выйдешь.
 
@Aleksandr Oleynik,@@Michael,
Вы можете примерно описать суть побитовых операций на практике?
Я то общий смысл понимаю,и использовал это даже постоянно.
Но применительно к scale не могу найти подход.
Например,просто решить задачу- есть scale(строка) - 102034050607, нужно найти,каким знаком есть нота 4.(Ответ-6)
Подозреваю,что это элементарно делается.
Инфо.http://learnc.info/c/bitwise_operators.html
Сдвиг и сравнение-по кол-ву сдвигов можно вычислить?Тупо...
по скорости eel и lua.
В eel простой цикл с любыми мат. вычислениями именно в 2-3 раза быстрей,чем в lua.
Я,наверное,больше к eel и не вернусь в скриптах,если что-то писать буду,но тем не менее.
==
С простыми числами разобрался
[DOUBLEPOST=1450698171,1450687515][/DOUBLEPOST]
Я крайне плохо дружу с этит побитными данными, с не 10-и ричной системой и всем таким прочим
Нужно Михаила трусить.
Я тоже.Надо разбираться http://learnc.info/c/bitwise_operators.html там не так все и сложно.
Насколько я понял,кокосы постоянно имеено такую логику используют.Это дает возможность в одной переменной сохранить больше данных.
Например,playstate,все значения сразу,или те же входы-выходы трека.Посмотрите,как они поступили SetMediaTrackInfo_Value, I_RECINPUT.
Но со scale все сложнее.
 
Последнее редактирование:
по скорости eel и lua.
В eel простой цикл с любыми мат. вычислениями именно в 2-3 раза быстрей,чем в lua.
Я,наверное,больше к eel и не вернусь в скриптах,если что-то писать буду,но тем не менее.
Что конкретно это обозначает?
Значит ли это, что, например loop вычисляющий какую-то переменную будет её вычислять в EEL в два раза быстрее чем в LUA?
Тогда получается, что в LUA кол-во циклов в два раза меньше в еденицу времени, чем в EEL?
И ещё вопрос - Если Джастин сказал, что deffer делает в среднем в секунду 30-50 циклов, то это значит, что один цикл это - не меньше чем 20 мс, и на мой россуд это значит, что что либо в скрипте вычислить быстрее, чем за 20 мс не возможно - это его время буфера (задержка) на Любой к нему запрос. Так?
У JS -а это реально один сэмпл!
Получается, что Скрипт в 1000 раз медленнее чем JS, или я чего-то не понимаю?
 
Значит ли это, что, например loop вычисляющий какую-то переменную будет её вычислять в EEL в два раза быстрее чем в LUA?
Да,простеший цикл в 2-3 раза быстрее.Просто i=i+1.
Это почти никак не влияет на общий результат,так как сами операции,в основном, длятся гораздо дольше.
[DOUBLEPOST=1450704752,1450703044][/DOUBLEPOST]
deffer делает в среднем в секунду 30-50 циклов
В defer,наверное,другой поток вычислений.Не в общем потоке,а отдельно.Это вообще неизвестно,в других языках вроде бы так.
что что либо в скрипте вычислить быстрее, чем за 20 мс не возможно
-в основном потоке можно с такой скоростью,с какой позволяют ресурсы.то есть в тысячи раз быстрее.

Получается, что Скрипт в 1000 раз медленнее чем JS, или я чего-то не понимаю?
Нет,одназначно.
В JS части специально выполняются за определенную отведенную единицу времени.
В скрипте,насколько я понимаю,без привязки ко времени,как позволяют отведенные ресурсы.
На самом деле,неизвестно,как оно себя ведет в реальности,но есть функции time,и можно проверять.
П.С.На самом деле никакого самого дела нет
 
Последнее редактирование:
В defer,наверное,другой поток вычислений.Не в общем потоке,а отдельно.Это вообще неизвестно,в других языках вроде бы так.
-в основном потоке можно с такой скоростью,с какой позволяют ресурсы.то есть в тысячи раз быстрее.
не проверял время цикла в loop, нужно бы проверить....
Нет,одназначно.
В JS части специально выполняются за определенную отведенную единицу времени.
В скрипте,насколько я понимаю,без привязки ко времени,как позволяют отведенные ресурсы.
На самом деле,неизвестно,как оно себя ведет в реальности,но есть функции time,и можно проверять.
П.С.На самом деле никакого самого дела нет
Большая часть вычислений как раз и происходят (если это не разовое действие, а вот как в секции sample в JS-е) в loop-е или в deffer-е -
и я не очень представляю как они могут происходить быстрее, чем нужно loop-у или deffer-у на один цикл?
Ведь для рассчёта данных в следующем цикле предидущий должен пройти.
 
Большая часть вычислений как раз и происходят (если это не разовое действие, а вот как в секции sample в JS-е) в loop-е или в deffer-е -
и я не очень представляю как они могут происходить быстрее, чем нужно loop-у или deffer-у на один цикл?
Ведь для рассчёта данных в следующем цикле предидущий должен пройти.
Я не говорил,что можно получить результат быстрее,чем пройдут вычисления.Иначе это было бы путешествие во времени:),наверное,не совсем понятно описал,у меня с этим проблема.
В любом случае,можно измерить время выполнения и в JS,и в скрипте
Ред.Уже решено.
[DOUBLEPOST=1450741013,1450723883][/DOUBLEPOST]Еще раз спрошу,не могу решить простую задачу,может у кого-то мозги по-лучше варят.
Нужен именно простейший вариант!Без перебора всех значений.
Есть число,например,102304056070.
Нужно найти номер знака в этом числе,например,для 4(ответ-шестой знак,или 5-й,если считать с нуля).
Вся эта хрень легко вычисляется побитовыми операциями http://learnc.info/c/bitwise_operators.html
но как-мне абсолютно не понятно.
Наводка-примерно,как делается тут:
I_RECINPUT : int * : record input. <0 = no input, 0..n = mono hardware input, 512+n = rearoute input, 1024 set for stereo input pair. 4096 set for MIDI input, if set, then low 5 bits represent channel (0=all, 1-16=only chan), then next 5 bits represent physical input (63=all, 62=VKB)
Смысл-они сохраняют данные,начиная с определенного значения,то есть для начала нужно найти хотя бы шаг.
 
Последнее редактирование:
a<<n = a * 2^n
a>>n = a / 2^n
Для наглядности можно перевести в двоичную->стринг-->стринговыми функциями перетащить первый знак в конец ->вернуть как интеджер

Скейл вроде к побитовым не относится, там паттерн, в том скрипте я загнал его в таблицу как нули/единицы для октавы:
PHP:
midieditor = reaper.MIDIEditor_GetActive() 
  if  midieditor ~= nil then
    is_scale_enabled = reaper.MIDIEditor_GetSetting_int(midieditor, "scale_enabled")
    if is_scale_enabled == 1 then    
      scale_root = reaper.MIDIEditor_GetSetting_int(midieditor, "scale_root")
      retval, scale_pat_original = reaper.MIDIEditor_GetSetting_str(midieditor, "scale", "")
      scale_pat = scale_pat_original:sub(13-scale_root).. scale_pat_original:sub(0, 12-scale_root)
      scale_pat_t={} 
      scale_pat:gsub(".",function(c) if c ~= "0" then c = "1" else c = "0"end table.insert(scale_pat_t,c)end)
    end
  end

Нужно найти номер знака в этом числе,например,для 4(ответ-шестой знак,или 5-й,если считать с нуля).
string.find("10203400000", '4') = 6
 
Последнее редактирование:
@@Michael, спасибо,значит надо так и делать.Я пол дня провозился,простого варианта не нашел
 
Дублируем айтем 10000 раз.
Код:
time1 = time_precise();
item = GetSelectedMediaItem(0,0);
ApplyNudge(0, 0, 5, 20, 2, false, 10000);
time2 = time_precise();
time_diff = time2-time1;
sprintf(#dest,"%f",time_diff);
ShowConsoleMsg(#dest);
UpdateArrange();
3.597772 секунды

Код:
time1 = reaper.time_precise()
item = reaper.GetSelectedMediaItem(0,0)
reaper.ApplyNudge(0, 0, 5, 20, 2, false, 10000)
time2 = reaper.time_precise()
time_diff = time2-time1
reaper.ShowConsoleMsg(time_diff)
reaper.UpdateArrange()
3.5631619697087

Core i5 / 8GB RAM / SSD / Win8

@@Michael, а не мог бы ты портировать этот скрипт в LUA?

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 понял - спотыкаюсь :(
Хочу всё-таки проверить ещё скорость основных мне нужных в скриптах операций, которые у меня все завязаны на имени трека
 
Вот мысль еще одна-сделать ретроспективную запись без воспроизведения.Надоело воспроизведение клацать:).Нужно такое или нет?Хотя без разницы.Мне идея нравится.
Отличная идея и очень правильная! Ждем.
@EUGEN27771, спасибо за старания огромное!
 
Я все-таки нашел!
Псотоянно сбивали с толку числа 1234567 в паттерне.
На самом деле-число в позиции не важно,важна только сама позиция,и чтобы там было что-либо отличное от нуля!
101101011010 или
102304056070 не имеет значения.
Вот как построен паттерн scale:
#Каждая позиция соотв. опр. числу:
# 0 1 2 3 4 5 6 7 8 9 10 11 = это позиция#
# 1-2-4-8-16-32-64-128-256-512-1024-2048 = это числа, соответствующие опр. позиции #
###########
Число лада(scale) получается от суммы соотв. чисел(см. выше)
Например, паттерн "101101011010" (Natural minor)-это позиции 0+2+3+5+7+8+10.
Отсюда имеем 1+4+8+32+128+256+1024=1453-это и есть число scale.
1453=010110101101 в бинарном виде,если читать справа налево-это и есть паттерн scale.
MIDI_GetScale-позволят узнать лад(число scale) и root-ноту(даже не заходя в миди-редактор).
Дальше нужно продумать,как это все использовать по назначению.
[DOUBLEPOST=1450809905,1450809804][/DOUBLEPOST]@Beckoff, пока отложил,может позже сделаю.Тут выкладывал тестовый вариант,который пишет все со входа независимо от проигрывания
 
Так я и написал: if c ~= "0" then c = "1" else c = "0" end

Число вроде за что-то отвечает, за аккорд может быть? Уже не помню, давно экпериментировал

Aleksandr Oleynik, с компа буду -напишу
 

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