XNA音乐解析~
? 這是一個能夠實時解析mp3,wav等音樂節奏,并畫出音樂節奏的XNA小程序。
??? 不知道各位有沒有接觸過一個叫《危險節奏》的小游戲? 沒有的話,可以先來這里看看http://my.tv.sohu.com/u/vw/16758398,這是一個會跟隨音樂節奏變化而且增/減火爆程度(子彈,敵人數量和效果)的游戲,玩過這個后突然對音樂的解析有了興趣,于是有了這個小程序。
?
??? 由于XNA本身并不能解析最常用的mp3格式文件,所以我使用了fmod這個游戲音頻引擎,這是一個支持多平臺的音頻引擎(非商業用途可以免費使用),原版是用C++寫,網上有人封裝成了C#版叫FMODNet。
?
要使用fmod,首選先得把fmodex.dll文件復制的到C:\Windows\System32目錄下,如果你的系統是64位的話就復制到C:\Windows\SysWOW64目錄下。然后在XNA程序中加入FMODNet.dll的引用,并加入以下代碼:
創建:
//創建fmod設備對象 SoundDevice device = new SoundDevice();?初始化:
//初始化 device.Initialize(); //指定音樂文件所在的目錄 string contentPath = game.Content.RootDirectory; //用一個音樂文件,創建一個Sound對象 FMODNet.Sound fmodSound = device.CreateSound(contentPath + @"\Music\科學的超電磁炮level5.mp3"); bgms.Add(fmodSound);//播放音樂 fmodSound.Play();?
? 這樣就能播放音樂文件了,接下來是最關鍵的,就是獲取播放中的音樂當前的頻譜,即獲取節奏數據,使用的是fmodex的 GetSpectrum()方法,由于原版的FMODNet.dll中并不包含 GetSpectrum()方法,不過幸好FMODNet的作者提供了FMODNet的源代碼,我把GetSpectrum()加了進去。
?
之后加入以下代碼,并在Update()中調用就能獲取當前節奏數據了
/// <summary> /// 獲取當前播放的BGM的頻譜 /// </summary> public float[] GetBGMSpectrum() {float[] spectrumarray = new float[512];//只有512才有效!spectrumarray = bgms[CurrectBgmIndex].Channel.GetSpectrum(512, 0);return spectrumarray; }注意 :GetSpectrum(512, 0)的兩個參數,不能改動,否則無法獲取數據……。
?
bgms列表中裝的就是 FMODNet.Sound對象,可以看出獲取到的數據是,512個浮點型數據,每個的值范圍在0~0.3f之間。然后這些值每幀隨音樂節奏變化,知道這些后,我們就可以畫出節奏了~
?
下面是我程序,控制:J是加載音樂,F3/F4切換繪制效果,F11顯示說明文字。
? ? ? 關于fmod播放與加載音樂的方法,封裝在了Sounds.cs中,并在BaseSpectrum.cs中提供了獲取節奏信息和基本繪制的方法,其繪制效果如下
然后在SpectrumManager.cs中提供了更華麗的節奏繪制,如下圖,節奏激情的時候還有全屏模糊效果~
?
最后是程序源項目的下載:(上面提到的fmodex.dll,FMODNet.dll也包含了,在Dll文件夾中)
http://115.com/file/ang9aidu#
MusicGame.rar
轉載于:https://www.cnblogs.com/dshGame/archive/2012/04/15/2450162.html
總結
- 上一篇: 高手整理培训笔记(服务篇)
- 下一篇: oracle 10g em 乱码问题解决