シンプルな VST プラグインを作成しようとしています。派手なインターフェイスは必要なく、いくつかのコントロールが必要です。しかし、どこから始めればよいかわかりません。テキストの巨大な壁を開始します。
私はこのトピックに関する情報とガイドを求めてネット上で熱心に調査してきましたが、これまでに見つけた最良のものはこのページとこのページです. それらは優れていますが、それらのソースを使用してプログラムを再作成することはできないようです。
参考までに、私は VST SDK 3.5.2 と MSVC 2010 を使用しています。
このフォルダー\public.sdk\source\vst2.x
をプロジェクトに追加しました (これには、audioeffect と vstplugmain のソースが含まれています)。VSTプラグインエフェクトを動作させる/正しくエクスポートするために必要なことの簡単な箇条書きリストがどこかにあればいいのにと思います.
私が提供した最初の 2 つのリンクはうまく説明していますが、VST を作成する方法はその後変更されたようです。これは私のプログラムの骨組みであり、コンパイル中に VST ホストによって認識されません (ロード時のエラー)。
高調波変調器.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()
はプラグインの新しいインスタンスを返します。dllmain と、 audiomastercallback を受け取って を返すvstplugmain.cpp
エクスポートされた関数を保持します。VstPlugMain
createEffectInstance(callback)
IMO、それは以前に提供された2つのガイドの作業方法と再作成(私が見る限り)のようです. プラグインが定義されており、プラグインのインスタンスを作成できるプラグとホスト間のインターフェースがあります。私は何が欠けていますか?ガイドは、それだけで十分だと言っています。
これは 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 ファイル (との\public.sdk\source\main
エクスポートを定義するdllmain.cpp が含まれていることに気付きましたが、もうありません。これには目がくらみます。また、(no x) または(から派生しているようです)もっと複雑に見えますか? 笑)。InitModule
DeInitModule
createEffectInstance
AudioEffect
SingleComponentEffect
これに加えてbegin_factory
、多くの異なるファイルに存在する多くの定数と定義が欠落しているため、そのようなものを機能させることができないようです。SDL 全体をプロジェクトに追加することになっていますか? それは6,000ファイルです。
TL;DR
実際には何も機能せず、手がかりが得られないようです。バンドルされているソース サンプルは機能しますが、VST を作成する "方法" へのアプローチはすべて異なります。真剣に、どんなガイダンスや助けも大歓迎です。これをアプリケーションの一部として作成しようとしていますが、他のすべての作業はほぼ完了しています。