Помогите создать экшн / кастом экшн / скрипт (3 онлайн)

vitalker

Well-Known Member
8 Окт 2013
5.085
2.195
113
Гродно
А без Shift- ЛКМ должна работать штатным образом?
дело не в модифаерах, а что-то с экшном не так. Или не дружит с мышкой. Прикол в том, что не работает ни этот экшн, ни тот, в начале которого "Set default mouse modifier action...", ни sws вариант, ни скриптовый. Видимо странный баг.
 

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.063
113
62
Киев
@vitalker, я не о том что там не так с экшинами. Я опять о правильном тех задании.
Как должна работать мышка с шифтом и без шифта?
 

CerberPic

Member
17 Фев 2017
70
22
8
35
В Кубе была такая полезная логическая функция, которая преобразует velocity миди-трека в огибающую volumе. Очень хочется заиметь такую фичу в Рипере в виде скрипта
Типа выделил миди айтем, нажал скрипт, появилась огибающая громкости на миди-айтеме, а все ноты данного айтема получили velocity, равное 100 например.
Не помню уже, как в кубе, да и не припомнаю, чтобы пользовался этой функцией, но идея интересная. Попробую замутить, но чуть попозже, как время будет.
 

Kokarev Maxim

ex cool
13 Май 2007
5.275
4.372
113
44
Барнаул
recording-studio.ru
Ребята, помогите вспомнить название скрипта. Что-то вроде "smooth actions" или типа того. Скрипт ставился до и после списка кастом экшенов и уменьшал визуальные глюки работы экшенов. К примеру, бывают кастом экшены со сменой выделений или позиции курсора, которые в работе как бы мигают. После добавления этого скрипта в кастом экшн, его работа происходит визуально более гладко.
 
Последнее редактирование:

Kokarev Maxim

ex cool
13 Май 2007
5.275
4.372
113
44
Барнаул
recording-studio.ru
Как оказалось, эти скрипты уже больше года как не работают - с обновления Рипера летом 2016. Есть вариант с созданием файлов вручную, что мне посоветовал автор (доступно по той же ссылке), но это не корректно работает с Cycle Actions, а именно, перестаёт работать команда toggle для отображения включения/выключения кнопок.
В общем, забросил пока я эту затею
 

Nordum

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

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.063
113
62
Киев
@Nordum, эта тема уже ни раз поднималась, поищите.
Есть Экшин, который можно использовать для того, чтобы из миди эдитора работали любые команды Мэйн раздела без выхода из миди эдитора.
Я не помню что это за экшин, найду - дам ссылку.
Вот - http://rmmedia.ru/threads/49259/page-2#post-2078587

MainComand in Midi Edit.gif
 
Последнее редактирование:
  • Like
Реакции: Nordum

Buyan

Member
19 Апр 2016
137
24
18
40
Белая Церковь
С Новым Годом!!!

Друзья, помогите понять суть происходящего и как с этим "дальше жить".
В общем имеется простенький пример 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 представляет из себя какое-то бинарное число с большим количеством знаков, которое при выводе на экран округляется и представляется в "правильном виде" (так как преобразуется в строковый тип в процессе вывода), а при участии в вычислениях проявляет "свою скрытую сущность".
Но я в этом не сильно понимаю, поэтому прошу советов, как с этим всем обходится?
Или проводить вычисления в десятичном формате представления чисел, сама по себе идея неразумная?
У кого какие мысли на этот счет?
 

Alex_V

Active Member
12 Апр 2017
484
231
43
У кого какие мысли на этот счет?
То, на что вы нарвались связано с тем, как хранятся вещественные числа в памяти компьютера (не только интерпретатора Lua). Проблема в том, что не все вещественные числа можно представить в двоичном виде точно. Отсюда и возникает разница. Бороться с ней - ну вот примерно так, как вы и написали, через преобразование в строки, там происходит округление до какого-то знака. Вот тут нашел парочку готовых функций для округления до определенного знака: http://lua-users.org/wiki/SimpleRound
 

EUGEN27771

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

EUGEN27771

Well-Known Member
23 Апр 2010
2.293
1.995
113
Напишите пару строк - не верю. Я не смотрел толком, но не верю.
Короче, считайте как есть, никогда не ошибетесь. Вывод на экран является условным(32 наверное). Ф-и sprintf и тп - тоже системнозависимы, и 32.
Возможно, если от типа intenger отнять/прибавить number - будут песни - но это же не Lua виноват.
 
  • Like
Реакции: Buyan

Alex_V

Active Member
12 Апр 2017
484
231
43
Напишите пару строк - не верю. Я не смотрел толком, но не верю.
Вы можете, конечно, в это не верить, но это есть факт. Пример - да легко. Проверялся тут: 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
 

EUGEN27771

Well-Known Member
23 Апр 2010
2.293
1.995
113
var1 = 4.8
var2 = 7.2 - 2.4
if var1 == var2 then reaper.ShowConsoleMsg("OK") end
============================================
Да, я ошибаюсь. И здесь. Проверил сам.
 

EUGEN27771

Well-Known Member
23 Апр 2010
2.293
1.995
113
Ну давайте - предположу - не строго - если они не знают - откуда намю/
Я долго копал- фигня/ Скажите мне- как переводим целое число>>>>> 32787 - 0 - - 327678 - в нормализованное
Общий 65536
 

EUGEN27771

Well-Known Member
23 Апр 2010
2.293
1.995
113
Это все фигня
Я только что - умышленно - раздолбал комп. Снял второй диск - там большая часть информации.
Я забыл - на рабочем осталось 3 Рипера с кучей тестовых скриптов, JS там почти нет, скрипты перепишу - что - гулять так гулять?
Единственное, там очень много текстов с разъяснениями - но мне они :).
А вообще классно, так спонтанно и усе
 
  • Like
Реакции: keyboarder

Alex_V

Active Member
12 Апр 2017
484
231
43
Так, на всякий случай.
Код:
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
 
  • Like
Реакции: Buyan

Supa75

Active Member
21 Мар 2017
672
164
43
48
Днепр, Украина
Подскажите плиз. Когда то скачал в репаке уважаемого @Michael скрипт Script: mpl_Solo MIDI Editor active take track.lua. Установил данный скрипт на кнопку в MIDI editor.
Вопрос: Что нужно добавить в скрипте или где еще, чтобы при нажатии на эту кнопку (включение режима "соло") - она горела, а при выключении соотв. гасла.
 
  • Like
Реакции: Archie's

Buyan

Member
19 Апр 2016
137
24
18
40
Белая Церковь
смотря для чего нужны вычисления....
Пытаюсь исследовать явления переменного темпа, если вкратце.
В данном случае просто пытался проверить простое равенство(подобных которому у меня много всяких разных было выведено в процессе исследования вопроса) на предмете в реальных условиях.
Вот пример:
PHP:
local Find_TSM_At_Pos = function(Pos) if reaper.FindTempoTimeSigMarker(0,Pos) ~= reaper.FindTempoTimeSigMarker(0,Pos-0.000001) then return reaper.FindTempoTimeSigMarker(0,Pos) else return -1 end end
local MsPos = reaper.BR_PositionAtMouseCursor(1)

function GetTSM(num)
  local t = {}
  t.num, t.retval, t.timepos, t.measurepos, t.beatpos, t.bpm, t.timesig_num, t.timesig_denom, t.lineartempo = num, reaper.GetTempoTimeSigMarker( 0, num )
  t.QNpos = reaper.TimeMap_timeToQN_abs( 0, t.timepos )*60
  return t
end

local Find_TSM_At_Pos = function(Pos) if reaper.FindTempoTimeSigMarker(0,Pos) ~= reaper.FindTempoTimeSigMarker(0,Pos-0.000001) then return reaper.FindTempoTimeSigMarker(0,Pos) else return -1 end end
local MsPos = reaper.BR_PositionAtMouseCursor(1)
function Find_Clst_TSM(Pos)
  local Left, Right
  local Denom  = function(f) if f > 0 then return 2 else return math.huge end end
  Left = reaper.FindTempoTimeSigMarker(0,Pos)
  Right = Find_TSM_At_Pos (reaper.TimeMap2_GetNextChangeTime( 0, Pos ))
  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) /3 - (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, я только начал учить недавно, но пока времени на это дело удается вырвать к сожалению не более пары часов в неделю. В данных условиях обнаружение подобных "подводных камней" приводят в растерянность.
 

Alex_V

Active Member
12 Апр 2017
484
231
43
В данном случае просто пытался проверить простое равенство
Ну, собственно, я что-то такое и предполагал. Потому, что сравнение - это как раз ситуация, где на эти особенности представления чисел можно нарваться. Причина неравенства двух чисел там, где по-хорошему они должны быть равны в том, что может производится сравнение двух неточных чисел, которые получены в результате операции над другими неточными числами. Собственно, округление до определенного знака после запятой оставит эти числа неточными, но они станут неточными одинаково.

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

Alex_V

Active Member
12 Апр 2017
484
231
43
Это понятно, ограничение на количество символов обусловленное параметрами железа.
Нет, это обусловлено самой системой хранения данных. Как я уже сказал, не все числа могут быть представлены точно. Но некоторые - могут. Ну, например, с дробной частью вида 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/Двоично-десятичный_код
 

Сейчас онлайн (Пользователей: 0, Гостей: 3)