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
26namespace MusicXML2
27{
28
37class 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
263EXP 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
const std::string & getValue() const
returns the element value as a string
Definition: xml.h:125
Rational number representation.
Definition: rational.h:25