使用PortAudio生成正弦波以播放中间C

使用PortAudio生成正弦波以播放中间C,audio,core-audio,portaudio,sound-synthesis,Audio,Core Audio,Portaudio,Sound Synthesis,我在PortAudio中生成特定频率时遇到问题,每当我尝试更改sin(n*FREQ*2*PI/SAMPLE\u RATE)内部的频率时,频率保持不变,但声音的音色似乎确实发生了变化,我在其中输入的频率值越高,声音越难看,但频率却相同。这是我的patestCallback循环中的内容: static int-patestCallback(const-void*inputBuffer,void*outputBuffer, 未签名的长帧缓冲, const Pastream CallbackTimeIn

我在PortAudio中生成特定频率时遇到问题,每当我尝试更改
sin(n*FREQ*2*PI/SAMPLE\u RATE)
内部的频率时,频率保持不变,但声音的音色似乎确实发生了变化,我在其中输入的频率值越高,声音越难看,但频率却相同。这是我的
patestCallback
循环中的内容:

static int-patestCallback(const-void*inputBuffer,void*outputBuffer,
未签名的长帧缓冲,
const Pastream CallbackTimeInfo*timeInfo,
PaStreamCallbackFlags状态标志,
void*用户数据)
{
paTestData*数据=(paTestData*)用户数据;
浮点*输出=(浮点*)输出缓冲区;
(作废)时间信息;
(作废)状态标志;
(void)输入缓冲区;
无符号长n=0;
对于(无符号长i=0;i简单解:

static unsigned long n = 0;

当前,您在每个函数调用中重置
n
,这会导致在每个新缓冲区的开始处发出咔哒声,并导致您听到那些难听的声音。正弦周期与缓冲区长度的差异越大,听起来就越难听。

此建议应该有效(+1)。另一个解决方案可能是使n成为userData的一部分。如果您需要在外部重置它,或者最终导致多个回调或类似的情况,这可能会更好。是的,当然。理想情况下,userData将是一个包含实际音频引擎状态的结构或类。好的,我将其全部放在一个结构中,它工作得非常好。谢谢!。…我想我在概念化portaudio的工作原理方面遇到了困难,那么它是否会在每个framesPerBuffer循环后不断调用patestCallback?另外,是否有可能在输出中写入3或4个正弦波,这样我就可以制作和弦?是的,当然,只需添加几个正弦,每个正弦的频率不同。然而,蛮力sin()函数非常具有扩展性。有更有效的方法来递归集成正弦函数。哦,好的,这就是大多数portaudio示例中的表的用途,对吗?