管理 MIDI Thru

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

若要通过多个输出实现最佳性能,应用程序可以选择提供一种特殊的 MIDI 输出驱动程序形式,称为 thru 驱动程序。 尽管系统只允许一个 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 参数。

Value 含义
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 音频