チュートリアル:プラグインに適切なバスレイアウトを設定する
プラグインのバスレイアウトを設定し、制限する方法をご紹介します。AppleのLogic Proに搭載されているauvalツールを使って、AUプラグインのバスレイアウトを確認しましょう。
レベル:初級
プラットフォーム:Windows, macOS, Linux
プラグイン形式:VST, VST3, AU, Standalone
クラス:AudioProcessor::BusesLayout, AudioProcessor::BusesProperties, AudioChannelSet, AudioProcessor,
はじめる
このチュートリアルに従うには、プラグインプロジェクトが開いていることを確認するか、またはProjucer内で新しいオーディオプラグインプロジェクトを作成してください。
このステップで助けが必要な場合は、チュートリアルを参照してください:基本的なオーディオ/MIDIプラグインを作成する、パート1:セットアップ。
AudioUnitプラグインをビルドし、auvalツールを使ってテストするには、macOS上でビルドし、Logic Pro Xがインストールされている必要があります。
イントロダクション
JUCEのAudioProcessorクラスは、下図のように、いくつかの入力チャンネルを受け取り、入力されたデータを処理し、その結果をいくつかの出力チャンネルに供給します:
多くのオーディオプロセッサでは、これで十分です。しかし、ホストとプロセッサーの間のコミュニケーションを容易にするために、これらの個々のチャンネルをグループとして表現したいことがよくあります。例えば、下図のように、最初の4つの入力チャンネルをメインチャンネルとして使い、最後の2つの入力チャンネルをサイドチェインとして使うことができます:
上図の黄色い矢印はバスと呼ばれます。つまりバスとは、プラグイン内で同じ信号経路を共有するチャンネルのグループのことで、例えばメイン・オーディオ信号経路やサイドチェイン信号経路を指します。JUCEでは各バスに名前がついており、プラグイン内での特定の用途を識別できるようになっています。
ほとんどのDAWでは、最初の入力バスまたは最初の出力バスをメインバスと呼びます。JUCEでは、単に最初の入力バスまたは出力バスであるメインバスを指すコメントやメソッド名を時々見かけます。
しかし、オーディオプロセッサーの入出力チャンネルをグループ化し、そのグループに名前を付けるだけでは十分ではありません。また、各バス内の各チャンネルの空間的な位置づけに関する情報も伝える必要があります。例えば、ステレオバス(Left, Right)、クアドラフォニックバス(Left, Right, Left Surround, Right Surround)、モノラルバス(Centre)などに設定できます。JUCEでは、各バスにAudioChannelSetが割り当てられ、このAudioChannelSetには、これらのチャンネル・セットの空間的な位置が記述されます(例えば、以下のようになります):AudioChannelSet::mono(), AudioChannelSet::stereo(), AudioChannelSet::quadraphonic() など)。
各バスのAudioChannelSetは、プラグインの寿命を通じて固定されていないことに注意することが重要です。例えば、DAWユーザーがサイドチェイン・ソースをモノラルからステレオに切り替えた時など、DAWはいつでも特定のバスに対して異なるAudioChannelSetを要求することができます。これを実装するために、JUCEは各バスがどのAudioChannelSetオブジェクトをサポートするかをプラグインに問い合わせるコールバックをサポートしています。
AudioChannelSet::disabled()と呼ばれる、チャンネルを含まない特別なAudioChannelSetがあります。この AudioChannelSet は、例えば DAW でサイドチェインが接続されていないときなど、特定のバスが現在使われていないことを示すために使われます。
要約すると、プラグインの各チャンネルに関する情報をいつでも通信するには、DAWとプラグインが必要です:
- チャンネルをバスにグループ化する情報を交換する。
- 各バスの名前と現在のAudioChannelSetに関する情報を交換する。
- どのAudioChannelSetオブジェクトが各バスでサポートされているかをネゴシエートする。
プラグイン開発者として、この情報をホストに伝える方法を探ることから始めましょう。
バスプロパティの割り当て
プラグインを書くとき、まず最初の2点(チャンネルをバスにグループ分けして名前を付け、各バスのAudioChannelSetを選択する)に注目します。この情報は、AudioProcessorのコンストラクタにAudioProcessor::BusesPropertiesのインスタンスを次のように渡すことで、DAWに伝えられます:
ExampleAudioProcessor()
: AudioProcessor (BusesProperties().withInput ("Input", juce::AudioChannelSet::stereo(), true)
.withOutput ("Output", juce::AudioChannelSet::stereo(), true))
{
//...
上記のコードは、このプラグインが2つのバスを持っていることをDAWに通知します:1つは "Input "という名前の入力バスで、もう1つは "Output "という名前の出力バスです。withInput()関数とwithOutput()関数の2番目のパラメータは、それぞれのバスの初期AudioChannelSetを記述します。DAWはいつでもこれを変更でき ることを覚えておくことが重要です。3番目のパラメータは、バスが初期状態で有効か無効かを示します。この2つのバスはメインバスなので、無効にするのはあまり意味がありません。
前述の例は、通常エフェクト・プラグインで使用されます。しかし、シンセ・プラグインには通常出力バスしかないので、コンストラクタは次のようになる:
ExampleAudioProcessor()
: AudioProcessor (BusesProperties().withOutput ("Output", juce::AudioChannelSet::stereo(), true))
{
//...
JUCEでサポートされているもう1つのプラグイン・タイプは、MIDIエフェクト・プラグインです。これらはMIDIを処理するだけなので、オーディオ・バスは一切持っていません:
ExampleAudioProcessor()
: AudioProcessor (BusesProperties())
{
//...
上記のコンストラクタ・コードは、デフォルトのAudioProcessorコンストラクタを呼び出すことと混同しないでください。後方互換性のために、デフォルトのコンストラクタは、"Input "という名前の初期状態で無効な入力バスを1つと、"Output "という名前の初期状態で無効な出力バスを1つ、それぞれAudioChannelSet::stereo()として持つプラグインを作成します。
バスレイアウトの設定
DAWはコンストラクタで提供された初期AudioChannelSetをいつでも変更したいかもしれないので、今必要な唯一のステップは、特定のバスがサポートするAudioChannelSetオブジェクトを設定することです。プラグインは受動的で、常にホストの「なすがまま」になります。プラグインは受動的で、常にホストの "なすがまま "です。プラグインができるのは、要求されたAudioChannelSetの設定を拒否するか受け入れるかだけです。
これを行うには、プラグインはAudioProcessor::isBusesLayoutSupported()コールバックをオーバーライドする必要があります。このコールバックは、プラグインの各バスのAudioChannelSetオブジェクトの配列である1つのBusesLayoutパラメータを受け取ります。
サポートされる入出力バスの配列の要素数は、AudioProcessorコンストラクタで指定したバスの数と常に一致します。
AudioProcessor::isBusesLayoutSupported()コールバックでは、与えられたBusesLayoutがサポートされているかどうかを返す必要があります。例えば、デフォルトのコールバックは、ここに示すように、DAWが要求する任意のBusesLayoutを受け入れます:
bool isBusesLayoutSupported (const BusesLayout& layouts) const
{
return true;
}
ほとんどのエフェクト・プラグインは、メインの入出力バスを1つしか持っていません。一般的には、AudioChannelSetを入力側と出力側で同じにする必要がある:
bool isBusesLayoutSupported (const BusesLayout& layouts) const
{
return layouts.getMainInputChannelSet() == layouts.getMainOutputChannelSet();
}
AudioChannelSet::disabled()という特別なAudioChannelSetがあり、特定のバスがディスエーブルされていることを示すことを覚えておいてください。ほとんどのエフェクト・プラグインはメイン・バスがディスエーブルになることを望まないので、次のようにコールバックにそのチェックを含めることができる:
bool isBusesLayoutSupported (const BusesLayout& layouts) const
{
if (layouts.getMainInputChannelSet() == juce::AudioChannelSet::disabled()
|| layouts.getMainOutputChannelSet() == juce::AudioChannelSet::disabled())
return false;
return layouts.getMainInputChannelSet() == layouts.getMainOutputChannelSet();
}
プラグインがモノからモノ、またはステレオからステレオのコンフィギュレーションにしか対応できないとしましょう。上のコードの最後の行は、入力と出力のレイアウトが同じでなければならないことをすでにチェックしています。したがって、入力バスか出力バスのどちらか一方に対して、次のようなチェックを行うだけでよいのです:
bool isBusesLayoutSupported (const BusesLayout& layouts) const
{
if (layouts.getMainInputChannelSet() == juce::AudioChannelSet::disabled()
|| layouts.getMainOutputChannelSet() == juce::AudioChannelSet::disabled())
return false;
if (layouts.getMainOutputChannelSet() != juce::AudioChannelSet::mono()
&& layouts.getMainOutputChannelSet() != juce::AudioChannelSet::stereo())
return false;
return layouts.getMainInputChannelSet() == layouts.getMainOutputChannelSet();
}
BusesLayoutのテスト
isBusesLayoutSupported()関数で定義されたレイアウトのエッジケースを見落とすことは非常に簡単であるため、プラグインでサポートするバスレイアウト構成は、さまざまなツールを使ってテストすることができます。
このチュートリアルでは、AudioUnitsのテストと検証を行うAppleのLogic Proに含まれるauvalツールと、VSTとAUプラグインをサポートするJUCEに含まれるAudio Plugin Hostの2つのソリューションを紹介します。
auvalツールを使ったテスト
このセクションでは、AudioUnitsのmacOSでのみ使用可能なツールについて説明します。
auvalツールは、AudioUnitsをLogic Pro XやFinal Cut Pro XなどのAppleのプラグインホストでロードする前にバリデーションします。
auvalツールは、Logic Pro XでLogic Pro X > Preferences > Plug-in Manager...と進み、ここに示すようにReset & Rescan Selectionをクリックして検証を起動することでアクセスできます:
しかし、次のようにコマンドラインから呼び出すこともできる:
auval -v aufx Test Manu
第1引数はAUメインタイプを表し、エフェクトプラグインを実装する場合のデフォルトは'aufx'です。第2引数と第3引数は、プロジェクトのProjucer設定で指定されたプラグインコードとメーカーコードです:
例として、AUバリデーションの出力は以下のようになる:
AU Validation Tool
Version: 1.6.1a1
Copyright 2003-2013, Apple Inc. All Rights Reserved.
Specify -h (-help) for command options
--------------------------------------------------
VALIDATING AUDIO UNIT: 'aufx' - 'Test' - 'Manu'
--------------------------------------------------
Manufacturer String: Manu
AudioUnit Name: TestPlugin
Component Version: 1.0.0 (0x10000)
* PASS
--------------------------------------------------
FORMAT TESTS:
Reported Channel Capabilities (explicit):
[1, 1] [2, 2]
Input/Output Channel Handling:
1-1 1-2 1-4 1-5 1-6 1-7 1-8 2-2 2-4 2-5 2-6 2-7 2-8 4-4 4-5 5-5 6-6 7-7 8-8
X X
# # AudioChannelLayouts (5), Input Scope:
//...
Is Audio Channel Layout Available:
Mono Stereo Binau. AU_4 Ambi. AU_5 AU_5_0 AU_6 AU_6_0 AU_7_0 AU_7_0F AU_8 AU_5_1 AU_6_1 AU_7_1 AU_7_1F
X X X
//...
# # AudioChannelLayouts (5), Output Scope:
//...
Is Audio Channel Layout Available:
Mono Stereo Binau. AU_4 Ambi. AU_5 AU_5_0 AU_6 AU_6_0 AU_7_0 AU_7_0F AU_8 AU_5_1 AU_6_1 AU_7_1 AU_7_1F
X X X
//...
* PASS
--------------------------------------------------
AU VALIDATION SUCCEEDED.
--------------------------------------------------
上の出力でわかるように、このテスト・プラグインはモノからモノ、ステレオからステレオのコンフィギュレーションしか受け付けないことが確認できる。
10.12.0から10.13.1までのmacOSバージョンを使用している場合、auvalにバグが含まれており、プラグインのバスレイアウトが正しく報告されない可能性があります。
プラグインホストでのテスト
もう一つの便利なツールは、JUCE に含まれる Audio Plugin Host で、ライブラリの JUCE/examples フォルダにあります。このツールは、実行時にバスレイアウトを変更することで、VSTやAUプラグインをテストすることができます。
Audio Plugin Hostの構築と使用についてヘルプが必要な場合は、チュートリアルを参照してください:基本的なAudio/MIDIプラグインの作成、パート1:セットアップをご参照ください。
Audio Plugin Hostを開き、テストしたいプラグインのインスタンスをロードします。プラグインを右クリックし、Configure Audio I/Oを選択すると、以下のウィンドウが表示されます:
ここでは、プラグインが許可している場合、インプットまたはアウトプットのバスを追加または削除し、選択したバスのチャンネルセットを変更し、バスを自由に有効/無効にすることができます。
プラグインを初めてリードした時、AudioProcessorコンストラクタで設定されたデフォルトのBusesLayoutコンフィギュレーションが入力と出力のピンに表示されていることに注意してください。
さまざまなバスレイアウトを試し、auvalツールとAudio Plugin Hostでプラグインの動作をチェックしてください。
概要
このチュートリアルを読めば、次のことができるようになるはずだ:
- 異なるチャンネルセットで入力、出力、サイドチェーンバスを定義。
- プラグインタイプに適したバスレイアウトを設定します。
- auvalツールを使ってAudioUnitsのバス配置構成を確認します。
- JUCEオーディオ・プラグイン・ホストで、異なるバス・プロパティを割り当てます。