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

Тема в разделе "Reaper", создана пользователем @Michael, 2 авг 2015.

  1. @Michael

    @Michael Well-Known Member

    Регистрация:
    14 дек 2010
    Сообщения:
    761
    Симпатии:
    1.158
    Пол:
    Мужской
    Адрес:
    Орёл / Москва
    MOD.
    Важно!
    http://rmmedia.ru/threads/119732/
    ---------------------------------------------


    Привет.
    Заметил, что на форуме нет до сих пор треда, посвящённого именно скрипт реквестам, наподобии этого треда на официальном форуме Cockos. Есть обсуждение, но оно не подразумевает написание скриптов / кастомов. И, насколько мне известно, есть множество ребят, способных помочь в этом деле. Общими усилиями проще находить решения проблем ;)

    Предлагаю постить сюда все ваши вопросы в стиле "как сделать такое то действие", при условии того, что вы целую вечность бились и к настоящему моменту всё ещё не нашли как.
     
    Последнее редактирование: 29 окт 2017
    Archchie, IGor2D, Nady и 11 другим нравится это.
  2. nounaim

    nounaim Active Member

    Регистрация:
    29 авг 2010
    Сообщения:
    215
    Симпатии:
    47
    ок, начну тогда)
    1)запуск скрипта для piano roll(mouse modifiers) через левый клик без перемещения эдит курсора так и не получилось сделать, двигается даже с пустым экшеном, можно было б ставить ноты с велосити последней выбраной ноты, это было б мега удобно, как во фруктах, save restore не помогает с undo move cursor тоже как то криво выходит и через set edit cursor тоже никак, уже спрашивал но может кто понял уже.
    2)экшен duplicate events не работает если piano roll timebase - source beats, и midi item сдвинут онтосительно начала проекта, пробовал скриптом через copy paste не получилось ,без copy paste
    duplicate делается столко раз сколько нот в других миди каналах айтем, такая ерунда:
    PHP:
    act_editor MIDIEditor_GetActive();
    take MIDIEditor_GetTake(act_editor);
    fntk=extension_api("FNG_AllocMidiTake"take);
    chan=MIDIEditor_GetSetting_int(MIDIEditor_GetActive(), "default_note_chan");

    notescount=extension_api("FNG_CountMidiNotes"fntk);
    extension_api("FNG_FreeMidiTake"fntk);

    MIDI_Sort(take);

    i=0;
    i2=0;

    //Count selected notes
    loop(notescount,
    MIDI_GetNote(takei2selectedOutmutedOutstartppqposendppqposOutchanOutpitchOutevent_value);
    //MIDI_SetNote(take, 2, 1, mutedOut, 0, 2, chanOut, pitchOut, event_value);
    selectedOut ==? (
    Count_selected=Count_selected+1;
    );
    i2=i2+1;
    );

    //duplicate((
    loop(notescount,
    MIDI_GetNote(takeiselectedOutmutedOutstartppqposendppqposOutchanoutpitchOutevent_value);
    //MIDI_SetNote( take, i, 0,mutedOut, startppqpos, endppqposOut, chanout, pitchOut, event_value);
    MIDI_InsertNote(take00startppqpos+3840endppqposOut+3840chanpitchOut96);
    i=i+1;
    );
    получилось сделать только так что скопированые ноты не выделены и если нужно сделать duplicate несколько раз нужно выделять их снова
     
  3. Tito

    Tito Active Member

    Регистрация:
    17 янв 2005
    Сообщения:
    245
    Симпатии:
    60
    Адрес:
    Питер
    Продолжу :).
    Очень хотелось бы иметь возможность открывать "морду" ревербератора (к примеру) прямо из трека,с которого организован посыл в микшере(аналог кнопки "е" на сенде в Кубэйсе).
    В микшере ПКМ на сенде есть команда "Go To Send Destination Track" .От этого,по идее,можно "плясать",но вот как это скриптом реализовать?
     
  4. @Michael

    @Michael Well-Known Member

    Регистрация:
    14 дек 2010
    Сообщения:
    761
    Симпатии:
    1.158
    Пол:
    Мужской
    Адрес:
    Орёл / Москва
    lil-burn, nounaim, EUGEN27771 и 3 другим нравится это.
  5. Tito

    Tito Active Member

    Регистрация:
    17 янв 2005
    Сообщения:
    245
    Симпатии:
    60
    Адрес:
    Питер
    Ага,разобрался.Упростил для себя :).
    Код:
    sel_track = reaper.GetSelectedTrack(0,0)
    send_track = reaper.BR_GetMediaTrackSendInfo_Track(sel_track, 0, 0, 1)
    reaper.TrackFX_Show(send_track, 0, 3)
    Показывает первый FX для первого сенда выбранного трека.
    Если я правильно понял,пока в API BR_GetMouseCursorContext параметров для сендов нет,написать "мышкозависимый" скрипт не получится?
     
  6. @Michael

    @Michael Well-Known Member

    Регистрация:
    14 дек 2010
    Сообщения:
    761
    Симпатии:
    1.158
    Пол:
    Мужской
    Адрес:
    Орёл / Москва
    Смотря что хочешь написать. Там есть контекст для трека (а значит и трека в качестве посыла).
    Как мне объяснил BReeder, в теории конечно можно настрогать на C++ контекст для плагинов/посылов под курсором в микшере, кнопок всяких в тулбарах и т.д., но эти дела все упираются в Walter, что увеличивает сложность написания таких операторов в разы.
     
    Strannicom и Tito нравится это.
  7. Tito

    Tito Active Member

    Регистрация:
    17 янв 2005
    Сообщения:
    245
    Симпатии:
    60
    Адрес:
    Питер
    Ну,идеально было бы открывать FX того сенда,который под курсором.А так можно сделать срипт для 1-2-3-сенда,запихать их в цикл и листать одной кнопкой,к примеру.Только не понял пока,как избавиться от ошибки,если при "переборе" сендов пустой попадается. (
     
  8. RJ Baker

    RJ Baker Well-Known Member

    Регистрация:
    15 июл 2006
    Сообщения:
    838
    Симпатии:
    318
    Пол:
    Мужской
    Род занятий:
    Музыка, аранжировка
    Адрес:
    Мариуполь
    Можно ли задавать скриптом определенный поисковой запрос в окне MediaExplorer?
     
  9. lil-burn

    lil-burn Well-Known Member

    Регистрация:
    15 авг 2012
    Сообщения:
    903
    Симпатии:
    621
    Пол:
    Мужской
    Адрес:
    Екатеринбург
    Добрый день! Не соображу пока, как реализовать выделение нескольких треков с помощью shift + вверх/вниз. Интересует поведение, аналогичное выделению нескольких файлов в windows.
    Пока реализовано в таком виде
    2.JPG 1.JPG
    Но данные кастомы не умеют снимать выделение с последних выделенных треков, что не удобно, если случайно были выделены лишние треки
     
  10. @Michael

    @Michael Well-Known Member

    Регистрация:
    14 дек 2010
    Сообщения:
    761
    Симпатии:
    1.158
    Пол:
    Мужской
    Адрес:
    Орёл / Москва
    Конечно не умеют, ведь
    Перед кастомом:
    Unselect all tracks
    SWS/BR Select TCP (MCP) track under mouse cursor
     
  11. lil-burn

    lil-burn Well-Known Member

    Регистрация:
    15 авг 2012
    Сообщения:
    903
    Симпатии:
    621
    Пол:
    Мужской
    Адрес:
    Екатеринбург
    что-то под вечер совсем запутался: если перед кастомом поставить Unselect all tracks, так ведь со всех треков снимется выделение. вроде как. а нужно, чтобы было вот как 1.gif
     
  12. @Michael

    @Michael Well-Known Member

    Регистрация:
    14 дек 2010
    Сообщения:
    761
    Симпатии:
    1.158
    Пол:
    Мужской
    Адрес:
    Орёл / Москва
    Да, Unselect all tracks не нужно. Тут определённо нужен скрипт.
    Только зачем, если удерживая shift можно выбрать хоть 100500 треков без клацания хоткеями?
    Да и заменять один лишний клик по нужному треку целым скриптом - это уже извращение.
     
    Последнее редактирование: 6 авг 2015
  13. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    15.246
    Симпатии:
    7.859
    Пол:
    Мужской
    Адрес:
    Киев
    Так у многих "крышу срывает" от возможностей Рипера - вот и ....... изобретают то, что уже давно есть и так.
     
  14. RJ Baker

    RJ Baker Well-Known Member

    Регистрация:
    15 июл 2006
    Сообщения:
    838
    Симпатии:
    318
    Пол:
    Мужской
    Род занятий:
    Музыка, аранжировка
    Адрес:
    Мариуполь
    Спрашивал выше... А поисковый запрос в MediaExplorer уже есть в скрипте или его еще изобретают?))
     
  15. @Michael

    @Michael Well-Known Member

    Регистрация:
    14 дек 2010
    Сообщения:
    761
    Симпатии:
    1.158
    Пол:
    Мужской
    Адрес:
    Орёл / Москва
    Его уже изобрели. Вбиваешь ключевое слово и ищешь.
     
  16. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    15.246
    Симпатии:
    7.859
    Пол:
    Мужской
    Адрес:
    Киев
    @RJ Baker, если @@Michael ни чего не ответил - значит нет.
    А зачем, если не секрет?
    Чем не устраивает поиск в самом Media Explorer-е?
    PS: Пока писал Михаил ответил.
     
  17. RJ Baker

    RJ Baker Well-Known Member

    Регистрация:
    15 июл 2006
    Сообщения:
    838
    Симпатии:
    318
    Пол:
    Мужской
    Род занятий:
    Музыка, аранжировка
    Адрес:
    Мариуполь
    Молчание можно трактовать по-разному. Хотелось по старинке - словами.
    А вбивать ручками - это совет дельный. Заменяет любой скрипт и экшн впринципе.
    А надо мне было для того же что и всем - автоматизировать некоторые рутинные операции по поиску медиаконтента. Ну да ладно. ClipX в помощь! Спасибо.
     
  18. Mateush1982

    Mateush1982 Active Member

    Регистрация:
    5 авг 2009
    Сообщения:
    401
    Симпатии:
    146
    Пол:
    Мужской
    Адрес:
    Krasnoyarskiy kray
    Нашел в сети замечательный custom action "copy selected take to new track"
    Вопрос, помогите пожалуйста реализовать то же самое, но с использованием time selection (выбранный кусок тейка на новый трек в ту же самую позицию)
    Заранее огромное спасибо! Screen Shot 2015-08-10 at 12.10.38.png
     
    Andrey Marchenko нравится это.
  19. @Michael

    @Michael Well-Known Member

    Регистрация:
    14 дек 2010
    Сообщения:
    761
    Симпатии:
    1.158
    Пол:
    Мужской
    Адрес:
    Орёл / Москва
  20. Mateush1982

    Mateush1982 Active Member

    Регистрация:
    5 авг 2009
    Сообщения:
    401
    Симпатии:
    146
    Пол:
    Мужской
    Адрес:
    Krasnoyarskiy kray
    Спасибо!!!! А можно сделать так , что бы не удалялись исходники? Вдруг какие нибудь куски дублей еще пригодятся в дальнейшем
    исходник
    Screen Shot 2015-08-12 at 13.28.27.png

    После применения
    Screen Shot 2015-08-12 at 13.28.47.png
    То есть исходники пропали!
     
  21. Mateush1982

    Mateush1982 Active Member

    Регистрация:
    5 авг 2009
    Сообщения:
    401
    Симпатии:
    146
    Пол:
    Мужской
    Адрес:
    Krasnoyarskiy kray
    @@Michael,Спасибо огромное - большое дело делаете. может хоть "кошелек" добавите? , все таки труд велик и на радость всем, а он должен вознаграждаться !!!!
     
  22. @Michael

    @Michael Well-Known Member

    Регистрация:
    14 дек 2010
    Сообщения:
    761
    Симпатии:
    1.158
    Пол:
    Мужской
    Адрес:
    Орёл / Москва
    Исправил, сейчас вроде должно работать (ссылка та же).
     
    Последнее редактирование: 8 ноя 2015
    Mateush1982 нравится это.
  23. Mateush1982

    Mateush1982 Active Member

    Регистрация:
    5 авг 2009
    Сообщения:
    401
    Симпатии:
    146
    Пол:
    Мужской
    Адрес:
    Krasnoyarskiy kray
    @@Michael, Все работает как часы!
    --- добавлено 12 авг 2015, дата сообщения: 12 авг 2015 ---
    @@Michael, Кстати а не планируете допиливать Quantize tool , и какие у Вас задумки по доработке данного скрипта?
     
  24. @Michael

    @Michael Well-Known Member

    Регистрация:
    14 дек 2010
    Сообщения:
    761
    Симпатии:
    1.158
    Пол:
    Мужской
    Адрес:
    Орёл / Москва
    Да, я работаю над ним сейчас, вернее, переделываю функционал (много всего) и интерфейс, т.к. в нынешней доступной версии достаточно криво всё было написано.
     
    Slick, Tito, Aleksandr Oleynik и ещё 1-му нравится это.
  25. Oppositionist

    Oppositionist терапевт

    Регистрация:
    13 янв 2008
    Сообщения:
    233
    Симпатии:
    62
    Род занятий:
    концертмейстер
    Адрес:
    Санкт-Петербург
    Можно ли как-нибудь осуществить посыл выделенных треков на заранее определенный (к примеру, первый) трек одной клавишей (в идеале тугл).
     
  26. @Michael

    @Michael Well-Known Member

    Регистрация:
    14 дек 2010
    Сообщения:
    761
    Симпатии:
    1.158
    Пол:
    Мужской
    Адрес:
    Орёл / Москва
    Последнее редактирование: 14 авг 2015
    kseile, Oppositionist и Slick нравится это.
  27. fruitcore

    fruitcore Active Member

    Регистрация:
    13 дек 2013
    Сообщения:
    268
    Симпатии:
    68
    Адрес:
    NN
    А в lua возможно добавить конкретный плагин на выделенный трек (или несколько треков).
    Это можно сделать средствами cycle action, но в случае, если этот плагин уже есть на треке, то он больше не добавляется, просто открывается его окошечко.
    Может быть средствами скриптов это можно обойти?
     
  28. fugas20051

    fugas20051 New Member

    Регистрация:
    26 янв 2009
    Сообщения:
    17
    Симпатии:
    1
    Есть много дорожек, на них много атемов мютованых и нет. как в одно движение: 1 выделить только немютованые айтем. 2 скопировать их на новый трек. 3 старые немютованые треки покрасить в один цвет и заглушыть?
     
  29. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    15.246
    Симпатии:
    7.859
    Пол:
    Мужской
    Адрес:
    Киев
    @fugas20051, вы в самом деле ПОДОБНЫЕ действия делаете каждый день по десять раз подряд?
    Потому как если нет, то смысла писать Кастом Экшин или Скрипт на эту последовательность нет!!!!!, будет дольше, чем сделать это ручками пару-тройку раз.
    Ставить задачу для написания скрипта можно ТОЛЬКО, если эта задача ПОСТОЯННО ПОВТОРЯЕТСЯ В РАБОТЕ.
     
    @Michael нравится это.
  30. EUGEN27771

    EUGEN27771 Well-Known Member

    Регистрация:
    23 апр 2010
    Сообщения:
    2.225
    Симпатии:
    1.889
    Пол:
    Мужской
    Можно ли устанавливать параметры МИДИ-эдитора,прерыл весь API,нашел только,как считать,конкретно интересует-
    Снимок.PNG
    Есть,конечно, обходной путь,устанавливать через экшны next snap scale root и next snap scale,считывать и сверять,покуда не будет соответствия.
    Но,может,я не заметил и все проще,через API?
     
  31. fugas20051

    fugas20051 New Member

    Регистрация:
    26 янв 2009
    Сообщения:
    17
    Симпатии:
    1
    @Aleksandr Oleynik постоянно, при каждой сессии записи вокала, когда из много дублей выбирается найлучшые моменты, ну и етот скрипт можна будет применять и к гитаре и тд
     
    RJ Baker нравится это.
  32. sapun

    sapun Member

    Регистрация:
    21 авг 2014
    Сообщения:
    133
    Симпатии:
    11
    Адрес:
    nsk
    Приветствую! Можно ли как-то скриптом увеличить скорость прокрутки колесом мыши вверх/вниз? У меня колесо листает треки вверх/вниз.
     
  33. Slick

    Slick IDDQD

    Регистрация:
    13 май 2008
    Сообщения:
    1.860
    Симпатии:
    789
    Род занятий:
    Аранжировщик, Саунд Дизайнер
    Адрес:
    Москва, Апрелевка
    а почему бы просто в настройках мыши в системе не увеличить скорость скролла?
     
  34. @Michael

    @Michael Well-Known Member

    Регистрация:
    14 дек 2010
    Сообщения:
    761
    Симпатии:
    1.158
    Пол:
    Мужской
    Адрес:
    Орёл / Москва
    Последнее редактирование: 16 авг 2015
    EUGEN27771 нравится это.
  35. EUGEN27771

    EUGEN27771 Well-Known Member

    Регистрация:
    23 апр 2010
    Сообщения:
    2.225
    Симпатии:
    1.889
    Пол:
    Мужской
    Можно без скриптов и цикл-экшнов .Через через SWS-Resources.Добавляется,даже когда на треке уже есть такой же плагин
     
    fruitcore нравится это.
  36. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    15.246
    Симпатии:
    7.859
    Пол:
    Мужской
    Адрес:
    Киев
    Я не понимаю как он поможет, не понял из описания.....
    Может вы мультик сделаете того, что хотите автоматизировать - проделывая всё ручками?
    Ну и @@Michael правильно написал - для работы с дублями в Рипере есть механизм Тэйков - который и следует использовать.... А вот для некоторых более удобных манипуляций с Тейками - где-то выкладывали Кастом Экшин ...., дигидон кажется.
    Вот, Glue Takes -
    http://rmmedia.ru/threads/107757/page-2#post-1870549
    Все прочие манипуляции с тейками делаются стандартным инструментарием - вам с ним нужно просто разобраться.
     
    Последнее редактирование: 16 авг 2015
  37. @Michael

    @Michael Well-Known Member

    Регистрация:
    14 дек 2010
    Сообщения:
    761
    Симпатии:
    1.158
    Пол:
    Мужской
    Адрес:
    Орёл / Москва
    Ну всё верно. Файл чейна по сути - код плагина. В Lua его можно добавить напрямую с помощью SetTrackStateChunk. А вот как его закодировать собственно или как-то ещё получить без сохранения цепи - неизвестно.
    Wiki гласит:
    PHP:
    VST(iPlugin

        
    <VST "VST: SomePlugin" "SomePlugin.dll" "Sax offender"  //  Start of VST plugin data
                                                                  //   field 1, str, default name
                                                                  //   field 2, str, filename
                                                                  //   field 3, int, ??
                                                                  //   field 4, str, display name (default used if empty)
        
    RmFkbe9e7f4CAAAAAQAAAAAAAAACAAAAAAAAAAIAAAABAAAAAAAAAA==  //  Binary data, leave it alone (variable number of lines)
        
    AgAAAAAAAAAwAAAAAAAAAAAAEADvvq3eDfCt3sP1qD4zMzM/AAAAPw==  //
        
    mplZPwAAAAAAAAA/MzMzP83MzD4AAAAAAABAP1Jlc29uYW50IEZpbA==  //
        
    dGVyAA==                                                  //
        
    >                                                         //  End of VST plugin data
    Можно попробовать и без бинарного кода обойтись, надо поэкспериментировать))
    UPD Не, Рипер очень суров к форматированию бинарного кода, надо это очень тонко учитывать, плюс потом Reaper сам генерирует FXGUID, автоматом создаёт чейн + параметры чейна. Из 10 тестов в двух плагин успешно добавился, в остальных либо криво форматируется имя, либо плагин находится, но его конфигурация теряется на полпути. Ну и вообще не очень-то разумно лезть в файл проекта, не зная, как он строился.
     
    Последнее редактирование: 16 авг 2015
  38. LilColt

    LilColt Well-Known Member

    Регистрация:
    28 ноя 2011
    Сообщения:
    1.189
    Симпатии:
    708
    Пол:
    Мужской
    Адрес:
    Саратов
    В общем та тема видать затухла да и половина ссылок не пашут,в связи с этим имею смелость попросить о таком экшене как в этом посте:
    http://rmmedia.ru/threads/107757/#post-1690277

    А то ещё мой скил не достаточно прокачен для такого:)
     
  39. @Michael

    @Michael Well-Known Member

    Регистрация:
    14 дек 2010
    Сообщения:
    761
    Симпатии:
    1.158
    Пол:
    Мужской
    Адрес:
    Орёл / Москва
    Скрывать опасно, на мой взгляд. Вылезет что-нибудь где-нибудь - будешь сто лет искать где, пока не окажется, что ты это что-то скрыл.
    Уж лучше Track: Cycle folder collapsed state.
     
  40. LilColt

    LilColt Well-Known Member

    Регистрация:
    28 ноя 2011
    Сообщения:
    1.189
    Симпатии:
    708
    Пол:
    Мужской
    Адрес:
    Саратов
    Так конечно не комильфо...громоздко
    А других вариантов нету?
    Снимок.PNG
     
  41. @Michael

    @Michael Well-Known Member

    Регистрация:
    14 дек 2010
    Сообщения:
    761
    Симпатии:
    1.158
    Пол:
    Мужской
    Адрес:
    Орёл / Москва
    LilColt, открываешь .reaperthemezip / rtconfig.txt и меняешь все tcp_heights 10 (скорее всего, судя по скрину) на tcp_heights 5 (пять - это высота суперсжатого состояния дочек в пикселях)
     
    Последнее редактирование: 18 авг 2015
    LilColt нравится это.
  42. LilColt

    LilColt Well-Known Member

    Регистрация:
    28 ноя 2011
    Сообщения:
    1.189
    Симпатии:
    708
    Пол:
    Мужской
    Адрес:
    Саратов
    Как я понимаю линии просто тоньше станут в 2 раза?
    Это всё равно не то:)
    Ладно смирюсь,попривыкну думаю.
     
  43. @Michael

    @Michael Well-Known Member

    Регистрация:
    14 дек 2010
    Сообщения:
    761
    Симпатии:
    1.158
    Пол:
    Мужской
    Адрес:
    Орёл / Москва
    Последнее редактирование: 18 авг 2015
    lil-burn и LilColt нравится это.
  44. LilColt

    LilColt Well-Known Member

    Регистрация:
    28 ноя 2011
    Сообщения:
    1.189
    Симпатии:
    708
    Пол:
    Мужской
    Адрес:
    Саратов
    Иногда голова работой забита,которую нужно сделать в сроки,и кастомизация рипера отходит на 2ой план.
    Помогли и хорошо,язвить только вот не нужно.
     
    Andrey Marchenko нравится это.
  45. EUGEN27771

    EUGEN27771 Well-Known Member

    Регистрация:
    23 апр 2010
    Сообщения:
    2.225
    Симпатии:
    1.889
    Пол:
    Мужской
    @@Michael, подскажите,как работает PreventUIRefresh.В общем,нужно отключить обновление интерфейса на время выполнения скрипта,ставлю PreventUIRefresh(1),в конце PreventUIRefresh(-1),по аналогии с чужими скриптами.Не помогает.Что означает число в скобках и как этим PreventUIRefresh правильно пользоваться?
     
  46. @Michael

    @Michael Well-Known Member

    Регистрация:
    14 дек 2010
    Сообщения:
    761
    Симпатии:
    1.158
    Пол:
    Мужской
    Адрес:
    Орёл / Москва
    Где не помогает конкретно?
     
  47. EUGEN27771

    EUGEN27771 Well-Known Member

    Регистрация:
    23 апр 2010
    Сообщения:
    2.225
    Симпатии:
    1.889
    Пол:
    Мужской
    @@Michael, Есть несколько скриптов,пока для эксперимента.
    Один устанавливает тональность и лад для всех выделенных МИДИ-айтемов по первому айтему(образцу).То есть,устанавливаем вручную для первого айтем(в первом открывшемся после запуска скрипта МИДИ-эдиторе),а для остальных те же данные устанавливаются автоматически сразу после закрытия окна МИДИ-эдитора.
    PHP:
     //=6=For Restore MIDI-Item(ONLY) Selection After Processing==//       
    function Restore_Item_Selection()
    (
    0;loop(Midi,SetMediaItemSelected(Sel_Item_ID[n],1);+= 1;);
    UpdateArrange();//Update After All Processing
    );

    //=5=Set_Root_and_Scale For EACH MIDI-ITEM==//
    function Set_Root_and_Scale() // For EACH MIDI-ITEM

    Main_OnCommand(401530); // MAIN section action "open selected item in MIDI editor"
    ME MIDIEditor_GetActive();//Get Active MIDI Editor
    Take MIDIEditor_GetTake(ME);//Get opened in ME Take
    MIDI_GetScale(Take,rootOut,scaleOut#name) != 1 ? MIDIEditor_OnCommand(ME, 40757);//forcibly ativate Scale!!!
       //===Set Root===//
      
    Loop(12,
            
    CurRoot MIDIEditor_GetSetting_int(ME"scale_root");//scale_root: returns 0-12 (0=C)
            
    CurRoot != User_Root MIDIEditor_OnCommand(ME40764);//set root
           
    );
       
    //===Set Scale===//   
      
    Loop(15,
            
    MIDIEditor_GetSetting_str(ME"scale"#CurScale);//scale: returns the scale,ex. "102034050607" for a major
            
    stricmp(#CurScale,#User_Scale) != 0 ? MIDIEditor_OnCommand(ME, 40757);//set scale
           
    );
    MIDIEditor_OnCommand(ME2); // ME action: "Close M-Editor"
    Take == GetActiveTake(Sel_Item_ID[Midi-1]) ? Restore_Item_Selection();//Restore MIDI-Selection After last item been processed!!!
    );
        
    //=4=function "All_Scale_Root()" call func "Set_Root_and_Scale()" For EACH sel MIDI-ITEM,except 1-st==//
    function All_Scale_Root()
    (
    1;loop(Midi-1,SelectAllMediaItems(0,0);SetMediaItemSelected(Sel_Item_ID[n],1);//Select n-item by ID
               
    Set_Root_and_Scale();//Call func "Set_Root_and_Scale()"
               
    += 1;);
    );

    //=3=function GET "User Scale-Root" for 1-st ITEM!!!==//
    //====================================================//
    function User_Data()//Scale & Root Note in 1-st MIDI-Editor setting
    (
    ME MIDIEditor_GetActive();//Get Active MIDI Editor
    ME ?
        (
    User_Root MIDIEditor_GetSetting_int(ME"scale_root"); //scale_root: returns 0-12 (0=C)
         
    MIDIEditor_GetSetting_str(ME"scale"#User_Scale);     //scale: returns the scale = #User_Scale
         
    defer("User_Data();")) :
                                 (
    Act_Scale MIDI_GetScale(GetActiveTake(Sel_Item_ID[0]),rootOut,scaleOut#name);
                                   
    (Act_Scale && Midi-1) > 0  ?  All_Scale_Root(); //Call func "All_Scale_Root()",IF ME been closed
                                 
    );
    );  
    //========================================================================//
    //=1=save MIDI-Items ONLY ID-s to Array==//
    Count_Sel_Items CountSelectedMediaItems(0);//All selected,Audio and MIDI
      
    All 0;Midi 0;//indexes for loop;all=Audio+MIDI,Midi=MIDI-Items ONLY!!!
      
    loop(Count_Sel_Items,
           
    Cur_Item_ID GetSelectedMediaItem(0,All);
           
    Is_MIDI TakeIsMIDIGetActiveTake(Cur_Item_ID) );
           
    Is_MIDI ? (Sel_Item_ID[Midi] = GetSelectedMediaItem(0,All);Midi+=1;);//Get sel midi-items IDs to Array "Sel_Item_ID[]"
           
    All += 1;
           );
    //Midi = count of selected MIDI-Items

    //=2=Open 1-st Item in ME for determining USER settings(Root and Scale)==//
    Midi ?  //if at least one MIDI-Item selected,then:
           
    (SelectAllMediaItems(0,0);SetMediaItemSelected(Sel_Item_ID[0],1);//Select ONLY First MIDI-item by ID
            
    Main_OnCommand(401530); // MAIN section action "open selected item in MIDI editor"
            
    User_Data(););

    Main_OnCommand(403450);//All-Notes-Off
    Другие-транспонируют все выделенные МИДИ-айтемы(или выделение,если есть) на ступень выше-ниже(в примере +1 ступень)
    PHP:
    Undo_BeginBlock();
    //=================
    GetSet_LoopTimeRange(Sel_Set,Sel_Loop,Sel_start,Sel_end,Sel_autoseek);
    Sel_end Sel_start &&  CountSelectedMediaItems(0) )  ?
      
    Main_OnCommand(400610);//Split At Selection
    //=================

    //==1==save MIDI-Items ONLY ID-s to Array====//
    Count_Sel_Items CountSelectedMediaItems(0);//All selected,Audio and MIDI
      
    All 0;Midi 0;//indexes for loop;all=Audio+MIDI,Midi=MIDI-Items ONLY!!!
      
    loop(Count_Sel_Items,
           
    Cur_Item_ID GetSelectedMediaItem(0,All);
           
    Is_MIDI TakeIsMIDIGetActiveTake(Cur_Item_ID) );
           
    Is_MIDI ? (Sel_Item_ID[Midi] = GetSelectedMediaItem(0,All);Midi+=1;);//Get sel midi-items IDs to Array "Sel_Item_ID[]"
           
    All += 1;
           );
    //Midi = count of selected MIDI-Items

    //==2==Transpose ALL MIDI-Items==//
    Midi ?
    (
    n=0;
    loop(Midi,
              
    SelectAllMediaItems(0,0);SetMediaItemSelected(Sel_Item_ID[n],1);//Select n-MIDI-item by ID
              
    Main_OnCommand(401530); // MAIN section action "open selected item in MIDI editor"
              
    ME MIDIEditor_GetActive();//Get Active MIDI Editor
                          
         
    MIDIEditor_OnCommand(ME40006); // ME action: "Sel all Events"
         
    MIDIEditor_OnCommand(ME40177);//Up Notes +1 scale step
         
    Main_OnCommand(403450);//All-Notes-Off
         
    MIDIEditor_OnCommand(ME2); // ME action: "Close MEditor"
         
    n+=1;  
         );  
    );

    //==3==Restore MIDI-Items selection==3==//
    (0;loop(Midi,SetMediaItemSelected(Sel_Item_ID[n],1);+= 1;););

       
    Undo_EndBlock("~Smart-Transpoze~"0); //Undo
    Main_OnCommand(403450);//All-Notes-Off
    UpdateArrange();
    Таким образом,можно легко менять аккорды в композиции без массы лишних действий на всех МИДИ-дорожках сразу парой щелчков.
    При выполнении скриптов много раза открывается- закрывается миди-эдитор(в зависимости от кол-ва выделенных айтемов),другого простого способа установить тональность,лад и транспонировать ноты по ступеням я не нашел.
    Хотел избавиться от этого эффекта мигания,чисто для эстетики,сейчас понял,что PreventUIRefresh тут вряд ли поможет.Есть ли еще варианты?
     
  48. @Michael

    @Michael Well-Known Member

    Регистрация:
    14 дек 2010
    Сообщения:
    761
    Симпатии:
    1.158
    Пол:
    Мужской
    Адрес:
    Орёл / Москва
    EUGEN27771 нравится это.
  49. EUGEN27771

    EUGEN27771 Well-Known Member

    Регистрация:
    23 апр 2010
    Сообщения:
    2.225
    Симпатии:
    1.889
    Пол:
    Мужской
    Не понял,по поводу mouse modifiers.
     
  50. @Michael

    @Michael Well-Known Member

    Регистрация:
    14 дек 2010
    Сообщения:
    761
    Симпатии:
    1.158
    Пол:
    Мужской
    Адрес:
    Орёл / Москва
    Ими же можно транспонировать айтемы, или это не подходит?
     

Поделиться этой страницей