396 lines
11 KiB
C++
396 lines
11 KiB
C++
#include <guitar/scaledlg.hpp>
|
|
#include <guitar/guitar.hpp>
|
|
#include <guitar/GlobalDefs.hpp>
|
|
#include <guitar/Fingering.hpp>
|
|
#include <guitar/CBCommands.hpp>
|
|
#include <music/scales.hpp>
|
|
#include <common/puredwrd.hpp>
|
|
#include <common/commctrl.hpp>
|
|
#include <common/richedit.hpp>
|
|
#include <common/crsctrl.hpp>
|
|
|
|
ScaleDialog::ScaleDialog(void)
|
|
: mInEdit(false)
|
|
{
|
|
mInitHandler.setCallback(this,&ScaleDialog::initHandler);
|
|
mCreateHandler.setCallback(this,&ScaleDialog::createHandler);
|
|
mCloseHandler.setCallback(this,&ScaleDialog::closeHandler);
|
|
mDestroyHandler.setCallback(this,&ScaleDialog::destroyHandler);
|
|
mCommandHandler.setCallback(this,&ScaleDialog::commandHandler);
|
|
insertHandler(VectorHandler::InitDialogHandler,&mInitHandler);
|
|
insertHandler(VectorHandler::CreateHandler,&mCreateHandler);
|
|
insertHandler(VectorHandler::CloseHandler,&mCloseHandler);
|
|
insertHandler(VectorHandler::CommandHandler,&mCommandHandler);
|
|
insertHandler(VectorHandler::DestroyHandler,&mDestroyHandler);
|
|
}
|
|
|
|
ScaleDialog::ScaleDialog(const ScaleDialog &someScaleDialog)
|
|
{ // private implementation
|
|
*this=someScaleDialog;
|
|
}
|
|
|
|
ScaleDialog::~ScaleDialog()
|
|
{
|
|
removeHandler(VectorHandler::InitDialogHandler,&mInitHandler);
|
|
removeHandler(VectorHandler::CreateHandler,&mCreateHandler);
|
|
removeHandler(VectorHandler::CloseHandler,&mCloseHandler);
|
|
removeHandler(VectorHandler::CommandHandler,&mCommandHandler);
|
|
removeHandler(VectorHandler::DestroyHandler,&mDestroyHandler);
|
|
}
|
|
|
|
ScaleDialog &ScaleDialog::operator=(const ScaleDialog &someScaleDialog)
|
|
{ // private implementation
|
|
return *this;
|
|
}
|
|
|
|
bool ScaleDialog::perform(GUIWindow &parentWindow,CallbackPointer &callbackPointer)
|
|
{
|
|
mPlayNoteHandler=callbackPointer;
|
|
return ::DialogBoxParam(processInstance(),(LPSTR)"ScaleDialog",(HWND)parentWindow,DWindow::DlgProc,(LPARAM)(DWindow*)this);
|
|
}
|
|
|
|
CallbackData::ReturnType ScaleDialog::initHandler(CallbackData &someCallbackData)
|
|
{
|
|
GDIPoint cursorPoint;
|
|
|
|
mMIDIDevice=::new Sequencer();
|
|
mMIDIDevice.disposition(PointerDisposition::Delete);
|
|
::GetCursorPos(&cursorPoint.getPOINT());
|
|
move(cursorPoint);
|
|
mScaleList=::new OwnerDrawListAltColor(*this,getItem(SCALEDLG_LIST),SCALEDLG_LIST);
|
|
mScaleList.disposition(PointerDisposition::Delete);
|
|
mScaleList->addString("Ionian");
|
|
mScaleList->addString("Dorian");
|
|
mScaleList->addString("Phrygian");
|
|
mScaleList->addString("Lydian");
|
|
mScaleList->addString("Mixolydian");
|
|
mScaleList->addString("Aeolian");
|
|
mScaleList->addString("Locrian");
|
|
mScaleList->addString("Pentatonic Minor");
|
|
mScaleList->addString("Harmonic Minor");
|
|
mScaleList->addString("Melodic Minor");
|
|
mScaleList->addString("Dorian-II");
|
|
mScaleList->addString("Lydian Augmented");
|
|
mScaleList->addString("Lydian Dominant");
|
|
mScaleList->addString("Locrian2");
|
|
mScaleList->addString("Altered");
|
|
mScaleList->addString("Diminished(Whole Step)");
|
|
mScaleList->addString("Diminished(Half Step)");
|
|
mScaleList->addString("Whole Tone");
|
|
mScaleList->addString("BeBop Dominant");
|
|
mScaleList->addString("BeBop Major");
|
|
mScaleList->addString("BeBop Tonic Minor");
|
|
mScaleList->addString("BeBop Minor");
|
|
mScaleList->addString("Eight Tone Spanish");
|
|
mScaleList->addString("Enigmatic");
|
|
mScaleList->addString("Gypsy");
|
|
mScaleList->addString("Hungarian");
|
|
mScaleList->addString("Hungarian Minor");
|
|
mScaleList->addString("Leading Whole Tone");
|
|
mScaleList->addString("Lydian Minor");
|
|
mScaleList->addString("Major Locrian");
|
|
mScaleList->addString("Neapolitan Major");
|
|
mScaleList->addString("Neapolitan Minor");
|
|
mScaleList->addString("Oriental");
|
|
mScaleList->addString("Todi");
|
|
mScaleList->addString("Super Locrian");
|
|
mScaleList->addString("Baroque");
|
|
mScaleList->addString("Phrygian Dominant");
|
|
sendMessage(SCALEDLG_SPIN,UDM_SETRANGE,0,(LPARAM)MAKELONG(11,0));
|
|
sendMessage(SCALEDLG_SPIN,UDM_SETBUDDY,(WPARAM)getItem(SCALEDLG_ROOT),0L);
|
|
sendMessage(SCALEDLG_SPIN,UDM_SETPOS,0,0L);
|
|
setText(SCALEDLG_ROOT,"A");
|
|
mScaleList->setCurrent(0);
|
|
sendMessage(SCALEDLG_MUTE,BM_SETCHECK,1,0L);
|
|
return (CallbackData::ReturnType)FALSE;
|
|
}
|
|
|
|
CallbackData::ReturnType ScaleDialog::createHandler(CallbackData &someCallbackData)
|
|
{
|
|
return (CallbackData::ReturnType)FALSE;
|
|
}
|
|
|
|
CallbackData::ReturnType ScaleDialog::closeHandler(CallbackData &someCallbackData)
|
|
{
|
|
return (CallbackData::ReturnType)FALSE;
|
|
}
|
|
|
|
CallbackData::ReturnType ScaleDialog::destroyHandler(CallbackData &someCallbackData)
|
|
{
|
|
return (CallbackData::ReturnType)FALSE;
|
|
}
|
|
|
|
CallbackData::ReturnType ScaleDialog::commandHandler(CallbackData &someCallbackData)
|
|
{
|
|
switch(someCallbackData.wmCommandID())
|
|
{
|
|
case IDCANCEL :
|
|
endDialog(false);
|
|
break;
|
|
case IDOK :
|
|
handleOk();
|
|
endDialog(true);
|
|
break;
|
|
case SCALEDLG_SPIN :
|
|
break;
|
|
case SCALEDLG_ROOT :
|
|
handleRoot();
|
|
break;
|
|
case SCALEDLG_LIST :
|
|
if(LBN_KILLFOCUS!=someCallbackData.wmCommandCommand()&&
|
|
LBN_SETFOCUS!=someCallbackData.wmCommandCommand())
|
|
handleList();
|
|
break;
|
|
}
|
|
return (CallbackData::ReturnType)FALSE;
|
|
}
|
|
|
|
void ScaleDialog::handleOk(void)
|
|
{
|
|
}
|
|
|
|
void ScaleDialog::handleRoot(void)
|
|
{
|
|
String strRoot;
|
|
|
|
if(mInEdit)return;
|
|
mInEdit=true;
|
|
getText(SCALEDLG_ROOT,strRoot);
|
|
strRoot.upper();
|
|
if(strRoot=="0")setText(SCALEDLG_ROOT,"A");
|
|
else if(strRoot=="1")setText(SCALEDLG_ROOT,"A#");
|
|
else if(strRoot=="2")setText(SCALEDLG_ROOT,"B");
|
|
else if(strRoot=="3")setText(SCALEDLG_ROOT,"C");
|
|
else if(strRoot=="4")setText(SCALEDLG_ROOT,"C#");
|
|
else if(strRoot=="5")setText(SCALEDLG_ROOT,"D");
|
|
else if(strRoot=="6")setText(SCALEDLG_ROOT,"D#");
|
|
else if(strRoot=="7")setText(SCALEDLG_ROOT,"E");
|
|
else if(strRoot=="8")setText(SCALEDLG_ROOT,"F");
|
|
else if(strRoot=="9")setText(SCALEDLG_ROOT,"F#");
|
|
else if(strRoot=="10")setText(SCALEDLG_ROOT,"G");
|
|
else if(strRoot=="11")setText(SCALEDLG_ROOT,"G#");
|
|
else {mInEdit=false;return;}
|
|
if(!showScale())setText(SCALEDLG_ROOT,"A");
|
|
mInEdit=false;
|
|
}
|
|
|
|
void ScaleDialog::handleList(void)
|
|
{
|
|
showScale();
|
|
}
|
|
|
|
bool ScaleDialog::showScale(void)
|
|
{
|
|
String strScale;
|
|
String strRoot;
|
|
DWORD current;
|
|
|
|
current=mScaleList->getCurrent();
|
|
getText(SCALEDLG_ROOT,strRoot);
|
|
if(Note::None==Note::getNoteType(strRoot))return false;
|
|
mScaleList->getText(strScale,current);
|
|
playScale(strRoot,strScale);
|
|
return true;
|
|
}
|
|
|
|
void ScaleDialog::playScale(const String &root,const String &scale)
|
|
{
|
|
if(scale=="Ionian")
|
|
{
|
|
IonianScale ionianScale(Note::getNoteType(root));
|
|
playScale(ionianScale);
|
|
}
|
|
else if(scale=="Dorian")
|
|
{
|
|
DorianScale dorianScale(Note::getNoteType(root));
|
|
playScale(dorianScale);
|
|
}
|
|
else if(scale=="Phrygian")
|
|
{
|
|
PhrygianScale phrygianScale(Note::getNoteType(root));
|
|
playScale(phrygianScale);
|
|
}
|
|
else if(scale=="Lydian")
|
|
{
|
|
LydianScale lydianScale(Note::getNoteType(root));
|
|
playScale(lydianScale);
|
|
}
|
|
else if(scale=="Mixolydian")
|
|
{
|
|
MixolydianScale mixolydianScale(Note::getNoteType(root));
|
|
playScale(mixolydianScale);
|
|
}
|
|
else if(scale=="Aeolian")
|
|
{
|
|
AeolianScale aeolianScale(Note::getNoteType(root));
|
|
playScale(aeolianScale);
|
|
}
|
|
else if(scale=="Locrian")
|
|
{
|
|
LocrianScale locrianScale(Note::getNoteType(root));
|
|
playScale(locrianScale);
|
|
}
|
|
else if(scale=="Pentatonic Minor")
|
|
{
|
|
PentatonicMinorScale pentatonicMinorScale(Note::getNoteType(root));
|
|
playScale(pentatonicMinorScale);
|
|
}
|
|
else if(scale=="Harmonic Minor")
|
|
{
|
|
HarmonicMinorScale harmonicMinorScale(Note::getNoteType(root));
|
|
playScale(harmonicMinorScale);
|
|
}
|
|
else if(scale=="Melodic Minor")
|
|
{
|
|
MelodicMinorScale melodicMinorScale(Note::getNoteType(root));
|
|
playScale(melodicMinorScale);
|
|
}
|
|
else if(scale=="Dorian-II")
|
|
{
|
|
DorianIIScale dorianIIScale(Note::getNoteType(root));
|
|
playScale(dorianIIScale);
|
|
}
|
|
else if(scale=="Lydian Augmented")
|
|
{
|
|
LydianAugmentedScale lydianAugmentedScale(Note::getNoteType(root));
|
|
playScale(lydianAugmentedScale);
|
|
}
|
|
else if(scale=="Lydian Dominant")
|
|
{
|
|
LydianDominantScale lydianDominantScale(Note::getNoteType(root));
|
|
playScale(lydianDominantScale);
|
|
}
|
|
else if(scale=="Locrian2")
|
|
{
|
|
Locrian2Scale locrian2Scale(Note::getNoteType(root));
|
|
playScale(locrian2Scale);
|
|
}
|
|
else if(scale=="Altered")
|
|
{
|
|
AlteredScale alteredScale(Note::getNoteType(root));
|
|
playScale(alteredScale);
|
|
}
|
|
else if(scale=="Diminished(Whole Step)")
|
|
{
|
|
DiminishedWholeScale diminishedWholeScale(Note::getNoteType(root));
|
|
playScale(diminishedWholeScale);
|
|
}
|
|
else if(scale=="Diminished(Half Step)")
|
|
{
|
|
DiminishedHalfScale diminishedHalfScale(Note::getNoteType(root));
|
|
playScale(diminishedHalfScale);
|
|
}
|
|
else if(scale=="Whole Tone")
|
|
{
|
|
WholeToneScale wholeToneScale(Note::getNoteType(root));
|
|
playScale(wholeToneScale);
|
|
}
|
|
else if(scale=="BeBop Dominant")
|
|
{
|
|
BeBopDominantScale bebopDominantScale(Note::getNoteType(root));
|
|
playScale(bebopDominantScale);
|
|
}
|
|
else if(scale=="BeBop Major")
|
|
{
|
|
BeBopMajorScale bebopMajorScale(Note::getNoteType(root));
|
|
playScale(bebopMajorScale);
|
|
}
|
|
else if(scale=="BeBop Tonic Minor")
|
|
{
|
|
BeBopTonicMinorScale bebopTonicMinorScale(Note::getNoteType(root));
|
|
playScale(bebopTonicMinorScale);
|
|
}
|
|
else if(scale=="BeBop Minor")
|
|
{
|
|
BeBopMinorScale bebopMinorScale(Note::getNoteType(root));
|
|
playScale(bebopMinorScale);
|
|
}
|
|
else if(scale=="Eight Tone Spanish")
|
|
{
|
|
EightToneSpanishScale eightToneSpanishScale(Note::getNoteType(root));
|
|
playScale(eightToneSpanishScale);
|
|
}
|
|
else if(scale=="Enigmatic")
|
|
{
|
|
EnigmaticScale enigmaticScale(Note::getNoteType(root));
|
|
playScale(enigmaticScale);
|
|
}
|
|
else if(scale=="Gypsy")
|
|
{
|
|
GypsyScale gypsyScale(Note::getNoteType(root));
|
|
playScale(gypsyScale);
|
|
}
|
|
else if(scale=="Hungarian")
|
|
{
|
|
HungarianScale hungarianScale(Note::getNoteType(root));
|
|
playScale(hungarianScale);
|
|
}
|
|
else if(scale=="Hungarian Minor")
|
|
{
|
|
HungarianMinorScale hungarianMinorScale(Note::getNoteType(root));
|
|
playScale(hungarianMinorScale);
|
|
}
|
|
else if(scale=="Leading Whole Tone")
|
|
{
|
|
LeadingWholeToneScale leadingWholeToneScale(Note::getNoteType(root));
|
|
playScale(leadingWholeToneScale);
|
|
}
|
|
else if(scale=="Lydian Minor")
|
|
{
|
|
LydianMinorScale lydianMinorScale(Note::getNoteType(root));
|
|
playScale(lydianMinorScale);
|
|
}
|
|
else if(scale=="Major Locrian") // same as LydianMinor
|
|
{
|
|
MajorLocrianScale majorLocrianScale(Note::getNoteType(root));
|
|
playScale(majorLocrianScale);
|
|
}
|
|
else if(scale=="Neapolitan Major")
|
|
{
|
|
NeapolitanMajorScale neapolitanMajorScale(Note::getNoteType(root));
|
|
playScale(neapolitanMajorScale);
|
|
}
|
|
else if(scale=="Neapolitan Minor")
|
|
{
|
|
NeapolitanMinorScale neapolitanMinorScale(Note::getNoteType(root));
|
|
playScale(neapolitanMinorScale);
|
|
}
|
|
else if(scale=="Oriental")
|
|
{
|
|
OrientalScale orientalScale(Note::getNoteType(root));
|
|
playScale(orientalScale);
|
|
}
|
|
else if(scale=="Todi")
|
|
{
|
|
TodiScale todiScale(Note::getNoteType(root));
|
|
playScale(todiScale);
|
|
}
|
|
else if(scale=="Super Locrian")
|
|
{
|
|
SuperLocrianScale superLocrianScale(Note::getNoteType(root));
|
|
playScale(superLocrianScale);
|
|
}
|
|
else if(scale=="Baroque")
|
|
{
|
|
BaroqueScale baroqueScale(Note::getNoteType(root));
|
|
playScale(baroqueScale);
|
|
}
|
|
else if(scale=="Phrygian Dominant")
|
|
{
|
|
PhrygianDominantScale phrygianDominantScale(Note::getNoteType(root));
|
|
playScale(phrygianDominantScale);
|
|
}
|
|
}
|
|
|
|
void ScaleDialog::playScale(const Scale &scale)
|
|
{
|
|
int command=BST_CHECKED==sendMessage(SCALEDLG_MUTE,BM_GETCHECK,0,0L)?CBCommands::FBShowScale:CBCommands::FBPlayScale;
|
|
CallbackData cbData(command,(LPARAM)&scale);
|
|
CursorControl cursorControl;
|
|
cursorControl.waitCursor(true);
|
|
mPlayNoteHandler.callback(cbData);
|
|
cursorControl.waitCursor(false);
|
|
}
|
|
|
|
|