📄 midi.cpp
字号:
// Midi.cpp: implementation of the CMidi class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "ff.h"
#include "Midi.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
CMidi::CMidi()
{
m_bOpened=FALSE;
m_bPaused=FALSE;
m_bPlaying=FALSE;
m_wDeviceID=0;
}
CMidi::~CMidi()
{
Close();
}
WORD CMidi::GetDevicID()
{
return m_wDeviceID;
}
BOOL CMidi::Open(CString strFileName)
{
if(m_bOpened)
Close();
m_bOpened = m_bPaused = m_bPlaying = FALSE;
m_wDeviceID = 0;
CFileStatus Status;
if(!CFile::GetStatus(strFileName, Status))
return FALSE;
MCI_OPEN_PARMS OpenParams;
OpenParams.dwCallback = FALSE;
OpenParams.lpstrDeviceType = (LPCSTR)MCI_DEVTYPE_SEQUENCER;
OpenParams.wDeviceID = 0;
OpenParams.lpstrElementName = (LPCSTR)strFileName;
if(mciSendCommand(NULL, MCI_OPEN,
MCI_WAIT | MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID | MCI_OPEN_ELEMENT,
(DWORD)&OpenParams))
return FALSE;
m_wDeviceID=OpenParams.wDeviceID;
m_bOpened=TRUE;
MCI_SET_PARMS SetParams;
SetParams.dwTimeFormat = MCI_FORMAT_MILLISECONDS;
if(mciSendCommand(m_wDeviceID, MCI_SET,
MCI_SET_TIME_FORMAT, (DWORD)&SetParams))
{
Close();
return FALSE;
}
mciSendCommand(m_wDeviceID, MCI_SEEK, MCI_SEEK_TO_START, NULL);
return TRUE;
}
void CMidi::Close()
{
if(m_bOpened)
{
if(m_bPlaying || m_bPaused)
mciSendCommand(m_wDeviceID, MCI_STOP, NULL, NULL);
mciSendCommand(m_wDeviceID, MCI_CLOSE, NULL, NULL);
m_bOpened = m_bPaused = m_bPlaying = FALSE;
m_wDeviceID = 0;
}
}
BOOL CMidi::Play()
{
if(m_bOpened)
{
SeekTo(0, 0);
MCI_PLAY_PARMS PlayParams;
PlayParams.dwCallback = NULL;
PlayParams.dwFrom = 0;
//PlayParams.dwFrom=((GetCurrentMin()*60)+GetCurrentSec())*1000;
if(mciSendCommand(m_wDeviceID, MCI_PLAY, (MCI_FROM), (DWORD)&PlayParams) != 0)
return FALSE;
m_bPaused=FALSE;
m_bPlaying=TRUE;
return TRUE;
}
return FALSE;
}
void CMidi::Stop()
{
if(m_bOpened && m_bPlaying)
{
mciSendCommand(m_wDeviceID, MCI_STOP, NULL, NULL);
mciSendCommand(m_wDeviceID, MCI_SEEK, MCI_SEEK_TO_START, NULL);
m_bPlaying = FALSE;
m_bPaused = FALSE;
}
}
int CMidi::GetCurrentMin()
{
if(m_bOpened)
{
MCI_STATUS_PARMS StatusParams;
StatusParams.dwItem = MCI_STATUS_POSITION;
if(mciSendCommand(m_wDeviceID, MCI_STATUS,
MCI_WAIT | MCI_STATUS_ITEM, (DWORD)&StatusParams))
return -1;
return (int)((StatusParams.dwReturn / 1000) / 60);
}
return -1;
}
int CMidi::GetCurrentSec()
{
if(m_bOpened)
{
MCI_STATUS_PARMS StatusParams;
StatusParams.dwItem = MCI_STATUS_POSITION;
if(mciSendCommand(m_wDeviceID, MCI_STATUS,
MCI_WAIT | MCI_STATUS_ITEM, (DWORD)&StatusParams))
return -1;
return (int)(StatusParams.dwReturn / 1000 - (StatusParams.dwReturn / 1000) / 60);
}
return -1;
}
BOOL CMidi::IsPlaying()
{
return m_bPlaying;
}
BOOL CMidi::SeekTo(int nMinute,int nSeconds)
{
if(m_bOpened)
{
MCI_SEEK_PARMS SeekParams;
SeekParams.dwTo = (nMinute * 60 + nSeconds) * 1000;
if(m_bPlaying && m_bPaused)
{
mciSendCommand(m_wDeviceID, MCI_PAUSE, NULL, NULL);
if(mciSendCommand(m_wDeviceID, MCI_SEEK,
MCI_TO | MCI_WAIT, (DWORD)&SeekParams))
return FALSE;
}
if(m_bPlaying && !m_bPaused)
Play();
return TRUE;
}
return FALSE;
}
void CMidi::Forward(int nSeconds)
{
if(m_bOpened)
{
MCI_STATUS_PARMS StatusParams;
DWORD dwPos;
StatusParams.dwItem = MCI_STATUS_POSITION;
mciSendCommand(m_wDeviceID, MCI_STATUS, MCI_STATUS_ITEM, (DWORD)&StatusParams);
dwPos = StatusParams.dwReturn ;
dwPos += nSeconds*1000;
MCI_SEEK_PARMS SeekParams;
SeekParams.dwTo = dwPos;
if(m_bPlaying && m_bPaused)
{
mciSendCommand(m_wDeviceID, MCI_PAUSE, NULL, NULL);
mciSendCommand(m_wDeviceID, MCI_SEEK,
MCI_TO | MCI_WAIT, (DWORD)&StatusParams);
}
if(m_bPlaying && !m_bPaused)
Play();
}
}
void CMidi::Backward(int nSeconds)
{
if(m_bOpened)
{
MCI_STATUS_PARMS StatusParams;
DWORD dwPos;
StatusParams.dwItem = MCI_STATUS_POSITION;
mciSendCommand(m_wDeviceID, MCI_STATUS,
MCI_STATUS_ITEM, (DWORD)&StatusParams);
dwPos = StatusParams.dwReturn ;
dwPos -= nSeconds * 1000;
MCI_SEEK_PARMS SeekParams;
SeekParams.dwTo = dwPos;
if(m_bPlaying && m_bPaused)
{
mciSendCommand(m_wDeviceID, MCI_PAUSE, NULL, NULL);
mciSendCommand(m_wDeviceID, MCI_SEEK,
MCI_TO | MCI_WAIT, (DWORD)&SeekParams);
}
if(m_bPlaying && !m_bPaused)
Play();
}
}
int CMidi::GetTempo(int)
{
if(m_bOpened)
{
MCI_STATUS_PARMS StatusParams;
StatusParams.dwItem = MCI_SEQ_STATUS_TEMPO;
if(mciSendCommand(m_wDeviceID, MCI_STATUS,
MCI_WAIT | MCI_STATUS_ITEM, (DWORD)&StatusParams))
return -1;
return (int)StatusParams.dwReturn;
}
return -1;
}
int CMidi::GetMidiLen()
{
if(m_bOpened)
{
MCI_STATUS_PARMS StatusParams;
StatusParams.dwItem = MCI_STATUS_LENGTH;
if(mciSendCommand(m_wDeviceID, MCI_STATUS,
MCI_WAIT | MCI_STATUS_ITEM, (DWORD)&StatusParams))
return -1;
return (int)StatusParams.dwReturn;
}
return -1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -