|
|
|
sllssllsslls
 Стаж: 15 лет 4 месяца Сообщений: 238
|
sllssllsslls ·
10-Май-25 08:25
(7 месяцев назад, ред. 10-Май-25 08:25)
Вопрос к знатокам, как сделать хронометраж на часах только в минутах?
60
65
70
80
90
123
В таком духе...
|
|
|
|
vkDanilov
Стаж: 9 лет 11 месяцев Сообщений: 1940
|
vkDanilov ·
11-Май-25 04:32
(спустя 20 часов, ред. 19-Май-25 19:32)
sllssllsslls
Если вы имеете ввиду встроенные часы Big Clock, то никак.
Даже после того, как их снабдили расширенными настройками в последних версиях и переименовали в Big Clock Plus.
Остаётся только сделать "правильные" часы своими руками.
Можно, например, взять за основу скрипт Людвига по фамилии Frühschütz, который реализовал в своих часах отсчёт времени от начала текущего региона под курсором, а также от ближайшего маркера перед курсором. Правда формат отображения тот же самый - после цифры 60 "минуты" превращаются в "часы и минуты".
Поэтому, чтобы получить нужный результат, необходимо включить режим программиста.
BigClockExtra_mod.lua
Код:
-- Requires: Reaper 5.23+
local countMode = 0
local timeUnit = 1
local TextColor, BackgroundColor
local txt_r, txt_g, txt_b
local font_size = 50
local prev_dockstate=0
local sectionID, cmdID
local wx, wy, ww, wh = 0, 0, 350, 100 function SetTextRGB()
txt_r, txt_g, txt_b = reaper.ColorFromNative(TextColor)
txt_r = txt_r/256
txt_g = txt_g/256
txt_b = txt_b/256
end function ResetColor(background)
if reaper.APIExists("GetThemeColor") then
if background then
BackgroundColor = reaper.GetThemeColor('col_main_bg2', 0)
else
TextColor = reaper.GetThemeColor('col_main_text2', 0)
SetTextRGB()
end
else
if background then
BackgroundColor = 3355443 --51 + 51*256 + 51*65536
else
TextColor = 9211020 --140 + 140*256 + 140*65536
SetTextRGB()
end
end
return background and BackgroundColor or TextColor
end 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 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 storeInProj(name, value)
if value then
reaper.SetProjExtState(0, 'bigclock_extra', name, value)
end
end function takeFromProj(name, defval, max, min)
local retval, val = reaper.GetProjExtState(0, 'bigclock_extra', name)
if retval > 0 then
if max or min then
val = tonumber(val)
if val then
if (max and (val > max)) or (min and (val < min)) then
return defval
else return val
end
else
return defval
end
else return val
end
else return defval
end
end function storeExtState()
storeInProj('countMode', countMode)
storeInProj('timeUnit', timeUnit)
storeInProj('dockState', gfx.dock(-1))
storeInProj('BackColor', BackgroundColor)
storeInProj('TextColor', TextColor)
_, wx, wy, ww, wh = gfx.dock(-1, 0, 0, 0, 0)
storeInProj('wx', wx)
storeInProj('wy', wy)
storeInProj('ww', ww)
storeInProj('wh', wh)
end function menu_init()
rc_menu = Menu("rc_menu")
rc_menu:add_item()
rc_menu:add_item({label = "Время от начала проекта",
toggleable = true,
selected = (countMode == 0)})
rc_menu:add_item({label = "Время от предыдущего маркера",
toggleable = true,
selected = (countMode == 1)})
rc_menu:add_item({label = "Время от начала текущего региона|",
toggleable = true,
selected = (countMode == 2)})
rc_menu:add_item({label = "Часы : Минуты : Секунды : Кадры",
toggleable = true,
selected = (timeUnit == 0)})
rc_menu:add_item({label = "Минуты : Секунды",
toggleable = true,
selected = (timeUnit == 1)})
rc_menu:add_item({label = "Минуты : Секунды . Миллисекунды",
toggleable = true,
selected = (timeUnit == 2)})
rc_menu:add_item({label = "Такты : Доли . Проценты доли|",
toggleable = true,
selected = (timeUnit == 3)})
rc_menu:add_item({label = ">Цвет"})
rc_menu:add_item({label = "Цвет текста..."})
rc_menu:add_item({label = "Цвет текста по умолчанию|"})
rc_menu:add_item({label = "Цвет фона..."})
rc_menu:add_item({label = "<Цвет фона по умолчанию|"})
rc_menu:add_item({label = "Закрыть"})
rc_menu.items[1].command = function()
prev_dockstate = gfx.dock(-1)
if (prev_dockstate & 1) == 0 then
prev_dockstate = prev_dockstate + 1
else
prev_dockstate = prev_dockstate - 1
end
gfx.dock(prev_dockstate)
storeInProj('dockState', gfx.dock(-1))
end
rc_menu.items[1].on_menu_show = function()
rc_menu.items[1].label = ((gfx.dock(-1)&1) == 0) and "Прикрепить|" or "Открепить|"
end
rc_menu.items[2].command = function()
if rc_menu.items[2].selected then
countMode = 0
rc_menu.items[3].selected = false
rc_menu.items[4].selected = false
else
rc_menu.items[2].selected = true;
end
storeInProj('countMode', 0)
end
rc_menu.items[3].command = function()
if rc_menu.items[3].selected then
countMode = 1
rc_menu.items[2].selected = false
rc_menu.items[4].selected = false
else
rc_menu.items[3].selected = true;
end
storeInProj('countMode', 1)
end
rc_menu.items[4].command = function()
if rc_menu.items[4].selected then
countMode = 2
rc_menu.items[2].selected = false
rc_menu.items[3].selected = false
else
rc_menu.items[4].selected = true;
end
storeInProj('countMode', 2)
end
rc_menu.items[5].command = function()
if rc_menu.items[5].selected then
timeUnit = 0
rc_menu.items[6].selected = false
rc_menu.items[7].selected = false
rc_menu.items[8].selected = false
else
rc_menu.items[5].selected = true;
end
storeInProj('timeUnit', 0)
end
rc_menu.items[6].command = function()
if rc_menu.items[6].selected then
timeUnit = 1
rc_menu.items[5].selected = false
rc_menu.items[7].selected = false
rc_menu.items[8].selected = false
else
rc_menu.items[6].selected = true;
end
storeInProj('timeUnit', 1)
end
rc_menu.items[7].command = function()
if rc_menu.items[7].selected then
timeUnit = 2
rc_menu.items[5].selected = false
rc_menu.items[6].selected = false
rc_menu.items[8].selected = false
else
rc_menu.items[7].selected = true;
end
storeInProj('timeUnit', 2)
end
rc_menu.items[8].command = function()
if rc_menu.items[8].selected then
timeUnit = 3
rc_menu.items[5].selected = false
rc_menu.items[6].selected = false
rc_menu.items[7].selected = false
else
rc_menu.items[8].selected = true;
end
storeInProj('timeUnit', 3)
end
rc_menu.items[10].command = function()
local cancelled
cancelled, PickedColor = reaper.GR_SelectColor(reaper.GetMainHwnd())
if cancelled~=0 and PickedColor~=TextColor then
TextColor = PickedColor
SetTextRGB()
storeInProj('TextColor', TextColor)
end
end
rc_menu.items[11].command = function()
if TextColor~=ResetColor() then storeInProj('TextColor', TextColor) end
end
rc_menu.items[12].command = function()
local cancelled
cancelled, PickedColor = reaper.GR_SelectColor(reaper.GetMainHwnd())
if cancelled~=0 and PickedColor~=BackgroundColor then
BackgroundColor = PickedColor
storeInProj('BackColor', BackgroundColor)
end
end
rc_menu.items[13].command = function()
if BackgroundColor~=ResetColor(true) then
storeInProj('BackColor', BackgroundColor)
end
end
rc_menu.items[14].command = function() quit = true end
end function drawGui()
local retval = 0
local timeRaw
local timeDisplay
local markerRegionRelative = false
local markerId
local regionId
local markerRegionPos
local TransportStates = reaper.GetAllProjectPlayStates(0)
if TransportStates == 0 or (TransportStates&2) == 2 then
timeRaw = reaper.GetCursorPosition()
else
timeRaw = reaper.GetPlayPosition()
end
if not (countMode == 0) then
markerId, regionId = reaper.GetLastMarkerAndCurRegion(0, timeRaw)
if countMode == 1 then
retval, _, markerRegionPos, _, _, _ = reaper.EnumProjectMarkers(markerId)
elseif countMode == 2 then
retval, _, markerRegionPos, _, _, _ = reaper.EnumProjectMarkers(regionId)
end
end
if retval > 0 then
timeRaw = timeRaw - markerRegionPos
markerRegionRelative = true
end if timeUnit == 3 then
timeDisplay = reaper.format_timestr_pos(timeRaw,"", 2) -- 2 = Measures:Beats
else
local ProjectTimeOffset = reaper.GetProjectTimeOffset(0, false)
if markerRegionRelative then timeRaw = timeRaw - ProjectTimeOffset end
if timeUnit == 0 then
timeDisplay = reaper.format_timestr_pos(timeRaw,"", 5) -- 5 = h:m:s:f
else
local hms = reaper.format_timestr_pos(timeRaw, "", 0) -- 0 = m:s.ms
local sign = string.find(hms, "-")
local i = string.find(hms, ":")
local m = math.abs(tonumber(string.sub(hms, 1, i-1)))
local j = string.find(hms, ":", i+1)
if j then
m = m*60 + tonumber(string.sub(hms, i+1, j-1))
end if timeUnit == 2 then
timeDisplay = (sign and "-" or "") .. m .. ":" .. (j and string.sub(hms, j+1) or string.sub(hms, i+1))
else
timeDisplay = (sign and "-" or "") .. m .. ":" .. (j and string.sub(hms, j+1, j+2) or string.sub(hms, i+1, i+2))
end
end
end gfx.clear = BackgroundColor
font_size = gfx.h / 1.1
gfx.set(txt_r, txt_g, txt_b)
gfx.setfont(1, 'Calibri', math.max(font_size, 13), string.byte('b'))
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 (font_size > 12) do
font_size = font_size / 1.1
gfx.setfont(1,'Calibri', font_size, string.byte('b'))
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)
if (prev_dockstate ~= gfx.dock(-1)) then
prev_dockstate = gfx.dock(-1)
storeInProj('dockState', prev_dockstate)
end
end
function onExit()
storeExtState()
reaper.SetToggleCommandState(sectionID, cmdID, 0)
reaper.RefreshToolbar2(sectionID, cmdID)
end function init()
if reaper.NamedCommandLookup('_SWS_ABOUT') > 0 then sws_present = true end
local retval
local val
countMode = takeFromProj("countMode",0,2,0)
timeUnit = takeFromProj("timeUnit",1,3,0)
menu_init()
wx = takeFromProj("wx", wx)
wy = takeFromProj("wy", wy)
wh = takeFromProj("wh", wh)
ww = takeFromProj("ww", ww)
prev_dockstate = takeFromProj("dockState", prev_dockstate)
gfx.init("Big Clock Extra", ww, wh, prev_dockstate, wx, wy)
prev_dockstate = gfx.dock(-1)
ResetColor()
TextColor = takeFromProj("TextColor",TextColor)
SetTextRGB()
gfx.setfont(1,'Calibri', font_size,string.byte('b'))
ResetColor(true)
BackgroundColor = takeFromProj("BackColor", BackgroundColor)
gfx.clear = BackgroundColor 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 _, _, sectionID, cmdID, _, _, _ = reaper.get_action_context()
reaper.SetToggleCommandState(sectionID, cmdID, 1)
reaper.RefreshToolbar2(sectionID, cmdID) reaper.atexit(onExit)
init()
mainloop()
Теперь двое часов: заводские и самодельные. Самодельные показывают честные минуты.
|
|
|
|
shamagov
Стаж: 15 лет 11 месяцев Сообщений: 2517
|
shamagov ·
11-Май-25 09:51
(спустя 5 часов, ред. 11-Май-25 09:51)
vkDanilov
vkDanilov
Цитата:
BigClockExtra_mod.lua
Ого, вот это круто! Мне бы пригодились такие часы,
но, к сожалению, они у меня не работают,
точнее сказать, вызывают ошибку (ошибок может быть больше)
когда кликаю по ним правой кнопкой мыши.
_______________________________________________________
|
|
|
|
vkDanilov
Стаж: 9 лет 11 месяцев Сообщений: 1940
|
vkDanilov ·
11-Май-25 12:13
(спустя 2 часа 21 мин.)
shamagov
Простите, не правильно вставил сюда текст скрипта - BBCode съел часть текста. Исправил.
|
|
|
|
shamagov
Стаж: 15 лет 11 месяцев Сообщений: 2517
|
shamagov ·
11-Май-25 12:45
(спустя 32 мин.)
vkDanilov
Лично для меня, это совершенно не имеет значения,
но просто ради интереса - у вас тоже есть расхождение в одну тысячную ? )
----------------------------------------------------------------------------------------- vkDanilov, вы в очередной раз доказали практическим примером
насколько Рипер превосходит все остальные DAW
в плане гибкости настроек (опций, функций и т.д.),
и для меня в данном случае важны не сами часы,
а именно свобода пользователя... - благодарю вас!!
|
|
|
|
vkDanilov
Стаж: 9 лет 11 месяцев Сообщений: 1940
|
vkDanilov ·
11-Май-25 14:26
(спустя 1 час 41 мин.)
shamagov писал(а):
87766990у вас тоже есть расхождение в одну тысячную ?
Заменил для секунд стандартную string.format на родную reaper.format_timestr_pos.
Теперь одинаково округляют.
|
|
|
|
semiono
 Стаж: 14 лет 3 месяца Сообщений: 2187
|
semiono ·
11-Май-25 20:54
(спустя 6 часов, ред. 11-Май-25 20:54)
BTW а у меня тоже был вопрос который я так и не решил, на мастер-микшере уровень отображаемый цифрами,
так вот пики показываются максимальные пока их не перебьёт более сильный сигнал, для меня это очень неудобно.
В Sound Forge было так, каждый новый playback измерялся новым макси-уровнем...
Просто смотришь думаешь там такой уровень, по привычке, а там гораздо тише сигнал. Сам не смог настроить, хотя может и нельзя никак :\
|
|
|
|
vkDanilov
Стаж: 9 лет 11 месяцев Сообщений: 1940
|
vkDanilov ·
11-Май-25 22:37
(спустя 1 час 42 мин.)
Если вы про эти пики:
То они будут сами сбрасываться каждый раз, когда вы начинаете воспроизведение или во время воспроизведения перемещаете курсор.
Просто надо поставить галочку здесь:
|
|
|
|
shamagov
Стаж: 15 лет 11 месяцев Сообщений: 2517
|
shamagov ·
11-Май-25 22:55
(спустя 18 мин.)
vkDanilov
vkDanilov писал(а):
87767375Теперь одинаково округляют.
А у меня что-то хуже стало.
_______________________
vkDanilov писал(а):
87770539Просто надо поставить галочку здесь:
Тоже себе поставил эту галочку... так удобнее... спасибо!
|
|
|
|
vkDanilov
Стаж: 9 лет 11 месяцев Сообщений: 1940
|
vkDanilov ·
11-Май-25 23:21
(спустя 26 мин., ред. 11-Май-25 23:21)
shamagov
У вас на разных часах разные форматы.
На встроенных - часы:минуты:секунды:кадры
На самодельных - минуты:секунды.миллисекунды
Одна миллисекунда - это одна тысячная секунды, а один кадр, это одна шестидесятая секунды, например (если скорость смены кадров -frame rate равна 60, задаётся в настройках проекта на вкладке Video). И даже если бы эти сотые-тысячные были одинаковыми, то при определённых условиях разница в показаниях между этими двумя форматами может быть шокирующая.
Дело в том, что у видео формата время может идти вспять, то есть курсор воспроизведения как ему и положено движется вправо, а показания часов уменьшаются (и это не шутка, в руководстве к риперу этот момент освещается).
|
|
|
|
shamagov
Стаж: 15 лет 11 месяцев Сообщений: 2517
|
shamagov ·
11-Май-25 23:36
(спустя 14 мин.)
vkDanilov
vkDanilov писал(а):
87770647Одна миллисекунда - это одна тысячная секунды, а один кадр, это одна шестидесятая секунды, например (если скорость смены кадров -frame rate равна 60, задаётся в настройках проекта на вкладке Video). И даже если бы эти сотые-тысячные были одинаковыми, то при определённых условиях разница в показаниях между этими двумя форматами может быть шокирующая.
Дело в том, что у видео формата время может идти вспять, то есть курсор воспроизведения как ему и положено движется вправо, а показания часов уменьшаются (и это не шутка, в руководстве к риперу этот момент освещается).
Вот блин, я даже не заметил... не подумал.. да и не знал про эти кадры -- спасибо за информацию!
В данном случае, на мой взгляд, было бы логичнее На встроенных - часы:минуты:секунды: миллисекунды - ведь всё-таки это в первую очередь аудио редактор... и тогда бы не возникала эта путаница в голове (какие кадры... сколько их.. 24, 25, 30, 60... где искать настройки этих кадров... и зачем они нужны, если работаю со звуком, а не с видео), а для видео - действительно лучше подошёл бы такой формат часов - часы:минуты:секунды:кадры. Жаль, что такие гениальные разработчики, которые занимаются Рипером, не делают видео редактор - не сомневаюсь, что он был бы на голову выше по производительности и функциональности многих существующих видео редакторов.
Округление иногда совпадает, а иногда не совпадает (может быть, нужно было во всех случаях заменить на reaper.format_timestr_pos) - впрочем, разница на миллисекунду, возможно, отразилась бы на пиковом компрессоре (в его коде), а для меня в данном случае эти миллисекунды вообще не нужны... лучше, как говорил sllssllsslls - хронометраж на часах только в минутах... то есть возможность детального отображения (показывать только часы, только минуты, только секунды)... ну может в будущих версиях Рипера и такое сделают )
|
|
|
|
vkDanilov
Стаж: 9 лет 11 месяцев Сообщений: 1940
|
vkDanilov ·
12-Май-25 00:15
(спустя 38 мин., ред. 12-Май-25 00:15)
shamagov писал(а):
87770757Округление иногда совпадает, а иногда не совпадает
Скрипт-то надо пересохранить, у вас старый работает.
|
|
|
|
shamagov
Стаж: 15 лет 11 месяцев Сообщений: 2517
|
shamagov ·
12-Май-25 01:12
(спустя 56 мин., ред. 12-Май-25 01:12)
vkDanilov
Для чистоты эксперимента... удалил тот скрипт... копировал из вашего комментария и создал новый скрипт... в Рипере, разумеется, в листе экшенов тоже удалил старый скрипт, а новый (с вашего позволения) подредактировал название "Clock_vkDanilov" (мне так больше нравится), но по итогу опять рандом в синхронизации... странно (у вас то всё нормально).. а вы скрипт обновляли в своём комментарии, или мне самому нужно заменять для секунд стандартную string.format на родную reaper.format_timestr_pos. ?
_________________
|
|
|
|
vkDanilov
Стаж: 9 лет 11 месяцев Сообщений: 1940
|
vkDanilov ·
12-Май-25 02:03
(спустя 51 мин.)
shamagov
Нет, заменять не нужно.
|
|
|
|
shamagov
Стаж: 15 лет 11 месяцев Сообщений: 2517
|
shamagov ·
12-Май-25 09:30
(спустя 7 часов)
vkDanilov
vkDanilov
Наверное, у меня винда борохлит (какой-нибудь системный таймер), или что-то ещё чего я не знаю.
Скачал ваш скрипт, но у меня он работает точно также
______________________________________________
|
|
|
|
semiono
 Стаж: 14 лет 3 месяца Сообщений: 2187
|
semiono ·
12-Май-25 14:38
(спустя 5 часов, ред. 12-Май-25 14:38)
Спасибо, vkDanilov! Посмотрю, наверное оно!
Надо бы здесь систему лайков чтоб не флудить)
|
|
|
|
sllssllsslls
 Стаж: 15 лет 4 месяца Сообщений: 238
|
sllssllsslls ·
13-Май-25 15:04
(спустя 1 день, ред. 13-Май-25 15:04)
vkDanilov писал(а):
87765760sllssllsslls
Если вы имеете ввиду встроенные часы Big Clock, то никак.
Даже после того, как их снабдили расширенными настройками в последних версиях и переименовали в Big Clock Plus.
Даже не знаю что и сказать...
Необходимость в этом слишком очевидна...
Есть принципиальная разница, когда ты пишешь музыкальный материал на одно отделение концерта, то есть - 40 минут, и на сквозной вариант концерта без перерыва на буфет... - 70-80-90, 110-115-125 минут.
Слушатель в зале не измеряет время часами...
Кинематограф работал лет 50 на 90 минут, то есть на полтора часа внимания зрителей без буфета и туалета... Отсюда и попкорн с колой.
Внимание слушателя нельзя измерять часами, только минутами...
Это, собственно, оперативное внимание...
Без каких-либо перекуров.
Как бы даже смешно музыкантам, работающим, как это говорится - на большой сцене, это обсуждать...
Сегмент в час времени для музыкальной семантики композитора - это пустая абстракция.
В кинематографе никто не указывает время в часах.
А вот время работы - измеряется часами за оплату. Это понятно.
Попса работает до 5 минут (городской фольклор).
Рок - на 7-8 минут внимания (городской эпос).
Академическая музыкальная традиция ориентируется на 20 минут как сегмент...
А если музыкальный материал с широким дыханием - на 40-минутный сегмент, или часть.
В любом случае - часы - это не о музыке, и не о кино.
40-50 минут - это и формат сериалов. То есть - стандартное отделение концерта. Дальше - буфет с красной рыбой.
Это бытовое измерение.
Но если материал выходит за рамки бытового измерения... - это всегда более 50 и 60 минут...
Другое дело, комфортно ли это для зрителя и слушателя?
На самом ли деле автор в состоянии удерживать внимание зрителя и слушателя в оперативном режиме восприятия более 60 минут, или это фикция?..
***
И что именно нужно сделать?
|
|
|
|
vkDanilov
Стаж: 9 лет 11 месяцев Сообщений: 1940
|
vkDanilov ·
13-Май-25 23:35
(спустя 8 часов)
sllssllsslls писал(а):
87775548И что именно нужно сделать?
Скачать файл BigClockExtra_mod.lua:
Открыть в Рипере окно Actions (главное меню > Actions > Show Action list...)
Нажать New Action > Load ReaScript
Выбрать файл BigClockExtra_mod.lua
В списке появится новая команда Script: BigClockExtra_mod.lua - дополнительные часы, которые по умолчанию часы не показывают, только минуты. Открывать эти часы можно непосредственно из окна Actions (выбрать в списке эту команду и нажать кнопку Run). Как для любой другой команды, для неё можно назначить горячие клавиши или добавить на панель инструментов.
|
|
|
|
semiono
 Стаж: 14 лет 3 месяца Сообщений: 2187
|
semiono ·
14-Май-25 17:06
(спустя 17 часов)
И снова я со своим вопросом) Круто! Опция сбрасывает пики на play, отлично.
Но проблем оказывается больше чем я думал)) Вот бы так же пики сбрсывлись
на нажатие миди клавиатуры или на любой сигнал. То есть не на Play, а на звук.
Наверное lua скоипт такой возможен, но само собой наверное настроек таких нет?
Да и скрипт ещё поискать надо. А может есть решение?
|
|
|
|
vkDanilov
Стаж: 9 лет 11 месяцев Сообщений: 1940
|
vkDanilov ·
14-Май-25 20:49
(спустя 3 часа)
Сам скрипт, сбрасывающий пики на мастер-треке, не сложный, всего одна строчка:
Reset master track meter hold state.lua
Код:
reaper.Track_GetPeakHoldDB(reaper.GetMasterTrack(0), 1024, true)
И, конечно, в окне Actions его можно назначить в том числе и на клавишу миди-клавиатуры, и на СС-контроллер. Но если он будет реагировать на любой звук, то никаких показаний не будет. Индикаторы всегда будут в сброшенном состоянии. Месье знает толк в извращениях?
|
|
|
|
semiono
 Стаж: 14 лет 3 месяца Сообщений: 2187
|
semiono ·
14-Май-25 21:11
(спустя 22 мин., ред. 14-Май-25 21:11)
Вот это вещь! Спасибо! Хотя и не работает, зато можно подумать) Сам бы я lua не написал, а готовый пример это уже что-то! Ну, может на педаль CC64
|
|
|
|
sllssllsslls
 Стаж: 15 лет 4 месяца Сообщений: 238
|
sllssllsslls ·
15-Май-25 09:35
(спустя 12 часов, ред. 15-Май-25 09:35)
vkDanilov писал(а):
87778102
sllssllsslls писал(а):
87775548И что именно нужно сделать?
Скачать файл BigClockExtra_mod.lua:
Открыть в Рипере окно Actions (главное меню > Actions > Show Action list...)
Нажать New Action > Load ReaScript
Выбрать файл BigClockExtra_mod.lua
В списке появится новая команда Script: BigClockExtra_mod.lua - дополнительные часы, которые по умолчанию часы не показывают, только минуты. Открывать эти часы можно непосредственно из окна Actions (выбрать в списке эту команду и нажать кнопку Run). Как для любой другой команды, для неё можно назначить горячие клавиши или добавить на панель инструментов.
Спасибо.
Только сегодня утром прослушал интервью Мартынова Кронос Квартету.
Он говорит о том же самом по времени музыкальных сочинений.
Видимо, так сегодня работает психология людей.
Если широкое дыхание материала, это всегда более часа...
Но Кронос Квартет хотел от него формат Попсы в 5 минут.
Как он справился, послушаю...
Но не стоит забывать о том, что концентрация музыкальной интонации длится 10 секунд.
И Хоральная Прелюдия Баха f-moll — 3 минуты. И треть ее, автор решает как ее завершить.
|
|
|
|
vkDanilov
Стаж: 9 лет 11 месяцев Сообщений: 1940
|
vkDanilov ·
15-Май-25 17:58
(спустя 8 часов)
sllssllsslls писал(а):
87782813Но Кронос Квартет хотел от него формат Попсы в 5 минут.
Как он справился, послушаю...
Не забудьте сообщить результат: сумел ли он раздышать материал достаточно широко за столь короткое время.
|
|
|
|
sllssllsslls
 Стаж: 15 лет 4 месяца Сообщений: 238
|
sllssllsslls ·
16-Май-25 11:28
(спустя 17 часов, ред. 16-Май-25 11:28)
vkDanilov писал(а):
87784329
sllssllsslls писал(а):
87782813Но Кронос Квартет хотел от него формат Попсы в 5 минут.
Как он справился, послушаю...
Не забудьте сообщить результат: сумел ли он раздышать материал достаточно широко за столь короткое время.
Работает.
Спасибо.
Но.
Вопрос, а кому нужны миллисекунды?
Кстати, у Мартынова на 5 минут, скажем прямо, ничего толкового не получилось. В творческом процессе всегда так.
|
|
|
|
vkDanilov
Стаж: 9 лет 11 месяцев Сообщений: 1940
|
vkDanilov ·
17-Май-25 11:04
(спустя 23 часа)
sllssllsslls писал(а):
87786890кому нужны миллисекунды?
Извольте, без миллисекунд:
sllssllsslls писал(а):
87786890у Мартынова на 5 минут, скажем прямо, ничего толкового не получилось
Ой-ёёёёё. Мне хватило нескольких секунд. Больше 5 минут, боюсь, не выдержу физиологически:)
|
|
|
|
shamagov
Стаж: 15 лет 11 месяцев Сообщений: 2517
|
shamagov ·
17-Май-25 12:26
(спустя 1 час 21 мин.)
vkDanilov
vkDanilov писал(а):
87790454
sllssllsslls писал(а):
87786890кому нужны миллисекунды?
Извольте, без миллисекунд:
Вот это реально полезная штука получилась - Большое спасибо, vkDanilov !!
________________________________________________________________________
_________
P.S. и теперь не надо отвлекаться на рандомное совпадение/не совпадение тысячных )
|
|
|
|
semiono
 Стаж: 14 лет 3 месяца Сообщений: 2187
|
semiono ·
18-Май-25 22:21
(спустя 1 день 9 часов, ред. 18-Май-25 22:21)
Цитата:
Индикаторы всегда будут в сброшенном состоянии. Месье знает толк в извращениях?
Есть же MIDI KeyOff, когда клавиша не нажата или Velocity = NUL | Допустим ещё могут быть две клавиши одновременно или аккорды, но это можно не учитывать)
Можно пример ещё на сброс пиков по KeyOff, пожауйста? Кстати, а как запустить чтобы всегда скрипт работал? У меня например висит _startup.lua, может туда приписать?
|
|
|
|
sllssllsslls
 Стаж: 15 лет 4 месяца Сообщений: 238
|
sllssllsslls ·
19-Май-25 06:47
(спустя 8 часов, ред. 19-Май-25 06:47)
vkDanilov писал(а):
87790454
sllssllsslls писал(а):
87786890кому нужны миллисекунды?
Извольте, без миллисекунд:
sllssllsslls писал(а):
87786890у Мартынова на 5 минут, скажем прямо, ничего толкового не получилось
Ой-ёёёёё. Мне хватило нескольких секунд. Больше 5 минут, боюсь, не выдержу физиологически:)
Ваше Благородие, низкий поклон от композиторов...
Работает.
Спасибо
|
|
|
|
vkDanilov
Стаж: 9 лет 11 месяцев Сообщений: 1940
|
vkDanilov ·
19-Май-25 12:37
(спустя 5 часов)
semiono писал(а):
87797128Можно пример ещё на сброс пиков по KeyOff?
Вы можете наблюдать как работают другие скрипты с подобной функциональностью (Reaticulate, Retrospective Record). Просто скрипта не достаточно. Всегда в таких случаях в цепочку эффектов трека добавляется jsfx-плагин, чтобы иметь доступ к аудио/миди потоку. А результаты мониторинга этот плагин оставляет в специально отведённой для этого памяти, из которой скрипт периодически считывает информацию и как-то на неё реагирует.
JSFX-плагин:
CatchNoteOFF
Код:
/*
Setup: place this file in <REAPER resource path>\Effects\midi\
*/ desc: CatchNoteOFF options:gmem=semiono_gmem
in_pin: none
out_pin: none @block
while(midirecv(offset,msg1,msg2,msg3))
(
(msg1&$xF0==$x80 || (msg1&$xF0==$x90 && msg3==0)) ?
gmem[0] = 1;
midisend(offset,msg1,msg2,msg3);
);
Плагин мониторит проходящие через него миди-сообщения и устанавливает в слоте 0 области памяти с именем "semiono_gmem" флаг 1 (сообщение NoteOFF получено).
Скрипт:
Reset master track meter hold state.lua
Код:
_, _, sectionID, cmdID, _, _, _ = reaper.get_action_context()
reaper.SetToggleCommandState(sectionID, cmdID, 1)
reaper.RefreshToolbar2(sectionID, cmdID) function onExit()
reaper.gmem_attach("")
reaper.SetToggleCommandState(sectionID, cmdID, 0)
reaper.RefreshToolbar2(sectionID, cmdID)
end reaper.gmem_attach("semiono_gmem") function run()
local catch = reaper.gmem_read(0)
if catch and catch == 1 then
reaper.Track_GetPeakHoldDB(reaper.GetMasterTrack(0), 1024, true)
reaper.gmem_write(0,0)
end
reaper.defer(run)
end reaper.defer(run)
reaper.atexit(onExit)
Скрипт при запуске присоединяется к области памяти "semiono_gmem" и периодически (~30Гц) проверяет флаг в слоте 0. Если он установлен, то сбрасывает пики на мастер-треке и сбрасывает сам флаг, чтобы ничего не делать до тех пор, пока плагин снова не установит этот флаг, получив очередное сообщение NoteOFF.
Тут всего две ноты, громкость синтезатора перед взятием второй ноты автоматизирована до нуля.
Когда скрипт срабатывает в конце первой ноты, сброшенные пики сразу же частично восстанавливаются (из-за послезвучия),
когда скрипт срабатывает в конце второй ноты, показания равны минус бесконечности, потому что послезвучие от первой ноты уже угасло, а вторая звука не издаёт.
|
|
|
|
vkDanilov
Стаж: 9 лет 11 месяцев Сообщений: 1940
|
vkDanilov ·
19-Май-25 19:29
(спустя 6 часов, ред. 19-Май-25 19:29)
shamagov писал(а):
87790740P.S. и теперь не надо отвлекаться на рандомное совпадение/не совпадение тысячных )
В последней редакции скрипта много изменений - добавлены цвета, сохранение положения окна, отображение миллисекунд, устойчивое, я надеюсь  к барахлению системного таймера и пр.
sllssllsslls писал(а):
87797770низкий поклон от композиторов...
Не принимается, пока композиторы доходчиво не объяснят в чём смысл этой какофонии и для кого/чего они её пишут.
Большие композиторы, по-моему, настолько отклонились от "архетипической модели", что и вправду можно сказать: время композиторов прошло. Ушли в открытый космос и не вернулись. В чёрную дыру затянуло
|
|
|
|