【问题标题】:C++ MIDI File Change InstrumentC++ MIDI 文件更改工具
【发布时间】:2011-12-11 03:05:49
【问题描述】:

有没有办法在 MSVC 2008 中使用 C++ 播放 MIDI 文件并更改正在播放的乐器?即,我可以弹奏几小节钢琴的 .mid 文件,但将钢琴声音改为电吉他吗?

编辑:对不起,我不够具体!我正在使用 Microsoft GS Wavetable Synth 作为我的合成器。

【问题讨论】:

    标签: c++ visual-studio-2008 visual-c++ instruments midi


    【解决方案1】:

    【讨论】:

    • 我将使用什么命令与 mciSendString 来更改文件正在播放的乐器声音?
    • ` mciSendString("play C:\\",NULL,0,NULL);` 和 ` mciSendString("stop C:\\",NULL,0,NULL );`
    • 不,我的意思是在我调用 mciSendString("play .....) 之后,如何更改正在播放的 MIDI 文件的声音?即,我正在通过 MIDI 播放奏鸣曲mapper 有钢琴的声音,但我想把它改成吉他的声音。
    【解决方案2】:

    如果乐器支持,您应该发送一个程序更改消息来更改声音。否则,您可能以错误的方式看待这个问题,而应该使用多种工具。

    【讨论】:

    • 我实际上并没有将 MIDI 命令发送到乐器,而是发送到内置的 Microsoft GS Wavetable Synth
    • 软件合成器有时被称为“虚拟乐器”。只要您向它发送 MIDI,它就是一种乐器。 ;)
    【解决方案3】:

    查看此链接:

    http://protodesign-inc.com/source/MIDI.htm

    您正在寻找的功能在 MIDI.cpp 中实现。还有一个测试控制台应用程序可用:

    http://protodesign-inc.com/source/MIDIplay_X.htm

    【讨论】:

      【解决方案4】:

      从您的帖子中,我假设您已经编写了从 MIDI 文件中读取事件并将它们实时输出到设备的代码。因此,要更改声音,您需要一个 MIDI 程序更改事件。您可以找到 GM 声音列表here(请注意,GS 是 GM 的超集)和 MIDI 事件的定义here

      如果要将通道 1 上的程序更改为失真吉他,则需要输出字节(十六进制):

      C0 1E
      

      “C”是节目变化事件的前缀,0 指的是通道 1(注意我们通常指的是 MIDI 通道 1-16,但 MIDI 事件从零开始计算通道号)。 1E 是程序 31(同样,它们通常表示为 1-128,但 midi 事件从零开始计数)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-23
        相关资源
        最近更新 更多