Tag: vst

VSTi開発メモ(CSliderの問題とノイズ)

またまた詰まったのでメモ。

 

一つ目は、vstcontrolが提供しているGUIパーツのCSliderで、透過PNGが扱えない問題。

CKnobのほうでは透過pngを使えているのだけど,CSliderではうまく表示できなくて詰まった。

どうやら、CSliderではCknobと違ってオフスクリーン描画ができるようになっていて、それが原因っぽい。オフスクリーンへの描画時(もしくはオフスクリーンからメインへの描画時)にアルファ情報が抜け落ちるようで、ここの内部処理はまだ読んでいないけど、とりあえず、

CSlider::drawでオフスクリーン描画をするかどうかのフラグ pOScreen を無理やりFALSEにすること

で今のところ解決している。

 

2つ目は発音するボイスを切り替えるタイミングとか、エンベロープジェネレータでの状態(AttackとかDecayとか)の切れ目でクリックノイズが発生してしまう問題。

クリックノイズというかもはやインパルスで、これが発生していると、DAWで作ったシンセを使おうと思った時にインパルスでだいたいのエフェクトプラグインが落ちる。とても困る。

内部のバグなのか、それとも設計が悪いのかがよくわからなくて、まだ解決できていない。解決策は
・バンドパスフィルタを通す
・発音の最初と最後に全部フェードをかける
とかだけど、2つ目の解決策はエンベロープ中にノイズがなる問題は解決できないし、ううん

VSTi開発メモ(GUIまわり)

最近、guiに手を出してみたら思った以上に闇が深かった。

かなり詰まったのでメモ。

VSTのGUパーツIは、サンプルコードではBMPを使うようになっているが、PNGもサポートしている。
PNGを使いたい場合、libpngを使う。
libpngはzlibに依存しているのでビルドには両方入手する必要がある。導入については以下。

http://xeo.sakura.ne.jp/wordpress/201202/program/361/

ビルドできたら、ライブラリディレクトリの設定からzlib.libとlibpng.libを取り込み、
インクルードディレクトリの設定からzlibとlibpngの各種ヘッダを取り込む。

 

次に、プリプロセッサの定義 で USE_LIBPNG を定義する。僕はこれをしていなくて詰まりました。
参考:http://teragonaudio.com/article/How-to-make-VST-plugins-in-Visual-Studio.html

 

さらに、僕が使った最新版のlibpngとzlibでは、vstgui.cppでエラーがでた。
http://planet.racket-lang.org/trac/ticket/292

上のリンクのように、
png_set_gray_1_2_4_to_8(png_ptr)

png_set_expand_gray_1_2_4_to_8(png_ptr)

と書き換えるとビルドが通り、GUIが表示される。

 

(なお、僕の環境はVS2012,vstsdk2.4,dllのテスト環境はVSTHostです。)

Maxでvstプラグインを書く

どうやら、Max6.1で、Genに(Vstプラグインとかを書くときに使える)Cのコードを吐き出す機能が追加されたようです。

僕の記憶では、確かMaxの4(Max/MSPと呼ばれてた時代)のときには、vstを吐き出す機能があったと思うのだけれど、5,6でなくなっていました。それが復活したと。

なお、この記事は既にC++でvstプラグインを書いたことがある人を対象にしています。あんまりイメージがつかめていないひとは、こことかを読むと良いと思います。

 

手順は、Cycling’74のwikiに乗っている通りですが、解説します。僕はwinユーザーなので、VisualStudioを使ってコンパイルする場合で書きます。

http://cycling74.com/wiki/index.php?title=Gen_Code_Export_VST

 

①Maxを6.1にアップグレードする

上にもかきましたが、Max6.1じゃないとこの機能は使えません。あと当たり前ですが、Genも買ってないとだめ。

 

②コンパイル環境を入手する

vstプラグインを書く人なら大丈夫だとは思いますが、XcodeもしくはVisualStudioの2010以降が必要。(僕はVS2012で試しました。)

 

③SteinbergからVST2.4のSDKを落とす

http://www.steinberg.net/en/company/developer.html

から3rd Party Developer登録をして、SDKを入手します。Genのexportcode機能はVST2.4までしか対応してなくて3.x以降は未対応なので注意。

 

④Max上で,gen~の中にvstプラグインに吐き出したい処理を書く

 

⑤作ったgen~オブジェクトにexportcodeメッセージを送る

この辺はMax上でgen~のヘルプを読んでも良いかもですね。

メッセージを送ると、gen_exported.cppとgen_exported.hというファイルが生成されます。

 

⑥wikiからサンプルコードを落とす

http://cycling74.com/wiki/index.php?title=Gen_Code_Export_VST

からMyVSTPlugin.zipをダウンロードします。

 

⑦落としたサンプルコードのプロジェクトを開く

winの場合はVS2010用のプロジェクトが用意されてますが、VS2012で開いて、それ用にコンバートしてしまっても大丈夫みたいです。

開いたらリソースに、先程落としたVST2.4のSDK内のvstsdk2.4\public.sdk\source\vst2.xの中身を加えます。ここは普通にC++で直接vstプラグインを書く時と同じですね。

さらに、さっきgenでexportした2つのファイルを、サンプルコードのフォルダにある同名ファイルに上書きします。

 

⑧コンパイル

コンパイルします。するとdllが吐き出されます。

動きます。ヽ(‘ω’)ノ三ヽ(‘ω’)ノ

普通にVS2012でvstプラグインを書くときは、プロジェクトの設定とかdll吐き出すときの設定をしないといけないですが、今回はサンプルコードを改造する形で作るのでそのへんは必要ないです。すばらしい└( ‘ω’)┘

 

 

まとめ

音声処理を行う部分を、genで吐き出すことができる感じです。いきなりdllが吐き出されるわけではない。
ただそれでも十分有用なので、max6.1+genを持っているvstプラグイン開発者の人は、使ってみると面白いと思います。

とにかく、Maxでvstプラグイン書けるって、すごいことです。
実際にどんな音がでるのか確かめながらパッチを作っていって、完成したらそれがそのままCのコードになるんだからすごい。

手で書くときは、いちいちコードを書き換えて→コンパイルして→聴いて確かめて→ってことを繰り返さないといけないわけですからめっちゃめんどいわけです。

 

まだこの機能はベータ版らしいですが、十分使えます。僕も折角持っているので、使っていこうと思います。

 

だいぶ雑な感じでしたが、おしまい。

 

※余談ですが、Max6.1の日本語化パッチが出てるっぽいです。
https://www.mi7.co.jp/products/cycling74/downloads/
6.0は日本語から英語にもどすのがファイル操作とかしなくちゃいけなくてちょっと面倒でしたが、6.1では楽になってます。