2011-10-19 27 views
6

Lo que quiero hacer:Cómo programar un simple secuenciador de música para Android (Java)

Me gustaría programar una muy simple secuenciador de música para Android. Pero nunca he trabajado con audio en Android o en Java, respectivamente.

lo que la aplicación debe hacer:

  • reproducir muestras (archivos wave/OGG)
  • jugar varios canales de audio simultáneamente (por ejemplo, la trompeta y la flauta debe jugar simultáneamente, máximo de 10 instrumentos)
  • cambiar el tono de las muestras (por ejemplo, el archivo de trompeta onda debe ser jugado en tono normal (c4) y mayor tono más bajo/(e2/g6) y así sucesivamente)

Esto es lo que la aplicación debería poder hacer en general.

¿Qué componentes necesito? ¿Un reproductor de medios normal (AudioManager?) No funcionará, ¿verdad?

ya hay algunas aplicaciones que hacen lo que yo estoy pensando:

  • FingerBeat para iOS
  • FL Studio Mobile para iOS
  • Uloops Studio para Android

Gracias de antemano ¡para su ayuda!

Respuesta

6

Hay un secuenciador de ritmo de código abierto muy simple para Android llamado SoundFuse. Tienen una descripción y capturas de pantalla en la página.

Here es el repositorio de github.

+0

Muchas gracias, este proyecto es muy interesante y me puede ayudar mucho creo :) – caw

2

No tiene un requisito simple, sino tres requisitos muy diferentes.

  1. Jugar WAV deben apoyarse fuera de la caja por el JRE con la ayuda de las clases en javax.sound.sampled, que jsut requiere algo de código para cablear (no muy seguro de androide).

  2. Reproducción de OGG no se admite de fábrica. Hay una implementación de código abierto para OGG llamada jOrbis, ver sus web site. De nuevo, esto puede requerir un código de cableado para conectarlo a su aplicación.

  3. Para un Sequencer, puede usar MIDI. De nuevo, debe ser compatible con JRE, y si no está en su plataforma, puede usar Gervill, un secuenciador de Java MIDI puro (Project web site).

  4. También hay un ModPlayer que puede reproducir el buen viejo Soundtracker y algunos otros. Esto también puede ser abusado como un secuenciador de algún tipo si conoce el formato del módulo Soundtracker o Screamtracker (formato antiguo, pero las descripciones aún están disponibles en la red). El reproductor con la fuente se puede encontrar here. Los formatos Tracker no son tan antiguos por cierto, algunos de los motores de juegos de hoy aún los usan.

  5. Si realmente quieres, puedes cocinar tu propio Sequencer, todo lo básico si está en javax.sound.sampled. Solo requiere algunos conocimientos básicos sobre sonido digital y una gran cantidad de código de cableado.

no hay una solución única para todos los sus necesidades, tendrán que unir juntos es el propietario de los bloques de construcción de libre disposición.

+0

Muchas gracias por esta detallada encuesta. Pero de acuerdo con el enlace de Boude (http://developer.android.com/guide/appendix/media-formats.html), Android admite OGG nativamente. – caw

+0

No estoy realmente familiarizado con los detalles de Android, solo resumí lo que sabía que estaba disponible/necesitaba en un JRE estándar. – Durandal

2

No podré proporcionar una respuesta completa, pero lo guiaré en la dirección correcta.

Android es compatible con la decodificación .wav y .ogg. De acuerdo con: http://developer.android.com/guide/appendix/media-formats.html

No tengo ninguna experiencia en audio, pero su mejor apuesta parece ser la clase SoundPool, le permite ajustar el tono y el volumen y parece ser capaz de reproducir múltiples sonidos simultáneamente: " Tenga en cuenta que llamar a play() puede hacer que otro sonido deje de reproducirse si se excede el número máximo de secuencias activas ". http://developer.android.com/reference/android/media/SoundPool.html

También hay una clase MediaPlayer, pero esto es para un uso más simple. No creo que permita el control de tono.

+0

Muchas gracias, Boude, finalmente me convenciste para usar la clase SoundPool :) – caw

2

Hice algo similar para mi aplicación (tocando la muestra de trombones). Después de muchas experiencias, encontré que la mejor solución era usar AudioTrack. un vistazo a mi código fuente: http://code.google.com/p/trombonino/source/browse/trunk/src/com/trombonino

Especialmente

http://code.google.com/p/trombonino/source/browse/trunk/src/com/trombonino/Trombone.java http://code.google.com/p/trombonino/source/browse/trunk/src/com/trombonino/WavFile. java

+0

Gracias, voy a echar un vistazo a tu código y estoy seguro de que puede ayudarme. ¿Podría explicar por qué no usó SoundPool? Para mí, esta clase parece ser la más adecuada. – caw

+0

Mis primeras versiones usaban soundpool. Pero el bucle con Soundpool produce un molesto "clic" entre cada ciclo (al menos según mi deseo e informado por algunos usuarios) que no era aceptable para muestras de música. – gadjou

+0

Además, con audiotrack, puede recorrer el archivo de sonido en lugar de recorrer todo el archivo (mejor para las muestras). Por lo que puedo recordar, también rápidamente encontré problemas de memoria con Soundpool, también con algunas muestras pequeñas. – gadjou

1

Tendrás problemas con el tiempo en el sistema Android. Para evitar que el hilo del secuenciador se interrumpa con la recolección de elementos no utilizados, es probable que necesite escribir el secuenciador en nativo utilizando el ndk.

Probablemente también sea mejor reproducir los sonidos con el ndk.

Tome un vistazo a https://code.google.com/p/high-performance-audio/

En el ejemplo anterior Soundfuse el secuenciador utiliza SystemClock.sleep() que nunca es una buena idea. Compruebe Why using System.Threading.Thread.Sleep() is a bad practice?.

Se dio cuenta de que esta pregunta es muy antigua, pero la responderá de todos modos ya que ninguna respuesta menciona el NDK.

Cuestiones relacionadas