在Windows中使用MIDIstream的问题

在Windows中使用MIDIstream的问题,第1张

概述在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结构的内存应该保留,直到缓冲区结束播放为止,所以在大多数实现中,它应该分配在堆上而不是堆栈中。

总结

以上是内存溢出为你收集整理的在Windows中使用MIDIstream的问题全部内容,希望文章能够帮你解决在Windows中使用MIDIstream的问题所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1231977.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存