File: key.h

package info (click to toggle)
musescore3 3.2.3%2Bdfsg2-11
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 210,672 kB
  • sloc: cpp: 291,093; xml: 200,238; sh: 3,779; ansic: 1,447; python: 393; makefile: 240; perl: 82; pascal: 79
file content (146 lines) | stat: -rw-r--r-- 4,708 bytes parent folder | download | duplicates (4)
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
//=============================================================================
//  MuseScore
//  Music Composition & Notation
//
//  Copyright (C) 2002-2014 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 __KEY__H__
#define __KEY__H__

namespace Ms {

class XmlWriter;
class Score;
class XmlReader;
enum class AccidentalVal : signed char;
enum class ClefType : signed char;

//---------------------------------------------------------
//   Key
//---------------------------------------------------------

enum class Key {
      C_B = -7,
      G_B,
      D_B,
      A_B,
      E_B,
      B_B,
      F,
      C,    // == 0
      G,
      D,
      A,
      E,
      B,
      F_S,
      C_S,
      MIN     = Key::C_B,
      MAX     = Key::C_S,
      INVALID = Key::MIN - 1,
      NUM_OF  = Key::MAX - Key::MIN + 1,
      DELTA_ENHARMONIC = 12
      };

//---------------------------------------------------------
//   KeyMode
//---------------------------------------------------------

enum class KeyMode {
      UNKNOWN = -1,
      NONE,
      MAJOR,
      MINOR
      };

static inline bool operator< (Key a, Key b) { return static_cast<int>(a) < static_cast<int>(b); }
static inline bool operator> (Key a, Key b) { return static_cast<int>(a) > static_cast<int>(b); }
static inline bool operator> (Key a, int b) { return static_cast<int>(a) > b; }
static inline bool operator< (Key a, int b) { return static_cast<int>(a) < b; }
static inline bool operator== (const Key a, const Key b) { return int(a) == int(b); }  
static inline bool operator!= (const Key a, const Key b) { return static_cast<int>(a) != static_cast<int>(b); }
static inline Key operator+= (Key& a, const Key& b) { return a = Key(static_cast<int>(a) + static_cast<int>(b)); }
static inline Key operator-= (Key& a, const Key& b) { return a = Key(static_cast<int>(a) - static_cast<int>(b)); }

enum class SymId;

//---------------------------------------------------------
//   KeySym
//    position of one symbol in KeySig
//---------------------------------------------------------

struct KeySym {
      SymId sym;
      QPointF spos;     // position in spatium units
      QPointF pos;      // actual pixel position on screen (set by layout)
      };

//---------------------------------------------------------
//   KeySigEvent
//---------------------------------------------------------

class KeySigEvent {
      Key _key            { Key::INVALID     };          // -7 -> +7
      KeyMode _mode       { KeyMode::UNKNOWN };
      bool _custom        { 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 initFromSubtype(int);    // for backward compatibility
      QList<KeySym>& keySymbols()             { return _keySymbols; }
      const QList<KeySym>& keySymbols() const { return _keySymbols; }
      };

//---------------------------------------------------------
//   AccidentalState
///   Contains a state for every absolute staff line.
//---------------------------------------------------------

static const int TIE_CONTEXT = 0x10;
static const int MIN_ACC_STATE = 0;
static const int MAX_ACC_STATE = 75;

class AccidentalState {
      uchar state[MAX_ACC_STATE];    // (0 -- 4) | TIE_CONTEXT

   public:
      AccidentalState() {}
      void init(Key key);
      void init(const KeySigEvent&, ClefType);
      AccidentalVal accidentalVal(int line, bool &error) const;
      AccidentalVal accidentalVal(int line) const;
      bool tieContext(int line) const;
      void setAccidentalVal(int line, AccidentalVal val, bool tieContext = false);
      };

struct Interval;
extern Key transposeKey(Key oldKey, const Interval&);


}     // namespace Ms
#endif