[
板情報
|
カテゴリランキング
]
したらばTOP
■掲示板に戻る■
全部
1-100
最新50
| |
波形描画ビューのその後
22
:
sagamat
:2023/12/27(水) 14:54:49
うつぼかずら様
いつも的確なご指南をいただき、心より感謝申し上げます。無事にGUIクラスから音声処理クラスに配列を送ることができました!
一難去ってまた一難なのですが、音声処理クラスに送った配列をVST終了時に保存、開始時に読込したいと思っております。「パラメータの保存方法」の記事を拝見し、真似てみておりますが、うまくいきません(クラッシュします)。
保存・読込したいのは音声処理クラスの配列サイズ(int N)、配列(float* data)、GUIクラスのテキスト(UTF8StringPtr str)の三つです。とりあえずGUIクラスのものは置いておいて、「パラメータの保存方法」を参考にし、
state->write(&N, sizeof(int));
state->write(&data, sizeof(float)*N);
など(readも同様)と記載してみましたが、上述の通り、VST開始時にホストごと落ちます。writeの記載の部分がクラッシュの原因なのかはまだはっきりしておりませんが、何か間違いや注意点などございましたらご教示いただけますと幸いです。
23
:
管理人★
:2023/12/27(水) 16:28:24
sagamatさん
解決してよかったです。
サンプルのコードがそのままだとすると、
「state->write(&data, sizeof(float)* N)」の第1引数(&data)がfloat**になっており、
想定外のメモリを参照しクラッシュしている気がします。
「state->write(data, sizeof(float)* N)」でよいかと思います。
24
:
sagamat
:2023/12/27(水) 20:22:49
うつぼかずら様
初歩的なミスで大変恐縮です。ご指摘の修正で保存・読込ができるようになりました。ありがとうございます!
あとはGUIクラスなんですが、テキストの保存に関して、サイズの指定の仕方がわかっておりません。strのサイズ数はどのようにして取得できますでしょうか?また、GUIクラスの配列についても音声処理クラスと同様に保存・読込しようとしてみましたが、うまくいかないようです。GUIクラスでの保存・読込について何か注意すべき点などございますでしょうか?
25
:
管理人★
:2023/12/27(水) 21:47:37
sagamatさん
GUIクラスの状態の保存は、パラメータ操作クラスのgetState()で保存するしかありません。
ですので、文字列や波形データの配列などはGUIクラスで保持するのではなく、パラメータ操作クラスに保持するようにします。
GUIクラスのデータをパラメーター操作クラスに設定・保持する方法は
>>18
や >> 21 の方法の応用でほとんど対応できると思います。
そのうえで、”パラメーター操作クラス”のgetState()で保存・setState()で読込します。
(音声処理クラスではなくパラメーター操作クラスにもsetState()・getState()があります。)
【参考】
https://steinbergmedia.github.io/vst3_dev_portal/pages/FAQ/Persistence.html
https://www.utsbox.com/?p=1060
なお、文字列ですが、UTF8StringPtr型であれば、const char*の再定義なので、strlen()あたりで文字列の長さを取得できると思います。
26
:
sagamat
:2023/12/29(金) 22:03:03
うつぼかずら様
ありがとうございます!おかげ様でGUIクラスのデータ(の一部)は保存・読込できるようになりました。ただ、文字列の保存・読込に苦戦しております。
controller.hで
std::string dataText = "test";
int dataTextLen = dataText.length();
と宣言し、パラメータ操作クラスのgetstate()で
state->write(&dataTextLen, sizeof(int));
state->write(&dataText, dataTextLen);
と記載、setstate()で、
res = state->read(&dataTextLen, sizeof(int));
res = state->read(&dataText, dataTextLen);
と記載するとクラッシュします(正確には、state->read(&dataText, dataTextLen)でクラッシュします)。
std::stringで保存しようとしていることがそもそも間違いなのか、参照の仕方に間違いがあるのか、いろいろ試しておりますが、どうもうまくいきません。
もし、お気づきの点があればご指摘頂けますと幸いです。
27
:
管理人★
:2023/12/30(土) 13:21:21
sagamatさん
書き込みがstringクラスのポインタなので、最初に文字列のバッファがあるとは限らないと思います。
シンプルに文字列そのものを保存した方がわかりやすいかもしれません。
state->write(dataText.c_str(), dataTextLen);
読み込みも、上記で文字列を保存したのであれば、一度文字列で読み込んでstring型に設定する形でよいかと思います。
char *tmpText = new char[dataTextLen];
res = state->read(tmpText, dataTextlen);
dataText = tmpText;
delete[] tmpText;
(stringクラスの文字列バッファのポインタを直接取得できるのであれば、上記のtmpTextは使う必要がありません。)
28
:
sagamat
:2023/12/30(土) 14:10:35
うつぼかずら様
年末の慌ただしい時期にも関わらず迅速にご対応いただき、ありがとうございます。
的確なご指導のおかげで、無事に目的のプラグインを作成することができました!
大変勉強になりました。重ねて感謝申し上げます。
もしお許しいただけるのであれば、少しでも何かお礼をしたく、メールででもご連絡いただけますと幸いです。
29
:
管理人★
:2023/12/30(土) 15:08:46
sagamatさん
無事解決してよかったです。
調べればいずれわかることだと思うので、特にお礼などは不要です。
30
:
sagamat
:2023/12/30(土) 19:54:50
うつぼかずら様
調べに調べればいずれわかることかもなのかもしれませんが、ご教示いただいたことで多大な時間と労力を削減できました。ありがとうございます。
ちなみにこのスレッドで質問させていただいて作成したのはチューナーとコンボルバーです。
特にコンボルバーですでに出回っているものはいろんな機能が追加されており、根本の部分がブラックボックス化しているものが多く、ネイティブに作成できたことで安心して使用することができます。
もしかすると今後もまたご質問させていただくことがあるかもしれませんが、できる限り自分で解決できるよう引き続きC++、ならびに、VSTのことを勉強するようにいたします。
取り急ぎ、深く御礼を申し上げます。良いお年をお迎えください。
新着レスの表示
名前:
E-mail
(省略可)
:
※書き込む際の注意事項は
こちら
※画像アップローダーは
こちら
(画像を表示できるのは「画像リンクのサムネイル表示」がオンの掲示板に限ります)
スマートフォン版
掲示板管理者へ連絡
無料レンタル掲示板