Met de methode
SoundMixer.computeSpectrum()
wordt een toepassing in staat gesteld de onbewerkte geluidsgegevens voor de momenteel afgespeelde geluidsgolf te lezen. Als er momenteel meer dan één object SoundChannel wordt afgespeeld, worden met de methode
SoundMixer.computeSpectrum()
de gecombineerde geluidsgegevens van alle objecten SoundChannel samen weergegeven.
De geluidsgegevens worden geretourneerd als een object ByteArray met 512 bytes aan gegevens, die elk een zwevende-kommawaarde tussen -1 en 1 bevatten. Deze waarden vertegenwoordigen de amplitude van de punten in de geluidsvorm die wordt afgespeeld. De waarden worden in twee groepen van 256 aangeleverd: de eerste groep heeft betrekking op het linkerstereokanaal en de tweede groep heeft betrekking op het rechterstereokanaal.
De methode
SoundMixer.computeSpectrum()
retourneert frequentiespectrumgegevens in plaats van golfgegevens als de parameter
FFTMode
op
true
is ingesteld. Het frequentiespectrum laat amplitude gesorteerd op geluidsfrequentie zien, beginnen met de laatste frequentie. Er wordt een FFT-transformatie (Fast Fourier Transform) gebruikt om de golfgegevens in frequentiespectrumgegevens om te zetten. De resulterende frequentiespectrumwaarden variëren van 0 tot ongeveer 1,414 (de vierkantswortel van 2).
In het volgende diagram wordt een vergelijking gemaakt tussen enerzijds de door de methode
computeSpectrum()
geretourneerde gegevens waarvoor de parameter
FFTMode
is ingesteld op
true
en anderzijds de door deze methode geretourneerde gegevens waarvoor deze parameter is ingesteld op
false
. Het geluid waarvan de gegevens voor dit diagram zijn gebruikt, bevat een hard basgeluid in het linkerkanaal en een trommelgeluid in het rechterkanaal.
De methode
computeSpectrum()
kan ook gegevens retourneren die opnieuw zijn bemonsterd met een lagere bitsnelheid. Dit leidt in het algemeen tot meer vloeiende golfgegevens of frequentiegegevens, wat ten koste gaat van het detailniveau. De parameter
stretchFactor
bestuurt de frequentie waarmee de methode
computeSpectrum()
gegevens bemonstert. Wanneer de parameter
stretchFactor
op 0 is ingesteld (de standaardwaarde), worden de geluidsgegevens bemonsterd met een frequentie van 44,1 kHz. De frequentie wordt bij elke volgende waarde van de parameter stretchFactor gehalveerd, wat betekent dat een waarde van 1 met een frequentie van 22,05 kHz correspondeert, dat een waarde van 2 met een frequentie van 11,025 kHz correspondeert, enzovoort. De methode
computeSpectrum()
blijft 256 bytes per stereokanaal retourneren wanneer er een hogere waarde voor
stretchFactor
wordt gebruikt.
De methode
SoundMixer.computeSpectrum()
kent een aantal beperkingen:
-
Aangezien geluidsgegevens uit een microfoon of RTMP-streams het algemene object SoundMixer niet passeren, retourneert de methode
SoundMixer.computeSpectrum()
geen gegevens uit dergelijke bronnen.
-
Als een of meer van de geluiden die worden afgespeeld, afkomstig zijn uit bronnen buiten de huidige inhoudssandbox, zorgen beveiligingsbeperkingen ervoor dat de methode
SoundMixer.computeSpectrum()
een fout genereert. Zie
Beveiligingsoverwegingen bij het laden en afspelen van geluiden
en
Geladen media benaderen als gegevens
voor meer informatie over de beveiligingsbeperkingen van de methode
SoundMixer.computeSpectrum()
.
In een AIR-toepassing wordt de inhoud in de beveiligingssandbox van de toepassing (inhoud die met de AIR-toepassing is geïnstalleerd) echter niet beperkt door deze beveiligingsbeperkingen.
Een eenvoudig geluidsweergavesysteem maken
In het volgende voorbeeld wordt de methode
SoundMixer.computeSpectrum()
gebruikt om een grafiek van de geluidsgolf te tekenen die als animatie bij elk frame wordt weergegeven:
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);
}
In dit voorbeeld wordt eerst een geluidsbestand geladen en afgespeeld, waarna er wordt geluisterd naar de gebeurtenis
Event.ENTER_FRAME
, die ervoor zorgt dat de methode
onEnterFrame()
wordt geactiveerd terwijl het geluid wordt afgespeeld. De methode
onEnterFrame()
begint met het aanroepen van de methode
SoundMixer.computeSpectrum()
, die de geluidsgolfgegevens in het
bytes
object ByteArray opslaat.
De geluidsgolf wordt geplot via de API voor vectortekeningen. Een lus
for
doorloopt de eerste 256 gegevenswaarden, die met het linkerstereokanaal corresponderen, en tekent een lijn van elk punt naar het daarop volgende punt door gebruik te maken van de methode
Graphics.lineTo()
. Een tweede lus
for
doorloopt de volgende set van 256 waarden en zet deze in omgekeerde volgorde uit, van rechts naar links. De resulterende golfplots kunnen een interessant spiegelbeeldeffect opleveren, zoals in de volgende afbeelding wordt weergegeven.