【问题标题】:C++ Win32 - How to loop MIDIs with mciSendString()?C++ Win32 - 如何使用 mciSendString() 循环 MIDI?
【发布时间】:2017-07-29 19:11:28
【问题描述】:

我正在制作一个游戏,我正在尝试使用 mciSendString() 循环一个 MIDI 文件。我查看了 CProgramming.com,但示例的窗口对象是 OWL,我无法移植它们。我还尝试查看 Brian Gradin 的问题,但答案仅包含两行代码。我在 MSDN 上看过,但这就像一个参考,而不是一个教程。添加重复不会播放任何内容。这是我到目前为止的代码:

mciSendString("open PUG1.MID type sequencer alias music", NULL, 0, NULL);
mciSendString("play music", NULL, 0, NULL);

如果您提供帮助,那么我一定会将您列入演职员表。 谢谢! :)

编辑:我已尝试处理通知标志,但我的代码将无法正常工作。它播放一次主题然后停止。

    //At the end of WM_CREATE...
    mciSendString("open MUSIC\\PUG2.MID type sequencer alias music", NULL, 0, NULL);
    mciSendString("play music", NULL, 0, NULL);
break;
case MM_MCINOTIFY:
    mciSendString("seek music to start", NULL, 0, NULL);
    mciSendString("play music", NULL, 0, NULL);
break;

【问题讨论】:

  • 你试过play music repeat吗?
  • 将它添加到 MIDI 文件时不会播放任何内容。
  • 嗯,值得一试。似乎您必须按照您提到的问题中的建议手动处理它。如果序列器支持notify 标志,它可能是更好的方法。您也可以考虑使用 3rd 方库。
  • 很抱歉打扰您,但请您举个例子。我的代码似乎不正确。我将编辑主题。

标签: c++ winapi loops midi mci


【解决方案1】:

您可以使用notify 标志在歌曲结束时收到通知。

这似乎有效:

case WM_CREATE:
    mciSendString("open pickin0.mid type sequencer alias music", NULL, 0, NULL);
    mciSendString("play music notify", NULL, 0, hWnd);
    break;

case MM_MCINOTIFY:
    mciSendString("seek music to start", NULL, 0, NULL);
    mciSendString("play music notify", NULL, 0, hWnd);
    break;

您需要在使用 notify 命令时传递您的窗口句柄,以便它可以将MM_MCINOTIFY 命令发送到某处。

【讨论】:

  • 谢谢你,退休忍者。我一定会把你的名字添加到学分中。 :)
猜你喜欢
  • 1970-01-01
  • 2011-06-24
  • 1970-01-01
  • 2011-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多