~s-cecilio/lenmus/v5.3

« back to all changes in this revision

Viewing changes to src/score/NoteRest.h

  • Committer: cecilios
  • Date: 2006-03-05 11:33:10 UTC
  • Revision ID: svn-v4:2587a929-2f0e-0410-ae78-fe6f687d5efe:trunk:2
Initial import

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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
 
5
//
 
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.
 
9
//
 
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.
 
13
//
 
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.
 
17
//
 
18
//    For any comment, suggestion or feature request, please contact the manager of 
 
19
//    the project at cecilios@users.sourceforge.net
 
20
//
 
21
//-------------------------------------------------------------------------------------
 
22
/*! @file NoteRest.h
 
23
    @brief Header file for class lmNoteRest
 
24
    @ingroup score_kernel
 
25
*/
 
26
 
 
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
 
30
//   alteraciones.
 
31
//       0 - silencio
 
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)
 
41
//      etc.
 
42
//
 
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
 
51
//       etc.
 
52
//
 
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
 
70
//   flexibilidad.
 
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
//---------------------------------------------------------------------------------------------
 
81
 
 
82
#ifdef __GNUG__
 
83
// #pragma interface
 
84
#endif
 
85
 
 
86
#ifndef __NOTEREST_H__        //to avoid nested includes
 
87
#define __NOTEREST_H__
 
88
 
 
89
#define DEFINE_REST        true
 
90
#define DEFINE_NOTE        false
 
91
 
 
92
// struct BeamInfo represents raw info about this note beaming. It is the same information
 
93
// present on a <beam> MusicXML tag.
 
94
struct lmTBeamInfo
 
95
{
 
96
    EBeamType    Type;
 
97
    bool        Repeat;
 
98
};
 
99
 
 
100
 
 
101
class lmNoteRest:  public lmCompositeObj
 
102
{
 
103
public:
 
104
    //ctors and dtor
 
105
    lmNoteRest(lmVStaff* pVStaff, bool IsRest, ENoteType nNoteType, float rDuration,
 
106
             bool fDotted, bool fDoubleDotted, wxInt32 nStaff);
 
107
    virtual ~lmNoteRest();
 
108
 
 
109
    virtual void DrawObject(bool fMeasuring, lmPaper* pPaper, wxColour colorC) = 0;
 
110
    virtual wxBitmap* GetBitmap(double rScale) = 0;
 
111
    virtual wxString Dump() = 0;
 
112
 
 
113
    bool IsRest() { return m_fIsRest; }
 
114
    virtual bool IsInChord() = 0;    
 
115
 
 
116
    //implementation of virtual methods of base class lmCompositeObj
 
117
    virtual lmScoreObj* FindSelectableObject(wxPoint& pt)=0;
 
118
 
 
119
    // methods related to note/rest positioning information
 
120
    lmMicrons GetStaffOffset() { return m_pVStaff->GetStaffOffset(m_nStaffNum); }
 
121
 
 
122
    //methods related to associated AuxObjs management
 
123
    void AddFermata(bool fOverNote = true);
 
124
    void AddLyric(lmLyric* pLyric);
 
125
 
 
126
    //methods related to duration
 
127
    float GetDuration() { return m_rDuration; }
 
128
 
 
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; }
 
134
 
 
135
    //methods related to tuplets
 
136
    void SetTupletBracket(lmTupletBracket* pTB) { m_pTupletBracket = pTB; }
 
137
 
 
138
    //methods related to sound
 
139
    void AddMidiEvents(lmSoundManager* pSM, float rMeasureStartTime, int nChannel,
 
140
                       int nMeasure);
 
141
 
 
142
    //accessors
 
143
    ENoteType GetNoteType() { return m_nNoteType; }
 
144
 
 
145
 
 
146
protected:
 
147
    bool ParseTipoNota(wxString& sData);
 
148
    wxString GetLDPNoteType();
 
149
        
 
150
        //
 
151
        // member variables
 
152
        //
 
153
 
 
154
    bool        m_fIsRest;          //This lmNoteRest is a rest
 
155
 
 
156
    wxInt32     m_nPentagrama;      //num of staff on which this lmNoteRest is drawn 
 
157
    ENoteType   m_nNoteType;        //type of note / rest
 
158
    
 
159
    //duration and time modifiers
 
160
    float       m_rDuration;            //duration as defined in MusicXML: duration/divisions
 
161
    bool        m_fDotted;
 
162
    bool        m_fDoubleDotted;
 
163
    bool        m_fCalderon;            //tiene calder�n
 
164
 
 
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
 
169
 
 
170
    //tuplet related variables
 
171
    lmTupletBracket*    m_pTupletBracket;    //ptr to lmTupletBracket if this note/rest is part of a tuplet
 
172
 
 
173
    //wxInt32        m_xPos, m_yPos;    //par�metros para Redibujar
 
174
 
 
175
    //AuxObjs associated to this note
 
176
    AuxObjsList*    m_pNotations;     //list of Notations
 
177
    AuxObjsList*    m_pLyrics;        //list of Lyrics
 
178
 
 
179
};
 
180
 
 
181
// declare a list of NoteRests class
 
182
#include "wx/list.h"
 
183
WX_DECLARE_LIST(lmNoteRest, NoteRestsList);
 
184
 
 
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);
 
189
 
 
190
 
 
191
 
 
192
#endif    // __NOTEREST_H__