デシベルでスライダーの数値を表示したいんです。
JUCEチュートリアルにそういうものがあるね
JUCEプログラミング、チュートリアルページの「Synth」の項の「Control audio levels using decibels」を進めていきます。
Synthの項目は、ほかのチュートリアルの基本的なチュートリアルとして、すでに「Control audio levels」まではかいつまんでやってきました。
・「Build a white noise generator」の記事の1回目
今回は、上記2チュートリアルの次の項目である「Control audio levels using decibels」をやっていきたいと思います。
※以前の記事で作成したホワイトノイズ発生アプリを基本としてプログラミングを進めていきます。
公式のチュートリアルページはこちらのページとなります。
こんな人の役に立つかも
・JUCEプログラミングを勉強している人
・JUCEの「Control audio levels using decibels」チュートリアルを進めている人
・JUCEでスライダーのデシベル表示をしたい人
概要
基本とするホワイトノイズ発生のアプリ
ここから行うチュートリアルは、冒頭に紹介しました、以前の記事「Build a white noise generator」のチュートリアルと、「Control audio levels」のチュートリアルを基本としています。
ソースコード
基本となるプログラムの完成形はGitHubリポジトリにアップロードさせていただきましたので、必要な場合ご利用くださいませ。
完成するアプリ
スライダーの最小値で-INFと表示されます。スライダーの最大値を-12dBで設定して、その音量でのホワイトノイズが発生します。
チュートリアルの方向性として、以前作成した、音量調整が可能なホワイトノイズ発生アプリのスライダーオブジェクトを改造していきます。
スライダークラスの各種関数をオーバーライドして、GUIでの表示に変更を加えたり、取得できる値や、スライダーオブジェクトをデシベルの値で設定できるようにしたりしていきます。
MainComponent.hの作成
DecibelSliderクラスの作成
まずはMainComponent.hファイルの作成です。
sliderクラスを継承した「DecibelSlider」クラスというものを定義していきます。次のように、hファイルの最初のクラスとして追加しました。
#pragma once
#include <JuceHeader.h>
class DecibelSlider : public juce::Slider
{
public:
DecibelSlider() {}
double getValueFromText(const juce::String& text) override;
juce::String getTextFromValue(double value) override;
private:
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(DecibelSlider)
};
sliderには、値を表示するテキストラベルがあります。「getValueFromText」関数と「getTextFromValue」をオーバーライドして、機能追加することで、テキストラベルの表示に単位をつけたり、表示方法を変更したりできます。
詳細な実装はcppファイルに記載していきます。まずはヘッダファイルにクラスを定義しました。
この関数は、アプリ内のどこからも呼ばれていないですが、コメントアウトすると、スライダーテキストの表示がもとに戻るので、sliderクラス内のテキストの設定に関する関数だとわかりました。
sliderクラスのチュートリアルもあるみたいなので、それをやるとより詳しくわかるかもね~
MainComponentクラス
MainComponentクラスのprivateなメンバ変数を変更しました。
class MainComponent : public juce::AudioAppComponent
{
//...略...
private:
juce::Random random;
//以下のメンバは削除します。
//juce::Slider levelSlider;
//juce::Label levelLabel;
//代わりに以下のメンバを追加しました。
DecibelSlider decibelSlider;
juce::Label decibelLabel;
float level = 0.0f;
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MainComponent)
};
sliderクラスは、先ほど新たに定義したDecibelSliderクラスに、また、ラベルはdecibelLabelという名前に変更したものとしました。(Labelクラスは、名前の変更だけです。)
そして、DecibelSliderクラスから値を取得して格納するためのfloat型メンバ変数「level」を初期化しておきました。
ヘッダファイルでなんとなく、雰囲気をつかむことができました。