Хост не будет загружать эффект плагина VST

Я пытался написать простой плагин VST. Это не нуждается в каких-либо причудливых интерфейсах, просто несколько элементов управления. Но я не знаю с чего начать. Начните огромную стену текста.

Я проводил религиозные исследования в сети для получения информации и руководств по этой теме, но лучшее, что я нашел на данный момент, это этот а также этот стр. Хотя они хороши, я не могу воссоздать программу с использованием этих источников.

Для справки я использую VST SDK 3.5.2 и MSVC 2010.

Я добавил папку \public.sdk\source\vst2.x в мой проект (который включает в себя источник для аудиоэффекта & 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);
}

Хорошо, «метод», который я использую, таков: согласно обоим предыдущим руководствам, чтобы создать успешный плагин, вам, по крайней мере, нужно извлечь его из аудио-эффекта и переопределить process() а также processReplacing() которые делают фактическую обработку.

Остальные были добавлены в надежде, что это что-то сделает. Более того, экспортируемая функция createEffectInstance() возвращает новый экземпляр плагина. vstplugmain.cpp содержит dllmain и экспортируемую функцию VstPlugMain который получает аудио-мастер обратного вызова и возвращает createEffectInstance(callback),

IMO, это похоже на рабочий метод и воссоздание (насколько я вижу) двух руководств, представленных ранее. Плагин определен и есть интерфейс между плагином и хостом, который позволяет создавать его экземпляры. Что мне не хватает? Гид говорит, что это все, что вам нужно.

Это разница между разными версиями VST? 2/3?

Таким образом, я не мог заставить VstPluginTestHost в комплекте работать, он не мог найти мой VST. Я попробовал валидатор и, пройдя через это, я обнаружил, что, поскольку моя программа не экспортирует функцию с именем GetPluginFactoryотбрасывается. Хорошо, понятно, но ни один из гидов ничего не говорит об этом.

Поиск в бесконечном количестве источников, кажется, некоторые источники VST добавляют этот загадочный отрывок внизу (код взят из AGainSimple.cpp):

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

Который, кажется, экспортирует интерфейс, который дает хосту некоторую основную информацию и интерфейс для создания плагина. НО. я думал createEffectInstance сделал это. Теперь есть новая функция под названием createInstance, Есть ли разница? Сигнатуры функций предполагают createInstance НЕ получает обратный вызов audiomaster и, следовательно, не может создать экземпляр какого-либо производного AudioEffect (который принимает это в качестве параметра в своем конструкторе) — я предоставил закомментированную функцию в harmonicmodulator.h.

Кроме того, я заметил, что многие новые источники включают другой «основной» файл cpp (dllmain.cpp, в \public.sdk\source\main, который определяет экспорт для InitModule а также DeInitModule, но нет createEffectInstance больше. Это головокружительно меня. Они также, похоже, происходят от AudioEffect (нет х) или SingleComponentEffect (кажется, намного сложнее? лол).

Кроме того, я не могу понять, что begin_factory материал работает из-за большого количества отсутствующих констант и определений, которые находятся во многих различных файлах. Вы должны добавить весь SDL в свой проект? Это 6000 файлов.

TL; DR

Ничего действительно не работает, и я не могу понять, как. Связанные исходные примеры работают, но все они по-разному подходят к «методу» создания VST. Серьезно, любое руководство или помощь будут так оценены. Я пытаюсь создать это как часть приложения, и все остальное у меня получилось.

2

Решение

Я пытался написать простой плагин VST. Это не нужно
модные интерфейсы, всего несколько элементов управления. Но я не знаю куда
Начните. Начните огромную стену текста.

Начните с компиляции примеров плагинов, которые поставляются с SDK. Затем продублируйте это своим собственным плагином. Продолжайте строить оттуда.

Это разница между разными версиями VST? 2/3?

VST 2 и VST 3 — это разные форматы. Я бы порекомендовал создать плагин VST 2.4, если у вас нет особых причин для создания плагина VST 3. VST 2.4 широко поддерживается многими хостами и, вероятно, будет работать еще несколько лет. VST 3 является более новым форматом, но не так широко поддерживается.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]