播放midi音乐文件的方法

背景说明:
在游戏编程中,给程序增加音效几乎是必须的;在普通程序中增加音效也会给使用者带来更好的体验;而mid格式的音效文件体积最小(大约1k到数十k),效果却不亚于MP3或Wav(大约数M到数十M);后者体积是前者的100倍以上;除了语音,mid音效都能胜任;因此,掌握播放mid音乐文件的方法很重要;使用mid音效,能极大地减轻程序打包传输的负担,实属编程首选;

下载链接:
用本例程序编译的EXE文件
音乐播放_春节序曲midiMci_api_v1.exe
音乐播放_水车midiApp_v2.rar [C语言版本]

//主程序;

#if 1
//----------------------------------------------+------------------------------------------------*/
//WinAPI入门: 播放midi音乐文件的方法;
#include <windows.h>  //WinAPI库;[Win32基础库;]
#include <iostream>       //IO流库;[向下兼容stdio.h;]
#include <tchar.h>        //文本串格式;[兼容宽字符;]
#pragma comment(lib,"winmm.lib")  //[Win32多媒体库;]
//----------------------------------------------+------------------------------------------------*/
//声明本地函数;[非本例必须;]
int CDECL MsgBoxPrintf(TCHAR *szCaption,TCHAR *szFormat, ...); //格式输出;
//----------------------------------------------*/
//v1;主函数;--音乐播放测试版@midiMci_api.cpp;
//MIDI应用;--如何播放MIDI音乐文件;[MIDI文件与本程序在同一目录;兼容UNC网络路径;]
//特别提示;--按注释替换掉消息框语句即可轻松移植到普通C语言程序中;
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)
{#define boxTitle TEXT("音乐播放midiMci_v1")  //定义消息框标题说明;//初始化;--打开设备及MIDI文件;MCI_OPEN_PARMS OpenParms;   //定义用于打开设备的参数结构; OpenParms.lpstrDeviceType  = (LPCSTR) MCI_DEVTYPE_SEQUENCER;  //设备类型为音序器;OpenParms.lpstrElementName   = (LPCSTR) "春节序曲.mid";           //春节序曲;八月桂花遍地开;OpenParms.wDeviceID = 0;    //打开时自动获取MIDI播放器的ID;if(mciSendCommand(NULL, MCI_OPEN,MCI_WAIT |MCI_OPEN_TYPE |MCI_OPEN_TYPE_ID |MCI_OPEN_ELEMENT,(DWORD)&OpenParms)                 !=0)MessageBox(NULL,TEXT("MIDI设备无法打开!"),boxTitle,0); //printf("MIDI设备无法打开!");//播放MIDI文件;--带播放控制;MCI_PLAY_PARMS PlayParms;  //定义控制播放的参数结构;PlayParms.dwFrom = 0;if(mciSendCommand(OpenParms.wDeviceID,MCI_PLAY,MCI_FROM,(DWORD)&PlayParms)==0)                    //printf("正在播放:\n  %s",OpenParms.lpstrElementName);MsgBoxPrintf(boxTitle,TEXT("正在播放:\n  %s"),OpenParms.lpstrElementName);else MessageBox(NULL,TEXT("MIDI文件无法播放!"),boxTitle,0);//printf("MIDI文件无法播放!");return 0;
}
//----------------------------------------------+------------------------------------------------*/

//定义本地函数:

//----------------------------------------------*/
//WinAPI窗口格式输出子函数;[RbY*变参函数设计实例;非本例必须;]
//#include <tchar.h>  //包含_vsntprintf();兼容宽字符Unicode;
//#include <stdio.h>  //包含sprintf();
int CDECL MsgBoxPrintf(TCHAR *szCaption,TCHAR *szFormat, ...) //格式输出;
{ TCHAR szBuffer[256];  //RbY缓存长度256~1024; va_list pArgList; // The va_start macro (defined in STDARG.H) is usually equivalent to: // pArgList = (char *) &szFormat + sizeof(szFormat); va_start (pArgList,szFormat); // The last argument to wvsprintf points to the arguments; _vsntprintf(szBuffer,sizeof(szBuffer)/sizeof(TCHAR),szFormat,pArgList); // The va_end macro just zeroes out pArgList for no good reason; va_end (pArgList) ; return MessageBox(NULL,szBuffer,szCaption,0);
}
//----------------------------------------------+------------------------------------------------*/
#endif

//v2;播放midi文件的C语言版本;

#if 0
//----------------------------------------------+------------------------------------------------*/
//v2;播放midi音乐文件;[C语言版本;]
//----------------------------------------------*/
//引用库;
#include <windows.h>              //WinAPI库;[Win32基础库;包含system();]
#include <iostream>                   //IO流库;[iostream向下兼容stdio.h;]
#include <tchar.h>                    //文本串格式;[TCHAR兼容宽字符Unicode;]
#pragma comment(lib,"winmm.lib")  //添加库;[Win32多媒体库;]
//----------------------------------------------*/
//主函数;
int main()
{void midiplay(TCHAR *song);                //播放MIDI音乐文件;system("title 音乐播放midiApp_v2");      //设置cmd窗口标题;system("mode con cols=43 lines=20");    //设置cmd窗口宽高=字符数;midiplay("水车.mid");system("pause");return 0;
}
//----------------------------------------------*/
//v2;播放MIDI音乐文件;[MIDI文件与本程序在同一目录;]
void midiplay(TCHAR *song)  //播放MIDI音乐文件;
{//初始化;--打开设备及MIDI文件;MCI_OPEN_PARMS OpenParms;                  //定义用于打开设备的参数结构;OpenParms.lpstrDeviceType   = (LPCSTR) MCI_DEVTYPE_SEQUENCER;  //设备类型为音序器;OpenParms.lpstrElementName= (LPCSTR) song;  //如,春节序曲.mid;八月桂花遍地开.mid;OpenParms.wDeviceID = 0;                  //打开时自动获取MIDI播放器的ID;if(mciSendCommand(NULL, MCI_OPEN,MCI_WAIT |MCI_OPEN_TYPE |MCI_OPEN_TYPE_ID |MCI_OPEN_ELEMENT,(DWORD)&OpenParms) !=0)printf("\nMIDI设备无法打开!");//播放MIDI文件;--带播放控制;MCI_PLAY_PARMS PlayParms;                 //定义控制播放的参数结构;PlayParms.dwFrom = 0;                        //从头开始播放;if(mciSendCommand(OpenParms.wDeviceID,MCI_PLAY,MCI_FROM,(DWORD)&PlayParms) ==0)printf("正在播放:\n\t%s\n",OpenParms.lpstrElementName);else printf("\nMIDI文件无法播放!");
}
//----------------------------------------------+------------------------------------------------*/
#endif

MIDI应用: 播放midi音乐文件的方法 [Win32版本+ C语言版本]相关推荐

  1. html5播放qsv文件吗,qsv格式文件怎么播放?xp系统播放qsv格式文件的方法

    qsv是一个视频格式文件?是爱奇艺的视频文件,只能在爱奇艺的播放器播放上.一些用户xp系统没有安装爱奇艺播放器,是不是就不能播放qsv格式文件?能不能在其他的视频播放器上播放?当然可以的,大家只要转换 ...

  2. 如何在Windows版iTunes中播放Ogg音乐文件

    If you're a music enthusiast who prefers Ogg file formats, you'll find that common players like WMP ...

  3. Android读取Mp3音乐文件的方法

    在做Mp3音乐播放器的时候,需要经常用到读取文件的操作,看过网上一些人写的读取方法,做个总结,部分代码有相似之处. 一.通过过滤器的方式过滤文件 public class MusicFilter im ...

  4. Winfrom 播放MP3音乐文件

    using System; using System.Runtime.InteropServices;namespace AESCRTool {/// <summary>/// 播放MP3 ...

  5. 获取网页中播放的音乐文件

    对于XP的系统直接去: C:\Documents and Settings\suzrexwu\Local Settings\Temporary Internet Files 根据文件格式和存取时间获取 ...

  6. Android播放外部音乐文件

    工程目录: manifests增加动态权限 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAG ...

  7. midi java_java midi音乐文件播放器

    [java]代码库import javax.swing.*; import javax.sound.midi.*; import java.awt.GridLayout; import java.io ...

  8. java mp3转midi_java midi音乐文件播放器

    您的位置:首页 - 教程 - Java - 正文 java midi音乐文件播放器 java midi音乐文件播放器 import javax.swing.*; import javax.sound. ...

  9. windows下使用Qt播放PCM音频文件(通过QAudioOutput和QIODevice)

    在博主之前的博文<windows下使用FFmpeg生成PCM音频文件并播放(通过命令的方式)>(链接https://blog.csdn.net/u014552102/article/det ...

最新文章

  1. .NET中获取电脑名、IP及用户名方法
  2. Windows 任务管理器进程详解
  3. java layout_java - 以编程方式在LinearLayout中设置边距
  4. .NET平台功能最强大,性能最佳的JSON库
  5. 50个常用sql语句
  6. ORM是什么?如何理解ORM?
  7. 系统没有安装vc9.注意是x86 32位_Windows 软件默认安装位置之谜
  8. cck8graphpad作图_Graphpad Prism 的 4 个隐藏技能助你轻松发表 SCI
  9. 如何获取CSDN积分
  10. 【单片机开发】OV2640在没有DCMI接口的情况下的STM32驱动
  11. leetcode 热点——排列组合问题
  12. html5画智利国旗,智利国旗与得州州旗,你能分的清么?
  13. C++ 读取文件时报错“将一个无效参数传递给了将无效参数视为严重错误的函数”解决方法
  14. linux 切换java_Linux中切换java的版本
  15. jquery实现图片上传
  16. 刚入职场需要用到的5个顶尖自学网
  17. 基于C语言设计的像素小鸟小游戏
  18. 百度SEO快排系统都有哪些类别?【系统之间的区别】
  19. sequence_loss_by_example()函数在Tensorflow2.x找不到
  20. 大数据课堂笔记 HDFS的shell操作

热门文章

  1. JS事件绑定的几种方式
  2. 级联选择器el-cascader处理复杂数据(四层、五层数据),回显部门以及部门下的人员
  3. android博客集合
  4. html提取excel指定单元格数据,如何利用Excel函数公式快速提取出单元格中指定的数据...
  5. python 函数式编程包_Python——详解函数式编程与闭包
  6. 干了5Android开发还没掌握-binder-机制、驱动核心源码?我劝你早点改行吧
  7. 小白Java学习之路(abstract抽象类,final,接口,equals)
  8. Unity3D 背景动态模糊(blur)和截屏方法
  9. html 一键复制 ios,h5实现一键复制到粘贴板-兼容ios
  10. UDP可靠性传输协议(QUIC)