したらば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;

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

34らい:2012/11/22(木) 15:12:55
管理人様

迅速な対応ありがとうございます.
おかげ様で無事にウィンドウとつまみ表示のGUIを構築出来ました.
これをもとに勉強し,まずはトレモロエフェクトに対してGUIを構築することを目標としてやっていきたいと思います.

またこちらで質問させていただくことがあると思いますが
何卒よろしくお願い致します.

35管理人:2012/11/23(金) 01:46:27
らいさん

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

WebページのほうにGUIの情報はあまり乗せていませんが
多少のことであれば知っています。
何かあればまたよろしくお願いします。

3628:2012/11/23(金) 12:55:01
管理人様

レスありがとうございます。
ご指摘ありがとうございます。
>AudioEffect* aex = (AudioEffectX*)vsti->object;
ここの部分なのですが、確かに
>AudioEffectX* aex = (AudioEffectX*)vsti->object;
の間違いでした。

しかし
>AudioEffectX* aex = (AudioEffectX*)vsti->object;
のようにしてもやはり音が鳴らないのです・・

proessReplacing()関数は、
それを実行した瞬間実際に音が鳴るものだと思っていたのですが、
もしかしますと、違うのでしょうか??
(波形を生成してどこかに格納しておくだけだったりしますでしょうか)
もしそうだとすると波形データを読み込んで実際に発音させる仕組みを
host側で持っておく必要があるのでしょうか・・?

2chの方でも色々と質問してみようと思うのですが、
ご教示いただけますと幸いです。

37管理人:2012/11/23(金) 13:34:28
>>28さん

processReplacing()関数はprocessEvents()関数で渡されたVstEventと引数inputsから
outputsに波形を出力するの関数です。

ですので音を出す仕組みはWinAPIのマルチメディア関数(waveOutOpen、waveOutWrite等)や
DirectSound等を利用し作成する必要があります。

processReplacing()関数の前にoutputsを0で初期化しているようですので、
呼び出した後にoutputsに0以外の値が入っているかどうか確認し、
波形が生成されているかまずは確認してみてはいかがでしょうか?

3828:2012/11/26(月) 01:01:32
管理人様

レス有難うございます。
お礼が遅れましてすみません。

>processReplacing()関数はprocessEvents()関数で渡されたVstEventと引数inputsから
>outputsに波形を出力するの関数です。

なるほど、そういうことだったのですね・・色々と勘違いしておりました。
vstiから返って来たデータをもとにwindows上でwaveデータを扱う
構造体を生成する必要があるようですね。
とても勉強になりました。
ひとまずその辺りの仕組みについて色々調べてみることにします。

ご丁寧に対応頂きましてありがとうございました。
また疑問点等が出たときは質問させていただくかもしれませんが、
よろしくお願いいたします。

39管理人:2012/11/27(火) 00:53:32
>>28さん

また何かありましたらわかる範囲で答えさせていただきます
よろしくお願いします。

4028:2012/12/09(日) 22:37:27
お世話になっております。
28です。

先のレスでいただいたアドバイスに従って色々と試行錯誤しているのですが
またよく分からない点が出てきましたので質問させていただけますでしょうか。


//vsti変数 には Synth1のdllをloadした際に得たAEffect*が格納されている

AudioEffect* aex = (AudioEffectX*)vsti->object;
aex->dispatcher(
effProcessEvents,
0,
0,
&vst_events,
0.0f
);
vsti->processReplacing(
vsti,
this->inputs,
this->outputs,
kBlockSize //512
);


このようなコードを書き、this->outputsの中に結果(波形データ?)が入って返ってくることは
確認したのですが、その内容が、processEventsでどんなmidiメッセージを送っても全く
同じになってしまうのです。

例えば 曲を再生して一番最初にドを発音するMidiイベントをvstiに送ると

this->outputs[0][0]; //3.94429e-09
this->outputs[0][1]; //2.08869e-08
this->outputs[0][2]; //3.11984e-08
this->outputs[0][3]; //4.43643e-08
this->outputs[0][508]; //8.25091e-07
this->outputs[0][509]; //8.25096e-07
this->outputs[0][510]; //8.251e-07
this->outputs[0][511]; //8.25104e-07

というデータが返って来ました。

しかし、開発中のVstHostを再起動し、今度はドではなく数オクターブ離れた別の音の
イベントを送信しても、
上と全く同じデータが返ってくるのです。

また、生成し始めて2つ目のイベント、3つ目のイベントなども
再起動してもそれぞれ全く同じになってしまいます。
また、processEvents & processReplacingを数回繰り返すと今度は浮動小数点が全く返ってこなくなり、
全て nan という文字列で埋まった float** this->outputs しか返さなくなってしまうようです。

processEventsでvstiに送っているイベントは大体以下のような感じです

vst_events.numEvents; // 1
vst_events.reserved; // 0
vst_events.events[0]->type; // 1
vst_events.events[0]->byteSize; // 24
vst_events.events[0]->deltaFrames; // 0
vst_events.events[0]->data[0]; // 0xffffff90 (ノートオン)
vst_events.events[0]->data[1]; // 0x3c (真ん中のドの音)
vst_events.events[0]->data[2]; // 0x64 (ベロシティ100)


どこかがおかしいのだと思うのですが、原因としては何が考えられますでしょうか・・
ご教示頂けると嬉しいです。

4128:2012/12/11(火) 01:15:49
度々書き込み失礼致します。

色々と調べておりまして、以下のURLで
http://www.kvraudio.com/forum/viewtopic.php?t=360826#
こう書かれているのを見つけました。

-------------------------------------------------
- all the MIDI events for the next audio buffer will be sent in one processEvents() call, rather than multiple calls.
-------------------------------------------------

VstEventsに複数の必要な分のVstEventを持たせ、processEventsは一回しか呼ばないようにしましょう、
つまり、曲の頭から終わりまでのすべてのVstEventを持ったVstEventsを一気に1回だけvstiに送って、
その後に一回だけprocessReplacingを呼びましょう、という風に読めたのですが、
この解釈で合っていますでしょうか。

管理人様のHPのこちらのページ
http://www39.atwiki.jp/vst_prog/pages/77.html
で、

【ホストアプリケーションの動作】
①processEvents()関数呼び出し
     ↓
②processReplacing()関数呼び出し
     ↓
③いろいろ処理
     ↓
④processEvents()関数呼び出し
     ↓
⑤processReplacing()関数呼び出し
     ↓
・・・・以降繰り返し     
     
のような記述がありましたので、
VstEvent一個につきprocessEventsを毎回発行するということかと思っていたのですが
自分の勘違いでしたでしょうか。
(よくよく考えればprocessEvent's' ですし、deltaframeという領域もあるので
イベントを一個一個送るのはおかしかった気がします)

しかし、この考え方ですと、曲の頭から終わりまでのすべてのwavデータをホスト上でバッファとして持っておく必要があるように思われ、
メモリの容量的に大丈夫なのだろうかなどという懸念が出てきます。

色々と自分が分かっていないのだと思うのですが、
ご指南いただけますと幸いです。

42管理人:2012/12/11(火) 02:19:20
>>28さん

まず気になったのは下記の部分です。
> vst_events.events[0]->data[0]; // 0xffffff90 (ノートオン)
> vst_events.events[0]->data[1]; // 0x3c (真ん中のドの音)
> vst_events.events[0]->data[2]; // 0x64 (ベロシティ100)

VstEvent構造体のdata[0]〜[3]はVstMidiEvent構造体のnoteLengthとなるかと思います。
それぞれの構造体の定義をご確認されてみてはいかがでしょうか?


また、processEvents()関数の呼び出しですが、マニュアルには下記のように記載されておりますので
http://www39.atwiki.jp/vst_prog/pages/77.htmlの解釈で間違いないと考えております。
> Events are always related to the current audio block. For each process cycle,
> processEvents() is called once before a processReplacing() call (if new events are available).


最後に、VST SDK中のminihostサンプルをもとにVSTiを呼び出すサンプルを作成してみましたが
波形は正常に生成されているようです。
http://www39.atwiki.jp/vst_prog/?cmd=upload&act=open&page=sample&file=host.zip

VSTiはこちらのページのものを利用しております。(ファイル名は変更しております。)
http://www39.atwiki.jp/vst_prog/pages/84.html

ご参考にされてみてはいかがでしょうか?

4328:2012/12/15(土) 01:14:06
管理人様

レスいただきありがとうございます。
お礼が遅くなりまして申し訳ございません。

>VstEvent構造体のdata[0]〜[3]はVstMidiEvent構造体のnoteLengthとなるかと思います。
なるほど・・ご指摘ありがとうございます。
(VstEvent*)&vst_midi_event;
このやり方で試してみることにします。

まだ解決していない状況でございまして、諸々調べている途中です。

進捗がありましたらご報告させていただければと思います。

4428:2012/12/15(土) 01:21:44
お礼が抜けておりました。
懇切丁寧にサンプルまで付記していただきましてありがとうございました。
こちらも現在参考にさせていただいております。

45管理人:2012/12/15(土) 14:40:38
>>28さん

確認不足で申し訳ありません。
>>42で作成したサンプルでSynth1を実行するとエラーとなりました。

確認したところいちいちAudioEffectXクラスのポインターを取得する必要は
なさそうです。

ですので当初のコード(http://codepad.org/m52oPA93)のように
> vsti->dispatcher(vsti, effProcessEvents, 0, 0, &vst_events, 0.0f);
という形で呼び出して問題なさそうです。

>>42のサンプルも修正いたしましたのでご参考までに。

4628:2012/12/16(日) 02:47:34
管理人様

ご丁寧にありがとうございます。
確かに手元で試していたところ、synth1だと処理落ちしてしまっておりました。
再度いただいたサンプルと同様の方法で試したところ正常に波形デーがが返って来るようになった感じがします。
ありがとうございます!

重ね重ねで申し訳ないのですがもう一点お伺いさせていただけますでしょうか。

サンプルの中で
for (VstInt32 processCount = 0; processCount < kNumProcessCycles; processCount++)
{
printf ("HOST> Process Replacing...\n");
effect->processReplacing (effect, inputs, outputs, kBlockSize);
}
という処理があるのですが、この意図するところがよく分からないのです。

kNumProcessCycles は5に設定されていますが、1回のprocessEventsの実行に対して
なぜ5回のprocessReplacingが必要になるのでしょうか。
この5という数字はどこから来ているものなのでしょうか。
(もしかするとVstEventsのMidiデータを実際音として鳴らした時の長さと関連があるのか?
などど考えております)

ご存知でしたら教えていただけますと幸いです。


新着レスの表示


名前: E-mail(省略可)

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

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

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

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