TIPS
ある程度集まったらまとめるなりなんなり
VST3.0?VST2.4?
VST3.0に対応しているホストは現時点でも多いとは言えない(らしい)ので、
Cubase専用とかにするのでなければ2.4がよい。
VST2.4SDKのサンプル(vstxsynth)について
ビルドについて
VisualStudio用のプロジェクトファイルが付属しているので、それを使えば簡単にビルドできる。
自分で一からプロジェクトを作る場合には、プロジェクトにSDKをインポートするなどして呼び出せるようにする必要があるが、
dllのビルド時には、外部から呼び出せる関数名をdefファイルで指定する必要があることにも注意。
(プロジェクトのプロパティ->構成プロパティ->リンカー->入力->モジュール定義ファイル)
基本的に、public.sdk/samples/vst2.x/win/vstplug.defと同じ内容でよい(はず)。
サンプルの問題点(仕様)
ソースにも「これのシンセ部分参考にすんな(意訳)」と書いてあるとおり、いろいろ問題点があります。
- エイリアシング(折り返し雑音)対策がない
- 内部で持っている波形の位相がfloatでかつどんどん大きくなる一方である
- 実際に聞いてみればわかるが、このサンプルには同じノートを伸ばし続けると途中でピッチが変わるという不具合がある
- 位相の値が大きくなると小さい部分の精度が悪くなってくるのが原因(浮動小数点なので)
- 位相を常に(2πを引いたりして)一定の範囲に納めれば問題ないが、固定小数点にしたほうがよいと思われる
- あとテーブル参照するにしても一次補間ぐらいはしたほうが多分いい
- MIDIノートのハンドリング部分
- モノフォニックの場合、CのnoteOn、DのnoteOn、CのnoteOff、と続いた場合Dが鳴り続けるべき(であると思う)
- noteOffがvelocity 0のnoteOnで代用されることがあるのが問題で、CのnoteOn、DのnoteOn、CのnoteOn(velocity 0)と解釈され、音が止まる
- velocityが0のnoteOnを特別扱いすることによって解決する
音量
人間の耳は音の大きさを対数尺で知覚するらしいので、音量の変化は少し工夫する必要があるっぽい。
例えば
このページのエンベロープフィルターの図を見てみると、
Attackは(たぶん振幅が)線形に変化してるが、SustainとReleaseはこうなんか凹んだ感じで変化させてるっぽい。
実際Releaseなどを線形に変化させると急に音が消える感じになって不自然であった。
で、具体的にどんな曲線がいいかはちょっと物理に詳しい人頼む。
あと周波数の変化も指数的に変化させたりするみたい。
MIDI note → 周波数(Hz)
pow(2, ((double)noteNo - 69.0 + cent / 100.0) / 12.0) * 440.0
最終更新:2012年04月12日 13:11