JUCEプラグインでDAWのBPM情報を見るためにはどうしたらいいのか、調査を行いました。
簡単にできるクラスがあるみたいだね~
JUCEには、AudioPlayHeadという抽象クラスがあります。そして、その中に、AudioPlayHead::CurrentPositionInfo構造体があり、これを利用することで、DAWのBPM情報(や再生情報、ループ情報など)が取得できるようです。今回は、 AudioPlayHead::CurrentPositionInfoをJUCEプラグインのプログラミングで使っていく備忘録となります。まずは、シンプルに、DAWでプラグインを立ち上げて、BPMがプラグイン側で拾うことができるかを確認していきます。
こんな人の役に立つかも
・JUCEプラグインを作成している人
・JUCEプラグインでDAWのBPM情報を取得したい人
・JUCEプラグインをDAWで立ち上げてデバッグしたい人
今回の目標
無料DAWのReaperでVSTプラグインとして立ち上げ(①)DAWのBPMを変更します。(②)
VisualStudio2019のデバッグ表示に出力したBPMがDAWと連動しているかどうかを確認します。(③)
次のJUCEフォーラムの記事を参考にさせて頂きました。
https://forum.juce.com/t/getting-bpm-and-beats/13151/5
実装
Projucerにて、Plug-In、Basicを選択して、Tempoというプロジェクトを作成しました。
次に、PluginProcessor.hとPluginProcessor.cppファイルに以下のように実装をしました。実装量自体はとても少ないです。
PluginProcessor.h
class TempoAudioProcessor : public juce::AudioProcessor
{
public:
//...略...
private:
juce::AudioPlayHead* playHead;//[1]
juce::AudioPlayHead::CurrentPositionInfo currentPositionInfo;//[2]
double tempo = 0.0;
//==============================================================================
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (TempoAudioProcessor)
};
[1]で、AudioPlayHeadクラスは抽象クラスなので、ポインタを定義します。(C++の抽象クラスの使い方はこちらのサイトを参考にさせて頂きました。)[2]では、BPMなどの情報を格納するためのCurrentPositionInfo構造多のメンバを定義しておきます。最後に、テンポ情報を格納するための変数をdoubleで定義しておきました。
PluginProcessor.cpp
void TempoAudioProcessor::processBlock (juce::AudioBuffer<float>& buffer, juce::MidiBuffer& midiMessages)
{
//以下の内容に変更しました。
playHead = this->getPlayHead();//[1]
playHead->getCurrentPosition(currentPositionInfo);//[2]
tempo = currentPositionInfo.bpm;//[3]
DBG("tempo:" << tempo);
}
準備したAudioPlayHeadクラスのポインタのplayHeadは、派生クラスをnewすることで使えるようになりますが (C++の抽象クラスの使い方はこちらのサイトを参考にさせて頂きました。) 、すでにAudioProcessorクラスが準備してくれているようで、「getPlayHead」関数の返り値としてAudioPlayHeadクラスへのポインタが取得できます。[1]のように、 getPlayHead関数を呼び出します。そして、[2]のように、playHeadにprivateなメンバとして定義したcurrentPositionInfoをgetCurrentPosition関数の引数としてわたすことで、DAW側の再生情報がcurrentPositionInfo構造体に格納されます。
[3]のようにしてcurrentPositionInfoに格納されたBPM情報にアクセスすることができます。BPMはdoubleの型で格納されていますので、pivateなメンバとして定義したdouble型のtempo変数に格納しています。最後に、DBG関数で出力をします。
デバッグ
Debugモードでビルドしたプラグイン「Tempo」を、DAWのReaperをたちあげました。
VisualStudio2019でビルドをすると、プロジェクトフォルダ内の「プロジェクトフォルダ\Builds\VisualStudio2019\x64\Debug\VST3」の階層にプラグインがビルドされます。
Reaperでは、上記のパスのプラグインを読み込むようにプリファレンスで設定して、VSTが使えるようにします。そして、トラックにプラグインを追加します。
VisualStudio2019の「プロセスにアタッチ」でreaper.exeを選択します。
Reaperのウィンドウを選択しているときにテンポ情報が出力されるので、VisualStudioの出力ウィンドウがReaperのウィンドウに重ならないように配置して、Reaperウィンドウを選択します。