我正在尝试在播放歌曲之前对歌曲进行预处理并实施一些节拍检测(不是在歌曲播放时实时进行)。我的基本想法是以每秒大约 90 次的速度对频谱数据进行采样,我试图通过增加AudioSource.timeSamples
一个值并调用AudioSource.GetSpectrumData()
. 但是我提供的数组似乎总是充满了相同的值。
似乎设置 timeSamples 实际上并没有更新 AudioSource 正在使用的样本。但是,如果我正常播放这首歌并对GetSpectrumData()
我的数组进行调用,就会像我预期的那样填充正确的数据。
我可以做些什么来让 AudioSource 在我调用时使用 timeSamples 中设置的样本GetSpectrumData()
,或者我应该通过其他方式解析歌曲以获取这些数据?
谢谢
这是一个代码示例(歌曲是一个 AudioSource),第二个 for 循环是感兴趣的区域:
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;
}