|
vallt 1952
Стаж: 2 года 6 месяцев Сообщений: 3
|
vallt 1952 ·
01-Май-25 08:20
(11 дней назад)
Хрипят пресеты Serum 2. Какие могут быть причины. Благодарю за подсказку.
|
|
Евангелie вiд Луки
Стаж: 1 год Сообщений: 185
|
Евангелie вiд Луки ·
03-Май-25 20:30
(спустя 2 дня 12 часов)
vallt 1952 писал(а):
87723287Хрипят пресеты Serum 2. Какие могут быть причины. Благодарю за подсказку.
Не только с Серум такое. Среди пресетов синтов попадаются класно многослойно звучащие. Но ресурсов они уже хотят не кушать, а жрать. Но по результату все оправданно.
Уменьшайте задержку (Latency, если что) звуковухи, увеличивайте буфер.
|
|
sllssllsslls
 Стаж: 14 лет 8 месяцев Сообщений: 220
|
sllssllsslls ·
10-Май-25 08:25
(спустя 6 дней, ред. 10-Май-25 08:25)
Вопрос к знатокам, как сделать хронометраж на часах только в минутах?
60
65
70
80
90
123
В таком духе...
|
|
vkDanilov
Стаж: 9 лет 3 месяца Сообщений: 1813
|
vkDanilov ·
11-Май-25 04:32
(спустя 20 часов, ред. 12-Май-25 01:07)
sllssllsslls
Если вы имеете ввиду встроенные часы Big Clock, то никак.
Даже после того, как их снабдили расширенными настройками в последних версиях и переименовали в Big Clock Plus.
Остаётся только сделать "правильные" часы своими руками.
Можно, например, взять за основу скрипт Людвига по фамилии Frühschütz, который реализовал в своих часах отсчёт времени от начала текущего региона под курсором, а также от ближайшего маркера перед курсором. Правда формат отображения тот же самый - после цифры 60 "минуты" превращаются в "часы и минуты".
Поэтому, чтобы получить нужный результат, необходимо включить режим программиста.
BigClockExtra_mod.lua
Код:
-- Requires: Reaper 6.11+
local timeSinceProject = true
local timeSinceMarker = false
local timeSinceRegion = false
local timeUnitHMS = false
local timeUnitMS = true
local timeUnitMeasures = false
function class(base, init)
local c = {}
if not init and type(base) == 'function' then
init = base
base = nil
elseif type(base) == 'table' then
for i,v in pairs(base) do
c[i] = v
end
c._base = base
end
c.__index = c
local mt = {}
mt.__call = function(class_tbl, ...)
local obj = {}
setmetatable(obj,c)
if init then
init(obj,...)
else
if base and base.init then
base.init(obj, ...)
end
end
return obj
end
c.init = init
c.is_a = function(self, klass)
local m = getmetatable(self)
while m do
if m == klass then return true end
m = m._base
end
return false
end
setmetatable(c, mt)
return c
end
local Menu =
class(
function(menu, id)
menu.id = id
menu.items = {}
menu.items_str = ""
menu.curr_item_pos = 1
end
)
function Menu:get_item_from_id(id)
for i=1, #self.items do
if self.items[i].id == id then
return self.items[i]
end
end
return false
end
function Menu:update_item(item_table)
local t = item_table
t._has_submenu = false
t._last_item_in_submenu = false
t.id = self.curr_item_pos
if string.sub(t.label, 1, 1) == ">" or
string.sub(t.label, 1, 2) == "<>" or
string.sub(t.label, 1, 2) == "><" then
t._has_submenu = true
t.id = -1
self.curr_item_pos = self.curr_item_pos - 1
elseif string.sub(t.label, 1, 1) == "<" then
t._has_submenu = false
t._last_item_in_submenu = true
end
self.curr_item_pos = self.curr_item_pos + 1
end
function Menu:add_item(...)
local t = ... or {}
self.items[#self.items+1] = t
for i,v in pairs(t) do
if i == "label" then
t.label = v
elseif i == "selected" then
t.selected = v
elseif i == "active" then
t.active = v
elseif i == "toggleable" then
t.toggleable = v
elseif i == "command" then
t.command = v
end
end
if t.label == nil or t.label == "" then
t.label = tostring(#self.items)
end
if t.selected == nil then
t.selected = false
end
if t.active == nil then
t.active = true
end
if t.toggleable == nil then
t.toggleable = false
end
return t, #self.items
end
function Menu:get_item(index)
if self.items[index] == nil then
return false
end
return self.items[index]
end
function Menu:show(mx, my)
gfx.x = mx
gfx.y = my
for i=1, #self.items do
if self.items[i].on_menu_show ~= nil then
self.items[i].on_menu_show()
end
self:update_item(self.items[i])
end
self.items_str = self:table_to_string() or ""
self.val = gfx.showmenu(self.items_str)
if self.val > 0 then
self:update(self.val)
end
self.curr_item_pos = 1
end
function Menu:update(menu_item_index)
for i=1, #self.items do
if self.items[i].id == menu_item_index then
menu_item_index = i
break
end
end
local i = menu_item_index
if self.items[i].toggleable then
self.items[i].selected = not self.items[i].selected
end
if self.items[i].command ~= nil then
self.items[i].command()
end
end
function Menu:table_to_string()
if self.items == nil then
return
end
self.items_str = ""
for i=1, #self.items do
local temp_str = ""
local menu_item = self.items[i]
if menu_item.selected then
temp_str = "!"
end
if not menu_item.active then
temp_str = temp_str .. "#"
end
if menu_item.label ~= "" then
temp_str = temp_str .. menu_item.label .. "|"
end
self.items_str = self.items_str .. temp_str
end
return self.items_str
end
local script_path
local gui = {}
local quit = false
local sws_present = false
local mouse = {
LB = 1,
RB = 2,
CTRL = 4,
SHIFT = 8,
ALT = 16,
cap = function (mask)
if mask == nil then
return gfx.mouse_cap end
return gfx.mouse_cap&mask == mask
end,
uptime = 0,
last_x = -1, last_y = -1,
dx = 0,
dy = 0,
ox_l = 0, oy_l = 0,
ox_r = 0, oy_r = 0,
capcnt = 0,
last_LMB_state = false,
last_RMB_state = false
}
function storeExtState()
if timeSinceProject then
reaper.SetProjExtState(0, 'bigclock_extra', 'timeSinceProject', '1')
else
reaper.SetProjExtState(0, 'bigclock_extra', 'timeSinceProject', '0')
end
if timeSinceMarker then
reaper.SetProjExtState(0, 'bigclock_extra', 'timeSinceMarker', '1')
else
reaper.SetProjExtState(0, 'bigclock_extra', 'timeSinceMarker', '0')
end
if timeSinceRegion then
reaper.SetProjExtState(0, 'bigclock_extra', 'timeSinceRegion', '1')
else
reaper.SetProjExtState(0, 'bigclock_extra', 'timeSinceRegion', '0')
end
if timeUnitMeasures then
reaper.SetProjExtState(0, 'bigclock_extra', 'timeUnit', 'measures')
elseif timeUnitHMS then
reaper.SetProjExtState(0, 'bigclock_extra', 'timeUnit', 'hms')
else
reaper.SetProjExtState(0, 'bigclock_extra', 'timeUnit', 'ms')
end
reaper.SetProjExtState(0, 'bigclock_extra', 'dockState', gfx.dock(-1))
end
function get_script_path()
local info = debug.getinfo(1,'S');
local script_path = info.source:match[[^@?(.*[\/])[^\/]-$]]
return script_path
end
function gui_init()
script_path = get_script_path()
package.path = package.path .. ";" .. script_path .. "?.lua"
rc_menu = Menu("rc_menu")
rc_menu:add_item({label = "Время от начала проекта",
toggleable = true,
selected = timeSinceProject})
rc_menu:add_item({label = "Время от предыдущего маркера",
toggleable = true,
selected = timeSinceMarker})
rc_menu:add_item({label = "Время от начала текущего региона|",
toggleable = true,
selected = timeSinceRegion})
rc_menu:add_item({label = "Часы : Минуты : Секунды : Кадры",
toggleable = true,
selected = timeUnitHMS})
rc_menu:add_item({label = "Минуты : Секунды . Миллисекунды",
toggleable = true,
selected = timeUnitMS})
rc_menu:add_item({label = "Такты : Доли . Проценты доли|",
toggleable = true,
selected = timeUnitMeasures})
rc_menu:add_item({label = "Закрыть"})
rc_menu.items[1].command = function()
if rc_menu.items[1].selected then
timeSinceProject = true
timeSinceMarker = false
timeSinceRegion = false
rc_menu.items[2].selected = false
rc_menu.items[3].selected = false
else
rc_menu.items[1].selected = true;
end
storeExtState()
end
rc_menu.items[2].command = function()
if rc_menu.items[2].selected then
timeSinceProject = false
timeSinceMarker = true
timeSinceRegion = false
rc_menu.items[1].selected = false
rc_menu.items[3].selected = false
else
rc_menu.items[2].selected = true;
end
storeExtState()
end
rc_menu.items[3].command = function()
if rc_menu.items[3].selected then
timeSinceProject = false
timeSinceMarker = false
timeSinceRegion = true
rc_menu.items[1].selected = false
rc_menu.items[2].selected = false
else
rc_menu.items[3].selected = true;
end
storeExtState()
end
rc_menu.items[4].command = function()
if rc_menu.items[4].selected then
timeUnitHMS = true
timeUnitMS = false
timeUnitMeasures = false
rc_menu.items[5].selected = false
rc_menu.items[6].selected = false
else
rc_menu.items[4].selected = true;
end
storeExtState()
end
rc_menu.items[5].command = function()
if rc_menu.items[5].selected then
timeUnitHMS = false
timeUnitMS = true
timeUnitMeasures = false
rc_menu.items[4].selected = false
rc_menu.items[6].selected = false
else
rc_menu.items[5].selected = true;
end
storeExtState()
end
rc_menu.items[6].command = function()
if rc_menu.items[6].selected then
timeUnitHMS = false
timeUnitMS = false
timeUnitMeasures = true
rc_menu.items[4].selected = false
rc_menu.items[5].selected = false
else
rc_menu.items[6].selected = true;
end
storeExtState()
end
rc_menu.items[7].command = function() quit = true end
end
function drawGui()
local retval = 0
local val
local timeRaw
local ProjectTimeOffset
local timeDisplay
local timeDisplayMinutes
local timeDisplaySeconds
local markerRegionRelative = false
local markerId
local regionId
local isRegion
local markerRegionPos
local regionEnd
local markerRegionName
local markerRegionNumber
local TransportStates = reaper.GetAllProjectPlayStates(0)
if TransportStates == 0 or (TransportStates&2) == 2 then
timeRaw = reaper.GetCursorPosition()
else
timeRaw = reaper.GetPlayPosition()
end
if not TimeSyncProject then
markerId, regionId = reaper.GetLastMarkerAndCurRegion(0, timeRaw)
if timeSinceMarker then
retval, isRegion, markerRegionPos, regionEnd, markerRegionName, markerRegionNumber = reaper.EnumProjectMarkers(markerId)
elseif timeSinceRegion then
retval, isRegion, markerRegionPos, regionEnd, markerRegionName, markerRegionNumber = reaper.EnumProjectMarkers(regionId)
end
end
if retval > 0 then
timeRaw = timeRaw - markerRegionPos
markerRegionRelative = true
end
ProjectTimeOffset = reaper.GetProjectTimeOffset(0, false)
if timeUnitMeasures then
timeDisplay = reaper.format_timestr_pos(timeRaw,"", 2) -- 2 = Measures:Beats
elseif timeUnitHMS then
if markerRegionRelative then timeRaw = timeRaw - ProjectTimeOffset end
timeDisplay = reaper.format_timestr_pos(timeRaw,"", 5) -- 5 = h:m:s:f
else
if not markerRegionRelative then timeRaw = timeRaw + ProjectTimeOffset end
local NegativeOffset = (timeRaw<0) and true or false
if NegativeOffset then timeRaw = math.abs(timeRaw) end
timeDisplayMinutes = math.floor(timeRaw/60)
timeDisplaySeconds = timeRaw%60
timeDisplay = string.format("%.1d : %s",timeDisplayMinutes, reaper.format_timestr_pos(timeDisplaySeconds - ProjectTimeOffset, "", 3)) -- 3 = seconds
if NegativeOffset then timeDisplay = "-" .. timeDisplay end
end
local r,g,b = reaper.ColorFromNative(reaper.GetThemeColor('col_main_bg2', 0))
gfx.clear = r+g*256+b*65536
gui.settings.font_size = gfx.h / 1.4
gfx.setfont(1, 'Arial', math.max(gui.settings.font_size, 13))
local str_w, str_h = gfx.measurestr(timeDisplay)
gfx.x = (gfx.w - str_w) / 2
gfx.y = (gfx.h - str_h) / 2
while (gfx.x < 5) and (gui.settings.font_size > 12) do
gui.settings.font_size = gui.settings.font_size / 1.1
gfx.setfont(1,"Arial", gui.settings.font_size)
str_w, str_h = gfx.measurestr(timeDisplay)
gfx.x = (gfx.w - str_w) / 2
gfx.y = (gfx.h - str_h) / 2
end
gfx.printf(timeDisplay)
end
function onExit()
storeExtState()
end
function init()
if reaper.NamedCommandLookup('_SWS_ABOUT') > 0 then sws_present = true end
local retval
local val
retval, val = reaper.GetProjExtState(0, 'bigclock_extra', 'timeSinceProject')
if retval > 0 then
if tonumber(val) > 0 then
timeSinceProject = true
else
timeSinceProject = false
end
end
retval, val = reaper.GetProjExtState(0, 'bigclock_extra', 'timeSinceMarker')
if retval > 0 then
if tonumber(val) > 0 then
timeSinceMarker = true
else
timeSinceMarker = false
end
end
retval, val = reaper.GetProjExtState(0, 'bigclock_extra', 'timeSinceRegion')
if retval > 0 then
if tonumber(val) > 0 then
timeSinceRegion = true
else
timeSinceRegion = false
end
end
retval, val = reaper.GetProjExtState(0, 'bigclock_extra', 'timeUnit')
if retval > 0 then
if val == 'measures' then
timeUnitMeasures = true
timeUnitHMS = false
timeUnitMS = false
elseif val == 'hms' then
timeUnitMeasures = false
timeUnitHMS = true
timeUnitMS = false
else
timeUnitMeasures = false
timeUnitHMS = false
timeUnitMS = true
end
end
gui_init()
gui.settings = {}
gui.settings.font_size = 50
gui.settings.docker_id = 0 -- try 0, 1, 257, 513, 1027 etc.
gfx.init("Big Clock Extra", 350, 100, gui.settings.docker_id)
gfx.setfont(1,"Arial", gui.settings.font_size)
local r,g,b = reaper.ColorFromNative(reaper.GetThemeColor('col_main_bg2', 0))
gfx.clear = r+g*256+b*65536
retval, val = reaper.GetProjExtState(0, 'bigclock_extra', 'dockState')
if retval > 0 then
gfx.dock(val)
end
end
function mainloop()
local RMB_state = mouse.cap(mouse.RB)
local LMB_state = mouse.cap(mouse.LB)
local mx = gfx.mouse_x
local my = gfx.mouse_y
if not mouse.last_RMB_state and gfx.mouse_cap&2 == 2 then
rc_menu:show(mx, my)
if sws_present then
reaper.Main_OnCommand( reaper.NamedCommandLookup('_BR_FOCUS_ARRANGE_WND'), 0 )
end
end
if not mouse.last_LMB_state and gfx.mouse_cap&1 == 1 then
if sws_present then
reaper.Main_OnCommand( reaper.NamedCommandLookup('_BR_FOCUS_ARRANGE_WND'), 0 )
end
end
mouse.last_RMB_state = RMB_state
mouse.last_LMB_state = LMB_state
drawGui()
gfx.update()
if gfx.getchar() >= 0 and not quit then reaper.defer(mainloop) end
end
reaper.atexit(onExit)
init()
mainloop()
Теперь двое часов: заводские и самодельные. Самодельные показывают честные минуты.
|
|
shamagov
Стаж: 15 лет 4 месяца Сообщений: 2477
|
shamagov ·
11-Май-25 09:51
(спустя 5 часов, ред. 11-Май-25 09:51)
vkDanilov
vkDanilov
Цитата:
BigClockExtra_mod.lua
Ого, вот это круто! Мне бы пригодились такие часы,
но, к сожалению, они у меня не работают,
точнее сказать, вызывают ошибку (ошибок может быть больше)
когда кликаю по ним правой кнопкой мыши.
_______________________________________________________
|
|
vkDanilov
Стаж: 9 лет 3 месяца Сообщений: 1813
|
vkDanilov ·
11-Май-25 12:13
(спустя 2 часа 21 мин.)
shamagov
Простите, не правильно вставил сюда текст скрипта - BBCode съел часть текста. Исправил.
|
|
shamagov
Стаж: 15 лет 4 месяца Сообщений: 2477
|
shamagov ·
11-Май-25 12:45
(спустя 32 мин.)
vkDanilov
Лично для меня, это совершенно не имеет значения,
но просто ради интереса - у вас тоже есть расхождение в одну тысячную ? )
----------------------------------------------------------------------------------------- vkDanilov, вы в очередной раз доказали практическим примером
насколько Рипер превосходит все остальные DAW
в плане гибкости настроек (опций, функций и т.д.),
и для меня в данном случае важны не сами часы,
а именно свобода пользователя... - благодарю вас!!
|
|
vkDanilov
Стаж: 9 лет 3 месяца Сообщений: 1813
|
vkDanilov ·
11-Май-25 14:26
(спустя 1 час 41 мин.)
shamagov писал(а):
87766990у вас тоже есть расхождение в одну тысячную ?
Заменил для секунд стандартную string.format на родную reaper.format_timestr_pos.
Теперь одинаково округляют.
|
|
semiono
 Стаж: 13 лет 8 месяцев Сообщений: 1979
|
semiono ·
11-Май-25 20:54
(спустя 6 часов, ред. 11-Май-25 20:54)
BTW а у меня тоже был вопрос который я так и не решил, на мастер-микшере уровень отображаемый цифрами,
так вот пики показываются максимальные пока их не перебьёт более сильный сигнал, для меня это очень неудобно.
В Sound Forge было так, каждый новый playback измерялся новым макси-уровнем...
Просто смотришь думаешь там такой уровень, по привычке, а там гораздо тише сигнал. Сам не смог настроить, хотя может и нельзя никак :\
|
|
vkDanilov
Стаж: 9 лет 3 месяца Сообщений: 1813
|
vkDanilov ·
11-Май-25 22:37
(спустя 1 час 42 мин.)
Если вы про эти пики:
То они будут сами сбрасываться каждый раз, когда вы начинаете воспроизведение или во время воспроизведения перемещаете курсор.
Просто надо поставить галочку здесь:
|
|
shamagov
Стаж: 15 лет 4 месяца Сообщений: 2477
|
shamagov ·
11-Май-25 22:55
(спустя 18 мин.)
vkDanilov
vkDanilov писал(а):
87767375Теперь одинаково округляют.
А у меня что-то хуже стало.
_______________________
vkDanilov писал(а):
87770539Просто надо поставить галочку здесь:
Тоже себе поставил эту галочку... так удобнее... спасибо!
|
|
vkDanilov
Стаж: 9 лет 3 месяца Сообщений: 1813
|
vkDanilov ·
11-Май-25 23:21
(спустя 26 мин., ред. 11-Май-25 23:21)
shamagov
У вас на разных часах разные форматы.
На встроенных - часы:минуты:секунды:кадры
На самодельных - минуты:секунды.миллисекунды
Одна миллисекунда - это одна тысячная секунды, а один кадр, это одна шестидесятая секунды, например (если скорость смены кадров -frame rate равна 60, задаётся в настройках проекта на вкладке Video). И даже если бы эти сотые-тысячные были одинаковыми, то при определённых условиях разница в показаниях между этими двумя форматами может быть шокирующая.
Дело в том, что у видео формата время может идти вспять, то есть курсор воспроизведения как ему и положено движется вправо, а показания часов уменьшаются (и это не шутка, в руководстве к риперу этот момент освещается).
|
|
shamagov
Стаж: 15 лет 4 месяца Сообщений: 2477
|
shamagov ·
11-Май-25 23:36
(спустя 14 мин.)
vkDanilov
vkDanilov писал(а):
87770647Одна миллисекунда - это одна тысячная секунды, а один кадр, это одна шестидесятая секунды, например (если скорость смены кадров -frame rate равна 60, задаётся в настройках проекта на вкладке Video). И даже если бы эти сотые-тысячные были одинаковыми, то при определённых условиях разница в показаниях между этими двумя форматами может быть шокирующая.
Дело в том, что у видео формата время может идти вспять, то есть курсор воспроизведения как ему и положено движется вправо, а показания часов уменьшаются (и это не шутка, в руководстве к риперу этот момент освещается).
Вот блин, я даже не заметил... не подумал.. да и не знал про эти кадры -- спасибо за информацию!
В данном случае, на мой взгляд, было бы логичнее На встроенных - часы:минуты:секунды: миллисекунды - ведь всё-таки это в первую очередь аудио редактор... и тогда бы не возникала эта путаница в голове (какие кадры... сколько их.. 24, 25, 30, 60... где искать настройки этих кадров... и зачем они нужны, если работаю со звуком, а не с видео), а для видео - действительно лучше подошёл бы такой формат часов - часы:минуты:секунды:кадры. Жаль, что такие гениальные разработчики, которые занимаются Рипером, не делают видео редактор - не сомневаюсь, что он был бы на голову выше по производительности и функциональности многих существующих видео редакторов.
Округление иногда совпадает, а иногда не совпадает (может быть, нужно было во всех случаях заменить на reaper.format_timestr_pos) - впрочем, разница на миллисекунду, возможно, отразилась бы на пиковом компрессоре (в его коде), а для меня в данном случае эти миллисекунды вообще не нужны... лучше, как говорил sllssllsslls - хронометраж на часах только в минутах... то есть возможность детального отображения (показывать только часы, только минуты, только секунды)... ну может в будущих версиях Рипера и такое сделают )
|
|
vkDanilov
Стаж: 9 лет 3 месяца Сообщений: 1813
|
vkDanilov ·
12-Май-25 00:15
(спустя 38 мин., ред. 12-Май-25 00:15)
shamagov писал(а):
87770757Округление иногда совпадает, а иногда не совпадает
Скрипт-то надо пересохранить, у вас старый работает.
|
|
shamagov
Стаж: 15 лет 4 месяца Сообщений: 2477
|
shamagov ·
12-Май-25 01:12
(спустя 56 мин., ред. 12-Май-25 01:12)
vkDanilov
Для чистоты эксперимента... удалил тот скрипт... копировал из вашего комментария и создал новый скрипт... в Рипере, разумеется, в листе экшенов тоже удалил старый скрипт, а новый (с вашего позволения) подредактировал название "Clock_vkDanilov" (мне так больше нравится), но по итогу опять рандом в синхронизации... странно (у вас то всё нормально).. а вы скрипт обновляли в своём комментарии, или мне самому нужно заменять для секунд стандартную string.format на родную reaper.format_timestr_pos. ?
_________________
|
|
vkDanilov
Стаж: 9 лет 3 месяца Сообщений: 1813
|
vkDanilov ·
12-Май-25 02:03
(спустя 51 мин.)
shamagov
Нет, заменять не нужно.
|
|
shamagov
Стаж: 15 лет 4 месяца Сообщений: 2477
|
shamagov ·
12-Май-25 09:30
(спустя 7 часов)
vkDanilov
vkDanilov
Наверное, у меня винда борохлит (какой-нибудь системный таймер), или что-то ещё чего я не знаю.
Скачал ваш скрипт, но у меня он работает точно также
______________________________________________
|
|
semiono
 Стаж: 13 лет 8 месяцев Сообщений: 1979
|
semiono ·
12-Май-25 14:38
(спустя 5 часов, ред. 12-Май-25 14:38)
Спасибо, vkDanilov! Посмотрю, наверное оно!
Надо бы здесь систему лайков чтоб не флудить)
|
|
|