audio - 如何将使用 DirectMusic 在内部播放 MIDI 的旧游戏转换为将原始 MIDI 输出到默认设备?

标签 audio game-engine midi directmusic

我有一个播放 MIDI 文件的旧游戏,其中包含以下内容:

IDirectMusicPerformance8* m_pDMPerformance;
IDirectMusicLoader8* m_pDMLoader;
CoCreateInstance(CLSID_DirectMusicLoader, NULL, CLSCTX_INPROC, IID_IDirectMusicLoader8, (void**)&m_pDMLoader);
CoCreateInstance(CLSID_DirectMusicPerformance, NULL, CLSCTX_INPROC, IID_IDirectMusicPerformance8, (void**)&m_pDMPerformance);
m_pDMPerformance->InitAudio(NULL, NULL, m_hWnd, DMUS_APATH_SHARED_STEREOPLUSREVERB, 128, DMUS_AUDIOF_ALL, NULL);

无论用户的配置如何,这都会导致 MS GS Wavetable Synth + 混响。我需要能够将正确的原始 MIDI 输出到默认的 MIDI 设备,对于一些精明的用户来说,它是像 VirtualMidiSynth 或 FluidSynth 这样的软合成器、MT-32 仿真器、OPL3 仿真器,甚至是具有它自己的机载样本,例如真正的 MT-32。无需在应用程序中选择设备——我宁愿让它选择默认/#0 MIDI 设备并将原始 MIDI 发送给它。 .mid 文件本身是标准的,可以在其他媒体播放器中完美播放,这些播放器将原始 MIDI 输出到用户选择的设备或默认/#0 设备。

最佳答案

你有两个选择:

  • 传统Win32 MIDI API
  • UWP MIDI API

  • UWP API 允许使用 Win32 API 支持的所有 MIDI 设备,以及 Windows 10 上的蓝牙 LE MIDI。

    顺便说一句:VirtualMIDISynth 创建一个 MIDI 设备,模拟一个硬件 MIDI 设备,如 MS GS Wavetable Synth。但 FluidSynth 没有,因此您需要一个虚拟 MIDI 电缆驱动程序才能从 Windows 中的另一个应用程序向其输出 MIDI。

    关于audio - 如何将使用 DirectMusic 在内部播放 MIDI 的旧游戏转换为将原始 MIDI 输出到默认设备?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57999947/

    相关文章:

    地形上的 C++ DirectX11 纹理无法正确渲染

    java - Java 中的合成器和音序器(javax.sound.midi) 是什么?

    matlab - 在 MATLAB 中使用两个 channel 生成声音

    javascript - 是什么导致 Safari 中的音频播放缓慢/延迟?

    python - 如何从实时应用程序中检测特定声音?

    java - 在 Java 上播放单个 MIDI 木版音符?

    python - Linux Python Pygame 无法访问/etc/alsa/alsa.conf

    Java 频谱图图像 : mp3 and microphone

    c++ - 为什么我在所有像素的双 for 循环中使用 SDL2 和 SDL_RenderCopy 时性能不佳?

    c# - 尝试编写 C# 代码使导弹跟随 Unity 中的玩家