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

  • Автор темы Автор темы drzhnn
  • Дата начала Дата начала
нет, это способ приостановить вычисления, когда нужно и возобновить, когда нужно
Я читаю из описания -
Lua поддерживает подпрограммы, эту технологию часто называют общей многопоточностью. Подпрограмма Lua представляет собой независимый поток выполнения. Несмотря на это, в отличие от потоков в традиционных многопоточных системах, подпрограмма может приостановить свое выполнение только в результате явного вызова функции yield.
А то, что приостановить - тоже видимо в каких-то ситуациях нужно.
 
@Aleksandr Oleynik, ну я читал и из других источников...не спорю, я предполагаю только, пока без оснований, не пробовал.
Меня интересует пока только прорисовка. Я знаю, как действует Рипер - он создает peak-файл, в котором форма волны описана в нескольких(в трех) разрешениях.
В принципе, я бы смог вычитать его файл(опять же, не знаю насколько быстро), но я хочу использовать трек-акцессор(то есть, любое аудио на участке времени на треке,будь то сэмплы, лупы и тп). Мысль моя такая - хрень(если она воплотится) должна работать практически незаметно - то есть слайдер двинул, отпустил - видишь результат.
Это не так уж и сложно - все, что 200-300 мс мы воспринимаем как реал-тайм в действии. А если больше,чем 500 - уже воспринимается как тормоза.
Все вычислительные процессы я подвел к этому времени +/- . Но прорисовку приходится упрощать из-за этого. Некрасиво выглядит. Но что-то придумаю все-равно.
 
  • Like
Реакции: Aleksandr Oleynik
@EUGEN27771, оч полезная инфа, всегда любил оптимизировать) Найти бы более полный перечень таких фишек. Даже пришло в голову написать скрипт - оптимизатор скриптов (на входе получает fn скрипта, на выходе создает оптимизированный вариант (с заменой x^x на x*x и тд)). Сюда же можно добавить оптимизацию размера скрипта (напр. сокращение длинных переменных, удаление лишних пробелов, удаление неиспользуемых переменных и тд)
 
@lil-burn, ну это только на больших циклах видно. Если такого нет - то важнее читаемость кода. Тут нет никакой разницы - выполнится действие за минусстопитцот секунд или в два раза медленнее. Вы попробуйте из акцессора пару минут обработать - вот там разница уже существенная, счет начинается на секунды(если можно так говорить в привязке к старому процессору) . Я потому и написал, что может кому-то пригодится на будущее, я ведь не программист и этого не знал, хотя встречал часто и догадывался.
А по локализации стандартных функций lua - это вообще непонятно, но сверхэффективно.
Там есть объяснение, он под одну лок. переменную выделяет в три раза меньше "регистров"(условных регистров, не реальных), чем под глобальную...это как я понял, так и объяснил, может неправильно, но факт, что оно на 30% быстрее проверен.
 
  • Like
Реакции: lil-burn
Кстати, если кому не трудно, запустите вот это тест и покажите результаты -
PHP:
--[[-------------------------------------
-- TEST 1 -----------------------------
---------------------------------------
local start_time = reaper.time_precise()
for i = 1, 2000000 do
   local x = math.sin(i)
end
reaper.ShowConsoleMsg("Processing time = ".. reaper.time_precise()-start_time ..'\n') -- time test
--runs 30% slower than this one:
-------------------------------
local start_time = reaper.time_precise()
local sin = math.sin
for i = 1, 2000000 do
local x = sin(i)
end
reaper.ShowConsoleMsg("Processing time = ".. reaper.time_precise()-start_time ..'\n') -- time test--]]
---------------------------------------
-- TEST1 ------------------------------
---------------------------------------
----------------
local start_time = reaper.time_precise()
local x = 0
for i = 1, 2000000 do
    x = x + math.sqrt(i)
end
X1 = x
reaper.ShowConsoleMsg("Processing time = ".. reaper.time_precise()-start_time ..'\n') -- time test
----------------
local start_time = reaper.time_precise()
local x = 0
for i = 1, 2000000 do
    x = x + i^0.5
end
X2 = x
reaper.ShowConsoleMsg("Processing time = ".. reaper.time_precise()-start_time ..'\n') -- time test
----------------
local start_time = reaper.time_precise()
local x = 0
local sqrt = math.sqrt
for i = 1, 2000000 do
    x = x + sqrt(i)
end
X3 = x
reaper.ShowConsoleMsg("Processing time = ".. reaper.time_precise()-start_time ..'\n') -- time test
---------------------------------------
-- TEST 2 -----------------------------
---------------------------------------
----------------
local start_time = reaper.time_precise()
local x = 0
for i = 1, 2000000 do
    x = x + math.sqrt(i)
end
X1 = x
reaper.ShowConsoleMsg("Processing time = ".. reaper.time_precise()-start_time ..'\n') -- time test
----------------
local start_time = reaper.time_precise()
local x = 0
for i = 1, 2000000 do
    x = x + i^0.5
end
X2 = x
reaper.ShowConsoleMsg("Processing time = ".. reaper.time_precise()-start_time ..'\n') -- time test
----------------
local start_time = reaper.time_precise()
local x = 0
local sqrt = math.sqrt
for i = 1, 2000000 do
    x = x + sqrt(i)
end
X3 = x
reaper.ShowConsoleMsg("Processing time = ".. reaper.time_precise()-start_time ..'\n') -- time test
Ну, хотя бы пару человек, протестируйте, пожалуйста. Может иные результаты выйдут.
 
Последнее редактирование:
Processing time = 0.096143622875388
Processing time = 0.058177358452667
Processing time = 0.085260122021282
Processing time = 0.090808057942922
Processing time = 0.058316662896686
Processing time = 0.055487895024271
 
@Aleksandr Oleynik, спасибо, если запускать еще - результаты не меняются?
В общем, Вы можете и для себя проверить - по-разному растасовать, поставить итераций больше и тп, думаю, Вам это тоже будет интересно...
 
Последнее редактирование:
Меняются -
Processing time = 0.087035229342291
Processing time = 0.058218671776558
Processing time = 0.057509858008416
Processing time = 0.086489961715415
Processing time = 0.05829993270163
Processing time = 0.059582352994767

Processing time = 0.090475844164757
Processing time = 0.058205355915561
Processing time = 0.069129828665609
Processing time = 0.097402484330814
Processing time = 0.058064344309969
Processing time = 0.056714661826845

Processing time = 0.088460368398955
Processing time = 0.059501433501282
Processing time = 0.070528677424591
Processing time = 0.087880616094481
Processing time = 0.059816575660079
Processing time = 0.059365884819272

Processing time = 0.092142375964613
Processing time = 0.05831939435302
Processing time = 0.065721649923944
Processing time = 0.089369603021623
Processing time = 0.05816540831438
Processing time = 0.055389221048245

Processing time = 0.095027480190765
Processing time = 0.058630097882997
Processing time = 0.063154419312923
Processing time = 0.091816990840016
Processing time = 0.05838699798187
Processing time = 0.055190848790517
 
Последнее редактирование:
Однако, закономерно, что первый - самый долгий вариант в любом случае! Это хорошо:). Почему хорошо - понятно. В случае с секундами - это, например, 5 против 9 и тп.
Желательно еще пару результатов с других компов. Но, думаю Иерусалимски не зря писал - он же это и делал...
[DOUBLEPOST=1467896030][/DOUBLEPOST]У меня вот:
Processing time = 0.19403094344307
Processing time = 0.17286447063088
Processing time = 0.13150242716074
Processing time = 0.19058722129557
Processing time = 0.17276839981787
Processing time = 0.13121267023962
==============
Processing time = 0.18671689531766
Processing time = 0.17491099541076
Processing time = 0.13116293586791
Processing time = 0.18865561089478
Processing time = 0.17170266225003
Processing time = 0.13217028940562
и т.д.
Но я знаю, комп слабоват, и пару приложений просто не могу сейчас выключить.
Однако, я выберу последний вариант.
 
Я не понимаю почему значения первого теста отличаются от второго, хотя функции идентичные?
 
@EUGEN27771,
Processing time = 0.15269594952042
Processing time = 0.090658313434687
Processing time = 0.092548961200009
Processing time = 0.15453943193643
Processing time = 0.089636190716192
Processing time = 0.092966933058051


@EUGEN27771, вот допустим получаю уровень тейка:
vol = reaper.GetMediaItemTakeInfo_Value(take, 'D_VOL').
переменная delta получает число в децибелах, на которое надо поднять уровень тейка:
reaper.SetMediaItemTakeInfo_Value(take, 'D_VOL', new_vol).
как вычислить new_vol, зная vol и delta?
 
  • Like
Реакции: EUGEN27771
как сделать скрипт Set volume to track 1 (MIDI CC/OSC)?
К примеру
Код:
local n = 1

function nothing() end reaper.defer(nothing)

local _,_,_,_,_,resolution,val = reaper.get_action_context()

local tr = reaper.GetTrack(0,n-1)
if tr then
  reaper.SetMediaTrackInfo_Value(tr, 'D_VOL', 4*val/resolution)
end

Работает криво по сравнению с риперовским Set Volume for track 01 (MIDI CC/OSC only), скорей всего там какая-то нелинейная формула
 
Вопрос к спецам по звуку:
В таблично-волновых синтах используются вавки с сотнями волнами... Можно ли как-то разобрать вавку на отдельные волны или например редактировать одну избранную волну?
[DOUBLEPOST=1468625452][/DOUBLEPOST]Если у кого есть материалы для чтения по разбору вавок на составляющие буду очень благодарен!
 
@EUGEN27771, хм, с точки сложения и вычитания волн я не смотрел, спасибо за подсказку.
Тогда может можете подсказать как можно написать генератор таких таблиц? Я в синтезаторе Tone2 nemesis наблюдал аддективный редактор, в котором каждая волна просто рисуется мышей и к ним можно применять какие-то функции. Увы подробно объяснить немогу так как с dsp только сейчас начал разбираться и пока в теории разбираюсь, а на практике ковыряю csound)))
 
  • Like
Реакции: stepperian
Кто-то бы попробовал хотя бы этот триггер - может это у меня он так настраивается быстро - я с ним вожусь уже оч. долго - и привык просто.
Женя, я попробовал - очень круто даже сейчас!

В атаче результат - Оригинал и подставленная библиотека.
EUGEN_Triger001.png

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

На мой взгляд - инструмент уже вполне рабочий!
Эхххххххххх - еслиб это можно было в Риалтайме делать......, ну хотя-бы 64 spl
Естественно с JS
 

Вложения

  • Like
Реакции: naash_g и Oliver_Cray
Естественно, это все элементарно, сделаю сходу, важнее всего, как само определение работает, хотя его тоже можно подстроить.
Что касается нот - по умолчанию нужно бы сделать по мапингу самых популярных драм сэмплеров, того-же EZ_Dramer-а. Ну и дать возможность переназначить.
По велосити - может сделать что-то типпа MIDI Компрессии - слайдер - который и визуально в GUI бы точки велосити слабых сигналов прибоднимал?

И ещё - не знаю как, но было-бы круто сделать подобие ОнЛайн прослушки результата без экспорта нот.

Само определение работает на мой взгляд отлично!
 
  • Like
Реакции: Oliver_Cray
А чем плох встроенный JS триггер?
Да ни чем не плох. Но не всегда адекватно отсекает проникшие с других барабанов звуки, не всегда придробки читает нормально - настроить не возможно адекватно.
Да и midi чтоб получить - нужно запись пользовать.
Не видно что происходит при настройке.
[DOUBLEPOST=1468656822][/DOUBLEPOST]
Это возможно для определения самого удара, но как велосити взять за это время? Тут минимум 1-2 мс для самых простых барабанов.
Но JS ведь существующий как-то это делает (согласен - плохо :( )
[DOUBLEPOST=1468656866][/DOUBLEPOST]
В общем - это единственный супер-масштабный плюс (мы видим все и сразу), ради которого игра и стоит свеч
ДА! Но не единственный!
 
Я понимаю, что этап пройден и дальше уже не интересно :)
Но всё-же, может доведёшь до конца два инструмента -
- Скрипт с не риалтайм но классным алгоритмом определения велосити
- и JS - с той-же визуализацией при отстройке и двумя режимами - с таким-же Не Риалтаймом и упрощённый с Риал Таймом.
?????????????????????????????
 
@EUGEN27771, работает. А почему в тестовом не оставили выбора gate? С визуализацией хотелось бы чтобы плей-курсор в скрипте и arrange не только синхронизировались, а ешё и волна перескакивала, ну то есть, чтобы всегда было видно волну. Потом, хотелось бы скроллить, пока можно только зумить. + Нужен зум по вертикали -- я привык работать с небольшими уровнями исходников, в скрипте сейчас волна очень маленькая. Хотелось бы возможность стирать одним лёгким драгом ненужные ноты. Вот например, у меня все определилось, но из-за этих протечек срабатывает там где не надо, а подкрутишь сенсивити или трешхолд - не сработает там где надо. Хотя вот фильтр гейн подкрутил - всё стало хорошо.)
+ всё что написал Александр - актуально. Выбор ноты обязателен.) Вручную на велосити тоже нужно обязательно влиять и корректировать.
И пока всё чуть задумчиво работает, хотя и понятно почему.

п.с. Не думайте бросать ничего.) Это капец как надо и полезно в повседневных и "незадротских" реальных задачах. Ешё я вам оставлял пожелания к диессеру, вы забросили его?) Это же тоже бомбовый скрипт.
 

Вложения

  • 334.png
    334.png
    82,8 KB · Просмотры: 103
  • Like
Реакции: EUGEN27771
То есть вид Рипера перемещался по курсору? Да, хорошая мысль, это возможно.
Так тоже можно, но отключаемо. А я имел в виду, чтобы: переставил курсор в рипере, а в скрипте не только передвинулся курсор, но и сам вид к курсору и волне в том месте тоже передвинулся. Ну, то есть, назумился на начало длинной дорожки, потом раз, и понадобилось быстро в конец перейти в таком же зуме.

он очень легко перекроет тот диэссер
Ну это прям супер-комбайн получится. Даже не знаю, как можно было бы назвать такой прибор.)

уже выжал все, что можно из него
Ведь потом он будет работать на длинных дорогах? Сейчас я выделял итем минуты в полторы, и он вроде бы весь не отрисовался в скрипте.
 
@EUGEN27771, насчет пожеланий уже вроде все интересующее меня озвучили, а вот как измерить время выполнения я не знаю.
 
45 секунд Снейра у меня на компе в крайних режимах скорости прорисовки -
Filter time = 1.6988676055116
Filter time = 0.66103485409258
 
  • Like
Реакции: EUGEN27771
Medium1
Filter time = 0.92778435730725
Filter time = 0.88242701586569
Filter time = 0.88502672799223
Filter time = 0.89176377360127
Filter time = 0.87637232082488
Filter time = 0.88431731976743

На глаз, по сравнению с первой версией гораздо быстрее. (i3 3.3GHz)
[DOUBLEPOST=1468784341][/DOUBLEPOST]Very fast
Filter time = 0.58772372329258
Filter time = 0.59117559611332
Filter time = 0.56133286640397
[DOUBLEPOST=1468784377][/DOUBLEPOST]Very slow
Filter time = 2.3477418985567
Filter time = 2.3412076298846
Filter time = 2.3244191311969
Filter time = 2.3030896112323
 
  • Like
Реакции: EUGEN27771

Сейчас просматривают