Музыкальная справка

user0501

New Member
8 Июл 2017
10
0
1
54
Доброго времени суток, коллеги.

Если я плохо и неправильно искал по форуму, то ткните меня, пожалуйста курсором в ссылку, а
суть в том, что я никак не могу отыскать номальный способ выведения в текстовый файл списка айтемов с таймкодами начала и конца оных на таймлайне. Проще говоря, в списке должны быть названия файлов с таймкодами их использования на таймлайне., типа:
01_Prime-Mover.wav | 00:00:00.00 | 00:01:33.24|
38_Funkalicious-2.wav | 00:01:34.00 | 00:02:59.07|
и т.п.

Возможно, у кого-то из вас уже ваозникала подобная проблема, так поделитесь решением, пожалуйста.
Право слово, спасёте от глупой траты времени по ручному выписыванию сотен таймкодов.
Заранее спасибо. :)

//
 
Вот так устроит?
=========================================
Track Name : P1
27-GTR01_IN-170730_1742.wav | 30.643994320628 | 85.973428510651 |
37-BAS01_IN-170730_1605-glued.wav | 101.29542567097 | 275.79594888565 |
63- VOC 1-170730_1924.wav | 339.63760372029 | 534.19545833333 |
48-SNARE TOP-170730_1529-glued-02.wav | 51.924545932175 | 215.35918230886 |
51-HI HAT-170730_1529-glued-02.wav | 259.62272966088 | 349.85226849384 |
=========================================
Track Name : P2
27-GTR01_IN-170730_1742.wav | 30.643994320628 | 85.973428510651 |
37-BAS01_IN-170730_1605-glued.wav | 101.29542567097 | 275.79594888565 |
63- VOC 1-170730_1924.wav | 339.63760372029 | 534.19545833333 |
48-SNARE TOP-170730_1529-glued-02.wav | 51.924545932175 | 215.35918230886 |
51-HI HAT-170730_1529-glued-02.wav | 259.62272966088 | 349.85226849384 |

начало и и конец айтема на таймлайне в секундах
 
  • Like
Реакции: user0501
Александр, большое спасибо за участие, но, к сожалению, каналу нужно в формате часы:минуты:секунды.кадры
Кадров, естественно, в секунде ровно 25. Можно как-то к вашему способу прикрутить формулу преобразования секунд в нужный мне формат? Или как-то привязаться к настройкам проекта?
В любом случае, спасибо!

//
 
@user0501, обязательно Reaper или можно другой софт? Сдаёте материал ведь всё равно цельной аудиодорожкой? И именно айтемов или реального начала-конца звучания?
 
@RockMeister, я работаю в рипере.
Материал действительно сдаётся цельными дорожками, а внутри дорожек реальная длительность звучания кусков музла как раз и совпадает с айтемами. То есть нужны таймкоды начала и конца айтема относительно начала всей программы, а какая именно часть музыкальной композиции попала в этот айтем — не важно, важно лишь, какая это композиция. Канал сам подсчитает общую длительность звучания каждой композиции в конкретной программе. Эти сведения каналу нужны для отчёта в РАО с точным указанием в каком месте программы звучала та или иная композиция, авторские права которой блюдёт РАО. Это ведь денюжки.
 
@user0501, я понимаю, сам сдаю такие справки. Только точки вход-выхода у меня по реальному звучанию. Ладно, если надо в Рипере, то в нём я не шарю :)
 
@Aleksandr Oleynik, большое спасибо. У меня в свойствах проекта frame rate установлен на 25, а на таймлайне выбрано отображения таймкода часы:минуты:секунды:кадры.
[DOUBLEPOST=1513200823][/DOUBLEPOST]@RockMeister, а что значит "по реальному звучанию"? Разве кусок музыки на тамлайне с началом в 00:01:34.00 и концом в 00:02:59.07 звучит не от 00:01:34.00 и до 00:02:59.07?
 
PHP:
function msg(s) if s then  reaper.ShowConsoleMsg(s..'\n') end end
reaper.ClearConsole()
for i = 1, reaper.CountMediaItems(0) do
  it = reaper.GetMediaItem(0,i-1)
  it_pos =  reaper.GetMediaItemInfo_Value( it, 'D_POSITION' )
  it_len =  reaper.GetMediaItemInfo_Value( it, 'D_LENGTH' )
  name =  ({reaper.GetSetMediaItemTakeInfo_String( reaper.GetActiveTake( it ), 'P_NAME', '', 0 )})[2]
  msg(name..' | '..reaper.format_timestr_pos( it_pos, '', 5 )..' | '..reaper.format_timestr_pos( it_pos+it_len, '', 5 ))
end
 
@user0501, начало айтема не всегда значит начало звучания. В начале айтема, которые начинается с сильной доли по сетке может быть и тишина, если музыка начинается с затакта; или подготовительные контроллеры, кейвситчи. Также и конец айтема не всегда обозначает конец звука - хвосты дилэя, например.
 
@@Michael, этот скрипт, чёрт побери, именно то, что нужно! Большое спасибо!
Скажите, а кроме пейпала есть ещё какой-то способ передать Вам бутылочку очень хорошего пива?
@RockMeister, я Вас понял. Мне достаточно отчитаться нарезкой файлов. Спасибо за беседу.
@Aleksandr Oleynik, Вам тоже низкий поклон, знаком с Вами заочно ещё с 2003 года по сайту Арти.
 
Ха-Ха, пока писал скрипт Михаил уже выдал результат.
Причём я как-то и не знал, что есть API reaper.format_timestr_pos и сам написал функцию формата :) (проверил - мой скрипт выдаёт те-же результаты, что и Михаила, значит функцию правильно написал) -
PHP:
----------------------------------------------------------------------------------------------------
local msg = function(M) reaper.ShowConsoleMsg(tostring(M).."\n") end
----------------------------------------------------------------------------------------------------

function FormatTime (time)
  local sec = time
  h = math.floor(sec/3600)
  m = math.floor((sec-h*3600)/60)
  s = math.floor(sec-h*3600-m*60)
  frame = math.floor((string.sub(sec, -3))*25/1000)
  if h < 10 then
    h = "0"..h
  end
  if m < 10 then
    m = "0"..m
  end
  if s < 10 then
    s = "0"..s
  end
  if frame < 10 then
    frame = "0"..frame
  end
  newformattime = h..":"..m..":"..s..":"..frame
  return newformattime
end
local counttracks = reaper.CountTracks(0)
if counttracks == nil then return end
for i=1, counttracks do
  local track = reaper.GetTrack(0, i-1)
  local tr_name = ({reaper.GetSetMediaTrackInfo_String(track, 'P_NAME', '', false)})[2]
  msg("=================================================")
  msg("Track Name : "..tr_name)
  countitem = reaper.CountTrackMediaItems( track )
  for i=1, countitem do
    local item = reaper.GetTrackMediaItem(track, i-1)
    if item then
      local take = reaper.GetActiveTake(item)
      local item_name = reaper.GetTakeName(take)
      local item_start = reaper.GetMediaItemInfo_Value(item, "D_POSITION")
      local item_end = item_start + reaper.GetMediaItemInfo_Value(item, "D_LENGTH")
      local item_start = math.floor(item_start*1000)/1000
      local item_end = math.floor(item_end*1000)/1000
      item_start_n = FormatTime (item_start)
      item_end_n = FormatTime (item_end)
      msg(item_name.."        |  "..item_start_n.."  |  "..item_end_n.."  |  ")
    end
  end

end
----------------------------------------------------------------------------------------------------

У Миши 9 строк скрипт, у меня 49 :) (ну...., в лёгкое оправдание - я там имя трека ещё сканирую и вывожу, но это 7-10 строк).
[DOUBLEPOST=1513203052][/DOUBLEPOST]
@Aleksandr Oleynik, Вам тоже низкий поклон, знаком с Вами заочно ещё с 2003 года по сайту Арти.
О, приятно это читать! Videoediting.ru лучший русскоязычный ресурс по видеоэдитингу в инете, впрочем как и этот по аудиоэдитингу!

PS: Я там ошибок в коде наделал - сейчас исправил!
 
Последнее редактирование:
  • Like
Реакции: user0501
@Aleksandr Oleynik, большое спасибо и за Ваш скрипт.
Но, к сожалению, не понятно по какому принципу, но некоторые таймкоды округляются до секунд. Пример:

Вот правильные таймкоды:
09_Cant-Keep-Me-Down-3.wav | 0:00:13:00 | 0:00:32:18
09_Cant-Keep-Me-Down-3.wav | 0:00:32:18 | 0:00:53:07
09_Cant-Keep-Me-Down-3.wav | 0:00:53:07 | 0:01:06:02
09_Cant-Keep-Me-Down-3.wav | 0:01:06:02 | 0:01:33:17

А вот, что получается в Вашем скрипте:
09_Cant-Keep-Me-Down-3.wav | 00:00:13:00 | 00:00:32:00 |
09_Cant-Keep-Me-Down-3.wav | 00:00:32:00 | 00:00:53:00 |
09_Cant-Keep-Me-Down-3.wav | 00:00:53:00 | 00:01:06:02 |
09_Cant-Keep-Me-Down-3.wav | 00:01:06:02 | 00:01:33:00 |

Судя по всему, где-то математика хромает. Скрипт Михаила работает абсолютно точно, но там и вычислений никаких нет.
Давайте сделаем так: чтобы Ваш скрипт не пропал зря, может, модифицируем его для подсчёта общей длительности всех вкючений каждого файла в программе? Кадры тут не нужны, только общая продолжительность с точностью до секунды.
Или такое уже есть?

В любом случае, я очень благодарен Вам за участие. Спасибо!

//
 
Судя по всему, где-то математика хромает.
Я исправл код - заберите исправленный в атаче
Проверьте, мне интересно....
[DOUBLEPOST=1513204956][/DOUBLEPOST]
для подсчёта общей длительности всех вкючений каждого файла в программе
Нужна общая длительность всех айтемов?
Это проще вывести в скрипте Михаила, могу дописать, если он не сделает.
 

Вложения

Вот Михаила скрипт с выводом в конце общего времени длин всех айтемов в проекте -

PHP:
function msg(s) if s then  reaper.ShowConsoleMsg(s..'\n') end end
reaper.ClearConsole()
all_it_len = 0
for i = 1, reaper.CountMediaItems(0) do
  it = reaper.GetMediaItem(0,i-1)
  it_pos =  reaper.GetMediaItemInfo_Value( it, 'D_POSITION' )
  it_len =  reaper.GetMediaItemInfo_Value( it, 'D_LENGTH' )
  name =  ({reaper.GetSetMediaItemTakeInfo_String( reaper.GetActiveTake( it ), 'P_NAME', '', 0 )})[2]
  msg(name..'     | '..reaper.format_timestr_pos( it_pos, '', 5 )..' | '..reaper.format_timestr_pos( it_pos+it_len, '', 5 )..' |')
  all_it_len = it_len + all_it_len
end
msg('\n'.."All Time  = "..string.sub((reaper.format_timestr_pos( math.floor(all_it_len), '', 0 )), 0,-5))

Только не забывайте правильный фрэймрейт ставить в проекте - 25!!!!
Знаете где?
2017-12-14_012100.png
А то у вас видимо разные показания в моём и Михаиле скрипте именно из-за не верно установленного фреймрета?
Если нужно всё это по трекам как-то разбить - пишите, разобьём.
 
Последнее редактирование:
@Aleksandr Oleynik, я всегда поражался и завидовал вашей работоспособности и обучаемости. Уже много лет втихаря забираю в свою копилку полезности, которыми Вы делитесь с другими людьми, и удивляюсь тому, что практически во всех областях и обо всех программах вы имеете значительно более, чем просто поверхностное понятие, необходимое для обычной работы. Вот и здесь: я в рипере работаю уже не первый год, но чтоб самому разобраться в скриптах... Короче, Вы большой молодец, спасибо Вам.
Возвращаясь к нашим баранам, хочу сказать, что новый скрипт всё равно лажает. Разумеется, фреймрейт проекта выставлен в 25 кадров, иначе сетка не будет совпадать с кадрами видео, под которое это всё монтируется. Я, кстати, это упоминал чуть выше. Вот кошки, на которых я упражняюсь — yadi.sk/d/64BMhKwC3Qbjmg — для отлаживания скрипта.
Сразу оговорюсь, что музыка в этом проекте хоть и из свободного доступа, но использовать её в коммерческих продуктах нельзя.
Насчёт длительности: судя по всему, я настолько коснопечатен, что не смог всё правильно объяснить. Нужно общее время не всех композиций, но общее время каждой композиции, задействованной в проекте. Но это, как мне кажется, довольно сложно реализовать, поскольку неизвестно, какое количество разных файлов уйдёт на ту или иную программу.
В любом случае, большое Вам спасибо и всех благ. :)
С иск. ув. и пр.

//
 
Нужно общее время не всех композиций, но общее время каждой композиции, задействованной в проекте.
И даже теперь я не очень всё равно понял что нужно :(
Есть, например две всего песни Song 1 и Song 2 . Первая имеет длительность 3 минуты, вторая 4 минуты.
Первая в проекте используется три раза, причём первых два полностью, а третий всего 2 минуты
Вторая используется два раза и из них оба по 2 минуты
Нужно вычислить, что -
Song 1 = 8 минут
Song 2 = 4 минуты
Так?
[DOUBLEPOST=1513274019][/DOUBLEPOST]
новый скрипт всё равно лажает
Я всё равно посмотрю конечно же, что там не так, но имеем скрипт Михаила и он работает правильно, по этому мои изыскания чисто теоретические.
А вот со второй задачей -
Но это, как мне кажется, довольно сложно реализовать, поскольку неизвестно, какое количество разных файлов уйдёт на ту или иную программу.
Это хорошо известно по именам Файлов. Важно понять что вычислять.
 
Вот кошки, на которых я упражняюсь — yadi.sk/d/64BMhKwC3Qbjmg — для отлаживания скрипта.
Увы, я так и не подружил свою сеть со всякого рода VPN-ами, а без них я с яндекса ни чего скачать не могу :(
 
Ну я тот ещё объясняльщик, как выясняется. :)
@Aleksandr Oleynik, у Вас гораздо лучше получилось, и — да, именно это и имелось ввиду.
Тут возникают ещё пожелания по модификации скрипта Михаила. А нельзя ли сделать так, чтобы список автоматически сокращался вот по такому принципу:
0:10:52:03 | 0:11:35:09 | ANW2875_09_Cant-Keep-Me-Down-3.wav
0:11:35:09 | 0:11:49:21 | ANW2875_09_Cant-Keep-Me-Down-3.wav
0:11:49:21 | 0:12:14:09 | ANW2875_09_Cant-Keep-Me-Down-3.wav
0:12:14:09 | 0:12:31:02 | ANW2875_09_Cant-Keep-Me-Down-3.wav
0:12:31:02 | 0:12:37:00 | ANW2875_09_Cant-Keep-Me-Down-3.wav
0:12:37:00 | 0:13:00:20 | ANW2875_09_Cant-Keep-Me-Down-3.wav
0:13:00:20 | 0:13:02:01 | ANW2875_09_Cant-Keep-Me-Down-3.wav
0:13:02:01 | 0:13:03:24 | ANW1494_38_Funkalicious-2.wav
0:13:03:24 | 0:13:41:00 | ANW2916_05_Hardware.wav
0:13:41:00 | 0:14:11:19 | ANW2916_05_Hardware.wav
0:14:11:19 | 0:14:36:09 | ANW2916_05_Hardware.wav
0:14:38:05 | 0:14:39:15 | MASTER 5_7.wav
0:14:39:15 | 0:15:03:07 | ANW2756_82_Fun-3.wav
0:15:03:07 | 0:15:05:02 | MASTER 5_7.wav
0:15:05:10 | 0:17:24:13 | ANW2607_87_Southbound-2.wav
0:17:24:13 | 0:18:04:10 | ANW2607_87_Southbound-2.wav
0:18:04:10 | 0:18:47:13 | ANW2607_87_Southbound-2.wav
0:10:52:03 | 0:13:02:01 | ANW2875_09_Cant-Keep-Me-Down-3.wav
0:13:02:01 | 0:13:03:24 | ANW1494_38_Funkalicious-2.wav
0:13:03:24 | 0:14:36:09 | ANW2916_05_Hardware.wav
0:14:38:05 | 0:14:39:15 | MASTER 5_7.wav
0:14:39:15 | 0:15:03:07 | ANW2756_82_Fun-3.wav
0:15:03:07 | 0:15:05:02 | MASTER 5_7.wav
0:15:05:10 | 0:18:47:13 | ANW2607_87_Southbound-2.wav
?
В принципе, и вручную потом недолго отредактировать, но если интересно добить скрипт до совершенства,
то дополнительно ещё можно в заголовке списка указать и название проекта.
 
Вот новый адрес проекта:
h t t p s://mega.nz/#!pVNGSCaR!_QDS0MQhm2djCpO3CnRJePFGS9QJ1TkcKJb9p4hSgt0
 
@user0501, а если между композициями (одноимёнными) есть всё-же промежуток? Или они используются не подряд, а через пару других композиций?

Всё как обычно - нет четко продуманной и озвученной задачи, и на это тратится основное время.

Может вы всё же продумаете задачу целиком и её подробно озвучите?
Я ведь не в теме технологического процесса и не знаю в каком виде и какая информация нужна в итоге... Я даже не понимаю - у вас один или много треков в проекте и нужно ли это как-то по треково делить или всё скопом?
Мне кажется, что список должен быть as is - вот как расположенны айтемы в проекте, так списком их и выводить.
А вот необходимую просуммированную информацию выводить отдельно в каком то (???) виде.
 
Последнее редактирование:

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