Uso de Avfoundation / Coremedia / otros marcos para detectar Beats / Onsets
-
28-10-2019 - |
Pregunta
(Prefacio: Esta es mi primera pregunta relacionada con el audio en Stack Overflow, así que intentaré decir esto lo mejor que pueda. Ediciones bienvenidas).
Estoy creando una aplicación que permitirá a los usuarios encender la música. En este momento, nuestros prototipos permiten que estos "marcadores de bucle" (implementados como UISLIDER) se ajusten cada segundo, especificando el comienzo y el final de un bucle. Obviamente, al bucle de la música, los segundos son una manera muy cruda para manejar esto, por lo que me gustaría usar ritmos.
No quiero hacer nada más que Mark Beats para que los uislantes se ajusten a:
- Alimentar a nuestro
loadMusic
método un archivo de audio. - Ejecutarlo a través de una biblioteca para detectar latidos o los intervalos entre ellos (tal vez).
- Alimentar ese valor en el control deslizante
setNumberOfTickMarks:
método. - ¡Lucro!
Desafortunadamente, la mayoría de los resultados con los que he encontrado a través de Google y, por lo tanto, han arrojado bibliotecas de detección de ritmos mucho más avanzadas como las que los remixers usarían. Exagerado en mi caso.
¿Es esto algo que Coremedia, Avfoundation o AudiotOolbox pueden manejar? Si no, ¿hay otras bibliotecas que puedan manejar esto? Mi investigación sobre la documentación de Apple solo ha arrojado resultados relevantes ... para archivos MIDI. Pero el propio software de Apple tiene características como esta, como La funcionalidad de IMovie Snap-to-Beats.
Cualquier orientación, código o resúmenes sería inmensamente útil en este momento.
EDITAR: Después de cavar un poco más, parece que la terminología correcta para lo que estoy buscando es detección de inicio.
Solución
Los algoritmos de detección de inicio vienen en muchos sabores desde mirar la señal de música cruda hasta usar técnicas de dominio de frecuencia.
Si quieres una forma rápida y fácil de determinar dónde están los ritmos:
Porta la señal de la música en segmentos pequeños (
20-50ms
trozos)Calcule el promedio de la Sume al cuadrado de la señal:
Sum(Xn ^2) / N
(dóndeN
es el número de muestra por20-50ms
)
Si desea que las técnicas más sofisticadas consideren:
http://bingweb.binghamton.edu/~ahess2/onset_detection_nov302011.pdf
o para el tratamiento hardcore de la misma:
http://www.elec.qmul.ac.uk/people/juan/documents/bello-tsap-2005.pdf