1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
|
//--------------------------------------------------------------------------------------
// LenMus Phonascus: The teacher of music
// Copyright (c) 2002-2008 Cecilio Salmeron
//
// This program is free software; you can redistribute it and/or modify it under the
// terms of the GNU General Public License as published by the Free Software Foundation,
// either version 3 of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
// PARTICULAR PURPOSE. See the GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License along with this
// program. If not, see <http://www.gnu.org/licenses/>.
//
// For any comment, suggestion or feature request, please contact the manager of
// the project at cecilios@users.sourceforge.net
//
//-------------------------------------------------------------------------------------
#ifndef __LM_EXERCISECTROL_H__ //to avoid nested includes
#define __LM_EXERCISECTROL_H__
#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
#pragma interface "ExerciseCtrol.cpp"
#endif
// For compilers that support precompilation, includes "wx/wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#ifndef WX_PRECOMP
#include "wx/wx.h"
#endif
#include "../score/Score.h"
#include "Constrains.h"
#include "ScoreAuxCtrol.h"
#include "UrlAuxCtrol.h"
#include "CountersCtrol.h"
//--------------------------------------------------------------------------------
// An abstract class for any kind of Ctrol (wxHtmlWidgetsCell) included in an eBook.
// Just define the interface
//--------------------------------------------------------------------------------
class lmEBookCtrol : public wxWindow
{
DECLARE_DYNAMIC_CLASS(lmEBookCtrol)
public:
// constructor and destructor
lmEBookCtrol(wxWindow* parent, wxWindowID id,
lmEBookCtrolOptions* pOptions,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize, int style = 0);
virtual ~lmEBookCtrol();
// virtual pure event handlers to be implemented by derived classes
virtual void OnDebugShowSourceScore(wxCommandEvent& event)=0;
virtual void OnDebugDumpScore(wxCommandEvent& event)=0;
virtual void OnDebugShowMidiEvents(wxCommandEvent& event)=0;
// event handlers. No need to implement in derived classes
virtual void OnSize(wxSizeEvent& event);
virtual void OnPlay(wxCommandEvent& event);
virtual void OnSettingsButton(wxCommandEvent& event);
virtual void OnGoBackButton(wxCommandEvent& event);
protected:
//IDs for controls
enum {
ID_LINK_SEE_SOURCE = 3000,
ID_LINK_DUMP,
ID_LINK_MIDI_EVENTS,
ID_LINK_PLAY,
ID_LINK_SETTINGS,
ID_LINK_GO_BACK
};
//virtual pure methods to be implemented by derived classes
virtual void InitializeStrings()=0;
virtual wxDialog* GetSettingsDlg()=0;
virtual void Play()=0;
virtual void StopSounds()=0;
virtual void OnSettingsChanged()=0;
//methods invoked from derived classes
virtual void CreateControls()=0;
void SetButtons(wxButton* pButton[], int nNumButtons, int nIdFirstButton);
// member variables
lmEBookCtrolOptions* m_pOptions; //options for the exercise
lmUrlAuxCtrol* m_pPlayButton; // "play" button
bool m_fControlsCreated;
double m_rScale; // Current scaling factor
private:
void DoStopSounds();
DECLARE_EVENT_TABLE()
};
//--------------------------------------------------------------------------------
// An abstract class for any kind of exercise included in an eBook.
//--------------------------------------------------------------------------------
class lmExerciseCtrol : public lmEBookCtrol
{
DECLARE_DYNAMIC_CLASS(lmExerciseCtrol)
public:
// constructor and destructor
lmExerciseCtrol(wxWindow* parent, wxWindowID id,
lmExerciseOptions* pConstrains, wxSize nDisplaySize,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize, int style = 0);
virtual ~lmExerciseCtrol();
// event handlers. No need to implement in derived classes
virtual void OnRespButton(wxCommandEvent& event);
virtual void OnNewProblem(wxCommandEvent& event);
virtual void OnDisplaySolution(wxCommandEvent& event);
protected:
//IDs for controls
enum {
ID_LINK_SOLUTION = 3006,
ID_LINK_NEW_PROBLEM,
};
//implementation of virtual pure methods
void OnSettingsChanged() { ReconfigureButtons(); }
//virtual pure methods to be implemented by derived classes
virtual void InitializeStrings()=0;
virtual void CreateAnswerButtons(int nHeight, int nSpacing, wxFont& font)=0;
virtual void ReconfigureButtons()=0;
virtual wxString SetNewProblem()=0;
virtual wxDialog* GetSettingsDlg()=0;
virtual wxWindow* CreateDisplayCtrol()=0;
virtual void Play()=0;
virtual void PlaySpecificSound(int nButton)=0;
virtual void DisplaySolution()=0;
virtual void DisplayProblem()=0;
virtual void DisplayMessage(wxString& sMsg, bool fClearDisplay)=0;
virtual void DeleteScores() {} //should be virtual pure but the linker complains !!!
virtual void StopSounds() {} //should be virtual pure but the linker complains !!!
//methods that, normally, it is not necessary to implement
virtual void SetButtonColor(int i, wxColour& color);
virtual void EnableButtons(bool fEnable);
virtual void NewProblem();
virtual void ResetExercise();
//methods invoked from derived classes
virtual void CreateControls();
void SetButtons(wxButton* pButton[], int nNumButtons, int nIdFirstButton);
// member variables
wxWindow* m_pDisplayCtrol; //TextCtrl or ScoreAuxCtrol
lmCountersCtrol* m_pCounters;
wxBoxSizer* m_pMainSizer;
wxFlexGridSizer* m_pKeyboardSizer;
lmExerciseOptions* m_pConstrains; //constraints for the exercise
bool m_fQuestionAsked; //question asked but not yet answered
int m_nRespIndex; //index to the button with the right answer
wxString m_sAnswer; //string with the right answer
lmUrlAuxCtrol* m_pShowSolution; // "show solution" button
int m_nNumButtons; //num answer buttons
wxButton** m_pAnswerButtons; //buttons for the answers
int m_nIdFirstButton; //ID of first button; the others in sequence
wxSize m_nDisplaySize; // DisplayCtrol size (pixels at 1:1)
private:
void DoStopSounds();
void DoDisplaySolution();
DECLARE_EVENT_TABLE()
};
//--------------------------------------------------------------------------------
// Abstract class to create exercise to compare scores/sounds
//--------------------------------------------------------------------------------
class lmCompareCtrol : public lmExerciseCtrol
{
DECLARE_DYNAMIC_CLASS(lmCompareCtrol)
public:
// constructor and destructor
lmCompareCtrol(wxWindow* parent, wxWindowID id,
lmExerciseOptions* pConstrains, wxSize nDisplaySize,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize, int style = 0);
virtual ~lmCompareCtrol();
////virtual pure methods to be implemented by derived classes
//virtual void OnDebugShowSourceScore(wxCommandEvent& event)=0;
//virtual void OnDebugDumpScore(wxCommandEvent& event)=0;
//virtual void OnDebugShowMidiEvents(wxCommandEvent& event)=0;
enum {
m_NUM_ROWS = 1,
m_NUM_COLS = 3,
m_NUM_BUTTONS = 3,
m_ID_BUTTON = 3010,
};
protected:
//virtual pure methods to be implemented by derived classes
virtual wxString SetNewProblem()=0;
virtual wxDialog* GetSettingsDlg()=0;
virtual wxWindow* CreateDisplayCtrol()=0;
virtual void Play()=0;
virtual void PlaySpecificSound(int nButton)=0;
virtual void DisplaySolution()=0;
virtual void DisplayProblem()=0;
virtual void DisplayMessage(wxString& sMsg, bool fClearDisplay)=0;
virtual void DeleteScores() {} //should be virtual pure but the linker complains !!!
virtual void StopSounds() {} //should be virtual pure but the linker complains !!!
//virtual methods implemented in this class
void CreateAnswerButtons(int nHeight, int nSpacing, wxFont& font);
virtual void InitializeStrings();
void ReconfigureButtons() {}
protected:
// member variables
wxButton* m_pAnswerButton[m_NUM_BUTTONS]; //buttons for the answers
DECLARE_EVENT_TABLE()
};
//--------------------------------------------------------------------------------
// Abstract class to create exercise to compare two scores
//--------------------------------------------------------------------------------
class lmCompareScoresCtrol : public lmCompareCtrol
{
DECLARE_DYNAMIC_CLASS(lmCompareScoresCtrol)
public:
// constructor and destructor
lmCompareScoresCtrol(wxWindow* parent, wxWindowID id,
lmExerciseOptions* pConstrains, wxSize nDisplaySize,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize, int style = 0);
virtual ~lmCompareScoresCtrol();
// event handlers
void OnEndOfPlay(lmEndOfPlayEvent& WXUNUSED(event));
void OnTimerEvent(wxTimerEvent& WXUNUSED(event));
//implementation of virtual event handlers
virtual void OnDebugShowSourceScore(wxCommandEvent& event);
virtual void OnDebugDumpScore(wxCommandEvent& event);
virtual void OnDebugShowMidiEvents(wxCommandEvent& event);
protected:
//virtual pure methods to be implemented by derived classes
virtual wxString SetNewProblem()=0;
virtual wxDialog* GetSettingsDlg()=0;
//implementation of some virtual methods
void Play();
void PlaySpecificSound(int nButton) {}
void DisplaySolution();
void DisplayProblem();
void DeleteScores();
void StopSounds();
wxWindow* CreateDisplayCtrol();
void DisplayMessage(wxString& sMsg, bool fClearDisplay);
protected:
// member variables
lmScore* m_pScore[2]; //the two problem scores
int m_nNowPlaying; //score being played (0, 1)
wxTimer m_oPauseTimer; //timer to do a pause between the two scores
lmScore* m_pSolutionScore; //solution score
int m_nPlayMM; //metronome setting to play the scores
bool m_fPlaying; //currently playing the score
private:
void PlayScore(int nIntv);
DECLARE_EVENT_TABLE()
};
//--------------------------------------------------------------------------------
// Abstract class to create exercises with one problem score
//--------------------------------------------------------------------------------
class lmOneScoreCtrol : public lmExerciseCtrol //lmExerciseCtrol
{
DECLARE_DYNAMIC_CLASS(lmOneScoreCtrol)
public:
// constructor and destructor
lmOneScoreCtrol(wxWindow* parent, wxWindowID id,
lmExerciseOptions* pConstrains, wxSize nDisplaySize,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize, int style = 0);
virtual ~lmOneScoreCtrol();
//event handlers
void OnEndOfPlay(lmEndOfPlayEvent& WXUNUSED(event));
//implementation of virtual event handlers
virtual void OnDebugShowSourceScore(wxCommandEvent& event);
virtual void OnDebugDumpScore(wxCommandEvent& event);
virtual void OnDebugShowMidiEvents(wxCommandEvent& event);
protected:
//virtual pure methods from parent class to be implemented by derived classes
virtual wxString SetNewProblem() {return _T(""); } //should be virtual pure but the linker doesn't do its job properly !!!
virtual wxDialog* GetSettingsDlg() {return NULL; } //should be virtual pure but the linker doesn't do its job properly !!!
virtual void CreateAnswerButtons(int nHeight, int nSpacing, wxFont& font) {} //should be virtual pure but the linker doesn't do its job properly !!!
virtual void InitializeStrings() {} //should be virtual pure but the linker doesn't do its job properly !!!
virtual void ReconfigureButtons() {} //should be virtual pure but the linker doesn't do its job properly !!!
//virtual pure methods defined in this class
virtual void PrepareAuxScore(int nButton)=0;
//implementation of some virtual methods
void Play();
void PlaySpecificSound(int nButton);
void DisplaySolution();
void DisplayProblem();
void DeleteScores();
void StopSounds();
wxWindow* CreateDisplayCtrol();
void DisplayMessage(wxString& sMsg, bool fClearDisplay);
// member variables
lmScore* m_pProblemScore; //score with the problem
lmScore* m_pSolutionScore; //if not NULL, score with the solution. If NULL
// problem score will be used as solution score
lmScore* m_pAuxScore; //score to play user selected buttons
int m_nPlayMM; //metronome setting to play scores
bool m_fPlaying; //currently playing the score
DECLARE_EVENT_TABLE()
};
//--------------------------------------------------------------------------------
// Abstract class to create exercises to compare two Midi pitches
//--------------------------------------------------------------------------------
class lmCompareMidiCtrol : public lmCompareCtrol
{
DECLARE_DYNAMIC_CLASS(lmCompareMidiCtrol)
public:
// constructor and destructor
lmCompareMidiCtrol(wxWindow* parent, wxWindowID id,
lmExerciseOptions* pConstrains, wxSize nDisplaySize,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize, int style = 0);
virtual ~lmCompareMidiCtrol();
// event handlers
void OnTimerEvent(wxTimerEvent& WXUNUSED(event));
//implementation of virtual event handlers
virtual void OnDebugShowSourceScore(wxCommandEvent& event) {}
virtual void OnDebugDumpScore(wxCommandEvent& event) {}
virtual void OnDebugShowMidiEvents(wxCommandEvent& event) {}
protected:
//virtual pure methods to be implemented by derived classes
virtual wxString SetNewProblem()=0;
virtual wxDialog* GetSettingsDlg()=0;
//implementation of some virtual methods
virtual void Play();
void PlaySpecificSound(int nButton) {}
void DisplaySolution();
void DisplayProblem();
void DeleteScores() {}
void StopSounds();
wxWindow* CreateDisplayCtrol();
void DisplayMessage(wxString& sMsg, bool fClearDisplay);
protected:
void PlaySound(int iSound);
// member variables
lmMPitch m_mpPitch[2];
int m_nChannel[2];
int m_nInstr[2];
long m_nTimeIntval[2]; //interval between first and second pitch
bool m_fStopPrev; //stop previous pitch when sounding the next pitch
wxTimer m_oTimer; //timer to control sounds' duration
int m_nNowPlaying; //pitch number being played or -1
DECLARE_EVENT_TABLE()
};
#endif // __LM_EXERCISECTROL_H__
|