ReaScripts (скрипты для Reaper) - Учимся создавать!!!

Тема в разделе "Reaper", создана пользователем Archchie, 29 дек 2017.

  1. Archchie

    Archchie Active Member

    Регистрация:
    24 окт 2017
    Сообщения:
    352
    Симпатии:
    175
    Пол:
    Мужской
    Вот на этот вопрос я затрудняюсь ответить! :)

    Просто натыкался как то уже на это
     
    Последнее редактирование: 3 май 2018
    incubator нравится это.
  2. Archchie

    Archchie Active Member

    Регистрация:
    24 окт 2017
    Сообщения:
    352
    Симпатии:
    175
    Пол:
    Мужской
    @incubator,
    Перебирайте чужие скрипты(выдергивайте какую нибудь функцию и разбирайтесь как она сделана-устроена),
    Изучайте функции API и понимание потихоньку начнет приходить .
    Задавайте вопросы! Слава богу есть хоть здесь Знающие, Отзывчивые люди-которые отвечают на них (подсказывают что да как)
    Главное не бросить на первой неудачной попытке,а такой момент у вас еще настанет(и не раз) !!!
     
    Последнее редактирование: 13 фев 2018
  3. incubator

    incubator Active Member

    Регистрация:
    24 янв 2007
    Сообщения:
    363
    Симпатии:
    143
    Адрес:
    Spb
    @Archchie, Да так именно и делую копаю самые интересные скрипты разбираю по кусокам модифицирую перпарирую, дело очень интересное.Потому что описание API очень скудное и все способом проб и ошибок приходиться делать. И главное у меня много идей прикладных которые хочу осуществить, так что пока не собираюсь бросать) Спасибо вам и Александру за ответы)
     
    Archchie нравится это.
  4. Archchie

    Archchie Active Member

    Регистрация:
    24 окт 2017
    Сообщения:
    352
    Симпатии:
    175
    Пол:
    Мужской
    Не могу найти функции в API, Скрыть или удалить Envvelope Track .
    Подскажите пожалуйста !
    Есть ли они вообще ?
     
  5. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    16.914
    Симпатии:
    9.168
    Пол:
    Мужской
    Адрес:
    Киев
    Удалить нет и быть не может, а скрыть конечно есть - ищи в Set Envelope - и там чего то с атрибутами
     
  6. incubator

    incubator Active Member

    Регистрация:
    24 янв 2007
    Сообщения:
    363
    Симпатии:
    143
    Адрес:
    Spb
    @Archchie, Не эта случайно? reaper.SetEnvelopeStateChunk Sets the RPPXML state of an envelope, returns true if successful. Undo flag is a performance/caching hint.
     
  7. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    16.914
    Симпатии:
    9.168
    Пол:
    Мужской
    Адрес:
    Киев
    @incubator, нет, это сложно, это через чанки.
    Там есть прямое задание видимости кривой
     
  8. Kokarev Maxim

    Kokarev Maxim ex cool

    Регистрация:
    13 май 2007
    Сообщения:
    3.975
    Симпатии:
    2.402
    Пол:
    Мужской
    Род занятий:
    freelance, mixing
    Адрес:
    Барнаул
    @incubator, спасибо за скрипт! Очень удобно работать с ним :) Но мне пришлось доработать его немного. У команды _XENAKIOS_TSADEL есть одна проблема - пока висит выделение области в аранж вью, он иногда не позволяет удалять айтемы. А вот если выделение снять, то всё работает как надо. Иногда это мешает и дизориентирует (почему жму del а айтем не удаляется?), приходится делать лишний клик, чтобы снять выделение области.
    Я попробовал разные варианты и здесь отлично сработала команда cut (41384). Да, я понимаю, что буфер будет засираться, но я не представляю ситуации, когда мне после команды Del нужно будет нажимать Ctrl+V :) По крайней мере, пока дающий сбои Delete доставляет проблем больше, чем возможные глюки в буфере.
    Возможно, найдётся более элегантное решение, но пока так оставил. Всё в доработанном коде от Александра выглядит вот так:


    Код:
    isSet = reaper.GetSet_LoopTimeRange( 0, 0, 0, 0, 0 ) --  Берём переменную "Time selection"
    focus = reaper.GetCursorContext() --  Берём переменную значения где сейчас фокус?
    
    if isSet == 0 then
      reaper.Main_OnCommand(40697, 0)
    else
      if focus == 1 then
        reaper.Main_OnCommand(reaper.NamedCommandLookup('41384'), 0)
      elseif focus == 2 then
    
        reaper.Main_OnCommand(40089, 0)
    
      end
    end
     
    incubator нравится это.
  9. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    16.914
    Симпатии:
    9.168
    Пол:
    Мужской
    Адрес:
    Киев
    @Kokarev Maxim, нельзя Cut использовать если сразу не освободить буфер.
     
    Kokarev Maxim нравится это.
  10. incubator

    incubator Active Member

    Регистрация:
    24 янв 2007
    Сообщения:
    363
    Симпатии:
    143
    Адрес:
    Spb
    @Kokarev Maxim,
    Спасибо за отзыв) Я то делал под свою кофигурацию а у меня Time selection не может существовать отдельно от выделеного айтема.Под Аблетон конфиг и поэтому я даже не мог предположить такое неудобство) Ну если так удобно пусть будет так. Есть идея перемещаться вдаль проекта и копировать или вырезать пустоту потому что другого способа и каких то подходящих команд я не нашел.Могу предположить что стирание больших объемов данных может проходить медленнее.
    Ну вот и ты Максим начал дорабатывать и оптимизировать скрипты.Это первый шаг к программированию.Главное не увлекайся ЭТО ЗАТЯГИВАЕТ, я начал с "Delete" а теперь читаю уже записываю *.ini рипера через скрипты.А завтра что?От меня музыки ждут я тут IF ELSEы местами пререставляю Рипер зло!!!
     
    Kokarev Maxim нравится это.
  11. Kokarev Maxim

    Kokarev Maxim ex cool

    Регистрация:
    13 май 2007
    Сообщения:
    3.975
    Симпатии:
    2.402
    Пол:
    Мужской
    Род занятий:
    freelance, mixing
    Адрес:
    Барнаул
    а чем чревато? Я некоторое время пользовался - ничего не заметил необычного. Так то я рад бы очищать буфер, но экшенов для этого не нашёл.
     
  12. incubator

    incubator Active Member

    Регистрация:
    24 янв 2007
    Сообщения:
    363
    Симпатии:
    143
    Адрес:
    Spb
    Я опять с вопросом который не смог решить сам! Пытался воссоздать код spk77 который в eel только в Lua что бы курсор перемещался на начало нот или аккордов Вот что вышло с горем пополам.
    Код:
    function Msg(param)
    reaper.ShowConsoleMsg(tostring(param).."\n")
    end
    
    function move_to_next_note()
      local take = reaper.MIDIEditor_GetTake(reaper.MIDIEditor_GetActive())  ---Берем активный миди редактор
      if take == nil then
        return
      end
      local retval, notecntOut, ccevtcntOut, textsyxevtcntOut = reaper.MIDI_CountEvts(take)--- считаем ноты
      local curpos = reaper.GetCursorPosition()  ---- Берем позицию курсора
      for i = 1, notecntOut do --- Запускаем цикл
        local retval, selectedOut, mutedOut, startppqposOut, endppqposOut, chanOut, pitchOut, velOut = reaper.MIDI_GetNote(take,i-1) ---Следующая нота
        local note_position = reaper.MIDI_GetProjTimeFromPPQPos(take, startppqposOut) --- конвертим в значение
        if note_position > curpos then
          reaper.SetEditCurPos(note_position, 1, 1)   ----Ставим курсор на следующую ноту
          break
        end
      end
    end
    
    reaper.defer(move_to_next_note) -- заглушка
    
    Но вот как заставить код считать с конца? То есть если курсор стоит в конце миди партии и нужно двигаться набоборот к началу?
     
  13. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    16.914
    Симпатии:
    9.168
    Пол:
    Мужской
    Адрес:
    Киев
    @Alex_V, тут где-то давал примеры обратного лупа - поищите
     
    incubator нравится это.
  14. Chrigel

    Chrigel New Member

    Регистрация:
    5 мар 2018
    Сообщения:
    15
    Симпатии:
    1
    Александр, подскажите пожалуйста. Никак у меня не получается воспроизвести посредством lua-скрипта экшн (Track: Toggle track volume envelope visible).
    Хочу попытаться показать\скрыть все стандартные энвелопы для трека: volume, pan, width, volume (Pre-FX), pan (Pre-FX), width (Pre-FX), trim volume, mute.
    Попробовал вот так, для выбранного трека:
    Код:
    if reaper.CountSelectedTracks() > 0 then
    for i = 0, reaper.CountSelectedTracks(0)-1 do
       local tr = reaper.GetSelectedTrack(0,i)
       if tr then
         local env_count = reaper.CountTrackEnvelopes(tr)
         for z = 0, env_count-1 do  
           local tr_env = reaper.GetTrackEnvelope(tr,z)
           if tr_env then
            local br_env = reaper.BR_EnvAlloc(tr_env, false)
            local active, visible, armed, inLane, laneHeight, defaultShape, minValue, maxValue, centerValue, type, faderScaling = reaper.BR_EnvGetProperties(br_env, true, true, true, true, 0, 0, 0, 0, 0, 0, true)
            if visible == false then
             reaper.BR_EnvSetProperties(br_env, active, true, armed, inLane, laneHeight, defaultShape, faderScaling)
            end
            reaper.BR_EnvFree( br_env, true )           
           end
         end
       end
    end
    end
    но когда трек только добавлен (новый), ничего не показывается. Я так подозреваю, что в данном случае
    CountTrackEnvelopes = 0. Тогда как заставить их показаться принудительно?
     
  15. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    16.914
    Симпатии:
    9.168
    Пол:
    Мужской
    Адрес:
    Киев
    Брать Кривую по имени и показывать её.
    Вот только если на кривой нет ни одной точки - и она вами принудительно не активирована - вы её и не покажите не как, так как она будет NIL
     
    Последнее редактирование: 12 мар 2018
  16. Chrigel

    Chrigel New Member

    Регистрация:
    5 мар 2018
    Сообщения:
    15
    Симпатии:
    1
    Понятно, то есть если не активирована скриптом не показать. Тогда получается экшн (Track: Toggle track volume envelope visible) на уровне кода программы работает, так?
     
  17. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    16.914
    Симпатии:
    9.168
    Пол:
    Мужской
    Адрес:
    Киев
    @Chrigel, честно говоря я не сильно копался. Как-то наверняка и скриптом можно это сделать. Будет время - покопаюсь.
    Но можно и по простому - использовать эти вот Экшины - по сути это програмный код.
     
    Последнее редактирование: 12 мар 2018
  18. EUGEN27771

    EUGEN27771 Well-Known Member

    Регистрация:
    23 апр 2010
    Сообщения:
    2.321
    Симпатии:
    1.963
    Пол:
    Мужской
    Упоминалось в этой теме про стандартные элементы Gui, контейнеры и прочее.
    Плюс к этому, в какой-то момент стало неудобно делать некоторые вещи на "одном слое".
    Короче, пришлось проанализировать ситуацию. Завис на месяц, даже больше.
    Почти все варианты, которые я просмотрел основаны на событийной модели.
    События, Обработчики Событий. Иерархия.
    Я просмотрел довольно много, разные реализации, разные языки.
    Какие выводы? НЕ УПРОЩАЕТ, А УСЛОЖНЯЕТ СИТУАЦИЮ - для нашего случая - это главное.
    Почему усложняет? Детальнее - порядок и параметры отрисовки, порядок обработки событий - все требует иерархии.
    Короче, вот окончательный общий вывод.
    Универсальный подход невозможен - как ни крути. Одноразовый подход непродуктивен - бесполезная работа.
    С ОДНОЙ СТОРОНЫ - Попытки сделать Элемент максимально настраиваемым приводят к тому, что появляется множество дополнительных свойств и методов.
    1)Усложняется код и теряется удобство использования.
    2)При этом - большая часть свойств и методов использоваться НЕ БУДЕТ. То есть - практически это мертвый груз, плюс ущерб простоте!
    3)НА ПРАКТИКЕ всплывает главный недостаток - проще написать новый Элемент с набором свойств и методов под конкретную задачу.
    С ДРУГОЙ СТОРОНЫ - Писать с нуля под конкретную задачу - непродуктивно.
    1)В большинстве случаев используются стандартные Элементы, плюс/минус некоторые модификации.
    2)Многие ф-и, решения, механизмы работы и прочее продуманы, проверены на практике и вполне универсальны.
    В качестве примеров, в которых иерархия не реализована, но есть попытки, я смотрел несколько библиотек для Рипера конкретно.
    Кто ими воспользовался? Я не вижу...
    Я вижу Swipe, где автор сделал все достаточно просто. И этот же автор попытался сделать иерархию, и забросил в итоге, а он профи.
    =========
    Забыл один момент. AU, VST фреймворки туда же. И этот Лемур посмотрел в последнюю очередь. Там нет нормальной Иерархии - парент для координат - без толку.
    =========
    "Обработчики" у меня были в первейших версиях, в Lua все проще - за пять сек сделать
    таблицу с обработчиками по порядку, коллекцию.
    Я забыл, что все тесты на EEL, так нужно, но это не меняет ситуацию.
    Ладно, за этот период я получил так много инфы, что мозг не успевает
     
    Последнее редактирование: 15 мар 2018
    Aleksandr Oleynik нравится это.
  19. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    16.914
    Симпатии:
    9.168
    Пол:
    Мужской
    Адрес:
    Киев
    И тем ни менее - например я был бы очень доволен, если бы появились стандартные модули (внешние) -
    Фейдер, кнопка, кноб, чекбокс - хотя бы с атрибутам подобных элементов в Лемуре.
     
  20. EUGEN27771

    EUGEN27771 Well-Known Member

    Регистрация:
    23 апр 2010
    Сообщения:
    2.321
    Симпатии:
    1.963
    Пол:
    Мужской
    @Aleksandr Oleynik, я именно это и хочу реализовать, это же моя старая навязчивая идея, к которой время от времени возвращаюсь;) Конечно, гораздо проще, даже чем в Лемур, но именно в виде конструктора-редактора, по принципу - добавил-расставил-настроил элементы и сохранил в виде готового GUI, который можно будет настраивать дальше по визуальной части и можно будет с легкостью привязать к функциональной части.
    Я даже делал рабочие варианты и на EEL, и на Lua, правда на уровне ниже детского сада, но сама задумка давно проверена и все прекрасно работает-настраивается-сохраняется-пересохраняется
    Нет абсолютно никаких причин, мешающих довести все это хотя бы до минимально вменяемого варианта.
    Если бы только Lua и только скрипты - что-то приемлемое сделал бы давно, там проще.
    Но тогда теряются не только EEL скрипты, которые иногда просто необходимы, а еще и JS-плагины.
    А у меня есть очень забавная штука по JS, правда в зачаточном состоянии, вроде бы я Вам показывал частично, точно не помню.
    К JSFX подключается модуль, который парсит данные родных JS-слайдеров и дублирует их кастомными с идентичными параметрами - idx, defval, minval, maxval, label. Короче, технически - JS просто читает сам себя как текст;), читает свои же слайдеры, а на основе этих данных создает и запускает код для GUI.
    Сам JS при этом продолжает функционировать в обычном режиме.
    В качестве пространств имен("объектов") используются сами названия слайдеров slider1 - slider64 - прямо туда и складируются все необходимые свойства, например, получается что-то типа slider1.x, slider1.y, slider1.w, slider1.h и тп. Это еще и пару вещей упрощает.
    Обходим невозможность динамического создания переменных в JS, имена слайдеров всегда известны, доступны и свободны(никто ж до такого изврата не додумался:)).
    Полученные кастомные слайдеры в перспективе можно редактировать, менять на другие элементы, например, на кнобы, кнопки, меню, использовать png-картинки и т.п. Созданный GUI никак не влияет на исходный функционал JS-плагина, не влияет на производительность. При этом кастомные элементы поддерживают все функции и параметры родных слайдеров и автоматизацию(я смотрю, многие авторы jsfx почему-то на автоматизацию забивают).
    Проверен сам механизм. Конечно, можно сделать все эти манипуляции и со стороны скрипта вычитав эффект, можно даже Lua использовать, надо прикинуть.
    Все очень просто, но идея, мне кажется, интересная.
     
  21. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    16.914
    Симпатии:
    9.168
    Пол:
    Мужской
    Адрес:
    Киев
    @EUGEN27771, так в любом же случаи модули будешь делать...., так начни с них - многие с удовольствием и просто модули будут использовать
     
  22. EUGEN27771

    EUGEN27771 Well-Known Member

    Регистрация:
    23 апр 2010
    Сообщения:
    2.321
    Симпатии:
    1.963
    Пол:
    Мужской
    Вы думаете, я забросил идею, когда последнее сообщение написал и начал делать? Не ... я начал делать все наоборот.
    В первую очередь нужно было убрать разницу между EEL и Lua. Основной момент - это динамические переменные.
    На самом деле, никаких динамических переменных не существует, конечно. По-любому операции с памятью malloc(), realloc(), free()
    В EEL нам просто резервируют кусок памяти, который можно использовать как один большой массив. Это неудобно, но быстро.
    Получается, что у нас нет даже элементарных возможностей. Но на деле все решается - можно рассматривать выделенную память иначе!
    И уже к ней применять malloc(), realloc(), free() и тп. Короче, нужен был менеджер памяти.
    1) я получил массивы. Настоящие массивы, память выделяется автоматически, не нужно думать о перекрытиях и тп.
    2) динамические массивы, благодаря realloc().
    3) ассоциативные массивы - немного информации по хешированию и в итоге, аналог таблиц.
    Самое важное - в статических и динамических массивах не теряется ни капли скорости доступа, это чистейший джекпот!
     
  23. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    16.914
    Симпатии:
    9.168
    Пол:
    Мужской
    Адрес:
    Киев
    В общем в LUA мы тебя больше не увидим?
    Тебе осталось научить EEL и LUA загружать модули друг друга - и тогда полный сатисфэкшин - то что нужно быстро - модуль в EEL, а то что функционально - в LUA.
     
  24. EUGEN27771

    EUGEN27771 Well-Known Member

    Регистрация:
    23 апр 2010
    Сообщения:
    2.321
    Симпатии:
    1.963
    Пол:
    Мужской
    Почему же, каждому свое.
    ================
    Тест - кручу массив, пишу значения в таблицу. Потом читаю из таблицы и сравниваю с массивом.
    Вот что происходит в памяти
    Memory1.gif
     
    Последнее редактирование: 31 мар 2018
  25. EUGEN27771

    EUGEN27771 Well-Known Member

    Регистрация:
    23 апр 2010
    Сообщения:
    2.321
    Симпатии:
    1.963
    Пол:
    Мужской
    Это хеширование и прямая адрессация. Метод цепочек тоже не проблема.
    Я чувствую, что это очень круто. Шутка
     
    Aleksandr Oleynik нравится это.
  26. Rsay

    Rsay New Member

    Регистрация:
    27 окт 2017
    Сообщения:
    24
    Симпатии:
    2
    Пол:
    Мужской
    Ребята, есть ли возможность (при поможи какой-то функции) как-то остановить или выйти из defer()?
     
  27. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    16.914
    Симпатии:
    9.168
    Пол:
    Мужской
    Адрес:
    Киев
    @Rsay, условие выхода написать.
     
  28. Rsay

    Rsay New Member

    Регистрация:
    27 окт 2017
    Сообщения:
    24
    Симпатии:
    2
    Пол:
    Мужской
    @Aleksandr Oleynik, можете пожалуйста пример кода показать? я не понимаю по какой команде он завершается....

    Методом тыка пока дошел до такого, но пока рано не все гладко:
    У меня есть графический интерфейс - СКРИПТ, который reaper.defer(СКРИПТ) крутит по кругу и по нажатию на ESC запускается gfx.quit() и reaper.atexit(СКРИПТ)... Окно закрывается. но скрипт продолжает выполнятся...
     
  29. @Michael

    @Michael Well-Known Member

    Регистрация:
    14 дек 2010
    Сообщения:
    840
    Симпатии:
    1.266
    Пол:
    Мужской
    Адрес:
    Орёл / Москва
    Код:
    if gfx.getchar() >= 0 and gfx.getchar() ~= 27 then reaper.defer(СКРИПТ) else reaper.atexit(gfx.quit) end 
     
    Aleksandr Oleynik нравится это.
  30. Archchie

    Archchie Active Member

    Регистрация:
    24 окт 2017
    Сообщения:
    352
    Симпатии:
    175
    Пол:
    Мужской
    Подскажите есть ли возможность заставить defer() работать медленнее ?
    Например: Отработал defer один цикл ,подождал 1 или 2 сек. пошёл на второй круг и т.д.
    Ну и не только дефер
    Есть ли в API что то типа экшена Action: Wait 1 second before next action так как экшен в скрипте не работает
     
    Последнее редактирование: 17 апр 2018
  31. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    16.914
    Симпатии:
    9.168
    Пол:
    Мужской
    Адрес:
    Киев
  32. Archchie

    Archchie Active Member

    Регистрация:
    24 окт 2017
    Сообщения:
    352
    Симпатии:
    175
    Пол:
    Мужской
  33. Rsay

    Rsay New Member

    Регистрация:
    27 окт 2017
    Сообщения:
    24
    Симпатии:
    2
    Пол:
    Мужской
    @Archchie, как вариант
    forum.cockos.com/archive/index.php/t-168270.html
    но было бы неплохо узнать есть ли удобнее)
     
    Archchie нравится это.
  34. Archchie

    Archchie Active Member

    Регистрация:
    24 окт 2017
    Сообщения:
    352
    Симпатии:
    175
    Пол:
    Мужской
    @Rsay, Спасибо!
     
  35. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    16.914
    Симпатии:
    9.168
    Пол:
    Мужской
    Адрес:
    Киев
    Чуть позже напишу... на iPadе пока
     
  36. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    16.914
    Симпатии:
    9.168
    Пол:
    Мужской
    Адрес:
    Киев
    PHP:
    defer_rate 1

    cycle 
    0
    function mainloop ()
      
    cycle cycle+1
      
    if cycle == defer_rate then
        main
    ()
        
    cycle 0
      end

      
    if TEST_Env then
        char 
    gfx.getchar()
        if 
    char~=-1 then reaper.defer(mainloopend --defer
        gfx
    .update() -- Update gfx window
      
    else
        
    reaper.defer(mainloop)
      
    end
    end
     
    Archchie нравится это.
  37. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    16.914
    Симпатии:
    9.168
    Пол:
    Мужской
    Адрес:
    Киев
    Это вырванно из скрипта и не есть универсальной функцией, но смысл понятен -
    Дефер запускает по циклу промежуточную функцию - счетчик, и можно, задавая defer_rate, менять скорость перезапуска функции main()
     
  38. Rsay

    Rsay New Member

    Регистрация:
    27 окт 2017
    Сообщения:
    24
    Симпатии:
    2
    Пол:
    Мужской
    Спасибо, @@Michael, только он (дефер) все равно работает вроде...
    Я поставил консоль для теста: оно закрывается, а в консоли продолжают изменятся значения, даже если закрыть проект и открыть новый
     
    Последнее редактирование: 23 апр 2018
  39. Rsay

    Rsay New Member

    Регистрация:
    27 окт 2017
    Сообщения:
    24
    Симпатии:
    2
    Пол:
    Мужской
    Ребята, а можно как-то удалить точку автоматизации ссылаясь на ее номер?
    И еще как можно функционально узнать в каких единицах измеряется данный трек автоматизации (к примеру верхняя и нижняя точки)
     
    Последнее редактирование: 24 апр 2018
  40. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    16.914
    Симпатии:
    9.168
    Пол:
    Мужской
    Адрес:
    Киев
    Можно.
    Узнать её time и удалить по PointRange.
    А оно всегда от 0 до 1, на сколько помню.
     
  41. Rsay

    Rsay New Member

    Регистрация:
    27 окт 2017
    Сообщения:
    24
    Симпатии:
    2
    Пол:
    Мужской
    @Aleksandr Oleynik, ну это по времени, это я умею.. Мне нужно по номеру))

    Про автоматизацию, то я немного поколупался, нашел как узнать крайние значения и уже думал, что сделал то, что нужно, но набрел на кучу подводных камней, которые сложно контролировать:
    Там есть много вариантов от 0 до 1 это наверное только стандартные, а ля громкость и тп... И при том что соотношение редактируемых параметров другое: громкость в дБ, от бесконечности до 0 (смотря как в настройках), панораме тоже заморочки от 100Л до 100Р, и это все в коде регулируется от 0 до 1... Единственное что мьютирование легко реализируется=))

    В РеаконтролМИДИ уже другая систем - либо в тисячах либо как велосити от 0 до 127 (если в настройках РеаконтролМиди поменять), а если не поменять то будет тысячами как питч (из того же РеаконтролМиди)...

    Внешние плагины в зависимости от параметра автоматизируемой ручки
    Одним словом жуть...
     
  42. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    16.914
    Симпатии:
    9.168
    Пол:
    Мужской
    Адрес:
    Киев
    @Rsay, берете номер точки, узнаёте её время и дальше по времени.
     
  43. Rsay

    Rsay New Member

    Регистрация:
    27 окт 2017
    Сообщения:
    24
    Симпатии:
    2
    Пол:
    Мужской
    Привет, ребята! Можно как-то отследить уровень дБ на аудио айтеме?
    Задача удалить хвост (только хвост) когда он нижу определенного уровня (к примеру -24 дБ)
    Стандартный удалятель тишины не сильно подходит, т.к. он показывает оно, да и еще некоторые штучки есть
     
  44. x.com

    x.com И это тоже не я :)

    Регистрация:
    13 авг 2007
    Сообщения:
    957
    Симпатии:
    239
    Пол:
    Мужской
    Адрес:
    Приморский Край
    @Rsay, Первое что пришло в голову fade-in, fade-out. Когда приходит "ОНО", со своими ШТУЧКАМИ, я НИЖУ плинтуса сразу, трешхолдит не по децки (минус 24 дБ минимум).
     
  45. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    16.914
    Симпатии:
    9.168
    Пол:
    Мужской
    Адрес:
    Киев
    Можно, но задачка не из тривиальных.
    Женя мне делал Функцию, которая складывала точки в которых уровень сигнала в айтеме ниже заданного и выше заданного.
    Очень не просто её даже вычленить из моего скрипта для другой задачи.

    А так то -
    GetMediaItemTake_Peaks
    а дальше - мрак

    Вот часть кода формирующего таблицы -
    PHP:
    attThresh_dB = -65  -- уровень Wav кривой выше которого скрипт включает Fx OnOff
    relThresh_dB 
    = -60  -- уровень Wav кривой ниже которого скрипт выключает Fx OnOff

    function GetAudioItemTrigPoints(item)
      
    local take reaper.GetActiveTake(item)
      
    take reaper.GetActiveTake(item)
      if 
    not take then return {}   -- пока пустая таблица
      
    elseif reaper.TakeIsMIDI(takethen return GetMIDIItemTrigPoints(itemtake)
      
    end
      local item_start 
    reaper.GetMediaItemInfo_Value(item"D_POSITION")
      
    local item_len reaper.GetMediaItemInfo_Value(item"D_LENGTH")
      ------------------
      
    local starttimen_chansn_splswant_extra_typebufretval
      n_chans 
    1         -- GetPeaks only 1 channel now!!!
      
    n_spls math.ceil(item_len*peakrate) -- Noteits Peak Samples!
      
    want_extra_type -- get minmaxno spectral
      buf 
    reaper.new_array(n_spls n_chans 2) -- maxminonly for 1 channel
      buf
    .clear()         -- Clear buffer
      retval 
    reaper.GetMediaItemTake_Peaks(takepeakrateitem_startn_chansn_splswant_extra_typebuf)
      ------------------
      
    local attThresh  10^(attThresh_dB/20)
      
    local relThresh  10^(relThresh_dB/20)
      
    local trig_points = {}
      
    local last_trig false
      
    for 1n_spls do
        
    local max_peak math.max(math.abs(buf[i]), math.abs(buf[i+n_spls]))
        if 
    not last_trig and max_peak >= attThresh then
          trig_points
    [#trig_points+1] = {item_start + (i-1)/peakrate, true}; last_trig = true
        
    elseif last_trig and max_peak relThresh then
          trig_points
    [#trig_points+1] = {item_start + (i-1)/peakrate, false}; last_trig = false
        
    end
      end
      
    ------------------
      if 
    #trig_points > 0 then
        
    if trig_points[1][2] ~= false then  -- Start всегда falseначало айтема
          table
    .insert(trig_points1, {item_startfalse})
        
    end
        
    if trig_points[#trig_points][2] ~= false then  -- End всегда false, конец айтема
          
    table.insert(trig_points, {item_start item_lenfalse})
        
    end
      end
      
    ------------------
      return 
    trig_points
    end

    local items_trig 
    = {} -- Таблица тригточек для айтемов
      local item_cnt 
    reaper.CountTrackMediaItems(track)
      for 
    1item_cnt do
        
    local item reaper.GetTrackMediaItem(tracki-1)
        
    items_trig[i] = GetAudioItemTrigPoints(item)
      
    end

     
    Последнее редактирование: 4 май 2018
  46. incubator

    incubator Active Member

    Регистрация:
    24 янв 2007
    Сообщения:
    363
    Симпатии:
    143
    Адрес:
    Spb
    Подскажите пожалуйста как создать код что бы железно было без анду точки? Потому когда настройки такие

    [​IMG]

    он создает кучу точек. Код сделал как учили, но чего то не помогает
    Код стоит на клике мышкой

    Код:
    function click()
    reaper.PreventUIRefresh(1)
    
    reaper.Main_OnCommand(40635, 0) ---Time selection: Remove time selection
    
    reaper.Main_OnCommand(reaper.NamedCommandLookup('_SWS_UNSELALL'), 0) ----SWS: Unselect all items/tracks/env points
    
    
    reaper.Main_OnCommand(40513, 0)--View: Move edit cursor to mouse cursor
    
    reaper.PreventUIRefresh(-1)
    
    end
    
    reaper.defer(click)
     
  47. Archchie

    Archchie Active Member

    Регистрация:
    24 окт 2017
    Сообщения:
    352
    Симпатии:
    175
    Пол:
    Мужской
    @incubator,
    С одной Undo точкой
    PHP:
    function click()

        
    reaper.Undo_BeginBlock()
        
    reaper.PreventUIRefresh(1)

        
    reaper.Main_OnCommand(406350) ---Time selectionRemove time selection

        reaper
    .Main_OnCommand(reaper.NamedCommandLookup('_SWS_UNSELALL'), 0) ----SWSUnselect all items/tracks/env points

        reaper
    .Main_OnCommand(405130)--ViewMove edit cursor to mouse cursor

        reaper
    .PreventUIRefresh(-1)
        
    reaper.Undo_EndBlock("name_script",1)

    end
    click
    ()


    Без Undo точек: / Deselect All 'move play cursor under mouse cursor[no undo]
    PHP:


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


        
    reaper.GetSet_LoopTimeRange1000)

        
    local windowsegmentdetails reaper.BR_GetMouseCursorContext()
        
    local mouse reaper.BR_GetMouseCursorContext_Position()
        if 
    mouse 0 then
            reaper
    .SetEditCurPosmouse 0)
        
    end

        local count_track 
    reaper.CountTracks()
        if 
    count_track == 0 then
             no_undo
    ()
           return
        
    end


        reaper
    .PreventUIRefresh(1)

        for 
    1,count_track do

            
    local tr reaper.GetTrack(0,i-1)
            
    reaper.SetTrackSelectedtr)
      
            
    local count_tr_item reaper.CountTrackMediaItemstr )
            for 
    i2 1,count_tr_item do
                
    local tr_item reaper.GetTrackMediaItemtri2-)
                
    reaper.SetMediaItemSelectedtr_item)
            
    end
            local count_track_env 
    =  reaper.CountTrackEnvelopestr )
            for 
    i2 1,count_track_env do
                
    local track_env reaper.GetTrackEnvelopetr i2-)
                
    local count_Env_Point reaper.CountEnvelopePointstrack_env )
                for 
    i3 1,count_Env_Point do
                    
    reaper.SetEnvelopePointtrack_envi3-1____0)
                
    end
                local count_automat_item 
    reaper.CountAutomationItemstrack_env )
                for 
    i3 1,count_automat_item do
                    
    reaper.GetSetAutomationItemInfotrack_envi3-1'D_UISEL'0)
                
    end
            end
        end

        reaper
    .PreventUIRefresh(-1)
        
    reaper.UpdateArrange()
        
    no_undo()

     
    Последнее редактирование: 10 май 2018
  48. Rsay

    Rsay New Member

    Регистрация:
    27 окт 2017
    Сообщения:
    24
    Симпатии:
    2
    Пол:
    Мужской
    @Aleksandr Oleynik, спасибо, да, код еще тот=)) Попробую тогда обойти чем-то....
     
  49. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    16.914
    Симпатии:
    9.168
    Пол:
    Мужской
    Адрес:
    Киев
    Как можно обойти? Вам по сути нужен Гейт!
     
  50. Rsay

    Rsay New Member

    Регистрация:
    27 окт 2017
    Сообщения:
    24
    Симпатии:
    2
    Пол:
    Мужской
    @Aleksandr Oleynik, пришлось научится удалять лишнее в хвоте с помощью удалятеля тишины, но это пока так себе вариант, не во всех случаях что мне надо работает, да и окно выскакивает и настройки менять не особо можно
     

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