Skip to content

Commit 73e54a4

Browse files
committed
add instr support for MIDI param
1 parent 29b93a1 commit 73e54a4

File tree

7 files changed

+35
-2
lines changed

7 files changed

+35
-2
lines changed

src/engine/abstract/ARInstrument.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
#include "ARInstrument.h"
1818
#include "TagParameterStrings.h"
1919
#include "TagParameterString.h"
20+
#include "TagParameterInt.h"
21+
#include "TimeUnwrap.h"
2022

2123
using namespace std;
2224

@@ -36,6 +38,12 @@ void ARInstrument::setTagParameters (const TagParameterMap& params)
3638
if (autopos)
3739
fAutoPos = getParameter<TagParameterString>(kAutoposStr, true)->getBool();
3840
fRepeat = getParameter<TagParameterString>(kRepeatStr, true)->getBool();
41+
fMidiInstr = getParameter<TagParameterInt>(kMIDIInstrStr, true)->getValue();
42+
}
43+
44+
void ARInstrument::browse(TimeUnwrap& mapper) const
45+
{
46+
mapper.AtPos (this, TimeUnwrap::kInstr);
3947
}
4048

4149

src/engine/abstract/ARInstrument.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,14 @@
3535
@param:name:string:the instrument name:*none*:false
3636
@param:transp:string:a transposition string:*none*:true
3737
@param:autopos:boolean:automatic position control:off:true
38+
@param:repeat:boolean:allows to display on each system:off:true
39+
@param:MIDI:int:MIDI instrument number:-1:true
3840
@fontparams:
3941
@paramdesc
4042
- **name** is the instrument name (e.g. "Violin I")
4143
- **transp** is provided for transposing instruments. For example, with a Trumpet in B flat, you should set **transp** to "B&". When *transp* is set, a transposing key is automatically inserted and the notes are automatically transposed to the corresponding interval.
4244
- **autopos**: when "on", put the instrument string centered to the left of the corresponding staff. The default position if on top, left of the staff.
45+
- **repeat**: when "on", the instrument string is repeated on each system.
4346
4447
See the [Articulations](@EXAMPLES/articulations/) example.<br />
4548
See the [Mozart](@EXAMPLES/mozart581/) example.<br />
@@ -63,17 +66,20 @@ class ARInstrument : public ARFontAble
6366
virtual const char* getTagName() const { return "ARInstrument"; };
6467
virtual std::string getGMNName() const { return "\\instrument"; };
6568
virtual bool IsStateTag() const { return true; }
69+
virtual void browse(TimeUnwrap& mapper) const;
6670

6771
const std::string& getName() const { return fName; }
6872
const std::string& getTransp() const { return fTransp; }
6973
bool autoPos() const { return fAutoPos; }
7074
bool repeat() const { return fRepeat; }
75+
int midi() const { return fMidiInstr; }
7176

7277
private:
7378
std::string fName;
7479
std::string fTransp;
7580
bool fAutoPos;
7681
bool fRepeat = false; // to display the instrument every new system
82+
int fMidiInstr = -1;
7783
};
7884

7985
#endif

src/engine/abstract/TagParameterStrings.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ const char* kARFooterParams = "S,text,,r;S,pageformat,c6,o;S,font,Times,o;U,fsi
5353
const char* kARGlissandoParams = "U,dx1,0,o;U,dy1,0,o;U,dx2,0,o;U,dy2,0,o;S,fill,false,o;U,thickness,0.3,o";
5454
const char* kARGraceParams = "I,i,,o";
5555
const char* kARHarmonyParams = "S,text,,r;U,dy,-1,o;S,textformat,lt,o;S,font,Arial,o;U,fsize,18pt,o";
56-
const char* kARInstrumentParams = "S,name,,r;S,transp,,o;S,autopos,off,o;S,repeat,off,o";
56+
const char* kARInstrumentParams = "S,name,,r;S,transp,,o;S,autopos,off,o;S,repeat,off,o;I,MIDI,-1,o";
5757
const char* kARIntensParams = "S,type,,r;S,before,,o;S,after,,o;S,font,Times,o;U,fsize,10pt,o;S,fattrib,i,o;S,autopos,off,o";
5858
const char* kARJumpParams = "S,m,,o;I,id,0,o";
5959
const char* kARKeyParams = "S,key,,r;S,hideNaturals,false,o;S,free,,o";
@@ -156,6 +156,7 @@ const char* kLineThicknesStr= "lineThickness";
156156
const char* kLmStr = "lm";
157157
const char* kMarkStr = "mark";
158158
const char* kMeasNumStr = "measNum";
159+
const char* kMIDIInstrStr = "MIDI";
159160
const char* kModeStr = "mode";
160161
const char* kMStr = "m";
161162
const char* kNameStr = "name";

src/engine/abstract/TagParameterStrings.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@ extern const char* kLineThicknesStr;
157157
extern const char* kLmStr;
158158
extern const char* kMarkStr;
159159
extern const char* kMeasNumStr;
160+
extern const char* kMIDIInstrStr;
160161
extern const char* kModeStr;
161162
extern const char* kMStr;
162163
extern const char* kNameStr;

src/engine/lib/MIDIMapper.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
#include "ARMusicalVoiceState.h"
2626
#include "ARNote.h"
2727
#include "ARIntens.h"
28+
#include "ARInstrument.h"
2829
#include "ARTempo.h"
2930
#include "ARTie.h"
3031

@@ -99,6 +100,19 @@ void MidiMapper::IntensChge(const ARMusicalObject * ev)
99100
}
100101
}
101102

103+
//------------------------------------------------------------------------------
104+
void MidiMapper::Instr(const ARMusicalObject * ev)
105+
{
106+
const ARInstrument* instr = dynamic_cast<const ARInstrument*>(ev);
107+
if (instr && instr->midi() >= 0) {
108+
MidiEvPtr pc = fMidi->NewEv(typeProgChange);
109+
Date(pc) = Ticks (fUPosition);
110+
Data(pc)[0] = instr->midi();
111+
Chan(pc) = fChan;
112+
fMidi->AddSeq (fSeq, pc);
113+
}
114+
}
115+
102116
//------------------------------------------------------------------------------
103117
void MidiMapper::Event(const ARMusicalObject * ev, EventType type)
104118
{
@@ -124,6 +138,8 @@ void MidiMapper::Event(const ARMusicalObject * ev, EventType type)
124138
break;
125139
case kNoTie: fTiedNotes.clear();
126140
break;
141+
case kInstr: Instr(ev);
142+
break;
127143
default:
128144
break;
129145
}

src/engine/lib/MIDIMapper.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ class MidiMapper : public TimeUnwrap
5050
void TempoChge (const ARMusicalObject * ev);
5151
void IntensChge (const ARMusicalObject * ev);
5252
void TiedNote (MidiEvPtr note);
53+
void Instr (const ARMusicalObject * ev);
5354

5455
protected:
5556
virtual void Event (const ARMusicalObject * ev, EventType type);

src/engine/lib/TimeUnwrap.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ class TimeUnwrap
5353
kDaCapo, kDaCapoAlFine, kDaCoda,
5454
kDalSegno, kDalSegnoAlFine, kVolta, kTempo,
5555
kFermata, kAccent, kSlur, kStaccato, kTenuto,
56-
kMarcato, kIntens, kTie, kGlissando, kChordComma, kNoTie } EventType;
56+
kMarcato, kIntens, kTie, kGlissando, kChordComma, kNoTie, kInstr } EventType;
5757

5858
TimeUnwrap(ARMusicalVoice* voice) : fVoice(voice),
5959
fStartPos(0), fFinePos(0), fCodaPos(0),

0 commit comments

Comments
 (0)