单个 SoundChannel 对象可同时控制声音的左立体声声道和右立体声声道。如果 mp3 声音是单声道声音,SoundChannel 对象的左右两个立体声声道将包含完全相同的波形。
可通过使用 SoundChannel 对象的
leftPeak
和
rightPeak
属性来查明所播放的声音的每个立体声声道的波幅。这些属性显示声音波形本身的峰值波幅。它们并不表示实际播放音量。实际播放音量是声音波形的波幅以及 SoundChannel 对象和 SoundMixer 类中设置的音量值的函数。
在播放期间,可以使用 SoundChannel 对象的 pan 属性为左声道和右声道分别指定不同的音量级别。pan 属性可以具有范围从 -1 到 1 的值。值 -1 表示左声道以最大音量播放而右声道处于静音状态。值 1 表示右声道以最大音量播放而左声道处于静音状态。介于 -1 和 1 之间的值可为左右声道值设置一定比例的值。值 0 表示两个声道以均衡的中音量级别播放。
以下代码示例使用音量值 0.6 和声相值 -1 创建了一个 SoundTransform 对象(左声道为最高音量,右声道没有音量)。它会将 SoundTransform 对象作为参数传递给
play()
方法。
play()
方法将该 SoundTransform 对象应用于为控制播放而创建的新 SoundChannel 对象。
var req = new air.URLRequest("bigSound.mp3");
var snd = new air.Sound(req);
var trans = new air.SoundTransform(0.6, -1);
var channel = snd.play(0, 1, trans);
可以在播放声音的同时更改音量和声相。设置 SoundTransform 对象的
pan
或
volume
属性,然后将该对象作为 SoundChannel 对象的
soundTransform
属性进行应用。
也可以通过使用 SoundMixer 类的
soundTransform
属性,同时为所有声音设置全局音量和声相值。以下示例说明了这一过程:
SoundMixer.soundTransform = new air.SoundTransform(1, -1);
也可以使用 SoundTransform 对象来设置 Microphone 对象的音量和声相值(请参阅
捕获声音输入
)。
以下示例在播放声音的同时将声音从左声道移到右声道,然后再移回来,并交替进行这一过程:
var snd = new air.Sound();
var req = new air.URLRequest("bigSound.mp3");
snd.load(req);
var panCounter = 0;
var trans = new air.SoundTransform(1, 0);
var channel = snd.play(0, 1, trans);
channel.addEventListener(air.Event.SOUND_COMPLETE,
onPlaybackComplete);
var timer = setInterval(panner, 100);
function panner()
{
trans.pan = Math.sin(panCounter);
channel.soundTransform = trans; // or SoundMixer.soundTransform = trans;
panCounter += 0.05;
}
function onPlaybackComplete(event)
{
clearInterval(timer);
}
此代码先加载一个声音文件,然后将音量设置为 1(最大音量)并将声相设置为 0(声音在左右两声道之间均衡地平均分布)以创建一个 SoundTransform 对象。接下来,此代码调用
snd.play()
方法,以将 SoundTransform 对象作为参数进行传递。
在播放声音时,将反复执行
panner()
方法。
panner()
方法将使用
Math.sin()
函数生成一个介于 -1 和 1 之间的值。此范围对应于可接受的
SoundTransform.pan
属性值。此代码将 SoundTransform 对象的
pan
属性设置为新值,然后设置声道的
soundTransform
属性以使用更改后的 SoundTransform 对象。
要运行此示例,请用本地 mp3 文件的名称替换文件名 bigSound.mp3。然后,运行该示例。当右声道音量变小时,您应会听到左声道音量变大,反之亦然。
在此示例中,可通过设置 SoundMixer 类的
soundTransform
属性来获得同样的效果。但是,这会影响当前播放的所有声音的声相,而不是只影响此 SoundChannel 对象播放的一种声音。