vst - union university · audio synthesizers audio effect plugins daw (digital audio workstation)...
TRANSCRIPT
What is VST?
• an interface to integrate
Audio Synthesizers Audio Effect Plugins
DAW (Digital Audio Workstation)
History • 1996 o SDK released by Steinberg in 1996 o released with Cubase 3.02 o included some basic effect plug-ins
• 1999 o included updates for VSTi (virtual instruments) o Neon - the first VSTi - 16-voice, 2-oscillator virtual
analog synthesizer
VST3 Audio Effect
Steinberg VST SDK
• "Splitting up an effect into these two parts requires some extra efforts for an implementation of course." [1]
"But this separation enables the host to run each component in a different context. It can even run them on different computers." [1]
Processor Edit Controller
Vst::IComponent Vst::IAudioProcessor
Vst::EditController
Stienberg::IAudioProcessor • [1]
1. Setup (configuration must happen before processing) a. Process Setup (parameters that cannot be changed
during processing) Stienberg::Vst::ProcessSetup
b. Dynamic Speaker Arrangements Stienberg::Vst::IAudioProcessor::setBusArrangements
2. Process (implements actual processing) Stienberg::Vst:IAudioProcessor::process
a. Block Size (processing done in blocks) b. Audio Buffers c. Parameters & Automation
VST.NET • "VST.NET does nothing with the C++ SDK classes that
Steinberg provides. It interfaces at the lowest level with the C function pointers and opcodes and translates those to and from managed code (C# in this case)." [3]
• Why VST.NET? [2] • VST.NET is easier to learn than the native SDK API • You can program VST plug-ins in any .NET language • VST.NET provides a framework that simplifies and
clarifies the VST interfacing options • It takes far less time to develop a managed VST.NET
plug-in than to develop a C/C++ native VST plug-in • Good documentation • Existing native VST knowledge applies
Implementing an Audio Processor
• using Jacobi.Vst.Core; using Jacobi.Vst.Framework;
class AudioProcessor : IVstPluginAudioProcessor { public int BlockSize { get; set; }
public int InputCount { get { return 2; } }
public int OutputCount { get { return 2; } }
public double SampleRate { get; set;}
public int TailSize { get { return 0; } }
Audio Processor (cont.)
• public void Process(VstAudioBuffer[] inputs, VstAudioBuffer[] outputs) { VstAudioBuffer input = inputs[0]; VstAudioBuffer output = outputs[0]; for (int index = 0; index < output.SampleCount; index++) { output[index] = input[index]; }
input = inputs[1]; output = outputs[1];
for (int index = 0; index < output.SampleCount; index++) { output[index] = input[index]; } }
public bool SetPanLaw(VstPanLaw type, float gain) { return false; }
#endregion }
Changing the Interface Manager • using Jacobi.Vst.Core;
using Jacobi.Vst.Framework; using Jacobi.Vst.Framework.Plugin;
class MyPlugin : VstPluginWithInterfaceManagerBase { public MyPlugin() : base("My Plugin", new VstProductInfo("My Product", "My Vendor", 1000), VstPluginCategory.Synth, VstPluginCapabilities.NoSoundInStop, 0, 0) // enter unique plugin ID {}
protected override IVstPluginAudioProcessor CreateAudioProcessor (IVstPluginAudioProcessor instance) { if (instance == null) return new AudioProcessor(this);
// base class just returns 'instance' return base.CreateAudioProcessor(instance); } // other methods... }