LibMusicXML 3.22
timePositions.h
1//
2// mxmlPartTimePositions.hpp
3// libmusicxml2
4//
5// Created by Arshia Cont on 02/08/2021.
6//
7
8#ifndef mxmlTimePositions_hpp
9#define mxmlTimePositions_hpp
10
11#include <stdio.h>
12#include <map>
13#include <tuple>
14#include <algorithm>
15
16#include "xml.h"
17#include "notevisitor.h"
18
19class MusicXMLTimePositions
20{
21public:
22 MusicXMLTimePositions() {
23 timePositions.clear();
24 };
25 MusicXMLTimePositions(const MusicXMLTimePositions &p1) { timePositions = p1.timePositions; }
26
27 // relative position in measure (double), default_x, voice number, staff number
28 typedef std::tuple<double, int, int, int> VoicedTimePosition;
29 typedef std::vector<VoicedTimePosition> TimePositionList;
30
31 void addTimePosition(std::string measure, double positionInMeasure, const MusicXML2::notevisitor& nv);
32
41 float getDxForElement(MusicXML2::xmlelement *element, double position, std::string onMeasure, int voice, int staff, double xmlOffset);
42
44 float getDxRelativeToMeasureForElement(MusicXML2::xmlelement *element, std::string onMeasure, int voice, double xmlOffset);
45
46
47 size_t size() { return timePositions.size(); }
48
49protected:
50
51 int getVoice(VoicedTimePosition e) { return std::get<2>(e); }
52 int getDefaultX(VoicedTimePosition e) { return std::get<1>(e); }
53 int getStaff(VoicedTimePosition e) { return std::get<3>(e); }
54
56 TimePositionList::iterator find(TimePositionList &timePos4measure, int voiceId, int staff, double position) {
57// cerr<<"Start Search for Position "<<position<<" voiceId:"<<voiceId<<endl;
58 auto it = std::find_if(timePos4measure.begin(), timePos4measure.end(), [voiceId, staff, position] (const VoicedTimePosition& e) {
59 if ((voiceId > 0) && (std::get<2>(e) != voiceId) ) {
60 return false;
61 }
62 if ((staff > 0) && (std::get<3>(e) != staff) ) {
63 return false;
64 }
65// cerr<<"\t TimePos elementPos="<<std::get<0>(e)<<endl;
66 return std::get<0>(e) == position;
67 });
68
69 return it;
70 }
71
72private:
74 std::map<std::string, std::vector<VoicedTimePosition> > timePositions;
75};
76
77
78#endif /* mxmlPartTimePositions_hpp */
A note visitor.
Definition notevisitor.h:87
A generic xml element representation.
Definition xml.h:86
TimePositionList::iterator find(TimePositionList &timePos4measure, int voiceId, int staff, double position)
Returns iterator in TimePositionList with equal voiceId and EQUAL position to query.
Definition timePositions.h:56
float getDxRelativeToMeasureForElement(MusicXML2::xmlelement *element, std::string onMeasure, int voice, double xmlOffset)
Finds Guido Dx for XML Directions whose default horizontal position is from the Beginning of the Meas...
float getDxForElement(MusicXML2::xmlelement *element, double position, std::string onMeasure, int voice, int staff, double xmlOffset)