본문 바로가기
Unity3D/Unity & C#

Unity & C# ~ Mic 음성을 Spectrum 표현하기

by 캬캬백곰 2022. 10. 5.
728x90
using System.Collections;
using System.Collections.Generic;

using UnityEngine;
using UnityEngine.UI;

[RequireComponent(typeof(AudioSource))]
public class AudioSourceGetSpectrumDataExample : MonoBehaviour
{
    [SerializeField] private Image bar; // 원본 막대 prefab
    [SerializeField] private Transform trBarParent; // 막대 부모

    // 스펙트럼 표현 막대들
    // Canvas 하위 객체
    private RectTransform[] bars = new RectTransform[128];

    private float[] spectrum = new float[128]; // 스펙트럼 샘플 수

    private AudioSource audioSource = null; // audiosource

    // Start is called before the first frame update
    void Start()
    {
        // 바 초기화
        for(int i=0; i < bars.Length; i++)
        {
            bars[i] = (Instantiate(bar) as Image).GetComponent<RectTransform>();
            bars[i].parent = trBarParent;
            bars[i].localPosition = new Vector2(i * 5, 0);

            //color 랜덤 초기화
            bars[i].GetComponent<Image>().color = new Vector4(Random.Range(0.0f, 0.1f), Random.Range(0.0f, 0.1f), Random.Range(0.0f, 0.1f), 1f);
            bars[i].sizeDelta = new Vector2(2.5f, 1);
        }

        // audiosource 초기화
        audioSource = GetComponent<AudioSource>();
        audioSource.clip = Microphone.Start(null, true, 1, 44100);
        audioSource.Play();

        Invoke("LoopMicAudio", 1);
    }

    // Update is called once per frame
    void Update()
    {
        //스펙트럼 값에 따른 막대 사이즈 변화
        AudioListener.GetSpectrumData(spectrum, 0, FFTWindow.Rectangular);

        for(int i = 0; i < bars.Length; i++)
        {
            bars[i].sizeDelta = new Vector2(2.5f, spectrum[i] * 700);
        }
    }

    // loop mic audio
    void LoopMicAudio()
    {
        audioSource.Play();

        Invoke("LoopMicAudio", 1);
    }
}
728x90
반응형