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

C++でVST作りの指摘・質問

1管理人:2010/12/10(金) 18:06:52
「C++でVST作り」内の誤記やサンプルコードのバグ、指摘・質問等がございましたらこちらへお願いいたします。

C++でVST作り→http://www39.atwiki.jp/vst_prog/

2うさぎ:2010/12/25(土) 23:37:00
指摘でも質問ではないですが、wikiの情報を活用させていただいている者です。
ほぼ傍観者かもしれませんががんばってください。
精進したらスレ立てとかさせていただくかもです。

3管理人:2010/12/26(日) 02:17:47
うさぎさん書き込みありがとうございます。
応援いただけてうれしいです。

あまり人も来ないページ(分野?)なので極力要望にはこたえていこうと思ってます。
これからもよろしくお願いいたします。

4うさぎ:2010/12/26(日) 06:03:12
おはようございます。
早く起きたのはいいとして
http://www39.atwiki.jp/vst_prog/?plugin=ref&page=VST%20SDK04&file=20.PNG
の状態にVC++expressにインクルードしたのですが
>c:\vstsdk2.4\public.sdk\source\vst2.x\audioeffect.h(16) : fatal error C1083: include ファイルを開けません。'pluginterfaces/vst2.x/aeffect.h': No such file or directory
とのエラーが出ています。
どうやらaeffect.hがみにいけてないようなのですが前述び通り設定してありますし、アクセス権なども問題がないようです。
なにかアドバイスをいただけますでしょうか?
windows7 64bitです。
お時間のあるときお願いいたします。

5うさぎ:2010/12/26(日) 06:05:06
補足:練習教材にVSTエフェクター作成例のトレモロをビルドしてみようとしていました。

6うさぎ:2010/12/26(日) 12:18:02
自己解決しました
インクルードするディレクトリをsdkのルートに設定したらビルドできました。
お騒がせしました

7管理人:2010/12/26(日) 12:46:31
うさぎさん
指摘ありがとうございました。
確かに「C:\vstsdk2.4」もパス指定しなければいけないようです。
修正しておきました。

8ちあ.dat:2011/04/23(土) 07:41:12
管理人様、こんにちは。

作編曲に役立つツールを作りたくて、VSTやVSTホストの作り方を調べようとしたのですが、
まったく情報が無くて困っていたところ、このサイトを見つけました。

結論から言うと、すっごく参考になりました!
本当に困っていたので、是非お礼を言いたくて…。
ありがとうございます!

確かに、あまり人の来ない分野かもしれませんが、応援いたしております!

9ちあ.dat:2011/04/23(土) 12:03:40
こんにちは。
DLLを作成するときに使う、「vstplug.def ファイル」についての質問がございます。
よろしくお願いいたします。


このファイルの中身は、最初は、

EXPORTS
VSTPluginMain
main=VSTPluginMain

ってなってますよね。

そこで気になったのですが、
「最小構成のVST作成方法」→「AudioEffect* createEffectInstance()関数の作成」 の項目に記述されている、
AudioEffect* createEffectInstance()
を、VSTホストから使用するためには、自分で vstplug.defファイル の中身を

EXPORTS
VSTPluginMain
main=VSTPluginMain
createEffectInstance

と、書き換える必要があるのでしょうか。


それとも、VSTホストは、
最初からdefファイルに記述されている「VSTPluginMain」メソッド を利用することによって、
VSTプラグインを使用するのでしょうか?


ちなみに、
vstpluginmain.cppファイルにて、VSTPluginMainメソッド は、次のように定義されていました。

VST_EXPORT AEffect* VSTPluginMain (audioMasterCallback audioMaster)
{
// Get VST Version of the Host
if (!audioMaster (0, audioMasterVersion, 0, 0, 0, 0))
return 0; // old version

// Create the AudioEffect
AudioEffect* effect = createEffectInstance (audioMaster);
if (!effect)
return 0;

// Return the VST AEffect structur
return effect->getAeffect ();
}

これを見ると、VSTホストアプリケーションは、
AEffect構造体を利用するのだろうか?
とも思えます。
しかしその場合、new した AudioEffectインスタンスは、いつ解放されるの?
放っておいて、メモリーリークは起こらないの?
等と、心配事があります。


VSTホストアプリケーション(SonarとかCubase等)は、
どのようにして、VSTプラグインを使っているのでしょう。

今、色々試して、試行錯誤している最中です。

お時間がございます時で構いません。
管理人様が、ご存知のことがございましたらアドバイス頂けないでしょうか?

よろしくお願い致します。

10管理人:2011/04/23(土) 12:28:12
ちあ.datさんありがとうございます。

書き込みが少ないのでお礼や指摘は素直にうれしいです。

自分のページをよりよくしていきたいと思いますので
ご質問や指摘は大歓迎です。

これからもよろしくお願いいたします。

11管理人:2011/04/23(土) 12:29:51
書き込みに気づかず書き込んでしまった…

12管理人:2011/04/23(土) 12:41:19
私自身も詳しくはないですが、

> と、書き換える必要があるのでしょうか。
> 最初からdefファイルに記述されている「VSTPluginMain」メソッド を利用することによって、
> VSTプラグインを使用するのでしょうか?
vstplug.defは書き換える必要はないと思います。
ご認識のとおりだと思われます。

> これを見ると、VSTホストアプリケーションは、
> AEffect構造体を利用するのだろうか?
AEffectクラスを継承した自作のVSTクラスを利用することとなります。
C++のクラスの「継承」「オーバーライド」といった機能を調べていただけると
ご理解いただけるかと思います。

なおnewしたAudioEffectインスタンスの解放は
ホストアプリケーション側で行われていると思います。

13管理人:2011/04/23(土) 12:49:20
> C++のクラスの「継承」「オーバーライド」といった機能を調べていただけると
> ご理解いただけるかと思います。
「仮想関数」が抜けていました。

14ちあ.dat:2011/04/23(土) 13:13:40
管理人様、すばやいご回答ありがとうございます!

なるほど!
AEffectクラスを継承した自作クラスを作成することが基本方針なのですね!

このクラスの中身はまだわからないことが多いのですが、色々調べたり試したりして
がんばってみようと思います。

本日、こちらのサイトを発見してから、長い間の疑問が色々解決しました!
今後のサイトの更新を、楽しみにしております。

ありがとうございました!

15管理人:2011/04/23(土) 14:08:38
ちあ.datさん

無事解決してよかったです。

ここに書かれている以外のことでも可能な範囲で答えますので
よければまたご質問ください。

ありがとうございました。

16nobu:2011/08/15(月) 11:09:11
> AudioEffectインスタンスは、いつ解放されるの?

>なおnewしたAudioEffectインスタンスの解放は
> ホストアプリケーション側で行われていると思います。

本当にそうか気になったのでざっとSDKとサンプルのコードを見てみました。

VST hostが受け取れるのは AudioEffect の持っている AEffect 構造体。

AEffect::object は そのAEffect自身を持っている AudioEffect へのポインタ。

AudioEffect::dispatchEffectClass で effClose がきた時に引数として受け取った AEffect構造体のメンバ AEffect::object (= AudioEffectのインスタンス) に対して delete している。

AudioEffect::dispatchEffectClass は AudioEffect のコンストラクタで、AEffect の dispatcher に設定されている。

minihostのサンプルを見ると、VST hostは終了処理として
> effect->dispatcher (effect, effClose, 0, 0, 0, 0);
のように effClose を投げる

ということで、当初の予想通り、AudioEffectのインスタンスの解放はVST hostの責任で、VST pluginを作る人は気にする必要はありませんでした。
情報共有まで。

17管理人:2011/08/17(水) 01:32:42
nobuさん情報提供ありがとうございました。

有益な情報をいただけて助かりました。
これからもよろしくお願いいたします。

18<削除>:<削除>
<削除>

19<削除>:<削除>
<削除>

20ken:2012/01/27(金) 00:17:33
初めまして、kenと申します。
「C++でVST作り」と拝見させていただいております。

Microsoft Visual C++ (2008 Express Edition)とVST SDK 2.4をインストールし、
VC++ プロジェクトの準備のNo.1〜No.5を読みながら、まずビルドまでを挑戦しています。
手順どおりの操作を行ったつもりなのですが、以下のようなエラーが出てしまいます。

------ ビルド開始: プロジェクト: MyTremoloVST, 構成: Release Win32 ------
リンクしています...
ライブラリ C:\Documents and Settings\ken\デスクトップ\MyTremoloVST\Release\MyTremoloVST.lib とオブジェクト C:\Documents and Settings\ken\デスクトップ\MyTremoloVST\Release\MyTremoloVST.exp を作成中
vstplugmain.obj : error LNK2001: 外部シンボル ""class AudioEffect * __cdecl createEffectInstance(int (__cdecl*)(struct AEffect *,int,int,int,void *,float))" (?createEffectInstance@@YAPAVAudioEffect@@P6AHPAUAEffect@@HHHPAXM@Z@Z)" は未解決です。
C:\Documents and Settings\ken\デスクトップ\MyTremoloVST\Release\MyTremoloVST.dll : fatal error LNK1120: 外部参照 1 が未解決です。
ビルドログは "file://c:\Documents and Settings\ken\デスクトップ\MyTremoloVST\MyTremoloVST\Release\BuildLog.htm" に保存されました。
MyTremoloVST - エラー 2、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========


Microsoft Visual C++ (2010 Express Edition)でも試したのですが、同様のエラーが出てしまいます。
------ ビルド開始: プロジェクト: MyTremoloVST, 構成: Release Win32 ------
ライブラリ C:\Documents and Settings\ken\デスクトップ\MyTremoloVST\Release\MyTremoloVST.lib とオブジェクト C:\Documents and Settings\ken\デスクトップ\MyTremoloVST\Release\MyTremoloVST.exp を作成中
vstplugmain.obj : error LNK2001: 外部シンボル ""class AudioEffect * __cdecl createEffectInstance(int (__cdecl*)(struct AEffect *,int,int,int,void *,float))" (?createEffectInstance@@YAPAVAudioEffect@@P6AHPAUAEffect@@HHHPAXM@Z@Z)" は未解決です。
C:\Documents and Settings\ken\デスクトップ\MyTremoloVST\Release\MyTremoloVST.dll : fatal error LNK1120: 外部参照 1 が未解決です。
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========


単純なミスなのかも知れませんが、このエラーから何か設定すべきこと等わかりましたら、教えていただければ幸いです。
よろしくお願いいたします。

21管理人:2012/01/28(土) 04:05:20
kenさんはじめまして

おそらくプロジェクトの準備だけしてすぐにビルドしたのでは無いでしょうか?

残念ながらプロジェクトの準備だけではビルドすることができません。
ビルドするには.cppファイルを作成し、最低限の関数とクラスを
定義する必要があります。

ビルドするための最低限必要な定義については
「最小構成のVST作成方法」に記載しております。

・最小構成のVST作成方法
  http://www39.atwiki.jp/vst_prog/pages/70.html

・最小構成のVST(ソースコード全体)
  http://www39.atwiki.jp/vst_prog/pages/73.html

22ken:2012/01/28(土) 12:28:53
早速のご教示ありがとうございました。
「簡単な音源(VSTi)の作成」ページのMySynthSampleVSTをビルドすることができました。
これからソースコードの内容を勉強させていただきたいと思います。

VST、VSTiに関してはこれから学ぶところですが、
私もまた違ったアプローチでバーチャルアナログ音源を作っています。
よろしければ見てみてください。

・What is Flageoboard?
  http://mbed.org/users/kentasaito/notebook/what-is-flageoboard/

・Me playing Flageoboard (YouTube)
  http://www.youtube.com/watch?v=chereNrys5Q

23管理人:2012/01/29(日) 11:20:45
kenさん

無事解決してよかったです。

すでにマイコンを使って作られたことがあるんですね.
VSTの規格自体はあまり難しく無いと思いますので
すぐに作成できると思います。

ほかに不明点がありましたらいつでもご質問ください。
また、書けていない内容(MIDI処理とかフィルタとか…)も
ありますのでそちらもわかる範囲で答えさせていただきます。

これからもよろしくお願いいたします。

24ken:2012/01/30(月) 00:12:22
お返事ありがとうございます。
「VST GUIの作成」ページのつまみやスライダーも拝見させていただいています。
VSTiは学べば学ぶほどやってみたいことが増えそうな気がします。

今後ともよろしくお願いいたします。

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

26<削除>:<削除>
<削除>

28名無しさん:2012/11/20(火) 12:20:46
管理人様、はじめまして。
自作のVstHostアプリを開発中の者です。
ホームページに載っている色々な情報を参考にさせていただいています。
ありがとうございます。

上記の通りVstHostアプリを開発中なのですが、
嵌ってしまっておりましてアドバイスをいただけたらと思い、書き込みさせていただきました。

現在vsti(Synth1)をホストアプリにloadして
processEvents()とprocessReplaceing()を実行するコードを書き、
エラー無しでコンパイルされること、
また、プログラムを実行すると正常終了するところまでは確認できているのですが、
肝心の音が鳴らない状況です。

vstiのdllの中でトレースすることも出来ず困っているのですが、
自分の書いたコードをご覧いただき、おかしなところがあればご指摘いただけたら幸いと思っている次第です。
以下の様な感じになります。
http://codepad.org/m52oPA93

またトレースの仕方についても良い方法がありましたらご教示いただけましたら幸いです。

ご回答いただけますと嬉しいです。
どうぞ宜しくお願いします。

29管理人:2012/11/21(水) 02:13:31
書き込みありがとうございます。

VSTHostについてはあまり詳しくありませんので
見当違いかもしれませんが、AEffect構造体ではなく
AudioEffectXクラスを利用されてはいかがでしょうか?

dispatcher()関数でMIDIメッセージをセットし、
音を鳴らそうとしているようですが、AEffect構造体(AudioEffectクラス)の
dispatcher()関数にはopcodeがeffProcessEventsの場合の処理が
記載されていないようです。
(aeffect.h、audioeffect.cppを見た限りですが…)

AudioEffectXクラスはAudioEffectクラスのdispatcher関数を
オーバーライドしており、opcodeがeffProcessEventsの場合に
processEvents()関数を呼び出すようになっています。
(aeffectx.h、audioeffectx.cppに記載があります。)

こちらで試されてみてはいかがでしょうか?

またトレースの方法ですが、本格的な開発をしたことが無く
こちらはまったくわかりません…

30らい:2012/11/21(水) 16:34:21
初めまして.
卒業研究でVSTを制作しており,毎日そちらのサイトで勉強させていただいてます.

サンプルコードのトレモロは無事実装でき,それに対するGUIを実装したいと思い
まずはウィンドウを表示するだけのサンプルプログラムの実装を試みているのですが
なかなか思うようにいかず苦戦しております.
vstcontrols.cpp,vstgui.cpp,aeffguieditor.cppのソースファイルもプロジェクトに入れ,実行しても以下のようなメッセージが出てきました.

1>------ ビルド開始: プロジェクト: GUI, 構成: Release Win32 ------
1> vstcontrols.cpp
1>C:\vstsdk2.4\pluginterfaces/vst2.x/aeffect.h(296): warning C4996: 'strncpy': This function or variable may be unsafe. Consider using strncpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\string.h(188) : 'strncpy' の宣言を確認してください。
1>C:\vstsdk2.4\pluginterfaces/vst2.x/aeffect.h(306): warning C4996: 'strncat': This function or variable may be unsafe. Consider using strncat_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\string.h(175) : 'strncat' の宣言を確認してください。
1>..\..\..\..\..\..\..\vstsdk2.4\vstgui.sf\vstgui\vstcontrols.cpp(707): warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\stdio.h(371) : 'sprintf' の宣言を確認してください。
1>..\..\..\..\..\..\..\vstsdk2.4\vstgui.sf\vstgui\vstcontrols.cpp(1408): error C2664: 'CreateWindowExW' : 2 番目の引数を 'const char [5]' から 'LPCWSTR' に変換できません。(新しい機能 ; ヘルプを参照)
1> 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
1>..\..\..\..\..\..\..\vstsdk2.4\vstgui.sf\vstgui\vstcontrols.cpp(1420): error C2664: 'strcpy' : 1 番目の引数を 'WCHAR [32]' から 'char *' に変換できません。(新しい機能 ; ヘルプを参照)
1> 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
1>..\..\..\..\..\..\..\vstsdk2.4\vstgui.sf\vstgui\vstcontrols.cpp(1864): warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\string.h(105) : 'strcpy' の宣言を確認してください。
1>..\..\..\..\..\..\..\vstsdk2.4\vstgui.sf\vstgui\vstcontrols.cpp(1868): error C2664: 'GetWindowTextW' : 2 番目の引数を 'char [255]' から 'LPWSTR' に変換できません。(新しい機能 ; ヘルプを参照)
1> 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
1>..\..\..\..\..\..\..\vstsdk2.4\vstgui.sf\vstgui\vstcontrols.cpp(1869): warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\string.h(105) : 'strcpy' の宣言を確認してください。
1>..\..\..\..\..\..\..\vstsdk2.4\vstgui.sf\vstgui\vstcontrols.cpp(3098): error C2664: 'AppendMenuW' : 4 番目の引数を 'char *' から 'LPCWSTR' に変換できません。(新しい機能 ; ヘルプを参照)
1> 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
1> MyVstGui2.cpp
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

C++を勉強してまだ半年ほどのものですが,ご指南頂けたらと思います.
何卒よろしくお願いします.

3128:2012/11/21(水) 19:28:18
管理人様

ご返信ありがとうございます!
なるほど、AEffect構造体のdipsatcherを呼んでもだめだったのですね。
重ね重ねになり申し訳ないのですが、またお伺いさせていただけますでしょうか。

ご教示いただいたようにAudioEffectXクラスのdispatcherを呼ぶ形で試してみようとしたのですが、
そもそもsynth1のdllをhostアプリ側で読み込んだ際に、どうやってAudioEffectXクラスのインスタンスのポインタを得ればいいのか
よくわからないのです。

現在、VstEventsTransporter::execute()
の中で使われている
vsti変数の中身 (synth1.dllをloadした際に得られたAEffect*)
は下記のような形で取得しています。
http://codepad.org/cYO1Je5z

mainEntryPoint()では AEffect*が返ってきてしまいますが、
ここでAEffect* ではなくAudioEffectX*を得る方法があるのでしょうか?

その方法を調べてみたのですが分からなかったため、
下記のように
http://codepad.org/SHkfCs6v
無理矢理キャストしてみたのですが、
コンパイルエラー等はでないものの、やはり音が鳴りません。

どこかで間違っているのだと思うのですが、
アドバイスをいただけますと幸いです。

よろしくお願い致します。

32管理人:2012/11/21(水) 23:26:31
>>30
らいさん書き込みありがとうございます。

プロジェクトの文字コードの設定がおそらくUnicodeになっていると思われます。
マルチバイト文字セットにすれば解決すると思います。

変更方法は下記のとおりです。
1.メニューから「プロジェクト」→「【プロジェクト名】のプロパティ」を選び、
 プロパティダイアログを開く
2.開いたダイアログ左側「構成プロパティ」→「全般」を選択
3.ダイアログ右側の「文字セット」を「マルチバイト文字セットを使用する」に変更
4.ダイアログ下側の「OK」を押す

上記内容をWebページのほうに更新いたしましたのでご参考までに。
http://www39.atwiki.jp/vst_prog/pages/61.html

33管理人:2012/11/22(木) 00:28:13
>>28さん

AudioEffectXクラスのポインタを得るには
 > AudioEffect* aex = (AudioEffectX*)vsti->object;
で問題ないと思います。

ただし、aexはAudioEffectクラス型ですので、
 > aex->dispatcher(
の部分ではAudioEffectクラスのdispatcher()関数が
呼ばれていると思います。

AudioEffectXクラスのdispatcher()関数を呼ぶには
  ((AudioEffectX*)aex)->dispatcher(
のようにキャストするか、
そもそもaexをAudioEffectXクラスで定義すればよいと思います。
  AudioEffectX* aex = (AudioEffectX*)vsti->object;

あまり自信がありませんがよろしくお願いします。


新着レスの表示


名前: E-mail(省略可)

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

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

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

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