LibMusicXML 3.22
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
33
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 public visitor<S_staccatissimo>
87{
88 public:
89 S_stem fStem;
90 S_accent fAccent;
91 S_strong_accent fStrongAccent;
92 S_staccato fStaccato;
93 S_tenuto fTenuto;
94 S_breath_mark fBreathMark;
95 S_trill_mark fTrill;
96 S_inverted_mordent fInvertedMordent;
97 S_mordent fMordent;
98 S_turn fTurn;
99 S_tremolo fTremolo;
100 S_arpeggiate fArpeggio;
101 S_inverted_turn fInvertedTurn;
102 S_accidental_mark fAccidentalMark;
103 S_notehead fNotehead;
104 S_fermata fFermata;
105 std::string fGraphicType;
106 std::string fAccidental;
107 std::string fCautionary;
108 S_harmonic fHarmonic;
109 S_snap_pizzicato fSnapPizzicato;
110 S_staccatissimo fStaccatissimo;
111 S_up_bow fBowUp;
112 S_down_bow fBowDown;
113
114 enum { C, D, E, F, G, A, B, last=B, diatonicSteps=last };
115 enum type { kUndefinedType, kPitched, kUnpitched, kRest };
116 enum { kUndefinedDynamics = -1, kUndefinedStaff = 0, kUndefinedVoice = 0 };
117
118 notevisitor();
119 virtual ~notevisitor() {}
120
121 bool isGrace() const { return fGrace; }
122 bool isCue() const { return fCue; }
123 bool inChord() const { return fChord; }
124 bool inFermata() const { return (fFermata != (void*)0); }
125
126 type getType() const { return fType; }
127 int getTie() const { return fTie; }
128 int getStaff() const { return (fStaff == kUndefinedStaff ? 1: fStaff); }
129 int getVoice() const { return fVoice; }
130 S_note getSnote() const { return fThisSNote; }
131 float getNoteHeadDy(string fCurClef) const;
132 std::string getNoteheadType() const;
133
134 bool printObject() const {return shouldPrint; }
135
142 virtual float getMidiPitch() const;
143 virtual float getAlter() const { return fAlter; }
144 virtual int getOctave() const { return fOctave; }
145
146 virtual const std::string& getStep() const { return fStep; }
147 virtual const std::string& getInstrument() const { return fInstrument; }
148 virtual const std::string& getGraphicType() const { return fGraphicType; }
149 virtual const rational& getTimeModification() const { return fTimeModification; }
150
151 virtual void setStep (const std::string& step) { fStep = step; }
152 virtual void setOctave (int oct) { fOctave = oct; }
153 virtual void setAlter (float alter) { fAlter = alter; }
154
155 // returns the dynamics value (kUndefinedDynamics when undefined)
156 virtual long getDynamics() const { return fDynamics; }
157 virtual long getDuration() const { return fDuration; }
158 virtual int getDots() const { return fDots; }
159 virtual void print (std::ostream& out) const;
160
161 virtual const std::vector<Sxmlelement>& getFingerings() const { return fFingering; }
162 virtual const std::vector<S_tied>& getTied() const { return fTied; }
163 virtual const std::vector<S_slur>& getSlur() const { return fSlur; }
164 virtual const std::vector<S_beam>& getBeam() const { return fBeam; }
165 virtual const std::vector<S_wavy_line>& getWavylines() const { return fWaveLine; }
166 virtual const std::vector<S_tuplet>& getTuplet() const { return fTuplet; }
167 virtual const std::vector<S_lyric>& getLyric() const { return fLyric; }
168 virtual const std::string& getSyllabic() const { return fSyllabic; }
169 virtual const std::string& getLyricText() const { return fLyricText; }
170 virtual const float& getLyricDy() const { return fLyricsDy; }
171
172 static int step2i(const std::string& step);
173 static std::string i2step(int i);
174
175 int x_default; // XML's x_default value which is the distance from beginning of measure
176
177 protected:
178 bool fInNote;
179 void reset();
180
181 virtual void visitEnd ( S_note& elt );
182 //virtual void visitEnd ( S_rest& elt );
183
184 virtual void visitStart( S_accent& elt) { fAccent = elt; }
185 virtual void visitStart( S_alter& elt ) { if (fInNote) fAlter = (float)(*elt); }
186 virtual void visitStart( S_beam& elt ) { fBeam.push_back (elt); }
187 virtual void visitStart( S_tuplet& elt ) { fTuplet.push_back (elt); }
188 virtual void visitStart( S_breath_mark& elt) { fBreathMark = elt; }
189 virtual void visitStart( S_chord& elt ) { fChord = true; }
190 virtual void visitStart( S_cue& elt ) { fCue = true; }
191 virtual void visitStart( S_display_octave& elt ) { if (fInNote) fOctave = (int)(*elt); }
192 virtual void visitStart( S_display_step& elt ) { if (fInNote) fStep = elt->getValue(); }
193 virtual void visitStart( S_dot& elt ) { if (fInNote) fDots++; }
194 virtual void visitStart( S_duration& elt ) { if (fInNote) fDuration = (int)(*elt); }
195 virtual void visitStart( S_fermata& elt ) { fFermata = elt; }
196 virtual void visitStart( S_grace& elt ) { fGrace = true; }
197 virtual void visitStart( S_instrument& elt ) { if (fInNote) fInstrument = elt->getAttributeValue("id"); }
198 virtual void visitStart( S_note& elt );
199 virtual void visitStart( S_octave& elt ) { if (fInNote) fOctave = (int)(*elt); }
200 virtual void visitStart( S_pitch& elt ) { fType = kPitched; }
201 virtual void visitStart( S_rest& elt ) { fType = kRest; }
202 virtual void visitStart( S_slur& elt ) { fSlur.push_back (elt); }
203 virtual void visitStart( S_staccato& elt) { fStaccato = elt; }
204 virtual void visitStart( S_staff& elt) { fStaff = int(*elt); }
205 virtual void visitStart( S_stem& elt ) { fStem = elt; }
206 virtual void visitStart( S_step& elt ) { if (fInNote) fStep = elt->getValue(); }
207 virtual void visitStart( S_strong_accent& elt) { fStrongAccent = elt; }
208 virtual void visitStart( S_tenuto& elt) { fTenuto = elt; }
209 virtual void visitStart( S_tie& elt );
210 virtual void visitStart( S_tied& elt ) { fTied.push_back (elt); }
211 virtual void visitStart( S_time_modification& elt );
212 virtual void visitStart( S_type& elt )
213 {
214 if (fInNote)
215 fGraphicType = elt->getValue();
216 if (elt->getAttributeValue("size")=="cue")
217 fCue = true;
218 }
219 virtual void visitStart( S_unpitched& elt ) { if (fInNote) fType = kUnpitched; }
220 virtual void visitStart( S_voice& elt ) { fVoice = int(*elt); }
221 virtual void visitStart( S_lyric& elt );
222 virtual void visitStart( S_turn& elt ) { fTurn = elt; }
223 virtual void visitStart( S_tremolo& elt ) { fTremolo = elt; }
224 virtual void visitStart( S_trill_mark& elt ) { fTrill = elt; }
225 virtual void visitStart( S_wavy_line& elt ) { fWaveLine.push_back(elt); }
226 virtual void visitStart( S_accidental_mark& elt ) { fAccidentalMark = elt; }
227 virtual void visitStart( S_inverted_mordent& elt ) { fInvertedMordent = elt; }
228 virtual void visitStart( S_inverted_turn& elt ) { fInvertedTurn = elt; }
229 virtual void visitStart( S_arpeggiate& elt ) { fArpeggio = elt; }
230 virtual void visitStart( S_mordent& elt ) { fMordent = elt; }
231 virtual void visitStart( S_notehead& elt ) { fNotehead = elt; }
232 virtual void visitStart( S_fingering& elt) {fFingering.push_back(elt);}
233 virtual void visitStart( S_pluck& elt) {fFingering.push_back(elt);}
234 virtual void visitStart( S_down_bow& elt) {fBowDown = elt;}
235 virtual void visitStart( S_up_bow& elt) {fBowUp = elt;}
236 virtual void visitStart( S_harmonic& elt) {fHarmonic = elt;}
237 virtual void visitStart( S_snap_pizzicato& elt) {fSnapPizzicato = elt;}
238 virtual void visitStart( S_staccatissimo& elt) {fStaccatissimo = elt;}
239
240 private:
241 bool fGrace, fCue, fChord;
242 type fType;
243 int fDots;
244 StartStop::type fTie;
245 long fDuration, fDynamics;
246 std::string fStep;
247 float fAlter;
248 int fOctave;
249 int fStaff, fVoice;
250 rational fTimeModification;
251 std::string fInstrument;
252
253 std::vector<S_tied> fTied;
254 std::vector<S_slur> fSlur;
255 std::vector<S_beam> fBeam;
256 std::vector<S_tuplet> fTuplet;
257 std::vector<S_wavy_line> fWaveLine;
258 std::vector<Sxmlelement> fFingering;
259
260 std::vector<S_lyric> fLyric;
261 std::string fSyllabic;
262 std::string fLyricText;
263 float fLyricsDy;
264
265 S_note fThisSNote;
266
267 bool shouldPrint;
268};
269
270EXP std::ostream& operator<< (std::ostream& os, const notevisitor& elt);
271
273
274}
275
276#endif
A note visitor.
Definition notevisitor.h:87
virtual float getMidiPitch() const
Compute the note MIDI pitch.
Definition visitor.h:27