enum Key 表示 调号类型,定义如下
enum class Key {
C_B = -7, // 7个降号
G_B, // 6个降号
D_B, // 5个降号
A_B, // 4个降号
E_B, // 3个降号
B_B, // 2个降号
F, // 1个降号
C, // 无升降号
G, // 1个升号
D, // 1个升号
A, // 1个升号
E, // 1个升号
B, // 1个升号
F_S, // 1个升号
C_S, // 1个升号
MIN = Key::C_B,
MAX = Key::C_S,
INVALID = Key::MIN - 1,
NUM_OF = Key::MAX - Key::MIN + 1,
DELTA_ENHARMONIC = 12
};
KeySigEvent 表示一个调号信息
class KeySigEvent {
Key _key { Key::INVALID }; // -7 -> +7
KeyMode _mode { KeyMode::UNKNOWN };
bool _custom { false };
bool _forInstrumentChange{ false };
QList<KeySym> _keySymbols;
void enforceLimits();
public:
KeySigEvent() {}
KeySigEvent(const KeySigEvent&);
bool operator==(const KeySigEvent& e) const;
bool operator!=(const KeySigEvent& e) const { return !(*this == e); }
void setKey(Key v);
void print() const;
Key key() const { return _key; }
KeyMode mode() const { return _mode; }
void setMode(KeyMode m) { _mode = m; }
bool custom() const { return _custom; }
void setCustom(bool val) { _custom = val; _key = Key::C; }
bool isValid() const { return _key != Key::INVALID; }
bool isAtonal() const { return _mode == KeyMode::NONE; }
void setForInstrumentChange(bool forInstrumentChange) { _forInstrumentChange = forInstrumentChange; }
bool forInstrumentChange() const{ return _forInstrumentChange; }
void initFromSubtype(int); // for backward compatibility
QList<KeySym>& keySymbols() { return _keySymbols; }
const QList<KeySym>& keySymbols() const { return _keySymbols; }
};
KeyList 用来保存 tick 的 调号信息,可以用查询某tick的调号
class KeyList : public std::map<const int, KeySigEvent> {
public:
KeyList() {}
KeySigEvent key(int tick) const;
KeySigEvent prevKey(int tick) const;
void setKey(int tick, KeySigEvent);
int nextKeyTick(int tick) const;
int currentKeyTick(int tick) const;
void read(XmlReader&, Score*);
};
}
Staff 里包含 KeyList
class Staff final : public ScoreElement {
public:
enum class HideMode { AUTO, ALWAYS, NEVER, INSTRUMENT };
private:
Part* _part { 0 };
ClefList clefs;
ClefTypeList _defaultClefType;
KeyList _keys;
调用 Staff::keySigEvent 获得调号
KeySigEvent Staff::keySigEvent(const Fraction& tick) const
{
return _keys.key(tick.ticks());
}非著名程序员,全栈开发工程师,长期专注系统开发与架构设计。
功能待开通!
Measure 小节 Stem 符干 Hook 符尾 Note 符头 Beams 符杠 track 第几轨道声音(每个staff分两个声部,track等于1就是右手第一声部) Articulation 装饰音 Slurs 连句线 Ties 延音线 Tremolo 震音 Tuplets 连音符 velo 力度 Measure rests 多小节休止符 Octave lines 八度线 Grace notes 倚音 TrillSegment 颤音 VOICES 声部(共四个声部) Ledger 加线 Barlines 小节线 Clefs 谱
震音(tremolo) 震音符号两侧,交替弹奏 琶音(arpeggio) 不增加音符数量,和弦内音符依次从高到低或从低到高弹 颤音(trill) 当前音符和比这个音符高两度音,交替弹奏 倚音(grace) 正常弹 逆旋音 音符本身是do,弹奏 do si do re do 回旋音 音符本身do,弹奏 do re do si do 短颤音 音符本身是 do,弹奏 do re do do re do 波音 音符本身是 do,弹奏 do si do do si do
钢琴速度 速度为120的3/4拍曲谱,表示把每分钟分为120份,每份即1/4拍的时间,即每1/4拍0.5s,每小节共3个1/4拍,就是每小节 1.5s。同理速度为60的6/8小节,没1/8拍1s,每小节6s Tempo 表示每秒几排
每个小节被分成多个 Segment,Segment 包含所有开始时间点相同的元素,且 Segment 是有类型的,所以一个 Segment 里的元素类型也是相同的。 SegmentType 定义 enum class SegmentType { ///.\{ Invalid = 0x0, BeginBarLine = 0x1, // 开始小节线 HeaderClef = 0x2, // 曲谱开头 谱号 KeySig = 0x4, // 调号 Amb