【问题标题】:Generate sine wave to play middle C using PortAudio使用 PortAudio 生成正弦波以播放中间 C
【发布时间】:2013-01-28 15:33:49
【问题描述】:

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

static int patestCallback( const void *inputBuffer, void *outputBuffer,
                           unsigned long framesPerBuffer,
                           const PaStreamCallbackTimeInfo *timeInfo,
                           PaStreamCallbackFlags statusFlags,
                           void *userData )
{
   paTestData *data = (paTestData*)userData;
   float *out = (float*)outputBuffer;

   (void) timeInfo;
   (void) statusFlags;
   (void) inputBuffer;
   unsigned long n = 0;
   for(unsigned long i = 0; i<framesPerBuffer;i++,n++){
      float v = sin ( 261.626 * 2 * M_PI * ((float) n / (float) TABLE_SIZE) );
      *out++ = v;
      *out++ = v;
   }

   return paContinue;
}

【问题讨论】:

    标签: audio core-audio portaudio sound-synthesis


    【解决方案1】:

    简单的解决方案:

    static unsigned long n = 0;
    

    您当前在每个函数调用中都重置了n,这会导致在每个新缓冲区开始时出现点击以及您听到的那些难听的声音。正弦周期与缓冲区长度的差异越大,听起来越难看。

    【讨论】:

    • 这个建议应该有效(+1)。另一种解决方案可能是使 n 成为 userData 的一部分。如果您需要在外部重置它或最终出现多个回调或类似的东西,这可能会更好。
    • 是的,当然。理想情况下,userData 应该是一个包含实际音频引擎状态的结构或类。
    • 好的,我把它全部放在一个结构中,它工作得很好,谢谢!...我认为我在概念化 portaudio 的工作方式时遇到了麻烦,所以它会在每个 framesPerBuffer 循环之后连续调用 patestCallback 吗?另外,是否可以在输出中写入 3 或 4 个正弦波以便我制作和弦?
    • 是的,当然只需添加几个正弦波,每个正弦波都有不同的频率。但是,蛮力 sin() 函数非常广泛。有更有效的技术可以递归地集成正弦。
    • 哦,好吧,这是大多数 portaudio 示例中表格的用途正确吗?
    猜你喜欢
    • 2011-07-25
    • 2018-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-01
    • 2016-07-10
    相关资源
    最近更新 更多