O método
SoundMixer.computeSpectrum()
permite que um aplicativo leia os dados de som brutos para a forma de onda que está sendo reproduzida no momento. Se mais de um objeto SoundChannel estiver sendo reproduzido, o método
SoundMixer.computeSpectrum()
mostrará os dados de som combinados de cada objeto SoundChannel misturado.
Os dados de som são retornados como um objeto ByteArray que contém 512 bytes de dados, cada um deles contendo um valor de ponto flutuante entre -1 e 1. Esses valores representam a amplitude dos pontos na forma de onda do som que está sendo reproduzido. Os valores são entregues em dois grupos de 256, o primeiro grupo do canal estéreo esquerdo e o segundo grupo do canal estéreo direito.
O método
SoundMixer.computeSpectrum()
retornará os dados do espectro da frequência em vez dos dados da forma de onda se o parâmetro
FFTMode
estiver definido como
true
. O espectro da frequência mostra a amplitude organizada pela frequência do som, da frequência mais baixa para a mais alta. Uma FFT (Transformação rápida de Fourier) é usada para converter os dados da forma de onda nos dados do espectro da frequência. Os valores do espectro da frequência resultantes variam de 0 a aproximadamente 1,414 (a raiz quadrada de 2).
O diagrama a seguir compara os dados retornados do método
computeSpectrum()
quando o parâmetro
FFTMode
está definido como
true
e quando está definido como
false
. O som cujos dados foram usados para esse diagrama contém um som grave alto no canal esquerdo e um som de toque de tambor no canal direito.
Exibir gráfico inteiro
Valores retornados pelo método SoundMixer.computeSpectrum()
-
A.
-
fftMode=true
-
B.
-
fftMode=false
O método
computeSpectrum()
também pode retornar dados que foram amostrados novamente em uma taxa de bits mais baixa. Geralmente, isso resulta em dados de forma de onda mais suaves ou em dados de frequência em detrimento de detalhes. O parâmetro
stretchFactor
controla a taxa na qual os dados do método
computeSpectrum()
são amostrados. Quando o parâmetro
stretchFactor
está definido como 0, o padrão, os dados do som são amostrados a uma taxa de 44,1 kHz. A taxa é dividida em dois em cada valor sucessivo do parâmetro stretchFactor, portanto um valor de 1 especifica uma taxa de 22,05 kHz, um valor de 2 especifica uma taxa de 11,025 kHz e assim por diante. O método
computeSpectrum()
ainda retorna 256 bytes por canal estéreo quando um valor de
stretchFactor
mais alto é usado.
O método
SoundMixer.computeSpectrum()
tem algumas limitações:
-
Como os dados do som de um microfone ou de fluxos RTMP não passam pelo objeto global SoundMixer, o método
SoundMixer.computeSpectrum()
não retorna dados dessas origens.
-
Se um ou mais dos sons que estão sendo reproduzidos de origens externas à caixa de proteção do conteúdo atual, restrições de segurança farão com que o método
SoundMixer.computeSpectrum()
emita um erro. Para obter mais detalhes sobre limitações de segurança do método
SoundMixer.computeSpectrum()
consulte
Considerações sobre segurança ao carregar e reproduzir sons
e
Acesso à mídia carregada como dados
.
Contudo, em um aplicativo do AIR, o conteúdo na caixa de proteção de segurança do aplicativo (conteúdo instalado com o aplicativo do AIR) não é restringido por essas limitações de segurança.
Criação de um único visualizador de som
O exemplo a seguir usa o método
SoundMixer.computeSpectrum()
para mostrar um gráfico da forma de onda do som que é animado com cada quadro:
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);
}
Esse exemplo primeiro carrega e reproduz um arquivo de som e, em seguida, ouve o evento
Event.ENTER_FRAME
que disparará o método
onEnterFrame()
enquanto o som é reproduzido. O método
onEnterFrame()
é iniciado chamando o método
SoundMixer.computeSpectrum()
que armazena dos dados da onda do som no objeto ByteArray de
bytes
.
A forma de onda do som é plotada usando a API de desenho do vetor. Um loop
for
percorre os primeiros 256 valores de dados que representam o canal estéreo esquerdo e desenha uma linha de cada ponto até o próximo usando o método
Graphics.lineTo()
. Um segundo loop
for
percorre o próximo conjunto de 256 valores, plotando-os na ordem reversa desta vez, da direita para a esquerda. Os desenhos da forma de onda resultantes podem produzir um efeito interessante de imagem espelhada, conforme mostrado na imagem a seguir.