//============================================================================= // MuseScore // Linux Music Score Editor // $Id: capella.h 3833 2011-01-04 13:55:40Z wschweer $ // // Copyright (C) 2009 Werner Schweer and others // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License version 2. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. //============================================================================= #ifndef __CAPELLA_H__ #define __CAPELLA_H__ #include "globals.h" enum TIMESTEP { D1, D2, D4, D8, D16, D32, D64, D128, D256, D_BREVE }; #if 0 static const char* timeNames[] = { "1/1", "1/2", "1/4", "1/8", "1/16", "1/32", "1/64", "1/128", "1/256", "breve" }; #endif class Capella; enum CapellaNoteObjectType { T_REST, T_CHORD, T_CLEF, T_KEY, T_METER, T_EXPL_BARLINE, T_IMPL_BARLINE, T_PAGE_BKGR }; enum BEAM_MODE { AUTO_BEAM, FORCE_BEAM, SPLIT_BEAM }; //--------------------------------------------------------- // CapellaObj //--------------------------------------------------------- class CapellaObj { protected: Capella* cap; public: CapellaObj(Capella* c) { cap = c; } }; //--------------------------------------------------------- // NoteObj //--------------------------------------------------------- class NoteObj { CapellaNoteObjectType _type; public: NoteObj(CapellaNoteObjectType t) { _type = t; } CapellaNoteObjectType type() const { return _type; } }; enum FORM { FORM_G, FORM_C, FORM_F, FORM_PERCUSSION, FORM_NULL, CLEF_UNCHANGED }; enum CLEF_LINE { LINE_5, LINE_4, LINE_3, LINE_2, LINE_1 }; enum OCT { OCT_ALTA, OCT_NULL, OCT_BASSA }; //--------------------------------------------------------- // CapClef //--------------------------------------------------------- class CapClef : public NoteObj, public CapellaObj { FORM form; public: CapClef(Capella* c) : NoteObj(T_CLEF), CapellaObj(c) {} void read(); const char* name() { static const char* formName[] = { "G", "C", "F", "=", " ", "*" }; return formName[form]; } ClefType clef() const; CLEF_LINE line; OCT oct; static ClefType clefType(FORM, CLEF_LINE, OCT); }; //--------------------------------------------------------- // CapKey //--------------------------------------------------------- class CapKey : public NoteObj, public CapellaObj { public: CapKey(Capella* c) : NoteObj(T_KEY), CapellaObj(c) {} void read(); int signature; // -7 - +7 }; //--------------------------------------------------------- // CapMeter //--------------------------------------------------------- class CapMeter : public NoteObj, public CapellaObj { public: unsigned char numerator; int log2Denom; bool allaBreve; CapMeter(Capella* c) : NoteObj(T_METER), CapellaObj(c) {} void read(); }; //--------------------------------------------------------- // CapExplicitBarline //--------------------------------------------------------- class CapExplicitBarline : public NoteObj, public CapellaObj { int _type; int _barMode; // 0 = auto, 1 = nur Zeilen, 2 = durchgezogen public: CapExplicitBarline(Capella* c) : NoteObj(T_EXPL_BARLINE), CapellaObj(c) {} void read(); int type() const { return _type; } int barMode() const { return _barMode; } enum { BAR_SINGLE, BAR_DOUBLE, BAR_END, BAR_REPEND, BAR_REPSTART, BAR_REPENDSTART}; }; //--------------------------------------------------------- // CapVoice //--------------------------------------------------------- struct CapVoice { uchar y0Lyrics; uchar dyLyrics; QFont lyricsFont; unsigned char stemDir; QList objects; int voiceNo; }; //--------------------------------------------------------- // CapStaff //--------------------------------------------------------- struct CapStaff { uchar numerator; // default time signature int log2Denom; bool allaBreve; uchar iLayout; int topDistX; int btmDistX; QColor color; QList voices; }; //--------------------------------------------------------- // struct CapStaffLayout //--------------------------------------------------------- struct CapStaffLayout { uchar barlineMode; uchar noteLines; bool bSmall; int topDist; int btmDist; int groupDist; uchar barlineFrom; uchar barlineTo; FORM form; CLEF_LINE line; OCT oct; // clef // Schlagzeuginformation bool bPercussion; // use drum channel bool bSoundMapIn; bool bSoundMapOut; char soundMapIn[128]; // Tabelle für MIDI-Töne iMin...iMin+n-1 char soundMapOut[128]; // Tabelle für MIDI-Töne iMin...iMin+n-1 int sound, volume, transp; char* descr; char* name; char* abbrev; char* intermediateName; char* intermediateAbbrev; }; //--------------------------------------------------------- // CapSystem //--------------------------------------------------------- struct CapSystem { int nAddBarCount; bool bBarCountReset; unsigned char explLeftIndent; // < 0 --> Einrückung gemäß Stimmenbezeichnungen // >= --> explizite Einrückung unsigned char beamMode; unsigned tempo; QColor color; // fuer Systemklammern bool bJustified; // Randausgleich (Blocksatz) bool bPageBreak; // nach dem System neue Seite anfangen int instrNotation; // 0 = keine Instrumentenbezeichnung // 1 = abgekürzt, 2 = vollständig QList staves; }; //--------------------------------------------------------- // BasicDrawObj //--------------------------------------------------------- enum { CAP_GROUP, CAP_TRANSPOSABLE, CAP_METAFILE, CAP_SIMPLE_TEXT, CAP_TEXT, CAP_RECT_ELLIPSE, CAP_LINE, CAP_POLYGON, CAP_WAVY_LINE, CAP_SLUR, CAP_NOTE_LINES, CAP_WEDGE, CAP_VOLTA, CAP_BRACKET, CAP_GUITAR, CAP_TRILL }; class BasicDrawObj : public CapellaObj { public: unsigned char modeX, modeY, distY, flags; int nRefNote; int nNotes; bool background; int pageRange; int type; BasicDrawObj(int t, Capella* c) : CapellaObj(c) { type = t; } void read(); }; //--------------------------------------------------------- // BasicRectObj //--------------------------------------------------------- class BasicRectObj : public BasicDrawObj { public: BasicRectObj(int t, Capella* c) : BasicDrawObj(t, c) {} void read(); QPointF relPos; int width; int yxRatio; int height; }; //--------------------------------------------------------- // GroupObj //--------------------------------------------------------- class GroupObj : public BasicDrawObj { public: GroupObj(Capella* c) : BasicDrawObj(CAP_GROUP, c) {} void read(); QPointF relPos; QList objects; }; //--------------------------------------------------------- // TransposableObj //--------------------------------------------------------- class TransposableObj : public BasicDrawObj { public: TransposableObj(Capella* c) : BasicDrawObj(CAP_TRANSPOSABLE, c) {} void read(); QPointF relPos; char b; QList variants; }; //--------------------------------------------------------- // MetafileObj //--------------------------------------------------------- class MetafileObj : public BasicRectObj { public: MetafileObj(Capella* c) : BasicRectObj(CAP_METAFILE, c) {} void read(); }; //--------------------------------------------------------- // LineObj //--------------------------------------------------------- class LineObj : public BasicDrawObj { public: LineObj(Capella* c) : BasicDrawObj(CAP_LINE, c) {} LineObj(int t, Capella* c) : BasicDrawObj(t, c) {} void read(); QPointF pt1, pt2; QColor color; char lineWidth; }; //--------------------------------------------------------- // RectEllipseObj //--------------------------------------------------------- class RectEllipseObj : public LineObj { // special public: RectEllipseObj(Capella* c) : LineObj(CAP_RECT_ELLIPSE, c) {} void read(); int radius; bool bFilled; QColor clrFill; }; //--------------------------------------------------------- // PolygonObj //--------------------------------------------------------- class PolygonObj : public BasicDrawObj { public: PolygonObj(Capella* c) : BasicDrawObj(CAP_POLYGON, c) {} void read(); bool bFilled; unsigned lineWidth; QColor clrFill; QColor clrLine; }; //--------------------------------------------------------- // WavyLineObj //--------------------------------------------------------- class WavyLineObj : public LineObj { public: WavyLineObj(Capella* c) : LineObj(CAP_WAVY_LINE, c) {} void read(); unsigned waveLen; bool adapt; }; //--------------------------------------------------------- // NotelinesObj //--------------------------------------------------------- class NotelinesObj : public BasicDrawObj { public: NotelinesObj(Capella* c) : BasicDrawObj(CAP_NOTE_LINES, c) {} void read(); int x0, x1, y; QColor color; }; //--------------------------------------------------------- // VoltaObj //--------------------------------------------------------- class VoltaObj : public BasicDrawObj { public: VoltaObj(Capella* c) : BasicDrawObj(CAP_VOLTA, c) {} void read(); int x0, x1, y; QColor color; bool bLeft; bool bRight; bool bDotted; bool allNumbers; int from, to; }; //--------------------------------------------------------- // GuitarObj //--------------------------------------------------------- class GuitarObj : public BasicDrawObj { public: GuitarObj(Capella* c) : BasicDrawObj(CAP_GUITAR, c) {} void read(); QPointF relPos; QColor color; short flags; int strings; // 8 Saiten in 8 Halbbytes }; //--------------------------------------------------------- // TrillObj //--------------------------------------------------------- class TrillObj : public BasicDrawObj { public: TrillObj(Capella* c) : BasicDrawObj(CAP_TRILL, c) {} void read(); int x0, x1, y; QColor color; bool trillSign; }; //--------------------------------------------------------- // SlurObj //--------------------------------------------------------- class SlurObj : public BasicDrawObj { QPointF bezierPoint[4]; QColor color; public: SlurObj(Capella* c) : BasicDrawObj(CAP_SLUR, c) {} void read(); unsigned char nEnd, nMid, nDotDist, nDotWidth; }; //--------------------------------------------------------- // TextObj //--------------------------------------------------------- class TextObj : public BasicRectObj { public: TextObj(Capella* c) : BasicRectObj(CAP_TEXT, c) {} ~TextObj() {} void read(); QString text; }; //--------------------------------------------------------- // SimpleTextObj //--------------------------------------------------------- class SimpleTextObj : public BasicDrawObj { char* _text; QPointF relPos; unsigned char align; QFont _font; public: SimpleTextObj(Capella* c) : BasicDrawObj(CAP_SIMPLE_TEXT, c) { _text = 0;} ~SimpleTextObj() { if (_text) delete _text; } void read(); QString text() const { return QString(_text); } QFont font() const { return _font; } QPointF pos() const { return relPos; } }; //--------------------------------------------------------- // BracketObj //--------------------------------------------------------- class BracketObj : public LineObj { public: BracketObj(Capella* c) : LineObj(CAP_BRACKET, c) {} void read(); char orientation, number; }; //--------------------------------------------------------- // WedgeObj //--------------------------------------------------------- class WedgeObj : public LineObj { public: WedgeObj(Capella* c) : LineObj(CAP_WEDGE, c) {} void read(); int height; bool decresc; }; //--------------------------------------------------------- // BasicDurationalObj //--------------------------------------------------------- class BasicDurationalObj : public CapellaObj { public: int nDots; bool noDuration; bool postGrace; bool bSmall; bool notBlack; QColor color; TIMESTEP t; int horizontalShift; int count; // tuplet bool tripartite; bool isProlonging; public: BasicDurationalObj(Capella* c) : CapellaObj(c) {} void read(); int ticks() const; bool invisible; QList objects; }; //--------------------------------------------------------- // Verse //--------------------------------------------------------- struct Verse { bool leftAlign; bool extender; bool hyphen; int num; QString verseNumber; QString text; }; struct CNote { char pitch; int explAlteration; // 1 force, 2 suppress int headType; int alteration; int silent; }; //--------------------------------------------------------- // ChordObj //--------------------------------------------------------- class ChordObj : public BasicDurationalObj, public NoteObj { public: unsigned char beamMode; char notationStave; char dStemLength; unsigned char nTremoloBars; unsigned articulation; bool leftTie; bool rightTie; char beamShift; char beamSlope; public: ChordObj(Capella*); void read(); QList verse; QList notes; char stemDir; // -1 down, 0 auto, 1 up, 3 no stem }; //--------------------------------------------------------- // RestObj //--------------------------------------------------------- class RestObj : public BasicDurationalObj, public NoteObj { bool bVerticalCentered; int vertShift; public: RestObj(Capella*); void read(); unsigned fullMeasures; // >0, multi measure rest (counting measures) }; //--------------------------------------------------------- // CapFont //--------------------------------------------------------- struct CapFont { QString face; }; //--------------------------------------------------------- // CapBracket //--------------------------------------------------------- struct CapBracket { int from, to; bool curly; }; //--------------------------------------------------------- // Capella //--------------------------------------------------------- class Capella { static const char* errmsg[]; int curPos; QFile* f; char* author; char* keywords; char* comment; unsigned char beamRelMin0; unsigned char beamRelMin1; unsigned char beamRelMax0; unsigned char beamRelMax1; unsigned nRel; // presentation parameter unsigned nAbs; bool bUseRealSize; bool bAllowCompression; bool bPrintLandscape; bool bShowBarCount; // Taktnumerierung zeigen unsigned char barNumberFrame; // 0=kein, 1=Rechteck, 2=Ellipse unsigned char nBarDistX; unsigned char nBarDistY; // LogFont barNumFont; unsigned nFirstPage; // Versatz fuer Seitenzaehlung unsigned leftPageMargins; // Seitenraender unsigned topPageMargins; unsigned rightPageMargins; unsigned btmPageMargins; QList fonts; QList _staffLayouts; // staff layout int interDist; unsigned char txtAlign; // Stimmenbezeichnungen 0=links, 1=zentriert, 2=rechts unsigned char adjustVert; // 0=nein, 1=außer letzte Seite, 3=alle Seiten bool redundantKeys; bool modernDoubleNote; bool bSystemSeparators; int nUnnamed; QFont namesFont; void readVoice(CapStaff*, int); void readStaff(CapSystem*); void readSystem(); protected: void readStaveLayout(CapStaffLayout*, int); void readLayout(); public: enum CapellaError { CAP_NO_ERROR, CAP_BAD_SIG, CAP_EOF, CAP_BAD_VOICE_SIG, CAP_BAD_STAFF_SIG, CAP_BAD_SYSTEM_SIG }; Capella(); ~Capella(); void read(QFile*); QString error(CapellaError n) const { return QString(errmsg[int(n)]); } unsigned char readByte(); char readChar(); QColor readColor(); int readInt(); int readLong(); short readWord(); int readDWord(); unsigned readUnsigned(); char* readString(); void readExtra(); QList readDrawObjectArray(); void read(void* p, qint64 len); QFont readFont(); QPointF readPoint(); QList systems; QList brackets; ChordObj* backgroundChord; CapStaffLayout* staffLayout(int idx) { return _staffLayouts[idx]; } const QList& staffLayouts() const { return _staffLayouts; } double smallLineDist; // spatium unit in metric mm double normalLineDist; int topDist; }; #endif