我需要计算三角形和锯齿波,但由于我的模型和我能够使用的数据,它有点复杂(但也许我只是感到困惑)。
我能够计算我的正弦波,但我并没有真正使用帧计数器。我所做的是,计算theta_increment
下次需要计算样本时可以使用的变量。这工作起来是这样的:
float x = note.frequency / AppSettings::sampleRate;
float theta_increment = 2.0f * M_PI * x;
float value = 0;
if(waveType == SINE){
value = sin(note.theta) * fixedAmplitude;
}
现在我有了存储的当前帧/样本的值theta_increment
在我的里面note.theta
成员,这样我就可以将它用于下一个示例:
note.theta += theta_increment;
我已经看过大量关于如何计算锯子或三角形的示例,但我无法弄清楚。 (我只有上面提到的数据可供我使用)这是我最后一次尝试,但它不起作用并给我带来了很多故障:
value = 1.0f - (2.0f * ((float)note.theta / (float)44100));
如果您有一个循环生成如下所示的值:
for (size_t frame=0; frame!=n_frames; ++frame) {
float pos = fmod(frequency*frame/sample_rate,1.0);
value[frame] = xFunc(pos)*fixedAmplitude;
}
然后您可以将这些函数用于不同类型的波浪:
float sinFunc(float pos)
{
return sin(pos*2*M_PI);
}
float sawFunc(float pos)
{
return pos*2-1;
}
float triangleFunc(float pos)
{
return 1-fabs(pos-0.5)*4;
}
基本思想是您希望每个周期内的值 (pos) 从 0.0 变化到 1.0。然后你可以按照你想要的方式塑造它。
对于正弦波,sin() 函数可以完成这项工作,您只需乘以 2*PI 即可将 0.0 到 1.0 范围转换为 0.0 到 2*PI 范围。
对于锯齿波,您只需将 0.0 到 1.0 范围转换为 -1.0 到 1.0 范围。乘以二并减一即可完成此操作。
对于三角波,可以使用绝对值函数来引起方向的突然改变。首先,我们通过减去 -0.5 将 0.0 到 1.0 范围映射到 -0.5 到 0.5 范围。然后我们通过取绝对值将其变成0.5到0.0到0.5的形状。通过乘以 4,我们将其转换为 2.0 到 0.0 到 2.0 的形状。最后用 1 减去它,我们得到 -1.0 到 1.0 到 -1.0 的形状。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)