Комментарии 11
Спасибо за статью, и сразу вопрос ) А что если в песне bpm будет меняться?
0
Еще одно.
Делайте в настройках регулируемую задержку между звуком и изображением, в идеале небольшой кнопочкой перед запуском уровня. Т.к. человек в разном состоянии имеет разную скорость реакции «глаз/ухо-мозг-обработка-руки», то при полностью синхронном выводе изображения и звука обязательно получится ощущаемый рассинхрон.
Делайте в настройках регулируемую задержку между звуком и изображением, в идеале небольшой кнопочкой перед запуском уровня. Т.к. человек в разном состоянии имеет разную скорость реакции «глаз/ухо-мозг-обработка-руки», то при полностью синхронном выводе изображения и звука обязательно получится ощущаемый рассинхрон.
0
Я так и не понял, как из аудиофайла вычислить ноты и bps.
0
Я увы тоже (
Но это лишь перевод…
Сам дошёл лишь до «эквалайзер вид сверху»…
Но это лишь перевод…
Сам дошёл лишь до «эквалайзер вид сверху»…
0
Если в кратце, то никак :)
В ритм играх (допускаю, что конкретно в Guitar Hero это может быть не точно так, как написал), как правило, есть аудиотрек и так называемый simfile — мета-файл в котором и описаны:
Вот пример для кнопочной ритм-игры: DDR (ITG).
Там 4 кнопки — поэтому 4 символа в слове для состояния. Разумеется есть редактор, вручную набирать не приходиться:
В ритм играх (допускаю, что конкретно в Guitar Hero это может быть не точно так, как написал), как правило, есть аудиотрек и так называемый simfile — мета-файл в котором и описаны:
- GAP (OFFSET) — задержка от начала аудиофайла до первой ноты. Авторы часто подгоняют до первой ноты после вступления
- BPM — темп. Что очень важно, его надо считать очень точно, желательно 5-7 цифр после запятой
- BPM Changes — обычно время=новый_темп, время=новый_темп и т.д.
- Delay/Pause — остановки в треке. С нимим есть проблемы точности: паузы вычисляются со своей точностью, которая не совпадает с делением на доли ритма в треке. Их как правило стараются заменить на кратную смену темпа на что-то < 5 и обратно компенсируют. Для таких дел даже скрипт написан
- Массив данных — собственно, в каждый шаг трека какая нота должна быть сыграна
Вот пример для кнопочной ритм-игры: DDR (ITG).
Там 4 кнопки — поэтому 4 символа в слове для состояния. Разумеется есть редактор, вручную набирать не приходиться:
Cookie Thumper.sm
#TITLE:Cookie Thumper;
#SUBTITLE:;
#ARTIST:Die Antwoord;
#TITLETRANSLIT:;
#SUBTITLETRANSLIT:;
#ARTISTTRANSLIT:;
#GENRE:;
#CREDIT:;
#BANNER:../banner.png;
#BACKGROUND:../bg.png;
#LYRICSPATH:;
#CDTITLE:;
#MUSIC:Cookie Thumper.ogg;
#OFFSET:0.003;
#SAMPLESTART:48.350;
#SAMPLELENGTH:12.000;
#SELECTABLE:YES;
#BPMS:0.000=134.000,107.000=67.000,143.000=134.000;
#STOPS:92.000=0.448
;
#BGCHANGES:;
#KEYSOUNDS:;
//---------------dance-single — Nix----------------
#NOTES:
dance-single:
Nix:
Challenge:
10:
0.631,0.711,0.437,0.164,0.665:
0000
0000
0000
0000
,
0000
0000
0000
0000
,
0000
0000
0000
0000
,
0000
0000
0000
0000
,
0000
0000
0000
0000
,
0000
0000
0000
0000
,
2001
0000
3100
1000
0010
0100
0000
0110
,
0000
0100
0001
0010
1000
0000
0010
0000
,
0011
0000
0001
0100
1000
0100
0000
0110
,
0000
0010
1000
0100
0010
0000
0001
0000
,
1000
0000
1000
0100
0000
0100
0010
0000
0001
0000
0100
0010
1000
0000
0100
0000
,
0010
0001
0010
0100
0000
0100
1000
0010
0100
0000
0001
0000
1001
0000
0000
0001
,
0100
0010
1000
0010
0000
0010
0100
0001
0010
0000
0100
0000
1100
0000
0000
1000
,
0020
0000
0230
0000
0301
0100
0001
0000
0101
0000
1001
0000
2020
0000
3030
0000
,
0120
0000
0130
0001
0100
0010
1000
0000
1100
0000
0110
0000
0011
0000
0000
0000
,
0001
0000
0100
0010
1000
0100
0010
0001
1000
0000
0010
0000
0100
0000
0001
0000
,
0010
0100
1000
0001
0000
0001
1000
0010
0100
0000
0001
0000
0020
0000
0000
0000
,
0030
0000
0000
0000
0100
1000
0100
0010
0001
0000
0100
0000
0110
0000
0000
0000
,
1000
0010
0100
0001
1000
0100
1000
0001
0010
0000
0100
0000
0020
0000
0031
0000
,
0100
0010
0000
1000
0000
0010
0000
0010
0100
0000
0001
0000
1000
0000
0100
0010
,
0001
0010
0100
1000
0000
1000
0001
0100
0010
1000
0010
0000
0100
0000
0000
0000
,
0001
0010
0000
1000
0000
0010
0000
0100
1000
0010
0100
0000
0001
0000
0000
0000
,
1000
0100
0010
0100
0001
0100
0010
0000
0022
0000
0000
0000
0033
0000
1000
0000
,
1010
0000
0010
0100
0001
0000
1000
0000
1100
0000
0000
0000
0100
0000
0100
0010
,
0001
0010
0100
1000
0001
0000
0100
0000
0020
0000
0000
0000
0030
0000
0100
0000
,
0001
0000
0000
0000
1000
0000
1000
0010
0100
0001
0100
0000
0220
0000
0330
0000
,
2002
0000
0000
0000
0000
0000
3003
0000
0001
0000
1000
0001
1000
0000
0000
1000
,
0001
0100
0000
0110
0000
0010
1000
0100
0001
0000
0100
0000
1100
0000
0000
1000
,
0010
0100
0000
0110
0000
0100
0001
0010
1000
0000
0010
0000
0110
0000
0100
1000
,
0010
0100
0000
0101
0000
0001
0010
1000
0001
0000
0100
0000
1100
0000
0100
0010
,
0001
0000
0100
0000
0000
0000
0101
0000
0000
0000
0001
0000
1000
0010
1000
0010
1000
0000
0001
0100
0001
0000
0001
0000
0101
0000
0000
0000
0000
0000
0100
0000
,
0010
1000
0000
1100
0000
0100
0001
1000
0010
0000
0100
0000
1100
0000
1000
0010
,
0100
0001
0000
0011
0000
0010
1000
0010
0001
0000
0100
0000
0110
0000
0010
0001
,
0010
1000
0000
1010
0000
0010
0001
1000
0100
0000
0001
0000
1001
0000
1000
0100
,
0001
0000
0100
0000
0000
0000
1100
0000
0000
0000
1000
0000
0001
0010
0001
0010
0001
0000
1000
0100
1000
0000
1000
0000
0200
0000
0000
0000
0000
0000
M0MM
0000
,
0000
0000
0000
0000
0000
0000
M0MM
0000
0000
0000
0000
0000
0000
0000
M0MM
0000
0000
0000
0000
0000
0300
1000
0001
0000
0101
0000
0000
0000
0000
0000
0000
0000
,
0000
0000
0101
1001
1010
1000
0100
0010
,
0001
0000
0100
0001
1000
0000
0010
0000
0110
0000
0000
0000
0100
0001
1000
0000
,
0100
0000
0000
0010
0000
0000
0001
0000
0000
0010
0000
0000
0100
0000
0000
0000
0000
0000
1000
0000
0000
0000
0000
0000
0010
0000
0000
0000
1000
0000
0100
0000
0000
0000
0000
0000
1100
0000
0000
0000
0000
0000
0000
0000
0000
0110
0000
0000
,
0000
0000
0011
0000
0000
1000
0001
0000
1011
0000
0000
1000
0100
0000
0200
0000
,
0310
0000
0001
0000
0100
0000
1000
0000
0100
0000
0000
0000
0001
0010
0000
1000
,
0000
0001
0000
0100
0010
0000
0001
0000
0100
0000
0000
0000
0010
1000
0000
0001
,
0000
0100
0010
1000
0100
0000
0010
0000
0001
0000
0000
0000
1000
0100
0000
0001
,
0000
0100
1000
0010
1000
0000
0100
0000
0010
0000
0000
0010
0001
0000
0100
0000
,
0010
0000
1000
0010
1000
0000
0100
0000
0010
0000
0000
0000
0010
0000
0100
1000
,
0001
0100
0010
1000
0100
0000
0010
0000
0001
0000
0000
1000
0100
1000
0010
0000
,
0100
0001
1000
0000
0100
0000
0010
0000
0001
0000
0000
0000
0101
0000
0110
0000
,
0010
0000
1000
0010
1000
0010
0100
0000
0001
0000
0010
0000
1000
0000
0010
0000
,
0100
0000
1000
0000
0010
0100
0010
0000
1000
0000
0000
0000
0101
0000
0001
0000
,
0010
0000
0100
1000
0001
1000
0010
0000
0100
0000
0110
0000
1010
0000
0001
0010
,
0100
1000
0100
0010
0001
0000
1000
0000
0010
0000
0100
0000
0001
0010
0001
0000
,
0010
0100
1000
0010
0200
0000
0000
0000
,
0300
0000
0000
0000
;
#SUBTITLE:;
#ARTIST:Die Antwoord;
#TITLETRANSLIT:;
#SUBTITLETRANSLIT:;
#ARTISTTRANSLIT:;
#GENRE:;
#CREDIT:;
#BANNER:../banner.png;
#BACKGROUND:../bg.png;
#LYRICSPATH:;
#CDTITLE:;
#MUSIC:Cookie Thumper.ogg;
#OFFSET:0.003;
#SAMPLESTART:48.350;
#SAMPLELENGTH:12.000;
#SELECTABLE:YES;
#BPMS:0.000=134.000,107.000=67.000,143.000=134.000;
#STOPS:92.000=0.448
;
#BGCHANGES:;
#KEYSOUNDS:;
//---------------dance-single — Nix----------------
#NOTES:
dance-single:
Nix:
Challenge:
10:
0.631,0.711,0.437,0.164,0.665:
0000
0000
0000
0000
,
0000
0000
0000
0000
,
0000
0000
0000
0000
,
0000
0000
0000
0000
,
0000
0000
0000
0000
,
0000
0000
0000
0000
,
2001
0000
3100
1000
0010
0100
0000
0110
,
0000
0100
0001
0010
1000
0000
0010
0000
,
0011
0000
0001
0100
1000
0100
0000
0110
,
0000
0010
1000
0100
0010
0000
0001
0000
,
1000
0000
1000
0100
0000
0100
0010
0000
0001
0000
0100
0010
1000
0000
0100
0000
,
0010
0001
0010
0100
0000
0100
1000
0010
0100
0000
0001
0000
1001
0000
0000
0001
,
0100
0010
1000
0010
0000
0010
0100
0001
0010
0000
0100
0000
1100
0000
0000
1000
,
0020
0000
0230
0000
0301
0100
0001
0000
0101
0000
1001
0000
2020
0000
3030
0000
,
0120
0000
0130
0001
0100
0010
1000
0000
1100
0000
0110
0000
0011
0000
0000
0000
,
0001
0000
0100
0010
1000
0100
0010
0001
1000
0000
0010
0000
0100
0000
0001
0000
,
0010
0100
1000
0001
0000
0001
1000
0010
0100
0000
0001
0000
0020
0000
0000
0000
,
0030
0000
0000
0000
0100
1000
0100
0010
0001
0000
0100
0000
0110
0000
0000
0000
,
1000
0010
0100
0001
1000
0100
1000
0001
0010
0000
0100
0000
0020
0000
0031
0000
,
0100
0010
0000
1000
0000
0010
0000
0010
0100
0000
0001
0000
1000
0000
0100
0010
,
0001
0010
0100
1000
0000
1000
0001
0100
0010
1000
0010
0000
0100
0000
0000
0000
,
0001
0010
0000
1000
0000
0010
0000
0100
1000
0010
0100
0000
0001
0000
0000
0000
,
1000
0100
0010
0100
0001
0100
0010
0000
0022
0000
0000
0000
0033
0000
1000
0000
,
1010
0000
0010
0100
0001
0000
1000
0000
1100
0000
0000
0000
0100
0000
0100
0010
,
0001
0010
0100
1000
0001
0000
0100
0000
0020
0000
0000
0000
0030
0000
0100
0000
,
0001
0000
0000
0000
1000
0000
1000
0010
0100
0001
0100
0000
0220
0000
0330
0000
,
2002
0000
0000
0000
0000
0000
3003
0000
0001
0000
1000
0001
1000
0000
0000
1000
,
0001
0100
0000
0110
0000
0010
1000
0100
0001
0000
0100
0000
1100
0000
0000
1000
,
0010
0100
0000
0110
0000
0100
0001
0010
1000
0000
0010
0000
0110
0000
0100
1000
,
0010
0100
0000
0101
0000
0001
0010
1000
0001
0000
0100
0000
1100
0000
0100
0010
,
0001
0000
0100
0000
0000
0000
0101
0000
0000
0000
0001
0000
1000
0010
1000
0010
1000
0000
0001
0100
0001
0000
0001
0000
0101
0000
0000
0000
0000
0000
0100
0000
,
0010
1000
0000
1100
0000
0100
0001
1000
0010
0000
0100
0000
1100
0000
1000
0010
,
0100
0001
0000
0011
0000
0010
1000
0010
0001
0000
0100
0000
0110
0000
0010
0001
,
0010
1000
0000
1010
0000
0010
0001
1000
0100
0000
0001
0000
1001
0000
1000
0100
,
0001
0000
0100
0000
0000
0000
1100
0000
0000
0000
1000
0000
0001
0010
0001
0010
0001
0000
1000
0100
1000
0000
1000
0000
0200
0000
0000
0000
0000
0000
M0MM
0000
,
0000
0000
0000
0000
0000
0000
M0MM
0000
0000
0000
0000
0000
0000
0000
M0MM
0000
0000
0000
0000
0000
0300
1000
0001
0000
0101
0000
0000
0000
0000
0000
0000
0000
,
0000
0000
0101
1001
1010
1000
0100
0010
,
0001
0000
0100
0001
1000
0000
0010
0000
0110
0000
0000
0000
0100
0001
1000
0000
,
0100
0000
0000
0010
0000
0000
0001
0000
0000
0010
0000
0000
0100
0000
0000
0000
0000
0000
1000
0000
0000
0000
0000
0000
0010
0000
0000
0000
1000
0000
0100
0000
0000
0000
0000
0000
1100
0000
0000
0000
0000
0000
0000
0000
0000
0110
0000
0000
,
0000
0000
0011
0000
0000
1000
0001
0000
1011
0000
0000
1000
0100
0000
0200
0000
,
0310
0000
0001
0000
0100
0000
1000
0000
0100
0000
0000
0000
0001
0010
0000
1000
,
0000
0001
0000
0100
0010
0000
0001
0000
0100
0000
0000
0000
0010
1000
0000
0001
,
0000
0100
0010
1000
0100
0000
0010
0000
0001
0000
0000
0000
1000
0100
0000
0001
,
0000
0100
1000
0010
1000
0000
0100
0000
0010
0000
0000
0010
0001
0000
0100
0000
,
0010
0000
1000
0010
1000
0000
0100
0000
0010
0000
0000
0000
0010
0000
0100
1000
,
0001
0100
0010
1000
0100
0000
0010
0000
0001
0000
0000
1000
0100
1000
0010
0000
,
0100
0001
1000
0000
0100
0000
0010
0000
0001
0000
0000
0000
0101
0000
0110
0000
,
0010
0000
1000
0010
1000
0010
0100
0000
0001
0000
0010
0000
1000
0000
0010
0000
,
0100
0000
1000
0000
0010
0100
0010
0000
1000
0000
0000
0000
0101
0000
0001
0000
,
0010
0000
0100
1000
0001
1000
0010
0000
0100
0000
0110
0000
1010
0000
0001
0010
,
0100
1000
0100
0010
0001
0000
1000
0000
0010
0000
0100
0000
0001
0010
0001
0000
,
0010
0100
1000
0010
0200
0000
0000
0000
,
0300
0000
0000
0000
;
0
Как тогда сделан audioserf?
На самом деле не знаю как ноты, но бит считается вроде как без проблем любым дилжейским софтом. Вот только я не знаю как, поэтому думал получить в комментариях ответ.
0
А на каком этапе понимания проблемы у вас возник вопрос? Уже после всяких преобразований Фурье или вообще с самого начала (с сырого аудиофайла)?
0
Где-то на этапе между скачиванием готовой библиотеки и загрузкой в неё мп3
0
Скорее всего решается через это самое преобразование Фурье и последующей фильтрацией трека по частотам — например можно найти низкие частоты басовой бочки и по пикам амплитуды определить расстояние. Скорее всего этот «бит» будет отбивать четверти или восьмые с редкими ускорениями, не выбивающимися из общего ритма. И с мелодией (обычно более высокими частотами) то же самое — фильтруем по нужной частоте и смотрим пики амплитуды. Так же, насколько я знаю, в этом деле всегда присутствует какая-то стохастика — есть только определённая вероятность верного определения нужных параметров. Сам я интересовался этой проблемой достаточно поверхностно, но вещи все очень хорошо гуглятся, тема популярная.
0
Отличная статья.
0
Игры люблю практически все, но когда дело касается вот этого — бомбит у меня. Уж лучше взять гитару и нормально играть (по табам если даже совсем не знаешь нот — это элементарно).
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Синхронизация ритма в музыкальных играх