今回は、プラグイン情報を保持する方法についてです。
XML形式でプラグイン情報を保持するといいんだね
引き続きゲインプラグインを作成するチュートリアルを進めていきます。プラグインのパラメータをXML形式で保存する方法について改善する項目を勉強しました。プログラムはほぼテンプレートの定型のようなものですが、C++慣れしていないので、そのあたりの調査等で結構時間がかかりました^^;これを機に少しづつC++にも慣れていきます。
次のチュートリアルページの「Using XML to store the processor’s state」項目です。
前回の記事の続きとなります。前回の記事はこちらをご参照ください。
※本記事は、まだ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++の知識以外はほとんどテンプレートになりそうな予感です。
これを応用すればいろいろなパラメータを保持できそうだね!