1、SoundEffect(RingOut); /載入名稱為 RingOut 的音效資源RingOutEffect = RingOut.CreateInstance(); /建立 SoundEffectInstance 類別的物件RingOutEffect.IsLooped = true; /設定音效要不斷地重覆播放加载音效资源并建立妥 SoundEffectInstance 类别的对象之后,我们只要在 Game1 类别的 Update 方法中变更 SoundEffectInstance 类别的对象的 Pan 属性的内容值,就可以变更音效发声的位置,例如以下的程序:if (bPaneLeft) /
2、判斷音效發聲的位置是否為往左移動 if (RingOutEffect.Pan - 0.1 = 1) /如果已經無法往右移動 RingOutEffect.Pan = 1f; /設定音效從右方發聲 bPaneLeft = false; /設定移動方向為往左移動 RingOutEffect.Pan += 0.1f; /設定發聲位置往右移動 0,1做好之后请执行程序,游戏程序播放的音效就会从逐渐移至右方发声,移至最右方之后再逐渐移至左方进行发声,移至最左方之后再逐渐移至右方进行发声,周而复始,仿真音效环绕的效果。以 XNA 为基础的游戏程序可以使用类似的技巧控制所播放的音效的音调和音量,仿真音量由大变
3、小,由小变大,或是音调由高变低,或是由低变高的效果。动态音效支持XNA Game Studio 4.0 在支持音效控制方面加入了一些新的控制功能,包括支持从 PCM 格式的音效数据流建立 SoundEffect 类别的对象,直接从 PCM 格式的音效数据流进行播放动态音效的功能,以及录制从麦克风输入的声音的功能,详细说明如下: XNA Game Studio 4.0 支持的 SoundEffect 类别的建构函式允许接受 PCM 格式的数据流型态的参数,建立能够从 PCM 格式的数据流播放音效的 SoundEffect 类别的对象。以下就是一个能够利用第一个参数指定 PCM 格式的音效数据流用
4、来建立 SoundEffect 类别的对象的建构函式:public SoundEffect ( byte buffer, int sampleRate, AudioChannels channels)以下就是利用 TitleContainer 类别的 OpenStream 方法从扩展名为 .wav 格式的声音文件读入 PCM 格式的音效数据流,再据以建立 SoundEffect 类别的对象:SoundEffect soundFromFile = SoundEffect.FromStream(TitleContainer.OpenStream(ContentSample.wav); /利用 WA
5、V 格式音效檔案的內容建立 SoundEffect 類別的物件soundFromFile.Play(); /播放 SoundEffect 類別的物件管理的音效資料使用上述的方式播放音效数据流,以 XNA 为基础的游戏程序仍然需要将欲播放的 WAV 格式的声音文件预先加入到 Content Pipeline 项目,但是必须将 WAV 格式的声音文件的 Build Action 属性的内容值从默认的 Compile 改成 Content,再将 Copy to Output Directory 属性的内容值改成:Copy always,表示不要将 WAV 格式的声音文件建置成 XNB 格式的二进制数
6、据,而要随着游戏程序一起部署到 Windows Phone 7 智能型手机,供游戏程序执行时期加载使用,并直接从 WAV 格式的声音文件加载欲播放的音效。注意第一个参数限制必须为 PCM 格式、频率为 8KHz 或 48KHz、单声道或立体声的音效数据。 除了 SoundEffect 类别能够支持播放格式为音效数据流的音效之外,XNA Game Studio 4.0 提供的 DynamicSoundEffectInstance 类别也支持游戏程序于运行时间建立音效数据,供游戏程序执行的时候播放。DynamicSoundEffectInstance 类别常用的属性请参考表1 的说明:表1:Dyn
7、amicSoundEffectInstance 类别常用的属性属性名称说明IsLooped控制音效是否要不断地重复播放的属性。Pan控制音效发声位置的属性。PendingBufferCount查询放置播放音效数据的缓冲区数目。Pitch控制音调高低的属性。State表示音效播放状态的属性,可能状态为:playing (播放中)、paused (暂停)、stopped (停止)。Volume控制音量大小的属性。DynamicSoundEffectInstance 类别常用的方法请参考表2 的说明:表2:DynamicSoundEffectInstance 类别常用的方法方法名称Apply3D播放
8、 3D 效果的音效。GetSampleDuration依据存放音效数据的缓冲区的数据量计算音效长度。GetSampleSizeInBytes依据存放音效数据的缓冲区的时间长度计算数据量。Pause暂停播放音效。Play执行播放音效的动作。Resume恢复播放音效的动作。Stop停止播放音效。SubmitBuffer指定存放音效数据的缓冲区为欲播放的音效。表3:DynamicSoundEffectInstance 类别常用的事件BufferNeeded当存放音效数据以供播放的缓冲区数目小于或等于 2 时引发的事件。欲使用 DynamicSoundEffectInstance 类别执行动态音效播放
9、,您可以于 Game1 类别宣告以下的变量:DynamicSoundEffectInstance dynamicSound; /管理 DynamicSoundEffectInstance 類別/的物件的變數int position; /指定從第幾個位元組的音效資料開始播放int count; /指定欲播放的音效的位元組數byte byteArray; /存放音效資料的位元組陣列然后于 Game1 类别的 LoadContent 方法加入以下的程序代码,从声音文件读入欲播放的音效数据:Stream waveFileStream = TitleContainer.OpenStream(Conten
10、tRingOut.wav /依據欲播放的音效檔案建立 Stream 類別的物件BinaryReader reader = new BinaryReader(waveFileStream);/為 Stream 類別的物件建立 BinaryReader 類別的物件int chunkID = reader.ReadInt32(); /讀取 Chunk IDint fileSize = reader.ReadInt32(); /讀取檔案大小int riffType = reader.ReadInt32(); /讀取 riff 型態int fmtID = reader.ReadInt32(); /讀取
11、fmt IDint fmtSize = reader.ReadInt32(); /讀取 fmt 大小int fmtCode = reader.ReadInt16(); /讀取 fmt codeint channels = reader.ReadInt16(); /讀取 channel 數目int sampleRate = reader.ReadInt32(); /讀取 Sample Rateint fmtAvgBPS = reader.ReadInt32(); /讀取 fmt 的平均 BPSint fmtBlockAlign = reader.ReadInt16(); /讀取 fmt Bloc
12、k Align 數據int bitDepth = reader.ReadInt16(); /讀取位元深度if (fmtSize = 18) /如果 fmt 大小為18 int fmtExtraSize = reader.ReadInt16(); /讀取 fmt 額外的大小 reader.ReadBytes(fmtExtraSize); /讀入等同於 fmt 額外大小的資料int dataID = reader.ReadInt32(); /讀取音效資料 IDint dataSize = reader.ReadInt32(); /讀取音效資料大小byteArray = reader.ReadByt
13、es(dataSize); /將音效資料大小的音效資料讀入到緩衝區dynamicSound = new DynamicSoundEffectInstance(sampleRate, (AudioChannels)channels); /依據 Sample Rate 和 Channel 建立 DynamicSoundEffectInstance 類別的物件count = dynamicSound.GetSampleSizeInBytes(TimeSpan.FromMilliseconds(100); /依據依據存放音效資料時間長度計算資料量dynamicSound.BufferNeeded +=
14、 new EventHandler(DynamicSound_BufferNeeded); /指定處理 BufferNeeded 事件的事件處理程序dynamicSound.Play(); /播放 DynamicSoundEffectInstance 類別的物件管理的音效接下来请为 Game1 类别加入以下的方法,负责处理 DynamicSoundEffectInstance 类别的对象的 BufferNeeded 事件:void DynamicSound_BufferNeeded(object sender, EventArgs e) dynamicSound.SubmitBuffer(by
15、teArray, position, count); /從 byteArray 陣列第 position 位元組開始,取出 count 個位/元組供 DynamicSoundEffectInstance 類別的物件進行播放 position += count; /遞增 position 變數的內容值 if (position + count byteArray.Length) /如果 byteArray 陣列的內容已全部播放完畢 position = 0; /將 position 變數的內容值歸零做好之后请按下 Ctrl+F5 组合键执行游戏程序,就可以听到 DynamicSoundEffec
16、tInstance 类别的对象播放的动态音效。 XNA Game Studio (4.0) 提供的 Microphone 类别可以协助程序利用 Windows Phone 7 内建的麦克风录制外界输入的声音。有关 Microphone 类别常用的属性可以参考表4 的说明:表4:Microphone 类别常用的属性All取得所有可用的麦克风。BufferDuration存放从麦克风输入的音频数据的时间长度。Default取得默认使用的麦克风。IsHeadset判断是否为耳机式麦克风。SampleRate取得使用麦克风执行录音时的 Sample Rate。取得麦克风录音的状态。Microphone
17、 类别常用的方法可以参考表5 的说明:表5:Microphone 类别常用的方法GetData从麦克风取得最新录制的声音资料。查询缓冲区中待播放的音效数据的时间长度。查询利用麦克风录制指定时间长度的声音需要的字节数。Start开始录制声音的动作。结束录制声音的动作。Microphone 类别常用的事件请参考表6的说明:表6:Microphone 类别常用的事件BufferReady当存放录制声音数据的缓冲区准备好可供播放时引发的事件。接下来我们就要利用 Microphone 类别提供的类别,录制透过 Windows Phone 7 内建的麦克风输入的声音,供程序进行播放。首先请于 Game1
18、类别宣告以下的变量,负责管理 DynamicSoundEffectInstance 类别的对象:DynamicSoundEffectInstance sound;然后于 Game1 类别的 Initialize 方法加入以下的程序代码,负责启动录音的动作:sound = new DynamicSoundEffectInstance(Microphone.Default.SampleRate, AudioChannels.Mono); /利用麥克風預設的 Sample Rate 錄製單聲道的聲音/處理錄製妥透過麥克風輸入的聲音引發的 BufferReady 事件Microphone.Defaul
19、t.BufferReady += (a, b) = byte data = new byteMicrophone.Default.GetSampleSizeInBytes(Microphone.Default.BufferDuration); /建立存放聲音資料的位元組陣列 Microphone.Default.GetData(data); /取得錄製的聲音,並儲存到 data 位元組陣列中 sound.SubmitBuffer(data); /將位元組陣列的內容交給 DynamicSoundEffectInstance 類/別的物件進行播放;Microphone.Default.Start(
20、); /啟動麥克風執行錄製聲音的工作最后我们只要在 Game1 类别的 Update 方法中加入以下的程序代码,在录制5秒钟的声音之后停止录制的动作,并将录制妥的声音交由 DynamicSoundEffectInstance 类别的对象进行播放:if (gameTime.TotalGameTime.TotalSeconds 5) /如果錄製的時間是否超過 5 秒 Microphone.Default.Stop(); /關閉麥克風錄音的功能 sound.Play(); /將錄製妥的聲音交由 DynamicSoundEffectInstance 類別的物件進行播放做好之后请执行程序,然后对麦克风讲
21、话,5 秒钟之后,程序就会播放刚刚录制的声音。范例下载:AdvSoundEffect.zip认识 XACT (Cross-platform Audio Creation Tool) 声音组识与管理工具XNA Game Studio 除了提供类别库供游戏程序制作所需要的功能以外,也提供了一系列辅助游戏开发的工具,包括:Microsoft Cross-Platform Audio Creation Tool 3 (XACT3)、XACT Auditioning Utility、和 XNA Framework Remote Performance Monitor,其中的 Microsoft Cros
22、s-Platform Audio Creation Tool 3 是一个支持声音组识与管理的工具,可以将游戏程序需要使用的音效事先组织妥当,并设定好必要的属性,降低游戏程序制作因管理音效的播放衍生的复杂性。Windows Phone 7 平台目前尚未支持使用 Microsoft Cross-Platform Audio Creation Tool 3 工具建立的声音文件,所以使用 Microsoft Cross-Platform Audio Creation Tool 3 工具建立的声音文件只能供在 Windows 平台和 Xbox 360 游戏平台上执行的游戏程序使用。要使用 Microso
23、ft Cross-Platform Audio Creation Tool 3 工具组识和管理游戏程序执行时期欲播放的音效,请执行 所有程序 | Microsoft Game Studio 4.0 | Tools | Microsoft Cross-Platform Audio Creation Tool 3 (XACT3) 功能,启动 XACT3 工具,然后执行 File | New Project 功能建立新项目。项目建立成功之后请使用鼠标的右键点中名称为 Wave Banks 的项目,从出现的菜单选择 New Wave Bank 功能,执行建立 Wave Bank 的工作,然后从档案总管将欲管理的 .WAV 格式的声音档案拖曳至新建立的 Wave Bank 中。做好之后请使用鼠标的右键点中名称为 Sound Banks
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1