【问题标题】:Win32 - Midi looping with MCISendStringWin32 - 使用 MCISendString 进行 Midi 循环
【发布时间】:2013-05-30 06:37:43
【问题描述】:

我正在制作一个游戏,我正在使用 MIDI 文件作为背景音乐。这是我目前正在使用的代码:

void Game::play_music()
{
    // Start the music:
    if(map.levelnumber % 2 == 0)
    {
        mciSendString(L"open MUSIC01.MID type sequencer alias Music1", NULL, 0, NULL);
        mciSendString(L"play Music1", NULL, 0, NULL);
        playing = "Music1";
    } else {
        mciSendString(L"open MUSIC02.MID type sequencer alias Music2", NULL, 0, NULL);
        mciSendString(L"play Music2", NULL, 0, NULL);
        playing = "Music2";
    }
}

这很好用,只是它只播放一次歌曲。我试图通过在 mci 播放命令中添加“重复”来循环它,但它根本不播放任何东西。如何循环播放音乐?

【问题讨论】:

  • 重复选项是not documented 用于排序器。这在a hurry 中可能会变得很难看,请考虑使用众多音频库之一。

标签: c++ winapi audio


【解决方案1】:

我查看了 MSDN 上的多媒体命令字符串参考,发现

TCHAR tch[100];
mciSendString("status [alias] mode", tch, 100, NULL);

将 [alias] 是否正在播放或停止放入“tch”。如果它停止了,我只需使用“seek [alias] to start”命令重新加载 midi 文件。我应该提一下,这会在计算或其他任何东西时导致延迟 - 因此,如果您不将其放在单独的线程中,您的程序将冻结。

【讨论】:

  • 请注意,如果您采用多线程方法,所有 mci 命令必须来自同一个线程。
【解决方案2】:

我知道我来晚了,但我刚刚遇到(并解决了)这个问题:

mciSendString("seek [alias] to start", tch, 100, NULL);

这适用于简单的.wav 文件,我想它也适用于.mid。 当我想播放打开的文件时,我只需发送 2 个命令:

mciSendString("seek [alias] to start",NULL,100,NULL);
mciSendString("play [alias]",NULL,0,NULL);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多