我有一个64个样本的波形。如果采样率为44100赫兹,如何循环播放此波形以播放任意频率?
频率=采样率/波形持续时间(样本数)
因此,频率应该是689赫兹(44100/64)。如果我想将其设置为65.41赫兹(C-2),我需要执行以下操作:
65.41 = 44100 / x
解出x约为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
导致问题的原因是什么?我没有看到任何其他解决这个问题的方法...