前回終わらなかった実装を進めていきます!
主にdecibelSliderクラスの実装だね
JUCEプログラミング、引き続きチュートリアルページの「Synth」の項の「Control audio levels using decibels」を進めていきます。
前回終わらなかった、残りのdecibelSliderクラスに関してのcppの実装の内容となります。
公式のチュートリアルページはこちらのページとなります。
こんな人の役に立つかも
・JUCEプログラミングを勉強している人
・JUCEの「Control audio levels using decibels」チュートリアルを進めている人
・JUCEでスライダーのデシベル表示をしたい人
MainComponent.cpp
MainComponent.cppに以下のようにdecibelSliderクラスの関数を実装していきます。
getValueFromText関数
double DecibelSlider::getValueFromText(const juce::String& text)
{
auto minusInfinitydB = -100.0;
//[1]
auto decibelText = text.upToFirstOccurrenceOf("dB", false, false).trim();
//[2]
return decibelText.equalsIgnoreCase("-INF") ? minusInfinitydB
: decibelText.getDoubleValue();
}
この関数は、テキストから数値を取得する関数です。(関数名そのまま^^;)スライダーのテキストボックスから値を取得するときの関数のようです。「minusInfinitydB」変数に最小となるのデシベルを格納しています。
[1]では、Stringクラスの受け取った引数「text」で「upToFirstOccurrenceOf」関数を呼び出しています。この関数は、第一引数のサフィックス(数値の後についたりする単位などの文字列)が文字列に存在しているかを調べることができます。第二引数をfalseにすることで、「dB」という文字列があるところまでの文字列を取り出すようにしています。最後に「trim」関数で空白を削除しています。こうすることで、文字列の中の数値のみを取り出すことができます。※この時点ではまだ文字列としての数字です。
[2]では、「equalsIgnoreCase」関数で大文字と小文字を区別しない文字列の比較を行います。文字列が「-INF」の時は、「minusInfinitydB 」である-100の値を返し、それ以外の場合は、スライダーからdouble型で値を取得して、返します。
※最小値「-INF」やサフィックス「dB」は、次の関数で定義されます。
getTextFromValue関数
数値をテキストに変換する関数です。この関数は、スライダークラスの数値表示用のテキストへ数値からテキストに変換したものを渡すときに利用されていそうです。(詳細には調べていないのですが、挙動を検証した感じそのような雰囲気です。)
juce::String DecibelSlider::getTextFromValue(double value)
{
return juce::Decibels::toString(value);
}
ここで、引数として与えた数値(double型)をDecibelクラスのtoString関数で文字列化して返すのみです。
このToStringsはいくつかの仕様があります。重要な点としては、
・サフィックス「dB」がデフォルトで不可される点
・最小値はデフォルトで「-INF」という文字列になる点
です。
そのため、先ほどのgetValueFromText関数ではこれらの文字列を取り除いたりする処理をしていました。
動作の感じ、これらの関数はsliderクラス内部の設定関数といえそうです。
decibelSliderクラスの関数がない場合
先ほど定義した関数は、今回のアプリのどこからも呼び出されていません。実際には、sliderクラスについてもう少し勉強しなければいけないのだと思いますが、sliderクラスを継承したクラスを作成する場合、先ほどの関数をoverrideすることで、数値を表示するためのテキストボックスの表示方法などを変更できるようです。
ちなみに、先ほど定義した関数の一つでも実装されていないと(.hと.cppからコメントアウトして検証)テキストボックスの数値は以前のゲイン値のものに戻ります。
GitHubのリポジトリ
GitHubリポジトリにここまで作成したプログラムを配置しましたので、ご活用ください。