Salut,
Pour afficher le spectre en fréquence au lieu de la représentation temporelle il faut mettre le deuxième parametre de computeSpectrum à true :
SoundMixer.computeSpectrum(ba, true, 0);
Les valeurs entre 0 et 255 correspondent au canal droit et de 256 à 512 au canal gauche.
Voilà un petit exemple qui dessine directement en utilisant un objet graphics :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| import flash.display.Graphics;
import flash.events.Event;
import flash.media.Sound;
import flash.media.SoundChannel;
import flash.media.SoundMixer;
import flash.net.URLRequest;
const PLOT_HEIGHT:int = 300;
const PLOT_WIDTH:int = 800;
const CHANNEL_LENGTH:int = 256;
const BAR_WIDTH:Number = PLOT_WIDTH/CHANNEL_LENGTH;
const COLOR_RANGE:Number = 255/1.42;
addEventListener(Event.ENTER_FRAME, onEnterFrame);
var bytes:ByteArray = new ByteArray();
function onEnterFrame(event:Event):void
{
SoundMixer.computeSpectrum(bytes, true, 0);
var g:Graphics = this.graphics;
g.clear();
var n:Number = 0;
// left channel
for (var i:int = 0; i < CHANNEL_LENGTH; i++)
{
n = bytes.readFloat()*COLOR_RANGE;
g.beginFill(n << 16);
g.drawRect(i*BAR_WIDTH, 0, BAR_WIDTH, PLOT_HEIGHT);
g.endFill();
} |
à adapter évidement mais tu vois l'idée ...
Le problème avec ton code actuel (en plus du 2é paramètre de computeSpectrum à mettre à true) c'est qu'il ne lis que 50 fois avec readFloat(). Si tu veux faire un spectre complet il faudrait utiliser les 255 valeurs
Partager