我一直在尝试编写一个简单的 VST 插件。它不需要任何花哨的界面,只需要几个控件。但我不知道从哪里开始。开始巨大的文字墙。
我一直在网上虔诚地研究有关此主题的信息和指南,但到目前为止我发现的最好的是这个和这个页面。虽然它们很好,但我似乎无法使用这些资源重新创建程序。
作为参考,我使用的是 VST SDK 3.5.2 和 MSVC 2010。
我将文件夹public.sdksourcevst2.x
添加到我的项目中(其中包括 audioeffect 和 vstplugmain 的源代码(。我真的希望在某个地方有一个简单的项目符号列表,列出您需要做什么才能使有效的 VST 插件效果正常工作/正确导出等。
我提供的前两个链接很好地介绍了它,但从那时起,创建 VST 的方法似乎发生了变化。这是我的程序的骨架,在编译时,我的 VST 主机无法识别它(加载时出错(。
谐波调制器。
#include "public.sdksourcevst2.xaudioeffectx.h"
namespace Steinberg {
namespace VST {
class HarmonicModulator : public AudioEffectX {
public:
/* ?? what about createEffectInstance
static FUnknown* createInstance (void* context) {
return (IAudioProcessor*)new HarmonicModulator;
}
*/
HarmonicModulator(audioMasterCallback master);
virtual ~HarmonicModulator(); //can't hurt
/*
virtuals
*/
virtual void process (float **inputs, float **outputs, VstInt32 sampleFrames);
virtual void processReplacing (float **inputs, float **outputs, VstInt32 sampleFrames);
virtual void setProgramName (char *name);
virtual void getProgramName (char *name);
virtual void setParameter (VstInt32 index, float value);
virtual float getParameter (VstInt32 index);
virtual void getParameterLabel (VstInt32 index, char *label);
virtual void getParameterName (VstInt32 index, char *label);
virtual void getParameterDisplay (VstInt32 index, char *text);
virtual bool getEffectName (char * name);
virtual bool getVendorString (char * text);
virtual bool getProductString (char * text);
virtual VstInt32 getVendorVersion () { return 1000; }
virtual VstPlugCategory getPlugCategory () { return kPlugCategEffect; }
protected:
char progname[64];
float fparam;
};
}
}
谐波调制器.cpp
#include "HarmonicModulator.h"
namespace Steinberg {
namespace VST {
/*
Implementation for the constructor.
*/
HarmonicModulator::HarmonicModulator(audioMasterCallback cb) : AudioEffectX(cb, 1, 1), fparam(0.f) {
setNumInputs (2); // stereo in
setNumOutputs (2); // stereo out
setUniqueID ('HMXX'); // identify
canProcessReplacing (); // supports both accumulating and replacing output
strcpy_s(progname, "Default");
}
/*
Implementation for the destructor.
*/
HarmonicModulator::~HarmonicModulator() {}
/*
ProcessReplacing
*/
void HarmonicModulator::processReplacing (float **inputs, float **outputs, VstInt32 sampleFrames) {
float *in1 = inputs[0];
float *in2 = inputs[1];
float *out1 = outputs[0];
float *out2 = outputs[1];
while (--sampleFrames >= 0) {
(*out1++) += (*in1++);
(*out2++) += (*in2++);
}
}
/*
Process
*/
void HarmonicModulator::process (float **inputs, float **outputs, VstInt32 sampleFrames) {
float *in1 = inputs[0];
float *in2 = inputs[1];
float *out1 = outputs[0];
float *out2 = outputs[1];
while (--sampleFrames >= 0) {
(*out1++) += (*in1++);
(*out2++) += (*in2++);
}
}
/*
Below seems to be needed to work
*/
void HarmonicModulator::setProgramName (char *name){
strcpy_s(progname, name);
}
void HarmonicModulator::getProgramName (char *name){
strcpy_s(name, 32, progname);
}
void HarmonicModulator::setParameter (VstInt32 index, float value) {
fparam = value;
}
void HarmonicModulator::getParameterLabel (VstInt32 index, char *label) {
strcpy_s(label, 32, "dB");
}
void HarmonicModulator::getParameterName (VstInt32 index, char *label) {
strcpy_s(label, 32, "Volume");
}
void HarmonicModulator::getParameterDisplay (VstInt32 index, char *text) {
this->dB2string(fparam, text, 32);
}
//-----------------------------------------------------------------------------------------
float HarmonicModulator::getParameter (VstInt32 index) {
return fparam;
}
bool HarmonicModulator::getEffectName (char * name) {
strcpy_s(name, 32, "Harmonic Modulator");
return true;
}
bool HarmonicModulator::getVendorString (char * text) {
strcpy_s(text, 32, "LightBridge");
return true;
}
bool HarmonicModulator::getProductString (char * text) {
strcpy_s(text, 32, "Harmonic Modulator");
return true;
}
}
}
AudioEffect* createEffectInstance (audioMasterCallback audioMaster) {
return new Steinberg::VST::HarmonicModulator (audioMaster);
}
好的,我使用的"方法"是: 根据前面的两个指南,要制作一个成功的插件,您至少需要从 audio effectx 派生您的插件并覆盖执行实际处理的process()
和processReplacing()
。
其余的被添加,希望它能做点什么。此外,导出的函数createEffectInstance()
返回插件的新实例。 vstplugmain.cpp
包含一个 dllmain 和一个导出的函数VstPlugMain
,该函数接收音频大师回调并返回 createEffectInstance(callback)
。
IMO,这似乎是一种工作方法,也是(据我所知(之前提供的两个指南的重新创建。插件已定义,插件和主机之间有一个接口,允许创建它的实例。我错过了什么?指南说这就是你所需要的。
这是不同版本的 VST 之间的差异吗?2/3?
所以我无法捆绑 VstPluginTestHost 工作,它找不到我的 VST。我尝试了验证器,并逐步完成它,我发现由于我的程序没有导出名为 GetPluginFactory
的函数,因此它被丢弃了。好吧,可以理解,但是没有一个指南对此有所说明。
搜索无穷无尽的源代码,似乎一些 VST 源代码在底部添加了这段神秘的段落(代码取自 AGainSimple.cpp(:
BEGIN_FACTORY_DEF ("Steinberg Media Technologies",
"http://www.steinberg.net",
"mailto:info@steinberg.de")
//---First Plugin included in this factory-------
// its kVstAudioEffectClass component
DEF_CLASS2 (INLINE_UID (0xB9F9ADE1, 0xCD9C4B6D, 0xA57E61E3, 0x123535FD),
PClassInfo::kManyInstances, // cardinality
kVstAudioEffectClass, // the component category (don't change this)
"AGainSimple VST3", // here the Plug-in name (to be changed)
0, // single component effects can not be destributed so this is zero
"Fx", // Subcategory for this Plug-in (to be changed)
FULL_VERSION_STR, // Plug-in version (to be changed)
kVstVersionString, // the VST 3 SDK version (don't change this, use always this definition)
Steinberg::Vst::AGainSimple::createInstance)// function pointer called when this component should be instantiated
END_FACTORY
这似乎导出了一个接口,该接口为主机提供了一些基本信息和用于创建插件的接口。但。我以为createEffectInstance
这样做了。现在有一个名为 createInstance
的新函数。有区别吗?函数签名表明createInstance
没有收到 audiomaster 回调,因此无法实例化 AudioEffect 的任何派生(它将其作为其构造函数中的参数( - 我在 harmonicmodulator.h 中提供了函数,注释掉了。
另外,我注意到许多较新的来源包括另一个"主"cpp 文件 (dllmain.cpp,在 public.sdksourcemain
中,它定义了InitModule
和DeInitModule
的导出,但不再createEffectInstance
。这让我头晕目眩。它们似乎也来自AudioEffect
(没有x(或SingleComponentEffect
(似乎要复杂得多?哈哈(。
最重要的是,由于缺少许多常量并定义驻留在许多不同的文件中,我似乎无法让begin_factory
的东西工作。您是否应该将整个 SDL 添加到您的项目中?那是 6,000 个文件。
博士
没有什么真正起作用,我似乎无法得到线索。捆绑的源示例有效,但它们都以不同的方式处理创建 VST 的"方法"。说真的,任何指导或帮助将不胜感激。我正在尝试将其创建为应用程序的一部分,并且我几乎解决了其他所有问题。
我一直在尝试编写一个简单的 VST 插件。它不需要任何 花哨的界面,只有几个控件。但我不知道去哪里 开始。开始巨大的文字墙。
首先编译 SDK 附带的示例插件。然后用你自己的裸骨插件复制它。从那里继续建立。
这是不同版本的 VST 之间的差异吗?2/3?
VST 2 和 VST 3 是不同的格式。我建议构建一个 VST 2.4 插件,除非您有特定的原因构建 VST 3 plguin。VST 2.4 受到许多主机的广泛支持,并且可能会持续几年。VST 3 是一种较新的格式,但没有得到广泛的支持。