📄 midiplay.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 + -