Onbewerkte geluidsgegevens opvragenFlash Player 9 of hoger, Adobe AIR 1.0 of hoger 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.
Afbeelding groot weergeven Waarden geretourneerd door methode SoundMixer.computeSpectrum()
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:
In een AIR-toepassing is de inhoud in de sandbox met toepassingsbeveiliging (inhoud die met de AIR-toepassing is geïnstalleerd), echter niet beperkt tot deze beveiligingsbeperkingen. Een eenvoudig geluidsweergavesysteem makenIn 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. |
|