「続:VSTを作ろう!」の編集履歴(バックアップ)一覧はこちら
続:VSTを作ろう! - (2010/03/26 (金) 01:31:59) の1つ前との変更点
追加された行は緑色になります。
削除された行は赤色になります。
**続:VSTを作ろう!
さて、突発的に「そういえばVSTを作ってみるのも面白いかも・・・まぁ作れなくてもそのプロセスを知ってれば作曲に有利じゃね?」ってことで調べてみることに。
*まずはSDKを使ってみよう計画
いろいろサイト見てみたけどやっぱりVST作ろうなんて考える人はあまりいないみたいで、情報が少なすぎる!仕方ないのでSteinBergが出しているキットをいじりつつ作れるかなぁと期待をこめてやるのもいいということでw
というわけで今回は定番のVC++でSDKのサンプルを構築し、その仕様についてちょっと考察してみたいと思います。
まずプロジェクトに以下のようなフォルダを入れます。
&ref(Againfiles.jpg)
サンプルが入っているのはpublicほにゃららというフォルダの下です。
&ref(Againfiles2.jpg)
今回は私が持っているのがVC2005なので、そのプロジェクトファイルで構築してみることにします。といってもこのプロジェクトファイルをダブルクリックしてコンパイルするだけwww
どうやら出来上がったファイルは私の環境だと
C:\Program Files\Common Files\vst3\steinberg
とかに出来上がったので、それをホストで検索かけるようにしてあげて立ち上げると・・・
&ref(AgainVST3.jpg)
一応なんかできてインサートできるみたいです。ゲインをかえるプラグインになってるのかな?
とまぁVSTらしきものはこれで一応作ったことにはなりますが、この段階ではとても胸を張って「VSTが作れて音が制御できます!」とは言えないですね。これからすべきことはいっぱいありますが、いくつか代表的なものを挙げると以下のようになるでしょう。
・GUIとソースの関連性を把握しないといけない。
例えばこのサンプルでスライダがありますが、それらの画像はBMPのリソースになっていました。当然VSTはGUIがしっかりしていないといけませんから、画面に自分が用意したパーツを貼らないといけません。これがダイアログボックス上にボタンを貼る感じなのか、はたまたデバイスコンテキストをいじる感じなのか把握しないといけません。またここでユーザーが変更したステータスがどのようなメッセージでプログラム本体に送られてくるのかも把握しないといけません。
・音データの入出力の制御を把握しないといけない
おそらくいくつかのタイムスライスで、特定のバッファにホストのトラックから送られてきた音のディジタルデータがリアルタイムで送られてくるものと思われます。おそらくコールバック関数か何かで自動的にその関数が呼び出され、その引数がバッファになっているのではないかと予想します。そしてその関数の出力として特定のバッファに計算結果を流しこんで制御をホストに戻して抜けるのではないかと・・・。
・プリセットとかどうなるの?
プリセットならず、プロジェクトを保存して、再び読み込み直して再開した時にプラグインが初期化されていたらダメですよね。このサンプルならスライダの位置。これはどこに保存されるのでしょうか?またホストが起動して自動的に前回終了したプラグインを読み込むとき、その状態はどのようにしてプラグインに「このように設定して再開してね」と伝えているのでしょうか?恐らくはコンストラクタなどに鍵があると思われるのですが・・・はてさて。
・遅延とかバッファサイズとかフォーマットとか
これを考えるのはとりあえず後回しにしてもいいと思いますが、気になりますよね。これらの情報の来かたとそれらの管理の仕方をいずれ考えないといけません。少なくともプラグインの持つ遅延度合いはホストに反してあげないと同期とれないと思うんだけど・・・・?
とりあえずいくつかサイトを見て調べてみると
AudioEffect
というクラスがあって、それがホストとの音データの受け渡しの制御を担っているらしいということ、そしてそれを派生してあげることによってVST内の音データの制御が可能になるらしいという情報を見つけました。というわけでサンプルをこれで検索かけて調べてみると・・・
&ref(Againsource1.jpg)
ありましたね。まだAudioEffectがどういう機能を持つクラスかはわかりませんが、このサンプルもこれを派生させて何かをしているみたいです。後はこのサンプルの機能がどこに実装されているのか、そのソースの所在をつきつめていけば少し解明できそうな気がします。
**続:VSTを作ろう!
さて、突発的に「そういえばVSTを作ってみるのも面白いかも・・・まぁ作れなくてもそのプロセスを知ってれば作曲に有利じゃね?」ってことで調べてみることに。
*まずはSDKを使ってみよう計画
いろいろサイト見てみたけどやっぱりVST作ろうなんて考える人はあまりいないみたいで、情報が少なすぎる!仕方ないのでSteinBergが出しているキットをいじりつつ作れるかなぁと期待をこめてやるのもいいということでw
というわけで今回は定番のVC++でSDKのサンプルを構築し、その仕様についてちょっと考察してみたいと思います。
まずプロジェクトに以下のようなフォルダを入れます。
&ref(Againfiles.jpg)
サンプルが入っているのはpublicほにゃららというフォルダの下です。
&ref(Againfiles2.jpg)
今回は私が持っているのがVC2005なので、そのプロジェクトファイルで構築してみることにします。といってもこのプロジェクトファイルをダブルクリックしてコンパイルするだけwww
どうやら出来上がったファイルは私の環境だと
C:\Program Files\Common Files\vst3\steinberg
とかに出来上がったので、それをホストで検索かけるようにしてあげて立ち上げると・・・
&ref(AgainVST3.jpg)
一応なんかできてインサートできるみたいです。ゲインをかえるプラグインになってるのかな?
とまぁVSTらしきものはこれで一応作ったことにはなりますが、この段階ではとても胸を張って「VSTが作れて音が制御できます!」とは言えないですね。これからすべきことはいっぱいありますが、いくつか代表的なものを挙げると以下のようになるでしょう。
・GUIとソースの関連性を把握しないといけない。
例えばこのサンプルでスライダがありますが、それらの画像はBMPのリソースになっていました。当然VSTはGUIがしっかりしていないといけませんから、画面に自分が用意したパーツを貼らないといけません。これがダイアログボックス上にボタンを貼る感じなのか、はたまたデバイスコンテキストをいじる感じなのか把握しないといけません。またここでユーザーが変更したステータスがどのようなメッセージでプログラム本体に送られてくるのかも把握しないといけません。
・音データの入出力の制御を把握しないといけない
おそらくいくつかのタイムスライスで、特定のバッファにホストのトラックから送られてきた音のディジタルデータがリアルタイムで送られてくるものと思われます。おそらくコールバック関数か何かで自動的にその関数が呼び出され、その引数がバッファになっているのではないかと予想します。そしてその関数の出力として特定のバッファに計算結果を流しこんで制御をホストに戻して抜けるのではないかと・・・。
・プリセットとかどうなるの?
プリセットならず、プロジェクトを保存して、再び読み込み直して再開した時にプラグインが初期化されていたらダメですよね。このサンプルならスライダの位置。これはどこに保存されるのでしょうか?またホストが起動して自動的に前回終了したプラグインを読み込むとき、その状態はどのようにしてプラグインに「このように設定して再開してね」と伝えているのでしょうか?恐らくはコンストラクタなどに鍵があると思われるのですが・・・はてさて。
・遅延とかバッファサイズとかフォーマットとか
これを考えるのはとりあえず後回しにしてもいいと思いますが、気になりますよね。これらの情報の来かたとそれらの管理の仕方をいずれ考えないといけません。少なくともプラグインの持つ遅延度合いはホストに反してあげないと同期とれないと思うんだけど・・・・?
とりあえずいくつかサイトを見て調べてみると
AudioEffect
というクラスがあって、それがホストとの音データの受け渡しの制御を担っているらしいということ、そしてそれを派生してあげることによってVST内の音データの制御が可能になるらしいという情報を見つけました。というわけでサンプルをこれで検索かけて調べてみると・・・
&ref(Againsource1.jpg)
ありましたね。まだAudioEffectがどういう機能を持つクラスかはわかりませんが、このサンプルもこれを派生させて何かをしているみたいです。後はこのサンプルの機能がどこに実装されているのか、そのソースの所在をつきつめていけば少し解明できそうな気がします。あとどうでもいいけどcontructorじゃなくてconstructorだろうなぁw