ReaScripts (скрипты для Reaper) - делимся

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

  1. convex

    convex без понтов

    Регистрация:
    25 фев 2011
    Сообщения:
    3.811
    Симпатии:
    3.229
    Род занятий:
    job
    Адрес:
    Красноярский край
    ну вот и пришла пора разобраться со скриптами. а все @EUGEN27771 виноват ))) спасибо, камрад! ребяты, если что, постучусь к кому-нибудь в личку ;)
     
  2. elektrozz

    elektrozz Active Member

    Регистрация:
    12 авг 2009
    Сообщения:
    310
    Симпатии:
    108
    Пол:
    Мужской
    Род занятий:
    Sound Prod
    как же я мечтаю о скрипте для перемотки заводских пресетов. было бы очень круто, кликать по клаве.
    спасибо за скрипт, заюзал.
    @EUGEN27771, спасибо Евгений за апдейт дэссера, очень ждал! теперь выглядит круто, удобно и визуально офигенно.
     
  3. convex

    convex без понтов

    Регистрация:
    25 фев 2011
    Сообщения:
    3.811
    Симпатии:
    3.229
    Род занятий:
    job
    Адрес:
    Красноярский край
    ребяты, остался у кого-нить скрипт как в мультике ЗДЕСЬ ? то, что скачал оттуда, совсем другое и управляторы не такие, видимо обновленная версия. а та простая и действенная. у меня так сейчас

    а.jpg

    кста, а зачем там еще три луа файла в архиве?
     
    Последнее редактирование: 11 апр 2016
    LilColt нравится это.
  4. Kotovitch

    Kotovitch Member

    Регистрация:
    5 апр 2016
    Сообщения:
    60
    Симпатии:
    18
    Пол:
    Мужской
    У меня нет, я недавно только новый скачал, минут за 10 разобрался, там можно всё сделать за несколько приемов. А Мультик тоже этот смотрел. Всё тоже неплохо получилось, вероятно, Разработчик, не зря всё поменял.
     
    Последнее редактирование: 11 апр 2016
  5. elektrozz

    elektrozz Active Member

    Регистрация:
    12 авг 2009
    Сообщения:
    310
    Симпатии:
    108
    Пол:
    Мужской
    Род занятий:
    Sound Prod

    Вложения:

    LilColt, Furqat, EUGEN27771 и ещё 1-му нравится это.
  6. EUGEN27771

    EUGEN27771 Well-Known Member

    Регистрация:
    23 апр 2010
    Сообщения:
    2.321
    Симпатии:
    1.963
    Пол:
    Мужской
    SampleEditor.lua
    По мере возможности будет допиливаться.
    Поддерживаются 16,24 - битные PCM и 32,64 - битные wav-файлы. Моно,стерео и многоканальные. В данный момент файл редактируется напрямую, поэтому, желательно сделать копию, если нет 100% уверенности, что оригинал больше не пригодится.
    Короткая инструкция:
    Выбрать айтем. Установить time selection на редактируемый участок. Если time selection больше,чем 100 мс, то только первые 100 мс учитываются.
    Левая кнопка мыши - редактирование волны.
    SE1.gif
    Правая кнопка мыши - Undo. Кол-во шагов отмены действий не ограничено.
    Колесо мыши - вертикальный Zoom.
    SE2.gif
    ============
    Скрипты для удаления пустоты из выделенных миди-айтемов
    Remove empty bars from selected MIDI items.lua - удаляет пустые такты.
    Remove empty bars from selected MIDI items (grid relative).lua - удаляет пустоту согласно текущей сетке проекта.
    Remove empty bars from selected MIDI items (regard CC).lua - удаляет пустые такты, но СС тоже учитываются.
    Remove empty bars from selected MIDI items (regard CC, grid relative).lua - удаляет пустоту согласно текущей сетке проекта, но СС тоже учитываются.
    remove empty bars.gif

    ============
    Старый, но очень полезный скрипт(eel)
    Open media item (type relative).eel
    Для миди-айтемов - открывает МИДИ-редактор с фиксированным зумом(по-умолчанию 4 такта, но можно изменить в начале скрипта) - как точка отсчета берется ближайший к курсору такт.
    Для аудио-айтемов - устанавливает зум по величине айтема.
    Удобно повесить на левый клик мыши по айтему.
    open item.gif

    ============
    Синхронное растягивание-сжатие(стретч) выделенных айтемов с учетом позиции.
    Stretch selected items positions and rate.lua
    На скрипт просто повесить шоткат. Любой.
    Зажимаете шоткат и тянете мышь.
    Саму мышь нажимать НЕ НУЖНО!
    Просто ведете указатель(курсор мыши) с зажатым шоткатом.
    Stretch.gif
    ============
    П.С. Собрал сюда еще некоторые разбросанные скрипты из других тем для порядка.
     
    Последнее редактирование: 24 май 2016
    YuriOl, AlexLazer, Alex_028 и 13 другим нравится это.
  7. lil-burn

    lil-burn Well-Known Member

    Регистрация:
    15 авг 2012
    Сообщения:
    903
    Симпатии:
    623
    Пол:
    Мужской
    Адрес:
    Екатеринбург
    Когда в айтеме много тейков:
    выбор тейка по названию и по номеру
    2 скрипта
    Select take by name and by number.gif
     
    Furqat нравится это.
  8. @Michael

    @Michael Well-Known Member

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

    Вложения:

    • test4.gif
      test4.gif
      Размер файла:
      560,1 КБ
      Просмотров:
      141
    Beckoff, diggidon, lil-burn и 6 другим нравится это.
  9. LilColt

    LilColt Well-Known Member

    Регистрация:
    28 ноя 2011
    Сообщения:
    1.252
    Симпатии:
    760
    Пол:
    Мужской
    Адрес:
    Маркс
    Пока не тыкнешь по кнопке скрипт не работает (при этом вылазиет Done!), правильно ли у меня всё установлено?
    Хотелось бы не тыкать каждый раз, бывает забывается :)
     
  10. Furqat

    Furqat Active Member

    Регистрация:
    27 окт 2012
    Сообщения:
    507
    Симпатии:
    197
    Пол:
    Мужской
    Род занятий:
    Keyboardist, composer, arranger
    Адрес:
    Tashkent
    Последнее редактирование: 15 май 2016
    LilColt нравится это.
  11. LilColt

    LilColt Well-Known Member

    Регистрация:
    28 ноя 2011
    Сообщения:
    1.252
    Симпатии:
    760
    Пол:
    Мужской
    Адрес:
    Маркс
    @Furqat, Извиняюсь, прогляделo_O
     
  12. Slick

    Slick IDDQD

    Регистрация:
    13 май 2008
    Сообщения:
    1.945
    Симпатии:
    859
    Род занятий:
    Аранжировщик, Саунд Дизайнер
    Адрес:
    Москва, Апрелевка
    @LilColt, можно запустить скрипт, а потом сохранить проект как темплейт. я сделал чтоб у меня новый проект запускался на основе темплейта. после этого уже все работает )
     
    LilColt нравится это.
  13. lil-burn

    lil-burn Well-Known Member

    Регистрация:
    15 авг 2012
    Сообщения:
    903
    Симпатии:
    623
    Пол:
    Мужской
    Адрес:
    Екатеринбург
    рендер айтемов выделенного трека.
    render sel track items - рендерит область выделенного трека от начала первого айтема до конца последнего (на гиф с первой секунды)
    render selected track items within time selection - то же самое, но в пределах тайм-селекшена (на гиф с 10 секунды)
    render sel track items.gif
     
    ALexandrik, JohnGrave, Andernik и 2 другим нравится это.
  14. lil-burn

    lil-burn Well-Known Member

    Регистрация:
    15 авг 2012
    Сообщения:
    903
    Симпатии:
    623
    Пол:
    Мужской
    Адрес:
    Екатеринбург
    удаление пустых треков (без айтемов)
    выделение пустых треков
    select and remove tracks with no items - 2 scripts.gif

    UPD
    добавил пару вариаций:
    выделение треков без айтемов, за исключением треков с сендами (и скрипт для их удаления)
    выделение треков без айтемов, за исключением треков с сендами и скрытых треков (и скрипт для их удаления)
    Сам буду чаще юзать последний вариант, т.к. в скрытых треках в основном висит только RetroRec, который удалять нельзя
     
    Последнее редактирование: 21 май 2016
    Nordum, stepperian, Broojacker и 3 другим нравится это.
  15. cguitleo

    cguitleo Member

    Регистрация:
    16 апр 2016
    Сообщения:
    39
    Симпатии:
    6
    Пол:
    Мужской
    Здравствуйте @Michael! Очени понравился ваш скрипт "Bypass all fx except instruments on all tracks", только проблема, почему то с Unbypass all fx on all tracks не работает. Возможно ли записать обратный "Unbypass all fx except instruments on all tracks"? Спасибо
     
  16. Dimson

    Dimson Active Member

    Регистрация:
    5 окт 2004
    Сообщения:
    659
    Симпатии:
    135
    Адрес:
    Днепродым
    @lil-burn, спасибо за скрипт по удалению пустых треков, но этот скрипт нужно ещё чуток допилить, он удаляет receive треки(шины с эффектами), заранее спасибо.
     
    Oliver_Cray нравится это.
  17. lil-burn

    lil-burn Well-Known Member

    Регистрация:
    15 авг 2012
    Сообщения:
    903
    Симпатии:
    623
    Пол:
    Мужской
    Адрес:
    Екатеринбург
    обновил все скрипты, связанные с выделением и удалением треков без айтемов (пофиксил один недочет), ссылки (в предыдущем посте) остались прежними
    + добавлены выделение и удаление треков без айтемов, эффектов, сендов, ресивов и "железных" выходов

    добавил скрипт - модифицированный вариант заводского экшена Remove tracks/items/envelope points (depending on focus). Основное изменение в том, что при удалении трека выделение не снимается (как по умолчанию), а выделяется следующий трек.

    перейти к следующему/предыдущему пользовательскому пресету эффекта с недавно измененными параметрами и дать треку назание пресета (если эффект - инструмент).
    go to next preset and rename track.gif

    Недавно заметил за собой часто повторяющуюся последовательность действий при подборе звука:
    допустим открыто окно vst-инструмента, нарулен звук и есть желание нарулить еще парочку похожих, для этого как минимум надо 1) найти трек, инструмент которого сейчас открыт и щелкнуть по нему 2) продублировать его, 3) вернуться к предыдущему и замьютить его (если на нем миди-партия) 4) вернуться к новому треку и выделить его, чтобы побренчать на миди-клаве 5) возможно, открыть окно инструмента (если не было открыто) и тд. В общем много лишних движений...
    А вот простой скрипт, и вот что он делает:
    easy duplicate and mute track.gif
     
    axis и Dimson нравится это.
  18. Dimson

    Dimson Active Member

    Регистрация:
    5 окт 2004
    Сообщения:
    659
    Симпатии:
    135
    Адрес:
    Днепродым
    @lil-burn, вот теперь, то, что нужно. Спасибо!
     
  19. elektrozz

    elektrozz Active Member

    Регистрация:
    12 авг 2009
    Сообщения:
    310
    Симпатии:
    108
    Пол:
    Мужской
    Род занятий:
    Sound Prod
    @@Michael, скрипт Duplicate selected notes стал глючить в последних версиях рипера, в чем может быть проблема?
    Происходит это только после записи с миди, а если просто кляцать в ручную ноты и дублировать, то все норм.
    ps. со smart duplicate тоже все норм.
    спасибо
     

    Вложения:

    • 2222.gif
      2222.gif
      Размер файла:
      2,2 МБ
      Просмотров:
      43
    Последнее редактирование: 26 май 2016
  20. lil-burn

    lil-burn Well-Known Member

    Регистрация:
    15 авг 2012
    Сообщения:
    903
    Симпатии:
    623
    Пол:
    Мужской
    Адрес:
    Екатеринбург
    @elektrozz, запиливал себе такой вариант дупликации ивентов
    duplicate notes.gif
    скрипт здесь
     
    Последнее редактирование: 26 май 2016
    Nordum и elektrozz нравится это.
  21. elektrozz

    elektrozz Active Member

    Регистрация:
    12 авг 2009
    Сообщения:
    310
    Симпатии:
    108
    Пол:
    Мужской
    Род занятий:
    Sound Prod
    @lil-burn, спасибо огромное, работает.
     
  22. lil-burn

    lil-burn Well-Known Member

    Регистрация:
    15 авг 2012
    Сообщения:
    903
    Симпатии:
    623
    Пол:
    Мужской
    Адрес:
    Екатеринбург
  23. EUGEN27771

    EUGEN27771 Well-Known Member

    Регистрация:
    23 апр 2010
    Сообщения:
    2.321
    Симпатии:
    1.963
    Пол:
    Мужской
    Обновил SampleEditor. Поменял алгоритм чтения-записи в файл.
    Теперь читаются и записывается только необходимые части файла. То есть, только два основных чанка(только чтение) и обрабатываемая часть(чтение-запись).
    Это экономит ресурсы, улучшает производительность и т.п. Вообще - это хорошо по очень многим причинам.
    Внешне пока ничего не изменилось.
    Если кто-то этим пользовался - можно что-либо добавить.
    Пока в мыслях кнопки Undo(вместо пкм), Redo и fade-in - fade-out.
    П.С. Вообще, это пока наиболее интересное(внутри), из того, что я делал. Конечно, есть куча аудио-редакторов и т.п., все есть, но это супер-интересно своими руками создать или отредактировать файл по байтам.
     
    Последнее редактирование: 27 май 2016
    Хитчер, Furqat, lil-burn и 5 другим нравится это.
  24. axis

    axis Well-Known Member

    Регистрация:
    18 апр 2005
    Сообщения:
    4.662
    Симпатии:
    3.151
    Пол:
    Мужской
    Род занятий:
    freelance
    Адрес:
    Kaniv, UA
    @EUGEN27771, классно, а можно еще подправить, чтобы не полоской а точкой рисовало при таком зуме? Все идеально, кроме этого, нмв.
     

    Вложения:

    • draw wav.gif
      draw wav.gif
      Размер файла:
      356,9 КБ
      Просмотров:
      79
  25. axis

    axis Well-Known Member

    Регистрация:
    18 апр 2005
    Сообщения:
    4.662
    Симпатии:
    3.151
    Пол:
    Мужской
    Род занятий:
    freelance
    Адрес:
    Kaniv, UA
    аа, понятно. Это винда как-то так отдает положение указателя, получается, что пропуски идут. Это разве что как-то интерполировать надо между позициями, но наверно гиморно.
     
  26. axis

    axis Well-Known Member

    Регистрация:
    18 апр 2005
    Сообщения:
    4.662
    Симпатии:
    3.151
    Пол:
    Мужской
    Род занятий:
    freelance
    Адрес:
    Kaniv, UA
    кнопка переключения DPI на мышке теперь пригодится ))
     
  27. lil-burn

    lil-burn Well-Known Member

    Регистрация:
    15 авг 2012
    Сообщения:
    903
    Симпатии:
    623
    Пол:
    Мужской
    Адрес:
    Екатеринбург
    Может быть интересно для тех, кто юзает Reasamplomatic

    Добавление сэмпла выделенного айтема в сэмплер Reasamplomatic (на новый трек)
    Демо:
    samplomate.gif
    Подготовка к работе:
    samplomate preparing.gif

    Samplomate preparing.lua
    Samplomate.lua

    файлы 0.wav 0.wav, 00.wav и 000.wav, скрипты, инструкция и гиф (8,5 мб) - Яндекс Диск
    либо на гитхабе

    1. помещаем файлы 0.wav 0.wav, 00.wav и 000.wav в любое удобное место.
    Важно! Все 3 файла должны быть в одной папке!
    2. В рипере добавляем новый трек (в этой инструкции назовем его Первый трек), навешиваем на него Reasamplomatic. Устанавливаем нужные параметры трека (например название, цвет, мониторинг и тд.) и параметры самого плагина Reasamplomatic.
    3. Загружаем в сэмплер Первого трека файл 0.wav
    4. Дублируем Первый трек 2 раза (таким образом всего получаем 3 трека с Reasamplomatic)
    5. Загружаем в сэмплеры каждого из продублированных треков файлы 00.wav и 000.wav соответственно
    6. Выделяем все три трека
    7. Запускаем скрипт Samplomate preparing.lua. По удачному завершению появится окно с текстом "Successful". Теперь можно в любое время в любом проекте использовать скрипт Samplomate.lua для добавления сэмпла выделенного айтема в семплер на новый трек в одно касание!

    Другие свежие скрипты:
    сохранить все проекты в качестве новых версий
    сохранить все несохраненные проекты (те, в которые были внесены изменения с момента последнего сохранения, англ dirty projects ) в качестве новых версий
    выделить треки с первого до выделенного
    выделить треки с выделенного до последнего
    выделить треки с первого до выделенного (кроме скрытых треков)
    выделить треки с выделенного до последнего (кроме скрытых треков)
     
    stepperian, Коля Ефремов и LilColt нравится это.
  28. lil-burn

    lil-burn Well-Known Member

    Регистрация:
    15 авг 2012
    Сообщения:
    903
    Симпатии:
    623
    Пол:
    Мужской
    Адрес:
    Екатеринбург
  29. SKlogic

    SKlogic Well-Known Member

    Регистрация:
    14 май 2006
    Сообщения:
    2.673
    Симпатии:
    739
    Адрес:
    Moscow
    вот в параллельной ветке был вопрос-как сделать так чтоб при питче сэмпла (айтема) он не стретчился а просто ресемплился.. тоесть опустил питч на -1 и он стал чуть длиннее..то есть по сути надо изменить рейт без стретча-- но вот рейт не привязан к нотам никак.. можно ли сделтать скрипт который это рейт по нотам двигал +-1 на пример?
     
  30. Slick

    Slick IDDQD

    Регистрация:
    13 май 2008
    Сообщения:
    1.945
    Симпатии:
    859
    Род занятий:
    Аранжировщик, Саунд Дизайнер
    Адрес:
    Москва, Апрелевка
    shift+5, Shift+6
     
    axis нравится это.
  31. lil-burn

    lil-burn Well-Known Member

    Регистрация:
    15 авг 2012
    Сообщения:
    903
    Симпатии:
    623
    Пол:
    Мужской
    Адрес:
    Екатеринбург
    Organize tracks
    ссылка на соседний топик
    как это работает:
    Organize tracks.gif
    редактируем список названий
    Organize tracks (editing).gif
    в данной версии скрипт:
    - требует SWS
    - чувствителен к регистру (Drums и drums - разные названия)


    ------------------------------------------------------------------------------------------------------
    применить параметры последнего задетого трека к тем же эффектам на выделенных треках
    гиф здесь
    _________________________________________________________
    UPD: Organize tracks 1.1
    добавлена нечувствительность к регистру
    Organize tracks 1.1.gif
    есть заготовленные треки с названиями 'drums', 'synth' и т.д. (нужные названия должны быть прописаны в скрипте через запятую). Закидываем треки drums_1. drums_2 - жмем скрипт - эти треки перемещаются в папку drums. Добавляем треки synth_lala, synth_abcd - жмем скрипт - эти треки перемещаются в папку synth и тд. Разумеется, можно закинуть сразу drums_1. drums_2, synth_lala, synth_abcd, а скрипт уже сам все сделает-раскидает.
    Не будет раскидывать в двух случаях:
    1) нет трека с соответствующим названием (то есть трек synth_lala останется на своем месте, если в проекте нет трека synth);
    2) трека нет в списке названий скрипта (см. гиф 2 о редактировании списка).
    Выделять ничего не надо - закинуть треки и жмякнуть скрипт
     
    Последнее редактирование: 17 июн 2016
    NuSound, Смарт Элло, stepperian и 2 другим нравится это.
  32. EUGEN27771

    EUGEN27771 Well-Known Member

    Регистрация:
    23 апр 2010
    Сообщения:
    2.321
    Симпатии:
    1.963
    Пол:
    Мужской
    Скрипт генерирует sine, triangle, saw, white noise, pink noise.
    ========
    Wave Generator Demo.gif
    ========
    Wave Generator.lua
    ========
    Правый клик - ввести значение вручную.
    Gain добавлен.
     
    Последнее редактирование: 24 июн 2016
    ALexandrik, Buyan, grin3333 и 14 другим нравится это.
  33. LilColt

    LilColt Well-Known Member

    Регистрация:
    28 ноя 2011
    Сообщения:
    1.252
    Симпатии:
    760
    Пол:
    Мужской
    Адрес:
    Маркс
    @EUGEN27771, Ну наконец-то удобный генератор!
    Спасибо, Евгений!
     
  34. Ivan_k26

    Ivan_k26 ''Life Under Music''

    Регистрация:
    18 июл 2007
    Сообщения:
    3.400
    Симпатии:
    3.911
    Пол:
    Мужской
    Адрес:
    Железногорск
    @EUGEN27771,
    Отличная работа! Классный скрипт! А можно добавить возможность установки уровня сигнала?
     
  35. @Michael

    @Michael Well-Known Member

    Регистрация:
    14 дек 2010
    Сообщения:
    840
    Симпатии:
    1.266
    Пол:
    Мужской
    Адрес:
    Орёл / Москва
    Чуть почистил тестовую зону. Залил в репозиторий (доступно в ReaPack):

    Randomize FX parameters
    1 rand.gif
    Generate CUE from markers
    2 cue.gif
    Toggle auto add last touched parameter to TCP
    3 auto add.gif
     
    Последнее редактирование: 21 июн 2016
    Elijah K, ALexandrik, elektrozz и 9 другим нравится это.
  36. SKlogic

    SKlogic Well-Known Member

    Регистрация:
    14 май 2006
    Сообщения:
    2.673
    Симпатии:
    739
    Адрес:
    Moscow
    @Michael, млин ты гений!
     
  37. SKlogic

    SKlogic Well-Known Member

    Регистрация:
    14 май 2006
    Сообщения:
    2.673
    Симпатии:
    739
    Адрес:
    Moscow
    а не встречали плагина, который бы в одном-делал транспозицию миди трека, а так же умел сдвигать его по таймингу вперед назад и регулировать велосити? а то приходится несколькими пользоваться.. а ткак было бы удобно в шаблоне сохранить и на tcp все вывести сразу
     
  38. Mateush1982

    Mateush1982 Active Member

    Регистрация:
    5 авг 2009
    Сообщения:
    401
    Симпатии:
    146
    Пол:
    Мужской
    Адрес:
    Krasnoyarskiy kray
    @@Michael, Randomize FX parameters При применении на Spire - рипер падает!!! кто может проверить, может у меня чего не так? Screen Shot 2016-06-22 at 13.48.42.png
     
  39. axis

    axis Well-Known Member

    Регистрация:
    18 апр 2005
    Сообщения:
    4.662
    Симпатии:
    3.151
    Пол:
    Мужской
    Род занятий:
    freelance
    Адрес:
    Kaniv, UA
    @SKlogic, MIDI Tool v2 (встроенный)может все вышеперечисленное, кроме сдвигов.
    Для сдвигов по времени предпочитаю и рекомендую все-таки аудио двигать с JS: Time adjustment delay в конце цепи эффектов. С двиганными нотами иногда сюрпризы бывают. Например, меняются местами автоматические Up/Down stroke в семплированных бас-гитарах, что не всегда нужно )
     
    SKlogic нравится это.
  40. @Michael

    @Michael Well-Known Member

    Регистрация:
    14 дек 2010
    Сообщения:
    840
    Симпатии:
    1.266
    Пол:
    Мужской
    Адрес:
    Орёл / Москва
    @Mateush1982 баг Reaper с памятью, я ограничил количество параметров до 200 первых (в Spire их 734), потом сделаю маску, чтобы выбирать параметры руками.
     
    Mateush1982 нравится это.
  41. EUGEN27771

    EUGEN27771 Well-Known Member

    Регистрация:
    23 апр 2010
    Сообщения:
    2.321
    Симпатии:
    1.963
    Пол:
    Мужской
    Скрипт сохраняет текущие настройки последнего редактируемого эффекта как новый пользовательский пресет
    Save VST Preset Demo.gif Save FX Preset Demo.gif
    ====
    Save_FX_Preset
    Поддерживаются VST и JS - эффекты.
     
    Последнее редактирование: 25 июн 2016
    ALexandrik, Buyan, Хитчер и 6 другим нравится это.
  42. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    16.914
    Симпатии:
    9.168
    Пол:
    Мужской
    Адрес:
    Киев
    Ура!!!! Допилил! Очень круто...
    Женя, а как с JSFX?
     
    Последнее редактирование: 24 июн 2016
  43. Oliver_Cray

    Oliver_Cray Well-Known Member

    Регистрация:
    29 окт 2014
    Сообщения:
    3.148
    Симпатии:
    2.613
    Пол:
    Мужской
    Адрес:
    Майкоп
    @EUGEN27771, а в чем PROFIT? Что не так с обычным сохранением пресетов?
     
  44. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    16.914
    Симпатии:
    9.168
    Пол:
    Мужской
    Адрес:
    Киев
    Женя скромничает!!!!!
    С обычным сохранением пресетов не так то, что его не возможно сделать внешней командой или экшином или скриптом - НИ КАК. Нет в API Рипера такой функции, не дали нам её разработчики.
    А Женя её написал.
    Она будет полезна больще тем, кто пишет комплексные скрипты в которых очень нужна подобная функция.
    Ну вот простой пример приведу -
    Вы отстраиваете какой-то типичный проект и вам нужно чтоб для каждой его новой версии в куче плагинах сразу, которые вы крутили при настройке, были сохранены Пресеты с этой версией проекта. А потом, чтоб их одной кнопкой вызвать все разом можно было (эту функцию, кстати дали разрабы).
    Те кто пишут скрипты знают, что сделать это можно через сохранение чанка треков - но там сохраняется всё подряд, а не то, что нужно.
    И я хорошо знаю какой объём работы Женя для этого проделал.....
     
    Oliver_Cray нравится это.
  45. selfdenial

    selfdenial New Member

    Регистрация:
    25 апр 2012
    Сообщения:
    2
    Симпатии:
    0
    Пол:
    Мужской
  46. EUGEN27771

    EUGEN27771 Well-Known Member

    Регистрация:
    23 апр 2010
    Сообщения:
    2.321
    Симпатии:
    1.963
    Пол:
    Мужской
    Рендер айтема до последнего VSTi(все, что после него перед рендером мьютируется, а потом восстанавливается).
    Render selected item as new take, up to last VSTi - рендерит, как новый тейк.
    Render selected item on new track, up to last VSTi - рендерит, на новый трек, делает посыл на оригинальный и убирает посыл на мастер трек.
    Первый вариант мне все равно кажется более полезным.
     
    Buyan, sve и LilColt нравится это.
  47. SKlogic

    SKlogic Well-Known Member

    Регистрация:
    14 май 2006
    Сообщения:
    2.673
    Симпатии:
    739
    Адрес:
    Moscow
    @EUGEN27771, ой спасибо! но вариант 2 круче))

    только уровень посыла нельзя принудительно в 0 сделать?
    у меня дефолтный -18
     
  48. SKlogic

    SKlogic Well-Known Member

    Регистрация:
    14 май 2006
    Сообщения:
    2.673
    Симпатии:
    739
    Адрес:
    Moscow
  49. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    16.914
    Симпатии:
    9.168
    Пол:
    Мужской
    Адрес:
    Киев
    Женя, я под свои нужды чуть переделал скрипт: теперь он сохраняет новый Пресет у любого, в данный момент открытого FX-а, даже если параметры его не трогали (как вариант может добавишь?) -
    PHP:
    --[[
       * 
    ReaScript NameSave_FX_Preset
       
    Lua script for Cockos REAPER
       
    AuthorEUGEN27771
       
    Author URIhttp://forum.cockos.com/member.php?u=50462
       
    LicenceGPL v3
       
    Version1.02
      
    ]]

      --------------------------------------------------------------------------------
      
    local msg = function(Mreaper.ShowConsoleMsg(tostring(M).."\n"end
      
    --------------------------------------------------------------------------------

    --------------------------------------------------------------------------------
    -- 
    Base64_to_Hex(modded from lua.org functions)  -------------------------------
    --------------------------------------------------------------------------------
    -- 
    decryption table --
    local base64bytes = {['A']=0, ['B']=1, ['C']=2, ['D']=3, ['E']=4, ['F']=5, ['G']=6, ['H']=7, ['I']=8, ['J']=9, ['K']=10,['L']=11,['M']=12,
                         [
    'N']=13,['O']=14,['P']=15,['Q']=16,['R']=17,['S']=18,['T']=19,['U']=20,['V']=21,['W']=22,['X']=23,['Y']=24,['Z']=25,
                         [
    'a']=26,['b']=27,['c']=28,['d']=29,['e']=30,['f']=31,['g']=32,['h']=33,['i']=34,['j']=35,['k']=36,['l']=37,['m']=38,
                         [
    'n']=39,['o']=40,['p']=41,['q']=42,['r']=43,['s']=44,['t']=45,['u']=46,['v']=47,['w']=48,['x']=49,['y']=50,['z']=51,
                         [
    '0']=52,['1']=53,['2']=54,['3']=55,['4']=56,['5']=57,['6']=58,['7']=59,['8']=60,['9']=61,['+']=62,['/']=63,['=']=nil}
    --------------------------------------------
    -- 
    Decode Base64 to HEX --------------------
    --------------------------------------------
    function 
    B64_to_HEX(data)
      
    local chars  = {}
      
    local result = {}
      
    local hex
        
    for dpos=0#data-1, 4 do
            
    -- Get chars -------------------
            for 
    char=1,do chars[char] = base64bytes[(string.sub(data,(dpos+char), (dpos+char)) or "=")] end -- Get chars
            
    -- To hex ----------------------
            if 
    chars[3] and chars[4then
                hex 
    string.format('%02X%02X%02X',                                  -- if 1,2,3,4 chars
                                       
    (chars[1]<<2)       + ((chars[2]&0x30)>>4),   -- 1
                                       
    ((chars[2]&0xf)<<4) + (chars[3]>>2),          -- 2
                                       
    ((chars[3]&0x3)<<6) + chars[4]              ) -- 3
              
    elseif  chars[3then
                hex 
    string.format('%02X%02X',                                      -- if 1,2,3 chars
                                       
    (chars[1]<<2)       + ((chars[2]&0x30)>>4),   -- 1
                                       
    ((chars[2]&0xf)<<4) + (chars[3]>>2),          -- 2
                                       
    ((chars[3]&0x3)<<6)                         )
              else
                
    hex string.format('%02X',                                          -- if 1,2 chars
                                       
    (chars[1]<<2)       + ((chars[2]&0x30)>>4)  ) -- 1
            end
           
    ---------------------------------
           
    table.insert(result,hex)
        
    end
      
    return table.concat(result)
    end

    ----------------------------------------
    -- 
    String_to_HEX  ----------------------
    ----------------------------------------
    function 
    String_to_HEX(Preset_Name)
      
    local VAL  = {Preset_Name:byte(1,-1)} -- to bytesvalues
      local Pfmt 
    string.rep("%02X"#VAL)
      
    return string.format(Pfmttable.unpack(VAL))
    end

    --------------------------------------------------------------------------------
    -- 
    FX_Chunk_to_HEX -------------------------------------------------------------
    --------------------------------------------------------------------------------
    -- 
    Variant 1 ---------------------------
    function 
    FX_Chunk_to_HEX(FX_TypeFX_ChunkPreset_Name)
      
    local Preset_Chunk FX_Chunk:match("\n.*\n")        -- extract preset(simple var)

        ---------------------------------------
        -- For 
    JS -----------------------------
        ---------------------------------------
        if 
    FX_Type=="JS" then
           Preset_Chunk 
    Preset_Chunk:gsub("\n""")      -- del "\n"
           
    --reaper.ShowConsoleMsg(Preset_Chunk..'\n')
           return 
    String_to_HEX(Preset_Chunk..Preset_Name)
        
    end

        
    ---------------------------------------
        -- For 
    VST ----------------------------
        ---------------------------------------
        
    local Hex_TB = {}
        
    local init 1
        
    ---------------------
        for 
    i=1math.huge do
              
    line Preset_Chunk:match("\n.-\n"init)    -- extract line from preset(simple var)
              if 
    not line then
                 
    --reaper.ShowConsoleMsg(Hex_TB[i-1].."\n")
                 
    Hex_TB[i-1] = "00"..String_to_HEX(Preset_Name).."0010000000" -- Preset_Name to Hex(replace name from chunk)
                 --
    reaper.ShowConsoleMsg(Hex_TB[i-1].."\n")
                 break
              
    end
              
    ---------------
              
    init init #line - 1                      -- for next line
              
    line line:gsub("\n","")                    -- del "\n"
              
    --reaper.ShowConsoleMsg(line.."\n")
              
    Hex_TB[i] = B64_to_HEX(line)
        
    end
        
    ---------------------
        return 
    table.concat(Hex_TB)
    end

    -- Variant 2(without Name to Hexsimple var) ------
    --[[
    function 
    FX_Chunk_to_HEX(FX_TypeFX_ChunkPreset_Name)
      
    local Preset_Chunk FX_Chunk:match("\n.*\n")   -- extract preset(simple var)
      ----------------------------------------
      
    Preset_Chunk Preset_Chunk:gsub("\n","")       -- del "\n"
      
    if FX_Type=="JS" then return String_to_HEX(Preset_Chunk..Preset_Name)
         else return 
    B64_to_HEX(Preset_Chunk)
      
    end
    end
    --]]

    --------------------------------------------------------------------------------
    -- 
    Get_CtrlSum -----------------------------------------------------------------
    --------------------------------------------------------------------------------
    function 
    Get_CtrlSum(HEX)
      
    local Sum 0
      
    for i=1#HEX, 2 do  Sum = Sum + tonumber( HEX:sub(i,i+1), 16) end
      
    return string.substring.format("%X"Sum), -2, -)
    end

    --------------------------------------------------------------------------------
    -- 
    Write preset to PresetFile --------------------------------------------------
    --------------------------------------------------------------------------------
    function 
    Write_to_File(PresetFilePreset_HEXPreset_Name)
      
    local filePresets_iniNprsts
      
    ----------------------------------------------------------
      -- 
    Rewrite header(or create) -----------------------------
      ----------------------------------------------------------
        
    local ret_rret_w
        
    if reaper.file_exists(PresetFilethen
            
    -- BR function works faster than lua r,--
            
    ret_rNprsts =  reaper.BR_Win32_GetPrivateProfileString("General""NbPresets"""PresetFile)
            
    Nprsts math.tointeger(Nprsts)
            ------------------
            
    ret_w reaper.BR_Win32_WritePrivateProfileString("General""NbPresets"math.tointeger(Nprsts+1), PresetFile)
        else 
    Nprsts 0
             Presets_ini 
    "[General]\nNbPresets="..Nprsts+1
             file 
    io.open(PresetFile"w")
             
    file:write(Presets_ini)
             
    file:close()
        
    end
      
    ----------------------------------------------------------
      -- 
    Write preset data to file -----------------------------
      ----------------------------------------------------------
      
    file io.open(PresetFile"r+")
      
    file:seek("end")                        -- to end of file
      
    ------------------
      
    file:write("\n[Preset"..Nprsts.."]")    -- preset number(0-based)
      --------------------------------------
      --------------------------------------
      
    local Len #Preset_HEX                 -- Data Lenght
      
    local s 1
      local Ndata 
    0
      
    for i=1math.ceil(Len/32768) do
          if 
    i==1 then Ndata "\nData=" else Ndata "\nData_".. i-.."=" end
          local Data 
    Preset_HEX:sub(ss+32767)
          
    local Sum Get_CtrlSum(Data)
          
    file:write(NdataDataSum)
          
    s+32768
      end
      
    --------------------------------------
      --- 
    Preset_NameData Lenght ---------
      --------------------------------------
      
    file:write("\nName=".. Preset_Name .."\nLen=".. Len//2 .."\n")
      
    -------------------
      
    file:close()
    end

    --------------------------------------------------------------------------------
    -- 
    Get FX_Chunk and PresetFile  ------------------------------------------------
    --------------------------------------------------------------------------------
    function 
    Get_FX_Data(trackfxnum)
      
    local fx_cnt reaper.TrackFX_GetCount(track)
      if 
    fx_cnt==or fxnum>fx_cnt-1 then return end       -- if fxnum not valid
      local ret
    Track_Chunk =  reaper.GetTrackStateChunk(track,"",false)
      --
    reaper.ShowConsoleMsg(Track_Chunk)

      ------------------------------------
      -- 
    Find FX_Chunk(use fxnum) --------
      ------------------------------------
      
    local sTrack_Chunk:find("<FXCHAIN")            -- find FXCHAIN section
      
    -- find VST(or JSchunk
      
    for i=1fxnum+do
          
    sTrack_Chunk:find("<%u+%s.->"e)
      
    end
        
    ----------------------------------
        -- 
    FX_Type -----------------------
        
    local FX_Type string.match(Track_Chunk:sub(s+1,s+3), "%u+")   -- FX Type
        
    if not(FX_Type=="VST" or FX_Type=="JS"then return end         -- Only VST and JS supported
        
    ----------------------------------
        -- 
    extract FX_Chunk --------------
        
    local FX_Chunk Track_Chunk:match("%b<>"s)      -- FX_Chunk(simple var)
        ----------------------------------
        --
    reaper.ShowConsoleMsg(FX_Chunk.."\n")

      ------------------------------------
      -- 
    Get UserPresetFile --------------
      ------------------------------------
      
    local PresetFile reaper.TrackFX_GetUserPresetFilename(trackfxnum"")
      ------------------------------------
      return 
    FX_TypeFX_ChunkPresetFile
    end

    --------------------------------------------------------------------------------
    -- 
    Main function  --------------------------------------------------------------
    --------------------------------------------------------------------------------
    function 
    Save_VST_Preset(trackfxnumPreset_Name)
      if 
    not (track and fxnum and Preset_Namethen return end       -- Need trackfxnumPreset_Name
      local FX_Type
    FX_ChunkPresetFile Get_FX_Data(trackfxnum)
      --
    reaper.ShowConsoleMsg(FX_Chunk..'\n')
      -----------
      if 
    FX_Chunk and PresetFile then
         local start_time 
    reaper.time_precise()
         
    local Preset_HEX FX_Chunk_to_HEX(FX_TypeFX_ChunkPreset_Name)
         --
    reaper.ShowConsoleMsg("Processing time = ".. reaper.time_precise()-start_time ..'\n') -- time test
         local start_time 
    reaper.time_precise()
         
    Write_to_File(PresetFilePreset_HEXPreset_Name)
         --
    reaper.ShowConsoleMsg("Write time = ".. reaper.time_precise()-start_time ..'\n') -- time test
         reaper
    .TrackFX_SetPreset(trackfxnumPreset_Name) -- For "update"but this is optional
      end
    end

    ----------------------------------------------------------------------------------------------------
    -- 
    GetLastTouchedFX  -------------------------------------------------------------------------------
    ----------------------------------------------------------------------------------------------------
    function 
    Get_LastTouch_FX()
      
    local retvaltracknumfxnum reaper.GetLastTouchedFX()           -- fxnum
      
    if not retval then return end
      local track 
    reaper.GetTrack(0tracknum-1)                        -- track(trackID)
      
    local PidxNpt reaper.TrackFX_GetPresetIndex(trackfxnum)
      
    local  Preset_Name "New "..Npt+1                                  -- New Preset_Name
      
    return trackfxnumPreset_Name
    end
    ----------------------------------------------------------------------------------------------------
    -- 
    GetOpenFX ---------------------------------------------------------------------------------------
    function 
    GetOpenFX ()
      
    local counttracks reaper.CountTracks(0)
      if 
    counttracks == nil then return end
      
    for i=1counttracks do
        
    local tr reaper.GetTrack(0,i-1)
        if 
    tr ~= nil then
          local CountFX 
    reaper.TrackFX_GetCounttr )
          for 
    i=1CountFX do
            
    local tt reaper.TrackFX_GetFloatingWindow(tri-1)
            if 
    tt then
              local track 
    tr
              local fxnum 
    i-1
              local Pidx
    Npt reaper.TrackFX_GetPresetIndex(tri-1)
              
    local Preset_Name "New "..Npt+1                                  -- New Preset_Name
              
    return trackfxnumPreset_Name
            end
          end
        end
      end

    end
    -- Start  ------------------------------------------------------------------------------------------
    ----------------------------------------------------------------------------------------------------
    -- 
    local trackfxnumPreset_Name Get_LastTouch_FX()                  -- any function can be used
    -- Save_VST_Preset(trackfxnumPreset_Name)                            -- RUN
    local track
    fxnumPreset_Name GetOpenFX ()
    Save_VST_Preset(trackfxnumPreset_Name)

    PS: И ещё -
    Использовать PresetIndex для номерации очередного пресета - не совсем хорошо.
    Куча плагинов, которые передают свои Пресеты в оболочку Рипера и индекс очередной (Npt+1) может быть и 101 и 209 и т.д.. Но это не самое страшное, хотя и сбивает с толку - страшно когда Плагин передаёт очередной, выбранный, блок пресетов, а его кол-во формирует тот-же индекс, с которым Пресет уже сохранён.
    Предлагаю использовать Nprsts (кол-во Пользовательских пресетов из ini файла), который уже вычесляется чуть позже у тебя в коде для того чтобы править "NbPresets".
    Я подправил свой раздел кода -
    PHP:
    --[[
       * 
    ReaScript NameSave_FX_Preset
       
    Lua script for Cockos REAPER
       
    AuthorEUGEN27771
       
    Author URIhttp://forum.cockos.com/member.php?u=50462
       
    LicenceGPL v3
       
    Version1.02
      
    ]]

      --------------------------------------------------------------------------------
      
    local msg = function(Mreaper.ShowConsoleMsg(tostring(M).."\n"end
      
    --------------------------------------------------------------------------------

    --------------------------------------------------------------------------------
    -- 
    Base64_to_Hex(modded from lua.org functions)  -------------------------------
    --------------------------------------------------------------------------------
    -- 
    decryption table --
    local base64bytes = {['A']=0, ['B']=1, ['C']=2, ['D']=3, ['E']=4, ['F']=5, ['G']=6, ['H']=7, ['I']=8, ['J']=9, ['K']=10,['L']=11,['M']=12,
                         [
    'N']=13,['O']=14,['P']=15,['Q']=16,['R']=17,['S']=18,['T']=19,['U']=20,['V']=21,['W']=22,['X']=23,['Y']=24,['Z']=25,
                         [
    'a']=26,['b']=27,['c']=28,['d']=29,['e']=30,['f']=31,['g']=32,['h']=33,['i']=34,['j']=35,['k']=36,['l']=37,['m']=38,
                         [
    'n']=39,['o']=40,['p']=41,['q']=42,['r']=43,['s']=44,['t']=45,['u']=46,['v']=47,['w']=48,['x']=49,['y']=50,['z']=51,
                         [
    '0']=52,['1']=53,['2']=54,['3']=55,['4']=56,['5']=57,['6']=58,['7']=59,['8']=60,['9']=61,['+']=62,['/']=63,['=']=nil}
    --------------------------------------------
    -- 
    Decode Base64 to HEX --------------------
    --------------------------------------------
    function 
    B64_to_HEX(data)
      
    local chars  = {}
      
    local result = {}
      
    local hex
        
    for dpos=0#data-1, 4 do
            
    -- Get chars -------------------
            for 
    char=1,do chars[char] = base64bytes[(string.sub(data,(dpos+char), (dpos+char)) or "=")] end -- Get chars
            
    -- To hex ----------------------
            if 
    chars[3] and chars[4then
                hex 
    string.format('%02X%02X%02X',                                  -- if 1,2,3,4 chars
                                       
    (chars[1]<<2)       + ((chars[2]&0x30)>>4),   -- 1
                                       
    ((chars[2]&0xf)<<4) + (chars[3]>>2),          -- 2
                                       
    ((chars[3]&0x3)<<6) + chars[4]              ) -- 3
              
    elseif  chars[3then
                hex 
    string.format('%02X%02X',                                      -- if 1,2,3 chars
                                       
    (chars[1]<<2)       + ((chars[2]&0x30)>>4),   -- 1
                                       
    ((chars[2]&0xf)<<4) + (chars[3]>>2),          -- 2
                                       
    ((chars[3]&0x3)<<6)                         )
              else
                
    hex string.format('%02X',                                          -- if 1,2 chars
                                       
    (chars[1]<<2)       + ((chars[2]&0x30)>>4)  ) -- 1
            end
           
    ---------------------------------
           
    table.insert(result,hex)
        
    end
      
    return table.concat(result)
    end

    ----------------------------------------
    -- 
    String_to_HEX  ----------------------
    ----------------------------------------
    function 
    String_to_HEX(Preset_Name)
      
    local VAL  = {Preset_Name:byte(1,-1)} -- to bytesvalues
      local Pfmt 
    string.rep("%02X"#VAL)
      
    return string.format(Pfmttable.unpack(VAL))
    end

    --------------------------------------------------------------------------------
    -- 
    FX_Chunk_to_HEX -------------------------------------------------------------
    --------------------------------------------------------------------------------
    -- 
    Variant 1 ---------------------------
    function 
    FX_Chunk_to_HEX(FX_TypeFX_ChunkPreset_Name)
      
    local Preset_Chunk FX_Chunk:match("\n.*\n")        -- extract preset(simple var)

        ---------------------------------------
        -- For 
    JS -----------------------------
        ---------------------------------------
        if 
    FX_Type=="JS" then
           Preset_Chunk 
    Preset_Chunk:gsub("\n""")      -- del "\n"
           
    --reaper.ShowConsoleMsg(Preset_Chunk..'\n')
           return 
    String_to_HEX(Preset_Chunk..Preset_Name)
        
    end

        
    ---------------------------------------
        -- For 
    VST ----------------------------
        ---------------------------------------
        
    local Hex_TB = {}
        
    local init 1
        
    ---------------------
        for 
    i=1math.huge do
              
    line Preset_Chunk:match("\n.-\n"init)    -- extract line from preset(simple var)
              if 
    not line then
                 
    --reaper.ShowConsoleMsg(Hex_TB[i-1].."\n")
                 
    Hex_TB[i-1] = "00"..String_to_HEX(Preset_Name).."0010000000" -- Preset_Name to Hex(replace name from chunk)
                 --
    reaper.ShowConsoleMsg(Hex_TB[i-1].."\n")
                 break
              
    end
              
    ---------------
              
    init init #line - 1                      -- for next line
              
    line line:gsub("\n","")                    -- del "\n"
              
    --reaper.ShowConsoleMsg(line.."\n")
              
    Hex_TB[i] = B64_to_HEX(line)
        
    end
        
    ---------------------
        return 
    table.concat(Hex_TB)
    end

    -- Variant 2(without Name to Hexsimple var) ------
    --[[
    function 
    FX_Chunk_to_HEX(FX_TypeFX_ChunkPreset_Name)
      
    local Preset_Chunk FX_Chunk:match("\n.*\n")   -- extract preset(simple var)
      ----------------------------------------
      
    Preset_Chunk Preset_Chunk:gsub("\n","")       -- del "\n"
      
    if FX_Type=="JS" then return String_to_HEX(Preset_Chunk..Preset_Name)
         else return 
    B64_to_HEX(Preset_Chunk)
      
    end
    end
    --]]

    --------------------------------------------------------------------------------
    -- 
    Get_CtrlSum -----------------------------------------------------------------
    --------------------------------------------------------------------------------
    function 
    Get_CtrlSum(HEX)
      
    local Sum 0
      
    for i=1#HEX, 2 do  Sum = Sum + tonumber( HEX:sub(i,i+1), 16) end
      
    return string.substring.format("%X"Sum), -2, -)
    end

    --------------------------------------------------------------------------------
    -- 
    Write preset to PresetFile --------------------------------------------------
    --------------------------------------------------------------------------------
    function 
    Write_to_File(PresetFilePreset_HEXPreset_Name)
      
    local filePresets_iniNprsts
      
    ----------------------------------------------------------
      -- 
    Rewrite header(or create) -----------------------------
      ----------------------------------------------------------
        
    local ret_rret_w
        
    if reaper.file_exists(PresetFilethen
            
    -- BR function works faster than lua r,--
            
    ret_rNprsts =  reaper.BR_Win32_GetPrivateProfileString("General""NbPresets"""PresetFile)
            
    Nprsts math.tointeger(Nprsts)
            ------------------
            
    ret_w reaper.BR_Win32_WritePrivateProfileString("General""NbPresets"math.tointeger(Nprsts+1), PresetFile)
        else 
    Nprsts 0
             Presets_ini 
    "[General]\nNbPresets="..Nprsts+1
             file 
    io.open(PresetFile"w")
             
    file:write(Presets_ini)
             
    file:close()
        
    end
      
    ----------------------------------------------------------
      -- 
    Write preset data to file -----------------------------
      ----------------------------------------------------------
      
    file io.open(PresetFile"r+")
      
    file:seek("end")                        -- to end of file
      
    ------------------
      
    file:write("\n[Preset"..Nprsts.."]")    -- preset number(0-based)
      --------------------------------------
      --------------------------------------
      
    local Len #Preset_HEX                 -- Data Lenght
      
    local s 1
      local Ndata 
    0
      
    for i=1math.ceil(Len/32768) do
          if 
    i==1 then Ndata "\nData=" else Ndata "\nData_".. i-.."=" end
          local Data 
    Preset_HEX:sub(ss+32767)
          
    local Sum Get_CtrlSum(Data)
          
    file:write(NdataDataSum)
          
    s+32768
      end
      
    --------------------------------------
      --- 
    Preset_NameData Lenght ---------
      --------------------------------------
      
    file:write("\nName=".. Preset_Name .."\nLen=".. Len//2 .."\n")
      
    -------------------
      
    file:close()
    end

    --------------------------------------------------------------------------------
    -- 
    Get FX_Chunk and PresetFile  ------------------------------------------------
    --------------------------------------------------------------------------------
    function 
    Get_FX_Data(trackfxnum)
      
    local fx_cnt reaper.TrackFX_GetCount(track)
      if 
    fx_cnt==or fxnum>fx_cnt-1 then return end       -- if fxnum not valid
      local ret
    Track_Chunk =  reaper.GetTrackStateChunk(track,"",false)
      --
    reaper.ShowConsoleMsg(Track_Chunk)

      ------------------------------------
      -- 
    Find FX_Chunk(use fxnum) --------
      ------------------------------------
      
    local sTrack_Chunk:find("<FXCHAIN")            -- find FXCHAIN section
      
    -- find VST(or JSchunk
      
    for i=1fxnum+do
          
    sTrack_Chunk:find("<%u+%s.->"e)
      
    end
        
    ----------------------------------
        -- 
    FX_Type -----------------------
        
    local FX_Type string.match(Track_Chunk:sub(s+1,s+3), "%u+")   -- FX Type
        
    if not(FX_Type=="VST" or FX_Type=="JS"then return end         -- Only VST and JS supported
        
    ----------------------------------
        -- 
    extract FX_Chunk --------------
        
    local FX_Chunk Track_Chunk:match("%b<>"s)      -- FX_Chunk(simple var)
        ----------------------------------
        --
    reaper.ShowConsoleMsg(FX_Chunk.."\n")

      ------------------------------------
      -- 
    Get UserPresetFile --------------
      ------------------------------------
      
    local PresetFile reaper.TrackFX_GetUserPresetFilename(trackfxnum"")
      ------------------------------------
      return 
    FX_TypeFX_ChunkPresetFile
    end

    --------------------------------------------------------------------------------
    -- 
    Main function  --------------------------------------------------------------
    --------------------------------------------------------------------------------
    function 
    Save_VST_Preset(trackfxnumPreset_Name)
      if 
    not (track and fxnum and Preset_Namethen return end       -- Need trackfxnumPreset_Name
      local FX_Type
    FX_ChunkPresetFile Get_FX_Data(trackfxnum)
      --
    reaper.ShowConsoleMsg(FX_Chunk..'\n')
      -----------
      if 
    FX_Chunk and PresetFile then
         local start_time 
    reaper.time_precise()
         
    local Preset_HEX FX_Chunk_to_HEX(FX_TypeFX_ChunkPreset_Name)
         --
    reaper.ShowConsoleMsg("Processing time = ".. reaper.time_precise()-start_time ..'\n') -- time test
         local start_time 
    reaper.time_precise()
         
    Write_to_File(PresetFilePreset_HEXPreset_Name)
         --
    reaper.ShowConsoleMsg("Write time = ".. reaper.time_precise()-start_time ..'\n') -- time test
         reaper
    .TrackFX_SetPreset(trackfxnumPreset_Name) -- For "update"but this is optional
      end
    end

    ----------------------------------------------------------------------------------------------------
    -- 
    GetLastTouchedFX  -------------------------------------------------------------------------------
    ----------------------------------------------------------------------------------------------------
    function 
    Get_LastTouch_FX()
      
    local retvaltracknumfxnum reaper.GetLastTouchedFX()           -- fxnum
      
    if not retval then return end
      local track 
    reaper.GetTrack(0tracknum-1)                        -- track(trackID)
      
    local PidxNpt reaper.TrackFX_GetPresetIndex(trackfxnum)
      
    local  Preset_Name "New "..Npt+1                                  -- New Preset_Name
      
    return trackfxnumPreset_Name
    end
    ----------------------------------------------------------------------------------------------------
    -- 
    GetOpenFX ---------------------------------------------------------------------------------------
    function 
    GetOpenFX ()
      
    local counttracks reaper.CountTracks(0)
      if 
    counttracks == nil then return tracksX end
      
    for i=1counttracks do
        
    local tr reaper.GetTrack(0,i-1)
        if 
    tr ~= nil then
          local CountFX 
    reaper.TrackFX_GetCounttr )
          for 
    i=1CountFX do
            
    local tt reaper.TrackFX_GetFloatingWindow(tri-1)
            if 
    tt then
              local track 
    tr
              local fxnum 
    i-1
              local PresetFile 
    reaper.TrackFX_GetUserPresetFilename(trackfxnum"")
              if 
    reaper.file_exists(PresetFilethen
                ret_r
    Nprsts =  reaper.BR_Win32_GetPrivateProfileString("General""NbPresets"""PresetFile)
                
    Nprsts math.tointeger(Nprsts)
              else
                
    Nprsts 0
              end
              local Pidx
    Npt reaper.TrackFX_GetPresetIndex(tri-1)
              
    local Preset_Name "New "..Nprsts+1                                  -- New Preset_Name
              
    return trackfxnumPreset_Name
            end
          end
        end
      end

    end
    -- Start  ------------------------------------------------------------------------------------------
    ----------------------------------------------------------------------------------------------------
    -- 
    local trackfxnumPreset_Name Get_LastTouch_FX()                  -- any function can be used
    -- Save_VST_Preset(trackfxnumPreset_Name)                            -- RUN
    local track
    fxnumPreset_Name GetOpenFX ()
    Save_VST_Preset(trackfxnumPreset_Name)
     
    Последнее редактирование: 3 июл 2016
    lil-burn нравится это.
  50. lil-burn

    lil-burn Well-Known Member

    Регистрация:
    15 авг 2012
    Сообщения:
    903
    Симпатии:
    623
    Пол:
    Мужской
    Адрес:
    Екатеринбург
    Au to Rea 0.5
    скрипт переводит сессию Adobe Audition в текущий проект рипера.
    в данной версии:
    ! - работает пока только с xml-файлами, сохраненными с помощью Audition 3
    ! - при переводе сохраняются пока только положения клипов в проекте
    - каждый аудио-клип добавляется в рипер в качестве айтема на новый трек (пока так)
    - скрипт должен работать с кириллицей в названиях папок и файлов (хотя не факт, что во всех случаях)

    как работает скрипт:
    1. в буфер обмена копируется путь к папке, которая (обязательно) содержит .xml файл сессии Au и все необходимые аудиофайлы
    2. в рипере запускается скрипт Au to Rea 0.5, после чего появляется окно, куда вставляем содержимое буфера (путь к папке с xml файлом). Жмем "Ок"
    3. Ждем несколько секунд и, собственно, все.
    Au to Rea 0.5.gif
     
    Pochette, Buyan, EUGEN27771 и 7 другим нравится это.

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