今回は、プラグイン情報を保持する方法についてです。
XML形式でプラグイン情報を保持するといいんだね
引き続きゲインプラグインを作成するチュートリアルを進めていきます。プラグインのパラメータをXML形式で保存する方法について改善する項目を勉強しました。プログラムはほぼテンプレートの定型のようなものですが、C++慣れしていないので、そのあたりの調査等で結構時間がかかりました^^;これを機に少しづつC++にも慣れていきます。
次のチュートリアルページの「Using XML to store the processor’s state」項目です。
前回の記事の続きとなります。前回の記事はこちらをご参照ください。
![](https://panda-clip.com/wp-content/uploads/2020/10/JUCE7.jpg)
※本記事は、まだAudioProcessorValueTreeStateを利用したパラメータ管理を行う前の記事です。AudioProcessorValueTreeStateクラスを利用したパラメータの状態を保持する場合は、こちらの記事をご参照ください。
こんな人の役に立つかも
・JUCEフレームワークに入門したい人
・VST、AUプラグイン開発の最初の一歩を踏み出したい人
・JUCEのチュートリアルをやっている人
プラグイン状態をXML形式で保持するということ
XML形式でパラメータを保存すると、「項目名」としてパラメータを取得できますので、単純に数値をバイナリで書き込むよりは、より扱いやすくなります。パラメータが複数存在する場合、項目名で引っ張れますので、便利ですよね。
※最初は、「.xml」みたいなファイルができてパラメータがテキストファイルで見られるのかと思っていましたが、どうやら項目をもったパラメータとして管理できる、みたいな雰囲気です。
パラメータの保存
PluginProcessor.cppのgetStateInformation関数とsetStateInformation関数に実装を追加します。
getStateInformation関数
XML形式でプラグインの状態を保存するプログラムです。前回、バイナリ形式で状態を書き込んだ際と同じ、「getStateInformation」関数の中身をXML形式で書き込むようにします。
void GainPluginAudioProcessor::getStateInformation (juce::MemoryBlock& destData) override
{
//①スマートポインタでxmlというポインタを準備します。
std::unique_ptr<juce::XmlElement> xml (new juce::XmlElement ("ParamTutorial"));
//②XmlElementクラスのsetAttribute関数を利用して「gain」という項目名でパラメータを書き込みます。
xml->setAttribute ("gain", (double) *gain);
//③DAWプロジェクトへパラメータを保持するときはバイナリ形式に変更します。
copyXmlToBinary (*xml, destData);
}
①ポインタでXmlElement型オブジェクト「ParamTutorial」を参照
unique_ptrはC++の「スマートポインタ」という機能らしいです。ポインタは確保したら解放しないといけないのですが、何となくうまくやってくれる賢いポインタ、程度の理解です^^;
①では、XmlElement型オブジェクトのxmlというポインタを作成しています。実際には、「ParamTutorial」という名前のXmlElement型のオブジェクトがnewされていますので、このオブジェクトへのポインタが変数「xml」に格納される、ということでしょう!
スマポ
②gainパラメータの書き込み
②は、xmlがポインタなのでアロー演算子でメンバ関数「setAttribute」を呼び出しています。ここは、Cと同じですね~。
XmlElementクラス
③メモリブロックへ保存
③では、XMLをDAWのプロジェクトファイルなどに格納するため、バイナリに変換します。これは便利な関数が用意されています。AudioProcessorクラスの「copyXmlToBinary」関数を使います。
引数一つ目にXmlElement型オブジェクトをいれ、2つ目に、書き込み先であるメモリーブロックを指定するようです。一つ目のxmlは、「XmlElement型ParamTutorial」へのポインタなのですが、アスタリスクをつけることで、ParamTutorialの値を示すことになります。これもCのポインタと同じです。
パラメータの読み出し
次に、DAWが起動したときなどに、プラグインの状態を読みこみ、プラグインパラメータに設定するプログラムです。こちらも以前と同様に「setStateInformation」関数を利用してプラグインにパラメータを設定します。
void GainPluginAudioProcessor::setStateInformation (const void* data, int sizeInBytes) override
{
//①getXmlFromBinaryでバイナリデータを読み込み、xmlStateがデータのアドレスを格納します。
std::unique_ptr<juce::XmlElement> xmlState (getXmlFromBinary (data, sizeInBytes));
//②条件でパラメータを抽出します。
if (xmlState.get() != nullptr)
if (xmlState->hasTagName ("ParamTutorial"))
*gain = (float) xmlState->getDoubleAttribute ("gain", 1.0);
}
①バイナリデータの読み込み
xmlStateというポインタに、バイナリデータのポインタを格納します。バイナリデータからXMLに読み込む流れは、getXmlFromBinaryの引数を見ても、このようにする、というようなプログラムになっています。
②条件でパラメータを判定
スマートポインタには、生のポインタを得るためのgetが備わっています。また、「nullptr」はC++でNULLのポインタを表現するもので、まずは、このスマートポインタがNULLではないかを判定しています。
そして、xmlElementクラスの関数であるhasTagNameで「ParamTutorial」という名称であるかを確認しています。これは、書き込んだ際のxmlElementの名称がそのままこの文字列になります。書き込みの際のxmlElementの名称と一致させる必要があります。
最後に、gainとしてxmlElementクラスの関数「getDoubleAttribute」で以前に格納した「gain」パラメータを取得します。二つ目の引数は、もしパラメータの数値がなかったら、デフォルト値を入れるという設定値になります。型はキャストでfloatにして「*gain」に入れます。
意外とC++の知識以外はほとんどテンプレートになりそうな予感です。
これを応用すればいろいろなパラメータを保持できそうだね!
参考にさせていただいたサイト
C++スマートポインタ
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-412672c5f0600ab9a64263b751f1bc81.png?ixlib=rb-4.0.0&w=1200&mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTk3MiZoPTM3OCZ0eHQ9QyUyQiUyQjExJUUzJTgyJUI5JUUzJTgzJTlFJUUzJTgzJUJDJUUzJTgzJTg4JUUzJTgzJTlEJUUzJTgyJUE0JUUzJTgzJUIzJUUzJTgyJUJGJUU1JTg1JUE1JUU5JTk2JTgwJnR4dC1hbGlnbj1sZWZ0JTJDdG9wJnR4dC1jb2xvcj0lMjMyMTIxMjEmdHh0LWZvbnQ9SGlyYWdpbm8lMjBTYW5zJTIwVzYmdHh0LXNpemU9NTYmcz01ZTYwZWQ5NDQ2MzlmMmY2NTEzZGQ3NDljYWU0Yzg2MA&mark-x=142&mark-y=57&blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZoPTc2Jnc9NzcwJnR4dD0lNDBobWl0byZ0eHQtY29sb3I9JTIzMjEyMTIxJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTM2JnR4dC1hbGlnbj1sZWZ0JTJDdG9wJnM9MmUzNTIyMDcyYzI3OTczMmE5NzMwZGU0MzliOGQwMTc&blend-x=142&blend-y=486&blend-mode=normal&s=925f45f34e7409316b2d4ef16ee61688)
nullptr
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-412672c5f0600ab9a64263b751f1bc81.png?ixlib=rb-4.0.0&w=1200&mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTk3MiZoPTM3OCZ0eHQ9TlVMTCUyMCVFMyU4MSVBOCUyMG51bGxwdHIlMjAlRTMlODElQTMlRTMlODElQTYlRTQlQkQlOTUlRTMlODElOEMlRTklODElOTUlRTMlODElODYlRUYlQkMlOUYmdHh0LWFsaWduPWxlZnQlMkN0b3AmdHh0LWNvbG9yPSUyMzIxMjEyMSZ0eHQtZm9udD1IaXJhZ2lubyUyMFNhbnMlMjBXNiZ0eHQtc2l6ZT01NiZzPTk5OWRhMzIwNTcwY2FkNTk3NjYxNGIwMjBiNTViM2Qz&mark-x=142&mark-y=57&blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZoPTc2Jnc9NzcwJnR4dD0lNDBnb19hc3RyYXllciZ0eHQtY29sb3I9JTIzMjEyMTIxJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTM2JnR4dC1hbGlnbj1sZWZ0JTJDdG9wJnM9MmQ4NGRmNDViMTJiMGU5MzdlNmJmMTIxZmM2ZDczZmQ&blend-x=142&blend-y=486&blend-mode=normal&s=f156fd122ae83fef9f2d5ea51d09a407)