dwing吧 关注:5,650贴子:88,862
  • 11回复贴,共1

请教一下,DirectSound能够直接处理Midi命令吗?或

只看楼主收藏回复

在调用midiOutOpen之后,可以调用midiOutShortMsg(midiHand, 0x463C90);发出声音,不知道您有没有研究过,暂且当你没研究过解释一下第二个参数46是音量,3C对应的是60,是音符,9代表的是发声指令,0是通道。就是这样一条命令通过midiOutShortMsg发送到midi就会发出一个声音。我不想把这个声音录下来或保存下来再到DirectSound里打开,有没有办法就是
0x463C90这个命令让DirectSound处理?
或者我想能否经过转换以Wave数据的形式送到DirectSound里,但是我并不知道平时打开wav文件之后送入 DirectSoundBuffer的数据是什么格式的?


IP属地:广东1楼2013-07-28 01:22回复
    midiOut系列函数是MCI类接口吧, 和DirectSound无关的
    DirectSound不支持midi的东西, 可以用DirectMusic来处理MIDI


    IP属地:北京2楼2013-07-28 12:29
    回复
      midiOut和DirectMusic输出的采用貌似很难取到, 有可能没有正式的办法取到


      IP属地:北京3楼2013-07-28 12:31
      回复
        DirectShow里有MIDI Renderer Filter。


        IP属地:新疆5楼2013-07-28 12:45
        回复
          请问一下, DirectMusic我查过一下,其实是看到一篇问别的内容的帖子在您的吧里,其中你提到了DirectMusic来处理MIDI,所以我才来问的。之前看到了一片VB的代码,使用IDirectMusicLoader8来打开*.mid文件,但是查过之后, IDirectMusicLoader8这个接口在 Dmusici.h里,而我搜索了全机都没找到这个头(我知道DirectMusic从DX中移到了Windows SDK里,在Windows SDK 的include目录也没找到。我的系统是Win7)那怎么办?有替代的办法吗?


          IP属地:广东6楼2013-07-29 03:10
          收起回复
            回复 dwing :天哪,我装着DX11的系统去找个DX8的SDK……或许换一下吧,将数据经过转换以Wave数据的形式送到DirectSound里。能不能让MidiOut设备仅仅是走个流程将消息发到声卡里,声卡不让音箱发出声音,却能像真正发出声音一样让WaveIn*函数把声音录下来?简单的比喻:把音箱电源关掉,没声了,不过声卡还是照样做着他发生的工作,WaveIn*函数还是录他的音。


            IP属地:广东7楼2013-07-29 19:19
            回复
              楼主多补点基本功。


              IP属地:新疆来自Android客户端8楼2013-07-29 19:53
              收起回复
                请问楼主,我直接这么写,为什么电脑没有任何声音发出来呢?
                HMIDIOUT midiHand;MMRESULT ret ;
                MMRESULT re = midiOutOpen(&midiHand,MIDI_MAPPER,0,0,0);
                if (re ==MMSYSERR_NOERROR)
                {
                for(int i= 0;i<1000;i++)
                {
                ret=midiOutShortMsg(midiHand, 0x46C390);
                if (ret !=MMSYSERR_NOERROR)
                {
                break;
                }
                }
                }


                9楼2014-05-04 11:49
                回复
                  这么多年过去了,不知道楼主的问题解决没有,你是想要实现把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


                  IP属地:四川10楼2020-03-11 23:11
                  收起回复