MuseScore/libmscore/chordlist.h

163 lines
4.6 KiB
C++

//=============================================================================
// MuseScore
// Music Composition & Notation
// $Id:$
//
// Copyright (C) 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 __CHORDLIST_H__
#define __CHORDLIST_H__
class Xml;
class XmlReader;
//---------------------------------------------------------
// class HDegree
//---------------------------------------------------------
enum HDegreeType {
UNDEF, ADD, ALTER, SUBTRACT
};
class HDegree {
int _value;
int _alter; // -1, 0, 1 (b - - #)
int _type;
public:
HDegree() { _value = 0; _alter = 0; _type = UNDEF; }
HDegree(int v, int a, int t) { _value = v; _alter = a; _type = t; }
int value() const { return _value; }
int alter() const { return _alter; }
int type() const { return _type; }
QString text() const;
};
//---------------------------------------------------------
// HChord
//---------------------------------------------------------
class HChord {
QString str;
protected:
int keys;
public:
HChord() { keys = 0; }
HChord(int k) { keys = k; }
HChord(int a, int b, int c=-1, int d=-1, int e=-1, int f=-1, int g=-1,
int h=-1, int i=-1, int k=-1, int l=-1);
HChord(const QString&);
void rotate(int semiTones);
bool contains(int key) const { // key in chord?
return (1 << (key % 12)) & keys;
}
HChord& operator+= (int key) {
keys |= (1 << (key % 12));
return *this;
}
HChord& operator-= (int key) {
keys &= ~(1 << (key % 12));
return *this;
}
bool operator==(const HChord& o) const { return (keys == o.keys); }
bool operator!=(const HChord& o) const { return (keys != o.keys); }
int getKeys() const { return keys; }
void print() const;
QString name(int tpc);
void add(const QList<HDegree>& degreeList);
};
//---------------------------------------------------------
// RenderAction
//---------------------------------------------------------
struct RenderAction {
enum RenderActionType {
RENDER_SET, RENDER_MOVE, RENDER_PUSH, RENDER_POP,
RENDER_NOTE, RENDER_ACCIDENTAL
};
RenderActionType type;
qreal movex, movey; // RENDER_MOVE
QString text; // RENDER_SET
RenderAction() {}
RenderAction(RenderActionType t) : type(t) {}
};
//---------------------------------------------------------
// ChordDescription
//---------------------------------------------------------
struct ChordDescription {
int id; // Chord id number (Band In A Box Chord Number)
QStringList names; // list of alternative chord names
// that will by recognized from keyboard entry (without root/base)
QString xmlKind; // MusicXml description: kind
QStringList xmlDegrees; // MusicXml description: list of degrees (if any)
HChord chord; // C based chord
QList<RenderAction> renderList;
public:
void read(XmlReader&);
void write(Xml&);
};
//---------------------------------------------------------
// ChordSymbol
//---------------------------------------------------------
struct ChordSymbol {
int fontIdx;
QString name;
QChar code;
ChordSymbol() { fontIdx = -1; }
bool isValid() const { return fontIdx != -1; }
};
//---------------------------------------------------------
// ChordFont
//---------------------------------------------------------
struct ChordFont {
QString family;
qreal mag;
};
//---------------------------------------------------------
// ChordList
//---------------------------------------------------------
class ChordList : public QMap<int, ChordDescription*> {
QHash<QString, ChordSymbol> symbols;
public:
QList<ChordFont> fonts;
QList<RenderAction> renderListRoot;
QList<RenderAction> renderListBase;
ChordList() {}
virtual ~ChordList();
void write(Xml& xml);
void read(XmlReader&);
bool read(const QString&);
bool write(const QString&);
ChordSymbol symbol(const QString& s) const { return symbols.value(s); }
};
#endif