会员登录 用户名: 密码: 登录 新会员注册 [找回密码]
当前位置:编程论坛 >> C/S程序开发专区 >> VC++编程论坛 >> [求助]如何在WIN32程序中添加MID音乐
首页
中资源
  发表一个新主题  发表一个新投票  回复主题 您是本帖的第 207 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
 * 贴子主题:[求助]如何在WIN32程序中添加MID音乐 悬赏分100 [提问中] 报告本帖给版主  显示可打印的版本  把本贴打包邮递  把本贴加入论坛收藏夹  发送本页面给朋友  把本贴加入IE收藏夹 
 luck671488 帅哥哟,离线,有人找我吗?
  
  
  等 级:初出江湖
  积 分:55
  专家分:0
  提问帖:2/0
  回答帖:0
  总帖数:2
  经验值:58
  注 册:2008-11-6
给luck671488发送一个短消息 把luck671488加入好友 查看luck671488的个人资料 搜索luck671488在VC++编程论坛的所有贴子  引用回复这个贴子 回复这个贴子楼主

发贴心情 [求助]如何在WIN32程序中添加MID音乐

如何在WIN32程序中添加MID音乐
如何加载播放MID音乐
需要包含那些头文件
发帖:2008-11-20 22:25:00
  鲜花(0)  鸡蛋(0)
 独孤剑圣 帅哥哟,离线,有人找我吗?
  
  
  等 级:职业侠客
  积 分:9360
  专家分:5901
  提问帖:1/1
  回答帖:490
  总帖数:562
  经验值:651
  注 册:2007-11-25
给独孤剑圣发送一个短消息 把独孤剑圣加入好友 查看独孤剑圣的个人资料 搜索独孤剑圣在VC++编程论坛的所有贴子 引用回复这个贴子 回复这个贴子2

发贴心情 

前一段时间看到有人发布XM音乐的播放方法,主要用于在注册机加一个小巧的背景音乐.
但由于XM音乐比较少,比较小巧的就更少了,况且还依赖minifmod库.

所以考虑到以下因素,同样推荐在注册机加入MIDI音乐:
1.MIDI音乐文件使用更广泛,更容易获得,制作和编辑.
2.DirectMusic附带4MB音色库的Roland软波表,音质也不比XM差。
3.MIDI数据比XM数据更容易被压缩(MIDI文件压缩比在1:8左右).
4.不需要外部编程库,系统自带播放内核,添加的代码量极少.

这里给出一个最简单的MIDI音乐的播放方法,即使用DirectMusic高层库.
虽然利用MCI的高层也可以播放,但它似乎不支持内存载入,
而且无法避免与其他MIDI音乐的同时播放的冲突.
估计都有装了DirectX吧,播放的通用性应该没有问题.
但编译这个程序还需要装上DirectX SDK.


代码:--------------------------------------------------------------------------------
// Tiny MIDI player [By Dwing]
#pragma comment(lib,"ole32.lib")
#pragma comment(lib,"dxguid.lib")
#pragma comment(linker,"/ENTRY:Entry")
#include<dmusici.h>

unsigned char mididata[]={0x4D,0x54,0x68,0x64,......}; // 这里加入mid文件的数据.

IDirectMusicPerformance*    performance=0;
IDirectMusicSegment*        segment    =0;
IDirectMusicLoader*         loader     =0;

bool PlayMIDI(unsigned char* data,unsigned int size)
{
    DMUS_OBJECTDESC desc={0};
    desc.dwSize     =sizeof(desc);
    desc.guidClass  =CLSID_DirectMusicSegment;
    desc.pbMemData  =data;
    desc.llMemLength=size;
    desc.dwValidData=DMUS_OBJ_CLASS|DMUS_OBJ_MEMORY;
    if(FAILED(CoInitialize(0))) return false;
    if(FAILED(CoCreateInstance(CLSID_DirectMusicPerformance,0,CLSCTX_INPROC,
        IID_IDirectMusicPerformance,(void**)&performance))) return false;
    if(FAILED(CoCreateInstance(CLSID_DirectMusicLoader,0,CLSCTX_INPROC,
        IID_IDirectMusicLoader,(void**)&loader))) return false;
    if(FAILED(loader->GetObject(&desc,IID_IDirectMusicSegment,(void**)&segment))) return false;
    if(FAILED(performance->Init(0,0,0))) return false;
    if(FAILED(performance->AddPort(0))) return false;
    if(FAILED(segment->SetParam(GUID_StandardMIDIFile,-1,0,0,performance))) return false;
    if(FAILED(segment->SetParam(GUID_Download,-1,0,0,performance))) return false;
    if(FAILED(segment->SetRepeats(DMUS_SEG_REPEAT_INFINITE))) return false;
    if(FAILED(performance->PlaySegment(segment,0,0,0))) return false;
    return true;
}

void StopMIDI()
{
    if(segment)
    {
        if(performance)
        {
            performance->Stop(segment,0,0,0);
            segment->SetParam(GUID_Unload,-1,0,0,(void**)performance);
        }
        segment->Release();
        segment=0;
    }
    if(loader)
    {
        loader->Release();
        loader=0;
    }
    if(performance)
    {
        performance->CloseDown();
        performance->Release();
        performance=0;
    }
    CoUninitialize();
}

void Entry()
{
    if(PlayMIDI(mididata,sizeof(mididata)))
    {
        MessageBox(0,"Playing...","MIDI",0);
        StopMIDI();
    }
    else
        MessageBox(0,"Error!","MIDI",0);
    ExitProcess(0);
}
--------------------------------------------------------------------------------


mid文件的数据可用一个小工具自己导出成数组格式.
执行PlayMIDI()后音乐的播放会有约1~2秒的延迟,估计不会有太大影响的.
如果在程序退出前不需要停止播放音乐,可以不调用StopMIDI(),程序会更小.
PlayMIDI()函数用VC的最小代码编译,只有200多字节! 


善与恶,只在一念之间~~~~~

发帖:2008-11-21 7:00:00

本主题贴数2,分页:[返回帖子列表] [上一页] [1] [下一页]
 *快速回复:[求助]如何在WIN32程序中添加MID音乐  [ 回帖是一种美德 :) ]
会员账号 用户名    还没注册?    密码    忘记密码?
内容
  • HTML标签: 不可用
  • UBB标签: 可用
  • 贴图标签: 可用
  • 多媒体标签:可用
  • 表情字符转换:可用
  • 上传图片:不可用
  • 最多15KB
  • 点击表情图即可在帖子中加入相应的表情
                                
    邮件回复 显示签名   [Ctrl+Enter直接提交贴子]

    管理选项锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告