ReaScripts (скрипты для Reaper) - обсуждение

Тема в разделе "Reaper", создана пользователем drzhnn, 21 апр 2014.

  1. lil-burn

    lil-burn Well-Known Member

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


    Щас погоняю.
    Если лучше работает конечно надо заменить

    Где найти такой плагин (с чанком >4 мб), для теста?

    И какие глюки могут быть? (не замечал пока)
     
  2. lil-burn

    lil-burn Well-Known Member

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

    Volume adjustment все-таки не добавляет никаким макаром, если есть VolumeShaper (Cubleguys). На другом компе проверил - то же самое
    Как это обойти в принципе есть пара идей.
     
  3. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    16.898
    Симпатии:
    9.158
    Пол:
    Мужской
    Адрес:
    Киев
    @EUGEN27771, Женя, мне кажется, что для столь функционального скрипта стоит завести отдельную ветку и в ней всё это писать и обсуждать. Заодно там можно будет постепенно и функционал (подкреплённый "зарисовками" GUI) описывать и обсуждать.
    В этой теме просто всё утонит в прочих скриптах и обсуждениях.
     
  4. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    16.898
    Симпатии:
    9.158
    Пол:
    Мужской
    Адрес:
    Киев
    @EUGEN27771, какая ответственность?
     
  5. lil-burn

    lil-burn Well-Known Member

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

    Могу начать - просто законстатирую, что нашли косяки в стандартном Get/Set chunk, а ты потом добавишь пруфы, которые по-любому будут спрашивать.
    А могут спрашивать:
    - в чем конкретно выражается проблема, если чанк больше 4 мб?
    - это проблема только луа или не зависит от языка?
    - почему при использовании предложенного варианта все ок, всегда ли это можно использовать, нет ли других косяков?

    и у меня вопрос (у других наверно тоже будет):
    - чтоб у людей работали SNM функции насколько знаю нужно установленное SWS? если да, то можно ли повторить эти функции без использования SWS (вдруг можно)?
     
  6. lil-burn

    lil-burn Well-Known Member

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

    lil-burn Well-Known Member

    Регистрация:
    15 авг 2012
    Сообщения:
    903
    Симпатии:
    623
    Пол:
    Мужской
    Адрес:
    Екатеринбург
    Последнее редактирование: 6 июл 2017
    EUGEN27771 нравится это.
  8. lil-burn

    lil-burn Well-Known Member

    Регистрация:
    15 авг 2012
    Сообщения:
    903
    Симпатии:
    623
    Пол:
    Мужской
    Адрес:
    Екатеринбург
    @EUGEN27771, там Heda спрашивал в чем проявляются косяки и X-Raym просил добавить в ReaTeam Templates репозиторий. Если будет время напиши/добавь, моя роль там была только топикстартером)
     
  9. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    16.898
    Симпатии:
    9.158
    Пол:
    Мужской
    Адрес:
    Киев
    @EUGEN27771, а нельзя как то при регистрации или после неё сделать переименование "сходных" по имени плагинов средставми того же lua?
     
  10. lil-burn

    lil-burn Well-Known Member

    Регистрация:
    15 авг 2012
    Сообщения:
    903
    Симпатии:
    623
    Пол:
    Мужской
    Адрес:
    Екатеринбург
    @EUGEN27771, а красиво в любом случае не будет, хотя бы потому что
    1) нет функции добавления плагина по ID (причем эта функция должна включать позицию, куда нужно добавить эффект и интересоваться, нужно ли просто добавить эффект или заменить.)
    2) а самое главное - нет нормальной функции перемещения эффекта. Которая перемещала бы эффект в любое место цепи моментально. Если цепь большая, то это критично.

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

    И конечно в этом случае то что творится в цепи этого трека в риперовском микшере, лучше не смотреть (там будет куча пустых JS эффектов).
     
  11. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    16.898
    Симпатии:
    9.158
    Пол:
    Мужской
    Адрес:
    Киев
    @lil-burn, нет, всё немного проще и понятнее.
    Задуман скрипт, для которого у Джастина когда-то выпросили API для пинов трековых каналов.
    По сути, я очень на это надеюсь, это будет чуть круче чем Blue Cat's Patch Work, но родными средствами Рипера и без глюков, которые в Патч Ворке есть.
    Сплитер нужен на треке один, в месте, где сигнал будет рассплитован на паралельную обработку, ну и микшер один, в конце.
    Собственно по этому Женя и про матрицу pre, split, mix, post написал - до паралельной цепочки последовательная цепочка эффектов и после тоже.
    --- добавлено 7 июл 2017 ---
    @EUGEN27771, я думаю, что лучше использовать Вариант 1 и подумать над тем, что GUI скрипта может также быть хранилищем однозначных меток - вот те самые ноды они же скриптом понимаются однозначно, и эффект поставленный в цепочку инсёрта нажатием на конкретную ноду может буть интерпретирован чётко именно по этой самой ноде.
    Также не вижу надобности запрещать добавлять не один FX при открытии FX браузера - добавили пару - поставить их последовательно в ту цепочку, в которую добавляли, увидит пользователь, что зря добавил - сам удалит, конечно используя GUI скрипта.
    По поводу того, что всё должно произойти за один шаг - так ты же для этого и делаешь матрицу из таблиц - при открытии Скрипта на треке с уже созданной конструкцией (Edit режим) - скрипт читает чанк и пишет всё в твои таблицы Матрицы, затем пользователь начинает что-то править, таблицы автоматом переписываются, а при закрытии скрипта - формируем новый чанк и только тогда на треке происходит полное изменение состояния.
    Хотя......., нужно ещё крепко подумать, а не делать ли изменения на треке всякий раз когда Пользователь что-то поменял при открытом скрипте!!!!!!
    По поводу стопки костылей - нужно сделать работающий ПЕРВЫЙ вариант и начать тестировать.
     
    Последнее редактирование: 7 июл 2017
    EUGEN27771 нравится это.
  12. lil-burn

    lil-burn Well-Known Member

    Регистрация:
    15 авг 2012
    Сообщения:
    903
    Симпатии:
    623
    Пол:
    Мужской
    Адрес:
    Екатеринбург
    @Aleksandr Oleynik, у Жени прочитал

    переместить в нужную позицию - это же значит переместить эффект в цепи трека?
    каким образом происходит перемещение?
     
  13. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    16.898
    Симпатии:
    9.158
    Пол:
    Мужской
    Адрес:
    Киев
    При помощи правки чанка, об этом и весь сыр бор.
    Итоговая конструкция ведь ни что иное, как запомненный FX Chain, а в нём FX-ы можно перемещать не открывая Рипера вообще. Или нельзя?
     
  14. lil-burn

    lil-burn Well-Known Member

    Регистрация:
    15 авг 2012
    Сообщения:
    903
    Симпатии:
    623
    Пол:
    Мужской
    Адрес:
    Екатеринбург
    @Aleksandr Oleynik, в том-то и дело что перемещать можно, но не мгновенно.
    Там все работает от первого эффекта:
    рипер сравнивает по порядку эффекты нового и старого чанков например
    1) в старом был FX A и остался FX A- ок
    2) в старом был FX B и остался FX B - ок
    3) в старом был FX C а в новом - FX D - непорядок - и добавляет FX D
    и далее при каждом новом несовпадении добавляет эффекты так, как будто их нет на треке (хотя они есть, просто сместились).

    вроде так.
     
  15. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    16.898
    Симпатии:
    9.158
    Пол:
    Мужской
    Адрес:
    Киев
    @lil-burn, а мгновенно, в данном случаи и не нужно. Я знаю как с чанками происходит.
    Всё равно других вариантов нет.
     
  16. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    16.898
    Симпатии:
    9.158
    Пол:
    Мужской
    Адрес:
    Киев
    Мне в общем не понятно почему Джастин не включит ни в API ни в стандарт функционсл то, что происходит с FX и треками при драг анд дропе
     
    EUGEN27771 и stepperian нравится это.
  17. lil-burn

    lil-burn Well-Known Member

    Регистрация:
    15 авг 2012
    Сообщения:
    903
    Симпатии:
    623
    Пол:
    Мужской
    Адрес:
    Екатеринбург
    @EUGEN27771,
    там про функцию
    Thank you for the functions! [​IMG]

    Just to note that your workaround is quite a bit slower than the reaper function. For example, getting the chunk from 300 (almost empty) tracks:
    - Reaper's function time: 0.013485364965163
    - Eugen's function time: 0.18676601076731

    Nonetheless, your workaround is invaluable when someone wants to be sure he doesn't encounter problems with tracks with large chunks and we thank you!,
    что чуть медленнее стандартной.

    Кстати, сейчас пишу функции для добавления цепи эффектов на трек и темплейта трека из файла.
    Пока стараюсь не мудрить - например для замены цепи просто заменяю блок <FXCHAIN\n(...)> чанка трека на содержимое файла.
    Если блока нет (например когда нет и не было эффектов на треке) - предварительно добавляю.
    Вроде пока все ровно.

    По трек-темплейтам - еще проще: создаю новый трек и заменяю весь его чанк на содержимое файла template.RTrackTemplate
    Но сразу видно, что надо что-то делать с GUID-ами: если добавить 2 трека с одинаковым темплейтом, то миди-айтемы пулятся (pooled midi).

    Не замечал других косяков/вещей, за которыми надо следить при таком добавлении трек-темплейтов и цепей?
     
    EUGEN27771 нравится это.
  18. lil-burn

    lil-burn Well-Known Member

    Регистрация:
    15 авг 2012
    Сообщения:
    903
    Симпатии:
    623
    Пол:
    Мужской
    Адрес:
    Екатеринбург
    @EUGEN27771,
    так ищу
    PHP:
    function get_tr_fx_chain(chunk)
      if 
    chunk:match'\n<FXCHAIN\n' then
        
    return chunk:match'\n<FXCHAIN\n(.-)>\n>\n'
      
    end
    end
    поэтому такой косяк (с ">" в имени пресета) должно игнорить
     
  19. lil-burn

    lil-burn Well-Known Member

    Регистрация:
    15 авг 2012
    Сообщения:
    903
    Симпатии:
    623
    Пол:
    Мужской
    Адрес:
    Екатеринбург
    @EUGEN27771, еще сегодня предстоит написать функцию add_fx(module_name) - добавление эффекта по названию dll
    :)
     
    arkaine и EUGEN27771 нравится это.
  20. lil-burn

    lil-burn Well-Known Member

    Регистрация:
    15 авг 2012
    Сообщения:
    903
    Симпатии:
    623
    Пол:
    Мужской
    Адрес:
    Екатеринбург
    @EUGEN27771,
    насчет добавления FX:
    получается, при добавлении эффекта достаточно только его первой строки (там, где названия плагина и тд) и строки с названием пресета?
    Сейчас попробовал
    PHP:
    '<VST "VSTi: Sylenth1 (x86) (LennarDigital)" "Sylenth1 [32bit].dll" 0 "" 1937337393\nPRESETNAME "ARP 303 Saw">'
    работает

    PS: вернее работает - добавляет fx, но пресет не добавляет. но уже хорошо. пресет можно потом добавить
     
    Последнее редактирование: 11 июл 2017
  21. lil-burn

    lil-burn Well-Known Member

    Регистрация:
    15 авг 2012
    Сообщения:
    903
    Симпатии:
    623
    Пол:
    Мужской
    Адрес:
    Екатеринбург
    а вот это да, жесть) учту
     
  22. lil-burn

    lil-burn Well-Known Member

    Регистрация:
    15 авг 2012
    Сообщения:
    903
    Симпатии:
    623
    Пол:
    Мужской
    Адрес:
    Екатеринбург
    @EUGEN27771, не замечал, что чем больше сохранено пресетов у плагина, тем дольше между ними переключаться и дольше открывается плагин (при добавлении на трек и просто при открытии окна)? На всяких спайрах и тд очень хорошо ощущается.
    это может означать, что если пресетов много, то лучше использовать свою систему пресетов, которая будет работать через чанки.
    А еще лучше было бы наверно иметь возможность сохранять и загружать внутренние пресеты плагина, они вообще моментально загружаются
     
  23. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    16.898
    Симпатии:
    9.158
    Пол:
    Мужской
    Адрес:
    Киев
    @lil-burn, через чанки, если простыня чанков (они же пресеты) будет аналогичной списку пресетов в ini - будет грузиться также долго.
    Грузить пресеты плагина:
    А как их туда записывать из Рипера? А что делать с плагинами, у которых система пресетов типпа как в Bias Fx?

    Вообще-то, по идее система пресетов Рипера столь же интеллектуальна, как и чанки и не грузит по новой уже загруженный пресет, не тратит на это время - там есть контрольные суммы, которые в начале считываются.
    Вот бы сделать что-то аналогичное и с данными изменившихся параметорв в новом пресете - грузить только их, игнорируя не менявшиеся.
     
  24. lil-burn

    lil-burn Well-Known Member

    Регистрация:
    15 авг 2012
    Сообщения:
    903
    Симпатии:
    623
    Пол:
    Мужской
    Адрес:
    Екатеринбург
    @Aleksandr Oleynik, сделал для себя минимальную версию системы пресетов: в окне отображается список пресетов для эффекта в фокусе, при клике устанавливается выбранный пресет для эффекта в фокусе, при нажатии на колесо - сохраняется текущий пресет - в виде куска чанка, кот. отвечает за данные эффекта. Достаточно быстро загружается.

    @Aleksandr Oleynik, @EUGEN27771,
    а контрольные суммы находятся в начале куска base64 или в конце?

    для многих vst-эффектов чанк непостоянный - к примеру, тот же контакт - каждую секунду разный чанк, хотя параметры одинаковые. Там по-моему то ли счетчик стоит, то ли еще что-то но чанки разные.
    Это одна из вещей (вместе с невозможностью быстрого перемещения треков), которая застопорила создание скрипта, синхронизирующего работу проекта на нескольких компьютерах одновременно (этот скрипт требует однозначного определения, были ли изменены параметры эффекта, т.к. передавать чанки имеет смысл только при изменении эффекта)

    вот гляньте - The glue
    chunks.gif
    видно, что в одном месте как будто счетчик стоит, зачем-то считает время, причем даже не каждую секунду, а еще чаще. в контакте вообще несколько таких "очагов".
    Хотя есть и эффекты, где не меняется чанк, например Effectrix. Ну и в js конечно не меняется
     
  25. lil-burn

    lil-burn Well-Known Member

    Регистрация:
    15 авг 2012
    Сообщения:
    903
    Симпатии:
    623
    Пол:
    Мужской
    Адрес:
    Екатеринбург
    @EUGEN27771, интересно)
    это будет работать, если эффектов нет?
    __________
    у меня пока
    PHP:
    function ExtractBrackets(str)
      
    local sother'',''
      
    local count 1
      
    for line in str:gmatch('[^\n]+') do
        if 
    not f then
          s 
    s..'\n'..line
          
    if line:sub(1,1) == '<' then count count +1 end
          
    if line:sub(1,1) == '>' then count count -1 end
          
    if count == 0 then f 1 end
        
    else other other..'\n'..line end
      end
      
    if s:sub(-1) == '>' then s s:sub(1,-2other '>'..other end
      
    return sother
    end

    function get_tr_fx_chain(tr,chunk)
      if 
    chunk:match'\n<FXCHAIN\n' then
        local a
    ,b,c
        a
    ,chunk:match'(.-\n<FXCHAIN\n)(.*)'
        
    b,ExtractBrackets(b)
       
       
        return 
    a,b,c
      end
    end
     
    RJ Baker нравится это.
  26. lil-burn

    lil-burn Well-Known Member

    Регистрация:
    15 авг 2012
    Сообщения:
    903
    Симпатии:
    623
    Пол:
    Мужской
    Адрес:
    Екатеринбург
    @EUGEN27771,
    а для вставки вот такое
    PHP:
    function add_tr_fx_chain(trchunknew_chainreplace7)
      
    local fx r.TrackFX_GetCount(tr)
      
    local fx_chain

      a
    ,b,get_tr_fx_chain(tr,chunk)

      if 
    b then
        
    if replace7 and replace7~=0 then
          chunk 
    a..new_chain..'\n'..c
        
    else
          
    chunk a..b..new_chain..'\n'..c
        end
      
    else
        
    local a,b,c
        a
    chunk:match'(.-\nMAINSEND.-\n)(.*)'
        
    '<FXCHAIN\n'..new_chain..'\n>\n'
        
    chunk a..b..c
      end

      SetTrackChunk
    (trchunk)

    end
    new_chain - содержимое файла цепи RfxChain (такая задача сейчас)
    replace7 == 1 заменяет цепь на треке, иначе добавляет в конец
     
    RJ Baker нравится это.
  27. lil-burn

    lil-burn Well-Known Member

    Регистрация:
    15 авг 2012
    Сообщения:
    903
    Симпатии:
    623
    Пол:
    Мужской
    Адрес:
    Екатеринбург
    @EUGEN27771, аналог SWS Resources. только при запуске скрипта создает список всех цепей эффектов (из папки FXChains), темплейтов (из папки TrackTemplates), и пресетов (из папки presets). И из этого списка пользователь добавляет в проект все что нужно
     
    EUGEN27771 нравится это.
  28. lil-burn

    lil-burn Well-Known Member

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

    * "умный" - по сравнению с экшеном Track: Vertical scroll selected tracks into view, который всегда устанавливает первый выделенный трек в середину треклиста

    По скроллу в апи нашел пока только такие варианты:
    reaper.CSurf_OnScroll( xdir, ydir )
    reaper.CSurf_OnArrow( whichdir, wantzoom )
    но это скроллы относительно текущего положения

    В общем не могу пока добиться такого поведения скролла, как в SWS resources
     
  29. Martin111

    Martin111 Member

    Регистрация:
    18 фев 2015
    Сообщения:
    378
    Симпатии:
    16
    Пол:
    Мужской
    @lil-burn а у вас нет такого скрипта, чтобы выделенные треки попадали в первую выделенную группу ?
     

    Вложения:

    • Gif.gif
      Gif.gif
      Размер файла:
      191 КБ
      Просмотров:
      24
  30. lil-burn

    lil-burn Well-Known Member

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

    lil-burn Well-Known Member

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

    Кстати, не было еще желания написать свой текстовый редактор скриптов? В риперовском не хватает некоторых вещей, которые бы заметно ускорили написание скриптов:
    - комментирование выделенных строк (toggle) одним нажатием
    - перемещение строк с помощью например rightdrag - очень часто приходится перемещать куски текста или просто менять местами строки
    - темплейты-шаблоны: при создании нового скрипта может к примеру автоматом добавляться шапка и тд
    - вкладки скриптов: можно открывать не каждый скрипт в отдельном IDE окне, а в одном окне в нескольких вкладках
    - добавление функций и просто кусков кода по названиям и тегам, с фильтром (помнишь, показывал скрипт: список функций с фильтром - вводишь название - щелкаешь по нужной функции - текст функции копируется в буфер обмена, потом его добавляешь в редактор через Ctrl+V)
    scripter is back.gif
    так вот при частом использовании напрягает немного, что надо переходить из окна IDE в окно скриптера (со списком функций) и жмакать каждый раз Ctrl+V. А если это встроить в свой редактор, будет гораздо удобнее.
    А потом можно пойти еще дальше и запилить, чтобы функции добавлялись с учетом уже написанного текста, то есть например было
    my_item = r.GetSelectedMediaItem(0,0)
    если после этого добавить функцию r.GetMediaItemInfo_Value() то она добавится как it_start = r.GetMediaItemInfo_Value(my_item, 'D_POSITION') именно с переменной my_item
    - + удаление неиспользуемых функций в один клик, оптимизация кода (например замена глобальных переменных на локальные) и тд
    В общем можно много чего полезного замутить, что будет люто экономить время
     
    stepperian нравится это.
  32. feeleen

    feeleen Active Member

    Регистрация:
    11 ноя 2005
    Сообщения:
    903
    Симпатии:
    232
    Пол:
    Мужской
    Подскажите, коллеги, в какую сторону смотреть для решения следующей задачи: миди сообщения SysEx нужно передать по OSC, в сообщениях содержится массив 8ми битных чисел, т.е. это не команды, мне числа и нужны. Все это надо в потоке. Или скриты для этого не подойдут, они все больше по оффлайн операциям?
     
    Последнее редактирование: 27 июл 2017
  33. lil-burn

    lil-burn Well-Known Member

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

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    16.898
    Симпатии:
    9.158
    Пол:
    Мужской
    Адрес:
    Киев
    https://www.cockos.com/oscii-bot/
     
  35. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    16.898
    Симпатии:
    9.158
    Пол:
    Мужской
    Адрес:
    Киев
    @lil-burn, есть замечательный Эдитор для скриптов с модулем под lua -
    https://atom.io/
    В нём есть абсолютно всё нужное.
    Думаю можно написать и модуль для регистрации изменений в Рипере тоже.
     
    lil-burn нравится это.
  36. lil-burn

    lil-burn Well-Known Member

    Регистрация:
    15 авг 2012
    Сообщения:
    903
    Симпатии:
    623
    Пол:
    Мужской
    Адрес:
    Екатеринбург
    @EUGEN27771,
    Смотри разве не удобно?)
    script editor.gif
    начал в общем на основе твоего скрипта писать редактор
    Сохранение и загрузку (save/ load) добавить очень легко, остальное нарастет
    Единственное - список переменных как сделать (в правом окне), пока не ясно

    посмотрю, спасибо
     
  37. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    16.898
    Симпатии:
    9.158
    Пол:
    Мужской
    Адрес:
    Киев
    @lil-burn, лучше напишите модуль под Рипер для Atom.
     
  38. lil-burn

    lil-burn Well-Known Member

    Регистрация:
    15 авг 2012
    Сообщения:
    903
    Симпатии:
    623
    Пол:
    Мужской
    Адрес:
    Екатеринбург
    Хочу сделать что-то вроде голосового управления рипером.
    Почти все что нужно есть
    Нашел
    PHP:
    import speech_recognition as sr
    import os
    import datetime

    class Speech_AI:

        
    def __init__(self):
            
    self._recognizer sr.Recognizer()
            
    self._microphone sr.Microphone()
            
    now_time datetime.datetime.now()
            
    self._mp3_name now_time.strftime("%d%m%Y%I%M%S")+".mp3"
            
    self._mp3_nameold='111'

        
    def work(self):
            
    with self._microphone as source:
                
    self._recognizer.adjust_for_ambient_noise(source)

            try:
                while 
    True:
                    
    with self._microphone as source:
                        
    audio self._recognizer.listen(source)
                    try:
                        
    statement self._recognizer.recognize_google(audiolanguage="ru_RU")
                        
    statement=statement.lower()
                       
                        print(
    format(statement))
                       
                    
    except sr.UnknownValueError:
                        
    1
                    except sr
    .RequestError as e:
                        
    1
            except KeyboardInterrupt
    :
                
    self._clean_up()

        
    def _clean_up(self):
            
    def clean_up():
                
    os.remove(self._mp3_name)

    def main():
        
    ai Speech_AI()
        
    ai.work()

    main()
    и немного упростил его - скрипт выводит текст, который я наговариваю в микрофон.
    работает так
    voice.gif
    но не работает в рипере - зависает. Думаю, что надо куда-то добавить дефер, но пока не ясно, куда именно (пробовал по-разному).
    Есть идеи?
     
  39. vitalker

    vitalker Well-Known Member

    Регистрация:
    8 окт 2013
    Сообщения:
    3.053
    Симпатии:
    1.181
    Адрес:
    Гродно
    А кириллица не может быть виной? Вообще можно написать на оф.форуме - там больше знатоков. :)
     
  40. lil-burn

    lil-burn Well-Known Member

    Регистрация:
    15 авг 2012
    Сообщения:
    903
    Симпатии:
    623
    Пол:
    Мужской
    Адрес:
    Екатеринбург
    @vitalker, маловероятно, думаю тогда бы появилась ошибка. есть конфа разработчиков скриптов рипера, там сейчас ответили, что надо создавать отдельный "поток", буду разбираться
     
    vitalker нравится это.
  41. stepperian

    stepperian Active Member

    Регистрация:
    20 окт 2005
    Сообщения:
    185
    Симпатии:
    32
    Доброго времени суток! Ребята, давно мучает меня вопрос , как менять программно в графическом скрипте высоту окна (можно ли сделать при помощи функция gfx.init (не в ручную) заранее спасибо
     
  42. lil-burn

    lil-burn Well-Known Member

    Регистрация:
    15 авг 2012
    Сообщения:
    903
    Симпатии:
    623
    Пол:
    Мужской
    Адрес:
    Екатеринбург
    @EUGEN27771, с кириллицей в Chunk Editor пока все не просто? Пока вводятся только латинские буквы
     
  43. lil-burn

    lil-burn Well-Known Member

    Регистрация:
    15 авг 2012
    Сообщения:
    903
    Симпатии:
    623
    Пол:
    Мужской
    Адрес:
    Екатеринбург
    @EUGEN27771,
    себе в скриптер добавил только что поддержку ввода кириллицы в строку фильтра, работает как надо.
    test kyrillic.gif
    У тебя алгоритм другой, но тоже должно работать, надо просто подумать как лучше сделать. могу прислать код
     
  44. lil-burn

    lil-burn Well-Known Member

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

    Вложения:

    EUGEN27771 нравится это.
  45. lil-burn

    lil-burn Well-Known Member

    Регистрация:
    15 авг 2012
    Сообщения:
    903
    Симпатии:
    623
    Пол:
    Мужской
    Адрес:
    Екатеринбург
    @EUGEN27771, кстати вопрос по GUI: можно ли как-то активировать окно скрипта, если фокус не на нем, а например на аранже?
    только через gfx.init()?
     
  46. lil-burn

    lil-burn Well-Known Member

    Регистрация:
    15 авг 2012
    Сообщения:
    903
    Симпатии:
    623
    Пол:
    Мужской
    Адрес:
    Екатеринбург
    @EUGEN27771, тестовый скрипт у меня открывает пустое окно и ничего не происходит
    upload_2017-8-18_22-25-25.png
    чего-то не хватает или это по-другому работает?
     
  47. lil-burn

    lil-burn Well-Known Member

    Регистрация:
    15 авг 2012
    Сообщения:
    903
    Симпатии:
    623
    Пол:
    Мужской
    Адрес:
    Екатеринбург
    @EUGEN27771, странно
    strange things.gif
    по ходу все-таки чего-то не хватает (остальные GUI скрипты работают)
     
  48. lil-burn

    lil-burn Well-Known Member

    Регистрация:
    15 авг 2012
    Сообщения:
    903
    Симпатии:
    623
    Пол:
    Мужской
    Адрес:
    Екатеринбург
    @EUGEN27771, проблема была из-за gfx.setfont()
    у меня пару месяцев назад слетела тема. И пошли баги с оформлением на многих программах. Руки пока все не доходят переустановить винду.
    вот так работает:
    PHP:
    --[[
    В cp1251 русские буквы А-Яа-я (без буквы Ёёзанимают диапазон ASCII кодов 192-255 (0xC0-0xFF)
    а в юникоде 1040-1104 (0x0410-0x044F).
    Разница как раз 848.
    --]]
    --------------------
    str_tb = {}
    local c_pos 0

    ----------------------------------------
    gfx.clear =  0
    --gfx.setfont(1,"Tahoma",22)

    gfx.init("Test"500,300,0,200,200)

    --------------------
    function 
    minmax(xminvmaxv)
      return 
    math.min(math.max(xminv),maxv)
    end

    ----------------------------------------
    function 
    DrawText(str_tb)
      
    gfx.set(1)
      
    gfx.setfont(1'Verdana',16)
      ------------------
      
    gfx.xgfx.100
      gfx
    .drawstr("last char: ")
      
    gfx.drawnumber(last_char0)
      ------------------
      
    local s_xs_y 1020
      gfx
    .xgfx.s_xs_y
      
    if c_pos == 0 then gfx.line(gfx.xgfx.ygfx.xgfx.gfx.texthend
      
    ------------------
      for 
    1#str_tb do
        
    local c str_tb[i]
        if 
    == 13 then
          gfx
    .xgfx.s_xgfx.gfx.texth -- next line
        
    else
          
    gfx.drawchar(c)
        
    end
        
    if == c_pos then gfx.line(gfx.xgfx.ygfx.xgfx.gfx.texthend -- cursor
      end
       
    end


    ----------------------------------------
    function 
    mainloop()

      
    mouse_down gfx.mouse_cap&== and mouse_last_cap&== 0
      mouse_last_cap 
    gfx.mouse_cap

      char 
    gfx.getchar()

      if 
    char 0 then last_char char end -- For Test!
      if 
    char == 13 then table.insert(str_tbc_pos+1char); c_pos c_pos+1 end
      
    if char 31 and char 127 then table.insert(str_tbc_pos+1char); c_pos c_pos+1 end
      
    if char 127 and char 256 then table.insert(str_tbc_pos+1848 char); c_pos c_pos+1 end
      
    ---------------
      if 
    char == and c_pos 0 then table.remove(str_tbc_pos); c_pos c_pos-1 end
      
    if char == 1818584692 then c_pos minmax(c_pos-10#str_tb) end
      
    if char == 1919379572 then c_pos minmax(c_pos+10#str_tb) end
      
    DrawText(str_tb)
      ---------------

      if 
    char~=-1 then reaper.defer(mainloopend --defer
      gfx
    .update();

    end

    mainloop
    ()
    --- добавлено 18 авг 2017 ---
    то есть если просто убрать gfx.setfont(1,"Tahoma",22) в начале и поставить ее в функцию DrawText(str_tb) то все ок. Причем от названия шрифта это не зависит
    now its ok.gif
     
    Последнее редактирование: 18 авг 2017
  49. lil-burn

    lil-burn Well-Known Member

    Регистрация:
    15 авг 2012
    Сообщения:
    903
    Симпатии:
    623
    Пол:
    Мужской
    Адрес:
    Екатеринбург
    @EUGEN27771, круто, работает)) очень полезная вещь
    что можно прописать, чтобы работало например ё?
     
  50. lil-burn

    lil-burn Well-Known Member

    Регистрация:
    15 авг 2012
    Сообщения:
    903
    Симпатии:
    623
    Пол:
    Мужской
    Адрес:
    Екатеринбург
    @EUGEN27771, а, ну разобрался, получается так
    PHP:
      if char 127 and char 256 then
        
    if char == 184 then
          table
    .insert(str_tbc_pos+11105)
        elseif 
    char == 168 then
          table
    .insert(str_tbc_pos+11025)
        else
          
    table.insert(str_tbc_pos+1848 char)
        
    end
        c_pos 
    c_pos+1
      end
     

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