【问题标题】:How do I send Midi events to Software Synth in C++如何在 C++ 中将 Midi 事件发送到 Software Synth
【发布时间】:2011-11-07 06:43:05
【问题描述】:

您好,寻求一些建议。我正在写一些音乐作曲软件。我拼凑了一些工具来读写和发送 midi 数据,它们工作正常。但是我遇到了以下问题:我正在尝试将 midi 事件发送到计算机上的 SW 合成器。

所以我可以从外部键盘控制 sw 合成器。我可以从我自己的电脑软件中控制键盘。但是如何让我的 sw 将 midi 发送到同一台计算机中的 sw 合成器。

如果可能的话,我也在尝试以独立于平台的方式来做到这一点。

谢谢!

虚拟人


我的问题不清楚。

所以我目前在 Win7 上运行。跨平台是一个优先事项,但不是第一个原型。

具体来说,我的问题是访问 kontakt 播放器 (v2),它可以在自己的环境和 midi IO 中工作。但我无法从我自己的软件中访问它。

midiOutGetNumDevs 只返回一个设备,它是 Microsoft GS Wavetable Synth。

我很困惑,我可以通过 midi/usb 电缆将 midi 发送到 kontakt 播放器,但它没有显示为 midi 设备。

我错过了什么?

谢谢

【问题讨论】:

  • 你用的是什么软件合成器?它期望如何接收 midi 输入?
  • 您使用的是哪个操作系统?
  • 你可能想看看 JUCE 框架,它做了很多音频、MIDI 和跨平台的工作,是一个非常好的框架。

标签: midi


【解决方案1】:

您使用的是哪个 API/操作系统?哪个 SoftSynth?

简答:你可以试试“PortMidi”。

http://portmedia.sourceforge.net/

长(呃)答案:

我还没有找到任何能够与任何类型的 MIDI 接收器对话的跨平台 MIDI 库。事实上,这取决于软合成器使用什么来接收 MIDI 事件。

1) 在 Linux 上,您可以使用 ALSA 与 ALSA 合成器对话。 softsynth 可以将自己注册为 ALSA 接收器。您可以: * 使用 ALSA 库连接以将 MIDI 事件发送到此接收器; * 或者您可以将您的应用程序注册为 ALSA MIDI 源并使用另一个程序(aconnectgui、qjackctl、patchage)将其连接到任何接收器。

http://www.alsa-project.org/alsa-doc/alsa-lib/rawmidi.html

http://www.alsa-project.org/alsa-doc/alsa-lib/seq.html

缺点:特定于 Linux

2) 您可以将 JACK 用于 MIDI。与 ALSA MIDI 一样,应用程序可以注册 MIDI 源和接收器。你的 softsynth 可以注册为 JACK MIDI sink。然后你需要让你应用一个 JACK MIDI 源并将它们与另一个程序(qjackctl,patchage)连接起来。

http://jackaudio.org/files/docs/html/index.html

缺点:需要安装、配置、启动JACK

您有两种解决方案可以将 ALSA 接收器/源移动为 JACK 接收器/源:

  • 要么使用 JACK 的内置功能(命令行 -Xseq);

  • 或使用“a2jmidi”

4) 在 MacOS 上,您可以使用 CoreAudio 进行 MIDI。不过我对此一无所知。

5) 在 windows 上,我猜你在

中使用了 midi* 函数

6) 在其他一些操作系统上使用 OSS

7) 使用套接字/协议与合成器通信

您可以让您的软件使用 MIDI/RTP 或 MIDI/UDP 发送 MIDI 事件,这样您就不必关心驱动程序/操作系统。大多数 softsynth 不会直接说出其中的任何一个,因此您需要一个程序来进行桥接(qmidit 或其他)。

8) PortMidi 是一个跨平台的 MIDI 库。但是,它似乎无法直接将 JACK 用作后端(不过,您可以如上所述在 JACK 中使用 ALSA 设备)。

http://portmedia.sourceforge.net/

例如,在 Linux 上,Fluidsynth 可以使用 ALSA、OSS 和 JACK 进行 MIDI 输入。 Timidity++ 可以使用 ALSA 和 Windows API。

【讨论】:

    【解决方案2】:

    同意虚拟 MIDI 驱动程序是最简单的解决方案。

    另一个曾经非常流行的(虽然不确定它在 Win7 上的表现如何)是 MIDI Yoke。 http://www.midiox.com/

    如果您想做一些商业活动,您可以考虑编写自己的虚拟 MIDI 驱动程序,使您的软件控制器(发送器)成为虚拟 MIDI 源。只有在 Windows 上才会有很多工作。

    在 Mac 和 Linux 上,您的工作要容易得多。正如@ysdx 所说,Mac 使用 CoreMIDI,Linux 使用 ALSA/Jack,通过创建虚拟 MIDI 端口并连接到目标,这很容易在您的应用程序中完成。

    【讨论】:

      【解决方案3】:

      好的,这个问题的答案是使用虚拟 MIDI 驱动程序。我在这里找到了一个免费的: http://nerds.de/en/loopbe1.html

      这将创建一个显示 midiOutGetNumDevs 的 midi 输出设备,我也可以流式传输我的 midi 音符,同一台计算机上的其他 Midi 软件可以将其用作 midi 输入设备。

      在 Win7 上工作,并且显然也支持 mac。我的问题解决了。

      “LoopBe1 是一种内部 MIDI 设备,用于在计算机程序之间传输 MIDI 数据。基本上,LoopBe1 是一种“隐形电缆”,用于将应用程序的 MIDI 输出端口连接到任何其他应用程序的 MIDI 输入端口。”

      【讨论】:

        猜你喜欢
        • 2020-04-07
        • 1970-01-01
        • 1970-01-01
        • 2022-01-22
        • 1970-01-01
        • 1970-01-01
        • 2011-11-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多