Tip: Modificar el tono de un audio en ActionScript3

danii . lunes 27 de diciembre de 2010. a las 09:11

Hace algún tiempo necesitábamos modificar por programación el tono de un audio en Flash (es decir, subirle el tono seria volverlo más agudo o «pitufarlo» y bajarle el tono sería volverlo más grave) y la verdad es que estuvimos dando poco más que palos de ciego hasta que dimos con este ejemplo, donde por cortesía de Andre Michele encontramos la clase MP3Pitch en ActionScript 3 que se encarga precisamente de conseguir este efecto utilizando la clase nativa Sound y más específicamente, ampliando de manera magistral el ejemplo de uso que podemos encontrar bajo el método extract. La idea es ir leyendo los bytes del mp3 a mayor o menor velocidad (según si queremos incrementar el tono o hacerlo más bajo) y a continuación interpolarlos y dinámicamente meterle estos bytes interpolados al objeto sound que se está reproduciendo. Nos encantó porque a este nivel de byte todos hemos visto muchísimos ejemplos que trabajan con imágenes, pero como vemos con el audio también se puede ser creativo.

Una ventaja adicional es que el código proporcionado está comentado en su totalidad (por desgracia esto no es la norma) lo cual resulta tremendamente útil en el caso que nos veamos forzados a cambiar la funcionalidad (o simplemente enterarnos de qué carajo hace internamente).

El código final es muy simple, utilizando la clase MP3Pitch proporcionada, tan sólo tenemos que ir asignando el valor del slider al rate en el que se van a ir leyendo los bytes del audio, y en nada de tiempo tenemos ejemplos tan resultones como este:


Get Adobe Flash player

Ejemplo en el que por cierto hemos aprovechado el espíritu navideño reinante para colar un villancico y desearos a todos/as, queridos lectores, FELICES FIESTAS 2010/2011!

Etiquetas: , ,

3 Comentarios
» Feed RSS de los Comentarios

  1. Ciberman dice:

    Buenísimo, pero, una pregunta, si yo quiero acelerar la canción y conservar la nota, solo la velocidad, sin que se escuche como Alvin y las ardillas.. ¿Cómo lo podría hacer?
    Espero su respuesta, Muy buen ejemplo!!!

  2. danii dice:

    Buenas, y gracias por el comentario! Te comento que en este ejemplo hemos «acelerado» el audio leyendo los bits de información que conforman el mp3 más rápidamente, el efecto sería similar a si hubiésemos utilizado una técnica de resampling y en este caso el tono del audio siempre se modifica en la misma escala que la velocidad. Yo personalmente no estoy muy puesto en teoría musical, ondas senoidales ni análisis de Fourier, pero te traslado a la página de la wikipedia sobre el tono acústico donde explican por qué la canción sigue siendo reconocible («el oído humano las percibe como las mismas notas, pero más agudas»).

    En cuanto a tu duda, siendo sincero te iba a contestar que por tanto no es posible acelerar la canción sin que se modifique el tono, pero al documentarme leyendo el artículo en inglés de la wiki me he topado con esta técnica llamada Phase vocoder que, en teoría y si entiendo correctamente, hace exactamente eso. Por desgracia no tengo ni idea de cómo implementarla ni si existe por ahí más información al respecto (ni mucho menos en español), pero quizás a partir de aquí puedes encontrar algo útil. Suerte!

  3. Ciberman dice:

    Gracias por responder!
    Mh… estaba viendo y no se ve para nada sencillo. (es una pena que los de adobe no hayan puesto nativamente una funcion para cambiar el tempo) Preguntaba eso porque he visto por ahi en algun lado que lo hace, pero obviamente no exponen el código y mucho menos comentado para que se entienda (no sé mucho de AS3 y aun estoy aprendiendo ). Bueno, muchísimas gracias!
    Los agrego a mis RSSs! Muy buen blog, suerte!

Enviar comentario