LibMusicXML  3.18
notevisitor.h
1 /*
2  MusicXML Library
3  Copyright (C) Grame 2006-2013
4 
5  This Source Code Form is subject to the terms of the Mozilla Public
6  License, v. 2.0. If a copy of the MPL was not distributed with this
7  file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 
9  Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France
10  research@grame.fr
11 */
12 
13 #ifndef __noteVisitor__
14 #define __noteVisitor__
15 
16 #include <ostream>
17 #include <string>
18 #include <sstream>
19 #include "conversions.h"
20 #include "rational.h"
21 #include "typedefs.h"
22 #include "visitor.h"
23 #include "xml.h"
24 
25 
26 namespace MusicXML2
27 {
28 
37 class EXP notevisitor :
38  public visitor<S_accent>,
39  public visitor<S_alter>,
40  public visitor<S_beam>,
41  public visitor<S_breath_mark>,
42  public visitor<S_chord>,
43  public visitor<S_cue>,
44  public visitor<S_display_octave>,
45  public visitor<S_display_step>,
46  public visitor<S_dot>,
47  public visitor<S_duration>,
48  public visitor<S_fermata>,
49  public visitor<S_grace>,
50  public visitor<S_instrument>,
51  public visitor<S_note>,
52  public visitor<S_octave>,
53  public visitor<S_pitch>,
54  public visitor<S_rest>,
55  public visitor<S_slur>,
56  public visitor<S_staccato>,
57  public visitor<S_staff>,
58  public visitor<S_stem>,
59  public visitor<S_step>,
60  public visitor<S_strong_accent>,
61  public visitor<S_tenuto>,
62  public visitor<S_tie>,
63  public visitor<S_tied>,
64  public visitor<S_time_modification>,
65  public visitor<S_type>,
66  public visitor<S_unpitched>,
67  public visitor<S_voice>,
68  public visitor<S_lyric>,
69  public visitor<S_turn>,
70  public visitor<S_tremolo>,
71  public visitor<S_inverted_turn>,
72  public visitor<S_trill_mark>,
73  public visitor<S_wavy_line>,
74  public visitor<S_inverted_mordent>,
75  public visitor<S_mordent>,
76  public visitor<S_arpeggiate>,
77  public visitor<S_accidental_mark>,
78  public visitor<S_notehead>,
79  public visitor<S_tuplet>,
80  public visitor<S_fingering>,
81  public visitor<S_pluck>,
82  public visitor<S_up_bow>,
83  public visitor<S_down_bow>,
84  public visitor<S_harmonic>,
85  public visitor<S_snap_pizzicato>
86 {
87  public:
88  S_stem fStem;
89  S_accent fAccent;
90  S_strong_accent fStrongAccent;
91  S_staccato fStaccato;
92  S_tenuto fTenuto;
93  S_breath_mark fBreathMark;
94  S_trill_mark fTrill;
95  S_inverted_mordent fInvertedMordent;
96  S_mordent fMordent;
97  S_turn fTurn;
98  S_tremolo fTremolo;
99  S_arpeggiate fArpeggio;
100  S_inverted_turn fInvertedTurn;
101  S_accidental_mark fAccidentalMark;
102  S_notehead fNotehead;
103  S_fermata fFermata;
104  std::string fGraphicType;
105  std::string fAccidental;
106  std::string fCautionary;
107  S_harmonic fHarmonic;
108  S_snap_pizzicato fSnapPizzicato;
109  S_up_bow fBowUp;
110  S_down_bow fBowDown;
111 
112  enum { C, D, E, F, G, A, B, last=B, diatonicSteps=last };
113  enum type { kUndefinedType, kPitched, kUnpitched, kRest };
114  enum { kUndefinedDynamics = -1, kUndefinedStaff = 0, kUndefinedVoice = 0 };
115 
116  notevisitor();
117  virtual ~notevisitor() {}
118 
119  bool isGrace() const { return fGrace; }
120  bool isCue() const { return fCue; }
121  bool inChord() const { return fChord; }
122  bool inFermata() const { return (fFermata != (void*)0); }
123 
124  type getType() const { return fType; }
125  int getTie() const { return fTie; }
126  int getStaff() const { return fStaff; }
127  int getVoice() const { return fVoice; }
128  S_note getSnote() const { return fThisSNote; }
129  float getNoteHeadDy(string fCurClef) const;
130  std::string getNoteheadType() const;
131 
138  virtual float getMidiPitch() const;
139  virtual float getAlter() const { return fAlter; }
140  virtual int getOctave() const { return fOctave; }
141 
142  virtual const std::string& getStep() const { return fStep; }
143  virtual const std::string& getInstrument() const { return fInstrument; }
144  virtual const std::string& getGraphicType() const { return fGraphicType; }
145  virtual const rational& getTimeModification() const { return fTimeModification; }
146 
147  virtual void setStep (const std::string& step) { fStep = step; }
148  virtual void setOctave (int oct) { fOctave = oct; }
149  virtual void setAlter (float alter) { fAlter = alter; }
150 
151  // returns the dynamics value (kUndefinedDynamics when undefined)
152  virtual long getDynamics() const { return fDynamics; }
153  virtual long getDuration() const { return fDuration; }
154  virtual int getDots() const { return fDots; }
155  virtual void print (std::ostream& out) const;
156 
157  virtual const std::vector<Sxmlelement>& getFingerings() const { return fFingering; }
158  virtual const std::vector<S_tied>& getTied() const { return fTied; }
159  virtual const std::vector<S_slur>& getSlur() const { return fSlur; }
160  virtual const std::vector<S_beam>& getBeam() const { return fBeam; }
161  virtual const std::vector<S_wavy_line>& getWavylines() const { return fWaveLine; }
162  virtual const std::vector<S_tuplet>& getTuplet() const { return fTuplet; }
163  virtual const std::vector<S_lyric>& getLyric() const { return fLyric; }
164  virtual const std::string& getSyllabic() const { return fSyllabic; }
165  virtual const std::string& getLyricText() const { return fLyricText; }
166  virtual const float& getLyricDy() const { return fLyricsDy; }
167 
168  static int step2i(const std::string& step);
169  static std::string i2step(int i);
170 
171  int x_default; // XML's x_default value which is the distance from beginning of measure
172 
173  protected:
174  bool fInNote;
175  void reset();
176 
177  virtual void visitEnd ( S_note& elt );
178  //virtual void visitEnd ( S_rest& elt );
179 
180  virtual void visitStart( S_accent& elt) { fAccent = elt; }
181  virtual void visitStart( S_alter& elt ) { if (fInNote) fAlter = (float)(*elt); }
182  virtual void visitStart( S_beam& elt ) { fBeam.push_back (elt); }
183  virtual void visitStart( S_tuplet& elt ) { fTuplet.push_back (elt); }
184  virtual void visitStart( S_breath_mark& elt) { fBreathMark = elt; }
185  virtual void visitStart( S_chord& elt ) { fChord = true; }
186  virtual void visitStart( S_cue& elt ) { fCue = true; }
187  virtual void visitStart( S_display_octave& elt ) { if (fInNote) fOctave = (int)(*elt); }
188  virtual void visitStart( S_display_step& elt ) { if (fInNote) fStep = elt->getValue(); }
189  virtual void visitStart( S_dot& elt ) { if (fInNote) fDots++; }
190  virtual void visitStart( S_duration& elt ) { if (fInNote) fDuration = (int)(*elt); }
191  virtual void visitStart( S_fermata& elt ) { fFermata = elt; }
192  virtual void visitStart( S_grace& elt ) { fGrace = true; }
193  virtual void visitStart( S_instrument& elt ) { if (fInNote) fInstrument = elt->getValue(); }
194  virtual void visitStart( S_note& elt );
195  virtual void visitStart( S_octave& elt ) { if (fInNote) fOctave = (int)(*elt); }
196  virtual void visitStart( S_pitch& elt ) { fType = kPitched; }
197  virtual void visitStart( S_rest& elt ) { fType = kRest; }
198  virtual void visitStart( S_slur& elt ) { fSlur.push_back (elt); }
199  virtual void visitStart( S_staccato& elt) { fStaccato = elt; }
200  virtual void visitStart( S_staff& elt) { fStaff = int(*elt); }
201  virtual void visitStart( S_stem& elt ) { fStem = elt; }
202  virtual void visitStart( S_step& elt ) { if (fInNote) fStep = elt->getValue(); }
203  virtual void visitStart( S_strong_accent& elt) { fStrongAccent = elt; }
204  virtual void visitStart( S_tenuto& elt) { fTenuto = elt; }
205  virtual void visitStart( S_tie& elt );
206  virtual void visitStart( S_tied& elt ) { fTied.push_back (elt); }
207  virtual void visitStart( S_time_modification& elt );
208  virtual void visitStart( S_type& elt )
209  {
210  if (fInNote)
211  fGraphicType = elt->getValue();
212  if (elt->getAttributeValue("size")=="cue")
213  fCue = true;
214  }
215  virtual void visitStart( S_unpitched& elt ) { if (fInNote) fType = kUnpitched; }
216  virtual void visitStart( S_voice& elt ) { fVoice = int(*elt); }
217  virtual void visitStart( S_lyric& elt );
218  virtual void visitStart( S_turn& elt ) { fTurn = elt; }
219  virtual void visitStart( S_tremolo& elt ) { fTremolo = elt; }
220  virtual void visitStart( S_trill_mark& elt ) { fTrill = elt; }
221  virtual void visitStart( S_wavy_line& elt ) { fWaveLine.push_back(elt); }
222  virtual void visitStart( S_accidental_mark& elt ) { fAccidentalMark = elt; }
223  virtual void visitStart( S_inverted_mordent& elt ) { fInvertedMordent = elt; }
224  virtual void visitStart( S_inverted_turn& elt ) { fInvertedTurn = elt; }
225  virtual void visitStart( S_arpeggiate& elt ) { fArpeggio = elt; }
226  virtual void visitStart( S_mordent& elt ) { fMordent = elt; }
227  virtual void visitStart( S_notehead& elt ) { fNotehead = elt; }
228  virtual void visitStart( S_fingering& elt) {fFingering.push_back(elt);}
229  virtual void visitStart( S_pluck& elt) {fFingering.push_back(elt);}
230  virtual void visitStart( S_down_bow& elt) {fBowDown = elt;}
231  virtual void visitStart( S_up_bow& elt) {fBowUp = elt;}
232  virtual void visitStart( S_harmonic& elt) {fHarmonic = elt;}
233  virtual void visitStart( S_snap_pizzicato& elt) {fSnapPizzicato = elt;}
234 
235  private:
236  bool fGrace, fCue, fChord;
237  type fType;
238  int fDots;
239  StartStop::type fTie;
240  long fDuration, fDynamics;
241  std::string fStep;
242  float fAlter;
243  int fOctave;
244  int fStaff, fVoice;
245  rational fTimeModification;
246  std::string fInstrument;
247 
248  std::vector<S_tied> fTied;
249  std::vector<S_slur> fSlur;
250  std::vector<S_beam> fBeam;
251  std::vector<S_tuplet> fTuplet;
252  std::vector<S_wavy_line> fWaveLine;
253  std::vector<Sxmlelement> fFingering;
254 
255  std::vector<S_lyric> fLyric;
256  std::string fSyllabic;
257  std::string fLyricText;
258  float fLyricsDy;
259 
260  S_note fThisSNote;
261 };
262 
263 EXP std::ostream& operator<< (std::ostream& os, const notevisitor& elt);
264 
267 }
268 
269 #endif
A note visitor.
Definition: notevisitor.h:86
virtual float getMidiPitch() const
Compute the note MIDI pitch.
Definition: visitor.h:27
Rational number representation.
Definition: rational.h:25