Использование AVFoundation / CoreMedia / Другие фреймворки для обнаружения ударов / приступов - PullRequest
12 голосов
/ 20 февраля 2012

( Предисловие: Это мой первый вопрос, касающийся аудио, о переполнении стека, поэтому я постараюсь сформулировать это как можно лучше. Редактирование приветствуется.)

IСоздаю приложение, которое позволит пользователям зацикливать музыку.В настоящее время наши прототипы позволяют этим «маркерам цикла» (реализованным как UISliders) привязываться каждую секунду, указывая начало и конец цикла.Очевидно, что при циклическом воспроизведении музыки секунды - это очень грубый способ справиться с этим, поэтому я хотел бы использовать вместо этого доли.

Я не хочу делать ничего, кроме пометки тактов для привязки UISliders к:

  • Подайте в нашем методе loadMusic аудиофайл.
  • Запустите его через библиотеку для обнаружения ударов или интервалов между ними (возможно).
  • Подача этогозначение в методе setNumberOfTickMarks: ползунка.
  • Прибыль!

К сожалению, большинство результатов, с которыми я столкнулся через Google и SO, дали гораздо более продвинутые библиотеки обнаружения ударов, такие какте, которые будут использовать ремиксеры.Избыток в моем случае.

Может ли CoreMedia, AVFoundation или AudioToolbox справиться с этим?Если нет, есть ли другие библиотеки, которые могут справиться с этим?Мое исследование документации Apple дало только соответствующие результаты ... для файлов MIDI.Но собственное программное обеспечение Apple имеет такие функции, как функциональность iMovie с привязкой к битам .

Любые указания, код или рефераты были бы чрезвычайно полезны на этом этапе.

РЕДАКТИРОВАТЬ: После того, как я немного покопался, мне кажется, правильная терминология для того, что я ищу, это обнаружение начала .

1 Ответ

4 голосов
/ 03 апреля 2012

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

, если вы хотите быстро и легко определить, где находятся удары:

  1. Разбейте музыкальный сигнал на маленькие сегменты (20-50ms куски)

  2. Вычислить среднеквадратичное значение суммы сигнала: Sum(Xn ^2) / N (где N - номер выборки на 20-50ms)

Если вы хотитеБолее сложные методы можно найти в:

http://bingweb.binghamton.edu/~ahess2/Onset_Detection_Nov302011.pdf

или для хардкорной обработки:

http://www.elec.qmul.ac.uk/people/juan/Documents/Bello-TSAP-2005.pdf

...