LibMusicXML  3.18
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 
24 namespace MusicXML2
25 {
26 
37 class 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 
62 class 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;
87  int fProgram;
88  int fVolume;
89  int fUnpitched;
90  std::string fMIDIName;
91  std::string fID;
92 };
93 
94 
98 class midiwriter {
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 
124 class 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  long fPendingDuration; // 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 
198 }
199 
200 #endif
MusicXML2::midiInstrument::fID
std::string fID
the midi-instrument id
Definition: midicontextvisitor.h:91
MusicXML2::scoreInstrument::fAbbreviation
std::string fAbbreviation
the instrument abbreviated name
Definition: midicontextvisitor.h:53
MusicXML2::transposevisitor
a musicxml transpose element visitor
Definition: transposevisitor.h:36
MusicXML2::midiInstrument::fUnpitched
int fUnpitched
a note number from 1 to 127 (-1 when undefined)
Definition: midicontextvisitor.h:89
MusicXML2::midiwriter
An abstract interface to be used with midicontextvisitor.
Definition: midicontextvisitor.h:98
MusicXML2::midiInstrument::fChan
int fChan
an optional MIDI channel (-1 when undefined)
Definition: midicontextvisitor.h:85
MusicXML2::midicontextvisitor
A Visitor that maintains a context for MIDI generation.
Definition: midicontextvisitor.h:137
MusicXML2::midiInstrument::fVolume
int fVolume
a percentage from 0 to 100 (-1 when undefined)
Definition: midicontextvisitor.h:88
MusicXML2::midiInstrument::fProgram
int fProgram
a MIDI program change (-1 when undefined)
Definition: midicontextvisitor.h:87
MusicXML2::scoreInstrument::fName
std::string fName
the score instrument name
Definition: midicontextvisitor.h:52
MusicXML2::notevisitor
A note visitor.
Definition: notevisitor.h:86
MusicXML2::midiInstrument::fBank
int fBank
an optional MIDI bank number (-1 when undefined)
Definition: midicontextvisitor.h:86
MusicXML2::scoreInstrument
score-instrument data
Definition: midicontextvisitor.h:41
MusicXML2::scoreInstrument::fID
std::string fID
the score-instrument id
Definition: midicontextvisitor.h:54
MusicXML2::SMARTP
the smart pointer implementation
Definition: smartpointer.h:58
MusicXML2::visitor
Definition: visitor.h:27
MusicXML2::midiInstrument::fMIDIName
std::string fMIDIName
MIDI names correspond to ProgramName meta-events within a Standard MIDI File.
Definition: midicontextvisitor.h:90
MusicXML2::midiInstrument
midi-instrument data
Definition: midicontextvisitor.h:70