当前位置: 首页 > 知识库问答 >
问题:

主机不会加载VST插件效果

严开宇
2023-03-14

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

我一直在网上虔诚地寻找关于这个主题的信息和指南,但是到目前为止我找到的最好的是这个和这个页面。虽然它们很好,但我似乎不能用这些来源重新创建一个程序。

作为参考,我使用VSTSDK3.5.2和MSVC 2010。

我添加了文件夹\public.sdk\source\vst2. x到我的项目(其中包括audio效的源代码

我提供的前两个链接很好地完成了它,但是从那以后创建VST的方法似乎已经改变了。这是我的程序的框架,当它编译时,它不会被我的VST主机识别(加载时出错)。

谐波调制器

#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);
}

好的,I'mm使用的方法是:根据前面的两个指南,要制作一个成功的插件,您至少需要从音频效x派生插件,并覆盖执行实际处理的过程()过程替换()

其余部分是希望它能做些什么而添加的。此外,导出的函数createeffectInstance()返回插件的一个新实例。vstplugmain.cpp包含一个dllmain和一个导出的函数VstPlugMain,该函数接收audiomasterallback并返回createeffectInstance(回调)

依我看,这似乎是一种工作方法,是对前面提供的两个指南的重新创造(据我所知)。插件已经定义,并且在插件和主机之间有一个接口,可以创建它的实例。我错过了什么?导游说这就是你所需要的。

这是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回调,因此无法实例化Audio效的任何派生(它将此作为其构造函数中的一个参数)-我提供了这个函数,注释掉,在Harumicmodator. h中。

而且我注意到,许多较新的源代码包括另一个“main”cpp文件(dllmain.cpp,在\public.sdk\source\main中),它定义了InitModuleDeInitModule的导出,但不再是createEffectInstance。这让我感到头晕目眩。它们似乎还来自AudioEffect(no x)或SingleComponentEffect(看起来要复杂得多?哈哈)。

除此之外,我似乎无法让begin_factory的东西正常工作,因为许多不同文件中都缺少常量和定义。你应该把整个SDL添加到你的项目中吗?那是6000个文件

TL;博士

什么都不管用,我似乎也找不到线索。捆绑的源示例可以工作,但它们都以不同的方式接近创建VST的“方法”。说真的,任何指导或帮助都将不胜感激。我正试图将其作为应用程序的一部分来创建,其他的事情我都已经解决了。

共有1个答案

辛健
2023-03-14

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

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

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

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

 类似资料:
  • 我不得不插入一个预先存在的软件,管理ASIO音频流,一个简单的VST主机。尽管缺少一些留档,我还是设法做到了,但是一旦我加载插件,我就会得到一个严重失真的音频信号。 我使用的VST工作正常(与其他VST主机一起),所以这可能是我编写的代码中的某种缺陷,但是当我从插件中禁用“进程”时(我的流通过插件,它根本没有得到处理),它会在我发送时返回,没有任何噪音或失真。 我稍微关心的一件事是ASIO驱动程序

  • 我的单元测试在eclipse中工作,因为DLL的路径在jna中设置正确。图书馆路径 但是使用插件的mvn测试失败,出现此错误。 无法加载库'ehappi32':在资源路径中找不到本机库(win32-x86-64/ehlapi32.dll)

  • 问题内容: 我正在使用来在主机(debian i386)上编译一个简单的C文件。 然后将文件复制到目标(arm,uclibc)计算机。 运行-没关系。 它说,使用GDB(目标)并列出源代码。事实一直如此吗? 如果我将文件复制到目标,则命令它列出源代码。 我的问题: GDB一直都是这样,还是我可以控制其他选项? 您对调试程序有什么建议吗? 一些信息可能会有用: 源代码1.c文件 : 交叉编译版本(主

  • 我一直试图使用Ansible Playbook将主机名添加到我的主机文件中。我的Ansible播放如下所示,我的主机文件位于: Playbook成功执行,但新主机名没有添加到Ansible hosts文件中。有人能帮我吗?

  • 我是VST开发的新手。我想实现http://www.cloneensemble.com/比如C#中的功能。这是一个VST插件。 有两种方法可以做到这一点。 在我的项目中使用他们的DLL,通过调用DLL的一些函数并对输入应用效果,以某种方式为DLL提供输入 以上任何一种情况我都不知道怎么做请帮忙。

  • 问题内容: 我已经尝试搜索,但仍然没有解决方案。当我导出到jar文件时,我的所有图像突然不再起作用。它们在Eclipse中运行良好,并且我已确保它们在jar文件中。我尝试使用get资源方法并制作一个图像加载器类来自动向上目录树,但它仍然失败。这是我所做的: 我将发送的路径如下所示:“ doc / icon.png” 我将所有图像放置在doc文件夹中,结构是最终项目,在内部有doc文件夹,然后是sr