プラグインでのMIDIの扱いがいまいちピンと来ていません。
プラグインでMIDIメッセージを扱う基本的なところを復習してみよ~
今回は、JUCEプラグインでMIDIの入力を扱うシンプルな例を実装していきたいと思います。JUCEプラグインでMIDIを扱ったことは、アルペジエータプラグインのみでした。その時は、あまり細かいことを意識していなかったのです。要素技術として、MIDIの扱いの部分を切り出してみたいなと感じました。
こんな人の役に立つかも
・JUCEでVSTを作成してみたい人
・JUCEでMIDIプラグインを作成したい人
・JUCEプラグインのMIDIの扱いの基本的な部分を知りたい人
作成したアプリ
JucePluginHostアプリで動作させた状態です。外部からMIDIをプラグインに与えると、デバッグ出力にMIDIメッセージを出力するようなアプリを作成していきます。
プロジェクトの作成
プロジェクトをMIDI入力のみとします。過去の記事のプロジェクトの作成方法のように、MIDIプラグインとしてプロジェクトを定義しておきます。
プロジェクトの設定はこちらの記事です。
今回は、midiTest3というプロジェクト名を付けました。
実装
今回は、プロセッサのprocessBlock関数を変更するのみです。
projucerのプラグインのテンプレートに含まれるprocessBlock関数には、すでにmidiMessagesという引数を受け取っており、ここにオーディオバッファ毎のMIDIメッセージが入ってきますので、これを利用していきます。
void MidiTest3AudioProcessor::processBlock (juce::AudioBuffer<float>& buffer, juce::MidiBuffer& midiMessages)
{
jassert(buffer.getNumChannels() == 0);
auto numSamples = buffer.getNumSamples();
//[1]MIDIバッファを見るための範囲for文です。
for (const auto metadata : midiMessages)
{
//[2]MidiMessageクラスとして取り出します。
const auto msg = metadata.getMessage();
//[3]Midiのオン又はオフが発生したときに実行します。
if (msg.isNoteOnOrOff()) {
DBG("NoteNumber:" << msg.getNoteNumber());
DBG("Discreption:" << msg.getDescription());
}
//[4]ノートオンとオフを別の判定にした場合
/*if (msg.isNoteOn()) {
}
else (msg.isNoteOff()) {
}*/
}
}
[1]は、このように、processBlock関数の第二引数で渡されるmidiMessages引数を、範囲for文を使って、バッファの1ブロック分のMIDIデータを確認することができます。
[2]では、metadataはMidiBufferIteratorクラスということで、イテレータなので、getMessage()関数を実行して、msgにMidiBufferクラスのオブジェクトとして取得します。
[3]では、MIDIメッセージの判定を行います。MidiBufferクラスのisNoteOnOrOff関数を利用することで、ノートオンメッセージか、ノートオフメッセージかを判定します。ノートオン、ノートオフが発生しているメッセージの場合、ノートナンバーとディスクリプションを取得してデバッグコンソールに出力するような処理です。
ノートナンバーは、getNoteNumber関数で取得できますが、返り値はint型です。C-2を0として、半音上がると1づつ増加していきます。鍵盤のG8が127となりました。
getDescreptionは、Midiメッセージをテキスト形式(返り値String型)で受け取ることができる関数です。↑のスクショの「Discreption:」以降のような文字列が返ってきます。
[4]のように、ノートオンとオフのタイミングを分けた判定もできます。そのほか、MidiMessageクラスの関数として、isSustainPedalOnのようなペダルオンオフ関連などもあります。
動作の検証について
下のスクショは、冒頭のものと同一です。このように、JUCE付属の、AudioPluginHostアプリをビルドしてVisualStudioのプロセスアタッチでデバッグを行いました。
AudioPluginHostアプリは、JUCE付属のプロジェクトからビルドする必要があります。使い方を知りたい方は、こちらの記事でまとめておりますので、ご参照ください。
VisualStudioで「プロセスのアタッチ」をすることで、動作しているプログラムのデバッグを行うことができます。今回は、外部で動作させている「AudioPluginHostアプリ」をデバッグしています。この方法で、プラグインとして動作している今回作成したVSTのデバッグ出力を確認することができます。詳細なデバッグ方法は、こちらの記事でまとめております。