微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Windows中使用MIDIstream的问题

我正在使用C ++和Windows API编写Windows程序,并试图将MIDI消息排入MIdistream,但是当我尝试这样做时收到一个奇怪的错误。 如果我使用midioutShortMsg将未排队的MIDI消息发送到stream,则它可以正常工作。 但是, midistreamOut总是返回错误代码68,即#define d到MCIERR_WAVE_OUTPUTUNSPECIFIED 。 midioutGetErrorText给出了下面的错误描述:

当前的MIDI映射器设置是指未安装在系统上的MIDI设备。 使用MIDI映射器编辑设置。

我正在使用Windows 7(64位),并尝试用我的系统上的MIDI_MAPPER和全部四个MIDI输出设备的设备ID打开MIdistream,但仍然收到完全相同的错误消息。

以下是打开MIdistream的代码

如果wpf应用程序没有响应,然后自动重启

可执行文件从命名pipe道启动?

MonoDevelop不在Windows上安装:Gtk#问题

在Python 3中使用pythonmagick的蒙太奇?

如何获得在记事本中打开文件文件名和path?

UINT device_id = MIDI_MAPPER; //Also tried 0,1,2 and 3 midistreamOpen( &midi,&device_id,( DWORD_PTR )hwnd,CALLBACK_WINDOW );

以下是发送MIDI信息的代码

MIDIHDR header; MIDIEVENT *event; event = ( MIDIEVENT * )malloc( sizeof( *event ) ); event->dwDeltaTime = delta_time; event->dwStreamID = 0; event->dwEvent = ( MEVT_F_SHORT | MEVT_SHORTMSG ) << 24 | ( msg & 0x00FFFFFF ); header.lpData = ( LPSTR )event; header.dwBufferLength = sizeof( *event ); header.dwBytesRecorded = sizeof( *event ); header.dwUser = 0; header.dwFlags = 0; header.dwOffset = 0; midioutPrepareHeader( ( HMIdioUT )midi,&header,sizeof( header ) ); midistreamOut( midi,sizeof( header ) );

我该如何解决这个问题?

如何使C#应用程序充当服务?

Python 2.7仍然访问Python 3.4目录

捕获API /工具的平台详细信息 – 与Windows错误报告等效

如何绑定Windows Phone 7中的XML文件的dynamic多列表数据?

在第三方应用程序中创build窗口作为孩子

问题是我正在使用整个事件结构作为MIDI流的缓冲区。 事实证明,该结构的第四个成员dwParms实际上应该从短消息中省略。 要更正发布的问题中的代码,可以将两行代码更改为以下内容

header.dwBufferLength = sizeof( *event ) - sizeof( event->dwParms ); header.dwBytesRecorded = sizeof( *event ) - sizeof( event->dwParms );

在向流中添加多个事件时,使用一个DWORD数组实际上更容易,而不是对MIDIEVENT结构MIDIEVENT困扰。

对于使用Windows API进行MIDI编程的任何人,请注意,某些MSDN文档具有误导性,不足或完全错误

MIDIEVENT结构的文档说明如下:

dwParms

如果dwEvent指定MEVT_F_SHORT,则不要在流缓冲区中使用此成员。

这是不明确的,因为“使用”不是意指“包括”而不是“指定”。

以下是程序员需要了解的另外两个缺陷:

dwEvent

事件代码和事件参数或长度。 […]该成员的高字节包含标志和事件代码。 必须指定MEVT_F_LONG或MEVT_F_SHORT标志。 MEVT_F_CALLBACK标志是可选的。

当选中头文件时, MEVT_F_预处理器定义实际上指定了完整的DWORD而不仅仅是单个标志,所以在我的代码中,指定这个成员的行应该如下所示:

event->dwEvent = MEVT_F_SHORT | MEVT_SHORTMSG << 24 | ( msg & 0x00FFFFFF );

除此之外,还发现包含MIDIHDR结构的内存应该保留,直到缓冲区结束播放为止,所以在大多数实现中,它应该分配在堆上而不是堆栈中。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐