在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
的价值是什么? 看起来没有初始化给我......
上一篇: play a waveform at a certain frequency in SDL callback function