这么多年过去了,不知道楼主的问题解决没有,你是想要实现把midi合成的声音输出到DirectSoundBuffer中,这个可以通过DirectMusic来实现,这方面我也研究了很久,直到去年才研究明白,DirectMusic有很多上层的接口都被巨硬移除了(新版DXSDK和WinSDK中都不包含其头文件了,并且不提供x64的dll文件),但是巨硬保留了DirectMusic的底层接口(头文件保留至今,并且支持x64,但这方面网上的资料几乎为0)。
midiOut都是调用的midi设备驱动来实现midi播放,midiOut这类API本身不参与任何midi合成,而是单纯的给midi设备发送消息(举个例子,比如Yamaha自动钢琴,你用midiOutOpen打开自动钢琴设备,再用midiOutShortMsg发送命令,这样实现的效果是让自动钢琴根据你命令自动演奏,而不是在你的电脑上发出声音),另外巨硬官方给midiOut写了一个软件合成设备(比如你在电脑波形声卡上播放出的音乐就是通过这个驱动实现)。所以midiOut是无法满足我们的需求的,因为它所有的合成都是交给驱动去实现的,没法在应用层合成音频数据(这个同一个midiOut只能Open一次的原因)。
DirectMusic在midiIn/Out的基础上又增加很多新功能,比如应用层合成音频数据(DM提供了自己的软件合成器,合成结果输出到DirectSoundBuffer中,并且可以自由更换dls格式的音色库文件,而midiOut的软件合成器只能固定发出系统自带的gm.dls音色库的那两百多个音色)、多轨支持(以前midiOut只能单轨16通道,DM则支持多个音轨各自独立16个通道,DM软件合成器最大支持1000个音轨共16000个通道)、多实例支持(midiOut只能打开一个实例,DM则可以打开多个实例,DM软件合成器几乎就可以同时打开无限个实例)、更多的复音数支持(midiOut的软件合成器最大只能同时发出32个声音,而DM的软件合成器可以同时发出1000个声音)。
这是去年我发布的DirectMusic的底层接口和DirectSound对接例子:
https://www.0xaa55.com/thread-25859-1-1.html