2012-12-25 2 views
2

저는 간단한 VST 플러그인을 작성하려고했습니다. 그것은 멋진 인터페이스, 몇 가지 컨트롤이 필요하지 않습니다. 그러나 나는 어디에서 시작해야할지 모른다. 거대한 텍스트 벽을 시작하십시오.호스트가 VST 플러그인 효과를로드하지 않습니다

저는이 주제에 관한 정보와 안내서를 인터넷을 통해 종교적으로 연구하고 있습니다. 그러나 지금까지 발견 한 내용 중 가장 좋은 것은 thisthis 페이지입니다. 좋은 소식이지만, 나는 그 소스를 사용하는 프로그램을 다시 만들 수없는 것 같습니다. 참고로

, 내가 VST의 SDK 3.5.2 및 MSVC 2010

를 사용하고 난 (audioeffect & vstplugmain의 소스 포함) 내 프로젝트에 폴더 \public.sdk\source\vst2.x을 추가했습니다. 정말 작동하는 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); 
} 

을 사용하여 "방법"I'mm가 좋아 : 이전 가이드의 양쪽에 따르면, 성공을 위해 플러그인을 사용하려면 적어도 오디오 이펙트에서 플러그인을 파생시키고 실제 처리를 수행하는 process()processReplacing()을 재정의해야합니다.

나머지는 뭔가 할 수 있기를 기대하면서 추가되었습니다. 또한 내 보낸 함수 createEffectInstance()은 플러그인의 새 인스턴스를 반환합니다. vstplugmain.cpp에는 dllmain 및 내 보낸 함수 VstPlugMain이 있으며 audiomastercallback을 수신하고 createEffectInstance(callback)을 반환합니다.

IMO, 이는 이전에 제공된 두 가이드 중 작업 방법 및 재 작성 (내가 볼 수있는 한)처럼 보입니다. 플러그인이 정의되고 인스턴스를 작성할 수있는 플러그와 호스트 사이의 인터페이스가 있습니다. 내가 뭘 놓치고 있니? 가이드는 당신이 필요로하는 것이 전부라고 말했습니다.

다른 VST 버전의 차이점이 있습니까? 2/3?

VstPluginTestHost를 번들로 묶어서 VST를 찾을 수 없습니다. 나는 유효성 검사기를 시험해 보았고, 그 과정을 밟아 보니 내 프로그램이 GetPluginFactory이라는 함수를 내 보내지 않았기 때문에 버려졌습니다. 좋아, 이해할 수는 있지만 가이드의 아무도 이것에 대해 아무 것도 말하지 않는다. 호스트 일부를 제공하는 인터페이스를 내보낼 것

BEGIN_FACTORY_DEF ("Steinberg Media Technologies", 
    "http://www.steinberg.net", 
    "mailto:[email protected]") 
    //---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 

: 소스의 끝없는 양을 통해 검색

, 어떤 VST 소스가 (AGainSimple.cpp에서 가져온 코드) 하단에이 비밀 통로를 추가 할 것 기본 정보 및 플러그인 작성을위한 인터페이스를 제공합니다. 그러나. 나는 createEffectInstance이 이것을했다고 생각했다. 이제 createInstance이라는 새로운 기능이 있습니다. 차이점이 있습니까?함수 서명에 따르면 createInstance은 audiomaster 콜백을받지 못하므로 생성자에서 매개 변수로 사용되는 AudioEffect 파생물을 인스턴스화 할 수 없습니다.이 함수는 harmonicmodulator.h에 주석 처리되어 있습니다.

또한, 나는 많은 새로운 소스 InitModuleDeInitModule에 대한 수출을 정의 \public.sdk\source\main에서 또 다른 "주요"CPP 파일 (dllmain.cpp,하지만 더 이상 아무 createEffectInstance을 포함하는 것으로 나타났습니다.이 날 어지럽게한다. 또한 도출하는 것 하나 AudioEffect (질소 산화물) 또는 SingleComponentEffect이 (훨씬 더 복잡한 것 같다? 롤)에서.

이 위에, 나는 begin_factory 물건 때문에 누락 된 상수와 정의의 많은 작업 것을 얻이 수없는 것 SDL을 프로젝트에 추가해야합니까? 6,000 개의 파일이 있습니다.

TL; DR

아무것도 실제로 작동하지 않으며 단서를 얻을 수 없습니다. 번들 된 소스 샘플은 작동하지만 모두 VST를 만드는 "방법"에 다르게 접근합니다. 진지하게, 어떤 안내 나 도움도 감사 할 것입니다. 나는 이것을 응용 프로그램의 일부로 만들려고 노력 중이며 그 밖의 모든 것들은 꽤 잘 만들어 냈습니다.

답변

1

나는 간단한 VST 플러그인을 작성하려고 노력해 왔습니다. 모든 인터페이스는 이며, 몇 가지 컨트롤이 필요하지 않습니다. 그러나 나는 어디로 시작 해야할지 모르겠다. 거대한 텍스트 벽을 시작하십시오.

SDK와 함께 제공되는 예제 플러그인을 컴파일하여 시작하십시오. 그런 다음 자신의 베어 본 플러그인으로 복제하십시오. 거기에서 계속해서 건물을 짓는다.

다른 VST 버전의 차이점이 있습니까? 2/3?

VST 2와 VST 3은 서로 다른 형식입니다. 나는 당신이 VST 3 plguin을 구축 할 특별한 이유가 없다면 VST 2.4 플러그인을 구축 할 것을 권장합니다. VST 2.4는 많은 호스트에 의해 광범위하게 지원되며, 앞으로 몇 년 동안 계속 될 것입니다. VST 3은 새로운 형식이지만 광범위하게 지원되지는 않습니다.

+0

감사합니다. 처음에는 vst 버전이 이전 버전과 호환되었으므로 최신 버전이 좋다고 생각했습니다. 게시물에서 말했듯이, 나는 묶인 플러그인을 시험해 보았다.하지만 그들은 나에게서 혼란을 겪었다. (심지어 작은 에이전시도 소스가 118kb였다.)하지만 2.4 SDK를 가져 와서 여기에 결과를 가져온다. – Shaggi

+0

vst sdk 2.4로 빌드하면 배트에서 바로 사용할 수 있습니다. 나는 일종의 3.5에 너무 많은 시간을 낭비하는 얼굴을 쳤다. 어쨌든 고마워. – Shaggi

+0

@Shaggi : 문제 없습니다. 다행히도 2.4 작업이 너무 어렵지 않다는 소식을 듣고 다행합니다. :) – Shannon

관련 문제