Як можна програмно визначити темп / BPM пісні? Які алгоритми зазвичай використовуються, і які міркування слід враховувати?
Відповіді:
Це складно пояснити в одному дописі StackOverflow. Загалом, найпростіші алгоритми виявлення ударів працюють шляхом визначення піків звукової енергії, які легко виявити. Більш складні методи використовують гребінчасті фільтри та інші статистичні / сигнальні методи. Для детального пояснення, включаючи зразки коду, перегляньте цю статтю GameDev .
Ключові слова, за якими потрібно шукати, - "Визначення ритму", "Відстеження ритмів" та "Отримання музичної інформації". Тут є багато інформації: http://www.music-ir.org/
Існує (можливо) щорічний конкурс під назвою MIREX, де різні алгоритми тестуються на ефективність виявлення ударів.
http://nema.lis.illinois.edu/nema_out/mirex2010/results/abt/mck/
Це має дати вам список алгоритмів для тестування.
Класичний алгоритм - Beatroot ( пошукати в Google), який приємний і простий у розумінні. Це працює так:
Мінуси цього алгоритму на моєму досвіді:
Ось демонстраційна версія реальної версії цього алгоритму, що показує спектральний потік (чорна лінія внизу) та наступні значення (зелені кола). Варто врахувати той факт, що ритм витягується лише із зелених кіл. Я відтворював наступні дії лише як клацання, і, чесно кажучи, не думаю, що я міг почути такт від них, тому певним чином цей алгоритм кращий за людей, які виявляють биття. Я думаю, що зведення до такого низьковимірного сигналу є його слабким кроком.
Прикро, але я знайшов дуже хороший сайт з багатьма алгоритмами та кодом для виявлення ударів кілька років тому. Мені, проте, повністю не вдалося його уточнити.
Ось декілька чудових посилань, з яких слід почати:
Екстракція ударів передбачає виявлення когнітивних метричних структур у музиці. Дуже часто вони не відповідають фізичній звуковій енергії - наприклад, у більшості музики існує рівень синкопації, що означає, що удар, який ми сприймаємо, не відповідає присутності фізичного звуку. Це означає, що це зовсім інше поле для виявлення початку , яке є виявлення фізичних звуків, і виконується по-іншому.
Ви можете спробувати бібліотеку Aubio , яка є простою бібліотекою C, що пропонує інструменти для вилучення як початку, так і удару.
Існує також Інтернет- API Echonest , хоча це передбачає завантаження MP3-файлу на веб-сайт та отримання XML-файлу, тому, можливо, це не так підходить ..
EDIT: Я натрапив на це вчора ввечері - дуже перспективну на вигляд бібліотеку C / C ++, хоча сам я не використовував її. Плагіни Vamp
Загальний напрямок досліджень, який вас цікавить, називається МУЗИЧНА ІНФОРМАЦІЯ ПОВТОРЕННЯ
Існує багато різних алгоритмів, які роблять це, але всі вони принципово зосереджені навколо ВИЗНАЧЕННЯ ВСТАНОВЛЕННЯ.
Виявлення початку вимірює початок події, подія в цьому випадку - це відтворена нота. Ви можете шукати зміни в зваженому перетворенні Фур'є (високочастотний вміст), ви можете шукати великі зміни в спектральному вмісті. (Спектральна різниця). (Є кілька статей, які я рекомендую вам розглянути далі) Після того, як ви застосуєте алгоритм виявлення початку, ви вибираєте, де б'ються, через порогове значення.
Існують різні алгоритми, якими ви можете скористатися, коли отримаєте локалізацію удару за цей час. Ви можете перетворити його на імпульсний шлейф (створити сигнал, який дорівнює нулю за весь час і дорівнює 1 лише тоді, коли відбувається ваш такт), а потім застосувати до нього БПФ, і BAM тепер у вас є Частота наборів на найбільшому піку.
Ось кілька статей, які допоможуть вам у правильному напрямку:
http://www.elec.qmul.ac.uk/people/juan/Documents/Bello-TSAP-2005.pdf
http://bingweb.binghamton.edu/~ahess2/Onset_Detection_Nov302011.pdf
Ось розширення того, що деякі люди обговорюють:
Хтось згадав, що вивчає застосування алгоритму машинного навчання: В основному збирають купу функцій з функцій виявлення початку (згаданих вище) і поєднують їх із вихідним сигналом у нейронній мережі / логістичній регресії та дізнаються, що робить такт ритмом.
загляньте до доктора Ендрю Нґ, він безкоштовно читає лекції машинного навчання в Стенфордському університеті в Інтернеті (не довгі відеолекції, насправді існує онлайн-дистанційний курс)
Якщо вам вдається взаємодіяти з кодом python у своєму проекті, Echo Nest Remix API - це досить приємний API для python:
Існує метод, analysis.tempo
який надасть вам BPM. Це може зробити набагато більше, ніж простий BPM, як ви можете бачити з документів API або цього посібника
Виконайте перетворення Фур'є і знайдіть піки в спектрі потужності. Ви шукаєте піки нижче 20 Гц для людського слуху. Я вважаю, що зазвичай в діапазоні 0,1-5 риц Гц є щедрим.
ТАКЕ запитання, яке може допомогти: Бібліотека виявлення звуку Bpm
Крім того, ось одне з декількох запитань щодо "пошуку піків" щодо SO: Виявлення піку виміряного сигналу
Редагувати: Не те, що я займаюся обробкою звуку. Це лише припущення, засноване на тому, що ви шукаєте властивість частотного домену файлу ...
ще одне редагування: Варто зазначити, що формати стиснення з втратами, такі як mp3, зберігають дані домену Фур’є, а не дані часового домену. З невеликою кмітливістю ви можете заощадити собі важкі обчислення ... але перегляньте вдумливий коментар cobbal.
Точне виявлення BPM дуже складно. Дивіться це запитання щодо stackoverflow та мою відповідь на нього.
Щоб повторно опублікувати свою відповідь: найпростіший спосіб зробити це - це зробити так, щоб користувач натискав кнопку в такт ритму та підраховував кількість натискань, поділену на час.
Інші вже описали деякі методи виявлення ударів. Я хочу додати, що є кілька доступних бібліотек, які надають методи та алгоритми для такого роду завдань.
Aubio - один з них, у нього хороша репутація, і він написаний мовою C на обгортці C ++, так що ви можете легко інтегрувати його з додатком какао (усі аудіоматеріали у фреймворках Apple також написані на C / C ++).
Існує кілька методів отримання BPM, але найбільш ефективним я вважаю "спектр ударів" (описаний тут ). Цей алгоритм обчислює матрицю подібності, порівнюючи кожен короткий зразок музики з усіма іншими. Після обчислення матриці подібності можна отримати середню подібність між кожними парами вибірки {S (T); S (T + 1)} для кожного інтервалу часу T: це спектр биття. Перший високий пік у спектрі тактових часток становить більшу частину часу тривалості біту. Найкраще, ви також можете робити такі речі, як музична структура або аналіз ритму.
Ось безкоштовна програма для аналізу та запису BPM в тег ID3V2. Не уявляю, як добре
Я гадаю, це буде найпростішим у танцювальній музиці 4-4, оскільки там повинен бути один низький частотний удар близько двох разів на секунду.