バージョン
-
Wwiseヘルプ
-
-
-
-
-
Wwise SDK 2023.1.3
|
SDK API は、MIDI イベントをサウンドエンジンにポストする関数を提供します。ポストされる可能性のあるThe types of MIDI イベントの種類は以下の通りです:
MIDI イベントがサウンドを生成するには、ターゲットとなるシンセサイザーが必要です。このシンセサイザーは、プロジェクトのアクターミキサー階層でWwiseユーザーが作成したWwiseオブジェクトのコレクションです。 ノートオンイベントは、通常ターゲットのアクターミキサーオブジェクト、またはその子孫の1つを再生します。再生されると、アクターミキサーオブジェクトは次の事柄で停止します:
AK::SoundEngine::PostMIDIOnEvent の "PostMIDIOnEvent" 関数は、MIDIイベントをサウンドエンジンのキューに入れます。この関数は引数として次を受け取ります:
サウンドエンジンは、ポストされたMIDIイベントをシーケンスにグループ化します。 各シーケンスは次によって特定します:
従って、同じMIDIイベント(複数可) を複数のターゲットに同時にポストすることも可能です。例えば、次のような例を考えてみましょう:
MIDIイベントのME1をGame Object GOでEV1にポストすると、サウンドエンジンはMIDIイベントのME1を、MIDIシーケンスのW0-GO-PID1とW1-GO-PID1に追加しますが、このPID1は、PostMIDIOnEventで返されたPlaying IDです。 MIDIイベントME2をイベントEV2にポストすると、サウンドエンジンはMIDIイベントME2をMIDIシーケンスW0-GO-PID2に追加します。
AK::SoundEngine::PostMIDIOnEvent の呼び出しは、MIDIイベントをMIDIシーケンスに追加します。 しかしながら、AK::SoundEngine::RenderAudio() 関数が呼び出されるまではイベントの処理が実行されません。AK::SoundEngine::RenderAudioへの各呼び出しは、メッセージキューを処理し、 オーディオフレームをいくつでも生成できますが、直近RenderAudioからどれくらいの時間が経過しているかに依存します。RenderAudioが生成する各フレームについては、サウンドエンジンはフレーム一つ毎にすべてのMIDIシーケンスを前に進めます。
MIDIイベントが実行される瞬間は、以下の要素によって決まります:
in_bAbsoluteOffsetsがfalseであれば、MIDIイベントが実行されるのは、サウンドエンジンのメッセージキューからPostMIDIOnEventメッセージを読み取ったタイミングから、サンプル数uOffsetだけ経過したときです( MIDIシーケンスの更新 参照)。 in_bAbsoluteOffsetsがtrueであれば、MIDIイベントが実行されるのは、絶対時間でサンプル数uOffsetです。現在の絶対時間は、 AK::SoundEngine::GetSampleTick を呼び出して取得します。
注釈: サンプルの長さは、 AK::SoundEngine::GetAudioSettings を呼び出してサウンドエンジンのオーディオ設定から判断できます。 |
PostMIDIOnEventを呼び出すと、ポストしたすべてのMIDIイベントがMIDIシーケンスにまとめられます。前述の通り、MIDIシーケンスは以下で識別します:
PostMIDIOnEventによって返されるPlaying IDで、意図するシーケンスにイベントがポストされたかどうかが分かります。返されたPlaying IDが、
指定したシーケンスとは別のシーケンスが新たに作成されるのは、以下の場合です:
各MIDIシーケンスを、サウンドエンジンがアプリケーションが意図する的確なタイミングで再生することは重要です。MIDIシーケンスをサウンドエンジンにポストする方法は二つあります。
全体のMIDIシーケンスが既知であり、MIDIシーケンスのタイミングに変更がないとわかっている場合、MIDIシーケンス全体をAK::SoundEngine::PostMIDIOnEventを一度呼び出すだけでポストすることができます。
しかしそうでない場合には、MIDIシーケンスを各フレームで更新する必要があります。AK::SoundEngine::PostMIDIOnEvent 関数は、アプリケーションのどの時点でも、どこでも呼び出すことはできます。 しかし、メインのオーディオスレッド以外で呼び出すと、同期に問題が発生します。AK::SoundEngine::PostMIDIOnEvent の呼び出しは、イベントのみをサウンドエンジンのメッセージキューでポストします。このメッセージキューは、AK::SoundEngine::RenderAudioの呼び出し中に処理され、そのような呼び出しは幾つかの処理されたオーディオフレームへと続きます。 適切な同期を行うには、アプリケーションが次のようにグローバルコールバック関数を登録することを推奨します:
登録された関数は、各オーディオフレームでサウンドエンジンに呼び出されます。アプリケーションんはコールバック関数を使用して、サウンドエンジンが処理するオーディオフレームの最新状態を追跡します。 従って、MIDIイベントをコールバック関数にポストすると、確実に適切な同期が行われます。
AK::SoundEngine::StopMIDIOnEvent "StopMIDIOnEvent" 関数を呼び出して、MIDIシーケンスを停止します。 この関数がパラメータとして受け入れるのは、Playing ID、Event ID、そしてGame Object IDです。 これらのパラメータは、どれも無効の値を設定すれば、ワイルドカードとして機能します。従って、すべての引数の設定が無効であれば、すべてのMIDIシーケンスが停止されます。
この関数の呼び出しは、MIDIシーケンス(複数可)をクリアして、いずれのサウンドの再生を停止します。
MIDIの統合の例は、クイックスタートサンプル統合 - MIDI を参照してください。