LibMusicXML 3.22
midicontextvisitor.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 __midiContextVisitor__
14#define __midiContextVisitor__
15
16#include <string>
17#include <map>
18#include "xml.h"
19#include "typedefs.h"
20#include "visitor.h"
21#include "notevisitor.h"
22#include "transposevisitor.h"
23
24namespace MusicXML2
25{
26
31
37class EXP scoreInstrument :
38 public visitor<S_score_instrument>,
39 public visitor<S_instrument_name>,
40 public visitor<S_instrument_abbreviation>
41{
42 protected:
43 virtual void reset();
44 virtual void visitStart( S_score_instrument& elt );
45 virtual void visitStart( S_instrument_name& elt );
46 virtual void visitStart( S_instrument_abbreviation& elt );
47
48 public:
49 scoreInstrument() {}
50 virtual ~scoreInstrument() {}
51
52 std::string fName;
53 std::string fAbbreviation;
54 std::string fID;
55};
56
62class EXP midiInstrument :
63 public visitor<S_midi_instrument>,
64 public visitor<S_midi_channel>,
65 public visitor<S_midi_name>,
66 public visitor<S_midi_bank>,
67 public visitor<S_midi_program>,
68 public visitor<S_midi_unpitched>,
69 public visitor<S_volume>
70{
71 protected:
72 virtual void reset();
73 virtual void visitStart( S_midi_instrument& elt );
74 virtual void visitStart( S_midi_channel& elt );
75 virtual void visitStart( S_midi_name& elt );
76 virtual void visitStart( S_midi_bank& elt );
77 virtual void visitStart( S_midi_program& elt );
78 virtual void visitStart( S_volume& elt );
79 virtual void visitStart( S_midi_unpitched& elt );
80
81 public:
82 midiInstrument() : fChan(-1), fBank(-1), fProgram(-1), fVolume(-1), fUnpitched(-1) {}
83 virtual ~midiInstrument() {}
84
85 int fChan;
86 int fBank;
88 int fVolume;
90 std::string fMIDIName;
91 std::string fID;
92};
93
94
99 public:
100 enum pedalType { kDamperPedal, kSoftpedal, kSostenutoPedal };
101
102 virtual ~midiwriter() {}
103
104 virtual void startPart (int instrCount) = 0;
105 virtual void newInstrument (std::string instrName, int chan=-1) = 0;
106 virtual void endPart (long date) = 0;
107
108 virtual void newNote (long date, int chan, float pitch, int velocity, int duration) = 0;
109 virtual void tempoChange (long date, int bpm) = 0;
110 virtual void pedalChange (long date, pedalType t, int value) = 0;
111
112 virtual void volChange (long date, int chan, int vol) = 0;
113 virtual void bankChange (long date, int chan, int bank) = 0;
114 virtual void progChange (long date, int chan, int prog) = 0;
115};
116
117
123
124class EXP midicontextvisitor :
125 public notevisitor,
126 public transposevisitor,
127 public midiInstrument,
128 public scoreInstrument,
129 public visitor<S_divisions>,
130 public visitor<S_backup>,
131 public visitor<S_forward>,
132 public visitor<S_midi_device>,
133 public visitor<S_measure>,
134 public visitor<S_part>,
135 public visitor<S_score_part>,
136 public visitor<S_sound>
137{
138 private:
139 typedef std::multimap<std::string, scoreInstrument> instrumentsList;
140 typedef std::map<std::string, midiInstrument> midi_instrumentsList;
141 instrumentsList fScoreInstruments;
142 midi_instrumentsList fMidiInstruments;
143 std::string fCurrentPartID;
144
145 bool fInBackup; // In backup state
146 bool fInForward; // In forward state
147 bool fInSound; // In sound element
148 long fEndMeasureDate; // max of the date kept in a measure
149 long fEndPartDate; // max of the part duration
150
151 protected:
152 midiwriter* fMidiWriter;
153 long fDivisions; // current division
154 long fCurrentDate; // current date
155 long fLastPosition; // last time position (used for chord)
156 std::map<int, long> fPendingDurations; // map of pitch -> pending duration,(used for tied notes)
157 long fCurrentDynamics; // current dynamics ie MIDI velocity
158 long fTranspose; // current transpose value
159 long fTPQ; // ticks-per-quater value for date conversion
160 long fCurrentChan; // current midi channel
161
162 void addDuration(long dur); // move the current time, dur must be expressed in tpq
163 long convert2Tick(long val) { return (val*fTPQ)/fDivisions; }
164 long convert2Vel(long val) { return (val * 90) / 100; }
165
166 virtual void playScoreInstrument (const scoreInstrument& instr);
167 virtual void playMidiInstrument (const midiInstrument& instr);
168 virtual void playNote (const notevisitor& note);
169 virtual void playTempoChange (long bmp);
170 virtual void playPedalChange (midiwriter::pedalType type, const std::string& val);
171
172 virtual void visitStart( S_divisions& elt );
173 virtual void visitStart( S_duration& elt );
174 virtual void visitStart( S_backup& elt ) { fInBackup = true; }
175 virtual void visitEnd ( S_backup& elt ) { fInBackup = false; }
176 virtual void visitStart( S_forward& elt ) { fInForward = true; }
177 virtual void visitEnd ( S_forward& elt ) { fInForward = false; }
178 virtual void visitEnd ( S_score_instrument& elt );
179 virtual void visitStart( S_midi_device& elt );
180 virtual void visitEnd ( S_midi_instrument& elt );
181 virtual void visitEnd ( S_measure& elt );
182 virtual void visitStart( S_part& elt );
183 virtual void visitEnd ( S_part& elt );
184 virtual void visitEnd ( S_note& elt );
185 virtual void visitStart( S_score_part& elt );
186 virtual void visitEnd ( S_score_part& elt );
187 virtual void visitStart( S_sound& elt );
188 virtual void visitEnd ( S_sound& elt ) { fInSound = false; }
189 virtual void visitEnd ( S_transpose& elt );
190
191 public:
192 midicontextvisitor(long tpq, midiwriter* writer=0);
193 virtual ~midicontextvisitor();
194};
195
197
198}
199
200#endif
std::string fID
the midi-instrument id
Definition midicontextvisitor.h:91
int fVolume
a percentage from 0 to 100 (-1 when undefined)
Definition midicontextvisitor.h:88
int fBank
an optional MIDI bank number (-1 when undefined)
Definition midicontextvisitor.h:86
int fUnpitched
a note number from 1 to 127 (-1 when undefined)
Definition midicontextvisitor.h:89
std::string fMIDIName
MIDI names correspond to ProgramName meta-events within a Standard MIDI File.
Definition midicontextvisitor.h:90
int fProgram
a MIDI program change (-1 when undefined)
Definition midicontextvisitor.h:87
int fChan
an optional MIDI channel (-1 when undefined)
Definition midicontextvisitor.h:85
An abstract interface to be used with midicontextvisitor.
Definition midicontextvisitor.h:98
std::string fID
the score-instrument id
Definition midicontextvisitor.h:54
std::string fName
the score instrument name
Definition midicontextvisitor.h:52
std::string fAbbreviation
the instrument abbreviated name
Definition midicontextvisitor.h:53
Definition visitor.h:27