unity3d音乐可视化 - CSDN
  • Unity 中的音乐可视化

    2017-06-02 19:39:38
    Unity 中的音乐可视化 本帖最后由 204有个大坑 于 2017-5-31 17:33 编辑 1738music-visulization-in-unity.jpg (32.33 KB, 下载次数: 0)下载附件 保存到相册2017-5-24 16:10 上传 目标:本文的主要目标是让你...

    Unity 中的音乐可视化

    本帖最后由 204有个大坑 于 2017-5-31 17:33 编辑

    161017bxv7hjadd02aaaxw.jpg.thumb.jpg

    1738music-visulization-in-unity.jpg (32.33 KB, 下载次数: 0)

    下载附件  保存到相册

    2017-5-24 16:10 上传




    目标:本文的主要目标是让你知道在Unity中怎么样使用音乐可视化。
    最终输出是这样的:
    151807z6bssxvfb3zbxb3x.gif

    capture-1.gif (256.99 KB, 下载次数: 1)

    下载附件  保存到相册

    7 天前 上传



    下边这张图片会给你一个最终输出的印象。

    161017fnbzpounu8rpzarl.png.thumb.jpg

    music-edit-300x188.png (14.5 KB, 下载次数: 0)

    下载附件  保存到相册

    2017-5-24 16:10 上传




    步骤一:创建一个2D工程,命名为“Music Visualization”
    步骤二:白条(就是白色的条形图片啦!)
    制作一个白条,也可以从末尾给出的工程源码中找到。

    161017x5w1wolyj15x15yw.png.thumb.jpg

    bar-300x136.png (1.29 KB, 下载次数: 0)

    下载附件  保存到相册

    2017-5-24 16:10 上传



    步骤三:制作预设,将白天做成预设,还有谁不懂怎做预设?百度或者你敢戳这里?
    步骤四:
    现在,将预设拖拽到场景中,需要64个预设。像这样摆好:
    注意:
    你可以根据逻辑使用不同数量的对象
    在本例中,我使用的是44个对象的数组,大小=64(44<64)

    161018lwgzmdcmxxjgj63j.png.thumb.jpg

    sound-edit-300x268.png (2.44 KB, 下载次数: 0)

    下载附件  保存到相册

    2017-5-24 16:10 上传



    步骤五:新建脚本,新建C#脚本,命名为BarVisualization.cs。
    [C#] 纯文本查看 复制代码
     
    001
    002
    003
    004
    005
    006
    007
    008
    009
    010
    011
    012
    013
    014
    015
    016
    017
    018
    019
    020
    021
    022
    023
    024
    025
    026
    027
    028
    029
    030
    031
    032
    033
    034
    035
    036
    037
    038
    039
    040
    041
    042
    043
    044
    045
    046
    047
    048
    049
    050
    051
    052
    053
    054
    055
    056
    057
    058
    059
    060
    061
    062
    063
    064
    065
    066
    067
    068
    069
    070
    071
    072
    073
    074
    075
    076
    077
    078
    079
    080
    081
    082
    083
    084
    085
    086
    087
    088
    089
    090
    091
    092
    093
    094
    095
    096
    097
    098
    099
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    using UnityEngine;
    using System.Collections;
    using UnityEngine.UI;
     
    [RequireComponent(typeof(AudioSource))]
    public class BarVisulization : MonoBehaviour
    {
            public AudioClip[] clips;
            public SpriteRenderer[] barsSprites;
            public Slider musicSlider;
            [Range(0,10)]
            public float
                    colorMultiplyer = 1;
            [Range(0,1)]   
            public float
                    s = 1;
            [Range(0,1)]
            public float
                    v = 1;
            private int index = 0;
            private float musicLength;
     
            private AudioSource audio;
     
            void Start(){
     
                    audio = GetComponent<AudioSource> ();
            }
         
            void Update ()
            {
                    Visulization ();
                    if (Input.GetMouseButtonDown (0)) {
                            ChangeSound ();
                    }
            MusicSlider();
            }
     
            void Visulization ()
            {
                    float[] musicData = audio.GetSpectrumData (64, 0, FFTWindow.Triangle);
                    int i = 0;
                    while (i<44) {
                            barsSprites [i].transform.localScale = new Vector3 (musicData [i], 0.2f, 1);
                            barsSprites [i].color = HSVtoRGB (musicData [i] * colorMultiplyer, s, v, 1);
                         
                            i++;
                    }
                     
            }
     
            void MusicSlider ()
            {
                    musicLength = audio.time;
                    Debug.Log(musicLength);
            musicSlider.value = musicLength/audio.clip.length;
     
            }
     
            void ChangeSound ()
            {
                    index++;
                    if (index > clips.Length - 1) {
                            index = 0;
                    }
                    print (index);
                    audio.clip = clips [index];
                     
                    audio.Play ();
            }
     
     
        #region Static
            public static Color HSVtoRGB (float hue, float saturation, float value, float alpha)
            {
                    while (hue > 1f) {
                            hue -= 1f;
                    }
                    while (hue < 0f) {
                            hue += 1f;
                    }
                    while (saturation > 1f) {
                            saturation -= 1f;
                    }
                    while (saturation < 0f) {
                            saturation += 1f;
                    }
                    while (value > 1f) {
                            value -= 1f;
                    }
                    while (value < 0f) {
                            value += 1f;
                    }
                    if (hue > 0.999f) {
                            hue = 0.999f;
                    }
                    if (hue < 0.001f) {
                            hue = 0.001f;
                    }
                    if (saturation > 0.999f) {
                            saturation = 0.999f;
                    }
                    if (saturation < 0.001f) {
                            return new Color (value * 255f, value * 255f, value * 255f);
     
                    }
                    if (value > 0.999f) {
                            value = 0.999f;
                    }
                    if (value < 0.001f) {
                            value = 0.001f;
                    }
             
                    float h6 = hue * 6f;
                    if (h6 == 6f) {
                            h6 = 0f;
                    }
                    int ihue = (int)(h6);
                    float p = value * (1f - saturation);
                    float q = value * (1f - (saturation * (h6 - (float)ihue)));
                    float t = value * (1f - (saturation * (1f - (h6 - (float)ihue))));
                    switch (ihue) {
                    case 0:
                            return new Color (value, t, p, alpha);
                    case 1:
                            return new Color (q, value, p, alpha);
                    case 2:
                            return new Color (p, value, t, alpha);
                    case 3:
                            return new Color (p, q, value, alpha);
                    case 4:
                            return new Color (t, p, value, alpha);
                    default:
                            return new Color (value, p, q, alpha);
                    }
            }
        #endregion
    }

    注意:这个函数返回的是声音剪辑的频谱数组。更多信息戳这里。我用的是HSVtoRGB()函数将HSV转换成RGB .HSV比较容易理解,不信你戳这里。

    161018hye4dm49iy449l5r.png.thumb.jpg

    untitled-300x154.png (12.33 KB, 下载次数: 0)

    下载附件  保存到相册

    2017-5-24 16:10 上传



    步骤六:应用脚本
    将脚本拖到空物体上,选中所有44个GameObject,将它们拖拽赋值到barsSprites (我也是醉了)

    161017ddgvf4fqqzgeu4vd.png.thumb.jpg

    main-camera-left-right-300x194.png (4.01 KB, 下载次数: 0)

    下载附件  保存到相册

    2017-5-24 16:10 上传



    步骤七:将相机的背景整成黑色滴。

    161017ziwwmtifrn49lm7e.png.thumb.jpg

    game-300x202.png (6.98 KB, 下载次数: 0)

    下载附件  保存到相册

    2017-5-24 16:10 上传



    步骤八:声音剪辑

    需要一些声音剪辑的样例。导入到工程里面,再拖拽赋值到数组Clips.(快扶我一下)
    161017y6qql34yq29y53vg.png.thumb.jpg

    bar-visulaization-300x142.png (9.18 KB, 下载次数: 0)

    下载附件  保存到相册

    2017-5-24 16:10 上传



    步骤九:测试
    现在,一切就绪。点击播放按钮,让色彩随着你的音乐动起来吧。当你在Unity中用到声音可视化时,希望这篇可以给你些帮助。有任何问题可在底下评论,我会尽快回复。

    广告时间:
    想获取游戏开发的idea?还等什么?现在就联系我们,让idea瞬间活起来。我司在印度被称为最好的 游戏开发公司,有之一。

    原文作者:Amit Kapdi
    原文连接:http://www.theappguruz.com/blog/music-visualization-in-unity
    扫描下方二维码关注游戏蛮牛官方微信~每日都有精选干货与你分享哟~
    展开全文
  • using UnityEngine; using System.Collections; public class audioTest : MonoBehaviour { public float deep; public AudioSource audio1; public GameObject a;  public Material Myobj;
    using UnityEngine;  
    using System.Collections;  


    public class audioTest : MonoBehaviour {  


    public float deep;
    public AudioSource audio1;
    public GameObject a;
        public Material Myobj;
    // Use this for initialization  
    void Start () {  
    }  
    // Update is called once per frame  
    void Update () {  
    //建立音谱数组,后面的三个参数我前面已经介绍过,这里是具体用法  


    float[] spectrum = audio1.GetSpectrumData(256, 0, FFTWindow.Hamming);  
    int i = 1;  
    //我们控制物体所用到的数值  
    float heght = 0;  
    //以下内容是在scence中现实音谱内容  
    while (i < 255)  
    {  
    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);  
    heght = heght + spectrum[i];  
    i++;  
    }  
    //经过本人测试heght值最多为1点几,所以为了表示明显,我*10,但由于会有0影响效果,所以+1  
     
    heght = heght * 10 + 1;  
    //利用iTween插件变换图形,关于iTween我稍后做讲述  
    //iTween.ScaleTo(a, new Vector3(0.4f,heght*10-deep,0.2f), 0f);  


    this.gameObject.transform.localScale = new Vector3 (0.1f, heght-deep, 0.1f);
            
           
            






            print(heght); 
            if ((heght*10)>15f){
                
               
                iTween.ColorTo(a, new Color(0, -heght, 256 - heght), 0f); 


    }


    else if((heght*10)<13f) 
    iTween.ColorTo(a, new Color(127, 255-deep, 0), 0f); 




    }  
    }
    展开全文
  • 实时获取设备的麦克风接收的音频,并将音频可视化成音波的形式。 后面大家需要的话可以可以将音频转成类卡拉OK的文件分享出来。
  • [视频连接] ... 先理解几个名词和概念: ...声音:一种波动,通过空气分子有节奏的震动进行传递。...声音频率Hz:声音每秒种震动的次数,以赫兹Hz 表示。...分贝dB:量度两个相同单位之数量比例的单位,可表示声音的强度...

    这里写图片描述

    [视频连接]

    (http://v.youku.com/v_show/id_XMTU0NTk4NjgwOA==.html?from=y1.7-1.2)

    先理解几个名词和概念:

    声音:一种波动,通过空气分子有节奏的震动进行传递。 
    声音频率Hz:声音每秒种震动的次数,以赫兹Hz 表示。频率越高,音高越高。 
    分贝dB:量度两个相同单位之数量比例的单位,可表示声音的强度单位。 
    人耳可听到的声波频率:每秒振动20次到20000次的范围内,既20赫兹至20000赫兹之间,。

    采样Sampling:在信号处理程序中,将连续信号(例如声波)降低成离散信号(一系列样本数据)。 
    采样率Sampling Rate:每秒从连续信号中提取并组成离散信号的采样个数,单位也是赫兹。 
    快速傅里叶变换FFT:一种算法,可用来转换信号。 
    窗函数Window Function:在信号处理之中,用来降低信噪比的一种算法。 
    信噪比: 
    —噪讯比越高的话,声音的大音量和小音量的音量差会越大(音质猛爆)。 
    —噪讯比越低的话,声音的大音量和小音量的音量差会越小(音质柔和)。

    然后我们看一下Unity内置的这条命令:

    AudioSource.GetSpectrumData 
    —public void GetSpectrumData(float[] samples, int channel, FFTWindow window); 
    samples:将音频样本数据传送至samples数组,数组大小必须为2的n次方,最小64,最大8192。 
    channel:一般设置为0。 
    window:转换信号所用的窗函数,算法越复杂,声音越柔和,但速度更慢。

    因此我们先声明一个浮点数组:

    public float[] spectrumData=new float[8192];
    • 1

    在Update方法里面使用方法:

    thisAudioSource.GetSpectrumData(spectrumData,0,FFTWindow.BlackmanHarris);
    • 1

    那么这个方法传送到浮点数组里的数据是什么呢? 
    已知了开始部分的概念,我们可以定义几个变量: 
    一系列采样数据样本: N 
    采样频率: fs 
    时间:T

    既:T=Nfs

    它的倒数称为频率分辨率Frequency Resolution:df=1T=fsN

    频率分辨率越高,转换出来的数据越精确。(下图,同样情况下,低频率分辨率与高频率分辨率的比较) 
    这里写图片描述

    这里写图片描述

    而我们声明的浮点数数组的大小既是GetSpectrumData这个方法的窗函数转换数据时所用的频率分辨率,而数组中每个浮点数的值既是谱密度,每单位频率波携带的功率,我们知道了频率分辨率df=8196,那么每个浮点数,既谱密度dB表示的的是哪个频率范围,既音高范围的功率呢?

    目前数字音乐领域的采样率通常为44100Hz,但通过分析音频文件[MV] FIESTAR(피에스타) _ Mirror.mp3的频谱,可能是因为通过视频转音频的缘故,基本上16000Hz以上的谱密度都非常低了。 
    这里写图片描述

    而在Unity内通过分析spectrumData的数值,spectrumData[5500]左右以后的浮点数值与前面有一个断崖似的减少,因此可推断出,GetSpectrumData的采样的最高频率是在20000~23000赫兹之间,既音频文件23000赫兹以上频率的数据都被忽略掉了。

    如果继续深入,可研究声波频率与音高的关系,将spectrumData特定范围的浮点数相加即可体现乐曲中各个音高的谱密度,由于人的听觉系统对音高最为敏感,其视觉效果应该会更加理想。

    这里写图片描述

    视频

    展开全文
  • public void GetSpectrumData(float[] samples, int channel, FFTWindow window); 这是AudioSoucre类型的方法,获取频谱数据; samples:采样率,就是说采集多长一段的频谱,必须为2^n,但是最小64,最大8192。...

    在这里插入图片描述

    public void GetSpectrumData(float[] samples, int channel, FFTWindow window);

    这是AudioSoucre类型的方法,获取频谱数据;

    • samples:采样率,就是说采集多长一段的频谱,必须为2^n,但是最小64,最大8192。

    • channel:信道,默认0

    • window:采样方式(Enum),有下列几种

      Rectangular W[n] = 1.0.
      Triangle W[n] = TRI(2n/N).
      Hamming W[n] = 0.54 - (0.46 * COS(n/N) ).
      Hanning W[n] = 0.5 * (1.0 - COS(n/N) ).
      Blackman W[n] = 0.42 - (0.5 * COS(n/N) ) + (0.08 * COS(2.0 * n/N) ).
      BlackmanHarris W[n] = 0.35875 - (0.48829 * COS(1.0 * n/N)) + (0.14128 * COS(2.0 * n/N)) - (0.01168 * COS(3.0 * n/N)).


    22050HZ的频率分在几个范围:(从小到大声音越来越尖锐)
    20~60:
    60~250:
    250~500:
    500~2000:
    2000~4000:
    4000~6000:
    6000~20000:
    

    22050采样512个数据,一个sample 43hz;

    分成8段:

    0: 2      86hz
    1: 4      172hz
    2: 8      344hz
    3: 16    688hz
    4: 32    1376hz
    5: 64    2752hz
    6: 128  5504hz
    7: 256  11008hz
    

    Unity中新建一个类,AudioVisable
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    [RequireComponent(typeof(AudioSource))]
    public class AudioVisable : MonoBehaviour {
        AudioSource audioSource;
        public  float[] samples = new float[512];
          float[] freqBand = new float[8];
          float[] bandBuffer = new float[8];
        float[] bufferDecrease = new float[8];
    
        float[] _freqBandHighest = new float[8];
        public static float[] _audioBand = new float[8];
        public static float[] _audioBandBuffer = new float[8];
    
        public static float _Amplitude, _AmplitudeBuffer;
        float _AmplitudeHighest;
    	void Start () {
            audioSource = GetComponent<AudioSource>();
    	}
    	
        void CreateAudioBands()
        {
            for (int i = 0; i < 8; i++)
            {
                if (freqBand[i] > _freqBandHighest[i])
                {
                    _freqBandHighest[i] = freqBand[i];
                }
                _audioBand[i] = (freqBand[i]/_freqBandHighest[i]);
                _audioBandBuffer[i] = (bandBuffer[i]/_freqBandHighest[i]);
            }
        }
    
    	void Update () {
            GetSpectrumAduioSource();
            MakeFrequencyBands();
            BandBuffer();
            CreateAudioBands();
            GetAmplitude();
        }
        void GetAmplitude()
        {
            float _CurrentAmplitude = 0;
            float _CurrentAmplitudeBuffer = 0;
            for (int i = 0; i < 8; i++)
            {
                _CurrentAmplitude += _audioBand[i];
                _CurrentAmplitudeBuffer += _audioBandBuffer[i];
            }
            if (_CurrentAmplitude > _AmplitudeHighest)
                _AmplitudeHighest = _CurrentAmplitude;
            _Amplitude = _CurrentAmplitude / _AmplitudeHighest;
            _AmplitudeBuffer = _CurrentAmplitudeBuffer / _AmplitudeHighest;
        }
        void GetSpectrumAduioSource()
        {
            audioSource.GetSpectrumData(samples, 0, FFTWindow.Blackman);
        }
        void MakeFrequencyBands()
        {
            int count = 0;
            for (int i = 0; i < 8; i++)
            {
                float average = 0;
                int sampleCount = (int)Mathf.Pow(2,i+1);
                if (i == 7)
                {
                    sampleCount += 2;
                }
                for (int j = 0; j < sampleCount; j++)
                {
                    average += samples[count]*(count+1);
                    count++;
                }
                average /= count;
                freqBand[i] = average * 10;
            }
        }
    
        void BandBuffer()
        {
            for (int i = 0; i < 8; i++)
            {
                if (freqBand[i] > bandBuffer[i])
                {
                    bandBuffer[i] = freqBand[i];
                    bufferDecrease[i] = 0.005f;
                }
                if (freqBand[i] < bandBuffer[i])
                {
                    bandBuffer[i] -= bufferDecrease[i];
                    bufferDecrease[i] *= 1.2f;
                }
            }
        }
    }
    

    这个脚本挂在Camera上,可以看到采样的数据的变化;
    在这里插入图片描述


    Unity中,新建一个cube预制体开启,使用standard材质,打开hdr的外发光emission;

    再新建一个脚本ParamCube,挂在cube预制体上;

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class ParamCube : MonoBehaviour {
    
        public int band;
        public float startScale, scaleMultiplier;
    
        Material material;
    	void Start () {
            material = GetComponent<MeshRenderer>().materials[0];
    	}
    	
    	// Update is called once per frame
    	void Update () {
        
                transform.localScale = new Vector3(transform.localScale.x, (AudioVisable._audioBandBuffer[band]) * scaleMultiplier + startScale, transform.localScale.z);
                Color color = new Color(AudioVisable._audioBandBuffer[band], AudioVisable._audioBandBuffer[band], AudioVisable._audioBandBuffer[band]);
                material.SetColor("_EmissionColor",color);      
        }
    }
    
    

    然后在Scene中放8个cube预制体,把脚本中StartScale和scaleMultiplier调为1和10,band为0~7;
    在这里插入图片描述


    最后,在Camera的AudioSource组件上添加音频,运行~

    在这里插入图片描述

    参考:
    国外Youtube上的大神,链接如下:
    https://www.youtube.com/playlist?list=PL3POsQzaCw53p2tA6AWf7_AWgplskR0Vo

    展开全文
  • Unity 音乐可视化

    2018-09-21 17:26:34
    首先感谢 FransicZhang的博客,链接:... 下面获取输入音频及处理代码主要根据FransicZhang的博客所写: /************************************************************ FileName: Aud...
  • PlayMaker插件技术这门课程包含了引擎的编程基础入门,并且讲解了制作VR项目的制作流程,包括机械虚拟仿真拆装等制作方法,从模型到动画,再到脚本的编写,我们这里讲解了可视化编程PLAYMAKER的使用方法,即使你不会...
  • 这是一个使用Unity3d引擎制作的音频可视化播放器
  • 可视化Unity 提取资源工具,可以提取通过Unity打包的apk,iso中的图片文字声音等资源
  • 音频可视化插件

    2020-07-30 23:32:03
    两个音频可视化插件,可以把音频以各种的图像形式表示在U3D中
  • MP3或者WAV等音频文件里面...unity为我们提供了AudioListener.GetSpectrumData来直接获取音频的频谱,为我们节省了转码的时间。 语法:public static void GetSpectrumData(float[] samples, int channel, FFTWindow
  •  为了更好地理解游戏的软件架构和对象模型,它获得更好的外观仅有一名Unity3D的游戏引擎和编辑器是非常有用的,它的主要原则。 Unity3D 引擎  Unity3D的是一个屡获殊荣的工具,用于创建交互式3D应用程序在多个...
  •  Unity3D的是一个屡获殊荣的工具,用于创建交互式3D应用程序在多个platforms.Unity3D由游戏引擎和编辑器。该引擎包含的软件组件,在游戏的研究与开发中最常见的和经常性的任务。发动机所涵盖的主题包括声音,图
  •  Unity3D的是一个屡获殊荣的工具,用于创建交互式3D应用程序在多个platforms.Unity3D由游戏引擎和编辑器。该引擎包含的软件组件,在游戏的研究与开发中最常见的和经常性的任务。发动机所涵盖的主题包括
  • 体系结构 ... 为了更好地理解游戏的软件架构和对象模型,它获得更好的外观仅有一名Unity3D的游戏引擎和编辑器是非常有用的,它的主要原则。 Unity3D 引擎 Unity3D的是一个屡获殊荣的工具,...
  • 1、unity3D简介Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。2、unity3D特点...
  • (一张最原始的Unity3D音乐可视化粒子海的图,想象一下,如果这幅场景出现在虚拟设备中,辅以根据音乐频谱变化的色彩与悦动频率,会是怎样的效果呢?) Unity3D有着非常完备的虚拟三维场景交互开发功能,以...
1 2 3 4 5 ... 20
收藏数 599
精华内容 239
热门标签
关键字:

unity3d音乐可视化