找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 2473|回复: 4

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

[复制链接]

2

主题

22

回帖

117

积分

用户组: 小·技术宅

UID
3003
精华
0
威望
2 点
宅币
89 个
贡献
0 次
宅之契约
0 份
在线时间
20 小时
注册时间
2017-10-24
发表于 2017-11-22 20:07:42 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

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

使用道具 举报

1112

主题

1653

回帖

7万

积分

用户组: 管理员

一只技术宅

UID
1
精华
245
威望
744 点
宅币
24254 个
贡献
46222 次
宅之契约
0 份
在线时间
2298 小时
注册时间
2014-1-26
发表于 2017-11-23 07:18:22 | 显示全部楼层
使用 midiOutGetDevCaps 即可。

20171123082152.png
  1. #include<stdio.h>
  2. #include<tchar.h>

  3. #include<Windows.h>

  4. int print_device(UINT nDevId)
  5. {
  6.         MIDIOUTCAPSA midiCaps; // 设备信息

  7.         if(midiOutGetDevCapsA(nDevId, &midiCaps, sizeof midiCaps) == MMSYSERR_NOERROR)
  8.         {
  9.                 printf("制造商标识:%u\n", midiCaps.wMid);
  10.                 printf("产品标识:%u\n", midiCaps.wPid);
  11.                 printf("驱动版本:%u.%u\n", HIBYTE(midiCaps.vDriverVersion), LOBYTE(midiCaps.vDriverVersion));
  12.                 printf("产品名:%s\n", midiCaps.szPname);
  13.                 printf("MIDI输出方式:");
  14.                 switch(midiCaps.wTechnology)
  15.                 {
  16.                 case MOD_MIDIPORT:
  17.                         printf("MIDI硬件端口\n");break;
  18.                 case MOD_SYNTH:
  19.                         printf("合成器\n");break;
  20.                 case MOD_SQSYNTH:
  21.                         printf("方波合成器\n");break;
  22.                 case MOD_FMSYNTH:
  23.                         printf("FM合成器\n");break;
  24.                 case MOD_MAPPER:
  25.                         printf("微软MIDI波表\n");break;
  26.                 case MOD_SWSYNTH:
  27.                         printf("软件合成器\n");break;
  28.                 default:
  29.                         printf("未知原理\n");break;
  30.                 }
  31.                 if(midiCaps.wTechnology != MOD_MIDIPORT) // 端口不存在合成声音数量概念
  32.                 {
  33.                         printf("内部合成器支持的声音数量:%u\n", midiCaps.wVoices);
  34.                         printf("内部合成器支持的最大同时播放音符数:%u\n", midiCaps.wNotes);
  35.                 }
  36.                 printf("响应的通道的掩码:0x%04X\n", midiCaps.wChannelMask);
  37.                 if(midiCaps.dwSupport)
  38.                 {
  39.                         printf("支持的功能:(0x%04X)\n", midiCaps.dwSupport);
  40.                         if((midiCaps.dwSupport & MIDICAPS_CACHE) == MIDICAPS_CACHE)
  41.                         {
  42.                                 printf("\t补丁缓存\n");
  43.                         }
  44.                         if((midiCaps.dwSupport & MIDICAPS_LRVOLUME) == MIDICAPS_LRVOLUME)
  45.                         {
  46.                                 printf("\t左右声道音量控制\n");
  47.                         }
  48.                         else if((midiCaps.dwSupport & MIDICAPS_VOLUME) == MIDICAPS_VOLUME)
  49.                         {
  50.                                 printf("\t音量控制\n");
  51.                         }
  52.                         if((midiCaps.dwSupport & MIDICAPS_STREAM) == MIDICAPS_STREAM)
  53.                         {
  54.                                 printf("\t流式输出\n");
  55.                         }
  56.                 }
  57.                 return 1;
  58.         }
  59.         else
  60.         {
  61.                 printf("获取该设备信息失败。\n");
  62.                 return 0;
  63.         }
  64. }

  65. int main(int argc, char**argv)
  66. {
  67.         UINT numDevs; // 设备个数
  68.         UINT i;

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

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

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

  76.                 print_device(i);
  77.         }
  78.        
  79.         printf("================================\n");
  80.         printf("微软内置波表合成器(MIDI_MAPPER):\n");

  81.         print_device(MIDI_MAPPER);

  82.         return 0;
  83. }
复制代码
midiOutEnum.exe (62.5 KB, 下载次数: 0)
midiOutEnum_src.zip (4.19 KB, 下载次数: 0)
回复 赞! 靠!

使用道具 举报

1112

主题

1653

回帖

7万

积分

用户组: 管理员

一只技术宅

UID
1
精华
245
威望
744 点
宅币
24254 个
贡献
46222 次
宅之契约
0 份
在线时间
2298 小时
注册时间
2014-1-26
发表于 2017-11-23 07:25:10 | 显示全部楼层
如果要选择其中一个作为音源的话,在调用midiOutOpen()函数打开MIDI设备的时候uDeviceID这个参数填写指定的设备编号就行。注意设备编号是从0开始数的。
回复 赞! 靠!

使用道具 举报

2

主题

22

回帖

117

积分

用户组: 小·技术宅

UID
3003
精华
0
威望
2 点
宅币
89 个
贡献
0 次
宅之契约
0 份
在线时间
20 小时
注册时间
2017-10-24
 楼主| 发表于 2017-11-23 18:50:43 | 显示全部楼层
我废了很大的精力才知道要用midiOutGetDevCaps这个 API函数。站长对MIDI类好像很有研究啊,发的这方面的文章都是很难在其它的地方找到的资料。我研究了一下站长的那个VB MIDI播放器,找到了从任意位置播放的一个思路,不知站长是否有兴趣听听。
回复 赞! 靠!

使用道具 举报

0

主题

70

回帖

164

积分

用户组: 小·技术宅

UID
1291
精华
0
威望
2 点
宅币
89 个
贡献
1 次
宅之契约
0 份
在线时间
2 小时
注册时间
2015-11-25
发表于 2018-9-16 17:36:13 | 显示全部楼层
回复

使用道具 举报

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-4-26 22:17 , Processed in 0.049605 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表