主机不会加载 VST 插件效果

Posted

技术标签:

【中文标题】主机不会加载 VST 插件效果【英文标题】:Host won't load VST plugin effect 【发布时间】:2012-12-25 14:30:15 【问题描述】:

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

我一直在网上搜索有关此主题的信息和指南,但到目前为止我发现的最好的是this 和this 页面。虽然它们很好,但我似乎无法使用这些资源重新创建程序。

作为参考,我使用的是 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;
    ;
  

谐波调制器.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);

好的,我使用的“方法”是:根据前面的两个指南,要制作一个成功的插件,您至少需要从音频效果器派生您的插件并覆盖process()processReplacing()进行实际处理。

添加其余部分是希望它能做点什么。此外,导出的函数createEffectInstance() 返回插件的一个新实例。 vstplugmain.cpp 包含一个 dllmain 和一个导出函数 VstPlugMain,它接收一个 audiomastercallback 并返回 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.sdk\source\main 中,它定义了InitModuleDeInitModule 的导出,但不再有createEffectInstance。这令人眼花缭乱我。它们似乎也源自AudioEffect(没有x)或SingleComponentEffect(似乎要复杂得多?哈哈)。

除此之外,我似乎无法让 begin_factory 的东西正常工作,因为很多丢失的常量和定义驻留在许多不同的文件中。您是否应该将整个 SDL 添加到您的项目中?那是 6,000 个文件。

TL;DR

没有什么真正有效,我似乎无法获得线索。捆绑的源示例可以工作,但它们都以不同的方式接近创建 VST 的“方法”。说真的,任何指导或帮助将不胜感激。我正在尝试将其创建为应用程序的一部分,并且我已经完成了其他所有工作。

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

谢谢,我最初认为 vst 版本是向后兼容的,所以我认为更新 = 更好。正如帖子中所说,我确实尝试了捆绑的插件并且它们有效,但它让我很困惑(即使是小的 AGain 也是 118kb 的源代码)但是是的,我无法获取 2.4 SDK 并返回这里并返回结果。跨度> 使用 vst sdk 2.4 构建它可以立即工作。我有点想打自己的脸,因为在 vst 3.5 上浪费了这么多时间。无论如何,谢谢。 @Shaggi:没问题。很高兴听到您在没有太多困难的情况下完成了 2.4。 :)

以上是关于主机不会加载 VST 插件效果的主要内容,如果未能解决你的问题,请参考以下文章

au里的vst插件怎么添加

带有 VST 效果插件的网络音频播放器?

将 VST 音频效果/插件应用于音频文件

如何给Adobe Audition、Vegas Pro加VST特效插件?

使用 VST 插件失真的音频

vs插件 都有哪些?推荐一下