簡體   English   中英

主機不會加載VST插件效果

[英]Host won't load VST plugin effect

我一直在嘗試編寫一個簡單的VST插件。 它不需要任何精美的界面,只需幾個控件。 但是我不知道從哪里開始。 開始巨大的文字牆。

我一直在研究宗教四處撒網關於這個主題的信息和指南,但到目前為止,我已經找到了最好的是這個這個頁面。 盡管它們很好,但我似乎無法使用這些源重新創建程序。

作為參考,我使用的是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);
}

好的,我要使用的“方法”是:根據之前的兩個指南,要制作成功的插件,您至少需要從音頻effectx派生您的插件,並覆蓋實際執行的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的任何派生形式(將其作為其構造函數中的一個參數)-我在諧調器中提供了注釋掉的函數。

另外,我注意到許多較新的來源都包括另一個“主要” cpp文件(dllmain.cpp,位於\\public.sdk\\source\\main ,該文件為InitModuleDeInitModule定義了導出,但不再createEffectInstance了。這讓我感到createEffectInstance 。他們也似乎是從AudioEffect (no x)或SingleComponentEffect (似乎要復雜得多?)。

最重要的是,由於缺少許多常量,並且定義駐留在許多不同的文件中,因此我似乎無法使begin_factory正常工作。 您是否應該將整個SDL添加到您的項目中? 多數民眾贊成在6,000個文件。

TL; DR

什么都沒有真正起作用,我似乎也沒頭緒。 捆綁的源樣本可以工作,但是它們都以不同方式處理創建VST的“方法”。 認真地,任何指導或幫助將不勝感激。 我正在嘗試將其創建為應用程序的一部分,而其他所有工作都已經完成。

我一直在嘗試編寫一個簡單的VST插件。 它不需要任何精美的界面,只需幾個控件。 但是我不知道從哪里開始。 開始巨大的文字牆。

首先編譯SDK隨附的示例插件。 然后使用您自己的裸露插件復制該文件。 從那里繼續建造。

這是不同版本的VST之間的區別嗎? 2/3?

VST 2和VST 3是不同的格式。 我建議您構建VST 2.4插件,除非您有特定的理由構建VST 3插件。 VST 2.4得到許多主機的廣泛支持,並且可能還會持續幾年。 VST 3是一種較新的格式,但沒有得到廣泛的支持。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM