Algoritmo de coincidencia de ritmos

Recientemente he empezado a intentar crear una aplicación para móviles (iOS / Android) que automáticamente compaginará las dos canciones ( http://en.wikipedia.org/wiki/Beatmatching ).

Sé que esto existe por ahí, y ha habido otros que han tenido algún éxito, pero estoy corriendo en cuestiones relacionadas con la precisión de los jugadores.

Específicamente, me encuentro con problemas de "sincronización" donde los "beats" no se alinean. Los diversos métodos utilizados hasta la fecha son:

  • Calcule el BPM de antemano, identifique un "beat" (usando algo como sonicapi.com), e intente alinearse apropiadamente, y comience una mezcla adentro con su tarifa de la reproducción ajustada (ajuste del tempo)

  • Utilizar un montón de metadatos para activar arranques y paradas específicos

Qué no funciona:

  • Aprovechando la API de echonest (que supera los partidos en el servidor, queremos hacerlo en el cliente)
  • Algo como pydub (no lo hace en tiempo real)

Quién utiliza este algoritmo hoy:

  • Iwebdj

  • Traktor

¿Alguien tiene alguna sugerencia sobre cómo resolver este problema? He visto a mucha gente hacerlo, pero hacerlo en tiempo real en un dispositivo móvil parece ser un problema.

Hay muchos métodos para resolver este problema, algunos de los cuales funcionan mejor que otros. Matthew Davies ha publicado varios artículos sobre el tema, entre muchos otros. Echar un vistazo a este artículo parece romper algunos de los pasos necesarios para hacer esto. He construido un beat tracker en Matlab (por desgracia …) con un compañero de estudio y nuestro objetivo era crear un outro / intro entre 2 canciones para que el tempo era sin fisuras entre ellos. Queríamos hacer esto para canciones que variaban en BPM por una pequeña cantidad (+ -7 o así BPM entre los dos). Nuestro método fue así:

  1. Encuentra dos canciones en nuestra base de datos que tenían superposición de "centro clave". Así que vamos a decir 2 canciones, tanto en Am.

  2. Encuentre esta particular superposición de centros clave entre los dos. Diga 30 segundos en la canción 1 y 60 segundos en la canción 2

  3. Ahora crear un mapa de latidos, utilizando un algoritmo de detección de inicio con picking de picos; Además, esto fue muy útil para nosotros.

  4. Escoja el primer 'beat' para cada pista, y se superponen las dos pistas en ese punto. Ahora, ya que son un poco diferentes BPM entre sí, los latidos realmente no se alinean entre sí.

  5. A partir de esto, hemos creado una especie de mapa que nos dio la muestra de compensaciones entre los latidos de la canción A y los latidos de la canción B. De esto, queríamos ser capaces de tiempo-estirar el fade-in región de la canción B para que cada uno De sus inicios (beats en este caso) alineados en el índice de muestra correcto como los onsets de la canción A, sobre ITS fade-out región. Así, por ejemplo, si el inicio 2 de la canción B se muestra como 5.000 muestras antes del inicio 2 de la canción A, simplemente estiramos esa región de 5.000 muestras de modo que el inicio 2 coincida exactamente entre ambas canciones.

Esto parece que suena raro, pero en realidad sonaba bastante bien. Aunque esto se hizo completamente sin conexión en Matlab, también busco una forma de hacerlo en tiempo real en una aplicación para móviles. No estoy totalmente seguro acerca de las bibliotecas que puede utilizar para esto en el mundo de Android, pero me imagino que sería más eficiente en C + +.

Un par de bibliotecas que he encontrado sería bueno para el prototipo de algo, o al menos estudiar el código fuente para obtener una mejor comprensión de cómo se puede hacer esto en una aplicación para móviles:

Essentia (gran comunidad, código abierto) Aubio (también parece mantenerse bastante bien, open-source)

Otras cosas para leer para hacer este tipo de cosas en la tierra de iOS: vDSP Guía de programación Este artículo también puede ayudarme me encontré con este proyecto que está haciendo algunos beat detección. Aunque parece bastante anticuado por desgracia, puede ofrecer algunas ideas adicionales.

Desafortunadamente, no es tan simple como simplemente "presionar el juego" al mismo tiempo para alinear los ritmos, a menos que esté asumiendo aspectos muy específicos sobre ellos (ritmos exactos, etc.).

Si usted realmente tiene un poco de tiempo en sus manos, debe consultar la tesis de Tristan Jehan (fundador de Echonest) ; Está atestado de algoritmos y métodos para la detección de golpes, etc.

  • Diferencia entre res / color y res / values ​​/ colors.xml en la carpeta de recursos de Android
  • Java.lang.outofmemoryerror android.graphics.BitmapFactory.nativeDecodeAsset (Método nativo)
  • Cancelar una conexión en curso cuando el usuario presiona de nuevo
  • ¿Cómo usar la API Android KeyStore con API 18?
  • NullPointerException en startAnimation (anim)
  • Cómo importar el escenario de Metaio en Android Studio?
  • Mejor biblioteca json rpc 2.0 para Android
  • ¿Cuál es el equivalente de setTimeOut () javascript a Android?
  • leyenda desplazable mpandroidchart piechart
  • Cómo configurar una frecuencia para la radio fm en android?
  • Android: no se puede resolver el método 'findViewById (int)' en AsyncTask
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.