Генерация синусоиды для воспроизведения среднего C с помощью PortAudio

У меня возникают проблемы при генерации определенных частот в 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;
}

1 ответ

Решение

Простое решение:

static unsigned long n = 0;

Вы сейчас сбросили n в каждом вызове функции, который приводит к щелчкам в начале каждого нового буфера и к тем ужасным звукам, которые вы слышите. Чем больше период синуса отличается от длины буфера, тем хуже он звучит.

Другие вопросы по тегам