サウンドの音量とバランスの制御

Flash Player 9 以降、Adobe AIR 1.0 以降

個々の SoundChannel オブジェクトは、サウンドの左右のステレオチャンネルを両方とも制御します。MP3 サウンドがモノラルサウンドである場合、SoundChannel オブジェクトの左右のステレオチャンネルの波形は同一になります。

再生中のサウンドの各ステレオチャンネルの振幅を検出するには、SoundChannel オブジェクトの leftPeak プロパティと rightPeak プロパティを使用します。これらのプロパティは、サウンド波形自体のピーク振幅を示します。実際の再生音量を表してはいません。実際の再生音量は、サウンド波形の振幅と、SoundChannel オブジェクトおよび SoundMixer クラスで設定されている音量値の相関結果です。

SoundChannel オブジェクトの pan プロパティを使用すると、再生中の左右のチャンネルに異なる音量レベルを指定できます。pan プロパティには、-1 から 1 までの値を指定することができます。ここで -1 とは、左チャンネルが最大ボリュームで再生され、右チャンネルが無音になること、そして 1 は右チャンネルが最大ボリュームで再生され、左チャンネルが無音であることを意味します。 -1 から 1 までの数値は、左右のチャンネル値に対して相対値を設定します。値が 0 であると、両方のチャンネルで均衡が取れた中程度のボリュームレベルで再生されます。

次のコード例では、SoundTransform オブジェクトを作成し、音量の値を 0.6 に、バランスの値を -1(左チャンネルは最大音量、右チャンネルは消音)に設定しています。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 オブジェクトの pan または volume プロパティを設定し、このオブジェクトを 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 オブジェクトを作成します。このとき、ボリュームを 1(フルボリューム)に、パンを 0(左右で均衡)に設定します。 次に、 snd.play() メソッドを呼び出し、SoundTransform オブジェクトをパラメーターとして渡します。

サウンドの再生中は、 onEnterFrame() メソッドが繰り返し実行されます。 onEnterFrame() メソッドは、 Math.sin() 関数を使用して -1 から 1 までの値を生成します。この値の範囲は、 SoundTransform.pan プロパティで許容される値の範囲となります。SoundTransform オブジェクトの pan プロパティを新しい値に設定した後、チャンネルの soundTransform プロパティを、変更後の SoundTransform オブジェクトを使用するように設定します。

このコード例を実行する場合は、ファイル名 bigSound.mp3 をローカルの MP3 ファイルの名前に変更します。 その後で例を実行します。まず、左チャンネルの音量が大きくなって右チャンネルの音量が小さくなり、次にはその逆に音量が変化します。

この例では、SoundMixer クラスの soundTransform プロパティを設定することで同じ効果を実現することもできます。ただし、これにより、SoundChannel オブジェクトによって再生されている単独のサウンドだけではなく、再生中のすべてのサウンドのパンが影響を受けます。