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

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

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

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

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

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

ぱんだクリップ
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クラス

あわせて読みたい

③メモリブロックへ保存

③では、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 概要[2022-06-22] さすがに情報が古くなってきたため、最新の規格に合わせて本記事の内容を再編集した記事を新たに書きました。よろしければ、こちらの新記事「C++20スマー...

nullptr

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