Анализ аудио для автоматического создания уровней Guitar Hero - PullRequest
5 голосов
/ 20 ноября 2011

Я пытаюсь создать игру, похожую на Guitar-Hero (что-то вроде this ), и я хочу иметь возможность анализировать аудио-файл, предоставленный пользователем, и автоматически создавать уровни, но яне знаю, как это сделать.

Я подумал, что, возможно, мне следует использовать алгоритм обнаружения BPM и поместить стрелку на такт и рельс на некоторый повторяющийся паттерн, но я понятия не имею, как это реализовать.

Кроме того, я использую BlockAlignReductionStream от NAudio, у которого есть метод Read, который копирует данные byte [], но что происходит, когда я читаю 2-канальный аудиофайл?это читает 1 байт от первого канала и 1 байт от второго?(потому что он говорит 16-битный PCM) и то же самое происходит с 24-битным и 32-битным плавающим числом?

1 Ответ

8 голосов
/ 20 ноября 2011

Обнаружение удара (или, более конкретно, определение ударов в минуту)

Обзор алгоритма обнаружения удара для использования гребенчатого фильтра:

Похоже, что они делают:

Здесь вам нужно будет реализовать множество алгоритмов.Тем не менее, гребенчатые фильтры работают медленно. Статья в вики не указала мне на другие конкретные методы.

Редактировать: Эта статья содержит информацию о потоковых статистических методах обнаружения ударов.Это звучит как отличная идея: http://www.flipcode.com/misc/BeatDetectionAlgorithms.pdf - держу пари, они работают лучше в режиме реального времени, хотя и менее точны.

Кстати, я просто просмотрел и вытащил ключевые слова.Я играл только с фильтрами БПФ, выпрямления и ослабления (фильтр нижних частот).Об остальном я понятия не имею, но у вас есть ссылки.

Это все даст вам BPM песни, но не сгенерирует ваши стрелки для вас.

Генерация уровней

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

Вы можете пойти по более агрессивному подходу извлечения контента и попытаться извлечь ноты из песни.

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

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

Вы также можете попробовать использовать подход генерация контента .

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

Большинство алгоритмов сосредоточены вокруг создания визуального контента, включая ландшафт, архитектуру, гуманоидов, растения и т. Д. Есть некоторые исследованияо генерации аудиоконтента, Генеративная музыка и т. д. Ваши требования не полностью соответствуют ни одному из этих.

Я думаю, что алгоритмы для процедурных "танцевальных шагов" (если такая вещь существует - ятолько найденные анимационные приемы) или Generative Music будет самым близким совпадением, если управляться ритмами, которые вы обнаружите в песне.

Если вы хотите использовать подход генерации композиции, будьте готовы ко многим совершенно другималгоритмы, о которых обычно только намекают, но которые не объясняются подробно.

Например:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...