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