2013年8月13日火曜日

Cygwin で VST プラグイン制作

Steinberg 社が開発した VST  (Virtual Studio Technology)  は、DAW と
ソフトウェアシンセサイザー・エフェクタのプログラム間のインタフェースとなる標準的な規格です。

この規格のソフトウェア開発キット(SDK)は Steinberg 社が無料で公開しているため、
DAW 上で使えるシンセサイザーやエフェクタ(VSTプラグイン)は自作することができます。

VST プラグインの開発ですが、根本となる信号処理・MIDIの扱い方については、検索すれば参考となる文献・Web ページを見つけることができると思います。

しかし、VST の SDK を用いて、実際に DAW で使えるプログラムを作る、すなわちコードを動的リンクライブラリ化する ( *.dll を作る) 方法については、今のところ情報源が限られています。

いくつか VST プラグイン開発の参考となる Web ページ を列挙します。
下記のサイトでは、 Visual Studio を使って VST プラグインを開発しています。
Visual Studio は便利ですが、やはり個人的にはコマンドライン (Cygwin) で制作したい…
というわけで、Cygwin 上で VST プラグインを制作する方法を探してみたところ、以下の動画を見つけました。



この動画を参考にしながら、動作テスト程度に VSTプラグイン (エフェクタ) を制作してみました。

・プラグイン名: LR2RL
・効果: L と R の信号を入れ替える

(0) 準備
Cygwin: make, gcc (c++), dllwrap を使用出来る状態まで設定
vstsdk2.4: Steinberg のwebページより入手

(1) *.def 作成
以下のようなモジュール定義ファイル (.def) を作成します。
・LR2RL.def

LIBRARY LR2RL
DESCRIPTION "VSTe: LR2RL"
EXPORTS main=VSTPluginMain

2行目の"DESCRIPTION"は無くても良いので、実質 2行だけのテキストファイルです。

(2) LR2RL.cpp 作成
VST プラグインの本体です。
"C++でVST作り"を参考に、最小構成で組んでいます。
・LR2RL.cpp

#include "audioeffectx.h"

#define MY_VST_INPUT_NUM 2
#define MY_VST_OUTPUT_NUM 2
#define MY_VST_UNIQUE_ID 'SMPL'

#define MY_VST_PRESET_NUM 1
#define MY_VST_PARAMETER_NUM 0

class LR2RL : public AudioEffectX{
public:
  // Constructor
  LR2RL(audioMasterCallback audioMaster);

  // processReplacing
  virtual void processReplacing(float **inputs, float **outputs, VstInt32 sampleFrames);
};

AudioEffect* createEffectInstance(audioMasterCallback audioMaster){
  return new LR2RL(audioMaster);
}

// (1) Constructor
LR2RL::LR2RL(audioMasterCallback audioMaster) : AudioEffectX(audioMaster, MY_VST_PRESET_NUM, MY_VST_PARAMETER_NUM){
  setNumInputs(MY_VST_INPUT_NUM);
  setNumOutputs(MY_VST_OUTPUT_NUM);
  setUniqueID(MY_VST_UNIQUE_ID);

  isSynth (false);
  canProcessReplacing();
}

// (2) processReplacing
void LR2RL::processReplacing(float **inputs, float **outputs, VstInt32 sampleFrames){
  float *inL = inputs[0];
  float *inR = inputs[1];
  float *outL = outputs[0];
  float *outR = outputs[1];

  for(int i = 0; i < sampleFrames; i++){
    outR[i] = inL[i];
    outL[i] = inR[i];
  }
}

(3) makefile 作成
VST プラグイン作成の肝となるステップです。
・makefile

VSTPATH=/cygdrive/c/vstsdk2.4
VSTSRCPATH=/public.sdk/source/vst2.x

## plugin name
PLUGIN=LR2RL

CXX=gcc-3
CXXFLAGS=-I$(VSTPATH) -I$(VSTPATH)$(VSTSRCPATH) -DBUILDING_DLL -mno-cygwin
DLLWRAP=dllwrap --target=i386-mingw32

DLL=$(PLUGIN).dll

$(DLL): $(PLUGIN).o audioeffect.o audioeffectx.o vstplugmain.o
 $(DLLWRAP) --driver-name c++-3 -mno-cygwin --def $(PLUGIN).def $^ -o $@ 

audioeffect.o: $(VSTPATH)$(VSTSRCPATH)/audioeffect.cpp
 $(CXX) $(CXXFLAGS) -c $<
audioeffectx.o: $(VSTPATH)$(VSTSRCPATH)/audioeffectx.cpp
 $(CXX) $(CXXFLAGS) -c $<
vstplugmain.o: $(VSTPATH)$(VSTSRCPATH)/vstplugmain.cpp
 $(CXX) $(CXXFLAGS) -c $<

## Clean up
.PHONY: clean
clean:
 rm -f *.o

gcc (c++) で "-mno-cygwin" を使うためにバージョン指定をしていることに注意。

(4) make

LR2RL.dll 制作後、FL studio 10 で動作を確認しました。

0 件のコメント:

foobar2000でYouTubeの音楽を聞く

foo_youtube: Home インストール方法はこちら:  Foobar2000:How to install a component メリットとしては、 1) foobar 上で Youtube の音楽を聞ける(スペクトラムアナライザーやスペクトログラムを見た...