OpenAl, Core Audio, ddcl
El tercer día fue dedicado casi que en exclusiva al audio, aunque primero terminamos los ejemplos de JSON y WebServices del día anterior.
Audio en 3D: OpenAL
Primero vimos algo de OpenAL. Si OpenGL nos permite reproducir imágenes en 3D, OpenAL hace lo mismo para el audio. Más de uno se estará preguntando qué demonios es eso del audio en 3D, pues bien es lo que permite que en un juego o una película un tiroteo parezca provenir de tu derecha, cuando lo oyes con audífonos.
Cuando en el mundo real un sonido te alcanza desde la derecha, será percibido de forma levemente distinta por tu oído derecho e izquierdo:
- El derecho recibirá las ondas un poco antes
- El izquierdo las recibirá lago después y en una fase algo distinta
- Además tu cráneo creará una “sombra acústica” que afectará las ondas que alcancen tu oído izquierdo.
Estas diferencias son las que permiten a tu cerebro posicionar el origen del sonido y éste tipo de cosas es lo que podemos simular mediante OpenAL.
Audio en tiempo real: RemoteIO Audio Units
La mayor parte del día la dedicamos al procesamiento de audio en tiempo real mediante remote IO Audio Units. Las Audio Units, son como plugins que procesan el sonido y pueden ser encadenados uno detrás del otro, para procesarlo en serie. Parece recordar un poco el funcionamiento de Pure Data, pero para nerds “hardcore”.
Esta es la parte más de bajo nivel de CoreAudio, y todo el código se escribe en ObjectiveC++ (es decir, mezclando Objective C y C++) en ficheros .mm. En realidad, lo que hicimos era más C mondo y lirondo y muy próximo al hardware. Curiosamente, es más sencillo en dispositivos iOS que en el Mac, ya que en éste último hay más variedad de hardware de sonido.
Buena parte del código es más de configuración y puesta a punto que de procesado en sí. Es complicado, pero ser muy de bajo nivel y requerir mucho código, pero complejo. Con un par de clases que se encarguen del código comun, la cosa debería de ser más llevadera.
Una vez montado el chiringuito, queda por registrar una serie de “callbacks” que pasamos a CoreAudio mediate punteros a funciones C. Algunos son para cosas como interrumpir lo qu estés haciendo cuando recibes una llamada telefónica y también el procesado en sí se hace mediante un callback: cuando se llena el buffer de entrada, te lo pasan a tu callback para que lo proceses y devuelvas.
La idea era crear una función seno y con ella modular la amplitud de la señal de entrada, lo que genera un efecto similar a cuando hablas frente a un ventilador.
Definitivamente tengo que trastear con esto, ya que parece interesante. Desgraciadamente, no parece ser posible modificar el sonido que viene del micrófono mientras estás haciendo una llamada telefónica, lo que daría pie a cosas “interesantes”. 😉
La siguiente parte consistía en aplicar efectos más avanzados en el audio, mediante una librería de transformadas de Fourier de Apple, así como de terceros. Si teneis interés, www.dspdimension.com tiene muchos tutoriales así como la librería DIRAC.
Yo de momento ya me he comprado el libro A Hands-On Guide to Audio Programming for Mac and iOS para echarle un vistazo con calma a todo esto cuando esté en España.
Utilidades de linea de comando en Objective C: ddcli
También recomendaron la framework de terceros ddcli, que facilita al parecer mucho la creación de utilidades de linea de comandos en Objective C. Todavía no la he mirado con calma.