我試圖在播放歌曲之前預先處理一首歌曲並執行一些節拍檢測(而不是實時播放歌曲)。我的基本想法是以每秒90次的頻率採樣頻譜數據,我試圖通過將AudioSource.timeSamples
增加一個值並致電AudioSource.GetSpectrumData()
來實現。但是我提供的數組總是似乎充滿了相同的值。在Unity中預處理音頻頻譜數據
這似乎是設置timeSamples實際上並沒有更新AudioSource正在使用的示例。但是,如果我正常播放歌曲並撥打電話GetSpectrumData()
,我的陣列中就會填充正確的數據,如我所料。
有什麼我可以做的,使AudioSource使用在timeSamples中設置的示例,當我打電話給GetSpectrumData()
,或者我應該通過歌曲解析來獲取這些數據?
感謝
下面是一個代碼示例(歌曲是的AudioSource),用於循環第二是感興趣的區域:我覺得AudioSource.GetSpectrumData依靠的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;
}