2009-06-16 14 views
10

Estoy buscando crear una aplicación que emule un instrumento físico. Tengo muestras de audio, pero quiero poder aumentar el tono/frecuencia de forma dinámica, así no tengo que cargar desde demasiados archivos.Audio en el iPhone

¿Alguna idea de qué API de audio podrá hacer esto? Reconozco los servicios OpenAL o Audio Queue pero no estoy seguro de cuál es el adecuado. Cualquier enlace a guías/código de muestra también es muy apreciado.

Gracias de antemano.

Respuesta

19

Fui por este camino en 2009, probando Audio Toolkit, Audio Queue Services, openAL, y finalmente estableciéndome en la AudioUnit de RemoteIO.

Audio Toolbox está bien para los efectos de sonido disparados básicos, pero no fue capaz de cambiar las frecuencias o muestras de bucle.

Los servicios de cola de audio pueden reproducir muestras en bucle, pero la única forma que pude encontrar para ajustar la frecuencia de reproducción de una muestra fue volver a leer los datos del archivo, muy doloroso. Además, el marco es tremendamente engorroso: solo lo usaría si estuviera intentando transmitir algo desde Internet.

OpenAL fue un regalo del cielo - se puso en funcionamiento en menos de una hora, después de tener en mis manos la aplicación de muestra de iPhone "CrashLanding" ya no disponible desde Apple. Descubrí que OpenAL era ideal para juegos o incluso un instrumento musical: las muestras podían precargarse, el ajuste de la frecuencia era fácil y el bucle no era un problema. El factor decisivo para mí fue que iniciar y detener una muestra de en bucle daría como resultado un desagradable "pop" casi todo el tiempo. Además, el mezclador de audio posicional integrado en 3D era demasiado intensivo en la CPU para mi gusto.

Si su instrumento no utiliza muestras en bucle, le sugiero que pruebe la ruta OpenAL primero: la curva de aprendizaje es mucho menos intimidante. Tratar de localizar a "SoundEngine.h", "CrashLanding" o "TouchFighter", o visite el siguiente enlace:

http://benbritten.com/blog/2008/11/06/openal-sound-on-the-iphone/

Dado que las muestras en bucle fue un requisito para mí, finalmente se decidió por AudioUnits (que , en el iPhone, se conoce como "RemoteIO" si desea hacer entrada o salida). Fue tremendamente difícil de implementar, muy similar a Audio Queue Services, en el sentido de que el núcleo de su implementación estará dentro de una "devolución de llamada de buffer", siendo llamado varias veces por segundo para llenar un buffer de audio saliente con valores raw SInt16.

Al final, conseguí que mi instrumento funcionara perfectamente con polifonía de notas múltiples, muestras en bucle, sin saltos y latencia mínima.

Desafortunadamente, RemoteIO no está bien documentado.Michael Tyson fue uno de los primeros en el campo para escribir sobre RemoteIO extensamente, y sus puestos (y los comentarios) eran muy útil para mí:

http://michael.tyson.id.au/2008/11/04/using-remoteio-audio-unit/

Buena suerte!

Editado años después: He abierto el código de RemoteIO/AudioUnits que mencioné arriba: https://github.com/glenn-barnett/hexaphone/blob/master/Classes/Instrument.m - disculpas por el desastre, espero tener algo de tiempo para limpiar el código y los comentarios.

+0

Gracias por el consejo. Estoy intentando OpenAL con el código de muestra de oalTouch en este momento, pero no puedo encontrar la configuración para cambiar el tono o la frecuencia sobre la marcha. ¡Cualquier consejo en la dirección correcta es muy apreciado! – Matthew

+0

No importa. Descubrí cómo ajustar el tono. El código de muestra para oalTouch solo administra un archivo de sonido, así que supongo que necesito mirar a SoundManager después de todo. – Matthew

+0

El código de Sound Engine funciona muy bien en iPhone OS 2.21 SDK pero no se puede compilar en 3.0 del SDK. ¿Alguna idea de si hay una nueva versión por ahí? – Matthew

0

Suena, un poco, como si estuvieras creando esencialmente el método de síntesis de tabla de ondas para reproducir archivos MIDI. Es posible que pueda encontrar un sintetizador MIDI para el iPhone que pueda usar, y luego use sus muestras de audio para construir un conjunto de tablas de ondas. Cada vez que desee reproducir tonos, simplemente envíe el evento MIDI al sintetizador MIDI de iPhone con su conjunto de tablas de ondas cargadas.

+0

Para ser irritantemente técnico (soy un nerd sintetizador), suena más como un simple instrumento de muestra que la síntesis wavetable. He hecho ambas cosas. http://en.wikipedia.org/wiki/Wavetable_synthesis – Nosredna

+0

No soy un nerd sintetizador, y tengo muy poca experiencia con programación de sonido; Simplemente escribí la respuesta porque creía ver una similitud con mi cuerpo de conocimientos informáticos generales, y no se publicaron respuestas en el momento en que escribí el mío, así que pensé en poner mi granito de arena. Me alegro de que las personas con mucha más experiencia en esta área de la que estoy publicando mejores respuestas :) –

+0

No te estaba votando ni nada por el estilo, solo con ganas de señalar lo cool que son los sintetizadores de tabla de ondas. :-) – Nosredna

1

Intente crear una unidad de audio. Estoy haciendo algo similar, una UA funcionó bien para mí. Inicialmente, utilicé una cola de audio porque era más simple (¿nivel superior?) Y sincrónica, pero carecía de capacidad de respuesta, por lo que la dejé para la unidad de audio.

Cuestiones relacionadas