Files
Work/guitar/ScaleDlg.cpp
2024-08-07 09:16:27 -04:00

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);
}