Exact meaning of kNoTail


Let’s talk about plugin tails.

In VST2 (this paragraph is not in the question)

effGetTailSize can return a tail length, however very few plugin makes use of that (Kotelnikov being one of them).

Almost all the VST2 I test return 0 for effGetTailSize, which means “unspecified” and according to VST 2.0.0 documentation will get the hosts to call process continuously.

In my tests, iZotope Ozone does seem to use this “1” sample value, to mean there is “no tail”. What is “no tail” in that context, a very fast termination of energy, or a signal to call process continuously? This is mysterious. But, this 1 value is unlikely to be correct, as a single IIR will bring much more tail than this.

For this plugin format, it seems safer to do what everyone does and return zero everywhere, which is what most JUCE plugins, all Voxengo plugins, all SIR plugins… do.

In VST3, kInfiniteTail signal an infinite tail (always call process) and kNoTail indicates “no tail”. Now, this “no tail” has value 0 but could mean two different things:

  • Either it means “this plugin has no tail, do not try to optimize” and it equivalent to 0 in VST2.
  • Either it means “this plugin has no tail, the output is silent right from the first silent sample.”

In the wild, it turns out some plugins like SuperMassive return kNoTail (0) but obviously it is an effect with a tail (and what a tail). So it seems again people have trouble following the intended semantics. And indeed, I cannot rightfully understand what Steinberg intended.

What does kNoTail means???

I think the documentation is clear: The documentation says:

Gets tail size in samples.

For example, if the plug-in is a Reverb plug-in and it knows that the maximum length of the Reverb is 2sec, then it has to return in getTailSamples() (in VST2 it was getGetTailSize ()): 2*sampleRate. This information could be used by host for offline processing, process optimization and downmix (avoiding signal cut (clicks)). It should return:

  • kNoTail when no tail
  • x * sampleRate when x Sec tail.
  • kInfiniteTail when infinite tail.

And there’s this FAQ entry.

So kNoTail means “this plugin has no tail, the output is silent right from the first silent sample.