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

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

  1. Слава

    Слава Member

    Регистрация:
    22 ноя 2006
    Сообщения:
    65
    Симпатии:
    19
    "Cлучаев чего" не наблюдаю - ebc v2.7 работает как доктор прописал. Наличие меню пресетов и параметра RMS size делают ebc v2.7 ещё более юзабельным. Компрессоры (как впрочем и другие приборы) всегда оцениваю "на ухо". Почему вы решили сравнить алгоритм ebc именно с rea comp? Тем более, алгоритм ebc (v1, v2, v2.7) написан вами с нуля изначально, или по образцу rea comp? Прошу прощения, если вопрос поставлен неграмотно. Ну а если в моём понимании - ebc v2.7 именно как компрессор работает прекрасно, а вычитается он в ноль с rea comp, или нет мне не критично.
    Спасибо за отличный инструмент!
     
    Buyan нравится это.
  2. Buyan

    Buyan Member

    Регистрация:
    19 апр 2016
    Сообщения:
    80
    Симпатии:
    12
    Пол:
    Мужской
    Род занятий:
    Хобби: Гитара, Флейта, Звукорежиссура.
    Адрес:
    Белая Церковь
    @Aleksandr Oleynik, @@Michael, @EUGEN27771, и остальные,
    Нашел функцию в API - reaper.TimeMap_QNToMeasures( proj, qn ), вот ломаю голову, может кто знает, что такое QN ?
    Может вопрос и простой, но я в меру своей недалекости пока не могу сообразить.

    Ищу API для работы с тактами, размерами и прочим связанным, везде натыкаюсь на этот QN в параметрах функций.
    Вообще задача в том, что-бы измерить количество четвертей между двумя тайм-маркерами(временными позициями на таймлайне).
     
    Последнее редактирование: 17 дек 2017
  3. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    14.413
    Симпатии:
    7.261
    Пол:
    Мужской
    Адрес:
    Киев
    @Buyan, я так понимаю, что значение в определенном формате. Есть и другие подобные примеры, когда через API можно получить в начале значение в одном каком-то формате, а потом есть API в котором это вот значение в этом формате используется для получения чего то иного.
    Нужно просто искать функции в которых этот qn ещё встречается.
     
  4. EUGEN27771

    EUGEN27771 Well-Known Member

    Регистрация:
    23 апр 2010
    Сообщения:
    2.194
    Симпатии:
    1.838
    Пол:
    Мужской
    Четвертные ноты
    ---------
    Вообще, это почти стандартный способ измерения QN -четвертями. В VST тоже так отмеряют.
    Это позволяет сразу считать музыкальное время
     
    Последнее редактирование: 20 дек 2017
    Aleksandr Oleynik нравится это.
  5. BlackWinter

    BlackWinter New Member

    Регистрация:
    29 июн 2012
    Сообщения:
    5
    Симпатии:
    2
    Всем привет!
    Перехожу на Рипер с Про Тулс. Добиваюсь похожего поведения в работе, ибо привык.
    Например при выделении item мне оч удобно что time-selection выставляется по размеру item, а курсор встает на начало item и я знаю что при нажатии play услышу item а не какое-то рандомное место в проекте где остался стоять курсор. Родного такого поведения нет, поэтому я написал простой custom action
    -select item under mouse cursor
    -move cursor to start of items
    -set time selection to items

    Повесил свой кастом на левую кнопку мыши и все работает идеально. Супер. Но дальше я понял что добавляя в выделение новые item с помощью Shift - вся логика ломается. Есть опция для Shift+Left Mouse - добавить item в выделение и расширить тайм селекшн. Но курсор не перемещается в начало нового выделения. Я продолжил свой путь и написал второй кастом экшн. Прелесть в том, что сложные экшены доступные для мышки (добавить в выделение и расширить тайм селекшн например) недоступны в списке экшенов. Ок, пишу все сам. И вот тут начинается самое интересное. Добавить в выделение item можно 2умя способами - add (leaving other items selected) и toggle selection under mouse. Оба варианта скрипта работают идеально при наведении мышки на новый item и запуске скрипта через горячие клавиши. Но абсолютно некорректно работает когда ТОТ ЖЕ самый экшн скрипт (PT Mouse Left + Shift) установлен на комбинацию Shift+LMB - в этом случае выделение предыдущих item слетает.

    В прикрепленных GIF очень четко видно, как при запуске экшена горячими клавишами все работает как я задумал, и я даже запускал воспроизведение каждый раз с начала выделения всех айтемов. ВО второй же GIF прекрасно видно что тот же самый экшн скрипт запущенный мышкой+shift - работает некорректно, теряя прошлое выделение.

    Итого:
    1) как решить мою задачу?
    2) почему Рипер так себя ведет, на мой взгляд абсолютно некорректно?

    Спасибо!
     

    Вложения:

    • Hot Keys 1.gif
      Hot Keys 1.gif
      Размер файла:
      2,6 МБ
      Просмотров:
      22
    • Mouse.gif
      Mouse.gif
      Размер файла:
      766,6 КБ
      Просмотров:
      20
    incubator нравится это.
  6. Martin111

    Martin111 Member

    Регистрация:
    18 фев 2015
    Сообщения:
    344
    Симпатии:
    12
    Пол:
    Мужской
    Подскажите скрипт, который перемещает выделенную ноту к концу предыдущей ?
     

    Вложения:

    • Скрин.png
      Скрин.png
      Размер файла:
      3,4 КБ
      Просмотров:
      14
  7. @Michael

    @Michael Well-Known Member

    Регистрация:
    14 дек 2010
    Сообщения:
    692
    Симпатии:
    1.031
    Пол:
    Мужской
    Адрес:
    Орёл / Москва
    Что-то вроде этого:
    PHP:
      for key in pairs(reaper) do _G[key]=reaper[key]  end
      
    function ReorderNotes(percent)  
        
    local ME MIDIEditor_GetActive()
        if 
    not ME then return end
        local take 
    MIDIEditor_GetTake(ME)
        if 
    not take or not TakeIsMIDI(takethen return end
        local last_t
        
    for 1, ({MIDI_CountEvtstake )})[2] do
          
    local _selectedmutedstartppqposendppqposchanpitchvel MIDI_GetNotetakei-)
          if 
    selected and 1 then
            local len 
    endppqposstartppqpos
            startppqpos 
    last_t.endppqpos 1
            endppqpos 
    startppqpos len
            MIDI_SetNote
    takei-1truemutedstartppqpos,endppqposchanpitchveltrue )
          
    end
          last_t
    ={startppqpos=startppqposendppqpos=endppqpos}
        
    end
        MIDI_Sort
    take )
      
    end
      ReorderNotes
    ()
     
    Martin111 нравится это.
  8. Buyan

    Buyan Member

    Регистрация:
    19 апр 2016
    Сообщения:
    80
    Симпатии:
    12
    Пол:
    Мужской
    Род занятий:
    Хобби: Гитара, Флейта, Звукорежиссура.
    Адрес:
    Белая Церковь
    @EUGEN27771, @Aleksandr Oleynik,
    Спасибо большое! Одна голова хорошо, а больше лучше:).
    Четвертя, это как-раз то, что мне нужно использовать в вычислениях для получения требуемого значения bpm маркера.
     
  9. Archchie

    Archchie Active Member

    Регистрация:
    24 окт 2017
    Сообщения:
    190
    Симпатии:
    31
    Пол:
    Мужской
    Ребят!Есть у кого скрипт?
    Select next items/tracks/envelope points (depending on focus) —Выбрать следующий элемент / дорожку / точку конверта (в зависимости от фокуса)
    или может кто сделает ?
    Спасибо!
     
  10. Martin111

    Martin111 Member

    Регистрация:
    18 фев 2015
    Сообщения:
    344
    Симпатии:
    12
    Пол:
    Мужской
    @@Michael круто, то что нужно, спасибо !!!
     
  11. Nordum

    Nordum Member

    Регистрация:
    28 окт 2016
    Сообщения:
    89
    Симпатии:
    10
    Пол:
    Мужской
    @Pochette, Проверьте .ini sws на атрибуты "только чтение" в папке ресурсов, все слоты, настройки хранятся там
     
  12. incubator

    incubator Active Member

    Регистрация:
    24 янв 2007
    Сообщения:
    277
    Симпатии:
    80
    Адрес:
    Spb
    @BlackWinter, Я пришел сюда за тем же что и вы!Мы с товарищем @vitalker бились сегодня с этим целый вечер!
    Неистово плюсую!!!
    Это дествительно не работает корректно.Замечу что описать сию проблему\желание довольно сложно) По сути добавление в веделение атемов с синхонным выделением времени и перемещинии курсора на начало все выделенных айтемов по left click с удержаным shift
    [​IMG]


    Я убил 2 бесонных ночи на это и один вечер с Виталием(Дай бог ему здоровья) Но безуспешно)Поэтому думаю что это решаеться только скриптом.
    Друзья пожалуйста кто умеет помогите осущетвить мечту не переучиваться а сразу приступить к работе в Рипере!
     
  13. BlackWinter

    BlackWinter New Member

    Регистрация:
    29 июн 2012
    Сообщения:
    5
    Симпатии:
    2
    Абсолютно верно! В моем GIF когда я запускал свой скрипт горячими клавишами действительно все работает как в Аблетоне. Правда я уже для себя понял, что вариант с перемоткой курсора на начало делает невозможным редактирование. Слава богу аналогично PT можно назначить разное действие на верхнюю и нижнюю половину item. Таким образом я бы настроил что при нажатии на верхнюю половину курсор перемещается в место нажатия, а при нажатии в нижнюю - выделяет весь item и можно его проиграть.

    Итак, что получилось.
    1) Ставим по умолчанию левую кнопку мыши на item - Select item and move edit cursor
    таким образо мы тыкая в аудиоклип перемещаем курсор куда надо, с этого момента можем проигрывать и зумить именно это место. (попытки перематывать курсор на начало айтема дял воспроизведения убивали возможность зумить середину файла) Но item выделяется, что для нас важно.
    2) На левую кнопку item bottom half - ставим свой кастомный скрипт
    -select item under mouse cursor
    -set time selection to items (уже эта строчка кода переставляет курсор на начало itema, хотя это СОВЕРШЕННО не следует из названия экшена)
    -move edit cursor to mouse cursor (раз уж мы решили что все равно запускать выделенные items с их начала будем другой комбинацией клавиш, нам нет смысла переставлять курсор от места нажатия, и этой строчкой мы его возвращаем в то место куда тыкнули)

    Разница между между нажатием на верхнюю и нижнюю половину item сейчас у нас в том, что верхнее нажатие не меняет тайм-селекшн. А нижнее выставляет тайм селекшн по размеру item.

    3) Дальше все просто - создаем элементарный скрипт для проигрывания выделенных айтемов с их начала
    -move cursor to start of item
    -play

    И вещаем этот скрипт на что-то очень удобное и близкое к пробелу, например Alt+Space

    Вуаля! Теперь при любом выделении item наш курсор и точка зума и точка разрезки всегда соответствует месту нажатия мышкой. Но item выделяются целиком, и комбинация Alt-Space проигрывает их именно так, как мы и хотели. И даже выделение нескольких item с зажатым SHift можно прослушать через Alt+Space.

    PS
    У меня одного после горизонтального зума колесом мышки, через раз горизонтальный скролл или другие действия колесиком становятся неактивны пока не кликнешь в новое место курсором?
     

    Вложения:

  14. BlackWinter

    BlackWinter New Member

    Регистрация:
    29 июн 2012
    Сообщения:
    5
    Симпатии:
    2
    А вот теперь действительно серьезный вопрос, который видимо может решить только скрипт. Тема совсем другая, потому и новое сообщение.

    Мне нравится логика работы с submix шинами, начиная с того, что я привык к расположению сабмиксов ПОСЛЕ дорожек (а не ДО, как можно с помощью папки) и заканчивая тем, что в шину можно отправить несмежные трэки ( или несмежные шины)
    Вручную все это долго и неудобно, и я нашел скрипты на форуме такого рода (оставил только ключевые экшены, без покрасок и тд)

    Custom Actions for Submix:
    SWS: Disable master/parent send on selected track(s)
    SWS/S&M: Create cue buss from track selection, settings 03

    Custom Actions for Aux:
    SWS/S&M: Create cue buss from track selection, settings 03

    Проблема лишь в том, что даже SWS Cue Bus Generator не позволяет выбрать значение новосозданного Send. И задается оно один раз в настройках.
    Для создания сабмиксов/шин конечно значение сенда по умолчанию должно быть 0.0 Дб (чтобы весь сигнал шел постфейдерно в шину)
    Но нет ничего глупее и ужаснее чем созданный посыл на эффект при 0.0 дб, тонны ревера, и тд. Я предпочитаю добавлять эффект из полной тишины до необходимого едва заметного уровня.

    Итого - как сделать чтобы при создании шин сенды были ноль дб, а при создании aux посылов на эффекты сенды были -inf

    И если можно - сразу при запуске такого скрипта попросить ввести название шины/аукса, ведь в 99% случаев все равно мы будем давать название свеже созданному посылу.

    Спасибо!
     
  15. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    14.413
    Симпатии:
    7.261
    Пол:
    Мужской
    Адрес:
    Киев
    @BlackWinter, ваша просьба некоторым образом противоречит идеологии построения бусов в Рипере. Посему - врядли ещё кого-то заинтересует. Да и при ауксах сенды в - inf ставить а не в 0 dB спорное удобство, как по мне - все равно посылы на эффекты нужно отстраивать, так какая разница куда крутить фейдер.
    --- добавлено 19 дек 2017 ---
    Смысл того, что нужно чтоб происходило в общем то понятен.
    А без Shift- ЛКМ должна работать штатным образом?
     
  16. Supa75

    Supa75 Active Member

    Регистрация:
    21 мар 2017
    Сообщения:
    330
    Симпатии:
    64
    Пол:
    Мужской
    Адрес:
    Днепр, Украина
    В Кубе была такая полезная логическая функция, которая преобразует velocity миди-трека в огибающую volumе. Очень хочется заиметь такую фичу в Рипере в виде скрипта
    Типа выделил миди айтем, нажал скрипт, появилась огибающая громкости на миди-айтеме, а все ноты данного айтема получили velocity, равное 100 например.
     
  17. vitalker

    vitalker Well-Known Member

    Регистрация:
    8 окт 2013
    Сообщения:
    2.260
    Симпатии:
    832
    Адрес:
    Гродно
    дело не в модифаерах, а что-то с экшном не так. Или не дружит с мышкой. Прикол в том, что не работает ни этот экшн, ни тот, в начале которого "Set default mouse modifier action...", ни sws вариант, ни скриптовый. Видимо странный баг.
     
  18. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    14.413
    Симпатии:
    7.261
    Пол:
    Мужской
    Адрес:
    Киев
    @vitalker, я не о том что там не так с экшинами. Я опять о правильном тех задании.
    Как должна работать мышка с шифтом и без шифта?
     
  19. incubator

    incubator Active Member

    Регистрация:
    24 янв 2007
    Сообщения:
    277
    Симпатии:
    80
    Адрес:
    Spb
  20. vitalker

    vitalker Well-Known Member

    Регистрация:
    8 окт 2013
    Сообщения:
    2.260
    Симпатии:
    832
    Адрес:
    Гродно
    @Aleksandr Oleynik, это вопрос не ко мне, а к этим ребятам. :)
     
  21. Archchie

    Archchie Active Member

    Регистрация:
    24 окт 2017
    Сообщения:
    190
    Симпатии:
    31
    Пол:
    Мужской
    Привет всем! Есть просьба.
    Может кто сделать скрип ?Если не сложно.
    Remove items/tracks/envelope points (depending on focus) select next
    или
    Select next items/tracks/envelope points (depending on focus)
    Пытался кастом сделать, всю голову сломал,ничего не вышло
    Заранее Спасибо!
     
    Последнее редактирование: 20 дек 2017
  22. CerberPic

    CerberPic Member

    Регистрация:
    17 фев 2017
    Сообщения:
    34
    Симпатии:
    9
    Пол:
    Мужской
    Не помню уже, как в кубе, да и не припомнаю, чтобы пользовался этой функцией, но идея интересная. Попробую замутить, но чуть попозже, как время будет.
     
  23. Kokarev Maxim

    Kokarev Maxim ex cool

    Регистрация:
    13 май 2007
    Сообщения:
    3.696
    Симпатии:
    2.109
    Пол:
    Мужской
    Род занятий:
    freelance, mixing
    Адрес:
    Барнаул
    Ребята, помогите вспомнить название скрипта. Что-то вроде "smooth actions" или типа того. Скрипт ставился до и после списка кастом экшенов и уменьшал визуальные глюки работы экшенов. К примеру, бывают кастом экшены со сменой выделений или позиции курсора, которые в работе как бы мигают. После добавления этого скрипта в кастом экшн, его работа происходит визуально более гладко.
     
    Последнее редактирование: 22 дек 2017
  24. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    14.413
    Симпатии:
    7.261
    Пол:
    Мужской
    Адрес:
    Киев
    Kokarev Maxim нравится это.
  25. Kokarev Maxim

    Kokarev Maxim ex cool

    Регистрация:
    13 май 2007
    Сообщения:
    3.696
    Симпатии:
    2.109
    Пол:
    Мужской
    Род занятий:
    freelance, mixing
    Адрес:
    Барнаул
    Как оказалось, эти скрипты уже больше года как не работают - с обновления Рипера летом 2016. Есть вариант с созданием файлов вручную, что мне посоветовал автор (доступно по той же ссылке), но это не корректно работает с Cycle Actions, а именно, перестаёт работать команда toggle для отображения включения/выключения кнопок.
    В общем, забросил пока я эту затею
     
  26. Nordum

    Nordum Member

    Регистрация:
    28 окт 2016
    Сообщения:
    89
    Симпатии:
    10
    Пол:
    Мужской
    Есть два действия по навигации между маркерами Markers: "Go to next marker/project end" и "Markers: Go to previous marker/project end" (по дефолту вроде ] и [ ). В миди редакторе данные действия не работают, и не предусмотрены. Хотя маркеры там и отображаются, но присутствует функции перемещения только к началу или концу миди файла, т. е. чтобы не закрывая редактор перепрыгнуть между маркерами, нужно для начала зафокусить главное окно арранжа, а потом обратно миди редактор. Осмелится кто сделать пару скриптов для этих действий внутри миди редактора? если это позволяет API конечно.
    Нужно чтобы при воспроизведении оно не останавливалось а продолжало воспроизводить с соответствующего маркера, как в дефолтных функциях для арранжа, а при паузе просто перемещало курсор.
     
  27. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    14.413
    Симпатии:
    7.261
    Пол:
    Мужской
    Адрес:
    Киев
    @Nordum, эта тема уже ни раз поднималась, поищите.
    Есть Экшин, который можно использовать для того, чтобы из миди эдитора работали любые команды Мэйн раздела без выхода из миди эдитора.
    Я не помню что это за экшин, найду - дам ссылку.
    Вот - http://rmmedia.ru/threads/49259/page-2#post-2078587

    MainComand in Midi Edit.gif
     
    Последнее редактирование: 25 дек 2017
    Nordum нравится это.
  28. Nordum

    Nordum Member

    Регистрация:
    28 окт 2016
    Сообщения:
    89
    Симпатии:
    10
    Пол:
    Мужской
    @Aleksandr Oleynik, Вот спасибо ! а я уже думал экспортировать команды между листами ). хитро
     
  29. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    14.413
    Симпатии:
    7.261
    Пол:
    Мужской
    Адрес:
    Киев
    @Nordum, FAQ ведь не очень большой - можно было бы его и почитать.
     
  30. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    14.413
    Симпатии:
    7.261
    Пол:
    Мужской
    Адрес:
    Киев
    @Archchie, так в вами же созданной ветке это обсуждать нужно, а не тут.
     
  31. Buyan

    Buyan Member

    Регистрация:
    19 апр 2016
    Сообщения:
    80
    Симпатии:
    12
    Пол:
    Мужской
    Род занятий:
    Хобби: Гитара, Флейта, Звукорежиссура.
    Адрес:
    Белая Церковь
    С Новым Годом!!!

    Друзья, помогите понять суть происходящего и как с этим "дальше жить".
    В общем имеется простенький пример lua-скрипта, там все видно и понятно. Суть в том, что вроде логичное и простое равенство, в первом случае, оказывается по непонятным мне причинам неверным.
    PHP:

    local var1 
    4.8
    local var2  
    7.2 2.4
    reaper
    .ShowConsoleMsg("var1= "..var1.."\n")
    reaper.ShowConsoleMsg("var2= "..var2.."\n")
    reaper.ShowConsoleMsg("\n")
    reaper.ShowConsoleMsg("var "..var1.." - "..var2.." = "..var1 var2  .."\n")
    reaper.ShowConsoleMsg("var "..var1.." - "..var2.." = "..var1 tonumber(tostring(var2))  .."\n\n")

    local var2  9.6 4.8
    reaper
    .ShowConsoleMsg("var1= "..var1.."\n")
    reaper.ShowConsoleMsg("var2= "..var2.."\n")
    reaper.ShowConsoleMsg("\n")
    reaper.ShowConsoleMsg("var "..var1.." - "..var2.." = "..var1 var2  .."\n")
    Вывод на экран:
    Код:
    var1= 4.8
    var2= 4.8
    
    var 4.8 - 4.8 = -8.8817841970013e-016
    var 4.8 - 4.8 = 0.0
    
    var1= 4.8
    var2= 4.8
    
    var 4.8 - 4.8 = 0.0
    
    Проводя вычисления, временами получал незакономерный результат, полночи поэтапно проверял свою формулу на предмет ошибки, но натолкнулся на совершенно неожиданный для меня вывод. Хотя всем переменным с числами устанавливал числовой тип принудительно еще на самых первых этапах дэбага своего скрипта. С чего сделал вывод впоследствии, что проблема кроется скорее всего не в "несоответствии типа данных переменной". Хотя преобразование значения в строку с последующим преобразованием обратно в число, проблему решает. Но мне даже страшно представить, как прогонять каждое полученное на каждом этапе вычислений число сначала в строку потом обратно в число. Это было бы очень неудобно. Возникает подозрения, что где-то в глубинах мозгов интерпретатора lua, результат разницы 7.2 - 2.4 представляет из себя какое-то бинарное число с большим количеством знаков, которое при выводе на экран округляется и представляется в "правильном виде" (так как преобразуется в строковый тип в процессе вывода), а при участии в вычислениях проявляет "свою скрытую сущность".
    Но я в этом не сильно понимаю, поэтому прошу советов, как с этим всем обходится?
    Или проводить вычисления в десятичном формате представления чисел, сама по себе идея неразумная?
    У кого какие мысли на этот счет?
     
  32. Aleksandr Oleynik

    Aleksandr Oleynik Well-Known Member

    Регистрация:
    16 янв 2007
    Сообщения:
    14.413
    Симпатии:
    7.261
    Пол:
    Мужской
    Адрес:
    Киев
    @Buyan, смотря для чего нужны вычисления....
     
  33. Alex_V

    Alex_V Active Member

    Регистрация:
    12 апр 2017
    Сообщения:
    153
    Симпатии:
    65
    Пол:
    Мужской
    То, на что вы нарвались связано с тем, как хранятся вещественные числа в памяти компьютера (не только интерпретатора Lua). Проблема в том, что не все вещественные числа можно представить в двоичном виде точно. Отсюда и возникает разница. Бороться с ней - ну вот примерно так, как вы и написали, через преобразование в строки, там происходит округление до какого-то знака. Вот тут нашел парочку готовых функций для округления до определенного знака: http://lua-users.org/wiki/SimpleRound
     
  34. EUGEN27771

    EUGEN27771 Well-Known Member

    Регистрация:
    23 апр 2010
    Сообщения:
    2.194
    Симпатии:
    1.838
    Пол:
    Мужской
    @Alex_V, бороться с ней вообще не нужно, нужно считать как есть.
    Ошибка проявится только при округлении. Например 64 до 32.
    Тут проблема вывода на экран.
    Конечно, причем оно по разному ведет себя на разных системах.
    Писал об этом примерно давно уже. Вот такую штуку сделал - работает безотказно на Вин и на Мак.
    Это только для адекватного округления в обеих системах.
    //----------------------------
    function smval(val)
    local(smidge)
    (
    //try fix osx sprintf round
    smidge = 2 ^ -52;
    val + smidge*val;
    );
     
    Buyan нравится это.
  35. Alex_V

    Alex_V Active Member

    Регистрация:
    12 апр 2017
    Сообщения:
    153
    Симпатии:
    65
    Пол:
    Мужской
    Не только, еще и при сравнении. А еще про машинное эпсилон можно вспомнить.
     
  36. EUGEN27771

    EUGEN27771 Well-Known Member

    Регистрация:
    23 апр 2010
    Сообщения:
    2.194
    Симпатии:
    1.838
    Пол:
    Мужской
    В каком случае?
     
  37. Alex_V

    Alex_V Active Member

    Регистрация:
    12 апр 2017
    Сообщения:
    153
    Симпатии:
    65
    Пол:
    Мужской
    Да вот прям в приведенном. Если после строки
    Код:
    local var2 = 7.2 - 2.4
    var1 и var2 сравнить, то они не равны.
     
  38. EUGEN27771

    EUGEN27771 Well-Known Member

    Регистрация:
    23 апр 2010
    Сообщения:
    2.194
    Симпатии:
    1.838
    Пол:
    Мужской
    Напишите пару строк - не верю. Я не смотрел толком, но не верю.
    Короче, считайте как есть, никогда не ошибетесь. Вывод на экран является условным(32 наверное). Ф-и sprintf и тп - тоже системнозависимы, и 32.
    Возможно, если от типа intenger отнять/прибавить number - будут песни - но это же не Lua виноват.
     
    Buyan нравится это.
  39. Alex_V

    Alex_V Active Member

    Регистрация:
    12 апр 2017
    Сообщения:
    153
    Симпатии:
    65
    Пол:
    Мужской
    Вы можете, конечно, в это не верить, но это есть факт. Пример - да легко. Проверялся тут: https://www.lua.org/cgi-bin/demo (в рипере будет то же самое, но наверное print надо заменить. Впрочем, в это можете тоже не верить. Фактов это не поменяет. :)
    Код:
    var1 = 4.8
    var2  = 7.2 - 2.4
    if var1 == var2 then
     print("equal")
    else
     print(var1-var2)
    end
    
     
  40. EUGEN27771

    EUGEN27771 Well-Known Member

    Регистрация:
    23 апр 2010
    Сообщения:
    2.194
    Симпатии:
    1.838
    Пол:
    Мужской
    var1 = 4.8
    var2 = 7.2 - 2.4
    if var1 == var2 then reaper.ShowConsoleMsg("OK") end
    ============================================
    Да, я ошибаюсь. И здесь. Проверил сам.
     
  41. EUGEN27771

    EUGEN27771 Well-Known Member

    Регистрация:
    23 апр 2010
    Сообщения:
    2.194
    Симпатии:
    1.838
    Пол:
    Мужской
    Ну давайте - предположу - не строго - если они не знают - откуда намю/
    Я долго копал- фигня/ Скажите мне- как переводим целое число>>>>> 32787 - 0 - - 327678 - в нормализованное
    Общий 65536
     
  42. EUGEN27771

    EUGEN27771 Well-Known Member

    Регистрация:
    23 апр 2010
    Сообщения:
    2.194
    Симпатии:
    1.838
    Пол:
    Мужской
    Это все фигня
    Я только что - умышленно - раздолбал комп. Снял второй диск - там большая часть информации.
    Я забыл - на рабочем осталось 3 Рипера с кучей тестовых скриптов, JS там почти нет, скрипты перепишу - что - гулять так гулять?
    Единственное, там очень много текстов с разъяснениями - но мне они :).
    А вообще классно, так спонтанно и усе
     
    keyboarder нравится это.
  43. Alex_V

    Alex_V Active Member

    Регистрация:
    12 апр 2017
    Сообщения:
    153
    Симпатии:
    65
    Пол:
    Мужской
    Так, на всякий случай.
    Код:
    function PrintNumber(num)
    reaper.ShowConsoleMsg(string.format("%.20f", num).."\n")
    end
    
    
    PrintNumber(4.8)
    PrintNumber(7.2)
    PrintNumber(2.4)
    PrintNumber(7.2-2.4)
    
    Результат:
    Код:
    4.79999999999999980000
    7.20000000000000020000
    2.39999999999999990000
    4.80000000000000070000
    
     
    Buyan нравится это.
  44. Supa75

    Supa75 Active Member

    Регистрация:
    21 мар 2017
    Сообщения:
    330
    Симпатии:
    64
    Пол:
    Мужской
    Адрес:
    Днепр, Украина
    Подскажите плиз. Когда то скачал в репаке уважаемого @Michael скрипт Script: mpl_Solo MIDI Editor active take track.lua. Установил данный скрипт на кнопку в MIDI editor.
    Вопрос: Что нужно добавить в скрипте или где еще, чтобы при нажатии на эту кнопку (включение режима "соло") - она горела, а при выключении соотв. гасла.
     
    Archchie нравится это.
  45. Buyan

    Buyan Member

    Регистрация:
    19 апр 2016
    Сообщения:
    80
    Симпатии:
    12
    Пол:
    Мужской
    Род занятий:
    Хобби: Гитара, Флейта, Звукорежиссура.
    Адрес:
    Белая Церковь
    Пытаюсь исследовать явления переменного темпа, если вкратце.
    В данном случае просто пытался проверить простое равенство(подобных которому у меня много всяких разных было выведено в процессе исследования вопроса) на предмете в реальных условиях.
    Вот пример:
    PHP:

    local Find_TSM_At_Pos 
    = function(Pos) if reaper.FindTempoTimeSigMarker(0,Pos) ~= reaper.FindTempoTimeSigMarker(0,Pos-0.000001then return reaper.FindTempoTimeSigMarker(0,Pos) else return -1 end end
    local MsPos 
    reaper.BR_PositionAtMouseCursor(1)

    function 
    GetTSM(num)
      
    local t = {}
      
    t.numt.retvalt.timepost.measurepost.beatpost.bpmt.timesig_numt.timesig_denomt.lineartempo numreaper.GetTempoTimeSigMarker0num )
      
    t.QNpos reaper.TimeMap_timeToQN_abs0t.timepos )*60
      
    return t
    end

    local Find_TSM_At_Pos 
    = function(Pos) if reaper.FindTempoTimeSigMarker(0,Pos) ~= reaper.FindTempoTimeSigMarker(0,Pos-0.000001then return reaper.FindTempoTimeSigMarker(0,Pos) else return -1 end end
    local MsPos 
    reaper.BR_PositionAtMouseCursor(1)
    function 
    Find_Clst_TSM(Pos)
      
    local LeftRight
      local Denom  
    = function(f) if 0 then return else return math.huge end end
      Left 
    reaper.FindTempoTimeSigMarker(0,Pos)
      
    Right Find_TSM_At_Pos (reaper.TimeMap2_GetNextChangeTime0Pos ))
      if 
    Left >= 0 then
      
    if Pos <= ((GetTSM(Left).timepos GetTSM(Right).timepos) / Denom(Left)) or Right <= Left then return Left else return Right end
      
    else return -1 end
    end


    --------------------------------------------------------------------------------------------------------------------

    if 
    MsPos ~= -1 then
      local TSM 
    = {}
      
    TSM[0]  = GetTSM(Find_Clst_TSM(MsPos))
      
    TSM[1]  = GetTSM(TSM[0].num+1)
      
    TSM[2]  = GetTSM(TSM[0].num+2)

      if 
    TSM[0].lineartempo or TSM[1].lineartempo or TSM[2].lineartempo then

      local test 
    = (TSM[0].bpm+TSM[1].bpm+TSM[2].bpm) /- (TSM[2].QNpos-TSM[0].QNpos)  / (TSM[2].timepos-TSM[0].timepos)
      
    reaper.ShowConsoleMsg("("..TSM[0].bpm.." + "..TSM[1].bpm.." + "..TSM[2].bpm..") /3 - ("..TSM[2].QNpos.." - "..TSM[0].QNpos..")  / ("..TSM[2].timepos.." - "..TSM[0].timepos..") = "..test.."\n\n" )
      
    end
    end
    LUA, я только начал учить недавно, но пока времени на это дело удается вырвать к сожалению не более пары часов в неделю. В данных условиях обнаружение подобных "подводных камней" приводят в растерянность.
     
  46. Alex_V

    Alex_V Active Member

    Регистрация:
    12 апр 2017
    Сообщения:
    153
    Симпатии:
    65
    Пол:
    Мужской
    Ну, собственно, я что-то такое и предполагал. Потому, что сравнение - это как раз ситуация, где на эти особенности представления чисел можно нарваться. Причина неравенства двух чисел там, где по-хорошему они должны быть равны в том, что может производится сравнение двух неточных чисел, которые получены в результате операции над другими неточными числами. Собственно, округление до определенного знака после запятой оставит эти числа неточными, но они станут неточными одинаково.

    И да, это не баг, это фича такая у floating point представления чисел.
     
  47. Alex_V

    Alex_V Active Member

    Регистрация:
    12 апр 2017
    Сообщения:
    153
    Симпатии:
    65
    Пол:
    Мужской
    Нет, это обусловлено самой системой хранения данных. Как я уже сказал, не все числа могут быть представлены точно. Но некоторые - могут. Ну, например, с дробной частью вида x.5, x.75, x.875 и т.д. Это те числа, где дробная часть может быть точно выражена при помощи суммирования двоек в отрицательной степени. Ну вот то есть 0.5 = (2^-1); 0.75 = 2(2^-1) + (2^-2); 0.875 = 2(2^-1) + (2^-2) + (2^-3); (^ - возведение в степень). Количество слагаемых зависит от того, какой тип данных выбран для хранения. Все, что не может быть выражено точно - выражается при помощи таких же слагаемых приблизительно. Это все довольно упрощенное объяснение, на деле все несколько сложнее. Если нужно подробное:
    https://ru.wikipedia.org/wiki/Число_с_плавающей_запятой
    https://ru.wikipedia.org/wiki/Число_двойной_точности

    Да, там где нужны вычисления и преобразования без потери точности, например, для финансовых расчетов, используются другие форматы хранения вещественных чисел, например BCD: https://ru.wikipedia.org/wiki/Двоично-десятичный_код
     
  48. Buyan

    Buyan Member

    Регистрация:
    19 апр 2016
    Сообщения:
    80
    Симпатии:
    12
    Пол:
    Мужской
    Род занятий:
    Хобби: Гитара, Флейта, Звукорежиссура.
    Адрес:
    Белая Церковь
    @Alex_V, Спасибо! Пошел курить матчасть.

    Вот об этом я тоже вспомнил. Когда-то давно пробовал програмировать на асемблере, еще во времена MS-DOS. Помню, что дроби в машинном коде хранятся и обрабатываются в формате целых чисел или целочисленных выражений(не знаю как правильно обозвать). То-есть машина вычисляет разницу 7.2 - 2.4 также как разницу 72 - 24 и не видит между ними разницы, результат первой только впоследствии предоставляется в виде выражения - результат умножен на 10^-1. Вот это я понимаю под системой хранения и предоставления данных.

    В каком формате мне работать с числами в LUA, чтобы в приведенном мной примере (4.8-7.2-2.4) было достаточно точности что-бы получить хотя-бы 0,0000пофигпофигпофиг.
    В этом-то и была изначальная суть моего вопроса.
     
    Последнее редактирование: 9 янв 2018
  49. Alex_V

    Alex_V Active Member

    Регистрация:
    12 апр 2017
    Сообщения:
    153
    Симпатии:
    65
    Пол:
    Мужской
    В Lua есть только один формат чисел, хранится в виде floating point. То есть вариантов нет, от слова совсем. Единственное, что можно тут посоветовать вместо сравнения двух нецелых чисел сравнивать их разницу, взятую по модулю с неким малым значением и если разница меньше этого значения, считать числа равными. Это будет по вычислениям дешевле, чем округление через преобразование в строку.
    --- добавлено 9 янв 2018 ---
    До кучи.
    Машина работает с теми данными которые ей предоставляются, то есть сама по себе она ничего не делает. Другое дело, что в языках высокого уровня могут быть типы данных для которых неявно для пользователя делается умножение чисел на один-два порядка. Но в lua такого нет.
     
  50. Buyan

    Buyan Member

    Регистрация:
    19 апр 2016
    Сообщения:
    80
    Симпатии:
    12
    Пол:
    Мужской
    Род занятий:
    Хобби: Гитара, Флейта, Звукорежиссура.
    Адрес:
    Белая Церковь
    Да, я понял суть вопроса. Спасибо!
    Проблема в моей невнимательности и округленном выводе на экран. На практике-же это отклонение оказалось совершенно ничтожным и ни на что не влияющим. Формулы работают как надо.

    @Alex_V, Спасибо за полезные ссылки и разъяснения. В голове все вроде потихоньку становится на свои места.

    Еще раз спасибо всем за участие!
    Это все азы конечно-же, но для гуманитариев некоторые из них, как открытие Америки)
     

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