1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
|
//=============================================================================
// MuseScore
// Music Composition & Notation
//
// Copyright (C) 2002-2011 Werner Schweer
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License version 2
// as published by the Free Software Foundation and appearing in
// the file LICENCE.GPL
//=============================================================================
#ifndef __ARTICULATION_H__
#define __ARTICULATION_H__
#include "element.h"
class QPainter;
namespace Ms {
class ChordRest;
class Segment;
class Measure;
class System;
class Page;
enum class SymId;
//---------------------------------------------------------
// ArticulationInfo
// gives infos about note attributes
//---------------------------------------------------------
enum class ArticulationAnchor : char {
TOP_STAFF, // anchor is always placed at top of staff
BOTTOM_STAFF, // anchor is always placed at bottom of staff
CHORD, // anchor depends on chord direction, away from stem
TOP_CHORD, // attribute is alway placed at top of chord
BOTTOM_CHORD, // attribute is placed at bottom of chord
};
// flags:
enum class ArticulationShowIn : char { PITCHED_STAFF = 1, TABLATURE = 2 };
constexpr ArticulationShowIn operator| (ArticulationShowIn a1, ArticulationShowIn a2) {
return static_cast<ArticulationShowIn>(static_cast<unsigned char>(a1) | static_cast<unsigned char>(a2));
}
constexpr bool operator& (ArticulationShowIn a1, ArticulationShowIn a2) {
return static_cast<unsigned char>(a1) & static_cast<unsigned char>(a2);
}
struct ArticulationInfo {
SymId upSym;
SymId downSym;
QString name; // as stored in score files
QString description; // user-visible, translatable, name
qreal timeStretch; // for fermata
MScore::OrnamentStyle ornamentStyle; // or ornaments such as trill
bool playArticulation;
ArticulationShowIn flags;
};
//---------------------------------------------------------
// @@ Articulation
/// articulation marks
//---------------------------------------------------------
class Articulation : public Element {
Q_OBJECT
ArticulationType _articulationType;
MScore::Direction _direction;
QString _channelName;
ArticulationAnchor _anchor;
PropertyStyle anchorStyle;
bool _up;
qreal _timeStretch; // for fermata
MScore::OrnamentStyle _ornamentStyle; // for use in ornaments such as trill
bool _playArticulation;
virtual void draw(QPainter*) const;
public:
Articulation(Score*);
Articulation &operator=(const Articulation&) = delete;
virtual Articulation* clone() const override { return new Articulation(*this); }
virtual Element::Type type() const override { return Element::Type::ARTICULATION; }
virtual qreal mag() const override;
void setArticulationType(ArticulationType);
ArticulationType articulationType() const { return _articulationType; }
virtual int subtype() const override { return int(_articulationType); }
void setSubtype(const QString& s);
QString subtypeName() const;
virtual void layout() override;
virtual void read(XmlReader&) override;
virtual void write(Xml& xml) const override;
virtual void reset() override;
virtual QLineF dragAnchor() const override;
virtual QVariant getProperty(P_ID propertyId) const override;
virtual bool setProperty(P_ID propertyId, const QVariant&) override;
virtual QVariant propertyDefault(P_ID) const override;
virtual PropertyStyle propertyStyle(P_ID) const override;
virtual void resetProperty(P_ID id) override;
virtual void styleChanged() override;
QString subtypeUserName() const;
virtual QPointF pagePos() const override; ///< position in page coordinates
virtual QPointF canvasPos() const override;
bool up() const { return _up; }
void setUp(bool val) { _up = val; }
void setDirection(MScore::Direction d);
MScore::Direction direction() const { return _direction; }
ChordRest* chordRest() const;
Segment* segment() const;
Measure* measure() const;
System* system() const;
Page* page() const;
void canvasBoundingRectChanged();
static ArticulationInfo articulationList[];
ArticulationAnchor anchor() const { return _anchor; }
void setAnchor(ArticulationAnchor v) { _anchor = v; }
qreal timeStretch() const { return _timeStretch; }
void setTimeStretch(qreal val) { _timeStretch = val; }
MScore::OrnamentStyle ornamentStyle() const { return _ornamentStyle; }
void setOrnamentStyle(MScore::OrnamentStyle val) { _ornamentStyle = val; }
bool playArticulation() const { return _playArticulation;}
void setPlayArticulation(bool val) { _playArticulation = val; }
QString channelName() const { return _channelName; }
void setChannelName(const QString& s) { _channelName = s; }
const ArticulationInfo* articulationInfo() const { return &articulationList[int(articulationType())]; }
static QString idx2name(int idx);
bool isFermata() { return _articulationType == ArticulationType::Fermata ||
_articulationType == ArticulationType::Shortfermata ||
_articulationType == ArticulationType::Longfermata ||
_articulationType == ArticulationType::Verylongfermata; }
QString accessibleInfo() override;
};
} // namespace Ms
#endif
|