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

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

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

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

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

あわせて読みたい
JUCE: Tutorial: Adding plug-in parameters

前回の記事の続きとなります。前回の記事はこちらをご参照ください。

ぱんだクリップ
JUCEでアプリケーション開発、プラグインパラメータの保持とゲインの滑らかな変化 | ぱんだクリップ DAWを再起動すると、プラグインパラメータが初期化されてしまいます。 プラグインとしての体裁を整えるには、もう少し追加の仕組みが必要そうだね~ 前回作成したゲインプ...

※本記事は、まだ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クラス

あわせて読みたい
JUCE: XmlElement Class Reference

③メモリブロックへ保存

③では、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++スマートポインタ

Qiita
C++11スマートポインタ入門 - Qiita 概要  C++11では、unique_ptr<T> shared_ptr<T> weak_ptr<T>の3種のスマートポインタが新たに追加された。これらのスマートポインタは、いずれもメ...

nullptr

Qiita
NULL と nullptr って何が違う? - Qiita C++11 では、NULL に代わるものとして nullptr キーワードが追加されています。 この話を聞くと「NULL じゃだめなの?」と一度は思う人は少なく無いと思います。 そこで、...
よかったらシェアしてね!
目次
閉じる