⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 midiplay.cpp

📁 一个界面简单的mid文件播放器MIDI VC,有测试音乐
💻 CPP
字号:

     ////////////////////////////////////////////////////
    //		About MIDI Library Modules's Example      //
   //	   HugeSoft Workstation MMX 2000/01/06		 //
  //	  http://hugesoft.163.net                   //
 //      e-mail:mmx_hugesoft@163.net			   //
////////////////////////////////////////////////////

#include <windows.h>
#include <windowsx.h>
#include <string.h>
#include <stdio.h>
#include "resource.h"
#include "midi.h"

#define	MIDINAME	"007.mid"
#define IDM_UPDOWN	201

LRESULT CALLBACK WindowFunc(HWND,UINT,WPARAM,LPARAM);
DWORD WINAPI ThreadProc(void* pv);

HANDLE  ghEvent;

char szWinName[]="MyWin";
char strTitle[]="一个简单的使用MIDI库的例子";

int WINAPI WinMain(HINSTANCE hThisInst,HINSTANCE hPrevInst,
				   LPSTR lpszArgs,int nWinMode)
{
	HWND hwnd;
	MSG msg;
	WNDCLASSEX wcl;

	wcl.cbSize=sizeof(WNDCLASSEX);
	wcl.hInstance=hThisInst;
	wcl.lpszClassName=szWinName;
	wcl.lpfnWndProc=WindowFunc;
	wcl.style=CS_DBLCLKS;

	wcl.hIcon=LoadIcon(NULL,IDI_APPLICATION);
	wcl.hIconSm=LoadIcon(NULL,IDI_APPLICATION);
	wcl.hCursor=LoadCursor(NULL,IDC_ARROW);

	wcl.lpszMenuName=NULL;
	wcl.cbClsExtra=0;
	wcl.cbWndExtra=0;

	wcl.hbrBackground=(HBRUSH)GetStockObject(LTGRAY_BRUSH);
	if(!RegisterClassEx(&wcl))
		return 0;
	hwnd=CreateWindowEx(
		WS_EX_CLIENTEDGE,
		szWinName,
		strTitle,
		WS_POPUP|WS_SYSMENU|WS_CLIPCHILDREN|WS_MINIMIZEBOX|
		WS_CAPTION,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		370,
		118,
		HWND_DESKTOP,
		NULL,
		hThisInst,
		NULL
		);

	ShowWindow(hwnd,nWinMode);

	while(GetMessage(&msg,NULL,0,0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return msg.wParam;
}

LRESULT CALLBACK WindowFunc(HWND hwnd,UINT message,
							WPARAM wParam,LPARAM lParam)
{
	static BOOL bPaused;
	static HINSTANCE hInstance ;
	static int nTotalMinutes,nTotalSeconds;
	static int nMinutes,nSeconds;
	static int m_nSeek;
	static BOOL m_bPlay=FALSE;
	char szText[]="HugeSoft工作室2000年1月\n程序编写:  马翔(MMX)\n主页:http:\\\\hugesoft.163.net\nE-Mail:mmx_hugesoft@163.net";
	char szCaption[]="关于MIDI库例子";

	OPENFILENAME fname;
	char filename[256];
	static char fn[256];
	char filefilter[]="MIDI 文件 (*.MID;*.RMI)\0*.MID;*.RMI\0";//"MIDI文件(*.mid)\0*.mid\0RMI文件(*.rmi)\0*.rmi\0";
	static 	HWND hSwnd,hwndCH;
	static WORD wPos;
	static BOOL bLoop=FALSE;

    DWORD   dwThreadID;
	HANDLE  hThread;

	switch(message)
	{
	case WM_CREATE:
		hInstance = ((LPCREATESTRUCT)lParam) ->hInstance ;

		SetTimer(hwnd,0,1000,NULL);
		SetTimer(hwnd,1,5000,NULL);

		//初始化界面
		hwndCH= CreateWindowEx(	WS_EX_WINDOWEDGE|WS_EX_DLGMODALFRAME,
								"BUTTON", 
								"打开",
								WS_CHILD | WS_VISIBLE |
								BS_PUSHBUTTON,
								0,0,
								90,30,
								hwnd,
								(HMENU)IDD_OPEN,
								hInstance,
								NULL) ;
			hwndCH= CreateWindowEx(	WS_EX_WINDOWEDGE|WS_EX_DLGMODALFRAME,
								"BUTTON", 
								"播放",
								WS_CHILD | WS_VISIBLE |
								BS_PUSHBUTTON,
								90,0,
								90,30,
								hwnd,
								(HMENU)IDD_PLAY,
								hInstance,
								NULL) ;
			hwndCH= CreateWindowEx(	WS_EX_WINDOWEDGE|WS_EX_DLGMODALFRAME,
								"BUTTON", 
								"停止",
								WS_CHILD | WS_VISIBLE |
								BS_PUSHBUTTON,
								180,0,
								90,30,
								hwnd,
								(HMENU)IDD_STOP,
								hInstance,
								NULL) ;
			hwndCH= CreateWindowEx(	WS_EX_WINDOWEDGE|WS_EX_DLGMODALFRAME,
								"BUTTON", 
								"暂停",
								WS_CHILD | WS_VISIBLE |
								BS_PUSHBUTTON,
								270,0,
								90,30,
								hwnd,
								(HMENU)IDD_PAUSE,
								hInstance,
								NULL) ;
			hwndCH= CreateWindowEx(	WS_EX_WINDOWEDGE|WS_EX_DLGMODALFRAME,
								"BUTTON", 
								"后退10秒",
								WS_CHILD | WS_VISIBLE |
								BS_PUSHBUTTON,
								0,30,
								90,30,
								hwnd,
								(HMENU)IDD_BACK,
								hInstance,
								NULL) ;
			hwndCH= CreateWindowEx(	WS_EX_WINDOWEDGE|WS_EX_DLGMODALFRAME,
								"BUTTON", 
								"前进10秒",
								WS_CHILD | WS_VISIBLE |
								BS_PUSHBUTTON,
								90,30,
								90,30,
								hwnd,
								(HMENU)IDD_UP,
								hInstance,
								NULL) ;
			hwndCH= CreateWindowEx(	WS_EX_WINDOWEDGE|WS_EX_DLGMODALFRAME,
								"BUTTON", 
								"速度减25%",
								WS_CHILD | WS_VISIBLE |
								BS_PUSHBUTTON,
								180,30,
								90,30,
								hwnd,
								(HMENU)IDD_SUN,
								hInstance,
								NULL) ;
			hwndCH= CreateWindowEx(	WS_EX_WINDOWEDGE|WS_EX_DLGMODALFRAME,
								"BUTTON", 
								"速度加25%",
								WS_CHILD | WS_VISIBLE |
								BS_PUSHBUTTON,
								270,30,
								90,30,
								hwnd,
								(HMENU)IDD_ADD,
								hInstance,
								NULL) ;
			hwndCH= CreateWindowEx(	WS_EX_WINDOWEDGE,
								"STATIC", 
								"时间:",
								WS_CHILD|WS_VISIBLE|
								BS_PUSHBUTTON,
								5,65,
								40,20,
								hwnd,
								NULL,
								hInstance,
								NULL) ;
			hwndCH= CreateWindowEx(	WS_EX_WINDOWEDGE,
								"STATIC", 
								"总长:",
								WS_CHILD|WS_VISIBLE|
								BS_PUSHBUTTON,
								95,65,
								40,20,
								hwnd,
								NULL,
								hInstance,
								NULL) ;
			hwndCH= CreateWindowEx(	WS_EX_WINDOWEDGE,
								"STATIC", 
								NULL,
								WS_CHILD|WS_VISIBLE|SS_SUNKEN|
								BS_PUSHBUTTON|SS_CENTER,
								45,65,
								45,20,
								hwnd,
								(HMENU)IDD_TIME,
								hInstance,
								NULL) ;
			hwndCH= CreateWindowEx(	WS_EX_WINDOWEDGE,
								"STATIC", 
								NULL,
								WS_CHILD|WS_VISIBLE|SS_SUNKEN|
								BS_PUSHBUTTON|SS_CENTER,
								135,65,
								45,20,
								hwnd,
								(HMENU)IDD_TOTAL,
								hInstance,
								NULL) ;
		SetDlgItemText(hwnd,IDD_TIME,"未知");
		SetDlgItemText(hwnd,IDD_TOTAL,"未知");

			hwndCH= CreateWindowEx(	WS_EX_WINDOWEDGE|WS_EX_DLGMODALFRAME,
								"BUTTON", 
								" 循环 ",
								WS_CHILD | WS_VISIBLE |
								BS_AUTOCHECKBOX ,
								185,64,
								80,22,
								hwnd,
								(HMENU)IDD_LOOP,
								hInstance,
								NULL) ;

			hwndCH= CreateWindowEx(	WS_EX_WINDOWEDGE|WS_EX_DLGMODALFRAME,
								"BUTTON", 
								"关于例子",
								WS_CHILD | WS_VISIBLE |
								BS_PUSHBUTTON ,
								270,60,
								90,30,
								hwnd,
								(HMENU)IDD_ABOUT,
								hInstance,
								NULL) ;
		break;

	case WM_COMMAND:
		switch( LOWORD( wParam))
		{
		case IDD_LOOP:	//如果bLoop==TRUE,则循环播放
			bLoop=!bLoop;
			break;
		case IDD_EXIT:	//退出
			PostMessage(hwnd,WM_DESTROY,0,0L);
			break;
		case IDD_PLAY:	//Play
			//goto文件开头,MID_SeekTo为库函数
			MID_SeekTo(0,0);
			//开始Play,MID_Play为库函数
			MID_Play();
			//得到midi文件的当前播放速度,MID_GetTempo为库函数
			m_nSeek=MID_GetTempo();
			m_bPlay=TRUE;
			break;
		case IDD_STOP:	//Stop
			//Stop播放,MID_Stop为库函数
			MID_Stop();
			m_bPlay=FALSE;
			break;
		case IDD_PAUSE:	//暂停
			m_bPlay=!m_bPlay;
			//if m_bPlay==FALSE,则播放暂停,MID_Pause为库函数
			if(m_bPlay==FALSE)
				MID_Pause();
			else
				MID_Play();//开始Play,MID_Play为库函数
			break;
		case IDD_BACK:
			//往回跳10秒,MID_SkipBack为库函数
			MID_SkipBack(10);
			break;
		case IDD_UP:
			//往前跳10秒,MID_SkipBack为库函数
			MID_SkipForward(10);
			break;
		case IDD_ADD:
			//得到midi文件的当前播放速度加上25%,MID_GetTempo为库函数
			m_nSeek=int(MID_GetTempo()*1.25);
			//设置播放速度,MID_SetTempo为库函数
			MID_SetTempo(m_nSeek);
			break;
		case IDD_SUN:
			//得到midi文件的当前播放速度减去25%,MID_GetTempo为库函数
			m_nSeek=int(MID_GetTempo()*0.75);
			//设置播放速度,MID_SetTempo为库函数
			MID_SetTempo(m_nSeek);
			break;
		case IDD_ABOUT:
			MessageBox(hwnd,szText,szCaption,MB_ICONASTERISK|MB_OK);
			break;
		case IDD_OPEN:
			fname.lStructSize=sizeof(OPENFILENAME);
			fname.hwndOwner=hwnd;
			fname.lpstrFilter=filefilter;
			fname.nFilterIndex=1;
			fname.lpstrFile=fn;
			fname.nMaxFile=sizeof(fn);
			fname.lpstrFileTitle=filename;
			fname.nMaxFileTitle=sizeof(filename)-1;
			fname.Flags=OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|
				OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST;
			fname.lpstrCustomFilter=NULL;
			fname.lpstrInitialDir=NULL;
			fname.lpstrTitle=NULL;
			fname.lpstrDefExt=NULL;
			fname.lCustData=0;
			if(!GetOpenFileName(&fname))
			{
				break;
			}

		ghEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
        hThread = CreateThread(NULL, 0, ThreadProc, NULL, 0, &dwThreadID);

        if (hThread == NULL)
        {
            return FALSE;
        }
        CloseHandle(hThread);

			//关闭midi文件,MID_Close为库函数
			MID_Close();
			//打开midi文件,MID_Open为库函数
			MID_Open(filename);
			m_bPlay=FALSE;

			char szMidiName[256];
			strcpy(szMidiName,strTitle);
			strcat(szMidiName,"--");
			strcat(szMidiName,filename);
			SetWindowText(hwnd,szMidiName);

			//得到midi文件的长度,MID_GetTotalLength为库函数
			MID_GetTotalLength(&nTotalMinutes,&nTotalSeconds);

			char szTotal[255];
			if(nTotalMinutes<10 && nTotalSeconds<10)
				sprintf(szTotal,"0%d:0%d",nTotalMinutes,nTotalSeconds);
			if(nTotalMinutes<10 && nTotalSeconds>=10)
				sprintf(szTotal,"0%d:%d",nTotalMinutes,nTotalSeconds);
			if(nTotalSeconds<10 && nTotalMinutes>=10)
				sprintf(szTotal,"%d:0%d",nTotalMinutes,nTotalSeconds);
			if(nTotalMinutes>=10 && nTotalSeconds>=10)
				sprintf(szTotal,"%d:%d",nTotalMinutes,nTotalSeconds);
			SetDlgItemText(hwnd,IDD_TOTAL,szTotal);
 		}
		break;
	case WM_TIMER:
			switch(wParam)
			{
			case 1:
				if(m_bPlay==TRUE&&bLoop==TRUE)
				{
					//MID_IsPlaying返回所向播放状态并提供暂停状态,
					//文件暂停时IsPlaying()返回TRUE.
					if(!MID_IsPlaying(&bPaused))
					{
						MID_SeekTo(0,0);
						MID_Play();
					}
				}
				break;

			case 0:
			nMinutes=MID_GetMinutes();
			nSeconds=MID_GetSeconds();
			char szString[255];
			if(nMinutes<10 && nSeconds<10)
				sprintf(szString,"0%d:0%d",nMinutes,nSeconds);
			if(nMinutes<10 && nSeconds>=10)
				sprintf(szString,"0%d:%d",nMinutes,nSeconds);
			if(nSeconds<10 && nMinutes>=10)
				sprintf(szString,"%d:0%d",nMinutes,nSeconds);
			if(nMinutes>=10 && nSeconds>=10)
				sprintf(szString,"%d:%d",nMinutes,nSeconds);
			if(nMinutes>=0||nSeconds>=0)
				SetDlgItemText(hwnd,IDD_TIME,szString);
			break;
			}
		break;
	case WM_DESTROY:
		KillTimer(hwnd,0);
		KillTimer(hwnd,1);
		MID_Close();
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(hwnd,message,wParam,lParam);
	}
	return 0;
}

DWORD WINAPI ThreadProc(void* pv)
{
    DWORD    dwReturn;
		
    while (TRUE)
    {
        dwReturn = WaitForSingleObject(ghEvent,INFINITE);

        if (dwReturn != WAIT_OBJECT_0)
        {
            return 1;
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -