2017-06-01 6 views
2

私は、曲を前処理して、曲を再生する前にビート検出を実装しようとしています(曲の再生時にはリアルタイムではありません)。私の基本的なアイデアは、1秒間に約90回のスペクトルデータをサンプリングすることです。私はAudioSource.timeSamplesを値でインクリメントし、AudioSource.GetSpectrumData()を呼び出すことによってこれを実行しようとしています。しかし、私が提供する配列は、常に同じ値で埋められているようです。ユニティのオーディオスペクトラムデータを前処理する

timeSamplesがAudioSourceで使用されているサンプルを実際に更新していないようです。しかし、私が歌を正常に演奏してGetSpectrumData()を呼び出すと、私の予想通り、私の配列は正しいデータで満たされます。

は私が GetSpectrumData()への呼び出し、またはこのデータを得るために、私は歌を通じてパースされなければならないいくつかの他の方法を作るときはAudioSourceがtimeSamplesに設定されているサンプルを使用するために行うことができるものはありますか?ここで

おかげ

は、コードサンプルは、(曲はAudioSourceです)ですが、ループのための第二は、関心のある領域である:

float[][] get_spectrum_data() 
{ 
    int samples = song.clip.samples; 
    int sample_rate = song.clip.frequency/parse_rate; 
    int arr_siz = samples/sample_rate; 
    FFTWindow win = FFTWindow.Rectangular; //which type do we want? 

    float[][] spectrum = new float[arr_siz][]; 
    for (int i = 0; i < arr_siz; i++) 
    { 
     spectrum[i] = new float[spec_res]; 
    } 

    for (int i = 1, j = 0; j < arr_siz; i += sample_rate, j++) 
    { 
     song.timeSamples = i; 
     song.GetSpectrumData(spectrum[j], 0, win); 
    } 

    return spectrum; 
} 

答えて

1

私はAudioSource.GetSpectrumDataが現在に従事されてはAudioSourceに依存していると思います再生。私の推測では、ユーザーが後続のオーディオフィルタを追加した可能性があるため、クリップ自体ではなくオーディオスレッドからサンプリングしていることになります。ループ内で明示的にクリップを再生してみてください:

for (int i = 1, j = 0; j < arr_siz; i += sample_rate, j++) 
{ 
    song.Play(); 
    song.timeSamples = i; 
    song.GetSpectrumData(spectrum[j], 0, win); 
} 
関連する問題