Intereting Posts
Создание сложных элементов управления с помощью пользовательских атрибутов XML Сохранить несколько изображений на Android Направление Google Map Api с использованием дооснащения Как записать текст в EditText элемента, доступного для поиска? Черный экран перед тем, как заставка появится в android Удалить запрос с заголовком и параметрами Volley Неправильные размеры изображения в android при использовании растрового изображения Что такое резерв для «значка гамбургера» или объекта HTML & # 9776 ;? Как отображать несколько маркеров с разными значками в Google Maps Android API v2? Android Studio build.gradle – Не удается разрешить символ "android" Android получает идентификатор родителя макета Android uiautomator, чтобы щелкнуть ListView ClassCastException: android.widget.LinearLayout $ LayoutParams не может быть добавлено в com.android.internal.widget.ActionBarOverlayLayout $ LayoutParams Утечка памяти Android в текстовом режиме – LeakCanary (Утечка может быть проигнорирована) Неожиданный код ответа 403 для https://www.googleapis.com/games/v1/players/1123xxxxxx11712506520 и других ошибок в игровых сервисах

Алгоритм соответствия бит

Недавно я начал создавать мобильное приложение (iOS / Android), которое будет автоматически бить матч ( http://en.wikipedia.org/wiki/Beatmatching ) двумя песнями.

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

В частности, я сталкиваюсь с проблемами «синхронизации», когда «удары» не выстраиваются в линию. Различные методы, используемые на сегодняшний день:

  • Вычислите BPM заранее, определите «бит» (используя что-то вроде sonicapi.com) и попытайтесь правильно подойти к нему и начните микширование с корректировкой скорости воспроизведения (регулировка темпа)

  • Использование кучи метаданных для запуска определенных запусков и остановок

Что НЕ работает:

  • Используя API-интерфейс echonest (он бил совпадения на сервере, мы хотим сделать это на клиенте)
  • Что-то вроде pydub (не делает это в реальном времени)

Кто использует этот алгоритм сегодня:

  • iwebdj

  • Traktor

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

Существует множество методов решения этой проблемы, некоторые из которых работают лучше других. Мэтью Дэвис опубликовал несколько статей по этому вопросу, среди многих других. Взгляд на эту статью, похоже, разрушает некоторые шаги, необходимые для этого. Я построил бит-трекер в Matlab (к сожалению …) вместе со студентом, и наша цель состояла в том, чтобы создать outro / intro между двумя песнями, чтобы темп был без проблем между ними. Мы хотели сделать это для песен, которые варьировались в BPM на небольшую сумму (+ -7 или около того BPM между ними). Наш метод прошел примерно так:

  1. Найдите в нашей базе две песни, которые перекрывают «ключевой центр». Так что скажем 2 песни, как в Am.

  2. Найдите это конкретное перекрытие ключевых центров между ними. Скажите 30 секунд в песне 1 и 60 секунд в песню 2

  3. Теперь создайте карту биений, используя алгоритм обнаружения начала с выбором пика; Кроме того, это было полезно для нас.

  4. Выберите первый «бит» для каждого трека и наложите на него две дорожки. Теперь, поскольку они немного отличаются BPM друг от друга, биты не будут совпадать друг с другом.

  5. Из этого мы создали какую-то карту, которая дала нам выборки смещений между ударами песни A и битами песни B. Из этого мы хотели уметь растягивать область затухания песни B так, чтобы каждый Его битов (биты в этом случае) выстроились по правильному индексу выборки в качестве набегов из песни A, по сравнению с областью затухания ITS. Так, например, если начало 2 из песни B было показано как 5000 экземпляров перед началом 2 из песни A, мы просто растянули эту 5000 областей образца, так что начало 2 соответствовало точно между обеими песнями.

Кажется, это звучит странно, но на самом деле это звучало довольно хорошо. Хотя это было полностью отключено в Matlab, я также ищу способ сделать это в режиме реального времени в мобильном приложении. Не совсем уверен в том, какие библиотеки вы можете использовать для этого в Android-мире, но я думаю, что это было бы наиболее эффективно на C ++.

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

Essentia (отличное сообщество, open-source) Aubio (также, похоже, поддерживается довольно хорошо, с открытым исходным кодом)

Дополнительные вещи, которые нужно прочитать для того, чтобы делать такие вещи на земле iOS: руководство по программированию vDSP. Эта статья также может помочь мне натолкнуться на этот проект, который выполняет некоторое обнаружение биений. К сожалению, он, похоже, довольно устарел, он может предложить дополнительную информацию.

К сожалению, это не так просто, как просто «нажимать» в то же время, чтобы выровнять биты, если только вы не принимаете очень специфические аспекты (точные темпы и т. Д.).

Если у вас по-прежнему есть время на ваших руках, вы должны проверить тезис Тристана Джехана (основателя Echonest) ; Это джем, заполненный алгоритмами и методами обнаружения биений и т. Д.