进阶音效控制与管理Word文档格式.docx
《进阶音效控制与管理Word文档格式.docx》由会员分享,可在线阅读,更多相关《进阶音效控制与管理Word文档格式.docx(11页珍藏版)》请在冰豆网上搜索。
![进阶音效控制与管理Word文档格式.docx](https://file1.bdocx.com/fileroot1/2022-11/25/adae54d3-7851-401a-adac-b534dff81f99/adae54d3-7851-401a-adac-b534dff81f991.gif)
SoundEffect>
("
RingOut"
);
//載入名稱為RingOut的音效資源
RingOutEffect=RingOut.CreateInstance();
//建立SoundEffectInstance類別的物件
RingOutEffect.IsLooped=true;
//設定音效要不斷地重覆播放
加载音效资源并建立妥SoundEffectInstance类别的对象之后,我们只要在Game1类别的Update方法中变更SoundEffectInstance类别的对象的Pan属性的内容值,就可以变更音效发声的位置,例如以下的程序:
if(bPaneLeft)//判斷音效發聲的位置是否為往左移動
{
if(RingOutEffect.Pan-0.1<
=-1)//如果已經無法往左移動
{
RingOutEffect.Pan=-1f;
//設定音效從左方發聲
bPaneLeft=true;
//設定移動方向為往右移動
}
else
RingOutEffect.Pan-=0.1f;
//設定發聲位置往左移動0,1
}
else//音效發聲的位置為往右移動
if(RingOutEffect.Pan+0.1>
=1)//如果已經無法往右移動
RingOutEffect.Pan=1f;
//設定音效從右方發聲
bPaneLeft=false;
//設定移動方向為往左移動
RingOutEffect.Pan+=0.1f;
//設定發聲位置往右移動0,1
做好之后请执行程序,游戏程序播放的音效就会从逐渐移至右方发声,移至最右方之后再逐渐移至左方进行发声,移至最左方之后再逐渐移至右方进行发声,周而复始,仿真音效环绕的效果。
以XNA为基础的游戏程序可以使用类似的技巧控制所播放的音效的音调和音量,仿真音量由大变小,由小变大,或是音调由高变低,或是由低变高的效果。
动态音效支持
XNAGameStudio4.0在支持音效控制方面加入了一些新的控制功能,包括支持从PCM格式的音效数据流建立SoundEffect类别的对象,直接从PCM格式的音效数据流进行播放动态音效的功能,以及录制从麦克风输入的声音的功能,详细说明如下:
∙XNAGameStudio4.0支持的SoundEffect类别的建构函式允许接受PCM格式的数据流型态的参数,建立能够从PCM格式的数据流播放音效的SoundEffect类别的对象。
以下就是一个能够利用第一个参数指定PCM格式的音效数据流用来建立SoundEffect类别的对象的建构函式:
publicSoundEffect(
byte[]buffer,
intsampleRate,
AudioChannelschannels
)
以下就是利用TitleContainer类别的OpenStream方法从扩展名为.wav格式的声音文件读入PCM格式的音效数据流,再据以建立SoundEffect类别的对象:
SoundEffectsoundFromFile=SoundEffect.FromStream(TitleContainer.OpenStream(
@"
Content\Sample.wav"
));
//利用WAV格式音效檔案的內容建立SoundEffect類別的物件
soundFromFile.Play();
//播放SoundEffect類別的物件管理的音效資料
使用上述的方式播放音效数据流,以XNA为基础的游戏程序仍然需要将欲播放的WAV格式的声音文件预先加入到ContentPipeline项目,但是必须将WAV格式的声音文件的[BuildAction]属性的内容值从默认的Compile改成Content,再将[CopytoOutputDirectory]属性的内容值改成:
Copyalways,表示不要将WAV格式的声音文件建置成XNB格式的二进制数据,而要随着游戏程序一起部署到WindowsPhone7智能型手机,供游戏程序执行时期加载使用,并直接从WAV格式的声音文件加载欲播放的音效。
[注意]
第一个参数限制必须为PCM格式、频率为8KHz或48KHz、单声道或立体声的音效数据。
∙除了SoundEffect类别能够支持播放格式为音效数据流的音效之外,XNAGameStudio4.0提供的DynamicSoundEffectInstance类别也支持游戏程序于运行时间建立音效数据,供游戏程序执行的时候播放。
DynamicSoundEffectInstance类别常用的属性请参考表1的说明:
表1:
DynamicSoundEffectInstance类别常用的属性
属性名称
说明
IsLooped
控制音效是否要不断地重复播放的属性。
Pan
控制音效发声位置的属性。
PendingBufferCount
查询放置播放音效数据的缓冲区数目。
Pitch
控制音调高低的属性。
State
表示音效播放状态的属性,可能状态为:
playing(播放中)、paused(暂停)、stopped(停止)。
Volume
控制音量大小的属性。
DynamicSoundEffectInstance类别常用的方法请参考表2的说明:
表2:
DynamicSoundEffectInstance类别常用的方法
方法名称
Apply3D
播放3D效果的音效。
GetSampleDuration
依据存放音效数据的缓冲区的数据量计算音效长度。
GetSampleSizeInBytes
依据存放音效数据的缓冲区的时间长度计算数据量。
Pause
暂停播放音效。
Play
执行播放音效的动作。
Resume
恢复播放音效的动作。
Stop
停止播放音效。
SubmitBuffer
指定存放音效数据的缓冲区为欲播放的音效。
表3:
DynamicSoundEffectInstance类别常用的事件
BufferNeeded
当存放音效数据以供播放的缓冲区数目小于或等于2时引发的事件。
欲使用DynamicSoundEffectInstance类别执行动态音效播放,您可以于Game1类别宣告以下的变量:
DynamicSoundEffectInstancedynamicSound;
//管理DynamicSoundEffectInstance類別
//的物件的變數
intposition;
//指定從第幾個位元組的音效資料開始播放
intcount;
//指定欲播放的音效的位元組數
byte[]byteArray;
//存放音效資料的位元組陣列
然后于Game1类别的LoadContent方法加入以下的程序代码,从声音文件读入欲播放的音效数据:
StreamwaveFileStream=TitleContainer.OpenStream(
Content\RingOut.wav"
//依據欲播放的音效檔案建立Stream類別的物件
BinaryReaderreader=
newBinaryReader(waveFileStream);
//為Stream類別的物件建立BinaryReader類別的物件
intchunkID=reader.ReadInt32();
//讀取ChunkID
intfileSize=reader.ReadInt32();
//讀取檔案大小
intriffType=reader.ReadInt32();
//讀取riff型態
intfmtID=reader.ReadInt32();
//讀取fmtID
intfmtSize=reader.ReadInt32();
//讀取fmt大小
intfmtCode=reader.ReadInt16();
//讀取fmtcode
intchannels=reader.ReadInt16();
//讀取channel數目
intsampleRate=reader.ReadInt32();
//讀取SampleRate
intfmtAvgBPS=reader.ReadInt32();
//讀取fmt的平均BPS
intfmtBlockAlign=reader.ReadInt16();
//讀取fmtBlockAlign數據
intbitDepth=reader.ReadInt16();
//讀取位元深度
if(fmtSize==18)//如果fmt大小為18
intfmtExtraSize=reader.ReadInt16();
//讀取fmt額外的大小
reader.ReadBytes(fmtExtraSize);
//讀入等同於fmt額外大小的資料
intdataID=reader.ReadInt32();
//讀取音效資料ID
intdataSize=reader.ReadInt32();
//讀取音效資料大小
byteArray=reader.ReadBytes(dataSize);
//將音效資料大小的音效資料讀入到緩衝區
dynamicSound=newDynamicSoundEffectInstance(sampleRate,(AudioChannels)
channels);
//依據SampleRate和Channel建立DynamicSoundEffectInstance類別的物件
count=dynamicSound.GetSampleSizeInBytes(
TimeSpan.FromMilliseconds(100));
//依據依據存放音效資料時間長度計算資料量
dynamicSound.BufferNeeded+=newEventHandler<
EventArgs>
(
DynamicSound_BufferNeeded);
//指定處理BufferNeeded事件的事件處理程序
dynamicSound.Play();
//播放DynamicSoundEffectInstance類別的物件管理的音效
接下来请为Game1类别加入以下的方法,负责处理DynamicSoundEffectInstance类别的对象的BufferNeeded事件:
voidDynamicSound_BufferNeeded(objectsender,EventArgse)
dynamicSound.SubmitBuffer(byteArray,position,
count);
//從byteArray陣列第position位元組開始,取出count個位
//元組供DynamicSoundEffectInstance類別的物件進行播放
position+=count;
//遞增position變數的內容值
if(position+count>
byteArray.Length)//如果byteArray陣列的內容已全部播放完畢
position=0;
//將position變數的內容值歸零
做好之后请按下Ctrl+F5组合键执行游戏程序,就可以听到DynamicSoundEffectInstance类别的对象播放的动态音效。
∙XNAGameStudio(4.0)提供的Microphone类别可以协助程序利用WindowsPhone7内建的麦克风录制外界输入的声音。
有关Microphone类别常用的属性可以参考表4的说明:
表4:
Microphone类别常用的属性
All
取得所有可用的麦克风。
BufferDuration
存放从麦克风输入的音频数据的时间长度。
Default
取得默认使用的麦克风。
IsHeadset
判断是否为耳机式麦克风。
SampleRate
取得使用麦克风执行录音时的SampleRate。
取得麦克风录音的状态。
Microphone类别常用的方法可以参考表5的说明:
表5:
Microphone类别常用的方法
GetData
从麦克风取得最新录制的声音资料。
查询缓冲区中待播放的音效数据的时间长度。
查询利用麦克风录制指定时间长度的声音需要的字节数。
Start
开始录制声音的动作。
结束录制声音的动作。
Microphone类别常用的事件请参考表6的说明:
表6:
Microphone类别常用的事件
BufferReady
当存放录制声音数据的缓冲区准备好可供播放时引发的事件。
接下来我们就要利用Microphone类别提供的类别,录制透过WindowsPhone7内建的麦克风输入的声音,供程序进行播放。
首先请于Game1类别宣告以下的变量,负责管理DynamicSoundEffectInstance类别的对象:
DynamicSoundEffectInstancesound;
然后于Game1类别的Initialize方法加入以下的程序代码,负责启动录音的动作:
sound=newDynamicSoundEffectInstance(Microphone.Default.SampleRate,
AudioChannels.Mono);
//利用麥克風預設的SampleRate錄製單聲道的聲音
//處理錄製妥透過麥克風輸入的聲音引發的BufferReady事件
Microphone.Default.BufferReady+=(a,b)=>
byte[]data=newbyte[Microphone.Default.GetSampleSizeInBytes(
Microphone.Default.BufferDuration)];
//建立存放聲音資料的位元組陣列
Microphone.Default.GetData(data);
//取得錄製的聲音,並儲存到data位元組陣列中
sound.SubmitBuffer(data);
//將位元組陣列的內容交給DynamicSoundEffectInstance類
//別的物件進行播放
};
Microphone.Default.Start();
//啟動麥克風執行錄製聲音的工作
最后我们只要在Game1类别的Update方法中加入以下的程序代码,在录制5秒钟的声音之后停止录制的动作,并将录制妥的声音交由DynamicSoundEffectInstance类别的对象进行播放:
if(gameTime.TotalGameTime.TotalSeconds>
5)//如果錄製的時間是否超過5秒
Microphone.Default.Stop();
//關閉麥克風錄音的功能
sound.Play();
//將錄製妥的聲音交由DynamicSoundEffectInstance類別的物件進行播放
做好之后请执行程序,然后对麦克风讲话,5秒钟之后,程序就会播放刚刚录制的声音。
范例下载:
AdvSoundEffect.zip
认识XACT(Cross-platformAudioCreationTool)声音组识与管理工具
XNAGameStudio除了提供类别库供游戏程序制作所需要的功能以外,也提供了一系列辅助游戏开发的工具,包括:
MicrosoftCross-PlatformAudioCreationTool3(XACT3)、XACTAuditioningUtility、和XNAFrameworkRemotePerformanceMonitor,其中的MicrosoftCross-PlatformAudioCreationTool3是一个支持声音组识与管理的工具,可以将游戏程序需要使用的音效事先组织妥当,并设定好必要的属性,降低游戏程序制作因管理音效的播放衍生的复杂性。
WindowsPhone7平台目前尚未支持使用MicrosoftCross-PlatformAudioCreationTool3工具建立的声音文件,所以使用MicrosoftCross-PlatformAudioCreationTool3工具建立的声音文件只能供在Windows平台和Xbox360游戏平台上执行的游戏程序使用。
要使用MicrosoftCross-PlatformAudioCreationTool3工具组识和管理游戏程序执行时期欲播放的音效,请执行[所有程序|MicrosoftGameStudio4.0|Tools|MicrosoftCross-PlatformAudioCreationTool3(XACT3)]功能,启动XACT3工具,然后执行[File|NewProject]功能建立新项目。
项目建立成功之后请使用鼠标的右键点中名称为[WaveBanks]的项目,从出现的菜单选择[NewWaveBank]功能,执行建立WaveBank的工作,然后从档案总管将欲管理的.WAV格式的声音档案拖曳至新建立的WaveBank中。
做好之后请使用鼠标的右键点中名称为[SoundBanks