Cristalab

Crear Ecualizador Grafico con ActionScript 3

Por: shogoki + 24.10.2006

Bueno, con la llegada del ActionScript 3 llegaron cosas nuevas, y una de ellas fue la clase Flash.media.SoundMixer; que nos permite realizar un ecualizador grafico, hoy veremos como hacerlo Muy Feliz , para ello utilizaremos una clase que llamaremos "PlaySound" que se encargara de reproducir el sonido, y pasarnos la información del ecualizador, bien empecemos creando la clase, abre tu editor de texto preferido, crea un archivo y nombralo como "PlaySound.as", luego coloca el siguiente código:

Código :

package {
     //Importamos las clases a utilizar
    import flash.display.Sprite;
    import flash.events.*;
    import flash.media.Sound;
    import flash.media.SoundChannel;  
    import flash.media.SoundTransform;
    import flash.media.SoundMixer;
    import flash.net.URLRequest;
    import flash.utils.Timer;
    import flash.utils.ByteArray;  
}



bueno en primer instancia, importamos las clases a utilizar, de las cuales las mas importantes son
flash.media.Sound; // Que nos permite cargar y reproducir un sonido
flash.media.SoundChannel; //Para controlar el sonido cargado
flash.media.SoundTransform; //que nos permite, asignar las propiedades de volumen y pannig al sonido
flash.media.SoundMixer;//Nos devuelve los valores de la Onda de sonido o el spectro de frecuencia que usaremos para el ecualizador
flash.utils.ByteArray; //Para crear un ByteArray, que es donde almacenaremos los valores del ecualizador

luego, creamos la clase en si que llamaremos PlaySound, y le asignaremos algunas variables a utilizar, y al final crearemos el constructor de la clase

Código :

  
public class PlaySound extends Sprite {
        private var url:String = "MySound.mp3";//Variable para almacenar el archivo a reproducir
        private var song:SoundChannel;//Instancia de SoundChannell
   private var soundFactory:Sound;//Instancia de Sound
   private var FourierTransform:Boolean = false;//Clase que usaremos para la transformación fourier, que ya explicaremos más adelante
   private var arrayMixer:ByteArray = new ByteArray();//ByteArray, para almacenar los valores del ecualizador
   private var pan:int = 0; //Para el ajuste de la salida del audio
   private var porcentLoad:Number = 0; 

        public function PlaySound() {
      CargarSong();
        }
}



Ok, vemos que desde el constructor llamamos a una función llamada "CargarSong", ok, vamos a crearla;

Código :

public function CargarSong():void{
       SoundMixer.stopAll();//Metodo de la clase SoundMixer, que nos permite detener todos los Sonidos que se esten reproduciendo
       soundFactory = new Sound();//Creamos una nueva instancia de la clase Sound
            var request:URLRequest = new URLRequest(url);//Hacemos la petición del mp3   
           //Luego asiganmos los Listener de la clase Sound();
       soundFactory.addEventListener(Event.COMPLETE, completeHandler);         
            soundFactory.addEventListener(ProgressEvent.PROGRESS, progressHandler);
            soundFactory.load(request);//Cargamos la canción
}


Luego procedamos a realizar los manejadores de eventos para la clase Sound;

Código :

        private function completeHandler(event:Event):void {
          //Una Vez que la canción se halla cargado por completo la reproducimos
      ReproducirSong();
        }
     

        private function progressHandler(event:ProgressEvent):void {
      //Mientras se carga, acutalizamos el valor de la variable porcentLoad   
      porcentLoad = Math.round((event.bytesLoaded*100)/event.bytesTotal);
        }



Vemos que cuando la canción se carga por completo, ejecutamos una función llamada ReproducirSong, que realmente no tiene mucha ciencia, como vemos a continuación

Código :

private function ReproducirSong():void{         
        song = soundFactory.play();//La ejecutamos
}



Listo, ya tenemos el codigo, que se encarga de cargar una canción, ahora bien, se preguntaran "Ok, pero, ¿Como creo el Ecualizador?", ok, vamos a ello

Código :

public function get Mixer():ByteArray{         
   //Llamamos al metodo estatico computeSpectrum de la clase SounMixer, y le pasamos los valores
   //del ByteArray donde se almacenaran, o el raw_wave o el spectro de frecuencia
   //y un valor Boolean que indica si se debe realizar la transforación Fourier o no
   //Al final retornamos el ByteArray
   SoundMixer.computeSpectrum(arrayMixer, FourierTransform);
      return arrayMixer;
   }



Listo, eso es todo lo que necesitamos para el ecualizador, solo una simple linea de condigo Riendo , vamos a explicar, el metodo "computeSpectrum" de la clase SoundMixer, posee la siguiente forma:

computeSpectrum(outputArray:ByteArray, FFTMode:Boolean = false, stretchFactor:int = 0):void

vemos que Recibe un ByteArray, que es el unico valor Obligatorio, luego un Booleno y un valor entero, ok!, pero que hace?, Simple, guarda en el ByteArray que le pasamos, 512 elementos, del tipo float(), que vienen a ser los valores de la onda de sonido (Sound Wave), de la reproducción acual, son 512, ya que los primeros 256 son para el parlante izquierdo, y los demas son para el parlante derecho, los valores estan comprendido desde -1.0 hasta 1.0, luego tenemos el valor booleno, si especificamos "true", ya no nos devolvera una onda de sonido, sino antes de guadar la información el ByteArray, aplicara la transformacion Fourier a la onda, y almacenara entonces un espectro de frecuencia, donde los valores del lado derecho vienen a ser ondas de alta Frecuencia, y los de la izquierda de baja Frecuencia.

Vamos a añadir una propiedad mas a la clase, que nos permitira especificar si queremos aplicar la transformación fourier o no veamos:

Código :

public function set Fourier(valor:Boolean):void{
   this.FourierTransform = valor;         
}
      
public function get Fourier():Boolean{
   return FourierTransform;
}



Ya con esto tenemos creada la clase, ahora solo tienes que utilizarla, que es lo mas sencillo, y como representar el Ecualizador ya queda de parte de tu imaginación, solo tienes que saber que el ByteArray que te devuelve la propiedad Mixer de la clase que creamos, almacena 512 elementos como valores del tipo Float, y si tienes por ejemplo, 512 barras en una pelicula y quieres moverlas al ritmo de la canción solo tendrias que modificar la propiedad scaleY de cada una, con los valores del array.

aqui puedes ver como queda, y ademas descargarte el código Guiño

http://www.aai.com.ve/tools/soundMixer/

espero que les sirva

Etiquetas actionscript_3

Comentarios | Enviar un comentario
Wow, realmente muy buen post. Es muy interesante imaginar otras aplicaciones a nivel de interfaz de usuario que pueda tener esta nueva habilidad de Flash.

Realmente un gran tip Sonrisa
Por: Freddie
excelente,!
lo probaré y seré felíz!
Por: emalandia_blog
Creo que merece una portada miau
Por: Yranac

Yranac :

Creo que merece una portada miau
Está en portada.
Por: Ed

Ed :

Yranac :

Creo que merece una portada miau
Está en portada.
No en la mia Confundido
Por: Yranac
Queria editar el último post pero no me dio tiempo

Ed :

Yranac :

Creo que merece una portada miau
Está en portada.
Si ya está en portada es que yo tenía razon Riendo Riendo
Por: Yranac
Uff dont cry....and pleaaase remembeer, that i never lieee honey.
jeje

Interesante As3 tuto
Por: Dailion_blog
Esto es solo a partir de Fash 9 no??
Por: Matias_blog

Matias_blog :

Esto es solo a partir de Fash 9 no??
No. Puedes usarlo tambien con Flex 2.
Por: Freddie
Bueno a mi parecer ahora que es el mundo de la musica es bueno que se publiquen codigos muy interesantes, para la creacion de estas mas aun en Flash, bueno esperare la version 9, atte.
Raul Narvaez
Por: Raul Narvaez_blog
me gustaria saber con que estan trabajando ? que programa y como hago para unirme
quiero saber como ?? gracias
Por: eduardo_blog
Hola , como se genera la imagen , y como se que tengo el AS 3.0
Por: Mundix_blog
Se puede hacer en flash 8???
Por: Marijo_blog

Marijo_blog :

Se puede hacer en flash 8???
No.
Por: Ed
Saludos , tengo varias preguntas sobre el equalizador ,

como puedo limitar el numero de barras , y si quisiera ponerlo dentro de otro simbolo?

me interesa poner las barras que salen a la derecha pegado y a la izq. al fondo en el medio y que solo me salgan 20 barras en total.
Por: Mundix_blog
Tengo instalado el flash 8 e intente probar el ecualizador, pero me marco muchos errores,,que flash o librerias debo de tener para correrlo???
Por: maria_blog
Sos grande maestro ... gracias por la ayuda.
Por: PatoChullo
excelente pero no esta por ahi el .fla
Por: carlos_blog
Hola , varias preguntas tb sobre el ecualizador:
¿como puedo cambiar la barra por otro elemento distinto?
¿ademas tendria que duplicar el código cuantas barras necesite?
Gracias
Por: Ludicabcn-blog
tu sabes sumar tu edad tu lo q tienes q aser es poner tu fecha de nasimiento y el año de haora por ejemplo: 2008 +1999 y te sale la edad q tienes
Por: tity la de la tele -blog
hola me llamo prisila pero me disen titi y tu como te yamas me lo dises por favor
Por: prisila-blog
Deja un comentario
IMPORTANTE

Recuerda ser respetuoso, no insultes a otras personas, ni uses palabrotas, hay una persona al otro lado de la pantalla.

Habla bien, NO ESCRIBAS EN MAYUSCULA TODO, no escribas como en un SMS, evita cosas como "ke", "x q" y demás abreviaciones.

Aquí funcionan las etiquetas de los foros, puedes usar [b] para negrita, [img] para las imágenes, [url] para los enlaces, etc.

Si tienes preguntas técnicas, envíalas mejor al foro.