我在 90 年代学习了 C 和 C++,现在才重新开始学习。我正在努力构建一个合成器。最终在 DSP 板上,但现在,在我的计算机上为其构建框架。我已经得到它解析 MIDI 并定义了所有合成器参数和一个 QT GUI 来验证参数的缩放是否正常工作以及复音是否被正确处理。所以,现在我正在努力构建应用这些参数的控制路径。
我有一个名为 SynthParameters 的类来控制这些。我实例化了一个 SynthParameters 数组。现在我正在寻找处理单个音符频率的修改,所以我有一个名为 VCOFreqmod 的类,它将处理诸如失谐、振荡器的八度音阶、颤音等事物的调制……所以。我正在创建指向值(公共类成员)的浮点指针,构造函数将接收该参数的 SynthParameter 地址并链接到 ParamValue。
我的问题是,这是在正确的轨道上吗?我把自己画到角落里了吗? SynthParameters 将在我创建 VCOFreqmod 实例时实例化,所以这似乎是合理的,但我愿意被告知其他情况。
好的,代码:
class VCOFreqmod {
private:
float * Master_Tune;
float * DetuneLR;
float * Sine_Octave;
float * Saw_Octave;
float * Pulse_Oct;
float * Vibrato_Depth;
float * Vibrato_Rate;
float * Portatime;
float * SinePortamento;
float * SawPortamento;
float * SquarePortamento;
public:
VCOFreqmod( SynthParameter mastertune,
SynthParameter detunelr,
SynthParameter sine_oct,
SynthParameter saw_oct,
SynthParameter pulse_oct,
SynthParameter vibrato_depth,
SynthParameter vibrato_rate,
SynthParameter portatime,
SynthParameter sineportamento,
SynthParameter sawportamento,
SynthParameter squareportamento) {
Master_Tune=&mastertune.ParamValue;
DetuneLR=&detunelr.ParamValue;
Sine_Octave=&sine_oct.ParamValue;
Vibrato_Depth=&vibrato_depth.ParamValue;
Vibrato_Rate=&vibrato_rate.ParamValue;
Portatime=&portatime.ParamValue;
SinePortamento=&sineportamento.ParamValue;
SawPortamento=&sawportamento.ParamValue;
SquarePortamento=&squareportamento.ParamValue;
}
float MtoF(int midinotenum) {
return 13.75*pow(2,(midinotenum-9)/12);
}
float setOctave(float frequency,int offset) {
if (offset==1) { return frequency*2; }
else if (offset==-1) { return frequency/2; }
return frequency;
}
};
我只是在写这段代码并在网上寻找类似的例子,但运气不佳。我真的很想找人面对面告诉我我是个菜鸟,然后重新开始。或者,说这是一种合理的方法。我现在问,因为我至少有更多的东西要写,VCA、VCO、VCF 和 FX,它们将基于相同的方法。我什至还没有为这个写数学部分。我不想进行查找,只是使用现成的值在代码的 DSP 部分中用于计算。