Cockos REAPER v7.48 x64 [2025, ENG + RUS]

Страницы :   Пред.  1, 2, 3 ... 11, 12, 13, 14, 15, 16  След.
Ответить
 

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низкий поклон от композиторов...
Не принимается, пока композиторы доходчиво не объяснят в чём смысл этой какофонии и для кого/чего они её пишут.
Большие композиторы, по-моему, настолько отклонились от "архетипической модели", что и вправду можно сказать: время композиторов прошло. Ушли в открытый космос и не вернулись. В чёрную дыру затянуло
[Профиль]  [ЛС] 
 
Ответить
Loading...
Error