// RelDlg.cpp : implementation file
//
#include "stdafx.h"
#include "Pitch.h"
#include "PitchDlg.h"
#include "RelDlg.h"
#include "scrdlg.h"
#include "Prompt.h"
#include <mmsystem.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define PLAY_BUFFER_LENGTH 128
extern unsigned int RelativeNoteResults[][15];
extern int LowPianoNote;
extern int HighPianoNote;
extern char NoteDescription[];
extern char NoteTable1[];
extern char MidiReturn[];
extern int HighNoteForSoundBlaster;
extern int RelativeX, RelativeY, RelativeWidth, RelativeHeight;
extern BYTE CurrentChannel;
extern BYTE bStatus; // Midi status byte
extern BYTE bChannel; // Midi channel byte
extern BYTE bData1; // First midi data byte
extern BYTE bData2; // Second midi data byte// Play note and wait until it finishes
extern int NoteWaitTimeLength;
extern BYTE InstrumentNumber;
extern int IncorrectDialogSwitch;
extern HWND myHWND;
extern int currentDialog;
MSG RelativeMessage;
static char RelativePlayNoteStatus[7];
static int OnlyResetingSwitch = 0;
//static int WaitTypeSwitch = 1; // 1 for cutoff notes, 2 for delay between notes
static int BypassSelectionAllRoutine = 0;
static int Random1st;
static int Random2nd;
static int RelativeCorrect = 0;
static int RelativeGuesses = 0;
static char IntervalTable[196] = "Unison " "Minor 2nd "
"Major 2nd " "Minor 3rd "
"Major 3rd " "Perfect 4th "
"Diminished 5th " "Perfect 5th "
"Minor 6th " "Major 6th "
"Minor 7th " "Major 7th "
"Perfect 8th " ;
static char IntervalDescription[128];
static char FirstNoteDescription[32];
static char SecondNoteDescription[32];
static char MidiReturnX[128];
BYTE SecondChannel;
int SecondNoteValue;
int RelativeTimerKey;
int RelativeWaitLength = 250; // 250 milliseconds
int RelativeTimerWaitSwitch = 0;
int DebugNote;
char DebugChar[5];
int UpDownSwitch = 2; // 0 = up, 1 = down and 2 = both
int AllSelectionSwitch = 0; // 0 = off and 1 = on
char charresultR[4];
char score_workR[24];
BOOL ResUnison; BOOL ResGuessedUnison;
BOOL ResMinor2nd; BOOL ResGuessedMinor2nd;
BOOL ResMajor2nd; BOOL ResGuessedMajor2nd;
BOOL ResMinor3rd; BOOL ResGuessedMinor3rd;
BOOL ResMajor3rd; BOOL ResGuessedMajor3rd;
BOOL ResPerfect4th; BOOL ResGuessedPerfect4th;
BOOL ResDiminished5th; BOOL ResGuessedDiminished5th;
BOOL ResPerfect5th; BOOL ResGuessedPerfect5th;
BOOL ResMinor6th; BOOL ResGuessedMinor6th;
BOOL ResMajor6th; BOOL ResGuessedMajor6th;
BOOL ResMinor7th; BOOL ResGuessedMinor7th;
BOOL ResMajor7th; BOOL ResGuessedMajor7th;
BOOL ResPerfect8th; BOOL ResGuessedPerfect8th;
BOOL ResSelectedAll;
//////////////////////////////////Prototypes/////////////////////////////////
void ChangeRelativeNoteBoxes(int);
void ChangeRelativeSelectedNoteBoxes(int);
void PlayTwoNotes();
/////////////////////////////////////////////////////////////////////////////
// CRelDlg dialog
CRelDlg::CRelDlg(CWnd* pParent /*=NULL*/)
: CDialog(CRelDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CRelDlg)
m_relative_high_note = "";
m_relative_interval = "";
m_relative_low_note = "";
m_up = -1;
m_relative_Low_Scroll_Position = 25; // Default low is note C2
m_relative_High_Scroll_Position= 76; // Default high is E6
m_relative_Scroll_Min = 1;
m_relative_Scroll_Max = 104;
m_relative_Speed_Scroll_Position= 10; // Equal to 1 second
m_relative_Speed_Scroll_Min = 0; // 0 means to play notes at the same time
m_relative_Speed_Scroll_Max = 100;
//}}AFX_DATA_INIT
}
void CRelDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CRelDlg)
DDX_Control(pDX, IDC_RelativeTitle, m_RelativeTitle);
DDX_Control(pDX, IDC_RelativePlayNotes, m_RelativePlayNotes);
DDX_Control(pDX, IDC_RelativeScore, m_RelativeScore);
DDX_Control(pDX, IDC_RELATIVE_SPEED, m_relative_speed);
DDX_Control(pDX, IDC_RELATIVE_LOW_RANGE, m_relative_low_range);
DDX_Control(pDX, IDC_RELATIVE_HIGH_RANGE, m_relative_high_range);
DDX_Text(pDX, IDC_RELATIVE_HIGH_NOTE, m_relative_high_note);
DDX_Text(pDX, IDC_RELATIVE_INTERVAL, m_relative_interval);
DDX_Text(pDX, IDC_RELATIVE_LOW_NOTE, m_relative_low_note);
DDX_Control(pDX, IDC_RELATIVE_MAJOR_2ND, m_relative_major_2nd);
DDX_Control(pDX, IDC_RELATIVE_MAJOR_3RD, m_relative_major_3rd);
DDX_Control(pDX, IDC_RELATIVE_MAJOR_6TH, m_relative_major_6th);
DDX_Control(pDX, IDC_RELATIVE_MAJOR_7TH, m_relative_major_7th);
DDX_Control(pDX, IDC_RELATIVE_DIMINISHED_5TH, m_relative_diminished_5th);
DDX_Control(pDX, IDC_RELATIVE_MINOR_2ND, m_relative_minor_2nd);
DDX_Control(pDX, IDC_RELATIVE_MINOR_3RD, m_relative_minor_3rd);
DDX_Control(pDX, IDC_RELATIVE_MINOR_6TH, m_relative_minor_6th);
DDX_Control(pDX, IDC_RELATIVE_MINOR_7TH, m_relative_minor_7th);
DDX_Control(pDX, IDC_RELATIVE_PERFECT_4TH, m_relative_perfect_4th);
DDX_Control(pDX, IDC_RELATIVE_PERFECT_5TH, m_relative_perfect_5th);
DDX_Control(pDX, IDC_RELATIVE_PERFECT_8TH, m_relative_perfect_8th);
DDX_Control(pDX, IDC_RELATIVE_UNISON, m_relative_unison);
DDX_Control(pDX, IDC_RELATIVE_SELECTED_UNISON, m_relative_selected_unison);
DDX_Control(pDX, IDC_RELATIVE_SELECTED_MINOR_2ND, m_relative_selected_minor_2nd);
DDX_Control(pDX, IDC_RELATIVE_SELECTED_MAJOR_2ND, m_relative_selected_major_2nd);
DDX_Control(pDX, IDC_RELATIVE_SELECTED_MINOR_3RD, m_relative_selected_minor_3rd);
DDX_Control(pDX, IDC_RELATIVE_SELECTED_MAJOR_3RD, m_relative_selected_major_3rd);
DDX_Control(pDX, IDC_RELATIVE_SELECTED_PERFECT_4TH, m_relative_selected_perfect_4th);
DDX_Control(pDX, IDC_RELATIVE_SELECTED_DIMINISHED_5TH, m_relative_selected_diminished_5th);
DDX_Control(pDX, IDC_RELATIVE_SELECTED_PERFECT_5TH, m_relative_selected_perfect_5th);
DDX_Control(pDX, IDC_RELATIVE_SELECTED_MINOR_6TH, m_relative_selected_minor_6th);
DDX_Control(pDX, IDC_RELATIVE_SELECTED_MAJOR_6TH, m_relative_selected_major_6th);
DDX_Control(pDX, IDC_RELATIVE_SELECTED_MINOR_7TH, m_relative_selected_minor_7th);
DDX_Control(pDX, IDC_RELATIVE_SELECTED_MAJOR_7TH, m_relative_selected_major_7th);
DDX_Control(pDX, IDC_RELATIVE_SELECTED_PERFECT_8TH, m_relative_selected_perfect_8th);
DDX_Control(pDX, IDC_RELATIVE_SELECTED_ALL, m_relative_selected_all);
DDX_Radio(pDX, IDC_UP, m_up);
DDX_Control(pDX, IDC_GetOutOfRelative, m_GetOutOfRelative);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CRelDlg, CDialog)
//{{AFX_MSG_MAP(CRelDlg)
ON_WM_HSCROLL()
ON_BN_CLICKED(IDC_RELATIVE_SELECTED_UNISON, OnRelativeSelectedUnison)
ON_BN_CLICKED(IDC_RELATIVE_SELECTED_MINOR_2ND, OnRelativeSelectedMinor2nd)
ON_BN_CLICKED(IDC_RELATIVE_SELECTED_MAJOR_2ND, OnRelativeSelectedMajor2nd)
ON_BN_CLICKED(IDC_RELATIVE_SELECTED_MINOR_3RD, OnRelativeSelectedMinor3rd)
ON_BN_CLICKED(IDC_RELATIVE_SELECTED_MAJOR_3RD, OnRelativeSelectedMajor3rd)
ON_BN_CLICKED(IDC_RELATIVE_SELECTED_PERFECT_4TH, OnRelativeSelectedPerfect4th)
ON_BN_CLICKED(IDC_RELATIVE_SELECTED_DIMINISHED_5TH, OnRelativeSelectedDiminished5th)
ON_BN_CLICKED(IDC_RELATIVE_SELECTED_PERFECT_5TH, OnRelativeSelectedPerfect5th)
ON_BN_CLICKED(IDC_RELATIVE_SELECTED_MINOR_6TH, OnRelativeSelectedMinor6th)
ON_BN_CLICKED(IDC_RELATIVE_SELECTED_MAJOR_6TH, OnRelativeSelectedMajor6th)
ON_BN_CLICKED(IDC_RELATIVE_SELECTED_MINOR_7TH, OnRelativeSelectedMinor7th)
ON_BN_CLICKED(IDC_RELATIVE_SELECTED_MAJOR_7TH, OnRelativeSelectedMajor7th)
ON_BN_CLICKED(IDC_RELATIVE_SELECTED_PERFECT_8TH, OnRelativeSelectedPerfect8th)
ON_BN_CLICKED(IDC_RELATIVE_SELECTED_ALL, OnRelativeSelectedAll)
ON_BN_CLICKED(IDC_RELATIVE_UNISON, OnRelativeUnison)
ON_BN_CLICKED(IDC_RELATIVE_MINOR_2ND, OnRelativeMinor2nd)
ON_BN_CLICKED(IDC_RELATIVE_MAJOR_2ND, OnRelativeMajor2nd)
ON_BN_CLICKED(IDC_RELATIVE_MINOR_3RD, OnRelativeMinor3rd)
ON_BN_CLICKED(IDC_RELATIVE_MAJOR_3RD, OnRelativeMajor3rd)
ON_BN_CLICKED(IDC_RELATIVE_PERFECT_4TH, OnRelativePerfect4th)
ON_BN_CLICKED(IDC_RELATIVE_DIMINISHED_5TH, OnRelativeDiminished5th)
ON_BN_CLICKED(IDC_RELATIVE_PERFECT_5TH, OnRelativePerfect5th)
ON_BN_CLICKED(IDC_RELATIVE_MINOR_6TH, OnRelativeMinor6th)
ON_BN_CLICKED(IDC_RELATIVE_MAJOR_6TH, OnRelativeMajor6th)
ON_BN_CLICKED(IDC_RELATIVE_MINOR_7TH, OnRelativeMinor7th)
ON_BN_CLICKED(IDC_RELATIVE_MAJOR_7TH, OnRelativeMajor7th)
ON_BN_CLICKED(IDC_RELATIVE_PERFECT_8TH, OnRelativePerfect8th)
ON_WM_TIMER()
ON_WM_RBUTTONDOWN()
ON_WM_RBUTTONUP()
ON_BN_CLICKED(IDC_UP, OnUp)
ON_BN_CLICKED(IDC_DOWN, OnDown)
ON_BN_CLICKED(IDC_UPDOWN, OnUpdown)
ON_WM_DESTROY()
ON_BN_CLICKED(IDC_GetOutOfRelative, OnGetOutOfRelative)
ON_BN_CLICKED(IDC_RelativeScore, OnRelativeScore)
ON_BN_CLICKED(IDC_RelativePlayNotes, OnRelativePlayNotes)
ON_MESSAGE(UWM_RelativeButtonMove, OnRelativeButtonMove)
ON_MESSAGE(UWM_RelativeButtonLeave, OnRelativeButtonLeave)
ON_WM_CREATE()
ON_BN_CLICKED(IDC_RelativeTitle, OnRelativeTitle)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CRelDlg message handlers
BEGIN_EVENTSINK_MAP(CRelDlg, CDialog)
//{{AFX_EVENTSINK_MAP(CRelDlg)
//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()
BOOL CRelDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Set the Relativet window to where it finished last time
MoveWindow(RelativeX, RelativeY, RelativeWidth, RelativeHeight, TRUE);
LowPianoNote = 25;
HighPianoNote = HighNoteForSoundBlaster; // Use SoundBlaster as default
RelativeWaitLength = 250; // Set default interval speed to 250 milliseconds
CScrollBar* pSB_Low = (CScrollBar*) GetDlgItem(IDC_RELATIVE_LOW_RANGE);
CScrollBar* pSB_High = (CScrollBar*) GetDlgItem(IDC_RELATIVE_HIGH_RANGE);
CScrollBar* pSB_Speed = (CScrollBar*) GetDlgItem(IDC_RELATIVE_SPEED);
pSB_Low ->SetScrollRange(m_relative_Scroll_Min, m_relative_Scroll_Max);
pSB_High ->SetScrollRange(m_relative_Scroll_Min, m_relative_Scroll_Max);
pSB_Speed ->SetScrollRange(m_relative_Speed_Scroll_Min, m_relative_Speed_Scroll_Max);
pSB_Low ->SetScrollPos(m_relative_Low_Scroll_Position);
pSB_High ->SetScrollPos(m_relative_High_Scroll_Position);
pSB_Speed ->SetScrollPos(m_relative_Speed_Scroll_Position);
strncpy(NoteDescription,NoteTable1 + (m_relative_Low_Scroll_Position-1)*3, 3);
m_relative_low_note = NoteDescription;
strncpy(NoteDescription,NoteTable1 + (m_relative_High_Scroll_Position-1)*3, 3);
m_relative_high_note = NoteDescription;
UpdateData(FALSE);
strcpy(RelativePlayNoteStatus,"Play");
GetDlgItem(IDC_RelativePlayNotes) ->EnableWindow(FALSE);
KillGuessedCheckBoxes();
UpDownSwitch = 2;
m_up = 2; // Default to up and down intervals
m_RelativePlayNotes.SetWindowText(RelativePlayNoteStatus);
m_RelativePlayNotes.SetShade(SHS_SOFTBUMP,6,30);
m_RelativePlayNotes.SetTextColor(GreenColour);
m_RelativePlayNotes.SetFont("Signature",24,20);
m_GetOutOfRelative.SetShade(SHS_SOFTBUMP,6,30);
m_GetOutOfRelative.SetTextColor(RedColour);
m_GetOutOfRelative.SetFont("Signature",24,20);
m_RelativeScore.SetShade(SHS_SOFTBUMP,6,30);
m_RelativeScore.SetTextColor(BlueColour);
m_RelativeScore.SetFont("Signature",24,20);
m_RelativeScore.SetShade(SHS_DIAGSHADE,8,20,5,RGB(55,255,55));
m_relative_selected_unison.SetShade(SHS_SOFTBUMP,8,30);
m_relative_selected_minor_2nd.SetShade(SHS_SOFTBUMP,8,30);
m_relative_selected_major_2nd.SetShade(SHS_SOFTBUMP,8,30);
m_relative_selected_minor_3rd.SetShade(SHS_SOFTBUMP,8,30);
m_relative_selected_major_3rd.SetShade(SHS_SOFTBUMP,8,30);
m_relative_selected_perfect_4th.SetShade(SHS_SOFTBUMP,8,30);
m_relative_selected_diminished_5th.SetShade(SHS_SOFTBUMP,8,30);
m_relative_selected_perfect_5th.SetShade(SHS_SOFTBUMP,8,30);
m_relative_selected_minor_6th.SetShade(SHS_SOFTBUMP,8,30);
m_relative_selected_major_6th.SetShade(SHS_SOFTBUMP,8,30);
m_relative_selected_minor_7th.SetShade(SHS_SOFTBUMP,8,30);
m_relative_selected_major_7th.SetShade(SHS_SOFTBUMP,8,30);
m_relative_selected_perfect_8th.SetShade(SHS_SOFTBUMP,8,30);
m_relative_selected_all.SetShade(SHS_SOFTBUMP,8,30);
m_relative_selected_unison.SetTextColor(RedColour);
m_relative_selected_minor_2nd.SetTextColor(RedColour);
m_relative_selected_major_2nd.SetTextColor(RedColour);
m_relative_selected_minor_3rd.SetTextColor(RedColour);
m_relative_selected_major_3rd.SetTextColor(RedColour);
m_relative_selected_perfect_4th.SetTextColor(RedColour);
m_relative_selected_diminished_5th.SetTextColor(RedColour);
m_relative_selected_perfect_5th.SetTextColor(RedColour);
m_relative_selected_minor_6th.SetTextColor(RedColour);
m_relative_selected_major_6th.SetTextColor(RedColour);
m_relative_selected_minor_7th.SetTextColor(RedColour);
m_relative_selected_major_7th.SetTextColor(RedColour);
m_relative_selected_perfect_8th.SetTextColor(RedColour);
m_relative_selected_all.SetTextColor(RedColour);
// font name, size, weight italic underline for selection
m_relative_selected_unison.SetFont("Comic Sans MS",24,20,1);
m_relative_selected_minor_2nd.SetFont("Comic Sans MS",24,20,1);
m_relative_selected_major_2nd.SetFont("Comic Sans MS",24,20,1);
m_relative_selected_minor_3rd.SetFont("Comic Sans MS",24,20,1);
m_relative_selected_major_3rd.SetFont("Comic Sans MS",24,20,1);
m_relative_selected_perfect_4th.SetFont("Comic Sans MS",24,20,1);
m_relative_selected_diminished_5th.SetFont("Comic Sans MS",24,20,1);
m_relative_selected_perfect_5th.SetFont("Comic Sans MS",24,20,1);
m_relative_selected_minor_6th.SetFont("Comic Sans MS",24,20,1);
m_relative_selected_major_6th.SetFont("Comic Sans MS",24,20,1);
m_relative_selected_minor_7th.SetFont("Comic Sans MS",24,20,1);
m_relative_selected_major_7th.SetFont("Comic Sans MS",24,20,1);
m_relative_selected_perfect_8th.SetFont("Comic Sans MS",24,20,1);
m_relative_selected_all.SetFont("Comic Sans MS",24,20,1);
// font name, size, weight for playing
m_relative_unison.SetFont("Comic Sans MS",24,20,1);
m_relative_minor_2nd.SetFont("Comic Sans MS",24,20,1);
m_relative_major_2nd.SetFont("Comic Sans MS",24,20,1);
m_relative_minor_3rd.SetFont("Comic Sans MS",24,20,1);
m_relative_major_3rd.SetFont("Comic Sans MS",24,20,1);
m_relative_perfect_4th.SetFont("Comic Sans MS",24,20,1);
m_relative_diminished_5th.SetFont("Comic Sans MS",24,20,1);
m_relative_perfect_5th.SetFont("Comic Sans MS",24,20,1);
m_relative_minor_6th.SetFont("Comic Sans MS",24,20,1);
m_relative_major_6th.SetFont("Comic Sans MS",24,20,1);
m_relative_minor_7th.SetFont("Comic Sans MS",24,20,1);
m_relative_major_7th.SetFont("Comic Sans MS",24,20,1);
m_relative_perfect_8th.SetFont("Comic Sans MS",24,20,1);
m_RelativeTitle.SetShade(SHS_METAL,8,30);
m_RelativeTitle.SetTextColor(PurpleColour);
m_RelativeTitle.SetFont("Signature",32,20);
m_RelativeTitle.SetWindowText("Relative Pitch");
UpdateData(FALSE);
currentDialog = RelativeDialog;
return TRUE; // return TRUE unless you set the focus to a control
}
void CRelDlg::OnRelativePlayNotes()
{
long MidiErr = 0;
int RandomNote = 0;
int signed NoteDifference;
int i, InfiniteLoopCounter1, InfiniteLoopCounter2;
InfiniteLoopCounter1 = 0;
InfiniteLoopCounter2 = 0;
char Alpha[5];
CFile ResultsFile;
// Use GetARandomNumber member of CPitchDlg as a friend
CPitchDlg GetNumb;
if (strcmp(RelativePlayNoteStatus,"Replay"))
{} else
{
RelativeReplayNotes();
goto PlayNotesExit;
}
NoteDifference = HighPianoNote-LowPianoNote;
if (NoteDifference < 0) {NoteDifference = NoteDifference * -1;}; // Ensure positive
if (NoteDifference < 12)
{MessageBox("Range too small for interval testing.");
goto PlayNotesExit;};
// Disable all selection boxes
ChangeRelativeSelectedNoteBoxes(FALSE);
// Enable any guessing boxes that have relative selection boxes enabled
EnableGuessedCheckBoxes();
// Set the ticks off in the guessing boxes
OnlyResetingSwitch = 1;
m_relative_unison.SetCheck(FALSE);
m_relative_minor_2nd.SetCheck(FALSE);
m_relative_major_2nd.SetCheck(FALSE);
m_relative_minor_3rd.SetCheck(FALSE);
m_relative_major_3rd.SetCheck(FALSE);
m_relative_perfect_4th.SetCheck(FALSE);
m_relative_diminished_5th.SetCheck(FALSE);
m_relative_perfect_5th.SetCheck(FALSE);
m_relative_minor_6th.SetCheck(FALSE);
m_relative_major_6th.SetCheck(FALSE);
m_relative_minor_7th.SetCheck(FALSE);
m_relative_major_7th.SetCheck(FALSE);
m_relative_perfect_8th.SetCheck(FALSE);
OnlyResetingSwitch = 0;
m_relative_interval = "";
UpdateData(FALSE);
TopOfFirstNote:
InfiniteLoopCounter1++; InfiniteLoopCounter2 = 0;
if (InfiniteLoopCounter1 > 200)
{
//MessageBox("Can not randomly create an interval in this range");
itoa(LowPianoNote,Alpha,10);
MessageBox(Alpha);
itoa(HighPianoNote,Alpha,10);
MessageBox(Alpha);
goto PlayNotesExit;
}; //Finding any interval is impossible, so tell user and get out
if (LowPianoNote < HighPianoNote)
{RandomNote = GetNumb.GetARandomNumber(LowPianoNote,HighPianoNote);}
else
{RandomNote = GetNumb.GetARandomNumber(HighPianoNote,LowPianoNote);} ;
Random1st = RandomNote;
TopOfSecondNote:
InfiniteLoopCounter2++;
if (InfiniteLoopCounter2 > 100)
{goto TopOfFirstNote;}; //Finding second note is impossible, retry the first note
// Second note must be within an octave (plus or minus) of 1st note
// Need a random number from 0-24 which we will use as -12 to -1 and 0 to 12
// This will then be used to adjust the first note.
// If it is not a valid note, another search will be done.
// If it is valid, it is used as the 2nd note.
if (UpDownSwitch == 0)
{RandomNote = GetNumb.GetARandomNumber(0,12); // Up only
Random2nd = (Random1st+RandomNote );};
if (UpDownSwitch == 1)
{RandomNote = GetNumb.GetARandomNumber(0,12); // Down only
Random2nd = (Random1st-RandomNote );};
if (UpDownSwitch == 2)
{RandomNote = GetNumb.GetARandomNumber(0,24); // Up and Down!
if (RandomNote > 11)
{Random2nd = (Random1st+RandomNote -12);} // 12 to 24 becomes 0 to 12
else
{Random2nd = (Random1st-RandomNote-1);}; // 0 to 11 becomes -1 to -12
};
DebugNote = RandomNote;
// Following test is a bit messy as user could have high and low note notes reversed.
if ((LowPianoNote < HighPianoNote)
& ((Random2nd > HighPianoNote) | (Random2nd < LowPianoNote)))
{goto TopOfSecondNote;};
if ((LowPianoNote > HighPianoNote)
& ((Random2nd < HighPianoNote) | (Random2nd > LowPianoNote)))
{goto TopOfSecondNote;};
//Check to see that both notes create one of the intervals user selected
NoteDifference = Random1st - Random2nd;
if (NoteDifference < 0)
{NoteDifference = NoteDifference * -1;}; // Ensure positive
if (ResUnison & (NoteDifference == 0))
{goto IntervalIsValid;};
if (ResMinor2nd & (NoteDifference == 1))
{goto IntervalIsValid;};
if (ResMajor2nd & (NoteDifference == 2))
{goto IntervalIsValid;};
if (ResMinor3rd & (NoteDifference == 3))
{goto IntervalIsValid;};
if (ResMajor3rd & (NoteDifference == 4))
{goto IntervalIsValid;};
if (ResPerfect4th & (NoteDifference == 5))
{goto IntervalIsValid;};
if (ResDiminished5th & (NoteDifference == 6))
{goto IntervalIsValid;};
if (ResPerfect5th & (NoteDifference == 7))
{goto IntervalIsValid;};
if (ResMinor6th & (NoteDifference == 8))
{goto IntervalIsValid;};
if (ResMajor6th & (NoteDifference == 9))
{goto IntervalIsValid;};
if (ResMinor7th & (NoteDifference == 10))
{goto IntervalIsValid;};
if (ResMajor7th & (NoteDifference == 11))
{goto IntervalIsValid;};
if (ResPerfect8th & (NoteDifference == 12))
{goto IntervalIsValid;};
goto TopOfSecondNote; // Must try for the 2nd note again.
IntervalIsValid:
// Play the two notes
PlayTwoNotes();
UpdateData(FALSE);
// Make the interval box the centrepiece
// GetDlgItem(IDC_RELATIVE_INTERVAL) ->SetFocus();
// Recalculate all the check boxes
for (i = 1;i < 13; i++)
{A_Selection_Clicked_Routine(i);};
// Do not allow another set of notes until user responds to this set
strcpy(RelativePlayNoteStatus,"Replay");
m_RelativePlayNotes.SetWindowText(RelativePlayNoteStatus);
PlayNotesExit:
NoteDifference = 0;
}
void CRelDlg::PlayTwoNotes()
{
long MidiErr = 0;
strncpy(NoteDescription,NoteTable1 + (Random1st-1)*3, 3);
strcpy(FirstNoteDescription,NoteDescription);
strncpy(NoteDescription,NoteTable1 + (Random2nd-1)*3, 3);
strcpy(SecondNoteDescription,NoteDescription);
SecondNoteValue = 0;
if (RelativeWaitLength == 0)
{
MidiErr = PlayRelativeNote(Random1st, Random2nd); // Play notes together
}
else
{
MidiErr = PlayRelativeNote(Random1st, SecondNoteValue); // Play 1st note of pair
// delay between notes
DoRelativeWait(RelativeWaitLength);
// Now play the 2nd note of the set
MidiErr = PlayRelativeNote(Random2nd, SecondNoteValue); // Play 2nd note of pair
}
}
void CRelDlg::RelativeReplayNotes()
{
long MidiErr = 0;
//WaitTypeSwitch = 1;
if (RelativeWaitLength == 0)
{
MidiErr = PlayRelativeNote(Random1st, Random2nd); // Play 1st note of pair
}
else
{
MidiErr = PlayRelativeNote(Random1st, SecondNoteValue); // Play 1st note of pair
DoRelativeWait(RelativeWaitLength);
//WaitTypeSwitch = 1;
MidiErr = PlayRelativeNote(Random2nd, SecondNoteValue); // Play 2nd note of pair
}
}
void CRelDlg::OnRelativeScore()
{
char score_message[64];
char score_analysis[1681];
char score_work1[280], score_work2[280];
char charwork[12];
char note_work[64] = "", note_compressed[16];
CScRDlg dlg;
strcpy(score_message, "You have answered ");
itoa(RelativeCorrect,charresultR,10);
strcat(score_message,charresultR);
strcat(score_message," correctly out of ");
itoa(RelativeGuesses,charresultR,10);
strcat(score_message,charresultR);
strcat(score_message," attempts.");
dlg.m_relative_score_summary = score_message;
strcpy(score_analysis,"");
for (int i = 0; i < 13; i++)
{
if (RelativeNoteResults[i][0] != 0)
{
strcpy(note_work,""); strcpy(charwork,"");
strncpy(note_work,IntervalTable + (i)*15, 14);
strcat(score_analysis,note_work);
strcat(score_analysis,"(");
itoa(RelativeNoteResults[i][0],charwork,10);
strcat(score_analysis,charwork);
strcat(score_analysis,") ");
strcat(score_analysis,"Correct(");
itoa(RelativeNoteResults[i][1],charwork,10);
strcat(score_analysis,charwork);
strcat(score_analysis,") ");
strcpy(score_work1,"");
for (int j = 2; j < 15; j++) // Go through columns 3-15
{
if (RelativeNoteResults[i][j] != 0)
{
if (i+2 != j)
{
strcpy(note_work,"");
strcpy(charwork,"");
strncpy(note_work,IntervalTable + (j-2)*15, 14);
CompressString(note_work,note_compressed);
strcat(score_work1,note_compressed);
strcat(score_work1,"(");
itoa(RelativeNoteResults[i][j],charwork,10);
strcat(score_work1,charwork);
strcat(score_work1,"),");
}
}
}
CompressString(score_work1,score_work2);
strcat(score_analysis,score_work2);
strcat(score_analysis,"\n\n");
}
}
dlg.m_relative_score_details = score_analysis;
UpdateData(FALSE);
dlg.DoModal();
}
////////////////////////////////////////////////////////////////////////////////////
/////Compress a string from left to right allowing only one continuous space////////
////////////////////////////////////////////////////////////////////////////////////
void CRelDlg::CompressString(char * InputString, char * OutputString)
{
strcpy(OutputString,""); // Clear before processing
while ( *InputString != '\0')
{
if (*InputString == ' ')
{
*OutputString++ = *InputString++; // Move first space across
while (*InputString == ' ')
{InputString++;} // Bypass remaining spaces
}
else
{*OutputString++ = *InputString++;};
}
// Added special code to ensure we do not end string on a comma or a blank
*OutputString--; // Point back to last character output
// while ((*OutputString == ',') | (**OutputString == ' '))
// {*OutputString--;};
// *++OutputString = '\0'; // Indicate end of new string
}
void CRelDlg::OnRelativeSelectedAll(short FAR* Value)
{
bool CheckCondition;
int i;
if (BypassSelectionAllRoutine == 1) goto OnClickRelativeSelectionAllExit;
OnlyResetingSwitch = 1;
// if (m_relative_selected_all.GetCheck()) // Is currently off?
if (AllSelectionSwitch == 0) // Is currently off?
{ // yes
CheckCondition = TRUE;
//ChangeRelativeSelectedNoteBoxes(TRUE);
m_relative_selected_unison.SetCheck(TRUE);
m_relative_selected_minor_2nd.SetCheck(TRUE);
m_relative_selected_major_2nd.SetCheck(TRUE);
m_relative_selected_minor_3rd.SetCheck(TRUE);
m_relative_selected_major_3rd.SetCheck(TRUE);
m_relative_selected_perfect_4th.SetCheck(TRUE);
m_relative_selected_diminished_5th.SetCheck(TRUE);
m_relative_selected_perfect_5th.SetCheck(TRUE);
m_relative_selected_minor_6th.SetCheck(TRUE);
m_relative_selected_major_6th.SetCheck(TRUE);
m_relative_selected_minor_7th.SetCheck(TRUE);
m_relative_selected_major_7th.SetCheck(TRUE);
m_relative_selected_perfect_8th.SetCheck(TRUE);
m_relative_selected_all.SetCheck(TRUE);
m_relative_selected_unison.SetTextColor(GreenColour);
m_relative_selected_minor_2nd.SetTextColor(GreenColour);
m_relative_selected_major_2nd.SetTextColor(GreenColour);
m_relative_selected_minor_3rd.SetTextColor(GreenColour);
m_relative_selected_major_3rd.SetTextColor(GreenColour);
m_relative_selected_perfect_4th.SetTextColor(GreenColour);
m_relative_selected_diminished_5th.SetTextColor(GreenColour);
m_relative_selected_perfect_5th.SetTextColor(GreenColour);
m_relative_selected_minor_6th.SetTextColor(GreenColour);
m_relative_selected_major_6th.SetTextColor(GreenColour);
m_relative_selected_minor_7th.SetTextColor(GreenColour);
m_relative_selected_major_7th.SetTextColor(GreenColour);
m_relative_selected_perfect_8th.SetTextColor(GreenColour);
m_relative_selected_all.SetTextColor(GreenColour);
AllSelectionSwitch = 1;
}
else // no, it is currently on
{
CheckCondition = FALSE;
//ChangeRelativeSelectedNoteBoxes(FALSE);
m_relative_selected_unison.SetCheck(FALSE);
m_relative_selected_minor_2nd.SetCheck(FALSE);
m_relative_selected_major_2nd.SetCheck(FALSE);
m_relative_selected_minor_3rd.SetCheck(FALSE);
m_relative_selected_major_3rd.SetCheck(FALSE);
m_relative_selected_perfect_4th.SetCheck(FALSE);
m_relative_selected_diminished_5th.SetCheck(FALSE);
m_relative_selected_perfect_5th.SetCheck(FALSE);
m_relative_selected_minor_6th.SetCheck(FALSE);
m_relative_selected_major_6th.SetCheck(FALSE);
m_relative_selected_minor_7th.SetCheck(FALSE);
m_relative_selected_major_7th.SetCheck(FALSE);
m_relative_selected_perfect_8th.SetCheck(FALSE);
m_relative_selected_all.SetCheck(FALSE);
m_relative_selected_unison.SetTextColor(RedColour);
m_relative_selected_minor_2nd.SetTextColor(RedColour);
m_relative_selected_major_2nd.SetTextColor(RedColour);
m_relative_selected_minor_3rd.SetTextColor(RedColour);
m_relative_selected_major_3rd.SetTextColor(RedColour);
m_relative_selected_perfect_4th.SetTextColor(RedColour);
m_relative_selected_diminished_5th.SetTextColor(RedColour);
m_relative_selected_perfect_5th.SetTextColor(RedColour);
m_relative_selected_minor_6th.SetTextColor(RedColour);
m_relative_selected_major_6th.SetTextColor(RedColour);
m_relative_selected_minor_7th.SetTextColor(RedColour);
m_relative_selected_major_7th.SetTextColor(RedColour);
m_relative_selected_perfect_8th.SetTextColor(RedColour);
m_relative_selected_all.SetTextColor(RedColour);
AllSelectionSwitch = 0;
TurnOffAllSelected();
};
OnClickRelativeSelectionAllExit:
// Recalculate all the check boxes
for (i = 1;i < 14; i++)
{A_Selection_Clicked_Routine(i);};
OnlyResetingSwitch = 0;
BypassSelectionAllRoutine = 0;
GetDlgItem(IDC_RelativePlayNotes) ->EnableWindow(CheckCondition);
ResSelectedAll = CheckCondition;
}
void CRelDlg::OnRelativeSelectedUnison(short FAR* Value)
{A_Selection_Clicked_Routine(1);}
void CRelDlg::OnRelativeSelectedMinor2nd(short FAR* Value)
{A_Selection_Clicked_Routine(2);}
void CRelDlg::OnRelativeSelectedMajor2nd(short FAR* Value)
{A_Selection_Clicked_Routine(3);}
void CRelDlg::OnRelativeSelectedMinor3rd(short FAR* Value)
{A_Selection_Clicked_Routine(4);}
void CRelDlg::OnRelativeSelectedMajor3rd(short FAR* Value)
{A_Selection_Clicked_Routine(5);}
void CRelDlg::OnRelativeSelectedPerfect4th(short FAR* Value)
{A_Selection_Clicked_Routine(6);}
void CRelDlg::OnRelativeSelectedDiminished5th(short FAR* Value)
{A_Selection_Clicked_Routine(7);}
void CRelDlg::OnRelativeSelectedPerfect5th(short FAR* Value)
{A_Selection_Clicked_Routine(8);}
void CRelDlg::OnRelativeSelectedMinor6th(short FAR* Value)
{A_Selection_Clicked_Routine(9);}
void CRelDlg::OnRelativeSelectedMajor6th(short FAR* Value)
{A_Selection_Clicked_Routine(10);}
void CRelDlg::OnRelativeSelectedMinor7th(short FAR* Value)
{A_Selection_Clicked_Routine(11);}
void CRelDlg::OnRelativeSelectedMajor7th(short FAR* Value)
{A_Selection_Clicked_Routine(12);}
void CRelDlg::OnRelativeSelectedPerfect8th(short FAR* Value)
{A_Selection_Clicked_Routine(13);}
void CRelDlg::A_Selection_Clicked_Routine(int LocalNoteSwitch)
{
ResUnison = m_relative_selected_unison.GetCheck();
ResMinor2nd = m_relative_selected_minor_2nd.GetCheck();
ResMajor2nd = m_relative_selected_major_2nd.GetCheck();
ResMinor3rd = m_relative_selected_minor_3rd.GetCheck();
ResMajor3rd = m_relative_selected_major_3rd.GetCheck();
ResPerfect4th = m_relative_selected_perfect_4th.GetCheck();
ResDiminished5th = m_relative_selected_diminished_5th.GetCheck();
ResPerfect5th = m_relative_selected_perfect_5th.GetCheck();
ResMinor6th = m_relative_selected_minor_6th.GetCheck();
ResMajor6th = m_relative_selected_major_6th.GetCheck();
ResMinor7th = m_relative_selected_minor_7th.GetCheck();
ResMajor7th = m_relative_selected_major_7th.GetCheck();
ResPerfect8th = m_relative_selected_perfect_8th.GetCheck();
ResSelectedAll = m_relative_selected_all.GetCheck();
switch (LocalNoteSwitch)
{
case 1:
if (ResUnison)
{m_relative_selected_unison.SetTextColor(GreenColour);
m_relative_unison.SetTextColor(GreenColour);}
else
{m_relative_selected_unison.SetTextColor(RedColour);
m_relative_unison.SetTextColor(RedColour);
TurnOffAllSelected();};
break;
case 2:
if (ResMinor2nd)
{m_relative_selected_minor_2nd.SetTextColor(GreenColour);
m_relative_minor_2nd.SetTextColor(GreenColour);}
else
{m_relative_selected_minor_2nd.SetTextColor(RedColour);
m_relative_minor_2nd.SetTextColor(RedColour);
TurnOffAllSelected();};
break;
case 3:
if (ResMajor2nd)
{m_relative_selected_major_2nd.SetTextColor(GreenColour);
m_relative_major_2nd.SetTextColor(GreenColour);}
else
{m_relative_selected_major_2nd.SetTextColor(RedColour);
m_relative_major_2nd.SetTextColor(RedColour);
TurnOffAllSelected();};
break;
case 4:
if (ResMinor3rd)
{m_relative_selected_minor_3rd.SetTextColor(GreenColour);
m_relative_minor_3rd.SetTextColor(GreenColour);}
else
{m_relative_selected_minor_3rd.SetTextColor(RedColour);
m_relative_minor_3rd.SetTextColor(RedColour);
TurnOffAllSelected();};
break;
case 5:
if (ResMajor3rd)
{m_relative_selected_major_3rd.SetTextColor(GreenColour);
m_relative_major_3rd.SetTextColor(GreenColour);}
else
{m_relative_selected_major_3rd.SetTextColor(RedColour);
m_relative_major_3rd.SetTextColor(RedColour);
TurnOffAllSelected();};
break;
case 6:
if (ResPerfect4th)
{m_relative_selected_perfect_4th.SetTextColor(GreenColour);
m_relative_perfect_4th.SetTextColor(GreenColour);}
else
{m_relative_selected_perfect_4th.SetTextColor(RedColour);
m_relative_perfect_4th.SetTextColor(RedColour);
TurnOffAllSelected();};
break;
case 7:
if (ResDiminished5th)
{m_relative_selected_diminished_5th.SetTextColor(GreenColour);
m_relative_diminished_5th.SetTextColor(GreenColour);}
else
{m_relative_selected_diminished_5th.SetTextColor(RedColour);
m_relative_diminished_5th.SetTextColor(RedColour);
TurnOffAllSelected();};
break;
case 8:
if (ResPerfect5th)
{m_relative_selected_perfect_5th.SetTextColor(GreenColour);
m_relative_perfect_5th.SetTextColor(GreenColour);}
else
{m_relative_selected_perfect_5th.SetTextColor(RedColour);
m_relative_perfect_5th.SetTextColor(RedColour);
TurnOffAllSelected();};
break;
case 9:
if (ResMinor6th)
{m_relative_selected_minor_6th.SetTextColor(GreenColour);
m_relative_minor_6th.SetTextColor(GreenColour);}
else
{m_relative_selected_minor_6th.SetTextColor(RedColour);
m_relative_minor_6th.SetTextColor(RedColour);
TurnOffAllSelected();};
break;
case 10:
if (ResMajor6th)
{m_relative_selected_major_6th.SetTextColor(GreenColour);
m_relative_major_6th.SetTextColor(GreenColour);}
else
{m_relative_selected_major_6th.SetTextColor(RedColour);
m_relative_major_6th.SetTextColor(RedColour);
TurnOffAllSelected();};
break;
case 11:
if (ResMinor7th)
{m_relative_selected_minor_7th.SetTextColor(GreenColour);
m_relative_minor_7th.SetTextColor(GreenColour);}
else
{m_relative_selected_minor_7th.SetTextColor(RedColour);
m_relative_minor_7th.SetTextColor(RedColour);
TurnOffAllSelected();};
break;
case 12:
if (ResMajor7th)
{m_relative_selected_major_7th.SetTextColor(GreenColour);
m_relative_major_7th.SetTextColor(GreenColour);}
else
{m_relative_selected_major_7th.SetTextColor(RedColour);
m_relative_major_7th.SetTextColor(RedColour);
TurnOffAllSelected();};
break;
case 13:
if (ResPerfect8th)
{m_relative_selected_perfect_8th.SetTextColor(GreenColour);
m_relative_perfect_8th.SetTextColor(GreenColour);}
else
{m_relative_selected_perfect_8th.SetTextColor(RedColour);
m_relative_perfect_8th.SetTextColor(RedColour);
TurnOffAllSelected();};
break;
} // End of switch processing
strcpy(RelativePlayNoteStatus,"Play");
m_RelativePlayNotes.SetWindowText(RelativePlayNoteStatus);
// If any interval boxes are true, allow PlayNote button to be pushed
if (ResUnison | ResMinor2nd | ResMajor2nd | ResMinor3rd |
ResMajor3rd | ResPerfect4th | ResDiminished5th | ResPerfect5th |
ResMinor6th | ResMajor6th | ResMinor7th | ResMajor7th |
ResPerfect8th)
{GetDlgItem(IDC_RelativePlayNotes) ->EnableWindow(TRUE);}
else
{GetDlgItem(IDC_RelativePlayNotes) ->EnableWindow(FALSE);};
// If all check boxes are on, set the 'All' box to green, etc.
if (ResUnison & ResMinor2nd & ResMajor2nd & ResMinor3rd &
ResMajor3rd & ResPerfect4th & ResDiminished5th & ResPerfect5th &
ResMinor6th & ResMajor6th & ResMinor7th & ResMajor7th &
ResPerfect8th)
{
BypassSelectionAllRoutine = 1;
m_relative_selected_all.SetTextColor(GreenColour);
m_relative_selected_all.SetCheck(TRUE);
BypassSelectionAllRoutine = 0;
AllSelectionSwitch = 1;
}
else
{
BypassSelectionAllRoutine = 0;
m_relative_selected_all.SetTextColor(RedColour);
m_relative_selected_all.SetCheck(FALSE);
BypassSelectionAllRoutine = 1;
AllSelectionSwitch = 0;
};
}
void CRelDlg::OnRelativeUnison(short FAR* Value)
{A_Guess_Clicked_Routine(0);}
void CRelDlg::OnRelativeMinor2nd(short FAR* Value)
{A_Guess_Clicked_Routine(1);}
void CRelDlg::OnRelativeMajor2nd(short FAR* Value)
{A_Guess_Clicked_Routine(2);}
void CRelDlg::OnRelativeMinor3rd(short FAR* Value)
{A_Guess_Clicked_Routine(3);}
void CRelDlg::OnRelativeMajor3rd(short FAR* Value)
{A_Guess_Clicked_Routine(4);}
void CRelDlg::OnRelativePerfect4th(short FAR* Value)
{A_Guess_Clicked_Routine(5);}
void CRelDlg::OnRelativeDiminished5th(short FAR* Value)
{A_Guess_Clicked_Routine(6);}
void CRelDlg::OnRelativePerfect5th(short FAR* Value)
{A_Guess_Clicked_Routine(7);}
void CRelDlg::OnRelativeMinor6th(short FAR* Value)
{A_Guess_Clicked_Routine(8);}
void CRelDlg::OnRelativeMajor6th(short FAR* Value)
{A_Guess_Clicked_Routine(9);}
void CRelDlg::OnRelativeMinor7th(short FAR* Value)
{A_Guess_Clicked_Routine(10);}
void CRelDlg::OnRelativeMajor7th(short FAR* Value)
{A_Guess_Clicked_Routine(11);}
void CRelDlg::OnRelativePerfect8th(short FAR* Value)
{A_Guess_Clicked_Routine(12);}
//
// Following function is called when a user presses one of the
// enabled 'play' buttons
//
void CRelDlg::A_Guess_Clicked_Routine(int LocalNoteSwitch)
{
int RandomWork= 0;
//LocalNoteSwitch--;
if (OnlyResetingSwitch == 0)
{
UpdateData(TRUE);
// Create a variable for each check box
RandomWork = Random2nd - Random1st;
if (RandomWork < 0) // Only interested in a positive result
{RandomWork = RandomWork * -1;};
RelativeGuesses++;
RelativeNoteResults[RandomWork][0]++; // This increases the total for note played
strcpy(IntervalDescription,"Wrong, interval was ");
strncat(IntervalDescription,IntervalTable + (RandomWork)*15, 15);
strcat(IntervalDescription,"\nFirst note was ");
strcat(IntervalDescription,FirstNoteDescription);
strcat(IntervalDescription,"\nSecond note was ");
strcat(IntervalDescription,SecondNoteDescription);
if (RandomWork == LocalNoteSwitch)
{strcpy(IntervalDescription,"Correct");
RelativeCorrect++;
RelativeNoteResults[RandomWork][1]++;
};
RelativeNoteResults[RandomWork][LocalNoteSwitch + 2]++; // Increase total user guessed
m_relative_interval = IntervalDescription;
UpdateData(FALSE);
GetDlgItem(IDC_RELATIVE_INTERVAL) ->ShowWindow(SW_SHOW);
GetDlgItem(IDC_RelativePlayNotes) ->EnableWindow(TRUE);
strcpy(RelativePlayNoteStatus,"Play");
m_RelativePlayNotes.SetWindowText(RelativePlayNoteStatus);
// Disable all guess boxes until another note sequence is played
m_relative_unison.EnableWindow(FALSE);
m_relative_minor_2nd.EnableWindow(FALSE);
m_relative_major_2nd.EnableWindow(FALSE);
m_relative_minor_3rd.EnableWindow(FALSE);
m_relative_major_3rd.EnableWindow(FALSE);
m_relative_perfect_4th.EnableWindow(FALSE);
m_relative_diminished_5th.EnableWindow(FALSE);
m_relative_perfect_5th.EnableWindow(FALSE);
m_relative_minor_6th.EnableWindow(FALSE);
m_relative_major_6th.EnableWindow(FALSE);
m_relative_minor_7th.EnableWindow(FALSE);
m_relative_major_7th.EnableWindow(FALSE);
m_relative_perfect_8th.EnableWindow(FALSE);
// Make selection boxes available for ticking
EnableSelectionCheckBoxes();
}
}
void CRelDlg::OnGetOutOfRelative()
{
CDialog::OnOK();
}
void CRelDlg::ChangeRelativeNoteBoxes(int ChangeType)
{
GetDlgItem(IDC_RELATIVE_UNISON) ->EnableWindow(ChangeType);
GetDlgItem(IDC_RELATIVE_MINOR_2ND) ->EnableWindow(ChangeType);
GetDlgItem(IDC_RELATIVE_MAJOR_2ND) ->EnableWindow(ChangeType);
GetDlgItem(IDC_RELATIVE_MINOR_3RD) ->EnableWindow(ChangeType);
GetDlgItem(IDC_RELATIVE_MAJOR_3RD) ->EnableWindow(ChangeType);
GetDlgItem(IDC_RELATIVE_PERFECT_4TH) ->EnableWindow(ChangeType);
GetDlgItem(IDC_RELATIVE_DIMINISHED_5TH) ->EnableWindow(ChangeType);
GetDlgItem(IDC_RELATIVE_PERFECT_5TH) ->EnableWindow(ChangeType);
GetDlgItem(IDC_RELATIVE_MINOR_6TH) ->EnableWindow(ChangeType);
GetDlgItem(IDC_RELATIVE_MAJOR_6TH) ->EnableWindow(ChangeType);
GetDlgItem(IDC_RELATIVE_MINOR_7TH) ->EnableWindow(ChangeType);
GetDlgItem(IDC_RELATIVE_MAJOR_7TH) ->EnableWindow(ChangeType);
GetDlgItem(IDC_RELATIVE_PERFECT_8TH) ->EnableWindow(ChangeType);
GetDlgItem(IDC_RELATIVE_SELECTED_ALL) ->EnableWindow(ChangeType);
}
void CRelDlg::ChangeRelativeSelectedNoteBoxes(int ChangeType)
{
GetDlgItem(IDC_RELATIVE_SELECTED_UNISON) ->EnableWindow(ChangeType);
GetDlgItem(IDC_RELATIVE_SELECTED_MINOR_2ND) ->EnableWindow(ChangeType);
GetDlgItem(IDC_RELATIVE_SELECTED_MAJOR_2ND) ->EnableWindow(ChangeType);
GetDlgItem(IDC_RELATIVE_SELECTED_MINOR_3RD) ->EnableWindow(ChangeType);
GetDlgItem(IDC_RELATIVE_SELECTED_MAJOR_3RD) ->EnableWindow(ChangeType);
GetDlgItem(IDC_RELATIVE_SELECTED_PERFECT_4TH) ->EnableWindow(ChangeType);
GetDlgItem(IDC_RELATIVE_SELECTED_DIMINISHED_5TH) ->EnableWindow(ChangeType);
GetDlgItem(IDC_RELATIVE_SELECTED_PERFECT_5TH) ->EnableWindow(ChangeType);
GetDlgItem(IDC_RELATIVE_SELECTED_MINOR_6TH) ->EnableWindow(ChangeType);
GetDlgItem(IDC_RELATIVE_SELECTED_MAJOR_6TH) ->EnableWindow(ChangeType);
GetDlgItem(IDC_RELATIVE_SELECTED_MINOR_7TH) ->EnableWindow(ChangeType);
GetDlgItem(IDC_RELATIVE_SELECTED_MAJOR_7TH) ->EnableWindow(ChangeType);
GetDlgItem(IDC_RELATIVE_SELECTED_PERFECT_8TH) ->EnableWindow(ChangeType);
GetDlgItem(IDC_RELATIVE_SELECTED_ALL) ->EnableWindow(ChangeType);
}
void CRelDlg::TurnOffAllSelected()
{
// m_relative_selected_all.SetForeColor(BlackColour);
OnlyResetingSwitch = 1;
// Because the following turning off of the "all" checkbox causes the routine
// to be executed, we use a switch to effectively bypass the routine
BypassSelectionAllRoutine = 1;
m_relative_selected_all.SetCheck(FALSE); // Turn tick box off
BypassSelectionAllRoutine = 0;
OnlyResetingSwitch = 0;
AllSelectionSwitch = 0; // Indicate "all" is off
}
void CRelDlg::EnableGuessedCheckBoxes()
{
if (ResUnison)
{m_relative_unison.EnableWindow(TRUE);};
if (ResMinor2nd)
{m_relative_minor_2nd.EnableWindow(TRUE);};
if (ResMajor2nd)
{m_relative_major_2nd.EnableWindow(TRUE);};
if (ResMinor3rd)
{m_relative_minor_3rd.EnableWindow(TRUE);};
if (ResMajor3rd)
{m_relative_major_3rd.EnableWindow(TRUE);};
if (ResPerfect4th)
{m_relative_perfect_4th.EnableWindow(TRUE);};
if (ResDiminished5th)
{m_relative_diminished_5th.EnableWindow(TRUE);};
if (ResPerfect5th)
{m_relative_perfect_5th.EnableWindow(TRUE);};
if (ResMinor6th)
{m_relative_minor_6th.EnableWindow(TRUE);};
if (ResMajor6th)
{m_relative_major_6th.EnableWindow(TRUE);};
if (ResMinor7th)
{m_relative_minor_7th.EnableWindow(TRUE);};
if (ResMajor7th)
{m_relative_major_7th.EnableWindow(TRUE);};
if (ResPerfect8th)
{m_relative_perfect_8th.EnableWindow(TRUE);};
}
void CRelDlg::EnableSelectionCheckBoxes()
{
m_relative_selected_unison.EnableWindow(TRUE);
m_relative_selected_minor_2nd.EnableWindow(TRUE);
m_relative_selected_major_2nd.EnableWindow(TRUE);
m_relative_selected_minor_3rd.EnableWindow(TRUE);
m_relative_selected_major_3rd.EnableWindow(TRUE);
m_relative_selected_perfect_4th.EnableWindow(TRUE);
m_relative_selected_diminished_5th.EnableWindow(TRUE);
m_relative_selected_perfect_5th.EnableWindow(TRUE);
m_relative_selected_minor_6th.EnableWindow(TRUE);
m_relative_selected_major_6th.EnableWindow(TRUE);
m_relative_selected_minor_7th.EnableWindow(TRUE);
m_relative_selected_major_7th.EnableWindow(TRUE);
m_relative_selected_perfect_8th.EnableWindow(TRUE);
m_relative_selected_all.EnableWindow(TRUE);
if (ResUnison)
{m_relative_selected_unison.SetTextColor(GreenColour);}
if (ResMinor2nd)
{m_relative_selected_minor_2nd.SetTextColor(GreenColour);}
if (ResMajor2nd)
{m_relative_selected_major_2nd.SetTextColor(GreenColour);}
if (ResMinor3rd)
{m_relative_selected_minor_3rd.SetTextColor(GreenColour);}
if (ResMajor3rd)
{m_relative_selected_major_3rd.SetTextColor(GreenColour);}
if (ResPerfect4th)
{m_relative_selected_perfect_4th.SetTextColor(GreenColour);}
if (ResDiminished5th)
{m_relative_selected_diminished_5th.SetTextColor(GreenColour);}
if (ResPerfect5th)
{m_relative_selected_perfect_5th.SetTextColor(GreenColour);}
if (ResMinor6th)
{m_relative_selected_minor_6th.SetTextColor(GreenColour);}
if (ResMajor6th)
{m_relative_selected_major_6th.SetTextColor(GreenColour);}
if (ResMinor7th)
{m_relative_selected_minor_7th.SetTextColor(GreenColour);}
if (ResMajor7th)
{m_relative_selected_major_7th.SetTextColor(GreenColour);}
if (ResPerfect8th)
{m_relative_selected_perfect_8th.SetTextColor(GreenColour);}
if (ResSelectedAll)
{m_relative_selected_all.SetTextColor(GreenColour);}
// UpdateData(FALSE);
}
void CRelDlg::KillGuessedCheckBoxes()
{
m_relative_unison.EnableWindow(FALSE);
m_relative_minor_2nd.EnableWindow(FALSE);
m_relative_major_2nd.EnableWindow(FALSE);
m_relative_minor_3rd.EnableWindow(FALSE);
m_relative_major_3rd.EnableWindow(FALSE);
m_relative_perfect_4th.EnableWindow(FALSE);
m_relative_diminished_5th.EnableWindow(FALSE);
m_relative_perfect_5th.EnableWindow(FALSE);
m_relative_minor_6th.EnableWindow(FALSE);
m_relative_major_6th.EnableWindow(FALSE);
m_relative_minor_7th.EnableWindow(FALSE);
m_relative_major_7th.EnableWindow(FALSE);
m_relative_perfect_8th.EnableWindow(FALSE);
}
void CRelDlg::OnTimer(UINT nIDEvent)
{
RelativeTimerWaitSwitch = 1;
CDialog::OnTimer(nIDEvent);
}
void CRelDlg::DoRelativeWait(int WaitTimeInMilliseconds)
{
RelativeTimerWaitSwitch = 0;
RelativeTimerKey = SetTimer(1, WaitTimeInMilliseconds, NULL);
ASSERT(RelativeTimerKey !=0);
// Wait until the timer changes RelativeTimerWaitSwitch to non zero.
// The PeekMessage will allow the message through
while (RelativeTimerWaitSwitch == 0)
{if(::PeekMessage(&RelativeMessage, NULL, 0, 0, PM_REMOVE))
{
::TranslateMessage(&RelativeMessage);
::DispatchMessage(&RelativeMessage);
}
};
KillTimer(RelativeTimerKey);
//WaitTypeSwitch = 1; // Default
}
// The following function is really only for debugging
void CRelDlg::OnRButtonDown(UINT nFlags, CPoint point)
{
// Display the pop up menu seection on right mouse button down
CRect rect;
CPoint TL;
int x; int y;
GetWindowRect(&rect);
TL = rect.TopLeft();
RelativeX = TL.x; RelativeY = TL.y;
x = point.x + RelativeX + 20; y = point.y + RelativeY + 17;
CPitchDlg PopupTime;
PopupTime.ProcessPopupMenu(x,y);
CDialog::OnRButtonDown(nFlags, point);
}
void CRelDlg::OnRButtonUp(UINT nFlags, CPoint point)
{
m_relative_interval = "";
UpdateData(FALSE);
CDialog::OnRButtonUp(nFlags, point);
}
void CRelDlg::OnUp()
{
UpDownSwitch = 0;
m_up = 0;
UpdateData(FALSE);
}
void CRelDlg::OnDown()
{
UpDownSwitch = 1;
m_up = 1;
UpdateData(FALSE);
}
void CRelDlg::OnUpdown()
{
UpDownSwitch = 2;
m_up = 2;
UpdateData(FALSE);
}
void CRelDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
int iCurrent;
// PScrollBar is a pointer to the control being updated
// pSB_Low and pSB_High are the pointers to the two range scroll bars
CScrollBar* pSB_Low = (CScrollBar*) GetDlgItem(IDC_RELATIVE_LOW_RANGE);
CScrollBar* pSB_High = (CScrollBar*) GetDlgItem(IDC_RELATIVE_HIGH_RANGE);
CScrollBar* pSB_Speed = (CScrollBar*) GetDlgItem(IDC_RELATIVE_SPEED);
// Get the current position
iCurrent = pScrollBar->GetScrollPos();
if (pScrollBar == (CScrollBar*) pSB_Speed)
{goto ProcessSpeedScroll;};
switch (nSBCode)
{
case SB_THUMBPOSITION:
pScrollBar->SetScrollPos (nPos);
break;
case SB_LINERIGHT:
// Increase current position by 1 (if possible)
iCurrent = iCurrent + 1;
if ( iCurrent >= m_relative_Scroll_Max )
iCurrent = m_relative_Scroll_Max;
// Set scroll bar to its new position.
pScrollBar->SetScrollPos ( iCurrent );
break;
case SB_LINELEFT:
// Decrease current position by 1 (if possible)
iCurrent = iCurrent - 1;
if ( iCurrent <= m_relative_Scroll_Min )
iCurrent = m_relative_Scroll_Min;
// Set scroll bar to its new position.
pScrollBar->SetScrollPos ( iCurrent );
break;
case SB_PAGERIGHT:
// Increase scroll bar by an octave(if possible).
iCurrent = iCurrent + 12;
if ( iCurrent >= m_relative_Scroll_Max )
iCurrent = m_relative_Scroll_Max;
// Set scroll bar to its new position.
pScrollBar->SetScrollPos ( iCurrent );
break;
case SB_PAGELEFT:
// Decrease scroll bar by an octave(if possible).
iCurrent = iCurrent - 12;
if ( iCurrent <= m_relative_Scroll_Min )
iCurrent = m_relative_Scroll_Min;
// Set scroll bar to its new position.
pScrollBar->SetScrollPos ( iCurrent );
break;
case SB_THUMBTRACK:
// Set scroll bar to its new position.
pScrollBar->SetScrollPos ( nPos );
break;
}
// Update the caption of the label.
if (pScrollBar == (CScrollBar*) pSB_Low)
{ strncpy(NoteDescription,NoteTable1 + (iCurrent-1)*3, 3);
m_relative_low_note = NoteDescription;
LowPianoNote = iCurrent; }
else
{ strncpy(NoteDescription,NoteTable1 + (iCurrent-1)*3, 3);
m_relative_high_note = NoteDescription;
HighPianoNote = iCurrent; } ;
UpdateData(FALSE);
goto OnHScrollExit ;
ProcessSpeedScroll:
switch (nSBCode)
{
case SB_THUMBPOSITION:
pScrollBar->SetScrollPos (nPos);
break;
case SB_LINERIGHT:
// Increase current position by 1 (if possible)
iCurrent = iCurrent + 1;
if ( iCurrent >= m_relative_Speed_Scroll_Max )
iCurrent = m_relative_Speed_Scroll_Max;
// Set scroll bar to its new position.
pScrollBar->SetScrollPos ( iCurrent );
break;
case SB_LINELEFT:
// Decrease current position by 1 (if possible)
iCurrent = iCurrent - 1;
if ( iCurrent <= m_relative_Speed_Scroll_Min )
iCurrent = m_relative_Speed_Scroll_Min;
// Set scroll bar to its new position.
pScrollBar->SetScrollPos ( iCurrent );
break;
case SB_PAGERIGHT:
iCurrent = iCurrent + 10;
if ( iCurrent >= m_relative_Speed_Scroll_Max )
iCurrent = m_relative_Speed_Scroll_Max;
// Set scroll bar to its new position.
pScrollBar->SetScrollPos ( iCurrent );
break;
case SB_PAGELEFT:
iCurrent = iCurrent - 10;
if ( iCurrent <= m_relative_Speed_Scroll_Min )
iCurrent = m_relative_Speed_Scroll_Min;
// Set scroll bar to its new position.
pScrollBar->SetScrollPos ( iCurrent );
break;
case SB_THUMBTRACK:
// Set scroll bar to its new position.
pScrollBar->SetScrollPos ( nPos );
break;
}
RelativeWaitLength = iCurrent*50;
OnHScrollExit:
CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}
void CRelDlg::OnDestroy()
{
CDialog::OnDestroy();
// Grab the screen location at end for the registry
CRect rect;
GetWindowRect(&rect);
CPoint TL, BR;
TL = rect.TopLeft(); BR = rect.BottomRight();
RelativeX = TL.x; RelativeY = TL.y;
rect.NormalizeRect();
RelativeWidth = rect.Width(); RelativeHeight = rect.Height();
}
long CRelDlg::PlayRelativeNote(int NoteNumber1, int NoteNumber2)
{
CPitchDlg abc;
long NoteError = 0;
NoteNumber1--;
if (NoteNumber2 > 0) {NoteNumber2--;}
SecondChannel = CurrentChannel+1;
bStatus = MIDI_PROGRAM_CHANGE;
bChannel = CurrentChannel;
bData1 = InstrumentNumber;
bData2 = '\x00'; // Not used
abc.SendShortMessage();
bStatus = MIDI_NOTE_ON;
bChannel = CurrentChannel;
bData1 = NoteNumber1;
bData2 = '\x7f'; // Volume
abc.SendShortMessage();
// If a second not sent, get it off now
if (NoteNumber2 > 0)
{
bStatus = MIDI_PROGRAM_CHANGE;
bChannel = CurrentChannel;
bData1 = InstrumentNumber;
bData2 = '\x00'; // Not used
abc.SendShortMessage();
bStatus = MIDI_NOTE_ON;
bChannel = CurrentChannel;
bData1 = NoteNumber2;
bData2 = '\x7f'; // Volume
abc.SendShortMessage();
}
// Wait for timeout
DoRelativeWait(NoteWaitTimeLength);
bStatus = MIDI_NOTE_OFF;
bChannel = CurrentChannel;
bData1 = NoteNumber1;
bData2 = '\x00'; // Volume
abc.SendShortMessage();
// If a second note we must also stop it.
if (NoteNumber2 > 0)
{
bStatus = MIDI_NOTE_OFF;
bChannel = CurrentChannel;
bData1 = NoteNumber2;
bData2 = '\x00'; // Volume
abc.SendShortMessage();
}
return (NoteError);
}
void CRelDlg::OnRelativeButtonMove(UINT nFlags, CPoint point)
{
if (myHWND == m_RelativeScore.GetSafeHwnd() )
{
itoa(RelativeCorrect,charresultR,10);
strcpy(score_workR,charresultR);
strcat(score_workR," of ");
itoa(RelativeGuesses,charresultR,10);
strcat(score_workR,charresultR);
m_RelativeScore.SetWindowText(score_workR);
m_RelativeScore.SetTextColor(PurpleColour);
UpdateData(FALSE);
}
UpdateData(FALSE);
CDialog::OnMouseMove(nFlags, point);
}
void CRelDlg::OnRelativeButtonLeave(WPARAM, LPARAM)
{
if (myHWND == m_RelativeScore.GetSafeHwnd() )
{
m_RelativeScore.SetWindowText("Score");
UpdateData(FALSE);
}
}
void CRelDlg::OnRelativeTitle()
{
// TODO: Add your control notification handler code here
}