1
// RCS-ID: $Id: NoteRest.h,v 1.4 2006/02/23 19:23:54 cecilios Exp $
2
//--------------------------------------------------------------------------------------
3
// LenMus Phonascus: The teacher of music
4
// Copyright (c) 2002-2006 Cecilio Salmeron
6
// This program is free software; you can redistribute it and/or modify it under the
7
// terms of the GNU General Public License as published by the Free Software Foundation;
8
// either version 2 of the License, or (at your option) any later version.
10
// This program is distributed in the hope that it will be useful, but WITHOUT ANY
11
// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
12
// PARTICULAR PURPOSE. See the GNU General Public License for more details.
14
// You should have received a copy of the GNU General Public License along with this
15
// program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street,
16
// Fifth Floor, Boston, MA 02110-1301, USA.
18
// For any comment, suggestion or feature request, please contact the manager of
19
// the project at cecilios@users.sourceforge.net
21
//-------------------------------------------------------------------------------------
23
@brief Header file for class lmNoteRest
27
//-------------------------------------------------------------------------------------------
28
//Este programa maneja tres tipos de alturas:
29
// AltDiatonica: Altura diat�nica. Se refiere al nombre de la nota, sin tener en cuenta las
32
// 1 - C0 - Do2 de la subcontraoctava (16,35 Hz)
33
// 8 - C1 - Do1 de la contraoctava
34
// 15 - C2 - Do de la gran octava
35
// 22 - C3 - do de la peque�a octava
36
// 29 - C4 - do1 de la octava primera (la1 = 440Hz)
37
// 36 - C5 - do2 de la octava segunda
38
// 43 - C6 - do3 de la octava tercera
39
// 50 - C7 - do4 de la octava cuarta
40
// 57 - C8 - do5 de la octava quinta (4.186 Hz)
43
// AlturaRel: Altura relativa. Igual que la absoluta pero referida a la primera l�nea del
44
// pentagrama correspondiente a la clave en que se dibuja la partitura:
45
// 0 - una linea inferior (Do en clave de Sol, Mi en clave de Fa4)
46
// 1 - en espacio debajo de primera l�nea (Re en clave de Sol)
47
// 2 - en primera l�nea (Mi en clave de Sol)
48
// 3 - en primer espacio
49
// 4 - en segunda l�nea
50
// 5 - en segundo espacio
53
// AlturaMIDI: Altura crom�trica. Es la nota MIDI equivalente, incluyendo las alteraciones que hubiera.
54
// Es un dato derivado que se obtiene cuando hace falta
55
//-------------------------------------------------------------------------------------------
56
//THINK: -----------------------------------------------------------------------------------
57
//Pregunta: �No deber�a existir un constructor en lmNoteRest capaz de crear una nota a partir del fuente?
58
//Resp: Ning�n PentObj deben crearse fuera de un pentagrama y luego agregarse a �l.
59
//Pregunta: �Quiz�, entonces, una funcion en CStaff que admita un fuente? �Hay algo as� para
60
// otros tipos de PentObjs?
61
//Resp: Si; ahora mismo existen algunas. Todos los restantes PentObjs
62
// se crean a partir de par�metros, no de un fuente.
63
//Pregunta: �Deben mantenerse o eliminarse?
64
//Resp: No veo razones por las que una funcion de creacion en CStaff no pueda admitir ambos
65
// tipos de argumentos: un fuente o sus par�metros ya procesados. El �nico argumento es que
66
// si admite un fuente, el an�lisis del fuente no debe duplicarse, sino que debe estar
67
// centralizado en algun sitio, quiza en MParseFile. Ello implica que la esta funci�n de
68
// analisis tiene que devolver par�metros, con lo que terminamos en que la creaci�n se
69
// hace, al final, a partir de sus par�metros no de su fuente. Sin embargo, puede dar
71
//Conclusi�n: Pueden existir funciones de creaci�n a partir de los fuentes, pero siempre
72
// son auxiliares ya que tienen que tener la
73
// restricci�n de que, internamente, llamen a la funci�n de an�lisis y, tras ella, a la
74
// de creaci�n por par�metros.
75
//Problema: La funci�n de an�lisis de MParse trabaja con una estructura de CNodos no con el
76
// fuente plano. Realizar otra para an�lisis del fuente plano duplicar�a el trabajo s�lo
77
// con el objeto de no llamar internamente con par�mtros sino con fuente plano
78
//Conclusi�n final: Se rechaza la creaci�n directa a partir de fuente. Puede hacerse s�lo para
79
// encapsular la llamada a la funci�n de an�lisis
80
//---------------------------------------------------------------------------------------------
86
#ifndef __NOTEREST_H__ //to avoid nested includes
87
#define __NOTEREST_H__
89
#define DEFINE_REST true
90
#define DEFINE_NOTE false
92
// struct BeamInfo represents raw info about this note beaming. It is the same information
93
// present on a <beam> MusicXML tag.
101
class lmNoteRest: public lmCompositeObj
105
lmNoteRest(lmVStaff* pVStaff, bool IsRest, ENoteType nNoteType, float rDuration,
106
bool fDotted, bool fDoubleDotted, wxInt32 nStaff);
107
virtual ~lmNoteRest();
109
virtual void DrawObject(bool fMeasuring, lmPaper* pPaper, wxColour colorC) = 0;
110
virtual wxBitmap* GetBitmap(double rScale) = 0;
111
virtual wxString Dump() = 0;
113
bool IsRest() { return m_fIsRest; }
114
virtual bool IsInChord() = 0;
116
//implementation of virtual methods of base class lmCompositeObj
117
virtual lmScoreObj* FindSelectableObject(wxPoint& pt)=0;
119
// methods related to note/rest positioning information
120
lmMicrons GetStaffOffset() { return m_pVStaff->GetStaffOffset(m_nStaffNum); }
122
//methods related to associated AuxObjs management
123
void AddFermata(bool fOverNote = true);
124
void AddLyric(lmLyric* pLyric);
126
//methods related to duration
127
float GetDuration() { return m_rDuration; }
129
// methods related to beams
130
void CreateBeam(bool fBeamed, lmTBeamInfo BeamInfo[]);
131
bool IsBeamed() { return m_fBeamed; }
132
EBeamType GetBeamType(int level) { return m_BeamInfo[level].Type; }
133
void SetBeamType(int level, EBeamType type) { m_BeamInfo[level].Type = type; }
135
//methods related to tuplets
136
void SetTupletBracket(lmTupletBracket* pTB) { m_pTupletBracket = pTB; }
138
//methods related to sound
139
void AddMidiEvents(lmSoundManager* pSM, float rMeasureStartTime, int nChannel,
143
ENoteType GetNoteType() { return m_nNoteType; }
147
bool ParseTipoNota(wxString& sData);
148
wxString GetLDPNoteType();
154
bool m_fIsRest; //This lmNoteRest is a rest
156
wxInt32 m_nPentagrama; //num of staff on which this lmNoteRest is drawn
157
ENoteType m_nNoteType; //type of note / rest
159
//duration and time modifiers
160
float m_rDuration; //duration as defined in MusicXML: duration/divisions
162
bool m_fDoubleDotted;
163
bool m_fCalderon; //tiene calder�n
165
// beaming information
166
bool m_fBeamed; // note is beamed
167
lmBeam* m_pBeam; //beaming information
168
lmTBeamInfo m_BeamInfo[6]; //beam mode for each level
170
//tuplet related variables
171
lmTupletBracket* m_pTupletBracket; //ptr to lmTupletBracket if this note/rest is part of a tuplet
173
//wxInt32 m_xPos, m_yPos; //par�metros para Redibujar
175
//AuxObjs associated to this note
176
AuxObjsList* m_pNotations; //list of Notations
177
AuxObjsList* m_pLyrics; //list of Lyrics
181
// declare a list of NoteRests class
183
WX_DECLARE_LIST(lmNoteRest, NoteRestsList);
185
// global functions related to noterests
186
extern int LDPNoteTypeToEnumNoteType(wxString sNoteType);
187
extern float LDPNoteTypeToDuration(wxString sNoteType);
188
extern float NoteTypeToDuration(ENoteType nNoteType, bool fDotted, bool fDoubleDotted);
192
#endif // __NOTEREST_H__