gpt4 book ai didi

c++ - PortAudio:通过调用函数播放多个生成的声音

转载 作者:行者123 更新时间:2023-11-30 05:06:50 25 4
gpt4 key购买 nike

我大约一周前开始使用 PortAudio 库。我已经检查了大部分教程/测试示例,但没有看到我需要的解决方案。我正在制作简单的音序器 - 我已经在钢琴卷轴上绘制了作为 block 的声音,但现在我需要以某种方式让它听起来。我想知道是否有可能让它像这样工作:

  • 运行将播放一种声音的方法,
  • 将声音的频率和持续时间作为该方法的参数,
  • 播放多种声音(即同时播放三种声音,调用三种方法)。

在示例文件中它看起来更复杂。当我想播放多个正弦波时,我必须合并所有这些波,然后将这些数据提供给流。

也许有人有更好的解决方案来解决这个问题?

最佳答案

我只会给你一个简单的例子(正弦波),然后你可以创建你感兴趣的其他类型的波。所需的输入参数是

  • sampling rate (e.g 8000, 16000 etc)
  • amplitude (the actual values depend on the output format but it's best to have values in the range 0-1 and convert them to whatever format you like/need)
  • frequency (expressed as a fraction of the sampling rate)
  • duration (in seconds)

音调数据(样本)的缓冲区长度由音调持续时间(以秒为单位)乘以采样率确定。

创建正弦波的实际代码可能如下所示

//global variables
const float PI = 3.141593;
const unsigned samplingRate = 8000;
const float amp = 0.8;

float *GenerateTone(float frequency, unsigned duration, unsigned &bufferLen){

const float freq = frequency/samplingRate; //(e.g 440 / 8000 = 0,055)

bufferLen = samplingRate * duration;

float *buffer = new float[bufferLen]

for(int i = 0; i < bufferLen; i++ ){

buffer[i] = amp * sin(2 * PI*freq * ((float)i)/samplingRate);

}
return buffer;
}

你可以这样调用这个函数

unsigned len;
float *pTone = GenerateTone(440, 1, len);//len is an out parameter
...
delete [] pTone; //deallocatone memory when you no longer need it

在 C++ 中,您还可以使用 std::vector 来存储样本。这样您就不必担心内存分配/取消分配。

std::vector<float> v; //make vector global  
const float PI = 3.141593;
const unsigned samplingRate = 8000;
const float amp = 0.8;

void GenerateTone(float frequency, unsigned duration){

const amp = 0.8f;

const float freq = frequency/samplingRate;

const unsigned len = samplingRate * duration;
for(int i = 0; i < len; i++ )
v.push_back(amp * sin(2*PI*freq * ((float)i)/sampleRate));

}

您也可以将振幅作为参数传递,但在上面的示例中,振幅是硬编码的。另请参见(https://en.wikipedia.org/wiki/Triangle_wavehttps://en.wikipedia.org/wiki/Square_wave)

关于c++ - PortAudio:通过调用函数播放多个生成的声音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47740219/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com