控制聲音音量和左右相位

Flash Player 9 以及更新的版本,Adobe AIR 1.0 以及更新的版本

個別的 SoundChannel 物件會控制聲音的左右立體聲道。如果 MP3 聲音是單聲道的聲音,則 SoundChannel 物件的左右立體聲道將包含相同的聲音波形。

您可以使用 SoundChannel 物件的 leftPeakrightPeak 屬性,得知正在播放聲音之每個立體聲道的振幅。這些屬性可以顯示聲音波形本身的波峰振幅,但是並不代表實際的播放音量。實際的播放音量是聲音波形的振幅函數,而且音量值會在 SoundChannel 物件與 SoundMixer 類別中設定。

您可以使用 SoundChannel 物件的 pan 屬性,在播放期間為每個左聲道和右聲道指定不同的音量。pan 屬性的值範圍包括從 -1 到 1,其中 -1 是指左聲道以最大音量播放,右聲道則為靜音;而 1 則表示右聲道以最大音量播放,左聲道則為靜音。介於 -1 與 1 之間的數值會為左右聲道值設定等比例值,而值為 0 則表示兩個聲道都會以對稱且中等的音量來播放。

下列程式碼範例會以 0.6 做為音量值,並以 -1 做為平衡值 (最大的左聲道音量,無右聲道音量) 來建立 SoundTransform 物件。它會將 SoundTransform 物件當做參數傳遞至 play() 方法,這會將該 SoundTransform 物件套用到用來控制播放作業所建立的新 SoundChannel 物件。

var snd:Sound = new Sound(new URLRequest("bigSound.mp3"));  
var trans:SoundTransform = new SoundTransform(0.6, -1); 
var channel:SoundChannel = snd.play(0, 1, trans);

您可以設定 SoundTransform 物件的 panvolume 屬性,然後將該物件套用為 SoundChannel 物件的 soundTransform 屬性,藉以在聲音播放期間改變音量與左右相位。

您也可以使用 SoundMixer 類別的 soundTransform 屬性,一次設定所有聲音的全域音量與平衡值,如下列範例所示:

SoundMixer.soundTransform = new SoundTransform(1, -1);

您也可以使用 SoundTransform 物件來設定 Microphone 物件 (請參閱擷取聲音輸入)、Sprite 物件及 SimpleButton 物件的音量和平衡值。

下列範例會在播放聲音期間,將聲音的左右相位從左聲道到右聲道以及從右聲道到左聲道輪流交換。

import flash.events.Event; 
import flash.media.Sound; 
import flash.media.SoundChannel; 
import flash.media.SoundMixer; 
import flash.net.URLRequest; 
 
var snd:Sound = new Sound();  
var req:URLRequest = new URLRequest("bigSound.mp3"); 
snd.load(req); 
 
var panCounter:Number = 0; 
 
var trans:SoundTransform; 
trans = new SoundTransform(1, 0); 
var channel:SoundChannel = snd.play(0, 1, trans); 
channel.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete); 
 
addEventListener(Event.ENTER_FRAME, onEnterFrame); 
 
function onEnterFrame(event:Event):void 
{ 
    trans.pan = Math.sin(panCounter); 
    channel.soundTransform = trans; // or SoundMixer.soundTransform = trans; 
    panCounter += 0.05; 
} 
 
function onPlaybackComplete(event:Event):void 
{ 
    removeEventListener(Event.ENTER_FRAME, onEnterFrame); 
}

此程式碼首先會載入聲音檔案,然後建立新的 SoundTransform 物件,並將 volume 屬性設定為 1 (最大音量),以及將 pan 屬性設定為 0 (左右聲道平衡)。然後,再呼叫 snd.play() 方法,將 SoundTransform 物件當做參數傳遞。

在聲音播放期間,onEnterFrame() 方法會重複執行。onEnterFrame() 方法會使用 Math.sin() 函數來產生介於 -1 與 1 之間的值,這個範圍與 SoundTransform.pan 屬性可接受的值一致。SoundTransform 物件的 pan 屬性會設定為新的值,而聲道的 soundTransform 屬性則設定為使用改變後的 SoundTransform 物件。

若要執行這個範例,請以本機 MP3 檔案的名稱取代 bigSound.mp3 這個檔案名稱。接著,請執行範例。當右聲道音量變小時,您應該會聽到左聲道的音量變大,反之亦然。

在此範例中,設定 SoundMixer 類別的 soundTransform 屬性也可以達到相同的效果。不過,這將會影響目前播放的所有聲音之左右相位,並不只是此 SoundChannel 物件所播放的單一聲音。