gpt4 book ai didi

c++ - 这个 Vst Synth 例子的解释

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:25:35 26 4
gpt4 key购买 nike

我无法理解 Steinberg VST Synth 示例中的特定代码区域

在这个函数中:


void VstXSynth::processReplacing (float** inputs, float** outputs, VstInt32 sampleFrames)
{
float* out1 = outputs[0];
float* out2 = outputs[1];<p></p>

<p>if (noteIsOn)
{
float baseFreq = freqtab[currentNote & 0x7f] * fScaler;
float freq1 = baseFreq + fFreq1; // not really linear...
float freq2 = baseFreq + fFreq2;
float* wave1 = (fWaveform1 < .5) ? sawtooth : pulse;
float* wave2 = (fWaveform2 < .5) ? sawtooth : pulse;
float wsf = (float)kWaveSize;
float vol = (float)(fVolume * (double)currentVelocity * midiScaler);
VstInt32 mask = kWaveSize - 1;</p>

<pre><code> if (currentDelta > 0)
{
if (currentDelta >= sampleFrames) // future
{
currentDelta -= sampleFrames;
return;
}
memset (out1, 0, currentDelta * sizeof (float));
memset (out2, 0, currentDelta * sizeof (float));
out1 += currentDelta;
out2 += currentDelta;
sampleFrames -= currentDelta;
currentDelta = 0;
}

// loop
while (--sampleFrames >= 0)
{
// this is all very raw, there is no means of interpolation,
// and we will certainly get aliasing due to non-bandlimited
// waveforms. don't use this for serious projects...
(*out1++) = wave1[(VstInt32)fPhase1 & mask] * fVolume1 * vol;
(*out2++) = wave2[(VstInt32)fPhase2 & mask] * fVolume2 * vol;
fPhase1 += freq1;
fPhase2 += freq2;
}
}
else
{
memset (out1, 0, sampleFrames * sizeof (float));
memset (out2, 0, sampleFrames * sizeof (float));
}
</code></pre>

<p>}
</p>

我对该函数的理解是,如果当前有一个 MIDI 音符,我们需要将波表复制到输出数组中以传递回 VstHost。具体不明白的是

if (currentDelta > 0)
里面的区域是什么条件 block 正在做。它似乎只是将零写入输出数组......

可以在 http://pastebin.com/SdAXkRyW 找到该文件的完整版本

最佳答案

传入的 MIDI NoteOn 事件可以相对于您接收到的缓冲区的开头有一个偏移量(称为 deltaFrames)。 currentDelta 跟踪相对于接收到的缓冲区的开始应该播放音符的时间。

因此,如果 currentDelta > sampleFrames,则意味着音符不应在此循环( future )中播放 - 提前退出。

如果 currentDelta 在此周期的范围内,则内存将被清除,直到音符应产生输出 (memset) 的那一刻,并且指针被操纵以使其看起来像是缓冲区从声音应该产生的位置开始play - length -sampleFrames- 也进行了调整。

然后在循环中产生声音。

希望对您有所帮助。马克

关于c++ - 这个 Vst Synth 例子的解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19792674/

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