バージョン

menu_open
Wwise SDK 2018.1.11
統合の詳細 - MIDI

イントロダクション

SDK API は、MIDI イベントをサウンドエンジンにポストする関数を提供します。ポストされる可能性のあるThe types of MIDI イベントの種類は以下の通りです:

  • ノートオンイベント。
  • ノートオフイベント。
  • そしてコンティニュアス コントローラ (continuous controller: CC) イベント。

MIDI イベントがサウンドを生成するには、ターゲットとなるシンセサイザーが必要です。このシンセサイザーは、プロジェクトのアクターミキサー階層でWwiseユーザーが作成したWwiseオブジェクトのコレクションです。 ノートオンイベントは、通常ターゲットのアクターミキサーオブジェクト、またはその子孫の1つを再生します。再生されると、アクターミキサーオブジェクトは次の事柄で停止します:

  • ループに設定されていなければ、そのソースの最後に達した時、
  • または、対応するセットオフイベント (同じ音ならびにチャンネル) が同じターゲットに送られる。

ゲームへのMIDIイベント統合

AK::SoundEngine::PostMIDIOnEvent の "PostMIDIOnEvent" 関数は、MIDIイベントをサウンドエンジンのキューに入れます。この関数は引数として次を受け取ります:

  • MIDIイベント
  • そのイベントが起きる時間 (現在のフレームと関連)。
  • イベント ID。
  • ゲームオブジェクト ID。

サウンドエンジンは、ポストされたMIDIイベントをシーケンスにグループ化します。 各シーケンスは次によって特定します:

  • ゲームオブジェクト ID; 関数のパラメータ、
  • Wwiseオブジェクト ID; イベント IDに対応するイベントの、各プレイアクションのターゲットオブジェクトから取得。 イベントに関する詳細は、 イベントの統合 を参照してください。

従って、同じMIDIイベント(複数可) を複数のターゲットに同時にポストすることも可能です。例えば、次のような例を考えてみましょう:

  • EV1イベントには、Wwise オブジェクト W0 および W1両方のプレイアクションがあります。
  • EV2イベントには、Wwise オブジェクト W0のプレイアクションがあります。

MIDIイベントME1をGameオブジェクトGOのあるEV1にポストすると、サウンドエンジンは MIDIイベントME1をMIDIシーケンス W0-GOとW1-GOに追加します。 MIDIイベントME2をイベントEV2にポストすると、サウンドエンジンはMIDIイベントME2をMIDIシーケンスW0-GOに追加します。

AK::SoundEngine::PostMIDIOnEvent の呼び出しは、MIDIイベントをMIDIシーケンスに追加します。 しかしながら、AK::SoundEngine::RenderAudio() 関数が呼び出されるまではイベントの処理が実行されません。AK::SoundEngine::RenderAudioへの各呼び出しは、メッセージキューを処理し、 オーディオフレームをいくつでも生成できますが、直近RenderAudioからどれくらいの時間が経過しているかに依存します。RenderAudioが生成する各フレームについては、サウンドエンジンはフレーム一つ毎にすべてのMIDIシーケンスを前に進めます。

MIDIシーケンスの更新

各MIDIシーケンスを、サウンドエンジンがアプリケーションが意図する的確なタイミングで再生することは重要です。MIDIシーケンスをサウンドエンジンにポストする方法は二つあります。

全体のMIDIシーケンスが既知であり、MIDIシーケンスのタイミングに変更がないとわかっている場合、MIDIシーケンス全体をAK::SoundEngine::PostMIDIOnEventを一度呼び出すだけでポストすることができます。

しかしそうでない場合には、MIDIシーケンスを各フレームで更新する必要があります。AK::SoundEngine::PostMIDIOnEvent 関数は、アプリケーションのどの時点でも、どこでも呼び出すことはできます。 しかし、メインのオーディオスレッド以外で呼び出すと、同期に問題が発生します。AK::SoundEngine::PostMIDIOnEvent の呼び出しは、イベントのみをサウンドエンジンのメッセージキューでポストします。このメッセージキューは、AK::SoundEngine::RenderAudioの呼び出し中に処理され、そのような呼び出しは幾つかの処理されたオーディオフレームへと続きます。 適切な同期を行うには、アプリケーションが次のようにグローバルコールバック関数を登録することを推奨します:

  • AK::SoundEngine::RegisterGlobalCallback( &MyCallbackFunction, AkGlobalCallbackLocation_PreProcessMessageQueueForRender );

登録された関数は、各オーディオフレームでサウンドエンジンに呼び出されます。アプリケーションんはコールバック関数を使用して、サウンドエンジンが処理するオーディオフレームの最新状態を追跡します。 従って、MIDIイベントをコールバック関数にポストすると、確実に適切な同期が行われます。

MIDIシーケンスの停止

AK::SoundEngine::StopMIDIOnEvent "StopMIDIOnEvent" 関数を呼び出して、MIDIシーケンスを停止します。 この関数は、イベントID (Event ID) と ゲームオブジェクト ID (Game Object ID) をパラメータとして受け入れます。 いずれのパラメータも、ワイルドカードとして機能するために無効な値をセットすることができます。従って、if both Event ID ならびに Game Object ID の両方に無効な値をセットすると、すべてのMIDIシーケンスが停止します。

この関数の呼び出しは、MIDIシーケンス(複数可)をクリアして、いずれのサウンドの再生を停止します。

MIDIの統合の例は、クイックスタートサンプル統合 - MIDI を参照してください。


このページはお役に立ちましたか?

サポートは必要ですか?

ご質問や問題、ご不明点はございますか?お気軽にお問い合わせください。

サポートページをご確認ください

あなたのプロジェクトについて教えてください。ご不明な点はありませんか。

プロジェクトを登録していただくことで、ご利用開始のサポートをいたします。

Wwiseからはじめよう