La méthode
SoundMixer.computeSpectrum()
permet à une application de lire les données audio brutes pour la courbe audio en cours de lecture. Si plusieurs objets SoundChannel sont en cours de lecture, la méthode
SoundMixer.computeSpectrum()
indique les données audio combinées de chaque objet SoundChannel mixé.
Les données audio sont renvoyées sous la forme d’un objet ByteArray contenant 512 octets de données (chacun d’eux contenant une valeur en virgule flottante comprise entre -1 et 1). Ces valeurs représentent l’amplitude des points dans la courbe audio en cours de lecture. Les valeurs sont fournies en deux groupes de 256 : le premier groupe pour le canal stéréo gauche et le second pour le canal stéréo droit.
La méthode
SoundMixer.computeSpectrum()
renvoie des données de spectre de fréquences plutôt que des données de courbe audio si le paramètre
FFTMode
est défini sur
true
. Le spectre de fréquences indique l’amplitude par fréquence du son, de la plus basse à la plus élevée. Une FFT (Fast Fourier Transform - transformation de Fourier rapide) est utilisée pour convertir les données de courbe audio en données de spectre de fréquences. Les valeurs de spectre de fréquences résultantes sont comprises entre 0 et 1,414 environ (la racine carrée de 2).
Le diagramme suivant compare les données renvoyées de la méthode
computeSpectrum()
lorsque le paramètre
FFTMode
est défini sur
true
et lorsqu’il est défini sur
false
. Le son dont les données ont été utilisées pour ce diagramme contient un son de basse de grande intensité dans le canal gauche et un son de tambour dans le canal droit.
La méthode
computeSpectrum()
peut également renvoyer des données qui ont été rééchantillonnées à un débit inférieur. Généralement, ceci entraîne des données de fréquence ou des données de courbe audio plus lisses, au profit des détails. Le paramètre
stretchFactor
contrôle la fréquence à laquelle les données de la méthode
computeSpectrum()
sont échantillonnées. Lorsque le paramètre
stretchFactor
est défini sur 0 (valeur par défaut), les données audio sont échantillonnées à une fréquence de 44,1 KHz. La fréquence est diminuée de moitié à chaque valeur successive du paramètre stretchFactor. Par conséquent, une valeur de 1 indique une fréquence de 22,05 KHz, une valeur de 2 une fréquence de 11,025 KHz, et ainsi de suite. La méthode
computeSpectrum()
continue à renvoyer 256 octets par canal stéréo lorsqu’une valeur
stretchFactor
supérieure est utilisée.
La méthode
SoundMixer.computeSpectrum()
comporte des limites :
-
Etant donné que les données audio issues d’un microphone ou de flux RTMP ne passent pas par l’objet SoundMixer global, la méthode
SoundMixer.computeSpectrum()
ne renvoie pas de données de ces sources.
-
Si un ou plusieurs sons lus proviennent de sources externes au sandbox de contexte actuel, les restrictions de sécurité provoquent le renvoi d’une erreur par la méthode
SoundMixer.computeSpectrum()
. Pour plus d’informations sur les limites de sécurité de la méthode
SoundMixer.computeSpectrum()
, voir
Sécurité lors du chargement et de la lecture des sons
et
Accès aux médias chargés comme s’il s’agissait de données
.
Cependant, dans une application AIR, le contenu du sandbox de sécurité de l’application (contenu installé avec l’application AIR) n’est pas restreint par ces limites de sécurité.
Création d’un visualiseur audio simple
L’exemple suivant utilise la méthode
SoundMixer.computeSpectrum()
pour afficher un diagramme de la courbe audio animée avec chaque image :
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 = 200;
const CHANNEL_LENGTH:int = 256;
var snd:Sound = new Sound();
var req:URLRequest = new URLRequest("bigSound.mp3");
snd.load(req);
var channel:SoundChannel;
channel = snd.play();
addEventListener(Event.ENTER_FRAME, onEnterFrame);
snd.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete);
var bytes:ByteArray = new ByteArray();
function onEnterFrame(event:Event):void
{
SoundMixer.computeSpectrum(bytes, false, 0);
var g:Graphics = this.graphics;
g.clear();
g.lineStyle(0, 0x6600CC);
g.beginFill(0x6600CC);
g.moveTo(0, PLOT_HEIGHT);
var n:Number = 0;
// left channel
for (var i:int = 0; i < CHANNEL_LENGTH; i++)
{
n = (bytes.readFloat() * PLOT_HEIGHT);
g.lineTo(i * 2, PLOT_HEIGHT - n);
}
g.lineTo(CHANNEL_LENGTH * 2, PLOT_HEIGHT);
g.endFill();
// right channel
g.lineStyle(0, 0xCC0066);
g.beginFill(0xCC0066, 0.5);
g.moveTo(CHANNEL_LENGTH * 2, PLOT_HEIGHT);
for (i = CHANNEL_LENGTH; i > 0; i--)
{
n = (bytes.readFloat() * PLOT_HEIGHT);
g.lineTo(i * 2, PLOT_HEIGHT - n);
}
g.lineTo(0, PLOT_HEIGHT);
g.endFill();
}
function onPlaybackComplete(event:Event)
{
removeEventListener(Event.ENTER_FRAME, onEnterFrame);
}
Cet exemple commence par charger et lire un fichier audio puis écoute l’événement
Event.ENTER_FRAME
qui déclenchera la méthode
onEnterFrame()
lors de la lecture du son. La méthode
onEnterFrame()
commence par appeler la méthode
SoundMixer.computeSpectrum()
, qui stocke les données d’onde acoustique dans l’objet ByteArray
bytes
.
La courbe audio est tracée à l’aide de l’API de dessin vectoriel. Une boucle
for
passe dans les 256 premières valeurs de données, représentant le canal stéréo gauche, et trace une ligne entre chaque point au moyen de la méthode
Graphics.lineTo()
. Une second boucle
for
passe dans les 256 valeurs suivantes, en les traçant cette fois dans l’ordre inverse, de droite à gauche. Les tracés de courbe audio résultants peuvent produire un effet miroir-image intéressant, comme illustré sur l’image suivante.