したらばTOP ■掲示板に戻る■ 全部 1-100 最新50 | |

はじめまして。

1shun:2011/05/01(日) 15:46:24
はじめまして。
個人的にVSTプラグインの開発に挑戦しています、shunと申します。

VST開発の情報を探していたところ、このページを見つけました。
とても有益な情報をありがとうございます。

今後こちらの掲示板の方に質問などを書き込ませていただくことがあるかもしれません。
もし、お時間がありましたらお答えいただけたらと思います。

作成中のコンテンツの完成を楽しみにしています!

2管理人:2011/05/05(木) 13:27:46
shunさん書き込みありがとうございます。

管理人のやる気にムラがあり更新がよくとまります…。
作成中のコンテンツで先に完成させたほうがよいものがあれば
教えてください。がんばってやってみます。

3shun:2011/05/14(土) 22:41:50
管理人さんお返事ありがとうございます。

『最小構成のVST作成方法』の項目の中で『コンストラクタ』の項目が準備中ということのようなので、
是非、更新していただけたらと思っています。少しでも情報がほしいと思っていまして・・・^^;

もちろん、無理はなさらないでください。
このホームページのユーザーの一人として、更新を楽しみにしています!

4管理人:2011/05/15(日) 11:25:12
shunさん書き込みありがとうございます。

最小構成のVSTのコンストラクタはここ(↓)に記載しているつもりですが…
http://www39.atwiki.jp/vst_prog/pages/71.html

確か「MIDIメッセージ処理2」と「簡単な音源の作成」以外で作成中はなかったような…
詳細をご教示いただけると幸いです。

5shun:2011/05/15(日) 14:59:04
早速のご返信ありがとうございます!

もうすでに書き上げていらしたんですね。
下記のURLに『コンストラクタ(準備中)』とあったので勘違いをしてしまいました・・・

http://www39.atwiki.jp/vst_prog/pages/72.html

申し訳ありませんでした・・・^^;

6管理人:2011/05/16(月) 01:51:20
shunさん

WIKIの編集次第ではそうなるようです…
確かに「コンストラクタ(準備中)」となっていました…

ちなみにご存知だと思いますが、ここ(↓)を見ていただけると全体が見れます。
http://www39.atwiki.jp/vst_prog/pages/52.html

たいしたことないページですがこれからもよろしくお願いいたします。

7shun:2011/05/20(金) 21:29:31


質問をさせてください。
お時間がある時で構いませんので、お答えいただけませんでしょうか。

8shun:2011/05/20(金) 21:50:47
*申し訳ありません。"7"を間違えて投稿してしまいました。

こんばんわ!

3点質問をさせてください。
お時間がある時で構いませんので、お答えいただけませんでしょうか。

1点目。

http://www39.atwiki.jp/vst_prog/pages/70.html

上記のページ内の『AudioEffect* createEffectInstance()関数の作成』の項目で、
"なぜこのような関数が必要かの詳細は説明できるほどの知識がないため省略する。"
とありますが、その後何か得た情報はありましたか。


2点目。

『MyMinimumVST』などの管理人様が作成したサンプルにはmain()が見当たりません。
VSTを作成するにあたってmain()は必要ないのでしょうか。
私が使っているC++の参考書には必ずmain()があるようで、疑問に思いました。

dllファイルが生成される仕組みを教えていただきたいです。

3点目。

http://www39.atwiki.jp/vst_prog/pages/70.html

上記のページ内の『AudioEffectXクラスを継承した自作VST用クラスの作成』の項目で、
『音声信号を処理するメンバー関数ProcessReplacing()』についての記述がありました。

この関数の仮引数部分のデータ型"float**"の"**"とは何を意味しているのでしょうか。
参考書等を使って調べてみたのですが、解説が見当たりませんでした。

私がVC2008とC++の初心者ということもあり、
初歩的な質問になってしまいましたが、よろしくお願いいたします。

9管理人:2011/05/21(土) 11:42:34
shunさん

ご質問ありがとうございます。簡単に回答させていただきます。

■1点目
 説明が面倒なので省略しておりましたが大体以下の内容です。

  DLLを利用する(呼び出す)側のプログラムでDLL内のクラスを利用するには、
  利用する側のプログラムでクラスを生成(new)しなければなりません。

  しかし、DLLファイルではクラスをエクスポートできない決まり(仕様)があります。
  つまり、利用する側のプログラムから直接、DLL内にあるクラスを生成(new)することが
  できないのです。

  そのため、苦肉の策としてDLL側にDLL内のクラスを生成する関数を用意しています。

  VSTではこのクラス生成のための関数がcreateEffectInstance()関数になります。

  【イメージ】
   NG:AudioEffect* vst = new MyMinimumVST(audioMaster);
     (↑呼び出す側で上記のようにnewで生成ができない。)

   OK:AudioEffect* vst = createEffectInstance();
     (↑苦肉の策としてDLLで用意された関数を利用してvstクラスを生成する。)

■2点目
 以下の理由でVSTではmain関数は必要ありません。

  main関数はC/C++ではエントリーポイントとして定義されています。

  エントリーポイントとは、「プログラムが始まるポイント(関数)」のことです。
  つまり、C/C++ではmain関数から始まるように決めて(定義して)います。

  エントリーポイントはコンパイラ(VC++)で変更することができます。

  DLLもプログラムなので、当然エントリーポイントがありますが、DLLの場合、
  DllMain関数になっています。
  (つまりDLLを作成するときはmain関数の代わりにDllMain関数をつかいます。)

  VSTもDLLの一種なのでDllMain関数から始まる必要があるのですが、
  すでにvstplugmain.cppファイルにDllMain関数の内容が記載されているため、
  自分でVSTを作成する際には記述する必要がありません。

■3点目
 データ型 float**ですが、「floatポインタへのポインタ」という意味です。
 「ポインタのポインタ」で調べていただくとわかりやすい説明があるかと
 思います。
 (ここでの説明はご勘弁ください。ポインタの説明だけでかなりのボリュームに
 なりますので…


上記1〜3の内容は、C/C++の知識に加え、Windowsプログラムについて
ご認識いただけると、より理解が深まるかと思います。

最後に有名なWebページですのでご存知かもしれませんが、
以下ページをご紹介させていただきます。

 猫でもわかるプログラミング
 http://homepage2.nifty.com/c_lang/

10shun:2011/05/25(水) 10:46:50
お礼が遅れてしまいました・・・

翌日にはすでに解答してくださったのですね。
長文の解説をありがとうございました!

とても参考になりました^^
また何かありましたら、よろしくお願いいたします。

11shun:2011/06/03(金) 17:36:39
こんにちは!また書き込ませていただきます。2点ほど質問させてください。

http://www39.atwiki.jp/vst_prog/pages/72.html

上記ページに記述されているprocessReplacing()関数の3つの引数についてです。

①なぜfloat** inputsとfloat** outputsはなぜ2次元配列で渡されるのか。
(ドキュメントを読んだところ以上のような記述がありましたが、仕組みが理解できませんでした)

②sampleFramesに代入されている数値はなにか。
(sampleframeは変数ですから何かしら数値が代入されていると思うのですが、何が代入されているか理解できませんでした)

お時間があるときで結構ですので、ご回答いただけたらと思います。
最後まで読んでいただき、ありがとうございました。

12管理人:2011/06/04(土) 14:24:41
shunさん

書き込みありがとうございます。

まず②から先に記載させていただきますが以下のような内容になります。

②sampleFramesは記載しているとおり、各チャンネルの入力音声信号、
 出力音声信号のバッファサイズになります。

①inputs,outputsの2次元配列の各要素は
 記載しているとおり、以下のような意味になっています。
  inputs[チャンネル数][音声バッファの長さ]
  outputs[チャンネル数][音声バッファの長さ]

 サンプルで扱っているのはステレオばかりですが、
 チャンネル数はVSTによって異なります。(モノラル、ステレオ、5.1ch等)

 また音声バッファの長さはホストアプリケーション側で決定されます。

 これらに対応するため、2次元配列である必要があります。

若干質問の意図がわからないので回答がずれているかもしれません。
質問の詳しい意図をいただけると幸いです。

13shun:2011/06/04(土) 21:37:45
今回も、早速の解答をありがとうございました^^
毎回とても助かっています。ありがとうございます。

①float** inputsとfloat** outputsが2次元配列で渡される仕組みを知りたい、ということです。
(この仕組みはポインタをしっかりと理解していなければ理解できないのではないか、と私なりに考えているのですが、いかがでしょうか?)


②つまり『バッファサイズはホストアプリケーション側で決定されるため、プログラム内でsampleFrameに具体的な定数を代入する必要はない』
という理解で間違いはありませんでしょうか。

宜しくお願い致します!

14管理人:2011/06/05(日) 12:56:03
shunさんのご認識のとおりです。

①ポインタと配列について理解できれば解決すると思われます。

②VST側でsampleFrameに具体的な定数を代入する必要はありません

15shun:2011/06/07(火) 10:40:04
ご回答、ありがとうございました^^
ポインタと配列ですね・・・参考書等を使って勉強に励みます!

お話は少し変わりますが、VSTの開発にはC++の知識のみならず
VC++やDLLの知識も必要となってくるのではないか、とふと思いました。

プログラミングに関する知識を全て知っていることに越したことはない、
ということはもちろんですが(笑)、やはり必要でしょうか。

また、初心者ということもあり、学習方法に日々悩んでおります。
なにか、アドバイスなどありましたら、ご教授いただけませんでしょうか。

16管理人:2011/06/09(木) 02:43:13
返信が遅れました

shunさんの求めるもの(作りたいVST)がわからないので
アドバイスといわれると難しいです。

ただ、今までの質問を見てみると、
すべて「VSTがどういう仕組みか?」ということを気にされているようですが、
shunさんのレベルで必要かは疑問です。

「どうやって動くか?」は後回しにして、
まずは何らかのVST(エフェクタ)を作成してみてはいかがでしょうか?

たとえば最小構成のVSTはコンパイル、ビルドすれば、
ステレオ入力、ステレオ出力のVST(エフェクタ)になります。

 参考:http://www39.atwiki.jp/vst_prog/pages/73.html

まずはprocessReplacing()関数の下記部分を適当に修正して
簡単なエフェクタを作ってみてはいかがでしょうか?

 //ここで音声処理を行う。

 //出力バッファへ書き込む。
 outL[i] = inL[i];
 outR[i] = inR[i];

また何かあればご質問いただければと思います。

17shun:2011/06/09(木) 06:13:10
私の目的を記述していませんでしたね、失礼いたしました^^;
単純に『VSTの仕組みを理解すること』が目標(目的)です。
DAWを使った楽曲制作を趣味にしているのですが、
ある時『VSTの仕組みを知りたい!』と思ったのが勉強を始めたきっかけです。

そうですね・・・仕組みの勉強をすると同時にVST(エフェクタ)作りも同時にやってみたいと思います。

最後にご回答ありがとうございました。
また、質問させていただきます!
更新も楽しみにしています^^

18will:2012/01/23(月) 16:08:08
初めまして。卒業課題で、vstiを制作しています。
 GUIのプログラミングで、こちらのサンプルを参考にしたいと思い、実行して
みたのですが、リソースから画像を読み込む
「CBitmap *KnobBack = new CBitmap (BITMAP_KNOB_BACK)」
のプログラムで、(BITMAP_KNOB_BACK)の識別子が定義されていないとエラーが
出てしまいます。この識別子は「resource.h」で定義されているはずなので、
原因がわからず困惑しています。
環境はVC++2010 expressを使用しています。
回答よろしくお願いします。

19管理人:2012/01/26(木) 11:29:53
willさん
返信が遅れました

resource.rcは作成しておりますでしょうか?
作成している場合、プロジェクトへ追加しておりますでしょうか?

20sam:2012/05/22(火) 16:06:26
こんにちは
今、自力で VST Plug-in 作成にチャレンジしています。
プロジェクトの作成方法などだいたい同じやり方でやっております。
もっと早くココを知っていれば、もっと楽に早くできたのに。。。。。

一つだけ質問です。

VC++ プロジェクトの準備
No.4 VSTを作成するに当たって必要なコンパイラ、リンカ設定を追加する
http://www39.atwiki.jp/vst_prog/pages/61.html
において、
プロジェクトプロパティ→「構成プロパティ」→「C/C++」→「コード生成」
→「ランタイムライブラリ」を「マルチスレッド(/MT)」に設定されておりますが、
その理由というか必然性を教えていただきたいと思います。

(私は、ここを設定せずに’空’のままにしています。)

よろしくお願いします。

21管理人:2012/05/23(水) 00:14:18
samさん書き込みありがとうございます。

プロジェクトの設定を/MTにしないとエラーがでてビルドできなかった気がします。

現在パソコン修理中ですぐに確認することができませんが、
わかり次第連絡させていただきます。(今週末あたりになりそうです。)

22管理人:2012/05/29(火) 21:41:28
samさん

「ランタイムライブラリ」の設定ですが、
「マルチスレッド(/MT)」でなくてもビルドはできます。
ただし、自分のパソコン以外で実行するとエラーとなり、
実行できない可能性があります。

なお、確認の際に、「ランタイムライブラリ」を
空白にしようとしましたができませんでした。
プロジェクトのプロパティダイアログで左上の「構成」が
「すべての構成」になっていないでしょうか?

23SKY:2013/02/02(土) 20:51:53
VSTの仕様が知りたかったので
わかりやすく書いてあってとても参考になりました。
ありがとうございました。

24管理人:2013/02/03(日) 15:22:28
SKYさん

訪問いただきありがとうございます。

わかりにくい部分や作成中の部分がありますが、
わかる範囲でお答えさせていただきますので
これからもよろしくお願いいたします。

25<削除>:<削除>
<削除>

26ケイ:2019/01/27(日) 20:49:56
はじめまして、ケイと申します。
このようなVST開発のページを作られていて、とても参考になり感謝しております。

私はこれからVST音源を開発、販売を試みようとしておりますが、、
これを配布していく上で、VST音源のコピーや違法アップロードの対策として
アクティベーションのような機能を、VST内部に組み込みたいと思っております。

その場合ですが、VST音源がDAWに読み込まれたらMACアドレスを見にいくような処理や、
所定の場所にファイルを書き込んだり、読み込んだりするといったようなifstreamのような処理は可能なのでしょうか?

お忙しいとは思いますが、ご回答いただけると大変助かります。

27管理人★:2019/01/29(火) 08:19:16
ケイさん

書き込みありがとうございます。
忙しくて回答が遅くなり申し訳ないです。
VSTを作るという部分ではVST SDKの作法に従う必要がありますが、MACアドレスの読み込みやファイルの読み書きはC++でできるのであれば問題ありません。

28ケイ:2019/03/12(火) 00:12:55
管理人さん

返信が遅くなり、大変申し訳ございませんm(_ _)m
C++でできるのであれば、可能だと認識しました。
わざわざご回答ありがとうございます!

29名無しさん:2019/05/05(日) 17:41:05
サンプルソースをビルドする時OBJが開けなくて失敗します。何が悪いのでしょう?

30管理人★:2019/05/06(月) 18:16:35
書き込みありがとうございます。

VST SDKのバージョンは3.6.13でしょうか?
そうであれば、追加の基本ライブラリが必要となります。

基本ライブラリの作成の際に「pluginterface.lib」ができていると思いますので、プロジェクトのプロパティから「リンカー」→「入力」→「追加の依存ファイル」で「pluginterface.lib」を追加してみてください。

同じ内容をTwitterにも投稿しておりますのでご参照ください。
https://twitter.com/vstcpp/status/1125001924875440129

31管理人★:2019/05/06(月) 20:11:11
もう一点。追加でfactory.cppのインクルードファイルの名前を「pluginfactoryvst3.cpp」から「pluginfactory.cpp」に変更する必要もあります。

32<削除>:<削除>
<削除>

33oec:2020/07/25(土) 17:51:30
初めまして。昨年末から、管理人さんのサイトを参考にちまちまVST3プラグイン開発を進めています。

bundleのResourcesからWAVファイルを読み出すのもダメじゃないけどやっぱりリソースがひとつのバイナリに
収まってる方がいいな!と思ってWin32のリソースアクセスを使う方法を見つけたり、
ノブがアニメ表示してるんならLEDとかアニメ表示で表現できるはずだ、クラス作らないといかんのか?と
ライブラリ探しまくってCMovieBitmapクラスを発見したりと、苦労しながらも少しずつ形が出来上がりつつあります。

今回はCKickButtonクラスの話です。
サイトの説明だと、ボタンを押していると1が、離すと0がイベントの値として得られるとのことでしたが、
試してみるとボタンを離した時にしかイベントが発生しません。標準のGUI画面だと、ノブを動かせば
どちらの動作でもイベントは発生するようですが期待した動作ではありません。

そこで、CKickButtonクラスを継承した独自クラスを作り、そこにonMouseMovedだけをオーバーライドして、
元のonMouseMovedメソッドのソースをコピーした後、値が変わったことを示す関数(valueChanged())を
実行するように追記しました。

if (where.x >= getViewSize().left && where.y >= getViewSize().top &&
where.x <= getViewSize().right && where.y <= getViewSize().bottom)
value = getMax();
else
value = getMin();
valueChanged();

マウスの動きによって値を変えようとしているのだから、変化を通知してないのはバグかな…?
ライブラリのバージョンは現時点で最新の3.6.14です。

キックボタンなのでキックされたらイベント発生という意味だとすれば納得できなくもありませんが…
この変更でボタンを押している間ノートオン、離すとノートオフという操作が可能になります。

以上、ご参考まで。

34oec:2020/07/25(土) 17:53:48
ふっ…隣の板と間違えて書き込んじまったぜ…。

35管理人★:2020/07/26(日) 17:02:26
oecさん

情報ありがとうございます。
確かにマウスを離したときだけvalueChanged()が呼ばれますね…

おそらく、
> キックボタンなのでキックされたらイベント発生という意味
の想定で作成されたボタンだと思います。

いただいた内容だとonMouseMovedの修正だけでできるようなので
使いどころは多そうですね。

VST作成頑張ってください!


新着レスの表示


名前: E-mail(省略可)

※書き込む際の注意事項はこちら

※画像アップローダーはこちら

(画像を表示できるのは「画像リンクのサムネイル表示」がオンの掲示板に限ります)

掲示板管理者へ連絡 無料レンタル掲示板