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

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

172管理人★:2018/03/02(金) 20:11:36
SNRERさん

遅くなりすいません。
Inline UI Editor(VST3Editorクラス)でのUI更新方法について
分かる内容を記載させていただきます。

Inline UI Editor(VST3Editorクラス)ではParameterクラスと依存関係を作成して、
Parameterクラスが変更されたとき(setNormalized関数が呼ばれたとき)に
コントローラを更新できるようにしているようです。

具体的にはvst3editor.cppのParameterChangeListenerクラスで実装されています。

①ParameterクラスのaddDependent関数を呼び出して依存関係にあるクラスを登録する。
 (VST3EditorクラスではコンストラクタでParameterChangeListener自身を登録)

②ParameterクラスのsetNormalized関数が呼び出されると変更されたことを
 依存関係にあるクラスに通知するためchanged関数が呼び出される。

③changed関数が呼び出されるとVST内部でいったんキューイングされた後、
 ParameterChangeListenerクラスのupdate関数が呼び出される。

④ParameterChangeListenerクラスのupdate関数内で関連付けられた
 コントロール(CControlクラス)の値を更新(setValueNormalized関数の呼び出し)し、
 再描画(invalid関数の呼び出し)する。

以上がInline UI Editor(VST3Editorクラス)の更新方法のようです。
ご参考までに。

173SNRER:2018/03/12(月) 17:35:03
管理人さま

大変お返事遅くなりました。
申し訳ないです。

Inline UI Editorで進めていきたいのですが、
うまくバインドされずにまた困っておりました。

ご教示いただいた内容を紐解きつつ確認してみます!
また進捗あればご報告させていただきます。

174管理人★:2018/03/12(月) 22:18:33
SNRERさん

ご確認ありがとうございます。

私も最近Inline UI Editorを試しました。
慣れるまでちょっと大変なツールですね…。

バインドされないとのことですが、「Control-tag」の項目に
パラメーターのタグを設定してもバインドされないでしょうか…?

175SNRER:2018/04/02(月) 17:19:30
管理人さま

ご無沙汰しております。
多忙により少しコードを触れずにおりました。

Control-tagにはタグ名称、その下のエリアで、ラベルとタグの記載をしているのですが、
それによって作られたコントローラが何の反応もなく(動かす事はできるのですが)
つまんで動かしてもvalueChangedにも来ていない状況です。

今、UI Editorの記事を拝見しました。まず、この記事に沿って構築し直してみようと思います。
貴重な記事大変感謝致します。

176管理人★:2018/04/02(月) 20:21:39
SNRERさん

こちらこそいろいろ情報を頂きありがとうございます。
valueChanged()が呼び出されていないとなるとちょっと分からないですね…

Inline UI Editorの記事がご参考になればと思います。

177SNRER:2018/04/04(水) 10:41:47
管理人さま

parameters.addParameter(STR16("●●"), STR16("●●"), 0, 0, ParameterInfo::kCanAutomate, TAG, kRootUnitId);

の様に設定しておりましたが、ここをノートエクスプレッションに合わせて

Parameter* param;
param = new RangeParameter(STR16("●●"), TAG, STR16("●●"), 0, 100, 100);
param->setPrecision(1);
parameters.addParameter(param);

の様に変更する事で、オートメーション追従まではできました。

引き続き改めてコードとにらめっこしていますが、
UIエディターを使って作った場合は、そもそも「guieditor.cpp」などに相当する部分は必要なく、
「guieditor.cpp」に作った valueChanged なども必要無いという事になるでしょうか?(通っていなくて動いているので)


但し、再生バーの地点を動かしただけの場合にはやはり、
setPramNomalized が呼ばれておらず、表示も更新されません。

引き続き自分なりに調べてみますが、ひとまず動いたという事でご報告させていただきました。

178管理人★:2018/04/04(水) 21:30:12
SNRERさん

一つ問題が解決してよかったです。

Inline UI Editorで「guieditor.cpp」に相当するものは
VST SDK内にある「vst3editor.cpp」になります。
valueChanged関数もこの「vst3editor.cpp」で定義されています。

また、Sonarの再生バーを動かした場合、
パラメータ操作クラス(EditController)のsetComponentState関数が
呼び出されているのではないかと思っています。

ノートエクスプレッションのサンプルでは、setComponentState関数から
setParamNormalized関数が呼び出されていますのでこれによって
UIの状態が更新されていると考えています。

179あると:2018/04/17(火) 18:59:40
管理人様

お世話になります.私,貴サイトを参考にVST3プラグインを作成しようとしているものです.
現在,貴サイトの「最小構成のVST3」の手順を行い,ビルドを行ったところなのですが,
問題が生じたので,もし何か解決の糸口が見つからないかと考え書き込ませていただきます.

現在,
Windows10(64bit)
Visual Studio 2017 community
VST SDK3.6.8
という貴サイトでの環境を構築し,
手順通り進めることでビルドが成功しました.
ソースコードは全て貴サイトのものを使用させていただきました.
生成された.vst3ファイルを動作確認するため,.vst3を
C:ProgramFiles\Common Files\VST3に入れました.

しかし,現在使用しているDAW「StudioOne3.5 professional」
でインサートプラグインとして使用したところ,
VSTプラグイン一覧上で自作VST3は見えるのですが,
インサートしてもインサート欄に追加されず,何も起きません.
ちなみに,他のVST2,3プラグインは正常にインサート欄に追加されて使用できます.

このような現象に心当たりはありますでしょうか?
DAWとの相性などもあるのでしょうか?.

辿々しい説明でわかりづらいとは思いますが,はじめの一歩でつまずいてしまい
大変困窮しておりますので,何卒ご返信いただければ幸いです.

180管理人★:2018/04/17(火) 20:06:42
あるとさん

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

頂いた事象についての心当たりはないのですが、
「最小構成のVST3」では何か足りないのかもしれませんね…
(説明しやすいようにかなり無理して削っている部分があるので…)

もし可能であれば、他のDAWで動作確認していただけないでしょうか?

VST SDKにもテスト用ホストが「VST3_SDK\bin\Windows 64 bit」にあります。
「VST3PluginTestHost_x64_Installer_2.6.0.zip」を解凍すればインストーラーがあります。
(私はこちらで動作確認しております。)

テスト用ホストで動くのであれば、パラメーター実装方法等で少し機能を追加してから、
再度Studio Oneで動作確認いただけますでしょうか?
(「最小構成のVST3」にはパラメーター操作クラスがないので、おそらくこのあたりで
はじかれているのではないかと推測しています。)

181あると:2018/04/20(金) 10:19:16
管理人様

ご返信ありがとうございます!
返信が遅くなってしまい申し訳ございません.

テスト用ホストの存在を知らなかったので,
その情報だけでも有難いです!

テスト用ホストをDLしてみたところ,
サンプルコードのvst3プラグインは認識されました.
しかし,本当に信号処理が出来ているかわからなかったので,
出力を1/4にするようにコードを書き換えて実行したのですが,
バイパス機能が実装されていないため,オンオフで確認することが出来ませんでした.
ということで,バイパス機能を実装してみたいと思います.
パラメータ実装の方も試してみます.

また,他のDAWでも試してみたほうがいいというアドバイスを受け,
知り合いのCubase使いのDTMerにプラグインを渡して試してもらったのですが,
そもそも認識されなかったそうです.おそらくCubase pro9.5です.
REAPERもDLしてみましたが,vst3を読み込んだら落ちました.

とりあえず解決できそうな糸口は色々と見つかったので試してみます.
ご回答ありがとうございました.何か進展があった際はご報告いたします.

182管理人★:2018/04/21(土) 19:33:24
あるとさん

ご連絡ありがとうございます。

他のDAWでも駄目でしたか…
ちなみに私のサイトに記載されている環境構築方法の場合
Windows 7だとたしか動きません…。
機能追加した結果等を教えていただけると幸いです。

183猫十:2018/06/29(金) 03:46:30
WavetableSynthとAsyncFileLoadのサンプルありがとうございます。
すっかりご無沙汰してしまい、大変恐縮しております。

3.6.10への移行はちょっと保留にしまして(汗)、遅ればせながらGUI有りの拙作にWavetableSynthとAsyncFileLoadを混ぜる形で組み込んでみています。
WavetableSynthとAsyncFileLoadの信号処理部が相互に干渉しない形でなら混ぜ合わせはできたのですが、
wavbufをsetWaveして打鍵に沿わせようとすると途端にうまく行きません。

現状は添付のtest.wavをwavbufに読み込ませた後にfloatに変換したものと取得したサイズ(51528)をsetWaveに渡しています。
もしよろしければこのあたりの手順についてご教示いただければ幸いです。
何卒宜しくお願いいたします。

184管理人★:2018/06/29(金) 21:15:13
猫十さん

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

昔のコードなので読み返しながらになりますが、作られたプログラムの処理の流れや
setWave()等に渡している引数等を教えていただけると助かります。

また、「うまく行かない」というのはどういう状況なのかも教えてください。

185猫十:2018/06/30(土) 00:22:25
管理人様

お世話になります。猫十です。
ご返信ありがとうございます。

現在の手順なのですが、

コンストラクタで管理人様のtest.wavを読み込んだ後、

>wavbuf = new short[wavsize];
のあとに
f_wavbuf = new float[wavsize];
としまして、

>memcpy_s(wavbuf, wavsize * sizeof(short), buf + sizeof(MyWAVEHEADER), wh.datasize);
のあとに


for (int i = 0; i < wavsize; i++)
{
f_wavbuf[i] = (float)(wavbuf[i]) / 32768.0f;
}
こんな感じでfloatに変換し(汗)
これでkeytableに紐づけできる状況が整ったと(私が勝手に)判断しまして、

for (int i = 0; i < 128; i++)
{
keytable[i] = f_wavbuf;
}
としてます。

setWaveは

onMidiKeyOnで

cvoice[i].setWave(keytable[noteNo], wavsize, 44100.0f / wavsize);

のようにしてます。

この状況で鍵盤を弾くと打鍵に合わせて音階付きでノイズが鳴ります。

以上が現在の流れです。

お手数をおかけいたしますが何卒よろしくお願いいたします。

186管理人★:2018/06/30(土) 10:38:51
猫十さん

2.4の環境がもうないので試せていませんが
onMidiKeyOn()でsetWave()の第3引数を、440.0fぐらいで
試していただけますでしょうか?

 cvoice[i].setWave(keytable[noteNo], wavsize, 440.0f);

187猫十:2018/06/30(土) 13:21:52
管理人様

ご返信ありがとうございます。

さっそく試してみました。

...ドラム鳴ってます(驚)
打鍵(NoteNo=60)で再生速度こそオリジナルと違いますがドラムが聴こえてきます。
NoteNoに追従して再生速度も変わっています。

ありがとうございます!

ちなみにこれはどういうことなんでしょうか?
もしよろしければぜひご教示いただきたく存じます。

188管理人★:2018/06/30(土) 13:51:02
猫十さん

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

setWave()の第3引数は単純な「サンプルレート÷サイズ」ではなく「波形データ自体の音程(周波数)」になります。

今回のように「44,100÷51,528」とすると波形データの周波数は「約0.85Hz」となるので
例えばA4の音(440Hz)で鳴らそうとすると、517倍(440Hz÷0.85Hz)のスピードで波形データを
再生することになります。

MyWavTableSynthサンプルプログラムは「波形データサイズ=1周期分」なので
単純に「44,100÷8」で周波数(=5,512Hz)を計算していますが、wavファイル等から波形データを読み込んだ場合、
「波形データサイズ=1周期分」とならないので、別途指定してあげる必要があります。

 // 第三引数の周波数を設定するにはwavファイルが何Hzかあらかじめ調べておく必要がある。
 (onMidiKeyOn()のこの部分のコメントです。改めてみると分かりにくいコメントで恐縮です。)

今回はリズム音だったのでピッチ自体が不明なため、とりあえずA4キーを押したときに
そのまま再生されるよう440Hzとしました。
ピアノ等の音程のあるwavサンプルの場合はその音程に合わせた周波数を設定すれば大丈夫だと思います。

189猫十:2018/06/30(土) 22:28:26
管理人様

お世話になっております。

こちらこそサンプリング周波数とデータサイズの関係に考えがいたらず、お手数をおかけいたしました。

まだまだ課題は山積みですが引き続き頑張ります。
またお尋ねさせていただくこともあるかと思いますが何卒よろしくお願いいたします。

190猫十:2018/07/15(日) 22:14:17
管理人様

こんばんは。
またまた書き込み失礼します。

2.4でWAVファイルを読み込むサンプラーもどきを作っています。
VSTクラス(AudioEffectX)で読み込んだWAVファイルの情報を文字列としてGUIクラス(AEffGUIEditor)に送りたいのですが方法がわかりません。

VSTクラス(AudioEffectX)とGUIクラス(AEffGUIEditor)間で相互に文字列を受け渡すにはどうすればよいのでしょうか?

いつも質問ばかりですいません。
何卒よろしくお願いいたします。

猫十

191管理人★:2018/07/16(月) 13:53:10
猫十さん

2.4ではやったことがなく、すでに開発環境もないので試せませんが、
下記の方法で出来るのではないでしょうか?
(コードのイメージは全角スペースになっているのでご注意ください。)

①音声処理クラス側(AudioEffectXを継承したクラス側)で文字列を受け取る関数を定義する

class MyVST : public AudioEffectX
{
public:
  // 引数の文字列 fileをメンバー変数のfilepathに設定する関数
  void setFilePath(char* file) { strcpy(file, filepath); };

  〜〜以下略〜〜
protected:
  char filepath[256]; // ファイルパス用の文字列
};

②GUIクラス(AEffGUIEditorを継承したクラス側。MyGUIとする)で
 CTextEditコントロールなどから文字列をうけとった際に通知する処理を追加する

void MyGUI::valueChanged (CDrawContext *pContext, CControl *pControl)
{
  // どのパラメーターが操作されたかを取得する。
  VstInt32 index = pControl->getTag();

  // 操作されたパラメーターを確認。
  // ファイル名入力用のパラメーターなら音声処理クラスに文字列を渡す
  if ( index == MYVST_FILENAME )
  {
    char filepath[256];

    // テキストエディットから文字列を取得
    // (SDK 2.4のテキストエディットの文字列の長さは256固定なので注意)
    ((CTextEdit*)pControl)->getText(filepath);

    // 音声処理クラスに文字列を渡す
    ((MyVST*)effect)->setFilePath(filepath);
  }
  〜〜以下略〜〜
}

以上です。CTextEditの作成方法は下記とほぼ同じだったと思います。
http://vstcpp.wpblog.jp/?p=1722

なお、音声処理クラスのfilepathに書き込む際は排他処理等がいるかもしれません。

192管理人★:2018/07/16(月) 15:45:38
猫十さん

すいません。今質問を読み返して逆方向だということに気付きました

やりかたは>>191と同様で出来ると思います。
(コードのイメージは全角スペースになっているのでご注意ください。)

①GUIクラス側(AEffGUIEditorを継承したクラス側)で文字列を受け取る関数を定義する

class MyGUI : public AEffGUIEditor, CControlListener
{
public:
  // 引数の文字列 fileをメンバー変数のfilepathに設定する関数
  void setFilePath(char* file) { strcpy(file, filepath); };

  〜〜以下略〜〜
protected:
  char filepath[256]; // ファイルパス用の文字列
};

②音声処理クラス側(AudioEffectXを継承したクラス側 MyVSTとする)で
 CTextEditコントロールなどから文字列をうけとった際に通知する処理を追加する

void MyVST::processReplacing(float** inputs, float** outputs, VstInt32 sampleFrames)
{
  〜〜以下略〜〜

  // wavファイルのパスが変更された場合だけ、MyGUI側に新しいファイルパスを渡す
  // (条件式は省略。プログラムに合わせてください。)
  if(〜〜〜〜)
  {
    // たぶん排他処理が必要
    ((MyGUI*)editor)->setFilePath(newfilepath);
  }
}

③GUIクラス側(AEffGUIEditorを継承したクラス側)でテキストラベル等に文字列を反映させる
 (ここではidle関数を利用。参考→https://www39.atwiki.jp/vst_prog/pages/93.html)

void VstGui5::idle ()
{
  // まずは継承元の関数を呼び出す(必須)
  AEffGUIEditor::idle ();

  // このVSTGUI固有の処理を記載する

  // テキストラベルの文字を設定する
  // setText()処理中にfilepathが更新ないように排他処理がいるかもしれません。
  textLabel->setText (filepath);

  // テキストラベルの描画を更新する
  textLabel->setDirty();
}

193管理人★:2018/07/16(月) 15:49:25
>>192
誤記がありました…。

【誤】
②音声処理クラス側(AudioEffectXを継承したクラス側 MyVSTとする)で
 CTextEditコントロールなどから文字列をうけとった際に通知する処理を追加する

【正】
②音声処理クラス側(AudioEffectXを継承したクラス側 MyVSTとする)で
 ファイルパスを渡す処理を追加する。

194猫十:2018/07/18(水) 01:46:05
管理人様

頂きました回答をもとにさっそく試してみたところ、
AudioEffectX側からAEffGUIEditor側へ文字列を送ることができました。(その逆もできました。)

具体的には
AEffGUIEditor側でFileSelector経由で読み込んだファイルのフルパスをAudioEffectX側に送り、
AudioEffectX側でWAVを読み込んで発音部にセット、
読み込んだWAVのサンプリング周波数やビットレートその他の情報(デバッグ用にチャンク位置とか)をAEffGUIEditor側に送って表示
です。(VSTiなサンプラーとしてこのやり方が合っているのかどうかわかりませんが・・・。)

排他処理は入れていないのですが基本的な動作はOKっぽくなってきましたので
実際の曲で市販のプラグインと混ぜて使ってみようと思ってます。

いつも本当にありがとうございます。

また何かありましたら何卒よろしくお願いいたします。


猫十

195管理人★:2018/07/19(木) 22:37:42
猫十さん

動いてよかったです。

VSTのサンプラーとしてやり方があってるかどうかはわかりませんが、
私はプログラムに正解はないと思っています。
想定通り動いたのであればそのやり方でいいと思います。

196pylab:2018/10/03(水) 22:06:37
こんばんわ
最近VSTに興味をもち始めたものです。

VST3.6開発01 – VST3開発環境の準備にて

「VST SDK 3.6.10の場合、下記のエラー LNK1104でビルドが失敗しますが、サンプルプラグインなので上記のライブラリファイルが生成されていれば、
次に進んで頂いても大丈夫です。(サンプルプラグインの動作を見ることはできませんが…)」

とありますが、
https://github.com/steinbergmedia/vst3sdk/issues/17
にて
SMTG_CREATE_BUNDLE_FOR_WINDOWSをオンにすればよいという
情報がありました。

CMAKEの画面の中ほど(赤いところ)で「SMTG_CREATE_BUNDLE_FOR_WINDOWS」のチェックボックスが
ありましたのでオンにしてビルドしましたら
リンカのLNK1104エラーが出なくなりました。

ですが警告でNo snapshot in Bundle は出ています。

確認お願いします。

197管理人★:2018/10/03(水) 23:20:17
pylabさん

情報ありがとうございます。
内容確認して再度ご連絡いたします。

198管理人★:2018/10/04(木) 22:47:39
pylabさん

確認いたしました。

「SMTG_CREATE_BUNDLE_FOR_WINDOWS」をオンにすると
VST 3.6.9以前のフォルダ構成でサンプルを配置するので
確かにエラーはなくなるようです。

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

199らく:2020/02/03(月) 10:47:03
はじめまして。
VSTに関して全くの初心者であり、調べていたら、あらゆるところからここへ導かれました。非常に参考にさせて頂いております。

早速ですが、質問させて頂きます。
「はじめてのVST3.6プラグインの作り」の手順通りに「パラメータの保存方法」まで進みました。
ここに至るまでにもVST3プラグインができ、REAPER上で動作しています。
ところが、別のPC(開発環境的なものは一切入っておりません)にプラグインを持って行くと、同じREAPERですが、VSTプラグイン(.vst3ファイル)が見えません。
原因はどこにあると推測されますか?
ちなみに、VSTプラグインを作成した環境は
 VDT_SDK:Version 3.6.14
 Visual Studio:2019 Version 16.4.2
です。

宜しくお願い致します。

200管理人★:2020/02/04(火) 00:12:56
らくさん

書き込みありがとうございます。
マシュマロと同じ質問だと思いますので、Twitterにて回答させていただきました。
https://twitter.com/vstcpp/status/1224347122364862466

201hiro:2020/05/08(金) 08:19:05
初めましてです。
VSTを作ってみたいと思いまして今日vst_sdkをダウンロードしてhttps://vstcpp.wpblog.jp/?page_id=21の進めたのですが
audioeffectx.hを開くとソースファイルを開けません"pluginterfaces/vst2.x/aeffectx.h"とエラーが出ます。
ダウンロードしたフォルダを見てもaeffectx.hは見つからず、入手できる他のサイトも見つかりません。
解決策を教えてください。VS 2019です。

202管理人★:2020/05/12(火) 13:57:00
hiroさん

書き込みありがとうございます。
お返事が遅くなり申し訳ありません

そちらの方法は、古いバージョンのSDKを使ったものになり、もう実施することができません。
新しいバージョンのSDKを使った方法はこちらになりますのでこちらの方法でご確認いただけますでしょうか。
https://vstcpp.wpblog.jp/?p=1287

203hiro:2020/05/13(水) 10:35:59
解決しました!ありがとうございます。
原因はCMAKEが(ブラウザのバグなのか?)何故かダウンロードできなくて手こずってました...
今日はダウンロードができ、送って頂いたURLの手順通りに進めることができています。
ご丁寧な説明をありがとうございました。

204管理人★:2020/05/13(水) 20:25:13
hiroさん
無事解決できてよかったです。

205ank:2020/07/05(日) 00:35:13
はじめまして。
本、VSTプラグインを読み進めているのですが、GUIのところでつまづいています。
myEditor.uidescのパスを修正した後にテストホストで読み込むとノブ等が表示されるはずですが、黒い画面のままです。
管理人様のサイトを見ると本に記述されていないresource.rcに関する記述があるのですが、このファイルの作成が必要なのでしょうか。

206管理人★:2020/07/09(木) 23:31:30
ankさん

書き込みありがとうございます。
ご連絡が遅れて申し訳ありません。もう少し内容確認にお時間をください。

207管理人★:2020/07/10(金) 00:02:18
ankさん

書籍のResourcesフォルダの配置位置に誤記がありました。申し訳ありません。
MyVstProject.vst3フォルダの配下ではなく、Contentsフォルダの配下にResourcesフォルダを移動させていただけますでしょうか?

208ank:2020/07/14(火) 21:31:39
返事が遅れまして申し訳ございません。
無事にリリース版までVSTの作成が進めることができました。
とても丁寧に書かれた本でC++に慣れていない人間にとって大変ありがたい存在です。続編の予定はあるのでしょうか。
VST作成の第一歩が踏み出せてとても感謝しております。

209管理人★:2020/07/15(水) 22:55:40
ankさん

無事進めることができてよかったです。

続編の予定ですが、今のところありません。
より高度なVSTを作成する際は、SDKのマニュアルか私のサイトなどを
ご確認いただければと思います。

210てつ:2021/02/18(木) 21:07:40
管理人さん、はじめまして。
著書VSTプラグインならびにホームページからこちらの掲示板にたどり着いた初心者です。

プロジェクトの設定を行い、その後、ビルドの実行を行ったのですが、下記のエラーが出ます。
リビルドを開始しました...
1>------ すべてのリビルド開始: プロジェクト:MyVstProject, 構成: Debug x64 ------
1>dllmain.cpp
1>myvst3.cpp
1>コードを生成中...
1> ライブラリ C:\Users\***\source\repos\MyVstProject\x64\Debug\MyVstProject.lib とオブジェクト C:\Users\***\source\repos\MyVstProject\x64\Debug\MyVstProject.exp を作成中
1>MSVCRTD.lib(exe_main.obj) : error LNK2019: 未解決の外部シンボル main が関数 "int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ) で参照されました
1>C:\Users\***\source\repos\MyVstProject\x64\Debug\MyVstProject.vst3 : fatal error LNK1120: 1 件の未解決の外部参照
1>プロジェクト "MyVstProject.vcxproj" のビルドが終了しました -- 失敗。
========== すべてリビルド: 0 正常終了、1 失敗、0 スキップ ==========

ネットで自分なりに探したところ、プロパティのリンカー - システム ー サブシステムを
コンソールからWINDOWSに変えると解決したというサイトがあったので
試してみましたが、上記エラーの「未解決の外部シンボル main」が「未解決の外部シンボル WinMain」に変わるだけで同じエラーが出ます。

dllmain.cppは記載通りに追加したつもりです。

環境はWIN10, VisualStudio2019, VST-SDK3.6.14です。

解決方法をご教授いただけると幸いです。

長文で失礼いたしました。

211管理人★:2021/02/18(木) 21:26:06
てつさん

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

WinMainがないというエラーですので、おそらくVisual Studioのプロジェクト作成時に
「ダイナミックリンクライブラリ(.dll)」を選んでいない気がします。

「VST3のプロジェクトの作成」(https://vstcpp.wpblog.jp/?p=1319)にある
下記の画像の部分になります。
https://vstcpp.wpblog.jp/wp-content/uploads/2020/12/20201230_04.png

お手数だと思いますが、ご確認いただけますでしょうか。

212てつ:2021/02/19(金) 00:33:16
管理人様
迅速なご回答をありがとうございました。

ご指摘の部分からやり直してみたところ、ビルドが成功し、VST HOSTでの音の確認まで
無事に出来ました。
自分ではちゃんとやっているつもりではありましたが、このような些細なミスで
お手を煩わせてしまい、申し訳ありません。

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

213管理人★:2021/02/19(金) 00:40:18
てつさん

無事解決してよかったです。
開発環境やプロジェクトの準備はつまずきやすい難所なので仕方がないです。

214rerohm:2021/05/11(火) 15:48:56
こんにちは
最近VSTの開発を始めようとしているプログラム初心者です。
サイトに掲載されている手順で基本ライブラリのビルドを行ったのですが、

ninja: build stopped: subcommand failed.

すべてビルド が失敗しました。

と表示されて途中で終わってしまいます。Debug版Release版いずれもです。
一応https://vstcpp.wpblog.jp/?p=1287 に記載されている.libファイルは生成
されてはいたのでそのままプラグインの作成を進めてみたのですが、こちらでは

ビルドを開始しました...
1>------ ビルド開始: プロジェクト: MyVSTProject, 構成: Debug x64 ------
1>factory.cpp
1>C:\Users\shoyasaito\source\repos\MyVSTProject\MyVSTProject\factory.cpp(2,10): fatal error C1083: include ファイルを開けません。'public.sdk/source/main/pluginfactoryvst3.h':No such file or directory
1>プロジェクト "MyVSTProject.vcxproj" のビルドが終了しました -- 失敗。
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

と表示されてビルドが失敗します。
VSTSDKのバージョンは3.7.2、Visual StudioはCommunity 2019 Version 16.9.4です。
よろしくお願いします。

215管理人★:2021/05/12(水) 10:08:15
rerohmさん

書き込みありがとうございます。
おそらくポリフォニックシンセサイザー(https://vstcpp.wpblog.jp/?p=1361)のサンプルだと思いますが、
factory.cppの2行目にある「pluginfactoryvst3.h」を「pluginfactory.h」に修正して試してみてください。

216tk:2021/08/06(金) 00:27:18
管理人様 はじめまして.

現在,VST基本プラグインのビルド(https://vstcpp.wpblog.jp/?p=1287)
をしているのですが,debug,release共に以下のようなエラーがでました.

>------ すべてビルド 開始済み: プロジェクト: VST3_SDK、構成: x64-Debug ------
.
.
.

[299/452] Linking CXX shared module VST3\Debug\helloworld.vst3\Contents\x86_64-win\helloworld.vst3
FAILED: VST3/Debug/helloworld.vst3/Contents/x86_64-win/helloworld.vst3
cmd.exe /C "cd . && "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin\cmake.exe" -E vs_link_dll --intdir=C:\VST_SDK\my_plugins\build\helloworld\CMakeFiles\helloworld.dir --rc=C:\PROGRA~2\WI3CF2~1\10\bin\100190~1.0\x86\rc.exe --mt=C:\PROGRA~2\WI3CF2~1\10\bin\100190~1.0\x86\mt.exe --manifests -- C:\PROGRA~2\MICROS~4\2019\COMMUN~1\VC\Tools\MSVC\1429~1.300\bin\Hostx86\x64\link.exe /nologo C:\VST_SDK\my_plugins\build\helloworld\CMakeFiles\helloworld.dir\source\plugfactory.cpp.obj C:\VST_SDK\my_plugins\build\helloworld\CMakeFiles\helloworld.dir\source\plugcontroller.cpp.obj C:\VST_SDK\my_plugins\build\helloworld\CMakeFiles\helloworld.dir\source\plugprocessor.cpp.obj C:\VST_SDK\my_plugins\build\helloworld\CMakeFiles\helloworld.dir\C_\VST_SDK\VST3_SDK\public.sdk\source\main\dllmain.cpp.obj C:\VST_SDK\my_plugins\build\helloworld\CMakeFiles\helloworld.dir\resource\plug.rc.res /out:VST3\Debug\helloworld.vst3\Contents\x86_64-win\helloworld.vst3 /implib:lib\helloworld.lib /pdb:WIN_PDB64\helloworld.pdb /dll /version:0.0 /machine:x64 /debug /INCREMENTAL /SAFESEH:NO lib\sdk.lib lib\sdk_common.lib lib\base.lib lib\pluginterfaces.lib kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib && cmd.exe /C "cd /D C:\VST_SDK\my_plugins\build\helloworld && "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin\cmake.exe" -E copy C:/VST_SDK/VST3_SDK/vst3_doc/artwork/VST_Logo_Steinberg.ico C:/VST_SDK/VST3_SDK/out/build/x64-Debug/VST3/Debug/helloworld.vst3/PlugIn.ico && "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin\cmake.exe" -E copy C:/VST_SDK/VST3_SDK/cmake/modules/../templates/desktop.ini.in C:/VST_SDK/VST3_SDK/out/build/x64-Debug/VST3/Debug/helloworld.vst3/desktop.ini && attrib +s C:/VST_SDK/VST3_SDK/out/build/x64-Debug/VST3/Debug/helloworld.vst3/desktop.ini && attrib +s C:/VST_SDK/VST3_SDK/out/build/x64-Debug/VST3/Debug/helloworld.vst3/PlugIn.ico && attrib +s C:/VST_SDK/VST3_SDK/out/build/x64-Debug/VST3/Debug/helloworld.vst3 && cd /D C:\VST_SDK\VST3_SDK\out\build\x64-Debug\bin && echo [SMTG] Validator started... && C:\VST_SDK\VST3_SDK\out\build\x64-Debug\bin\validator.exe C:/VST_SDK/VST3_SDK/out/build/x64-Debug/VST3/Debug/helloworld.vst3/Contents/x86_64-win/helloworld.vst3 && echo [SMTG] Validator finished. && cd /D C:\VST_SDK\my_plugins\build\helloworld && echo [SMTG] Delete previous link... && rmdir "C:\Program Files\Common Files\VST3\helloworld.vst3" & del "C:\Program Files\Common Files\VST3\helloworld.vst3" && echo [SMTG] Creation of the new link... && mklink /D "C:\Program Files\Common Files\VST3\helloworld.vst3" C:\VST_SDK\VST3_SDK\out\build\x64-Debug\VST3\Debug\helloworld.vst3 && echo [SMTG] Finished.""
[SMTG] Validator started...
.
.
.

ninja: build stopped: subcommand failed.

すべてビルド が失敗しました。

対策法等ご存じでしたらお教えいただきたいです.
vst_sdk 3.7.2,visual studio 16.10です.

217管理人★:2021/08/07(土) 11:54:17
tkさん
確認しますので少々お時間ください。

218管理人★:2021/08/08(日) 12:16:20
確かにビルドの出力では「すべてビルド が失敗しました。」と出ますね…。
(あまり見てなかったです…。)

「エラー一覧」のウィンドウにエラーは出ていますでしょうか?
(警告はたくさん出ていると思いますがこれは問題ありません。)
エラーが出ていなければ、失敗しているのはサンプルのようなのでおそらく問題はありません。

「VST_SDK\VST3_SDK/out/build/x64-Debug/lib」配下にVST基本ライブラリ(下記)が作成されていれば
VST開発はできますのでそのまま続けていただければと思います。

【作成される主なライブラリファイル】
base.lib
sdk.lib
sdk_common.lib
pluginterface.lib
vstgui.lib
vstgui_support.lib
vstgui_uidescription.lib

219<削除>:<削除>
<削除>

220minty:2024/03/05(火) 08:40:26
うつぼかずら様

以前はdllmainの件でお世話になりました、ありがとうございました。
新たに問題が発生しましたので質問させていただきます。パラメーター実装方法1にて紹介されているボリュームパラメーターですが、こちらで実装したところシンセ等が音声処理中にこのボリュームパラメータを弄るとノイズが乗ってしまいます。これは当方の環境の問題なのか、それとも仕様なのかご教授いただければ幸いです。

221管理人★:2024/03/06(水) 09:48:57
mintyさん

「パラメーター実装方法1」のサンプルでノイズが乗るようなことはないと思います。

222minty:2024/03/08(金) 12:38:09
うつぼかずら様

返信ありがとうございます。生成された波形を詳しく見たところ、どうやら音量(=振幅)変化で波形が不連続になることによってクリッピングノイズが発生しているようでした。こういった場合、フェードイン/フェードアウト処理を行って解決するのがやはり一般的でしょうか。
また、今回の件に関係あるか分かりませんが、DAW(ableton live 11)でparam1のオートメーションを書いた際、何故かオートメーション記述よりも3-8ms程度先に処理が行われてしまうようです。例えば、1:00:000の時点でparam1 = 0となるようなオートメーションを書くと、0:59:995時点でparam1=0となる、といった具合です。他のボリュームコントロールプラグインにて同様の処理を行うと正しい時刻で処理が行われる為、DAWの設定の問題ではなさそうです。
DAW側の設定も含めかなりいろいろ調べましたが正直なぜこのような事になっているのかさっぱり分からなかったので、もし何か知見がございましたらご教授いただければと思います。

223管理人★:2024/03/08(金) 19:27:36
mintyさん

急激な音量変化であれば確かにノイズが発生する可能性はありますね。
フェードイン/フェードアウトのような処理にすれば解決すると思います。

タイミングのずれはVST3プラグインのパラメーター実装方法1(https://www.utsbox.com/?p=737)に記載がある下記の通りです。
サンプルプログラムのタイミングについては、厳密なものとなっておりません。

厳密なタイミングにするには、getPoint()関数の引数sampleOffsetを参照する必要があるかと思います。

>パラメーターの操作(変更)は処理するサンプル(numSamples)内で複数回 操作されていることがあるため
>キュー(queue)という形式をとっています。
>例えば、「タグ(ID) 100のパラメーター」が処理するサンプル(numSamples)内で「10サンプル目に値が0.1」
>「20サンプル目に1.0」「30サンプル目に0.5」と操作された場合、下記のような形でIParamValueQueueクラスに変更情報が格納されます。


>前述の通り、パラメーターの操作(変更)は処理するサンプル内で複数回 操作されていることがあるのですが、
>今回のサンプルプログラムでは、最後に変更された値のみを反映しています。
>これは、一般的に処理するサンプルの長さが2〜5ミリ秒程度(※)のため、キュー(queue)の内容に合わせて1つ1つを処理(反映)しても、
>最後に変更された値のみを処理(反映)しても、聴覚的な差がほとんどないためです。
>(※一般的にnumSamplesは100〜200程度の値になる。サンプリングレートを44100Hzで換算すると2〜5ミリ秒程度)

224名無しさん:2024/03/15(金) 11:15:32
こんにちは、初めまして
コンプレッサーの記事のほうにコメントをいれてみたのですが、うまく書き込めないようで、こちらにも書いてみます。
重複していましたら、申し訳ありません。

ゲインの計算ですが、間違っていないでしょうか。

gainL = threshold + (tmpL - threshold) / ratio;
ここは、
gainL = (threshold + (tmpL - threshold) / ratio)/ tmpL;
ではないかと思いますが、私の理解が間違っていますでしょうか?

225管理人★:2024/03/15(金) 12:20:21
ご指摘ありがとうございます。
確かに計算式がおかしいですね。
この計算式だとthresholdを超えると一気に音量が下がって、そのあとまた上がってしまいますね…。

ご指摘の通り、いただいた計算式
 gainL = (threshold + (tmpL - threshold) / ratio)/ tmpL;
もしくは、
 gainL = 1.0f - (tmpL - threshold) / ratio;
のような計算式にすべきですね。

(どのような計算式が良いのかはわかりませんのでご了承ください。)


新着レスの表示


名前: E-mail(省略可)

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

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

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

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