ホームに戻る
 VSTプラグイン制作メモ

0、はじめに

VSTプラグインとは音楽にかけるソフトウェアエフェクトのことで、
現在はエフェクトにとどまらずソフトシンセなどのソフト音源の役割も果たす。
もともとはSteinberg社のCubaseが始まりであったが、
仕様が公開されているのでSteinberg社製品以外でも利用されている。
プラグインを作るためのSDKはドイツのSteinberg社のサイトで手に入る。
SDKには必要なヘッダ群、サンプル、マニュアル(英語)が含まれる。
言語はC++で用意されたクラスを継承したクラスに必要な処理を加える。
最終的にはDLLとして製作し、利用時はホストアプリケーションに読み込ませる。

DLLの作成はVisualC++2008で作成できることを確認した。
作成の際には、必ず .def ファイルを使用すること。
リンカの設定で「インクリメンタル リンクを行う」に設定する。
また、モジュール定義ファイルに「./vstplug.def」などとして場所を設定する。
.def ファイルの中にはテキストで以下のように書いておけば良い。

EXPORTS
  VSTPluginMain
  main=VSTPluginMain

1、原理

一定間隔で処理前の波形がバッファに得られるので、
エフェクトの場合は加工して書き出し用のバッファに書き込む。
ソフトシンセなどは波形の入力が不要なので波形を書き出すのみ。
ソフトシンセは入力としてMIDIメッセージが必要となるが、
MIDIメッセージを受け取る仕組みもあるので問題無い。

2、プログラムとパラメータ

プラグインを作る前にプログラム数とパラメータ数を決める必要がある。
パラメータとは例えば「音量」などのパラメーターのこと。
プログラム数とはパラメータ群が何個あるかということになる。
ホストプログラムは起動する際にプログラム数とパラメータ数を得て、
プログラムごとに各パラメータの数値を初期化する。
setProgram や setParameter や getParameter はこれらの処理をする。
これらは Cubase の内部からも呼ばれるので適切に処理を書くこと。

3、コンストラクタ

コンストラクタ内でどういったプラグインであるかを定義できる。

setNumInputs(2);

波形の入力は2チャンネル。

setNumOutputs(2);

波形の出力は2チャンネル。

setUniqueID('Smpl');

プログラムのID。

canMono();

モノラル入力であればステレオに置き換える。

isSynth(true);

シンセプログラムである。

canProcessReplacing();  

累積エフェクトと置き換えエフェクトを両方使える。
(通常は累積エフェクトのみである。)

4、音の概要

 音質の概要

サンプリングレートは波形の「横」に対応
44100Hz では1秒間にデータが44100個ある
44100Hz では 22050Hz よりも同じ時間に2倍のデータを持つことになる
ビットはは波形の「縦」に対応
16ビットや24ビットがある。
CDは44100Hzで16ビットが標準である。
DTMでは48000Hzで24ビットなどより高い精度で作成し、
CDの44100Hzで16ビットに落とすことが多い。

 音の概念

1秒間に波がいくつ現れるか?
その回数を周波数と呼ぶ。
上がって下がって上がって元の位置に戻って1つの波とすると、
1秒間に400回これが繰り返されれば周波数は 400Hz である。
これをコンピュータのメモリ上に配置するには、
配列の先頭からその波の高さ情報を記録していけば良い。
ほとんどのPCはバッファに波情報をため込み、
一定間隔でサウンドデバイスに転送することで音を出している。

 音階の概要

ド(C)から1オクターブは12音
C C+ B B+ D F F+ G G+ A A+ B
1オクターブ上がると音の周波数は2倍
オクターブ3の「ラ」の周波数は220Hz
よってオクターブ4の「ラ」の周波数は2倍の440Hz
ちなみに「ラ#」は 440×2^(1/12)=466.164Hz
MIDIで表現できる音階は 0(0x00) から 127(0x7F) まで
これはオクターブ−2の C から オクターブ8の G までに対応

 音色の概念

音色は波形の形による。

5、WAVEのファイル形式

4byte: 'RIFF' の4文字
4byte: これ以降のファイルサイズ (filesize-8)
4byte: 'WAVE' の4文字

 fmt

4byte: 'fmt ' の4文字
4byte: 以降のfmtのサイズ (fmtsize-8)
2byte: フォーマット PCMの場合 1
2byte: チャンネル モノラルの場合 1 ステレオの場合 2
4byte: サンプリングレート 44100hzなど
4byte: データ速度 (byte/sec) 44100hz ステレオ 16bit の時 44100 * 2 * 2
2byte: ブロックサイズ ステレオ 16bit の時 2 * 2
2byte: ビット数 16bitの時 16
nbyte: 拡張領域

 data

4byte: 'data' の4文字
4byte: 以降のdataのサイズ (datasize-8)

以降データ・・
ステレオならば L R L R L R … の順番

6、MIDIメッセージの概要

0x00から0xFFが何を意味するか?について
まずMIDIメッセージは待ち時間と交互に訪れる
MIDIメッセージが2回連続で続く場合でも必ず間で待ち時間を 0 だけ待つ
0x00〜0x7Fまでは待ち時間をあらわすに使う
0x80〜0xFFまでがMIDIメッセージ
紛らわしいのは0x80〜0x8Fも待ち時間に使われることだが
MIDIメッセージと待ち時間が交互 ということで区別する
以降 n はチャンネルを表すものとする

消音(最初のバイト:0x8n)
2バイトめは音階 0x00〜0x7F
3バイトめは必ず 0x00

発音(最初のバイト:0x9n)
2バイトめは音階 0x00〜0x7F
3バイトめはベロシティ(キーを押す強さ) 0x00〜0x7F

ポリフォニックキープレッシャ(アフタータッチ)(最初のバイト:0xAn)
2バイトめは音階 0x00〜0x7F
3バイトめは強さ 0x00〜0x7F

コントロールチェンジ(最初のバイト:0xBn)
2バイトめは
モジュレーションだと 0x01
音量だと 0x07
パン(左右の定位)だと 0x0A
など他いろいろ
3バイトめは各ステータス 0x00〜0x7F

楽器(最初のバイト:0xCn)
2バイトめは楽器 0x00〜0x7F

チャネルプレッシャ (アフタータッチ) (最初のバイト:0xDn)
2バイトめは強さ 0x00〜0x7F

ピッチベンド(最初のバイト:0xEn)
2バイトめは ??? (わかりません)
3バイトめはピッチ 0x00〜0x7F (真中は0x40)

MIDIエクスクルーシブデータ (最初のバイト:0xFO)
2バイトめはデータサイズ
3バイト以降はデータサイズぶんのエクスクルーシブデータが続く

制御用コード (最初のバイト:0xFF)
2バイトめは制御の種類
03 タイトル
04 チャンネル名
20 チャンネル番号
2F トラック終了
51 テンポ
58 拍子
59 移調
3バイトめはデータサイズ
4バイト以降はデータサイズぶんの制御用コードが続く

7、エフェクトのアイデア

空間系は現在の波情報を後の波情報に足すなどする。
音量系は縦情報に掛け算する処理を書く。
周波数ごとの処理には FIR や IIR や FFT などを用いる。

8、シンセのアイデア

波形を描き足したり掛けたり変形させる処理を書く。
減算方式でオシレータの波形をフィルターで削るなど。
実際のシンセサイザーの原理を勉強すると良い。
WAVEをサンプリングする方法もある。
ピッチやモジュレーションなどの処理も自力で書く必要がある。

inserted by FC2 system