统一预处理音频频谱数据



我正在尝试在播放歌曲之前预先制作歌曲并实施一些节拍检测(不是实时的歌曲播放(。我的基本想法是以每秒90次的方式对频谱数据进行采样,我试图通过通过值来增加AudioSource.timeSamples并拨打AudioSource.GetSpectrumData()来做到这一点。但是我提供的数组似乎总是充满了相同的值。

似乎设置时示例实际上并没有更新AudioSource使用的示例。但是,如果我正常播放这首歌,并打电话给GetSpectrumData(),我的阵列将充满正确的数据。

我可以做些什么来使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;
}

我认为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);
}

相关内容

  • 没有找到相关文章

最新更新