版本

menu_open
Wwise SDK 2021.1.14
快速入门示例集成——MIDI

MIDI 集成示例

MIDI 事件通过调用 AK::SoundEngine::PostMIDIOnEvent() 函数进行发布。以下代码显示有关下列的示例:

  • 设置初始 MIDI 参数,
  • 使用事件名称(音频设计师对事件的命名)或者“Wwise_IDs.h”中定义的事件 ID(Wwise 生成的头文件)发布 MIDI 事件。
#include "Wwise_IDs.h" // 由 Wwise 生成的 ID
// 在声音引擎初始化后,注册全局回调函数。
// 确保在处理消息队列之前注册回调;
// 这将确保新发布的 MIDI 事件在当前帧期间
// 得到处理(即我们退出回调函数后立即处理)。
// 获取声音引擎音频设置。这些设置在确定一个音频帧的
// 等效时间时是必须用到的。
AkAudioSettings audioSettings;
(...)
// 用于发布 MIDI 事件的回调函数。
void MIDICallback( bool in_bLastCall )
{
// 如需要,发布 MIDI 事件。
// 格外小心,确保此代码对线程是安全的。
// 对于此例,假设我们需要对同一音符发布 note-on
// 和 note-off 事件。
AkMIDIPost aPosts[2];
const AkUInt8 byNote = 60;
const AkUInt8 byChan = 0; // 值域 0-15 映射到 MIDI 通道值域 1-16。
const AkUInt32 uOnSamples = 0; // 音符将从当前帧的开头开始。
const AkUInt32 uOffSamples = uOnOffset + audioSettings.uNumSamplesPerFrame / 2;
// 音符将在一帧当中结束。
// Note-on
AkMIDIPost& noteOn = aPosts[0];
noteOn.byChan = byChan;
noteOn.NoteOnOff.byNote = byNote;
noteOn.NoteOnOff.byVelocity = 72; // 随机力度
noteOn.uOffset = uOnSamples;
// Note-off
AkMIDIPost& noteOff = aPosts[1];
noteOff.byChan = byChan;
noteOff.NoteOnOff.byNote = byNote;
noteOff.NoteOnOff.byVelocity = 0; // not used for note-off
noteOff.uOffset = uOffSamples;
AkUniqueID eventID = AK::SoundEngine::GetIDFromString( "MIDIEventName" );
AK::SoundEngine::PostMIDIOnEvent( eventID, REGISTERED_MIDI_GAME_OBJECT, aPosts, 2 );
}

请参阅 集成详情——事件 了解有关事件的更多信息。 请参阅 集成详情——MIDI 了解有关 MIDI 的更多信息。

AkUInt8 byType
See AK_MIDI_EVENT_TYPE_* pre-processor definitions
Definition: AkMidiTypes.h:180
#define AK_MIDI_EVENT_TYPE_NOTE_ON
Definition: AkMidiTypes.h:57
AkMidiNoteNo byNote
Definition: AkMidiTypes.h:190
AkMidiChannelNo byChan
Definition: AkMidiTypes.h:181
AKSOUNDENGINE_API AKRESULT RegisterGlobalCallback(AkGlobalCallbackFunc in_pCallback, AkUInt32 in_eLocation=AkGlobalCallbackLocation_BeginRender, void *in_pCookie=NULL, AkPluginType in_eType=AkPluginTypeNone, AkUInt32 in_ulCompanyID=0, AkUInt32 in_ulPluginID=0)
uint8_t AkUInt8
Unsigned 8-bit integer
Definition: AkTypes.h:57
tNoteOnOff NoteOnOff
Definition: AkMidiTypes.h:226
AkUInt32 AkUniqueID
Unique 32-bit ID
Definition: AkTypes.h:62
Configured audio settings
Definition: AkTypes.h:213
AKSOUNDENGINE_API AkPlayingID PostMIDIOnEvent(AkUniqueID in_eventID, AkGameObjectID in_gameObjectID, AkMIDIPost *in_pPosts, AkUInt16 in_uNumPosts, bool in_bAbsoluteOffsets=false, AkUInt32 in_uFlags=0, AkCallbackFunc in_pfnCallback=NULL, void *in_pCookie=NULL, AkPlayingID in_playingID=AK_INVALID_PLAYING_ID)
AKSOUNDENGINE_API AKRESULT GetAudioSettings(AkAudioSettings &out_audioSettings)
@ AkGlobalCallbackLocation_PreProcessMessageQueueForRender
Start of frame rendering, before having processed game messages.
Definition: AkCallback.h:341
AkUInt32 uNumSamplesPerFrame
Number of samples per audio frame (256, 512, 1024 or 2048).
Definition: AkTypes.h:214
AKSOUNDENGINE_API AkUInt32 GetIDFromString(const char *in_pszString)
uint32_t AkUInt32
Unsigned 32-bit integer
Definition: AkTypes.h:59
Definition: AkMidiTypes.h:238
#define AK_MIDI_EVENT_TYPE_NOTE_OFF
Definition: AkMidiTypes.h:56
AkUInt64 uOffset
Frame offset (in samples) for MIDI event post
Definition: AkMidiTypes.h:239

此页面对您是否有帮助?

需要技术支持?

仍有疑问?或者问题?需要更多信息?欢迎联系我们,我们可以提供帮助!

查看我们的“技术支持”页面

介绍一下自己的项目。我们会竭力为您提供帮助。

来注册自己的项目,我们帮您快速入门,不带任何附加条件!

开始 Wwise 之旅