JUCEでアプリケーション開発、AudioProcessorValueTreeStateを使ったリファクタリング2

やっていることは、以前のゲインプラグインと同じです。

今回の改造で、簡単にGUIにも紐づくようになっていくみたいだね~

JUCEのチュートリアル、「Tutorial: Saving and loading your plug-in state」を進めていきます。今回は、XMLでパラメータ管理を行う部分「Storing and retrieving parameters」の項目を進めていきます。

チュートリアルページは次のページになります。

こんな人の役に立つかも

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

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

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

目次

XMLでパラメータ管理部分を改良

getStateInformation

getStateInformation関数を次のように変更しました。

void GainPluginAudioProcessor::getStateInformation (juce::MemoryBlock& destData)
{
    //以前の書き方は以下の通りです。
    //std::unique_ptr<juce::XmlElement> xml(new juce::XmlElement("ParamTutorial"));
    //xml->setAttribute("gain", (double)*gain);
    //xml->setAttribute("invertPhase", *invertPhase);
    //新しくなった書き方は以下の通りです。
    auto state = parameters.copyState();
    std::unique_ptr<juce::XmlElement> xml(state.createXml());
    //copyToBinary関数は同様になります。
    copyXmlToBinary(*xml, destData);
}

XMLとしてパラメータを書き出す際に、parametersのcopyState関数からstate変数に代入して、stateのcreateXml関数からxmlというXmlElementを作成するような流れに変更になっています。以前は、個別に「*gain」や「*invertPhase」という値をXmlElementオブジェクトに入れていました。

setStateInformation

setStateInformationを次のように変更しました。

void GainPluginAudioProcessor::setStateInformation (const void* data, int sizeInBytes)
{
    std::unique_ptr<juce::XmlElement> xmlState(getXmlFromBinary(data, sizeInBytes));

    //コメント部分が以前のプログラムです。
    /*if (xmlState.get() != nullptr)
    {
        if (xmlState->hasTagName("ParamTutorial"))
        {
            *gain = (float)xmlState->getDoubleAttribute("gain", 1.0);
            *invertPhase = xmlState->getBoolAttribute("invertPhase", false); // [5]
        }
    }*/
    //次のプログラムが新しくパラメータを読み込むプログラムになります。
    if (xmlState.get() != nullptr)
        if (xmlState->hasTagName(parameters.state.getType()))
            parameters.replaceState(juce::ValueTree::fromXml(*xmlState));
//parametersにXMLを読み込む方法です。
}

以前のプログラムでは、個別に管理されていた「*gain」と「*invertPhase」という値を直接書き換えるようなプログラムとなっています。

新しい管理方法としては、AudioProcessorValueTreeStateオブジェクトである「parameters」にreplaveStateを利用してxmlからパラメータを読み込むような形になっています。

このあたりは、ほぼテンプレート的に使う感じになりそうですね。

今回の変更のメリットの考察

一見、動作自体はAudioProcessorValueTreeStateオブジェクトの「parameters」に置き換わっただけのように見えますが、ゲインプラグインをそのまま作り変えているだけなので、メリットが感じられないだけでした。

もう一つパラメータを増やした場合、今回の「parameters」の関数「copyState」や「replaceState」を利用することで、「getStateInformation」と「setStateInformation」に個別のパラメータを追加する必要がなくなりました。

ある意味完全テンプレート化されたことに近い気がしています。

チュートリアルの変更だけだと恩恵を見失うところでした。

確かに、自分でもっとパラメータが多いプラグインを作り始めたらとても便利です。

今回は、プラグインのパラメータ保持をする部分のリファクタリングについて進めました。少し前回と比較して、ボリュームが少ない感じがしますが、区切りとして中途半端になってしまうため、すみません^^;

次回は、この作り変えで最もメリットが感じられるGUIの実装部分をやっていきます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次