技术宅的结界

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

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 220|回复: 3
收起左侧

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

[复制链接]

1

主题

22

帖子

104

积分

用户组: 小·技术宅

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

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

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

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

993

主题

2190

帖子

5万

积分

用户组: 管理员

一只技术宅

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

20171123082152.png
[C] 纯文本查看 复制代码
#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;
}
midiOutEnum.exe (62.5 KB, 下载次数: 0)

993

主题

2190

帖子

5万

积分

用户组: 管理员

一只技术宅

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

1

主题

22

帖子

104

积分

用户组: 小·技术宅

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|技术宅的结界 ( 滇ICP备16008837号|网站地图

GMT+8, 2018-7-22 18:54 , Processed in 0.082747 second(s), 16 queries , Gzip On, Memcache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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