MuseScore/mscore/ove.h
2012-05-26 14:49:10 +02:00

2706 lines
55 KiB
C++

//=============================================================================
// MusE Score
// Linux Music Score Editor
// $Id: importove.cpp 3763 2010-12-15 15:52:09Z vanferry $
//
// Copyright (C) 2002-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 OVE_DATA_H
#define OVE_DATA_H
#ifdef WIN32
#define DLL_EXPORT extern "C" __declspec(dllexport)
#else
#define DLL_EXPORT
#endif
namespace OVE {
class OveSong;
class Track;
class Page;
class Voice;
class Line;
class Staff;
class Measure;
class MeasureData;
class MusicData;
class OffsetElement;
class LineElement;
class PairEnds;
class Note;
class NoteContainer;
class Beam;
class Tie;
class Tuplet;
class Harmony;
class Clef;
class Lyric;
class Slur;
class MeasureText;
class Articulation;
class Glissando;
class Decorator;
class MeasureRepeat;
class Dynamics;
class Wedge;
class WedgeEndPoint;
class Pedal;
class KuoHao;
class Expressions;
class HarpPedal;
class MultiMeasureRest;
class OctaveShift;
class OctaveShiftEndPoint;
class BarNumber;
class Tempo;
class Text;
class TimeSignature;
class Key;
class RepeatSymbol;
class NumericEnding;
class MidiData;
class MidiController;
class MidiProgramChange;
class MidiChannelPressure;
class MidiPitchWheel;
const int TWELVE_TONE = 12 ;
const int INVALID_NOTE = -1 ;
const int OCTAVE = 7 ;
enum CondType {
Cond_Time_Parameters = 0x09, // size - 7, TimeSignature
Cond_Bar_Number = 0x0A, // size, compatible with previous version
Cond_Decorator = 0x16,
Cond_Tempo = 0x1C, // size - 7
Cond_Text = 0x1D, // size - 7, Rehearsal | SystemText
Cond_Expression = 0x25, // size - 7, if set playback parameters in Expression, will store in COND
Cond_Barline_Parameters = 0x30, // size - 7, include :|| repeat count
Cond_Repeat = 0x31, //
Cond_Numeric_Ending = 0x32, //
Cond_None
};
enum BdatType {
Bdat_Raw_Note = 0x70,
Bdat_Rest = 0x80,
Bdat_Note = 0x90,
Bdat_Beam = 0x10,
Bdat_Harmony = 0x11,
Bdat_Clef = 0x12,
Bdat_Dynamics = 0x13,
Bdat_Wedge = 0x14, // cresendo, decresendo
Bdat_Glissando = 0x15,
Bdat_Decorator = 0x16, // measure repeat | piano pedal | dotted barline
Bdat_Key = 0x17,
Bdat_Lyric = 0x18,
Bdat_Octave_Shift = 0x19,
Bdat_Slur = 0x1B,
Bdat_Text = 0x1D,
Bdat_Tie = 0x1E,
Bdat_Tuplet = 0x1F,
Bdat_Guitar_Bend = 0x21, //
Bdat_Guitar_Barre = 0x22, //
Bdat_Pedal = 0x23,
Bdat_KuoHao = 0x24, // () [] {}
Bdat_Expressions = 0x25,
Bdat_Harp_Pedal = 0x26,
Bdat_Multi_Measure_Rest = 0x27,
Bdat_Harmony_GuitarFrame = 0x28,
Bdat_Graphics_40 = 0x40, // unknown
Bdat_Graphics_RoundRect = 0x41,
Bdat_Graphics_Rect = 0x42,
Bdat_Graphics_Round = 0x43,
Bdat_Graphics_Line = 0x44,
Bdat_Graphics_Curve = 0x45,
Bdat_Graphics_WedgeSymbol = 0x46,
Bdat_Midi_Controller = 0xAB,
Bdat_Midi_Program_Change = 0xAC,
Bdat_Midi_Channel_Pressure = 0xAD,
Bdat_Midi_Pitch_Wheel = 0xAE,
Bdat_Bar_End = 0xFF,
Bdat_None
};
////////////////////////////////////////
enum MusicDataType {
// attributes
MusicData_Clef,
MusicData_Key,
MusicData_Measure_Repeat,
// sound
MusicData_Tempo,
// direction
MusicData_Dynamics,
MusicData_Wedge,
MusicData_Wedge_EndPoint,
MusicData_OctaveShift,
MusicData_OctaveShift_EndPoint,
MusicData_Expressions,
MusicData_Repeat,
MusicData_Text,
MusicData_Harp_Pedal,
MusicData_Pedal,
// note & harmony
MusicData_Note_Container,
MusicData_Harmony,
// note's children
MusicData_Beam,
MusicData_Glissando,
MusicData_Lyric,
MusicData_Slur,
MusicData_Tie,
MusicData_Tuplet,
// barline
MusicData_Numeric_Ending,
MusicData_KuoHao,
MusicData_Bar_End,
MusicData_Decorator,
MusicData_Multi_Measure_Rest,
MusicData_None
};
enum MidiType {
Midi_Controller = 0,
Midi_Program_Change,
Midi_Channel_Pressure,
Midi_Pitch_Wheel,
Midi_None
};
enum ClefType {
Clef_Treble = 0x00, //0x00
Clef_Bass, //0x01
Clef_Alto, //0x02
Clef_UpAlto, //0x03
Clef_DownDownAlto, //0x04
Clef_DownAlto, //0x05
Clef_UpUpAlto, //0x06
Clef_Treble8va, //0x07
Clef_Bass8va, //0x08
Clef_Treble8vb, //0x09
Clef_Bass8vb, //0x0A
Clef_Percussion1, //0x0B
Clef_Percussion2, //0x0C
Clef_TAB //0x0D
};
enum GroupType {
Group_None = 0,
Group_Brace,
Group_Bracket
};
enum AccidentalType {
Accidental_Normal = 0x0,
Accidental_Sharp = 0x1,
Accidental_Flat = 0x2,
Accidental_Natural = 0x3,
Accidental_DoubleSharp = 0x4,
Accidental_DoubleFlat = 0x5,
Accidental_Sharp_Caution = 0x9,
Accidental_Flat_Caution = 0xA,
Accidental_Natural_Caution = 0xB,
Accidental_DoubleSharp_Caution = 0xC,
Accidental_DoubleFlat_Caution = 0xD
};
enum NoteHeadType {
NoteHead_Standard = 0x00,
NoteHead_Invisible,
NoteHead_Rhythmic_Slash,
NoteHead_Percussion,
NoteHead_Closed_Rhythm,
NoteHead_Open_Rhythm,
NoteHead_Closed_Slash,
NoteHead_Open_Slash,
NoteHead_Closed_Do,
NoteHead_Open_Do,
NoteHead_Closed_Re,
NoteHead_Open_Re,
NoteHead_Closed_Mi,
NoteHead_Open_Mi,
NoteHead_Closed_Fa,
NoteHead_Open_Fa,
NoteHead_Closed_Sol,
NoteHead_Open_Sol,
NoteHead_Closed_La,
NoteHead_Open_La,
NoteHead_Closed_Ti,
NoteHead_Open_Ti
};
enum TiePos {
Tie_None = 0x0,
Tie_LeftEnd = 0x1,
Tie_RightEnd = 0x2
};
enum ArticulationType {
Articulation_Major_Trill = 0x00,
Articulation_Minor_Trill = 0x01,
Articulation_Trill_Section = 0x02,
Articulation_Inverted_Short_Mordent = 0x03,
Articulation_Inverted_Long_Mordent = 0x04,
Articulation_Short_Mordent = 0x05,
Articulation_Turn = 0x06,
Articulation_Finger_1 = 0x07,
Articulation_Finger_2 = 0x08,
Articulation_Finger_3 = 0x09,
Articulation_Finger_4 = 0x0A,
Articulation_Finger_5 = 0x0B,
Articulation_Flat_Accidental_For_Trill = 0x0C,
Articulation_Sharp_Accidental_For_Trill = 0x0D,
Articulation_Natural_Accidental_For_Trill = 0x0E,
Articulation_Marcato = 0x0F,
Articulation_Marcato_Dot = 0x10,
Articulation_Heavy_Attack = 0x11,
Articulation_SForzando = 0x12,
Articulation_SForzando_Dot = 0x13,
Articulation_Heavier_Attack = 0x14,
Articulation_SForzando_Inverted = 0x15,
Articulation_SForzando_Dot_Inverted = 0x16,
Articulation_Staccatissimo = 0x17,
Articulation_Staccato = 0x18,
Articulation_Tenuto = 0x19,
Articulation_Up_Bow = 0x1A,
Articulation_Down_Bow = 0x1B,
Articulation_Up_Bow_Inverted = 0x1C,
Articulation_Down_Bow_Inverted = 0x1D,
Articulation_Arpeggio = 0x1E,
Articulation_Tremolo_Eighth = 0x1F,
Articulation_Tremolo_Sixteenth = 0x20,
Articulation_Tremolo_Thirty_Second = 0x21,
Articulation_Tremolo_Sixty_Fourth = 0x22,
Articulation_Natural_Harmonic = 0x23,
Articulation_Artificial_Harmonic = 0x24,
Articulation_Plus_Sign = 0x25,
Articulation_Fermata = 0x26,
Articulation_Fermata_Inverted = 0x27,
Articulation_Pedal_Down = 0x28,
Articulation_Pedal_Up = 0x29,
Articulation_Pause = 0x2A,
Articulation_Grand_Pause = 0x2B,
Articulation_Toe_Pedal = 0x2C,
Articulation_Heel_Pedal = 0x2D,
Articulation_Toe_To_Heel_Pedal = 0x2E,
Articulation_Heel_To_Toe_Pedal = 0x2F,
Articulation_Open_String = 0x30, // finger 0 in guitar
Articulation_Guitar_Lift = 0x46,
Articulation_Guitar_Slide_Up = 0x47,
Articulation_Guitar_Rip = 0x48,
Articulation_Guitar_Fall_Off = 0x49,
Articulation_Guitar_Slide_Down = 0x4A,
Articulation_Guitar_Spill = 0x4B,
Articulation_Guitar_Flip = 0x4C,
Articulation_Guitar_Smear = 0x4D,
Articulation_Guitar_Bend = 0x4E,
Articulation_Guitar_Doit = 0x4F,
Articulation_Guitar_Plop = 0x50,
Articulation_Guitar_Wow_Wow = 0x51,
Articulation_Guitar_Thumb = 0x64,
Articulation_Guitar_Index_Finger = 0x65,
Articulation_Guitar_Middle_Finger = 0x66,
Articulation_Guitar_Ring_Finger = 0x67,
Articulation_Guitar_Pinky_Finger = 0x68,
Articulation_Guitar_Tap = 0x69,
Articulation_Guitar_Hammer = 0x6A,
Articulation_Guitar_Pluck = 0x6B,
Articulation_None
/* Articulation_Detached_Legato,
Articulation_Spiccato,
Articulation_Scoop,
Articulation_Plop,
Articulation_Doit,
Articulation_Falloff,
Articulation_Breath_Mark,
Articulation_Caesura,*/
};
enum NoteType {
Note_DoubleWhole= 0x0,
Note_Whole = 0x1,
Note_Half = 0x2,
Note_Quarter = 0x3,
Note_Eight = 0x4,
Note_Sixteen = 0x5,
Note_32 = 0x6,
Note_64 = 0x7,
Note_128 = 0x8,
Note_256 = 0x9,
Note_None
};
inline int NoteTypeToTick(NoteType type, int quarter) {
int c = int(pow(2.0, (int)type)) ;
return quarter * 4 * 2 / c ;
}
enum HarmonyType {
Harmony_maj = 0,
Harmony_min,
Harmony_aug,
Harmony_dim,
Harmony_dim7,
Harmony_sus2,
Harmony_sus4,
Harmony_sus24,
Harmony_add2,
Harmony_add9,
Harmony_omit3,
Harmony_omit5,
Harmony_2,
Harmony_5,
Harmony_6,
Harmony_69,
Harmony_7,
Harmony_7b5,
Harmony_7b9,
Harmony_7s9,
Harmony_7s11,
Harmony_7b5s9,
Harmony_7b5b9,
Harmony_7b9s9,
Harmony_7b9s11,
Harmony_7sus4,
Harmony_9,
Harmony_9b5,
Harmony_9s11,
Harmony_9sus4,
Harmony_11,
Harmony_13,
Harmony_13b5,
Harmony_13b9,
Harmony_13s9,
Harmony_13s11,
Harmony_13sus4,
Harmony_min_add2,
Harmony_min_add9,
Harmony_min_maj7,
Harmony_min6,
Harmony_min6_add9,
Harmony_min7,
Harmony_min7b5,
Harmony_min7_add4,
Harmony_min7_add11,
Harmony_min9,
Harmony_min9_b5,
Harmony_min9_maj7,
Harmony_min11,
Harmony_min13,
Harmony_maj7,
Harmony_maj7_b5,
Harmony_maj7_s5,
Harmony_maj7_69,
Harmony_maj7_add9,
Harmony_maj7_s11,
Harmony_maj9,
Harmony_maj9_sus4,
Harmony_maj9_b5,
Harmony_maj9_s5,
Harmony_maj9_s11,
Harmony_maj13,
Harmony_maj13_b5,
Harmony_maj13_b9,
Harmony_maj13_b9b5,
Harmony_maj13_s11,
Harmony_aug7,
Harmony_aug7_b9,
Harmony_aug7_s9,
Harmony_None
};
enum DynamicsType {
Dynamics_pppp = 0,
Dynamics_ppp,
Dynamics_pp,
Dynamics_p,
Dynamics_mp,
Dynamics_mf,
Dynamics_f,
Dynamics_ff,
Dynamics_fff,
Dynamics_ffff,
Dynamics_sf,
Dynamics_fz,
Dynamics_sfz,
Dynamics_sffz,
Dynamics_fp,
Dynamics_sfp
};
enum WedgeType {
Wedge_Cres_Line = 0, // <
Wedge_Double_Line, // <>, not appear in xml
Wedge_Decresc_Line, // >
Wedge_Cres, // cresc., not appear in xml, will create Expression
Wedge_Decresc // decresc., not appear in xml, will create Expression
};
enum KuoHaoType {
KuoHao_Parentheses = 0,
KuoHao_Brace,
KuoHao_Bracket
};
enum OctaveShiftType {
OctaveShift_8 = 0,
OctaveShift_Minus_8,
OctaveShift_15,
OctaveShift_Minus_15
};
enum OctaveShiftPosition {
OctavePosition_Start = 0 ,
OctavePosition_Continue,
OctavePosition_Stop
};
enum RepeatType {
Repeat_Segno = 0,
Repeat_Coda,
Repeat_ToCoda,
Repeat_DSAlCoda,
Repeat_DSAlFine,
Repeat_DCAlCoda,
Repeat_DCAlFine,
Repeat_Fine,
Repeat_Null
};
enum BarlineType {
Barline_Default = 0, //0x00 will be | or final (at last measure)
Barline_Double, //0x01 ||
Barline_RepeatLeft, //0x02 ||:
Barline_RepeatRight, //0x03 :||
Barline_Final, //0x04
Barline_Dashed, //0x05
Barline_Null //0x06
} ;
enum NoteDuration {
NoteDuration_256 = 15,
NoteDuration_128 = NoteDuration_256 * 2, // 30
NoteDuration_64 = NoteDuration_128 * 2, // 60
NoteDuration_32 = NoteDuration_64 * 2, // 120
NoteDuration_16 = NoteDuration_32 * 2, // 240
NoteDuration_8 = NoteDuration_16 * 2, // 480
NoteDuration_4 = NoteDuration_8 * 2, // 960
NoteDuration_2 = NoteDuration_4 * 2, // 1920
NoteDuration_Whole = NoteDuration_2 * 2, // 3840
NoteDuration_Double_Whole = NoteDuration_Whole * 2 // 7680
};
enum ToneType {
Tone_C = 0 ,
Tone_D,
Tone_E,
Tone_F,
Tone_G,
Tone_A,
Tone_B
};
enum KeyType {
Key_C = 0, // C
Key_Bass_1, // F
Key_Bass_2, // Bb
Key_Bass_3, // Eb
Key_Bass_4, // Ab
Key_Bass_5, // Db
Key_Bass_6, // Gb
Key_Bass_7, // Cb
Key_Sharp_1, // G
Key_Sharp_2, // D
Key_Sharp_3, // A
Key_Sharp_4, // E
Key_Sharp_5, // B
Key_Sharp_6, // F#
Key_Sharp_7 // C#
};
// IOveNotify.h
class IOveNotify {
public:
IOveNotify() {}
virtual ~IOveNotify() {}
public:
virtual void loadInfo(const QString& info) = 0;
virtual void loadError() = 0;
virtual void loadPosition(int currentMeasure, int totalMeasure, int currentTrack, int totalTrack) = 0;
};
class IOVEStreamLoader {
public:
IOVEStreamLoader() {}
virtual ~IOVEStreamLoader() {}
public:
virtual void setNotify(IOveNotify* notify) = 0;
virtual void setFileStream(unsigned char* buffer, unsigned int size) = 0;
virtual void setOve(OveSong* ove) = 0;
// read stream, set readed data to setOve(ove)
virtual bool load() = 0;
virtual void release() = 0;
};
DLL_EXPORT IOVEStreamLoader* createOveStreamLoader();
/////////////////////////////////////////////////////////////////////////////
// basic element
class TickElement {
public:
TickElement();
virtual ~TickElement() {}
public:
void setTick(int tick);
int getTick(void) const;
private:
int tick_;
};
class MeasurePos {
public:
MeasurePos();
virtual ~MeasurePos() {}
public:
void setMeasure(int measure);
int getMeasure() const;
void setOffset(int offset);
int getOffset() const;
MeasurePos shiftMeasure(int measure) const;
MeasurePos shiftOffset(int offset) const; // ignore cross measure
bool operator ==(const MeasurePos& mp) const;
bool operator !=(const MeasurePos& mp) const;
bool operator <(const MeasurePos& mp) const;
bool operator <=(const MeasurePos& mp) const;
bool operator >(const MeasurePos& mp) const;
bool operator >=(const MeasurePos& mp) const;
private:
int measure_;
int offset_;
};
class PairElement {
public:
PairElement();
virtual ~PairElement();
public:
MeasurePos* start() const;
MeasurePos* stop() const;
private:
MeasurePos* start_;
MeasurePos* stop_;
};
class PairEnds {
public:
PairEnds();
virtual ~PairEnds();
public:
LineElement* getLeftLine() const;
LineElement* getRightLine() const;
OffsetElement* getLeftShoulder() const;
OffsetElement* getRightShoulder() const;
private:
LineElement* leftLine_;
LineElement* rightLine_;
OffsetElement* leftShoulder_;
OffsetElement* rightShoulder_;
};
class LineElement {
public:
LineElement();
virtual ~LineElement() {}
public:
virtual void setLine(int line); // middle line (3rd line of each clef) is set 0
virtual int getLine(void) const;
private:
int line_;
};
class OffsetElement {
public:
OffsetElement();
virtual ~OffsetElement() {}
public:
virtual void setXOffset(int offset);
virtual int getXOffset() const;
virtual void setYOffset(int offset);
virtual int getYOffset() const;
private:
int xOffset_;
int yOffset_;
};
class LengthElement {
public:
LengthElement();
virtual ~LengthElement() {}
public:
void setLength(int length);
int getLength() const;
private:
int length_; // tick
};
// base class of many ove music element
class MusicData: public TickElement, public PairElement, public OffsetElement {
public:
MusicData();
virtual ~MusicData() {}
public:
MusicDataType getMusicDataType() const;
enum XmlDataType {
Attributes = 0, NoteBeam, Notations, Direction, None
};
static XmlDataType getXmlDataType(MusicDataType type);
// static bool get_is_pair_element(MusicDataType type) ;
// show / hide
void setShow(bool show);
bool getShow() const;
// color
void setColor(unsigned int color); // not exists in ove 3
unsigned int getColor() const;
void setVoice(unsigned int voice);
unsigned int getVoice() const;
void copyCommonBlock(const MusicData& source);
protected:
MusicDataType musicDataType_;
private:
bool show_;
unsigned int color_;
unsigned int voice_;
};
class MidiData: public TickElement {
public:
MidiData();
virtual ~MidiData() {}
public:
MidiType getMidiType() const;
protected:
MidiType midiType_;
};
////////////////////////////////////////////////////////////////////////////////
class OveSong {
public:
OveSong();
~OveSong();
public:
void setIsVersion4(bool version4 = true);
bool getIsVersion4() const;
void setQuarter(int tick);
int getQuarter(void) const;
void setShowPageMargin(bool show);
bool getShowPageMargin() const;
void setShowTransposeTrack(bool show);
bool getShowTransposeTrack() const;
void setShowLineBreak(bool show);
bool getShowLineBreak() const;
void setShowRuler(bool show);
bool getShowRuler() const;
void setShowColor(bool show);
bool getShowColor() const;
void setPlayRepeat(bool play);
bool getPlayRepeat() const;
enum PlayStyle{
Record, Swing, Notation
};
void setPlayStyle(PlayStyle style);
PlayStyle getPlayStyle() const;
void addTitle(const QString& str);
QList<QString> getTitles(void) const;
void addAnnotate(const QString& str);
QList<QString> getAnnotates(void) const;
void addWriter(const QString& str);
QList<QString> getWriters(void) const;
void addCopyright(const QString& str);
QList<QString> getCopyrights(void) const;
void addHeader(const QString& str);
QList<QString> getHeaders(void) const;
void addFooter(const QString& str);
QList<QString> getFooters(void) const;
void addTrack(Track* ptr);
int getTrackCount(void) const;
QList<Track*> getTracks() const;
Track* getTrack(int part, int staff) const;
void setTrackBarCount(int count);
int getTrackBarCount() const;
bool addPage(Page* page);
int getPageCount() const;
Page* getPage(int idx);
void addLine(Line* ptr);
int getLineCount() const;
Line* getLine(int idx) const;
void addMeasure(Measure* ptr);
int getMeasureCount(void) const;
Measure* getMeasure(int bar) const;
void addMeasureData(MeasureData* ptr);
int getMeasureDataCount(void) const;
MeasureData* getMeasureData(int part, int staff/*=0*/, int bar) const;
MeasureData* getMeasureData(int track, int bar) const;
// tool
void setPartStaffCounts(const QList<int>& partStaffCounts);
int getPartCount() const;
int getStaffCount(int part) const;
int getPartBarCount() const;
void clear(void);
QPair<int, int> trackToPartStaff(int track) const;
void setTextCodecName(const QString& codecName);
QString getCodecString(const QByteArray& text);
private:
int partStaffToTrack(int part, int staff) const;
private:
bool version4_;
int quarter_;
bool showPageMargin_;
bool showTransposeTrack;
bool showLineBreak_;
bool showRuler_;
bool showColor_;
bool playRepeat_;
PlayStyle playStyle_;
QList<QString> titles_;
QList<QString> annotates_;
QList<QString> writers_;
QList<QString> copyrights_;
QList<QString> headers_;
QList<QString> footers_;
QList<Track*> tracks_;
QList<Page*> pages_;
QList<Line*> lines_;
QList<Measure*> measures_;
QList<MeasureData*> measureDatas_;
int trackBarCount_; //equal to measures_.size()
QList<int> partStaffCounts_;
QTextCodec* codec_;
};
class Voice {
public:
Voice();
~Voice(){}
public:
void setChannel(int channel);
int getChannel() const;
void setVolume(int volume);
int getVolume() const;
void setPitchShift(int pitchShift);
int getPitchShift() const;
void setPan(int pan);
int getPan() const;
void setPatch(int patch);
int getPatch() const;
void setStemType(int stemType);
int getStemType() const;
static int getDefaultPatch();
static int getDefaultVolume();
private:
int channel_; // [0, 15]
int volume_; // [-1, 127], -1 default
int pitchShift_; // [-36, 36]
int pan_; // [-64, 63]
int patch_; // [0, 127]
int stemType_; // 0, 1, 2
};
class Track {
public:
Track();
~Track();
public:
void setName(const QString& str);
QString getName(void) const;
void setBriefName(const QString& str);
QString getBriefName(void) const;
void setPatch(unsigned int patch); // -1: percussion
unsigned int getPatch() const;
void setChannel(int channel);
int getChannel() const;
void setShowName(bool show);
bool getShowName() const;
void setShowBriefName(bool show);
bool getShowBriefName() const;
void setMute(bool mute);
bool getMute() const;
void setSolo(bool solo);
bool getSolo() const;
void setShowKeyEachLine(bool show);
bool getShowKeyEachLine() const;
void setVoiceCount(int voices);
int getVoiceCount() const;
void addVoice(Voice* voice);
QList<Voice*> getVoices() const;
void setShowTranspose(bool show);
bool getShowTranspose() const;
void setTranspose(int transpose);
int getTranspose() const;
void setNoteShift(int shift);
int getNoteShift() const;
void setStartClef(int clef/*in ClefType*/);
ClefType getStartClef() const;
void setTransposeClef(int clef);
int getTansposeClef() const;
void setStartKey(int key/*in KeyType*/);
int getStartKey() const;
void setDisplayPercent(unsigned int percent/*25~100*/);
unsigned int getDisplayPercent() const;
void setShowLegerLine(bool show);
bool getShowLegerLine() const;
void setShowClef(bool show);
bool getShowClef() const;
void setShowTimeSignature(bool show);
bool getShowTimeSignature() const;
void setShowKeySignature(bool show);
bool getShowKeySignature() const;
void setShowBarline(bool show);
bool getShowBarline() const;
void setFillWithRest(bool fill);
bool getFillWithRest() const;
void setFlatTail(bool flat);
bool getFlatTail() const;
void setShowClefEachLine(bool show);
bool getShowClefEachLine() const;
struct DrumNode {
int line_;
int headType_;
int pitch_;
int voice_;
public:
DrumNode():line_(0), headType_(0), pitch_(0), voice_(0){}
};
void addDrum(const DrumNode& node);
QList<DrumNode> getDrumKit() const;
void clear(void);
/////////////////////////////////////////////////
void setPart(int part);
int getPart() const;
private:
int number_;
QString name_;
QString briefName_;
unsigned int patch_;
int channel_;
int transpose_;
bool showTranspose_;
int noteShift_;
int startClef_;
int transposeClef_;
unsigned int displayPercent_;
int startKey_;
int voiceCount_;
QList<Voice*> voices_;
bool showName_;
bool showBriefName_;
bool showKeyEachLine_;
bool showLegerLine_;
bool showClef_;
bool showTimeSignature_;
bool showKeySignature_;
bool showBarline_;
bool showClefEachLine_;
bool fillWithRest_;
bool flatTail_;
bool mute_;
bool solo_;
QList<DrumNode> drumKit_;
//////////////////////////////
int part_;
};
class Page {
public:
Page();
~Page(){}
public:
void setBeginLine(int line);
int getBeginLine() const;
void setLineCount(int count);
int getLineCount() const;
void setLineInterval(int interval); // between system
int getLineInterval() const;
void setStaffInterval(int interval);
int getStaffInterval() const;
void setStaffInlineInterval(int interval); // between treble-bass staff
int getStaffInlineInterval() const;
void setLineBarCount(int count);
int getLineBarCount() const;
void setPageLineCount(int count);
int getPageLineCount() const;
void setLeftMargin(int margin);
int getLeftMargin() const;
void setTopMargin(int margin);
int getTopMargin() const;
void setRightMargin(int margin);
int getRightMargin() const;
void setBottomMargin(int margin);
int getBottomMargin() const;
void setPageWidth(int width);
int getPageWidth() const;
void setPageHeight(int height);
int getPageHeight() const;
private:
int beginLine_;
int lineCount_;
int lineInterval_;
int staffInterval_;
int staffInlineInterval_;
int lineBarCount_;
int pageLineCount_;
int leftMargin_;
int topMargin_;
int rightMargin_;
int bottomMargin_;
int pageWidth_;
int pageHeight_;
};
class Line {
public:
Line();
~Line();
public:
void addStaff(Staff* staff);
int getStaffCount() const;
Staff* getStaff(int idx) const;
void setBeginBar(unsigned int bar);
unsigned int getBeginBar() const;
void setBarCount(unsigned int count);
unsigned int getBarCount() const;
void setYOffset(int offset);
int getYOffset() const;
void setLeftXOffset(int offset);
int getLeftXOffset() const;
void setRightXOffset(int offset);
int getRightXOffset() const;
private:
QList<Staff*> staffs_;
unsigned int beginBar_;
unsigned int barCount_;
int yOffset_;
int leftXOffset_;
int rightXOffset_;
};
class Staff : public OffsetElement {
public:
Staff();
virtual ~Staff(){}
public:
void setClefType(int clef);
ClefType getClefType() const;
void setKeyType(int key);
int getKeyType() const;
void setVisible(bool visible);
bool setVisible() const;
void setGroupType(GroupType type);
GroupType getGroupType() const;
void setGroupStaffCount(int count);
int getGroupStaffCount() const;
private:
ClefType clef_;
int key_;
bool visible_;
GroupType groupType_;
int groupStaffCount_;
};
///////////////////////////////////////////////////////////////////////////////
class Note : public LineElement {
public:
Note();
virtual ~Note(){}
public:
void setIsRest(bool rest);
bool getIsRest() const;
void setNote(unsigned int note);
unsigned int getNote() const;
void setAccidental(int type); //AccidentalType
AccidentalType getAccidental() const;
void setShowAccidental(bool show);
bool getShowAccidental() const;
void setOnVelocity(unsigned int velocity);
unsigned int getOnVelocity() const;
void setOffVelocity(unsigned int velocity);
unsigned int getOffVelocity() const;
void setHeadType(int type); //NoteHeadType
NoteHeadType getHeadType() const;
void setTiePos(int tiePos);
TiePos getTiePos() const;
void setOffsetStaff(int offset); // cross staff notes
int getOffsetStaff() const;
void setShow(bool show);
bool getShow() const;
void setOffsetTick(int offset);
int getOffsetTick() const;
private:
bool rest_;
unsigned int note_;
AccidentalType accidental_;
bool showAccidental_;
unsigned int onVelocity_;
unsigned int offVelocity_;
NoteHeadType headType_;
TiePos tiePos_;
int offsetStaff_;
bool show_;
int offsetTick_;//for playback
};
class Articulation : public OffsetElement {
public:
Articulation();
virtual ~Articulation(){}
public:
void setArtType(int type);//ArticulationType
ArticulationType getArtType() const;
void setPlacementAbove(bool above);
bool getPlacementAbove() const;
// for midi
bool willAffectNotes() const;
static bool isTrill(ArticulationType type);
// for xml
enum XmlType {
Xml_Articulation,
Xml_Technical,
Xml_Arpeggiate,
Xml_Ornament,
Xml_Fermata,
Xml_Direction,
Xml_Unknown
};
XmlType getXmlType() const;
// sound setting
bool getChangeSoundEffect() const;
void setSoundEffect(int soundFrom, int soundTo);
QPair<int, int> getSoundEffect() const;
bool getChangeLength() const;
void setLengthPercentage(int percentage);
int getLengthPercentage() const;
bool getChangeVelocity() const;
enum VelocityType
{
Velocity_Offset,
Velocity_SetValue,
Velocity_Percentage
};
void setVelocityType(VelocityType type);
VelocityType getVelocityType() const;
void setVelocityValue(int value);
int getVelocityValue() const;
bool getChangeExtraLength() const;
void setExtraLength(int length);
int getExtraLength() const;
// trill
enum TrillInterval {
TrillInterval_Diatonic = 0,
TrillInterval_Chromatic,
TrillInterval_Whole
};
void setTrillInterval(int interval);
TrillInterval getTrillInterval() const;
void setAuxiliaryFirst(bool first);
bool getAuxiliaryFirst() const;
void setTrillRate(NoteType rate);
NoteType getTrillRate() const;
void setTrillNoteLength(int length);
int getTrillNoteLength() const;
enum AccelerateType {
Accelerate_None = 0 ,
Accelerate_Slow,
Accelerate_Normal,
Accelerate_Fast
};
void setAccelerateType(int type);
AccelerateType getAccelerateType() const;
private:
ArticulationType type_;
bool above_;
bool changeSoundEffect_;
QPair<int, int> soundEffect_;
bool changeLength_;
int lengthPercentage_;
bool changeVelocity_;
VelocityType velocityType_;
int velocityValue_;
bool changeExtraLength_;
int extraLength_;
// trill
TrillInterval trillInterval_;
bool auxiliaryFirst_;
NoteType trillRate_;
int trillNoteLength_;
AccelerateType accelerateType_;
};
class NoteContainer : public MusicData, public LengthElement {
public:
NoteContainer();
virtual ~NoteContainer();
public:
void setIsGrace(bool grace);
bool getIsGrace() const;
void setIsCue(bool cue);
bool getIsCue() const;
void setIsRest(bool rest/*or note*/);
bool getIsRest() const;
void setIsRaw(bool raw);
bool getIsRaw() const;
void setNoteType(NoteType type);
NoteType getNoteType() const;
void setDot(int dot);
int getDot() const;
void setGraceNoteType(NoteType type);
NoteType getGraceNoteType() const;
void setInBeam(bool in);
bool getInBeam() const;
void setStemUp(bool up);
bool getStemUp(void) const;
void setShowStem(bool show);
bool getShowStem() const;
void setStemLength(int line);
int getStemLength() const;
void setTuplet(int tuplet);
int getTuplet() const;
void setSpace(int space);
int getSpace() const;
void addNoteRest(Note* note);
QList<Note*> getNotesRests() const;
void addArticulation(Articulation* art);
QList<Articulation*> getArticulations() const;
void setNoteShift(int octave);
int getNoteShift() const;
int getOffsetStaff() const;
int getDuration() const;
private:
bool grace_;
bool cue_;
bool rest_;
bool raw_;
NoteType noteType_;
int dot_;
NoteType graceNoteType_;
int tuplet_;
int space_;
bool inBeam_;
bool stemUp_;
bool showStem_;
int stemLength_; // line count span
int noteShift_;
QList<Note*> notes_;
QList<Articulation*> articulations_;
};
class Beam : public MusicData, public PairEnds {
public:
Beam();
virtual ~Beam(){}
public:
void setIsGrace(bool grace);
bool getIsGrace() const;
void addLine(const MeasurePos& startMp, const MeasurePos& endMp);
const QList<QPair<MeasurePos, MeasurePos> > getLines() const;
private:
bool grace_;
QList<QPair<MeasurePos, MeasurePos> > lines_;
};
class Tie : public MusicData, public PairEnds {
public:
Tie();
virtual ~Tie(){}
public:
void setShowOnTop(bool top);
bool getShowOnTop() const;
void setNote(int note);// note value tie point to
int getNote() const;
void setHeight(int height);
int getHeight() const;
private:
bool showOnTop_;
int note_;
int height_;
};
class Glissando : public MusicData, public PairEnds {
public:
Glissando();
virtual ~Glissando(){}
public:
void setStraightWavy(bool straight);
bool getStraightWavy() const;
void setText(const QString& text);
QString getText() const;
void setLineThick(int thick);
int getLineThick() const;
private:
bool straight_;
QString text_;
int lineThick_;
};
class Decorator : public MusicData {
public:
Decorator();
virtual ~Decorator(){}
public:
enum DecoratorType {
Decorator_Dotted_Barline = 0,
Decorator_Articulation
};
void setDecoratorType(DecoratorType type);
DecoratorType getDecoratorType() const;
void setArticulationType(ArticulationType type);
ArticulationType getArticulationType() const;
private:
DecoratorType decoratorType_;
ArticulationType artType_;
};
class MeasureRepeat : public MusicData {
public:
MeasureRepeat();
virtual ~MeasureRepeat(){}
public:
void setSingleRepeat(bool single); // false : double
bool getSingleRepeat() const;
private:
bool singleRepeat_;
};
class Tuplet : public MusicData, public PairEnds {
public:
Tuplet();
virtual ~Tuplet();
public:
void setTuplet(int tuplet=3);
int getTuplet() const;
void setSpace(int space=2);
int getSpace() const;
void setHeight(int height);
int getHeight() const;
void setNoteType(NoteType type);
NoteType getNoteType() const;
OffsetElement* getMarkHandle() const;
private:
int tuplet_;
int space_;
int height_;
NoteType noteType_;
OffsetElement* mark_;
};
class Harmony : public MusicData, public LengthElement {
public:
Harmony();
virtual ~Harmony(){}
public:
void setHarmonyType(HarmonyType type);
HarmonyType getHarmonyType() const;
void setRoot(int root=0);//C
int getRoot() const;
void setBass(int bass);
int getBass() const;
void setBassOnBottom(bool on);
bool getBassOnBottom() const;
void setAngle(int angle);
int getAngle() const;
private:
HarmonyType harmonyType_;
int root_;
int bass_;
bool bassOnBottom_;
int angle_;
};
class Clef : public MusicData, public LineElement {
public:
Clef();
virtual ~Clef(){}
public:
void setClefType(int type); // ClefType
ClefType getClefType() const;
private:
ClefType clefType_;
};
class Lyric : public MusicData {
public:
Lyric();
virtual ~Lyric(){}
public:
void setLyric(const QString& lyricText);
QString getLyric() const;
void setVerse(int verse);
int getVerse() const;
private:
QString lyric_;
int verse_;
};
class Slur: public MusicData, public PairEnds {
public:
Slur();
virtual ~Slur();
public:
void setContainerCount(int count); // span
int getContainerCount() const;
void setShowOnTop(bool top);
bool getShowOnTop() const;
OffsetElement* getHandle2() const;
OffsetElement* getHandle3() const;
void setNoteTimePercent(int percent); // 50% ~ 200%
int getNoteTimePercent() const;
private:
int containerCount_;
bool showOnTop_;
int noteTimePercent_;
OffsetElement* handle_2_;
OffsetElement* handle_3_;
};
class Dynamics: public MusicData {
public:
Dynamics();
virtual ~Dynamics() {}
public:
void setDynamicsType(int type);//DynamicsType
DynamicsType getDynamicsType() const;
void setIsPlayback(bool play);
bool getIsPlayback() const;
void setVelocity(int vel);
int getVelocity() const;
private:
DynamicsType dynamicsType_;
bool playback_;
int velocity_;
};
class WedgeEndPoint: public MusicData {
public:
WedgeEndPoint();
virtual ~WedgeEndPoint() {}
public:
void setWedgeType(WedgeType type);
WedgeType getWedgeType() const;
void setHeight(int height);
int getHeight() const;
void setWedgeStart(bool wedgeStart);
bool getWedgeStart() const;
private:
int height_;
WedgeType wedgeType_;
bool wedgeStart_;
};
class Wedge: public MusicData {
public:
Wedge();
virtual ~Wedge() {}
public:
void setWedgeType(WedgeType type);
WedgeType getWedgeType() const;
void setHeight(int height);
int getHeight() const;
private:
int height_;
WedgeType wedgeType_;
};
class Pedal: public MusicData, public PairEnds {
public:
Pedal();
virtual ~Pedal();
public:
void setHalf(bool half);
bool getHalf() const;
void setIsPlayback(bool playback);
bool getIsPlayback() const;
void setPlayOffset(int offset); // -127~127
int getPlayOffset() const;
OffsetElement* getPedalHandle() const; //only on half pedal
private:
bool half_;
bool playback_;
int playOffset_;
OffsetElement* pedalHandle_;
};
class KuoHao: public MusicData, public PairEnds {
public:
KuoHao();
virtual ~KuoHao() {}
public:
void setHeight(int height);
int getHeight() const;
void setKuohaoType(int type);// KuoHaoType
KuoHaoType getKuohaoType() const;
private:
int height_;
KuoHaoType kuohaoType_;
};
class Expressions: public MusicData {
public:
Expressions();
virtual ~Expressions() {}
public:
void setText(const QString& str);
QString getText() const;
private:
QString text_;
};
class HarpPedal: public MusicData {
public:
HarpPedal();
virtual ~HarpPedal() {}
public:
void setShowType(int type);//0:graph, 1:char, 2:char cut, 3:change
int getShowType() const;
void setShowCharFlag(int flag);//each bit is a bool, total 7 bools
int getShowCharFlag() const;
private:
int showType_;
int showCharFlag_;
};
class OctaveShift: public MusicData, public LengthElement {
public:
OctaveShift();
virtual ~OctaveShift() {}
public:
void setOctaveShiftType(int type);
OctaveShiftType getOctaveShiftType() const;
int getNoteShift() const;
void setEndTick(int tick);
int getEndTick() const;
private:
OctaveShiftType octaveShiftType_;
OctaveShiftPosition octaveShiftPosition_;
int endTick_;
};
class OctaveShiftEndPoint: public MusicData, public LengthElement {
public:
OctaveShiftEndPoint();
virtual ~OctaveShiftEndPoint() {}
public:
void setOctaveShiftType(int type);
OctaveShiftType getOctaveShiftType() const;
void setOctaveShiftPosition(int position);
OctaveShiftPosition getOctaveShiftPosition() const;
void setEndTick(int tick);
int getEndTick() const;
private:
OctaveShiftType octaveShiftType_;
OctaveShiftPosition octaveShiftPosition_;
int endTick_;
};
class MultiMeasureRest: public MusicData {
public:
MultiMeasureRest();
virtual ~MultiMeasureRest() {}
public:
void setMeasureCount(int count);
int getMeasureCount() const;
private:
int measureCount_;
};
class Tempo: public MusicData {
public:
Tempo();
virtual ~Tempo() {}
public:
void setLeftNoteType(int type);//NoteType
NoteType getLeftNoteType() const;
void setShowMark(bool show);
bool getShowMark() const;
void setShowBeforeText(bool show);
bool getShowBeforeText() const;
void setShowParenthesis(bool show);
bool getShowParenthesis() const;
void setTypeTempo(int tempo); //0x2580 = 96.00
int getTypeTempo() const;
int getQuarterTempo() const;
void setLeftText(const QString& str);// string at left of the mark
QString getLeftText() const;
void setRightText(const QString& str);
QString getRightText() const;
void setSwingEighth(bool swing);
bool getSwingEighth() const;
void setRightNoteType(int type);
int getRightNoteType() const;
private:
int leftNoteType_;
bool showMark_;
bool showText_;
bool showParenthesis_;
int typeTempo_;
QString leftText_;
QString rightText_;
bool swingEighth_;
int rightNoteType_;
};
class Text: public MusicData, public LengthElement {
public:
Text();
virtual ~Text() {}
public:
enum TextType {
Text_Rehearsal,
Text_SystemText,
Text_MeasureText
};
void setTextType(TextType type);
TextType getTextType() const;
void setHorizontalMargin(int margin);
int getHorizontalMargin() const;
void setVerticalMargin(int margin);
int getVerticalMargin() const;
void setLineThick(int thick);
int getLineThick() const;
void setText(const QString& text);
QString getText() const;
void setWidth(int width);
int getWidth() const;
void setHeight(int height);
int getHeight() const;
private:
TextType textType_;
int horiMargin_;
int vertMargin_;
int lineThick_;
QString text_;
int width_;
int height_;
};
///////////////////////////////////////////////////////////////////////////////
class TimeSignature: public MusicData {
public:
TimeSignature();
virtual ~TimeSignature() {}
public:
void setNumerator(int numerator);
int getNumerator() const;
void setDenominator(int denominator);
int getDenominator() const;
void setIsSymbol(bool symbol); //4/4:common, 2/2:cut
bool getIsSymbol() const;
void setBeatLength(int length); // tick
int getBeatLength() const;
void setBarLength(int length); // tick
int getBarLength() const;
void addBeat(int startUnit, int lengthUnit, int startTick);
void endAddBeat();
int getUnits() const;
void setReplaceFont(bool replace);
bool getReplaceFont() const;
void setShowBeatGroup(bool show);
bool getShowBeatGroup() const;
void setGroupNumerator1(int numerator);
void setGroupNumerator2(int numerator);
void setGroupNumerator3(int numerator);
void setGroupDenominator1(int denominator);
void setGroupDenominator2(int denominator);
void setGroupDenominator3(int denominator);
void setBeamGroup1(int count);
void setBeamGroup2(int count);
void setBeamGroup3(int count);
void setBeamGroup4(int count);
void set16thBeamCount(int count);
void set32thBeamCount(int count);
private:
int numerator_;
int denominator_;
bool isSymbol_;
int beatLength_;
int barLength_;
struct BeatNode {
int startUnit_;
int lengthUnit_;
int startTick_;
BeatNode() :
startUnit_(0),
lengthUnit_(0),
startTick_(0) {
}
};
QList<BeatNode> beats_;
int barLengthUnits_;
bool replaceFont_;
bool showBeatGroup_;
int groupNumerator1_;
int groupNumerator2_;
int groupNumerator3_;
int groupDenominator1_;
int groupDenominator2_;
int groupDenominator3_;
int beamGroup1_;
int beamGroup2_;
int beamGroup3_;
int beamGroup4_;
int beamCount16th_;
int beamCount32th_;
};
class Key: public MusicData {
public:
Key();
virtual ~Key() {}
public:
void setKey(int key); //C=0x0, G=0x8, C#=0xE, F=0x1, Db=0x7
int getKey() const;
bool getSetKey() const;
void setPreviousKey(int key);
int getPreviousKey() const;
void setSymbolCount(int count);
int getSymbolCount() const;
private:
int key_;
bool set_;
int previousKey_;
int symbolCount_;
};
class RepeatSymbol: public MusicData {
public:
RepeatSymbol();
virtual ~RepeatSymbol() {}
public:
void setText(const QString& text);
QString getText() const;
void setRepeatType(int repeatType);
RepeatType getRepeatType() const;
private:
QString text_;
RepeatType repeatType_;
};
class NumericEnding: public MusicData, public PairEnds {
public:
NumericEnding();
virtual ~NumericEnding();
public:
OffsetElement* getNumericHandle() const;
void setHeight(int height);
int getHeight() const;
void setText(const QString& text);
QString getText() const;
QList<int> getNumbers() const;
int getJumpCount() const;
private:
int height_;
QString text_;
OffsetElement* numericHandle_;
};
class BarNumber: public MusicData {
public:
BarNumber();
virtual ~BarNumber() {}
public:
void setIndex(int index);
int getIndex() const;
void setShowOnParagraphStart(bool show);
bool getShowOnParagraphStart() const;
void setAlign(int align);// 0:left, 1:center, 2:right
int getAlign() const;
void setShowFlag(int flag); // 0:page, 1:staff, 2:bar, 3:none
int getShowFlag() const;
void setShowEveryBarCount(int count);
int getShowEveryBarCount() const;
void setPrefix(const QString& str);
QString getPrefix() const;
private:
int index_;
bool showOnParagraphStart_;
int align_;
int showFlag_;
int barRange_;
QString prefix_;
};
///////////////////////////////////////////////////////////////////////////////
// MIDI
class MidiController: public MidiData {
public:
MidiController();
virtual ~MidiController() {}
public:
void setController(int number);
int getController() const;
void setValue(int value);
int getValue() const;
private:
int controller_;
int value_;
};
class MidiProgramChange: public MidiData {
public:
MidiProgramChange();
virtual ~MidiProgramChange() {}
public:
void setPatch(int patch);
int getPatch() const;
private:
int patch_;
};
class MidiChannelPressure: public MidiData {
public:
MidiChannelPressure();
virtual ~MidiChannelPressure() {}
public:
void setPressure(int pressure);
int getPressure() const;
private:
int pressure_;
};
class MidiPitchWheel: public MidiData {
public:
MidiPitchWheel();
virtual ~MidiPitchWheel() {}
public:
void setValue(int value);
int getValue() const;
private:
int value_;
};
///////////////////////////////////////////////////////////////////////////////
class Measure: public LengthElement {
public:
Measure(int index = 0);
virtual ~Measure();
private:
Measure();
public:
BarNumber* getBarNumber() const;
TimeSignature* getTime() const;
void setLeftBarline(int barline/*in BarlineType*/);
BarlineType getLeftBarline() const;
void setRightBarline(int barline/*in BarlineType*/);
BarlineType getRightBarline() const;
// set when rightBarline == Baline_Backward
void setBackwardRepeatCount(int repeatCount);
int getBackwardRepeatCount() const;
void setTypeTempo(double tempo);
double getTypeTempo() const;
void setIsPickup(bool pickup);
bool getIsPickup() const;
void setIsMultiMeasureRest(bool rest);
bool getIsMultiMeasureRest() const;
void setMultiMeasureRestCount(int count);
int getMultiMeasureRestCount() const;
private:
void clear();
BarNumber* barNumber_;
TimeSignature* time_;
BarlineType leftBarline_;
BarlineType rightBarline_;
int repeatCount_;
double typeTempo_; // based on some type
bool pickup_;
bool multiMeasureRest_;
int multiMeasureRestCount_;
};
class MeasureData {
public:
MeasureData();
~MeasureData();
public:
Clef* getClef() const;
Key* getKey() const;
void addNoteContainer(NoteContainer* ptr);
QList<NoteContainer*> getNoteContainers() const;
// put Tempo, Text, RepeatSymbol to MeasureData at part=0 && staff=0
void addMusicData(MusicData* ptr);
// if type==MusicData_None, return all
QList<MusicData*> getMusicDatas(MusicDataType type);//MusicXml: note|direction|harmony
// put NumericEnding to MeasureData at part=0 && staff=0
void addCrossMeasureElement(MusicData* ptr, bool start);
enum PairType {
PairType_Start,
PairType_Stop,
PairType_All
};
QList<MusicData*> getCrossMeasureElements(MusicDataType type, PairType pairType);
// for midi
void addMidiData(MidiData* ptr);
QList<MidiData*> getMidiDatas(MidiType type);
private:
Key* key_;
Clef* clef_;
QList<MusicData*> musicDatas_;
QList<NoteContainer*> noteContainers_;
QList<QPair<MusicData*, bool> > crossMeasureElements_;
QList<MidiData*> midiDatas_;
};
// StreamHandle
class StreamHandle {
public:
StreamHandle(unsigned char* p, int size);
virtual ~StreamHandle();
private:
StreamHandle();
public:
virtual bool read(char* buff, int size);
virtual bool write(char* buff, int size);
private:
int size_;
int curPos_;
unsigned char* point_;
};
// Block.h
// base block, or resizable block in ove to store data
class Block {
public:
Block();
explicit Block(unsigned int size);
virtual ~Block() {
}
public:
// size > 0, check this in use code
virtual void resize(unsigned int count);
const unsigned char* data() const;
unsigned char* data();
int size() const;
bool operator ==(const Block& block) const;
bool operator !=(const Block& block) const;
bool toBoolean() const;
unsigned int toUnsignedInt() const;
int toInt() const;
QByteArray toStrByteArray() const; // string
QByteArray fixedSizeBufferToStrByteArray() const; // string
private:
void doResize(unsigned int count);
private:
// char [-128, 127], unsigned char [0, 255]
QList<unsigned char> data_;
};
class FixedBlock: public Block {
public:
explicit FixedBlock(unsigned int count);
virtual ~FixedBlock() {
}
private:
FixedBlock();
private:
// can't resize
virtual void resize(unsigned int count);
};
///////////////////////////////////////////////////////////////////////////////
// 4 byte block in ove to store size
class SizeBlock: public FixedBlock {
public:
SizeBlock();
virtual ~SizeBlock() {
}
public:
// void fromUnsignedInt(unsigned int count) ;
unsigned int toSize() const;
};
// 4 bytes block in ove to store name
class NameBlock: public FixedBlock {
public:
NameBlock();
virtual ~NameBlock() {
}
public:
// ingore data more than 4 bytes
bool isEqual(const QString& name) const;
};
// 2 bytes block in ove to store count
class CountBlock: public FixedBlock {
public:
CountBlock();
virtual ~CountBlock() {
}
public:
// void setValue(unsigned short count) ;
unsigned short toCount() const;
};
// Chunk.h
// content : name
class Chunk {
public:
Chunk();
virtual ~Chunk() {
}
public:
const static QString TrackName;
const static QString PageName;
const static QString LineName;
const static QString StaffName;
const static QString MeasureName;
const static QString ConductName;
const static QString BdatName;
NameBlock getName() const;
protected:
NameBlock nameBlock_;
};
// content : name / size / data
class SizeChunk: public Chunk {
public:
SizeChunk();
virtual ~SizeChunk();
public:
SizeBlock* getSizeBlock() const;
Block* getDataBlock() const;
const static unsigned int version3TrackSize;
protected:
SizeBlock* sizeBlock_;
Block* dataBlock_;
};
// content : name / count
class GroupChunk: public Chunk {
public:
GroupChunk();
virtual ~GroupChunk();
public:
CountBlock* getCountBlock() const;
protected:
CountBlock* childCount_;
};
// ChunkParse.h
class BasicParse {
public:
BasicParse(OveSong* ove);
virtual ~BasicParse();
private:
BasicParse();
public:
void setNotify(IOveNotify* notify);
virtual bool parse();
protected:
bool readBuffer(Block& placeHolder, int size);
bool jump(int offset);
void messageOut(const QString& str);
protected:
OveSong* ove_;
StreamHandle* handle_;
IOveNotify* notify_;
};
///////////////////////////////////////////////////////////////////////////////
class OvscParse: public BasicParse {
public:
OvscParse(OveSong* ove);
virtual ~OvscParse();
public:
void setOvsc(SizeChunk* chunk);
virtual bool parse();
private:
SizeChunk* chunk_;
};
class TrackParse: public BasicParse {
public:
TrackParse(OveSong* ove);
virtual ~TrackParse();
public:
void setTrack(SizeChunk* chunk);
virtual bool parse();
private:
SizeChunk* chunk_;
};
class GroupParse: BasicParse {
public:
GroupParse(OveSong* ove);
virtual ~GroupParse();
public:
void addSizeChunk(SizeChunk* sizeChunk);
virtual bool parse();
private:
QList<SizeChunk*> sizeChunks_;
};
class PageGroupParse: public BasicParse {
public:
PageGroupParse(OveSong* ove);
virtual ~PageGroupParse();
public:
void addPage(SizeChunk* chunk);
virtual bool parse();
private:
bool parsePage(SizeChunk* chunk, Page* page);
private:
QList<SizeChunk*> pageChunks_;
};
class StaffCountGetter: public BasicParse {
public:
StaffCountGetter(OveSong* ove);
virtual ~StaffCountGetter() {}
public:
unsigned int getStaffCount(SizeChunk* chunk);
};
class LineGroupParse: public BasicParse {
public:
LineGroupParse(OveSong* ove);
virtual ~LineGroupParse();
public:
void setLineGroup(GroupChunk* chunk);
void addLine(SizeChunk* chunk);
void addStaff(SizeChunk* chunk);
virtual bool parse();
private:
bool parseLine(SizeChunk* chunk, Line* line);
bool parseStaff(SizeChunk* chunk, Staff* staff);
private:
GroupChunk* chunk_;
QList<SizeChunk*> lineChunks_;
QList<SizeChunk*> staffChunks_;
};
class BarsParse: public BasicParse {
public:
BarsParse(OveSong* ove);
virtual ~BarsParse();
public:
void addMeasure(SizeChunk* chunk);
void addConduct(SizeChunk* chunk);
void addBdat(SizeChunk* chunk);
virtual bool parse();
private:
bool parseMeas(Measure* measure, SizeChunk* chunk);
bool parseCond(Measure* measure, MeasureData* measureData, SizeChunk* chunk);
bool parseBdat(Measure* measure, MeasureData* measureData, SizeChunk* chunk);
bool getCondElementType(unsigned int byteData, CondType& type);
bool getBdatElementType(unsigned int byteData, BdatType& type);
// COND
bool parseTimeSignature(Measure* measure, int length);
bool parseTimeSignatureParameters(Measure* measure, int length);
bool parseRepeatSymbol(MeasureData* measureData, int length);
bool parseNumericEndings(MeasureData* measureData, int length);
bool parseTempo(MeasureData* measureData, int length);
bool parseBarNumber(Measure* measure, int length);
bool parseText(MeasureData* measureData, int length);
bool parseBarlineParameters(Measure* measure, int length);
// BDAT
bool parseNoteRest(MeasureData* measureData, int length, BdatType type);
bool parseBeam(MeasureData* measureData, int length);
bool parseTie(MeasureData* measureData, int length);
bool parseTuplet(MeasureData* measureData, int length);
bool parseHarmony(MeasureData* measureData, int length);
bool parseClef(MeasureData* measureData, int length);
bool parseLyric(MeasureData* measureData, int length);
bool parseSlur(MeasureData* measureData, int length);
bool parseGlissando(MeasureData* measureData, int length);
bool parseDecorators(MeasureData* measureData, int length);
bool parseDynamics(MeasureData* measureData, int length);
bool parseWedge(MeasureData* measureData, int length);
bool parseKey(MeasureData* measureData, int length);
bool parsePedal(MeasureData* measureData, int length);
bool parseKuohao(MeasureData* measureData, int length);
bool parseExpressions(MeasureData* measureData, int length);
bool parseHarpPedal(MeasureData* measureData, int length);
bool parseMultiMeasureRest(MeasureData* measureData, int length);
bool parseHarmonyGuitarFrame(MeasureData* measureData, int length);
bool parseOctaveShift(MeasureData* measureData, int length);
bool parseMidiController(MeasureData* measureData, int length);
bool parseMidiProgramChange(MeasureData* measureData, int length);
bool parseMidiChannelPressure(MeasureData* measureData, int length);
bool parseMidiPitchWheel(MeasureData* measureData, int length);
bool parseSizeBlock(int length);
bool parseMidiCommon(MidiData* ptr);
bool parseCommonBlock(MusicData* ptr);
bool parseOffsetCommonBlock(MusicData* ptr);
bool parsePairLinesBlock(PairEnds* ptr); //size==2
bool parseOffsetElement(OffsetElement* ptr);//size==2
private:
QList<SizeChunk*> measureChunks_;
QList<SizeChunk*> conductChunks_;
QList<SizeChunk*> bdatChunks_;
};
class LyricChunkParse: public BasicParse {
public:
LyricChunkParse(OveSong* ove);
virtual ~LyricChunkParse() {}
public:
void setLyricChunk(SizeChunk* chunk);
virtual bool parse();
private:
struct LyricInfo {
int track_;
int measure_;
int verse_;
int voice_;
int wordCount_;
int lyricSize_;
QString name_;
QString lyric_;
int font_;
int fontSize_;
int fontStyle_;
LyricInfo() :
track_(0), measure_(0), verse_(0), voice_(0), wordCount_(0),
lyricSize_(0), name_(QString()), lyric_(QString()),
font_(0), fontSize_(12), fontStyle_(0) {}
};
void processLyricInfo(const LyricInfo& info);
private:
SizeChunk* chunk_;
};
class TitleChunkParse: public BasicParse {
public:
TitleChunkParse(OveSong* ove);
virtual ~TitleChunkParse() {}
public:
void setTitleChunk(SizeChunk* chunk);
virtual bool parse();
private:
void addToOve(const QString& str, unsigned int titleType);
private:
unsigned int titleType_;
unsigned int annotateType_;
unsigned int writerType_;
unsigned int copyrightType_;
unsigned int headerType_;
unsigned int footerType_;
SizeChunk* chunk_;
};
// OveOrganizer.h
class OveOrganizer {
public:
OveOrganizer(OveSong* ove) ;
virtual ~OveOrganizer(){}
public:
void organize() ;
private:
void organizeAttributes() ;
void organizeTracks() ;
void organizeMeasures() ;
void organizeMeasure(int part, int track, Measure* measure, MeasureData* measureData) ;
void organizeContainers(int part, int track, Measure* measure, MeasureData* measureData) ;
void organizeMusicDatas(int part, int track, Measure* measure, MeasureData* measureData) ;
void organizeCrossMeasureElements(int part, int track, Measure* measure, MeasureData* measureData) ;
void organizePairElement(MusicData* data, int part, int track, Measure* measure, MeasureData* measureData) ;
void organizeOctaveShift(OctaveShift* octave, Measure* measure, MeasureData* measureData) ;
void organizeWedge(Wedge* wedge, int part, int track, Measure* measure, MeasureData* measureData) ;
private:
OveSong* ove_ ;
};
// OveSerialize.h
class StreamHandle;
class Block;
class NameBlock;
class Chunk;
class SizeChunk;
class GroupChunk;
class OveSerialize: public IOVEStreamLoader {
public:
OveSerialize();
virtual ~OveSerialize();
public:
virtual void setOve(OveSong* ove);
virtual void setFileStream(unsigned char* buffer, unsigned int size);
virtual void setNotify(IOveNotify* notify);
virtual bool load(void);
virtual void release();
private:
bool readNameBlock(NameBlock& nameBlock);
bool readChunkName(Chunk* chunk, const QString& name);
bool readSizeChunk(SizeChunk* sizeChunk); // contains a SizeChunk and data buffer
bool readDataChunk(Block* block, unsigned int size);
bool readGroupChunk(GroupChunk* groupChunk);
bool readHeader();
bool readHeadData(SizeChunk* ovscChunk);
bool readTracksData();
bool readPagesData();
bool readLinesData();
bool readBarsData();
bool readOveEnd();
void messageOutError();
void messageOut(const QString& str);
private:
OveSong* ove_;
StreamHandle* streamHandle_;
IOveNotify* notify_;
};
}
#endif