やっていることは、以前のゲインプラグインと同じです。
今回の改造で、簡単に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の実装部分をやっていきます。