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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值