2011-02-07 21 views
8

Tengo un proyecto sobre la transcripción de música usando Java, la cosa es ,, he creado un applet que graba el sonido y lo guarda en un archivo WAV, el reproductor solo debe reproducir la pieza he/she me gustaría transcribir, después de eso estoy atascado en el punto donde tengo que obtener información del archivo WAV guardado y usar esta información para crear un archivo MIDI, y después de crear el archivo MIDI tengo que generar un puntaje musical para él (Sheet Music) y todo esto debe hacerse en Java.Transcripción de música de archivos Wav en Java

Busqué en todas partes una explicación clara sobre cómo se pueden hacer estas cosas, pero no encontré nada directo :(ya que soy nuevo en Java, me gustaría que alguien me ayude con esto, por favor, los temas que estoy teniendo la programación de problemas son:

  1. obtener información acerca de las notas que se está reproduciendo en el archivo WAV
  2. Conocer las notas
  3. Creación de un archivo MIDI equivalente al archivo WAV
  4. generar una SCORE de... el archivo MIDI.

también he intentado Fast Fourier Transform después de realizar la segmentación de los datos puedan ser leídos, pero creo que fue absolutamente en la dirección equivocada :(

Por favor si alguien me puede ayudar en los temas especificados anteriormente, y cómo programar estos solo en Java, sería realmente muy apreciado :)

Por cierto, el proyecto es:
El jugador toca notas en Piano >> Graba su reproducción >> El jugador obtiene el puntaje de su interpretación.

+1

posible duplicado de [conversión wav-a-midi] (http://stackoverflow.com/questions/2126193/wav-to-midi-conversion) –

+0

Por curiosidad, no puede leer directamente la entrada en MIDI ¿formato? La mayoría de los instrumentos admiten algún tipo de salida MIDI (en el caso del piano, un teclado MIDI) y parece que esto eliminaría por completo la necesidad de hacer este postproceso difícil. – templatetypedef

+0

no es el proyecto para generar una puntuación para archivos WAV, no teniendo un MIDI ya presente: D – Xtremeaiy

Respuesta

3

No soy de ninguna manera un experto en esta área, por lo que me disculpo por adelantado si todo esto es basura.

Para obtener las notas del archivo, creo que debe hacer un FFT (Transformación rápida de Fourier) en el archivo WAV, pero con solo 10 ms de sonido a la vez. Luego, encontrará el pico más alto en la FFT para ese marco de tiempo, y pasará al siguiente "marco" de 10 ms, o lo que sea. Haces la FFT nuevamente, y si el pico más alto es una frecuencia diferente al pico anterior, entonces dirá que es una nota nueva. Para ver cuánto duran las notas, cuente el número de picos dentro de un umbral determinado y multiplíquelos por el tiempo que esté utilizando para cada fotograma (10 ms, etc.)

Volveré a decir, no soy experto y probablemente haya otras formas de hacerlo.

Dejando eso de lado, espero que esto ayude ... incluso un poco.

+0

sí me ayudó un poco con la idea de segmentos de 10ms gracias :) – Xtremeaiy

+0

¡De nada!Me alegro de que la publicación sea de alguna utilidad :-) – Bojangles

0

Hay un muy buen editor de sonido de código abierto llamado Audacity. Sí, está escrito en C++, pero puede encontrar las respuestas que está buscando en su código fuente. Traducir el código C++ a Java no es tan difícil.

+0

muchas gracias :) pero estoy buscando algo que ya esté disponible en Java para ayudarme a ponerlo en funcionamiento, muchas gracias intentaré obtener toda la información que recibí. necesidad de Audacity: D – Xtremeaiy

1

No soy un experto en esa área, pero una vez estaba jugando un poco con Xuggler (envoltura de java ffmpeg). Esta biblioteca fue capaz de extraer muchos datos interesantes del archivo multimedia, permite la transcodificación de archivos y muchas otras funciones geniales. Aquí está el enlace: http://www.xuggle.com/xuggler/

+0

muchas gracias :) – Xtremeaiy

1

Lo que quiere hacer es actualmente imposible. El alcance de lo que describió va más allá de lo que pueden hacer los programas de música profesional actuales, y tienen literalmente cientos de años-hombre de tiempo de programadores invertidos.

Puede lograr algo si reduce radicalmente sus requisitos.

  • para encontrar el tono de sonido, utilice FFT; Esta es la parte más fácil; tendrá que restringirse a notas individuales aquí, no podrá leer acordes limpiamente.

  • no podrá descubrir cuál es la signatura de tiempo o la velocidad (bpm) de la canción; su única posibilidad es incluir algún tipo de metrónomo en la aplicación y obligar al jugador a cumplir el ritmo. Si desea admitir el tiempo de swing, también debe configurarlo el jugador.

  • Al hacer midi, quantitize todas las notas (= mover sus inicios y los finales de la cuarta más cercana, 1/8 o 1/16 de medida)

  • utilizar un sistema de composición lista para crear la Puntuación; el musictex podría funcionar para usted; generar un archivo tex será mucho más fácil que hacer el dibujo por ti mismo; si yo fuera usted, me gustaría ignorar algunas de las reglas de la música de composición tipográfica (sin duda caer las vigas, hay muchas normas relativas a ellos)

Si se restringe a sí mismo a una sola melodía, optar por ignorar la mayoría de la composición tipográfica de la música, haga que el pianista use su propio metrónomo y limite sus opciones rítmicas; puede tener éxito.

1

Tenía la misma idea en mente y probé una solución muy simple pero incompleta. Como señaló la publicación de fdreger, incluso el software profesional no puede realizar esta tarea correctamente. (Probé algunas versiones de demostración de IntelliScore, AudioScore y algún otro software y ninguno de estos parecía ser particularmente eficiente cuando trabajaba con música polifónica)

Pero si quieres probarlo a ti mismo, utilicé el código fuente encontrado aquí: http://www.psychicorigami.com/2009/01/17/a-5k-java-guitar-tuner/ que me ayudó a descubrir cómo determinar la frecuencia. (FFT será más preciso, pero mucho más complejo).

Para mostrar las notas en la pantalla, he utilizado la biblioteca abc4j que se pueden encontrar aquí: http://code.google.com/p/abc4j/

Pero, como se ha señalado anteriormente, sólo funciona con la música monofónico (una sola voz).

¡Buena suerte!

Cuestiones relacionadas