la routine c'est ça :
Code :
- import com.xxx.Line;
- import flash.display.MovieClip;
- import flash.events.Event;
- import flash.events.TimerEvent;
- import flash.media.Sound;
- import flash.media.SoundMixer;
- import flash.net.URLRequest;
- import flash.utils.ByteArray;
- import flash.utils.Timer;
- var _holder:MovieClip = new MovieClip();
- this.addChild(_holder);
- var _line:Line = new Line();
- _holder.addChild(_line);
- var _s:Sound = new Sound();
- var _wave:ByteArray = new ByteArray();
- var _beacon:Timer = new Timer(1);
- _beacon.addEventListener( 'timer' , onTimer );
- var _bytesCount:Number;
- _s.addEventListener(Event.COMPLETE, onSoundLoaded);
- var req:URLRequest = new URLRequest('foobar');
- _s.load(req);
- function onSoundLoaded(event:Event):void {
- var localSound:Sound = event.target as Sound;
- localSound.play();
- SoundMixer.computeSpectrum(_wave);
- _bytesCount = _wave.length;
- for( var i:Number = 0 ; i < _bytesCount / 2 ; i++ ) {
- var __line:Line = new Line();
- _holder.addChild(__line);
- __line.x = i;
- __line.name = 'line_mc' + i;
- }
- _beacon.start();
- }
- function onTimer(event:TimerEvent):void {
- SoundMixer.computeSpectrum(_wave);
- for( var i:Number = 0 ; i < this._bytesCount / 2 ; i++ ) {
- _wave.position = i;
- var theLine:DisplayObject = _holder.getChildAt(i);
- var theLineMC:Line = theLine as Line;
- theLine.height = _wave.readByte();
- }
- }
|
Le problème c'est que le ByteArray _wave fait 2048 slices Donc la résolution est pourrie/trop élévée et on voit rien -> le Flash Player est techniquement limité, tu devrais combler avec un vieil effet de flou, ou ne dessiner que 50 slices reliés par des béziers, la méthode de SpliceMusic, à vue de nez.
Avec SoundMixer.computeSpectrum(_wave,true); , on applique une Transformée de Fourier à la volée, et on a le spectre (et c'est très joli par contre ).
Nécessite un clip "Line" attachable depuis la bibliothèque.
Message édité par craps_youpla le 29-08-2007 à 00:10:08
---------------
"Il y a vraiment aucun patelin qui s'appelle 'undefined' en France ?"