管理 MIDI Thru

可以将 MIDI 输入设备直接连接到 MIDI 输出设备,以便在输入设备收到 MIM_DATA 消息时,系统会将具有相同 MIDI 事件数据的消息发送到输出设备驱动程序。 若要将 MIDI 输出设备连接到 MIDI 输入设备,请使用 midiConnect 函数。

为了通过多个输出实现最佳性能,应用程序可以选择提供一种特殊形式的 MIDI 输出驱动程序,称为 直通驱动程序。 虽然系统只允许一个 MIDI 输出设备连接到 MIDI 输入设备,但多个 MIDI 输出设备可以连接到一个驱动程序。 此类系统上的应用程序可以将 MIDI 输入设备连接到此设备,并根据需要将 MIDI 连接到任意数量的 MIDI 输出设备。 有关通过驱动程序的详细信息,请参阅 Windows 设备驱动程序文档。

使用消息管理 MIDI 录制

可将以下消息发送到用于管理 MIDI 记录的窗口或线程回调过程。

含义
MM_MIM_CLOSE 使用 midiInClose 函数关闭 MIDI 输入设备时发送。
MM_MIM_DATA 在收到完整的 MIDI 消息时发送。 (此消息用于除系统独占消息之外的所有 MIDI 消息。)
MM_MIM_ERROR 在收到无效的 MIDI 消息时发送。 (此消息用于除系统独占消息之外的所有 MIDI 消息。)
MM_MIM_LONGDATA 在收到完整的 MIDI 系统独占消息或缓冲区已填充系统独占数据时发送。
MM_MIM_LONGERROR 收到无效的 MIDI 系统独占消息时发送。
MM_MIM_MOREDATA 当应用程序处理 MIM_DATA 消息的速度不够快以跟上输入设备驱动程序的速度时发送。
MM_MIM_OPEN 使用 midiInOpen 函数打开 MIDI 输入设备时发送。

 

wParam 参数和 lParam 参数与其中每条消息相关联。 wParam 参数始终指定打开的 MIDI 设备的句柄。 lParam 参数未用于MM_MIM_CLOSEMM_MIM_OPEN消息。

对于 MM_MIM_LONGDATA 消息, lpMidiHdr 指定用于标识系统独占消息缓冲区的 MIDIHDR 结构的地址。 缓冲区可能无法完全填充,因为系统独占消息的大小在记录之前通常不知道,并且必须分配总大小可包含最大预期消息的缓冲区。 若要确定缓冲区中存在的有效数据量,请使用 MIDIHDR 结构的 dwBytesRecorded 成员。

使用回调函数管理 MIDI 录制

可以定义自己的回调函数来管理 MIDI 输入设备的录制。 回调函数记录为 MidiInProc

可以将以下消息发送到 MidiInProc 回调函数的 wMsg 参数。

含义
MIM_CLOSE 使用 midiInClose 函数关闭设备时发送。
MIM_DATA 在收到完整的 MIDI 消息时发送 (此消息用于除) 系统独占消息之外的所有 MIDI 消息。
MIM_ERROR 在收到无效的 MIDI 消息时发送 (此消息用于除) 系统独占消息之外的所有 MIDI 消息。
MIM_LONGDATA 在收到完整的 MIDI 系统独占消息或缓冲区已填充系统独占数据时发送。
MIM_LONGERROR 收到无效的 MIDI 系统独占消息时发送。
MIM_MOREDATA 当应用程序处理 MIM_DATA 消息的速度不够快以跟上输入设备驱动程序的速度时发送。
MIM_OPEN 使用 midiInOpen 函数打开 MIDI 输入设备时发送。

 

这些消息类似于发送到窗口过程函数的消息,但参数不同。 打开的 MIDI 设备的句柄作为参数传递给回调函数,以及使用 midiInOpen 传递的实例数据的双字。

对于 MIM_LONGDATA 消息, lpMidiHdr 指定用于标识系统独占消息缓冲区的 MIDIHDR 结构的地址。 缓冲区可能未完全填充。 若要确定缓冲区中存在的有效数据量,请使用 MIDIHDR 结构的 dwBytesRecorded 成员。

设备驱动程序使用完数据块后,可以清理和释放数据块。

录制 MIDI 音频