VSTe 何も音響処理をしない入力をそのまま出力する処理

提供:yonewiki
2023年5月1日 (月) 19:14時点におけるYo-net (トーク | 投稿記録)による版

概要

 まずは、基礎として何もしないエフェクト処理を作ってみたいと思います。こつこつ手作業版のプロジェクトを仕上げていくイメージですが、最初の方は自動生成したVSTプロジェクトでは既にもう準備されている部分になるので、自動生成されたプロジェクトの構造とも見比べながらやってみたいと思います。


  • 1.自動生成されたプロジェクトでも読み込まれているdllmain.cppを取り込む作業をします。


  • ソリューションエクスプローラのプロジェクト名を右クリックして表示されるメニューから[追加]-[既存の項目]を選択するか[Shift]+[Alt]+[A]キーを押します。


  • VSTのSDKの中のC:¥SDK¥VST_SDK¥vst3sdk¥public.sdk¥source¥main¥dllmain.cppファイルを選択します。
 このファイルは変更を加えませんが、エントリポイント(プログラムが起動したときに最初に呼び出される関数)となる。
BOOL WINAPI DllMain (HINSTANCE hInst, DWORD dwReason, LPVOID /*lpvReserved*/)
 という関数を含んでいます。開始関数は自分で作るのではなく、配布されているSDKセットの関数を取り込むのが普通なようです。dllmain.cppとは長い付き合いになりそうですね。


  • 2.ヘッダファイルとソースファイルの組み合わせを追加します。
  • ソリューションエクスプローラのプロジェクト名を右クリックして表示されるメニューから[追加]-[新しい項目]を選択するか[Ctrl]+[Shift]+[A]キーを押します。


表示されるダイアログで、myvst.h と myvst.cpp としましょうか?好きなファイル名でいいです。自動生成版では4つのヘッダファイルと3つのソースファイルに分割して記述されていて、
  • $(Prefix)cids.h
  • $(Prefix)controller.h
  • $(Prefix)processor.h
  • version.h
  • $(Prefix)controller.cpp
  • $(Prefix)processor.cpp
  • $(Prefix)entry.cpp

に記述されます。コツコツ版ではmyvst.hとmyvst.cppというファイル名に集約することにしたいと思います。

myvst.h に以下のようなコードを記述します。
#pragma once

//VST3 SDKのヘッダファイル
#include "pluginterfaces\base\funknown.h"
#include "public.sdk/source/vst/vstaudioeffect.h"
#include "public.sdk/source/vst/vsteditcontroller.h"
#include "public.sdk/source/main/pluginfactory.h"

namespace Steinberg{
	namespace Vst{

#define MYVST_VENDOR "VST Company"
#define MYVST_URL    "https://wiki.yo-net.jp/"
#define MYVST_EMAIL  "mailto:xxxx@yo-net.jp"
#define MYVST_VSNAME "MyVST Name"
#define MYVST_VERSION "0"
#define MYVST_SUBCATEGORIES Vst::PlugType::kFx


static const FUID ProcessorUID(0x1923FE24, 0x425D4929, 0xB5758504, 0x86D2D555);
static const FUID ProcessorUID(0xFA81F9F7, 0x7968462D, 0xB9396332, 0x343FB4D1);


class MyVSTProcessor : public AudioEffect
{
public:
	MyVSTProcessor();

	tresult PLUGIN_API initialize(FUnknown* context) SMTG_OVERRIDE;

	tresult PLUGIN_API process(ProcessData& data) SMTG_OVERRIDE;

	static FUnknown* createInstance(void*) { return (IAudioProcessor*)new MyVSTProcessor(); }
};

class MyVSTController : public EditController
{
	tresult PLUGIN_API initialize(FUnknown* context) SMTG_OVERRIDE;

	static FUnknown* createInstance(void*) { return (IEditController*)new MyVSTController(); }
};
}}