在SDL回调函数中以特定频率播放波形

我有一个64个样本的波形。 如果采样率是44100赫兹,我怎么能播放(循环)这个波形,以便它播放任意频率?

频率=样本中的采样率/波形持续时间

因此频率应该是689hz(44100/64)。 如果我想说的是,65.41hz(C-2),我将不得不这样做:

65.41 = 44100 / x

求解x产生aprox。 674.208。 所以我需要弄清楚在什么速度下播放波形来获得这个频率。 所以我们可以解决这个方程:

64 * x = 674.208

并获得约10.5。 所以波形需要以原始速度的10.5%进行播放。

这是我的代码:

double smp_index = 0;
double freq = .105;

void callback(void *data, Uint8 *buf, int len){
    int i;
    s8 *out;
    out = (s8*) buf;
    if(smp_index < waveform_length){
        for(i = 0; i < len; i ++){
            out[i] = smpdata[(int)smp_index];
            smp_index +=freq;
            if(smp_index >= waveform_length)
                smp_index = 0;
        }
    }
}

所以最终的音频应该是关于音符C-2,但它更多的是D-2。 是演员

(int)smp_index

导致问题? 我看不到任何其他方式来完成此...


其实,主要问题不在于你的代码,而在于你的推理。

所以我们可以解决这个方程:

64 * x = 674.208

并获得约10.5。

到现在为止还挺好。 (实际上,674.208应该是674.246,但那是因为你之前已经把65.41凑成了4个有效数字。)

所以波形需要以原始速度的10.5%进行播放。

没有! 波形必须减慢10.5倍。 这意味着它必须以其原始速度的1/10.5 = 0.095或9.5%进行播放。


cast (int)smp_index不会导致问题。 它只是拉伸波 - 这是质量损失(也许你应该有你的波数据超过64个样本),但不可能改变频率。 最有可能的问题是:

        if(smp_index > realLength)
            smp_index = 0;

应该:

        if(smp_index >= realLength)
            smp_index -= realLength;

我还有一些其他的笔记给你:

频率=样本中的采样率/波形持续时间

嗯,如果“波形持续时间”是指波的周期,那么是的。 也就是说,如果您的64采样波形是64周期的正弦波,那么是的。 如果是32或16,那么事情就会不同。 如果它没有划分64(如48或30),那么你的波形首先不是周期性的。

现在:

u32 waveform_length;
out = (s8*) buf;
if(smp_index < waveform_length){

waveform_length的价值是什么? 看起来没有初始化给我......

链接地址: http://www.djcxy.com/p/877.html

上一篇: play a waveform at a certain frequency in SDL callback function

下一篇: Django: how to store subdomain