VST3プラグイン開発09 – MIDIメッセージの受取1

VST3プラグインでMIDIメッセージを受信する方法1

前回まででパラメーターの実装や保存など、ひととおりのパラメーターについての説明はさせていただいたと考えております。

【参考】

パラメーター実装方法1 はじめてのVST3プラグインに基本となるパラメーターを実装する方法を記載します。
パラメーター実装方法2 パラメーター実装方法1で実装したパラメーターは「0.0~1.0」しか表示できないので、
それ以外(例えば「10~100」や文字列のリストなど)を表示するパラメーターを実装する方法を記載します。
パラメーター実装方法3 パラメータークラスを継承して自作のパラメータークラスを作成します。
「フィルタのカットオフ周波数」等で利用するスライダーの位置と出力の関係が線形でないパラメーターを実装する方法を記載します。
パラメーターの保存方法 パラメーター実装方法1~3で追加したパラメーターはホスト(DAWなど)を終了すると初期化されてしまいます。
終了時に保存し、次回起動時にデータが読み込まれるようパラメーターを保存・読込する方法を記載します。

ですので、今回はMIDIのノートオン/ノートオフメッセージを受信する方法を記載したいと思います。

今回作成するプラグインはVST3プラグインのパラメーター実装方法で作成したプラグインをベースにします。
(コントロールの実装以外に余計なコードが少ないためです。)

  • パラメーターはなし(ただしパラメーター操作クラスは定義します。)
  • MIDIのノートオン/ノートオフメッセージに応じて音を鳴らすモノフィックシンセサイザー
  • 音色はサイン波のみ。(エンベロープジェネレータ等の機能もなし)
  • 入力バス、出力バスは1つで、共にステレオ(2ch)

今回ベースとなるプラグインの説明はこちらに記載しています。

このVST3プラグインのサンプルソースファイルはこちらからダウンロードできます→vst3dev_20210403
ZIPファイルの中の「vst3dev06_MIDIメッセージを受信する方法1」フォルダが今回のサンプルソースファイルになります。

コンパイル・ビルドの方法は簡単にこちらでご説明しております。ご参考までに。→サンプルソースファイルのビルド方法

音声処理クラスの定義

まずは今回作成するVSTはモノフィックシンセサイザーとして動作するため、音声処理クラスにて必要な変数等を下記の通り定義しております。

【processor.h】

pitchListは標準C++ライブラリの動的配列クラスであるvectorクラスを使用しています。vectorクラスの説明については割愛します。
また、MIDIノートオン/ノートオフイベントを受け取った際にそれぞれの処理を行うonNoteOn()関数とonNoteOff()関数を定義しております。
これらの関数については後述いたします。

入力イベントバスの追加

MIDIのノートオン/ノートオフメッセージを受け取るためには、入力イベントバスを利用します。
音声処理クラスのinitialize()関数でaddEventInput()関数を呼び出して、入力イベントバスを追加いたします。
また、メンバー変数も適当に初期化しております。

【processor.cpp】

なお、このVSTでは入力のオーディオバスは必要ありませんので追加しておりません。

  • addEventInput()関数
  • 概要 音声処理クラスに入力イベントバスを追加します。
    戻り値 概要
    EventBus* 追加したイベントバスへのポインタ
    引数 変数名 概要
    const TChar* name イベントバスの名前。任意の名前でいい
    int32 channels イベントバスのチャンネル数。省略可。省略した場合は16となる。
    BusType busType バスのタイプ。kMainもしくはkAuxを指定。省略可。省略した場合はkMainとなる。基本的にkMainでいいはず
    int32 flags イベントバスのフラグ。kDefaultActiveのみ指定可能。省略可。省略した場合はkDefaultActiveとなる。

MIDIノートオン/ノートオフイベントの受け取り

MIDIノートオン/ノートオフイベントの受け取りはprocess()関数内で行います。
MIDIノートオン/ノートオフを含めいろいろなイベントがあった場合、引数のProcessData& dataに格納されて渡されます。
渡されたイベントは複数あるため、下記のように分離し、必要なメッセージのみを受け取ります。
(今回は必要なメッセージをMIDIノートオン/ノートオフイベントとします。)

【processor.cpp】

MIDIノートオン/ノートオフイベントがあった場合の処理は下記の通りです。

【processor.cpp】

MIDIノートオンイベントを受け取った際には、ノートNoに対応する音程(周波数)を計算し、pitchList配列の最後に保存します。
そして、オシレータの音量を1.0にして音が出るようにします。

MIDIノートオフイベントを受け取った際には、ノートNoに対応する音程(周波数)を計算したあと、pitchList配列から該当する音程(周波数)のデータを取り除きます。
そして、pitchList配列のサイズを確認し、0の場合(つまり押されている鍵盤がない場合)音量を0にします。

音声出力処理

音声処理部分は簡単に下記のとおりとしています。

【processor.cpp】

MIDIノートが押されていない場合は、volumeが0となり無音状態となり、かつthetaが更新されない状態となります。
押されている場合は最後に押されたMIDIノートの音程(周波数)を取得し、それに合わせてsin()関数を出力いたします。

ホストに楽器(VSTi)として読み込ませるために

ホスト(DAWなど)に楽器(VSTi)として読み込ませるためには、factory.cppに記載されている生成関数の自作VSTカテゴリを変更いたします。

【factroy.cpp】

今まではVst::PlugType::kFxとしていたのでエフェクターとして読み込ませていましたが、
Vst::PlugType::kInstrumentとすることで楽器(VSTi)として読み込ませることが可能です。
他にもカテゴリはたくさんありますが、ここでは省略いたします。詳しくはこちらでご確認ください。

注意事項について

このサンプルでは、ノートオン/ノートオフのタイミングでvolumeを0.0→1.0や1.0→0.0のように振幅を急激に変化させているため、ノイズが入ります。
基本的には問題ないと思いますが大きな音量の場合、耳やスピーカーを痛める可能性があります。少し小さめの音で試していただくようお願いいたします。

最後に

以上でMIDIのノートオン/ノートオフを受け取ることができます。
なお本サンプルではMIDIイベントメッセージの厳密なタイミング処理を省略しております。
詳細については要望があれば記載いたしますので、掲示板Twitterでいただければと思います。

次回はMIDIのコントロールチェンジを受信する方法を記載したいと思います。

 次回→MIDIメッセージの受取2

このVST3プラグインのサンプルソースファイルはこちらからダウンロードできます → vst3dev_20210403.zip
コンパイル・ビルドの方法は簡単にこちらでご説明しております。ご参考までに。→サンプルソースファイルのビルド方法

VST3プラグイン作りの情報はこちらにもございます → はじめてのVST3プラグイン作り

ご指摘やご質問などがございましたら、コメント欄か掲示板Twitterでご連絡いただければと思います。

掲示板
■Twitterアカウント:@vstcpp   URL:https://twitter.com/vstcpp


コメントを残す