JUCEでアプリケーション開発、XML形式でプラグイン状態を保持

1_プログラミング

今回は、プラグイン情報を保持する方法についてです。

XML形式でプラグイン情報を保持するといいんだね

引き続きゲインプラグインを作成するチュートリアルを進めていきます。プラグインのパラメータをXML形式で保存する方法について改善する項目を勉強しました。プログラムはほぼテンプレートの定型のようなものですが、C++慣れしていないので、そのあたりの調査等で結構時間がかかりました^^;これを機に少しづつC++にも慣れていきます。

次のチュートリアルページの「Using XML to store the processor’s state」項目です。

こんな人の役に立つかも

・JUCEフレームワークに入門したい人

・VST、AUプラグイン開発の最初の一歩を踏み出したい人

・JUCEのチュートリアルをやっている人

スポンサーリンク

プラグイン状態をXML形式で保持するということ

XML形式でパラメータを保存すると、「項目名」としてパラメータを取得できますので、単純に数値をバイナリで書き込むよりは、より扱いやすくなります。パラメータが複数存在する場合、項目名で引っ張れますので、便利ですよね。

※最初は、「.xml」みたいなファイルができてパラメータがテキストファイルで見られるのかと思っていましたが、どうやら項目をもったパラメータとして管理できる、みたいな雰囲気です。

パラメータの保存

getStateInformation関数

XML形式でプラグインの状態を保存するプログラムです。前回、バイナリ形式で状態を書き込んだ際と同じ、「getStateInformation」関数の中身をXML形式で書き込むようにします。

void 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 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++スマートポインタ

nullptr

 

タイトルとURLをコピーしました