白天 发表于 2017-11-22 20:07:42

如何用程序获取MIDI输出设备名

如何用程序获取MIDI输出设备名,如何选择其中某个作音源

0xAA55 发表于 2017-11-23 07:18:22

使用 midiOutGetDevCaps 即可。

#include<stdio.h>
#include<tchar.h>

#include<Windows.h>

int print_device(UINT nDevId)
{
        MIDIOUTCAPSA midiCaps; // 设备信息

        if(midiOutGetDevCapsA(nDevId, &midiCaps, sizeof midiCaps) == MMSYSERR_NOERROR)
        {
                printf("制造商标识:%u\n", midiCaps.wMid);
                printf("产品标识:%u\n", midiCaps.wPid);
                printf("驱动版本:%u.%u\n", HIBYTE(midiCaps.vDriverVersion), LOBYTE(midiCaps.vDriverVersion));
                printf("产品名:%s\n", midiCaps.szPname);
                printf("MIDI输出方式:");
                switch(midiCaps.wTechnology)
                {
                case MOD_MIDIPORT:
                        printf("MIDI硬件端口\n");break;
                case MOD_SYNTH:
                        printf("合成器\n");break;
                case MOD_SQSYNTH:
                        printf("方波合成器\n");break;
                case MOD_FMSYNTH:
                        printf("FM合成器\n");break;
                case MOD_MAPPER:
                        printf("微软MIDI波表\n");break;
                case MOD_SWSYNTH:
                        printf("软件合成器\n");break;
                default:
                        printf("未知原理\n");break;
                }
                if(midiCaps.wTechnology != MOD_MIDIPORT) // 端口不存在合成声音数量概念
                {
                        printf("内部合成器支持的声音数量:%u\n", midiCaps.wVoices);
                        printf("内部合成器支持的最大同时播放音符数:%u\n", midiCaps.wNotes);
                }
                printf("响应的通道的掩码:0x%04X\n", midiCaps.wChannelMask);
                if(midiCaps.dwSupport)
                {
                        printf("支持的功能:(0x%04X)\n", midiCaps.dwSupport);
                        if((midiCaps.dwSupport & MIDICAPS_CACHE) == MIDICAPS_CACHE)
                        {
                                printf("\t补丁缓存\n");
                        }
                        if((midiCaps.dwSupport & MIDICAPS_LRVOLUME) == MIDICAPS_LRVOLUME)
                        {
                                printf("\t左右声道音量控制\n");
                        }
                        else if((midiCaps.dwSupport & MIDICAPS_VOLUME) == MIDICAPS_VOLUME)
                        {
                                printf("\t音量控制\n");
                        }
                        if((midiCaps.dwSupport & MIDICAPS_STREAM) == MIDICAPS_STREAM)
                        {
                                printf("\t流式输出\n");
                        }
                }
                return 1;
        }
        else
        {
                printf("获取该设备信息失败。\n");
                return 0;
        }
}

int main(int argc, char**argv)
{
        UINT numDevs; // 设备个数
        UINT i;

        numDevs = midiOutGetNumDevs(); // 取得设备个数

        printf("MIDI设备个数:%u\n", numDevs);

        for(i = 0; i < numDevs; i++)
        {
               
                printf("================================\n");
                printf("第 %u 个设备的信息:\n", i + 1);

                print_device(i);
        }
       
        printf("================================\n");
        printf("微软内置波表合成器(MIDI_MAPPER):\n");

        print_device(MIDI_MAPPER);

        return 0;
}

0xAA55 发表于 2017-11-23 07:25:10

如果要选择其中一个作为音源的话,在调用midiOutOpen()函数打开MIDI设备的时候uDeviceID这个参数填写指定的设备编号就行。注意设备编号是从0开始数的。

白天 发表于 2017-11-23 18:50:43

我废了很大的精力才知道要用midiOutGetDevCaps这个 API函数。站长对MIDI类好像很有研究啊,发的这方面的文章都是很难在其它的地方找到的资料。我研究了一下站长的那个VB MIDI播放器,找到了从任意位置播放的一个思路,不知站长是否有兴趣听听。

besteast 发表于 2018-9-16 17:36:13

:):):):):):):)
页: [1]
查看完整版本: 如何用程序获取MIDI输出设备名