U3d中的音频研究
2015-06-06 16:20
155 查看
本文转自:/article/9397737.html
今天要讲的是捕捉音谱。就是把某段音乐转换成可测量的数字,这种技术多见于音乐类游戏的背景当中,随着音乐背景中的物体或变大缩小,或改变颜色。或者更直观点说,就是你用的某播放器中随音乐上下颤动的那种方式。
好吧,废话有点多,直接写代码。我们使用到的核心就是AudioSource.GetSpectrumData(int,int,FFTWindow)。
其中的三个参数分别表示(a,b,c):
a:采样率,就是说采集多长一段的频谱,必须为2^n,但是最小64,最大8192。
b:采集时间,0为左端,1为右端。(这个需要声音物理方面的知识,如果没有特殊需求的话,请默认为0)。
c:采样方式。
其中采样方式的具体参数有:
Variables
根据不同的采样方式会有不同的采样精度。
那么下面进入实例,让我们通过例子来了解这个函数。
首先新建Unity项目,之后再main camera中加入audio sourse组件,并给组件赋予一段音乐。运行一下,你应该可以听到这段音乐。
由于这些都属于基础,不是我主讲的内容,所有有什么不会的请自行查找相关基础教程或给我留言。
之后编写脚本,脚本内容如下,详细请看注释。
注释:
[csharp] view
plaincopy
using UnityEngine;
using System.Collections;
public class audioTest : MonoBehaviour {
public GameObject obj;//我们需要动态控制的物体,需要在u3d中把你需要控制的物体赋予该物体
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
//建立音谱数组,后面的三个参数我前面已经介绍过,这里是具体用法
float[] spectrum = audio.GetSpectrumData(128, 0, FFTWindow.BlackmanHarris);
int i = 1;
//我们控制物体所用到的数值
float all = 0;
//以下内容是在scence中现实音谱内容
while (i < 127)
{
Debug.DrawLine(new Vector3(i - 1, spectrum[i] + 10, 0), new Vector3(i, spectrum[i + 1] + 10, 0), Color.red);
Debug.DrawLine(new Vector3(i - 1, Mathf.Log(spectrum[i - 1]) + 10, 2), new Vector3(i, Mathf.Log(spectrum[i]) + 10, 2), Color.cyan);
Debug.DrawLine(new Vector3(Mathf.Log(i - 1), spectrum[i - 1] - 10, 1), new Vector3(Mathf.Log(i), spectrum[i] - 10, 1), Color.green);
Debug.DrawLine(new Vector3(Mathf.Log(i - 1), Mathf.Log(spectrum[i - 1]), 3), new Vector3(Mathf.Log(i), Mathf.Log(spectrum[i]), 3), Color.yellow);
all = all + spectrum[i];
i++;
}
//经过本人测试all值最多为1点几,所以为了表示明显,我*10,但由于会有0影响效果,所以+1
print(all*10);
all = all * 10 + 1;
//利用iTween插件变换图形,关于iTween我稍后做讲述
iTween.ScaleTo(obj, new Vector3(all,all,all), 0f);
iTween.ColorTo(obj, new Color(all, -all, 256 - all), 0f);
}
}
之后我们新建一个球,使摄像机可以看到小球,我们把脚本拖到摄像机上,并在脚本中的obj与小球进行关联。
运行文件,我们就会看到小球会随着音乐变大变小以及改变颜色。
![](http://img.blog.csdn.net/20130815162719343?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvTW9vbkFnZW50/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
在这段代码中我们用到了iTween插件,iTween是一款相当好用的补间动画插件,这个是网址
http://itween.pixelplacement.com/index.php
该插件免费使用,以后我会写相关的iTween教程,敬请期待。
今天要讲的是捕捉音谱。就是把某段音乐转换成可测量的数字,这种技术多见于音乐类游戏的背景当中,随着音乐背景中的物体或变大缩小,或改变颜色。或者更直观点说,就是你用的某播放器中随音乐上下颤动的那种方式。
好吧,废话有点多,直接写代码。我们使用到的核心就是AudioSource.GetSpectrumData(int,int,FFTWindow)。
其中的三个参数分别表示(a,b,c):
a:采样率,就是说采集多长一段的频谱,必须为2^n,但是最小64,最大8192。
b:采集时间,0为左端,1为右端。(这个需要声音物理方面的知识,如果没有特殊需求的话,请默认为0)。
c:采样方式。
其中采样方式的具体参数有:
Variables
Rectangular | W = 1.0. |
Triangle | W = TRI(2n/N). |
Hamming | W = 0.54 - (0.46 * COS(n/N) ). |
Hanning | W = 0.5 * (1.0 - COS(n/N) ). |
Blackman | W = 0.42 - (0.5 * COS(n/N) ) + (0.08 * COS(2.0 * n/N) ). |
BlackmanHarris | W = 0.35875 - (0.48829 * COS(1.0 * n/N)) + (0.14128 * COS(2.0 * n/N)) - (0.01168 * COS(3.0 * n/N)). |
那么下面进入实例,让我们通过例子来了解这个函数。
首先新建Unity项目,之后再main camera中加入audio sourse组件,并给组件赋予一段音乐。运行一下,你应该可以听到这段音乐。
由于这些都属于基础,不是我主讲的内容,所有有什么不会的请自行查找相关基础教程或给我留言。
之后编写脚本,脚本内容如下,详细请看注释。
注释:
[csharp] view
plaincopy
using UnityEngine;
using System.Collections;
public class audioTest : MonoBehaviour {
public GameObject obj;//我们需要动态控制的物体,需要在u3d中把你需要控制的物体赋予该物体
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
//建立音谱数组,后面的三个参数我前面已经介绍过,这里是具体用法
float[] spectrum = audio.GetSpectrumData(128, 0, FFTWindow.BlackmanHarris);
int i = 1;
//我们控制物体所用到的数值
float all = 0;
//以下内容是在scence中现实音谱内容
while (i < 127)
{
Debug.DrawLine(new Vector3(i - 1, spectrum[i] + 10, 0), new Vector3(i, spectrum[i + 1] + 10, 0), Color.red);
Debug.DrawLine(new Vector3(i - 1, Mathf.Log(spectrum[i - 1]) + 10, 2), new Vector3(i, Mathf.Log(spectrum[i]) + 10, 2), Color.cyan);
Debug.DrawLine(new Vector3(Mathf.Log(i - 1), spectrum[i - 1] - 10, 1), new Vector3(Mathf.Log(i), spectrum[i] - 10, 1), Color.green);
Debug.DrawLine(new Vector3(Mathf.Log(i - 1), Mathf.Log(spectrum[i - 1]), 3), new Vector3(Mathf.Log(i), Mathf.Log(spectrum[i]), 3), Color.yellow);
all = all + spectrum[i];
i++;
}
//经过本人测试all值最多为1点几,所以为了表示明显,我*10,但由于会有0影响效果,所以+1
print(all*10);
all = all * 10 + 1;
//利用iTween插件变换图形,关于iTween我稍后做讲述
iTween.ScaleTo(obj, new Vector3(all,all,all), 0f);
iTween.ColorTo(obj, new Color(all, -all, 256 - all), 0f);
}
}
之后我们新建一个球,使摄像机可以看到小球,我们把脚本拖到摄像机上,并在脚本中的obj与小球进行关联。
运行文件,我们就会看到小球会随着音乐变大变小以及改变颜色。
在这段代码中我们用到了iTween插件,iTween是一款相当好用的补间动画插件,这个是网址
http://itween.pixelplacement.com/index.php
该插件免费使用,以后我会写相关的iTween教程,敬请期待。
相关文章推荐
- iptables 笔记
- Flash制作雾效果
- 重点block
- 轮廓提取--findContours()和drawContours()
- silverlight RIA Service增删改查问题
- 蛋疼的cross compile
- 彻底搞懂字符编码(unicode,mbcs,utf-8,utf-16,utf-32,big endian,little endian...)
- 虚幻4随笔 三 从UE3到UE4
- HDU 4738 — Caocao's Bridges 判桥
- C# 控制台程序 托盘图标 事件响应
- Nhibernate 映射 FluentApi Mapping by Code
- JavaScript的原型问题
- UIGestureRecognizerDelegate两三事 & UIScrollView滑动 子View上UIPanGestureRecognizer手势冲突
- 在VC下执行DOS命令
- php入门例子代码
- 按照文字内容动态设置TableViewCell的高度
- 二分查找
- FireFox[32bit/64bit]每日更新版
- leetcode--Pow(x, n)
- all of these is operation