チュートリアルデシベルを使ってオーディオレベルをコントロールする
このチュートリアルでは、デシベルスケールを使ってオーディオの出力レベルを変更する方法を示します。これは、オーディオアプリケーションでオーディオレベルの値をユーザーに表示する、より一般的な方法です。
レベル:中級
プラットフォーム:Windows, macOS, Linux
スタート
このチュートリアルのデモ・プロジェクトのダウンロードはこちらから:PIP|ZIP.プロジェクトを解凍し、最初のヘッダーファイルをProjucerで開く。
このステップにヘルプが必要な場合は、以下を参照してください。Tutorial: Projucer Part 1: Getting started with the Projucer.
このチュートリアルはTutorial: Control audio levels.そのチュートリアルに従うべきだった。
デモ・プロジェクト
と似たようなものだ。Tutorial: Control audio levelsこのチュートリアルのデモ・プロジェクトでは、1つのスライ ダーを含むウィンドウを表示します。今回、スライダーの値はdecibels.この値はdecibelsオーディオ処理アルゴリズムで使用する前に、線形ゲイン値に変換する必要がある。ほとんどのオーディオアプリケーションは、ゲインをdecibelsこのようにフィーリング値が変化(または比較)するにつれて、より自然になります。デモ・プロジェクトのユーザー・インターフェースを以下のスクリーンショットに示す。
カスタマイズされたスライダーの作成
今回は、スライダーに隣接して表示されるテキストが、スライダー内の値を示すだけでなく、スライダー内の値を示していることに注目してください。decibelsと表示されますが、接尾辞 "dB "も表示されま す。これはカスタム・スライダー・クラスを作ることで実現できます、DecibelSlider
を継承している。Sliderクラスを作成しました。このカスタム・スライダー・クラスでは、テキストボックスのインターフェイスは、値をdecibels.の中に表示されるテキストの接尾辞はSliderオブジェクトのテキストボックスはSlider::setTextValueSuffix()関数を使うには、もうひとつカスタマイズが必要だ。これは、値が変換される方法をカスタマイズすることである。-INF dBレベルが非常に低くなったとき
INFとはインフィニティここで-INF dBは、このアプリケーションの目的上、沈黙として扱われる。
デシベルズ級
についてDecibelsクラスの値の変換に必要な静的関数がいくつか含まれています。decibelsとリニアゲインがあります。の値を変換する簡単な手段も提供する。decibelsへのStringオブジェクトをオーバーライドする。例えば、仮想関数Slider::getTextFromValue()を使用する。Decibels::toString()関数の中でDecibelSlider
クラス)のようなものだ:
juce::String getTextFromValue (double value) override
{
return juce::Decibels::toString (value);
}
これによってDecibelSlider
クラスを使用して、与えられたスライダー値に対して適切なテキストをテキストボックスに表示することができます。
についてDecibelsを変換する関数はありません。Stringオブジェクトをdecibelsそのため、独自のものを書く必要がある。ここではSlider::getValueFromText()仮想関数(これもDecibelSlider
クラス):
double getValueFromText (const juce::String& text) override
{
auto minusInfinitydB = -100.0;
auto decibelText = text.upToFirstOccurrenceOf ("dB", false, false).trim(); // [1]
return decibelText.equalsIgnoreCase ("-INF") ? minusInfinitydB
: decibelText.getDoubleValue(); // [2]
}
これは、ユーザーがテキストボックスに値を入力し、それがチェックされ、スライダーの有効な値に変換されることを可能にします。これを行うには
- [1]もし "dB "という接尾辞があれば、それを取り除き、(もし "dB "という接尾辞がなければString::trim()関数)。
- [2]残りのテキストが"-INF "であるかどうかをチェックし、その場合は-100を返す。decibelsを -INF dB に置き換えた。Decibelsクラスが使用するNotesこれについてはこのチュートリアルを参照)。そうでなければ、この残りのテキストを
double
値を返します。
スライダーの値を使う
の中でTutorial: Control audio levelsでスライダーの値に直接アクセスしている。getNextAudioBlock()
関数に変換されます。からの変換はdecibelsリニアゲインへの変換には、CPUに負荷のかかる演算が含まれる可能性があるため、特にオーディオスレッドでは、あまり頻繁に変換を実行しない方が賢明でしょう。このチュートリアルのデモプロジェクトではfloat
メンバーlevel
でのMainContentComponent
クラスを作成し、リスナーを使用してスライダーが変更されたときにこの値を更新します。
を初期化する。level
コンストラクタ でメンバをゼロに変換し、これをdecibelsを使用している。Decibels::gainToDecibels()関数を使ってスライダーに初期位置を与えます。Slider::setValue()関数)のようなものだ:
MainContentComponent()
{
decibelSlider.setValue (juce::Decibels::gainToDecibels (level));
decibelLabel.setText ("Noise Level in dB", juce::dontSendNotification);
デシベルをリニアゲインに変換
のラムダ関数ではSlider::onValueChangeヘルパー・オブジェクトからdecibelsスライダーで使用されるスケールを、オーディオ処理に必要なリニアゲイン値に変更します:
decibelSlider.onValueChange = [this] { level = juce::Decibels::decibelsToGain ((float) decibelSlider.getValue()); };