【JUCEプラグインのレシピ】MIDI入力を扱うシンプルなプログラム

パンダさん

プラグインでの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のデバッグ出力を確認することができます。詳細なデバッグ方法は、こちらの記事でまとめております。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次