323 lines
12 KiB
C++
323 lines
12 KiB
C++
#include <common/purehdc.hpp>
|
|
#include <midiwrt/musdlg.hpp>
|
|
#include <midiwrt/mididef.hpp>
|
|
#include <midiwrt/instrmnt.hpp>
|
|
|
|
char MUSDlg::szClassName[]={"MUSConverter"};
|
|
char MUSDlg::szMenuName[]={""};
|
|
|
|
MUSDlg::MUSDlg(Window &parentWindow,String midiPathFileName,String musPathFileName)
|
|
: MUSConverter(midiPathFileName,musPathFileName),
|
|
mCommandHandler(this,&MUSDlg::commandHandler),
|
|
mCreateHandler(this,&MUSDlg::createHandler),
|
|
mDrawItemHandler(this,&MUSDlg::drawItemHandler),
|
|
mPaintHandler(this,&MUSDlg::paintHandler),
|
|
mDestroyHandler(this,&MUSDlg::destroyHandler),
|
|
mCloseHandler(this,&MUSDlg::closeHandler),
|
|
mControlColorHandler(this,&MUSDlg::controlColorHandler),
|
|
mlpLedTrackDisplay(0), mlpLedTempoDisplay(0),
|
|
mOwnerDraw(OwnerDraw::UseInstance), mhButtonCvtWnd(0), mhButtonUpWnd(0),
|
|
mhGrayBrush(::CreateSolidBrush(RGB(btnRed,btnGreen,btnBlue))),
|
|
mhButtonDnWnd(0), mhListBoxWnd(0), mhStaticWnd(0),
|
|
mLinkedBitmap(0,String("WND"),parentWindow.processInstance()),
|
|
mOutputPathFileName(midiPathFileName), mhInstance(parentWindow.processInstance()),
|
|
mhParentWnd(parentWindow)
|
|
{
|
|
registerClass();
|
|
insertHandlers();
|
|
}
|
|
|
|
MUSDlg::MUSDlg(DWindow &parentWindow,String midiPathFileName,String musPathFileName)
|
|
: MUSConverter(midiPathFileName,musPathFileName),
|
|
mCommandHandler(this,&MUSDlg::commandHandler),
|
|
mCreateHandler(this,&MUSDlg::createHandler),
|
|
mDrawItemHandler(this,&MUSDlg::drawItemHandler),
|
|
mPaintHandler(this,&MUSDlg::paintHandler),
|
|
mDestroyHandler(this,&MUSDlg::destroyHandler),
|
|
mCloseHandler(this,&MUSDlg::closeHandler),
|
|
mControlColorHandler(this,&MUSDlg::controlColorHandler),
|
|
mlpLedTrackDisplay(0), mlpLedTempoDisplay(0),
|
|
mOwnerDraw(OwnerDraw::UseInstance), mhButtonCvtWnd(0), mhButtonUpWnd(0),
|
|
mhGrayBrush(::CreateSolidBrush(RGB(btnRed,btnGreen,btnBlue))),
|
|
mhButtonDnWnd(0), mhListBoxWnd(0), mhStaticWnd(0),
|
|
mLinkedBitmap(0,String("WND"),parentWindow.processInstance()),
|
|
mOutputPathFileName(midiPathFileName), mhInstance(parentWindow.processInstance()),
|
|
mhParentWnd(parentWindow)
|
|
{
|
|
registerClass();
|
|
insertHandlers();
|
|
}
|
|
|
|
MUSDlg::~MUSDlg()
|
|
{
|
|
if(mlpLedTrackDisplay){delete mlpLedTrackDisplay;mlpLedTrackDisplay=0;}
|
|
if(mlpLedTempoDisplay){delete mlpLedTempoDisplay;mlpLedTempoDisplay=0;}
|
|
if(::IsWindow(mhButtonUpWnd))::DestroyWindow(mhButtonUpWnd);
|
|
if(::IsWindow(mhButtonDnWnd))::DestroyWindow(mhButtonDnWnd);
|
|
if(::IsWindow(mhButtonCvtWnd))::DestroyWindow(mhButtonCvtWnd);
|
|
if(::IsWindow(mhListBoxWnd))::DestroyWindow(mhListBoxWnd);
|
|
if(::IsWindow(mhStaticWnd))::DestroyWindow(mhStaticWnd);
|
|
if(mhGrayBrush)::DeleteObject(mhGrayBrush);
|
|
if((HWND)*this)destroy();
|
|
removeHandlers();
|
|
}
|
|
|
|
void MUSDlg::registerClass(void)const
|
|
{
|
|
WNDCLASS wndClass;
|
|
|
|
if(::GetClassInfo(mhInstance,szClassName,(WNDCLASS FAR*)&wndClass))return;
|
|
wndClass.style =CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS;
|
|
wndClass.lpfnWndProc =(WNDPROC)Window::WindowWndProc;
|
|
wndClass.cbClsExtra =0;
|
|
wndClass.cbWndExtra =sizeof(MUSDlg*);
|
|
wndClass.hInstance =mhInstance;
|
|
wndClass.hIcon =::LoadIcon(NULL,IDI_APPLICATION);
|
|
wndClass.hCursor =::LoadCursor(NULL,IDC_ARROW);
|
|
wndClass.hbrBackground =(HBRUSH)::GetStockObject(LTGRAY_BRUSH);
|
|
wndClass.lpszMenuName =szMenuName;
|
|
wndClass.lpszClassName =szClassName;
|
|
::RegisterClass(&wndClass);
|
|
assert(0!=::GetClassInfo(mhInstance,szClassName,(WNDCLASS FAR*)&wndClass));
|
|
}
|
|
|
|
WORD MUSDlg::performDialog(void)
|
|
{
|
|
createDialogControls();
|
|
loadInstruments();
|
|
while(::IsWindow((HWND)*this))yieldTask();
|
|
return FALSE;
|
|
}
|
|
|
|
void MUSDlg::loadInstruments(void)
|
|
{
|
|
Instruments midiInstruments(StartOrdinal,EndOrdinal);
|
|
PureVector<PureInstrument> vectoredInstruments;
|
|
String itemString;
|
|
|
|
midiInstruments.getInstruments(vectoredInstruments);
|
|
::SendMessage(mhListBoxWnd,WM_SETREDRAW,FALSE,0L);
|
|
for(int index=0;index<vectoredInstruments.size();index++)
|
|
{
|
|
itemString=vectoredInstruments[index].category();
|
|
itemString+="-";
|
|
itemString+=vectoredInstruments[index].name();
|
|
::SendMessage(::GetDlgItem(*this,MUS_LISTBOX),LB_ADDSTRING,0,(LPARAM)(LPSTR)itemString);
|
|
}
|
|
::SendMessage(mhListBoxWnd,WM_SETREDRAW,TRUE,0L);
|
|
}
|
|
|
|
void MUSDlg::insertHandlers(void)
|
|
{
|
|
insertHandler(VectorHandler::CommandHandler,&mCommandHandler);
|
|
insertHandler(VectorHandler::CreateHandler,&mCreateHandler);
|
|
insertHandler(VectorHandler::DrawItemHandler,&mDrawItemHandler);
|
|
insertHandler(VectorHandler::PaintHandler,&mPaintHandler);
|
|
insertHandler(VectorHandler::DestroyHandler,&mDestroyHandler);
|
|
insertHandler(VectorHandler::CloseHandler,&mCloseHandler);
|
|
insertHandler(VectorHandler::ControlColorHandler,&mControlColorHandler);
|
|
}
|
|
|
|
void MUSDlg::removeHandlers(void)
|
|
{
|
|
removeHandler(VectorHandler::CommandHandler,&mCommandHandler);
|
|
removeHandler(VectorHandler::CreateHandler,&mCreateHandler);
|
|
removeHandler(VectorHandler::DrawItemHandler,&mDrawItemHandler);
|
|
removeHandler(VectorHandler::PaintHandler,&mPaintHandler);
|
|
removeHandler(VectorHandler::DestroyHandler,&mDestroyHandler);
|
|
removeHandler(VectorHandler::CloseHandler,&mCloseHandler);
|
|
removeHandler(VectorHandler::ControlColorHandler,&mControlColorHandler);
|
|
}
|
|
|
|
void MUSDlg::createDialogControls(void)
|
|
{
|
|
String buttonString(STRING_BUTTONSTRING);
|
|
String listboxString(STRING_LISTBOXSTRING);
|
|
String staticString(STRING_STATICSTRING);
|
|
|
|
PureDevice pureDevice;
|
|
::CreateWindow(szClassName,szClassName,
|
|
WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX|WS_MAXIMIZEBOX|WS_CLIPCHILDREN,
|
|
CW_USEDEFAULT,CW_USEDEFAULT,
|
|
mLinkedBitmap.width(),mLinkedBitmap.height()+CaptionHeight,
|
|
mhParentWnd,NULL,mhInstance,(LPSTR)((MUSDlg*)this));
|
|
mhButtonUpWnd=::CreateWindow(buttonString,"",BS_OWNERDRAW|WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS,152,45,10,8,*this,(HMENU)MUS_TEMPOBUTTONUP,mhInstance,0);
|
|
mhButtonDnWnd=::CreateWindow(buttonString,"",BS_OWNERDRAW|WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS,152,54,10,8,*this,(HMENU)MUS_TEMPOBUTTONDN,mhInstance,0);
|
|
mhButtonCvtWnd=::CreateWindow(buttonString,"",BS_OWNERDRAW|WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS,167,17,15,15,*this,(HMENU)MUS_CVTBUTTON,mhInstance,0);
|
|
mhListBoxWnd=::CreateWindow(listboxString,"",LBS_NOTIFY|WS_VSCROLL|WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS,19,130,280,62,*this,(HMENU)MUS_LISTBOX,mhInstance,0);
|
|
mhStaticWnd=::CreateWindow(staticString,"",WS_CHILD|WS_CLIPSIBLINGS,21,210,275,18,*this,(HMENU)MUS_STATIC,mhInstance,0);
|
|
show(SW_SHOW);update();
|
|
::ShowWindow(mhStaticWnd,SW_SHOW);
|
|
}
|
|
|
|
CallbackData::ReturnType MUSDlg::commandHandler(CallbackData &someCallbackData)
|
|
{
|
|
switch(someCallbackData.wmCommandID())
|
|
{
|
|
case MUS_TEMPOBUTTONUP :
|
|
handleTempoUpEvent();
|
|
break;
|
|
case MUS_TEMPOBUTTONDN :
|
|
handleTempoDnEvent();
|
|
break;
|
|
case MUS_CVTBUTTON :
|
|
::PostMessage(*this,WM_COMMAND,MUS_CONVERTFILE,0L);
|
|
return FALSE;
|
|
case MUS_CONVERTFILE :
|
|
handleConvertFileEvent();
|
|
break;
|
|
case IDCANCEL :
|
|
destroy();
|
|
break;
|
|
}
|
|
return (CallbackData::ReturnType)FALSE;
|
|
}
|
|
|
|
void MUSDlg::handleTempoUpEvent(void)
|
|
{
|
|
setTempo(getTempo()+1);
|
|
mlpLedTempoDisplay->setNumber(getTempo());
|
|
}
|
|
|
|
void MUSDlg::handleTempoDnEvent(void)
|
|
{
|
|
setTempo(getTempo()-1);
|
|
mlpLedTempoDisplay->setNumber(getTempo());
|
|
}
|
|
|
|
void MUSDlg::handleConvertFileEvent(void)
|
|
{
|
|
String convertMessageString("writing ");
|
|
|
|
convertMessageString+=mOutputPathFileName;
|
|
setMessage(convertMessageString);
|
|
if(!convertFile())setMessage("Error converting file...");
|
|
else setMessage("Complete...");
|
|
}
|
|
|
|
CallbackData::ReturnType MUSDlg::createHandler(CallbackData &/*someCallbackData*/)
|
|
{
|
|
mOwnerDraw.associate(MUS_TEMPOBUTTONUP,String(STRING_BITMAPUPARUP),String(STRING_BITMAPUPARUP),String(STRING_BITMAPUPARDN),OwnerDraw::NOFOCUS);
|
|
mOwnerDraw.associate(MUS_TEMPOBUTTONDN,String(STRING_BITMAPDNARUP),String(STRING_BITMAPDNARUP),String(STRING_BITMAPDNARDN),OwnerDraw::NOFOCUS);
|
|
mOwnerDraw.associate(MUS_CVTBUTTON,String(STRING_BITMAPCNVTUP),String(STRING_BITMAPCNVTUP),String(STRING_BITMAPCNVTDN),OwnerDraw::NOFOCUS);
|
|
mlpLedTrackDisplay=new LedDisplay(*this,Point(xTrack,yTrack));
|
|
mlpLedTempoDisplay=new LedDisplay(*this,Point(xTempo,yTempo));
|
|
mlpLedTempoDisplay->setNumber(getTempo());
|
|
return (CallbackData::ReturnType)FALSE;
|
|
}
|
|
|
|
CallbackData::ReturnType MUSDlg::destroyHandler(CallbackData &/*someCallbackData*/)
|
|
{
|
|
mOwnerDraw.freeBitmap(MUS_TEMPOBUTTONUP);
|
|
mOwnerDraw.freeBitmap(MUS_TEMPOBUTTONDN);
|
|
mOwnerDraw.freeBitmap(MUS_CVTBUTTON);
|
|
return (CallbackData::ReturnType)FALSE;
|
|
}
|
|
|
|
CallbackData::ReturnType MUSDlg::closeHandler(CallbackData &/*someCallbackData*/)
|
|
{
|
|
destroy();
|
|
return (CallbackData::ReturnType)FALSE;
|
|
}
|
|
|
|
CallbackData::ReturnType MUSDlg::controlColorHandler(CallbackData &someCallbackData)
|
|
{
|
|
::SetBkColor((HDC)someCallbackData.wParam(),RGB(btnRed,btnGreen,btnBlue));
|
|
return (CallbackData::ReturnType)mhGrayBrush;
|
|
}
|
|
|
|
CallbackData::ReturnType MUSDlg::drawItemHandler(CallbackData &someCallbackData)
|
|
{
|
|
if(MUS_TEMPOBUTTONUP==((LPDRAWITEMSTRUCT)someCallbackData.lParam())->CtlID)
|
|
mOwnerDraw.handleOwnerButton(MUS_TEMPOBUTTONUP,someCallbackData.lParam());
|
|
else if(MUS_TEMPOBUTTONDN==((LPDRAWITEMSTRUCT)someCallbackData.lParam())->CtlID)
|
|
mOwnerDraw.handleOwnerButton(MUS_TEMPOBUTTONDN,someCallbackData.lParam());
|
|
else if(MUS_CVTBUTTON==((LPDRAWITEMSTRUCT)someCallbackData.lParam())->CtlID)
|
|
mOwnerDraw.handleOwnerButton(MUS_CVTBUTTON,someCallbackData.lParam());
|
|
return (CallbackData::ReturnType)FALSE;
|
|
}
|
|
|
|
CallbackData::ReturnType MUSDlg::paintHandler(CallbackData &someCallbackData)
|
|
{
|
|
RECT windowRect;
|
|
|
|
PaintInformation *lpPaintInformation((PaintInformation*)someCallbackData.lParam());
|
|
::SetRect(&windowRect,0,0,mLinkedBitmap.width(),mLinkedBitmap.height()+CaptionHeight);
|
|
mLinkedBitmap.drawBitmap((PureDevice)(*lpPaintInformation),windowRect);
|
|
if(mlpLedTrackDisplay)mlpLedTrackDisplay->paint();
|
|
if(mlpLedTempoDisplay)mlpLedTempoDisplay->paint();
|
|
return (CallbackData::ReturnType)0;
|
|
}
|
|
|
|
void MUSDlg::yieldTask(void)const
|
|
{
|
|
MSG msg;
|
|
|
|
while(::IsWindow((HWND)*this)&&::PeekMessage(&msg,0,0,0,PM_REMOVE))
|
|
{
|
|
if(WM_PAINT==msg.message||isComponentWnd(msg.hwnd))
|
|
{
|
|
::TranslateMessage(&msg);
|
|
::DispatchMessage(&msg);
|
|
}
|
|
}
|
|
}
|
|
|
|
WORD MUSDlg::isComponentWnd(HWND hWnd)const
|
|
{
|
|
if(!::IsWindow(hWnd)||!::IsWindow((HWND)*this))return FALSE;
|
|
if(hWnd==(HWND)*this)return TRUE;
|
|
if(mhButtonUpWnd==hWnd)return TRUE;
|
|
if(mhButtonDnWnd==hWnd)return TRUE;
|
|
if(mhButtonCvtWnd==hWnd)return TRUE;
|
|
if(mhListBoxWnd==hWnd)return TRUE;
|
|
if(mhStaticWnd==hWnd)return TRUE;
|
|
return FALSE;
|
|
}
|
|
|
|
WORD MUSDlg::handleScoreStart(void)
|
|
{
|
|
return MUSConverter::handleScoreStart();
|
|
}
|
|
|
|
WORD MUSDlg::handleReleaseNote(PureEvent &pureEvent,PureDelay &pureDelay,PureNote &releaseNote,BYTE trackNumber)
|
|
{
|
|
if(trackNumber!=mlpLedTrackDisplay->getNumber())
|
|
mlpLedTrackDisplay->setNumber(trackNumber);
|
|
return MUSConverter::handleReleaseNote(pureEvent,pureDelay,releaseNote,trackNumber);
|
|
}
|
|
|
|
WORD MUSDlg::handlePlayNote(PureEvent &pureEvent,PureDelay &pureDelay,PureNote &playNote,BYTE trackNumber)
|
|
{
|
|
if(trackNumber!=mlpLedTrackDisplay->getNumber())
|
|
mlpLedTrackDisplay->setNumber(trackNumber);
|
|
return MUSConverter::handlePlayNote(pureEvent,pureDelay,playNote,trackNumber);
|
|
}
|
|
|
|
WORD MUSDlg::handlePitchBend(PureEvent &pureEvent,PureDelay &pureDelay,BYTE pitchBenderValue,BYTE trackNumber)
|
|
{
|
|
if(trackNumber!=mlpLedTrackDisplay->getNumber())
|
|
mlpLedTrackDisplay->setNumber(trackNumber);
|
|
return MUSConverter::handlePitchBend(pureEvent,pureDelay,pitchBenderValue,trackNumber);
|
|
}
|
|
|
|
WORD MUSDlg::handleReset(PureEvent &pureEvent,PureDelay &pureDelay,BYTE tempoValue,BYTE trackNumber)
|
|
{
|
|
if(trackNumber!=mlpLedTrackDisplay->getNumber())
|
|
mlpLedTrackDisplay->setNumber(trackNumber);
|
|
return MUSConverter::handleReset(pureEvent,pureDelay,tempoValue,trackNumber);
|
|
}
|
|
|
|
WORD MUSDlg::handleController(PureEvent &pureEvent,PureDelay &pureDelay,PureController &pureController,BYTE trackNumber)
|
|
{
|
|
if(trackNumber!=mlpLedTrackDisplay->getNumber())
|
|
mlpLedTrackDisplay->setNumber(trackNumber);
|
|
return MUSConverter::handleController(pureEvent,pureDelay,pureController,trackNumber);
|
|
}
|
|
|
|
WORD MUSDlg::handleScoreEnd(PureDelay &pureDelay)
|
|
{
|
|
return MUSConverter::handleScoreEnd(pureDelay);
|
|
}
|
|
|