2

Steinberg VST Synth の例のコードの特定の領域を理解するのに苦労しています

この関数では:


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

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;

    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));
}

}

私がこの関数を理解している方法は、現在 MIDI ノートがオンになっている場合、ウェーブ テーブルを出力配列にコピーして VstHost に戻す必要があるということです。私が具体的に理解していないのは、

if (currentDelta > 0)
条件付きブロックがやっています。出力配列にゼロを書き込むだけのようです...

ファイルのフル バージョンは、http://pastebin.com/SdAXkRyWにあります。

4

1 に答える 1

1

受信する MIDI NoteOn イベントには、受信するバッファーの開始点 (deltaFrames と呼ばれる) を基準としたオフセットが含まれる場合があります。currentDelta は、受信したバッファの開始を基準として、いつノートを再生するかを追跡します。

したがって、currentDelta > sampleFrames の場合、このサイクル (将来) でノートを再生しないことを意味します - 早期終了。

currentDelta がこのサイクルの範囲内にある場合、メモが出力を生成する瞬間までメモリがクリアされ (memset)、ポインタが操作されて、サウンドが再生される場所でバッファが開始するように見えます - 長さ-sampleFrames-も調整。

次に、ループで音が生成されます。

それが役に立てば幸い。マルク

于 2013-11-05T18:05:42.473 に答える