Войти
ПрограммированиеФорумЗвук

Выделить ударные в звуковой волне программно

Страницы: 1 2 Следующая »
#0
11:37, 8 окт. 2020

Ситуация следующая:
В игре играет музыка, в которой есть ударные. Звучащую звуковую волну я могу получать каждый кадр game loop-а фрагментами по 256 значений (значение из sound buffer). Формат sound buffer-а - float.
Есть ли простой способ программно (без использования тяжелых библиотек) определить наличие в звучащей волне удара в барабан? Хочу сделать в момент удара синхронный визуальный эффект.

#1
(Правка: 12:47) 12:45, 8 окт. 2020

1. я бы попробовал сделать так:
на основании данных буфера (вернее отрезка определенной длины) рассчитывать производную среднеквадратичной амплитуды. для каждого трека ручками подбираем трешхолд срабатывания (по производной). и так же ручками подбираем длину учитываемого отрезка буфера (чем более мягкие барабаны, тем длинее он должен быть).

2. есть подозрение, что в реальном времени это не сработает. для того, чтобы визуальный эффект выглядел достаточно эффектно, он не должен запаздывать - расхождение даже 10мс может лишить затею драйва. так что, возможно, придется распознавать барабаны заранее - до того, как фрагмент стал проигрываться.

#2
(Правка: 13:49) 13:40, 8 окт. 2020

kkolyan
Благодарю за идеи!

Если я правильно думаю, то первый способ сработает, если ударные доминируют по амплитуде над остальными инструментами? И этот способ не сработает если музыка насыщена другими инструментами, которые колебания волны звука утопят в какофонии других гармоник?

Насчет тайм-лага между ударом барабана и визуальным эффектом - согласен. Поэтому буду смотреть в сторону предварительного расчета. Интересно, есть ли софт, который может помочь решить эту задачу...

#3
15:17, 8 окт. 2020

Vitorio
> Интересно, есть ли софт, который может помочь решить эту задачу...
splitter.ai умеет

#4
(Правка: 16:55) 16:43, 8 окт. 2020

Vitorio

И этот способ не сработает если музыка насыщена другими инструментами, которые колебания волны звука утопят в какофонии других гармоник?

Надо выделять первую гармонику и смотреть скорость затухания, причём фильтровать герц так до 200-300.
Барабан | Выделить ударные в звуковой волне программно
Я бы сделал по таймеру, заранее отметив нужные временные отрезки.
#5
21:59, 8 окт. 2020

А что у Вас там за музыка? Если это не треки, загружаемые пользователем, а темп фиксированный и точно известный, то, может быть, проще хранить темп для каждого трека, и каждые N миллисекунд проигрывать визуальный эффект. N = 60 / BPM * 1000, то есть каждый клик метронома.

#6
5:17, 9 окт. 2020

Vitorio

Быстрое преобразование Фурье - базисный алгоритм для разложения звука на спектр.
Дальше действительно смотреть внимательно спектральные характеристики отличающие биты от остального звука. Скорее всего где то в низких частотах будут большие и быстро затухающие всплески.

#7
(Правка: 11:22) 10:15, 9 окт. 2020

=A=L=X=
Именно так, на преобразовании Фурье (Bass FFT) на картинке выше и сделано. Выделение барабана "Бочка" из реальной музыки.
Но дело в том, что  идентифицировать нужный семпл можно только по затуханию, иначе можно спутать с басом. По этому этот метод вряд-ли подойдёт. Синхронно таким методом никак не сделать, а на глаз это заметно.
Лучше сделать массив временных меток. Как правило, они будут равны тактам музыки и не важно приходится удар на слабую, или сильную долю - временные расстояния будут одними и теми-же.
Если удары происходят хаотично, то массив придётся размечать вручную.

P.S.
Можно вообще сделать оттенки освещения в виде "Цветомузыки".
(На скорую руку сделал пока пост писал, по этому дизайн оставляет желать лучшего)  ))

#8
(Правка: 8:31) 8:25, 16 окт. 2020

Извиняюсь за задержку с ответами. Экспериментировал по идеям, которые вы написали.

Aroch
> splitter.ai умеет
Прикольная штука. Правда обработка одного трека занимает сутки. После загрузки трека в этот сервис, трек ставится в очередь на обработку и по завершении приходит уведомление на email. Результаты очень даже неплохие. Спасибо!


RMGI
> А что у Вас там за музыка? Если это не треки, загружаемые пользователем, а темп
> фиксированный и точно известный, то, может быть, проще хранить темп для каждого
> трека, и каждые N миллисекунд проигрывать визуальный эффект. N = 60 / BPM *
> 1000, то есть каждый клик метронома.
Вот пример: https://opengameart.org/content/childrens-march-theme
Если ориентироваться на BPM , то картину портят удары барабана, которые выпадают на другую долю в 4-ом такте (или как там это правильно называется в музыке), т.е. 3 такта идет с ударом барабана в одно и то же время, а в 4-ом такте есть смещение. Будет расползаться визуал со звуком. Я даже прикрутил к игре MiniBPM для определения BPM на лету, но результат не очень порадовал, так как детектор иногда ошибается.

=A=L=X=
> Быстрое преобразование Фурье - базисный алгоритм для разложения звука на
> спектр.
flint2
> Можно вообще сделать оттенки освещения в виде "Цветомузыки".
> (На скорую руку сделал пока пост писал, по этому дизайн оставляет желать
> лучшего) ))
Анализ диаграммы, полученной через FFT показала хорошие результаты и у меня, но все равно есть промахи, вот буду с ними разбираться. Спасибо!
flint2 классное приложение, у меня примерно то же самое получилось! В твоем приложении ползунки для настройки границ чувствительности оказались очень удобными в использовании:)

#9
9:36, 16 окт. 2020

Vitorio
> (или как там это правильно называется в музыке), т.е. 3 такта идет с ударом
> барабана в одно и то же время, а в 4-ом такте есть смещение.
В музыке это называется синкопа, но в твоём примере синкопы нет, просто некоторые такты более густо заполнены, малый барабан вообще часто играет дробь.
Не очень понятна твоя конечная цель. Тебе нужно определить удар барабана, но барабаны бывают разные, по ним бьют в разные моменты.

#10
19:42, 16 окт. 2020

Vitorio
> Правда обработка одного трека занимает сутки.
когда только начинали несколько минут занимало, а потом нахлынул народ и имеем то что имеем. Давно правда не пользовался.
> Вот пример
если трэков не много то наверное будет проще и быстрее вручную расставить.

#11
9:49, 17 окт. 2020

Может нужно просто уловить основной ритм музыки? Тут есть мысли:
Строить огибающие, как общие, так и для разных полос частот. В огибающей оставлять только самые низкие частоты, ниже 2-4 Гц. Поясню, речь не о частотах в музыке - там таких частот нет, а о частоте пульсации самой огибающей.
Потом вычислить спектр огибающей, найти в нём пики - нижний пик и будет основным пульсом композиции.
Сравнивать огибающие разных частотных диапазонов, искать кратности частот пиков, иногда (редко) основной ритм может задаваться не нижними, а средними частотами.

#12
(Правка: 13:26) 13:25, 17 окт. 2020

Алгоритмов цифровой обработки сигналов дофига, в том числе и тех, что не основаны на бпф. Еще не очень давно бпф в реальном времени было делать затруднительно, использовались менее затратные по вычислениям алгоритмы. Простыми их никак не назовешь, надежными тоже. Книжек довольно много по этой тематике, но не имея матмеховского образования прочитать их затруднительно.
Помнится, в институте у нас был соответствующий курс, хоть чуть-чуть понимали лишь выпускники физматшкол, остальные ушами хлопали, аккуратно записывали аброкадабру, надеясь разобраться потом, но шансов разобраться не было, естественно. Ну, не было у нас никакой теории множеств, инженерам ее не давали, только теоретикам-математикам, но почему то думали что все ей владеют как русским языком.

#13
13:29, 17 окт. 2020

Zab
> Еще не очень давно бпф в реальном времени было делать затруднительно,
> использовались менее затратные по вычислениям алгоритмы. Но простыми их никак
> не назовешь, надежными тоже.
Я предпочитаю резонансные фильтры - очень просто, малозатратно, в отличие от БПФ можно делать логарифмическое распределение по частотной шкале.
Но особо меня вымораживает, когда БПФ используют для простых вещей, типа ФВЧ или ФНЧ.

#14
13:44, 17 окт. 2020

Алгоритмов потому и много, что хорошего нет ни одного. Выбирают лучшее из худшего.
Удивляло что нет литературы по этой тематике, доступной инженерам, а не ученым-математикам-теоретикам. Понятно что разрабатывают алгоритмы математики, но пользуются то инженеры, им ориентироваться надо, выбирать осознанно. Или сейчас литература появилась, а я не знаю?

Страницы: 1 2 Следующая »
ПрограммированиеФорумЗвук