AudioProcessorValueTreeStateを使ったパラメータ管理

AudioProcessorValueTreeStateについて

JUCEでパラメータ管理を簡単に行うためのクラス。(多くの場合において)従来のAudioProcessorを用いた方法やAudioProcessorParameterを用いた方法よりコードが短く、分かりやすくなる。

公式のチュートリアルを読めば使い方は大体分かると思うので、個人的に補足したいところだけを好き勝手に書く。Tutorial: The AudioProcessorValueTreeState class | JUCE

従来の方法

AudioProcessorを用いた方法

手順としては大まかに以下のようになる。

  • AudioProcessorでパラメータ用の変数を定義
  • AudioProcessorでParameter系の関数を実装
  • PluginEditorでGUIコンポーネントを定義
  • GUIコンポーネントのイベント処理を実装
  • タイマー処理を実装
  • パラメータの保存/読込処理を実装

実装量が多く、AudioProcessorとPluginEditorでパラメータを二重管理するような形になる。ホストを介したPluginEditor→AudioProcessorのパラメータ変更通知も(必要があれば)自前で正規化しないといけない。そして、公式にてAudioProcessorのParameter系の関数は廃止予定とアナウンスあり。

AudioProcessorParameterを用いた方法

廃止される上記方法に取って代わる方法で、大分スマートになった。今回紹介するAudioProcessorValueTreeStateはAudioProcessorParameterのラッパーなので、用途に合わなければAudioProcessorParameterを継承したクラス(AudioParameterFloat等)を使って作り込むことになると思う。

AudioProcessorValueTreeStateを用いた方法

AudioProcessorでAudioProcessorValueTreeState::createAndAddParameterを呼び出してパラメータを追加する。あとはPluginEditorでGUIコンポーネントと先ほど追加したパラメータを連携させれば完了。連携したGUIコンポーネントはパラメータの範囲や初期値が設定されるので別途設定する必要はない。パラメータの保存/読込も一括で処理可能。

チュートリアルの補足

normalisableRange

createAndAddParameterの第4引数。値のレンジ(最小値・最大値・刻み幅)を指定する。[0,1]の範囲以外を設定しても問題なく、(必要がある箇所では)勝手に正規化される。

valueToTextFunction

createAndAddParameterの第6引数。(Cubaseで言う所の)一般エディタへ値をどう表示するかを設定できる。nullptrを渡した場合、[0,1]に正規化されて表示される。渡ってくるvalueは正規化されていない値なので、基本的にはreturn String(value);しておけば問題ないはず。

textToValueFunction

createAndAddParameterの第7引数。valueToTextFunctionの逆で数値がキーボードから入力された時に呼ばれるものだと思うんだけど、よく分からない。ブレークポイントを張ってデバッガをかけても止まらない。ちなみにキーボードからパラメータを入力しようとすると正規化されてしまって、入力した値がそのまま設定されないので非常に困る。だれか詳しい人教えて下さい。