主机不会加载VST插件效果

时间:2012-12-25 14:30:16

标签: c++ vst

我一直在尝试编写一个简单的VST插件。它不需要任何花哨的界面,只需几个控件。但我不知道从哪里开始。开始庞大的文字墙。

我一直在网上虔诚地研究这个主题的信息和指南,但到目前为止我发现的最好的是thisthis页面。虽然它们很好,但我似乎无法使用这些来源重新创建程序。

供参考,我使用的是VST SDK 3.5.2和MSVC 2010。

我将文件夹\public.sdk\source\vst2.x添加到我的项目中(其中包含audioeffect& vstplugmain的源代码)。我真的希望在某个地方有一个简单的项目符号列表,列出你需要做些什么才能使工作/导出正常工作的VST插件效果等。

我提供的前两个链接很好地完成了,但是从那时起,创建VST的方法似乎发生了变化。这是我的程序的骨架,虽然它编译,但我的VST主机不会识别它(加载时出错)。

harmonicmodulator.h

#include "public.sdk\source\vst2.x\audioeffectx.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;
    };
  }
}

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

好吧,我使用的“方法”是:根据之前的两个指南,为了制作成功的插件,您至少需要从音频效果x派生插件并覆盖process()和{{ 1}}进行实际处理。

其余的被添加,希望它能做点什么。此外,导出的函数processReplacing()返回插件的新实例。 createEffectInstance()包含一个dllmain和一个导出函数vstplugmain.cpp,它接收一个audiomastercallback并返回VstPlugMain

IMO,这似乎是前面提供的两个指南的工作方法和重新创建(据我所见)。插件已定义,插件和主机之间有一个接口,允许创建它的实例。我错过了什么?指南说这就是你所需要的。

这是不同版本的VST之间的区别吗? 2/3?

所以我无法让捆绑的VstPluginTestHost工作,它无法找到我的VST。我尝试了验证器,并逐步完成,我发现由于我的程序没有导出一个名为createEffectInstance(callback)的函数,所以它被丢弃了。好的,可以理解,但没有一个指南说明这一点。

搜索无穷无尽的来源,似乎有些VST来源在底部添加了这个神秘的段落(代码取自AGainSimple.cpp):

GetPluginFactory

这似乎导出一个接口,为主机提供一些基本信息和一个用于创建插件的界面。但。我以为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没有收到audiomaster回调,因此无法实例化AudioEffect的任何派生(在其构造函数中将其作为参数) - 我在harmonmodulator.h中提供了注释掉的函数。

另外,我注意到许多较新的来源包括另一个“主”cpp文件(createInstance中的dllmain.cpp,它定义了\public.sdk\source\mainInitModule的导出,但没有{{ 1}}再一次。这令我眼花缭乱。它们似乎也来自DeInitModule(没有x)或createEffectInstance(似乎更复杂?哈哈)。

除此之外,我似乎无法让那些AudioEffect内容工作,因为有许多缺少的常量和定义存在于许多不同的文件中。您是否应该将整个SDL添加到项目中?这是6,000个文件。

TL; DR

没有什么真正起作用,我似乎无法得到线索。捆绑的源样本有效,但它们都采用不同方式创建VST的“方法”。说真的,任何指导或帮助都会受到如此赞赏。我正在尝试将其作为应用程序的一部分创建,并且我已经完成了其他所有工作。

1 个答案:

答案 0 :(得分:1)

  

我一直在尝试编写一个简单的VST插件。它不需要任何   花哨的界面,只是一些控件。但我不知道在哪里   开始。开始庞大的文字墙。

首先编译SDK附带的示例插件。然后用你自己的裸骨插件复制它。从那里继续建设。

  

这是不同版本的VST之间的区别吗? 2/3?

VST 2和VST 3是不同的格式。我建议建立一个VST 2.4插件,除非你有特定的理由建立一个VST 3 plguin。 VST 2.4得到了许多主机的广泛支持,并且可能会持续几年。 VST 3是一种较新的格式,但没有得到广泛的支持。