私は、曲を前処理して、曲を再生する前にビート検出を実装しようとしています(曲の再生時にはリアルタイムではありません)。私の基本的なアイデアは、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;
}